diff --git a/.hgtags b/.hgtags index bf173376ee4..5c56fcd1b39 100644 --- a/.hgtags +++ b/.hgtags @@ -183,3 +183,5 @@ ffe6bce5a521be40146af2ac03c509b7bac30595 jdk8-b56 3bd874584fc01aae92fbc8827e2bd04d8b6ace04 jdk8-b59 5e3adc681779037a2d33b7be6f75680619085492 jdk8-b60 cdaa6122185f9bf512dcd6600f56bfccc4824e8c jdk8-b61 +8d9d430b4244b95f5cf1ebe719f834a1ac5d6cd5 jdk8-b62 +21ee1dd7b809639284900a128b9b656a592ebc7a jdk8-b63 diff --git a/.hgtags-top-repo b/.hgtags-top-repo index 7e43143f19e..ecd625bae5a 100644 --- a/.hgtags-top-repo +++ b/.hgtags-top-repo @@ -183,3 +183,5 @@ b85b44cced2406792cfb9baab1377ff03e7001d8 jdk8-b55 dae9821589ccd2611bdf7084269b98e819091770 jdk8-b59 e07f499b9dccb529ecf74172cf6ac11a195ec57a jdk8-b60 20ff117b509075c3aec4ee3a57990ecd5db5df9c jdk8-b61 +8a3fe0ae06a8cc21347da5a18384b0aa6c2349f5 jdk8-b62 +3229597524cab4239325bc3602df6c486397a511 jdk8-b63 diff --git a/NewMakefile.gmk b/NewMakefile.gmk index 252f98b5bd3..f38d7396a7d 100644 --- a/NewMakefile.gmk +++ b/NewMakefile.gmk @@ -31,8 +31,9 @@ CMP=cmp CP=cp ECHO=echo MKDIR=mkdir +PRINTF=printf PWD=pwd -SH=sh +TAR=tar ifeq ($(PLATFORM),windows) ZIP=zip else @@ -63,10 +64,48 @@ all images clean: checks $(ECHO) "ERROR: No configurations to build"; exit 1; \ fi @for bdir in $(dir $(ALL_MAKEFILES)) ; do \ - $(ECHO) "$(CD) $${bdir} && $(MAKE) $(EXTRA_MAKE_ARGS) $@" ; \ - $(CD) $${bdir} && $(MAKE) $(EXTRA_MAKE_ARGS) $@ ; \ + $(ECHO) "$(CD) $${bdir} && $(MAKE) $@" ; \ + $(CD) $${bdir} && $(MAKE) $@ ; \ done +# TBD: Deploy input +$(BUILD_DIR_ROOT)/.deploy_input: + @if [ "$(ALL_MAKEFILES)" = "" ] ; then \ + $(ECHO) "ERROR: No configurations to build"; exit 1; \ + fi + @for bdir in $(dir $(ALL_MAKEFILES)) ; do \ + if [ deploy/make/Makefile ] ; then \ + echo "Attempting deploy build." ; \ + ( \ + $(RM) -r $${bdir}/deploy_input ; \ + $(MKDIR) -p $${bdir}/deploy_input ; \ + ( $(CD) $${bdir}/images && $(TAR) -cf - j2sdk-image j2re-image ) \ + | ( $(CD) $${bdir}/deploy_input && $(TAR) -xf - ) ; \ + ) ; \ + fi; \ + done + touch $@ + +# TBD: Deploy images +deploy: $(BUILD_DIR_ROOT)/.deploy_input + @if [ "$(ALL_MAKEFILES)" = "" ] ; then \ + $(ECHO) "ERROR: No configurations to build"; exit 1; \ + fi + @for bdir in $(dir $(ALL_MAKEFILES)) ; do \ + if [ deploy/make/Makefile ] ; then \ + echo "Attempting deploy build." ; \ + ( \ + $(CD) deploy/make && \ + $(MAKE) \ + ABS_OUTPUTDIR=$${bdir}/deploy_input \ + OUTPUTDIR=$${bdir}/deploy_input \ + ) ; \ + fi; \ + done + +# TBD: Install bundles +install: + # Bundle creation bundles: @if [ "$(ALL_IMAGE_DIRS)" = "" ] ; then \ @@ -91,8 +130,8 @@ clobber:: checks: @$(ECHO) "No checks yet" -# Keep track of phony targets -PHONY_LIST += all images clean clobber checks +# Keep track of user targets +USER_TARGETS += all deploy install images clean clobber checks ########################################################################### # To help in adoption of the new configure&&make build process, a bridge @@ -102,32 +141,18 @@ PHONY_LIST += all images clean clobber checks bridgeBuild: bridge2configure images # Bridge from old Makefile ALT settings to configure options -bridge2configure: .bridge2configureOpts - $(CD) common/makefiles && sh ../autoconf/configure $(strip $(shell $(CAT) $<)) +bridge2configure: $(BUILD_DIR_ROOT)/.bridge2configureOpts + bash ./configure $(strip $(shell $(CAT) $<)) # Create a file with configure options created from old Makefile mechanisms. -.bridge2configureOpts: .bridge2configureOptsLatest +$(BUILD_DIR_ROOT)/.bridge2configureOpts: $(BUILD_DIR_ROOT)/.bridge2configureOptsLatest $(RM) $@ $(CP) $< $@ -# In case make was invoked from a specific path -_MAKE_COMMAND_PATH:=$(firstword $(MAKE)) -ifneq ($(dir $(_MAKE_COMMAND_PATH)),./) - # This could be removed someday if JPRT was fixed and we could assume that - # the path to make was always in PATH. - MAKE_BINDIR:=$(call UnixPath,$(dir $(_MAKE_COMMAND_PATH))) - NEWPATH:=$(MAKE_BINDIR):${PATH} - PATH:=$(NEWPATH) - export PATH - MAKE_COMMAND=$(MAKE_BINDIR)/$(notdir $(_MAKE_COMMAND_PATH)) -else - MAKE_COMMAND=$(_MAKE_COMMAND_PATH) -endif - # Use this file to only change when obvious things have changed -.bridge2configureOptsLatest: FRC +$(BUILD_DIR_ROOT)/.bridge2configureOptsLatest: FRC $(RM) $@.tmp - @$(ECHO) " MAKE=$(MAKE_COMMAND) " >> $@.tmp + $(MKDIR) -p $(BUILD_DIR_ROOT) @$(ECHO) " --with-debug-level=$(if $(DEBUG_LEVEL),$(DEBUG_LEVEL),release) " >> $@.tmp ifdef ARCH_DATA_MODEL @$(ECHO) " --with-target-bits=$(ARCH_DATA_MODEL) " >> $@.tmp @@ -156,11 +181,21 @@ endif # Clobber all the built files clobber:: bridge2clobber bridge2clobber:: - $(RM) .bridge2* + $(RM) $(BUILD_DIR_ROOT)/.bridge2* + $(RM) $(BUILD_DIR_ROOT)/.deploy_input # Keep track of phony targets PHONY_LIST += bridge2configure bridgeBuild bridge2clobber +########################################################################### +# Sanity checks (history target) +# + +sanity: checks + +# Keep track of user targets +USER_TARGETS += sanity + ########################################################################### # Javadocs # @@ -168,8 +203,8 @@ PHONY_LIST += bridge2configure bridgeBuild bridge2clobber javadocs: cd common/makefiles && $(MAKE) -f MakefileJavadoc.gmk -# Keep track of phony targets -PHONY_LIST += javadocs +# Keep track of user targets +USER_TARGETS += javadocs ########################################################################### # JPRT targets @@ -190,7 +225,6 @@ jprt_build_debug: DEBUG_LEVEL=slowdebug jprt_build_debug: BUILD_DIRNAME=*-debug jprt_build_debug: jprt_build_generic -jprt_build_generic: EXTRA_MAKE_ARGS=LOG=nofile,info jprt_build_generic: $(JPRT_ARCHIVE_BUNDLE) $(JPRT_ARCHIVE_BUNDLE): bridgeBuild bundles @@ -202,10 +236,60 @@ $(JPRT_ARCHIVE_BUNDLE): bridgeBuild bundles PHONY_LIST += jprt_build_product jprt_build_fastdebug jprt_build_debug \ jprt_build_generic +########################################################################### +# Help target + +HELP_FORMAT=%12s%s\n + +help: + @$(PRINTF) "# JDK Makefile\n" + @$(PRINTF) "#\n" + @$(PRINTF) "# Usage: make [Target]\n" + @$(PRINTF) "#\n" + @$(PRINTF) "# $(HELP_FORMAT)" "Target " "Description" + @$(PRINTF) "# $(HELP_FORMAT)" "------ " "-----------" + @for i in $(USER_TARGETS) ; do \ + $(MAKE) help_$${i} ; \ + done + @$(PRINTF) "#\n" + +help_all: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Build the entire jdk but not the images" +help_images: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Create the jdk images for the builds" +help_deploy: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Create the jdk deploy images from the jdk images" +help_install: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Create the jdk install bundles from the deploy images" +help_clean: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Clean and prepare for a fresh build from scratch" +help_clobber: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Clean and also purge any hidden derived data" +help_checks: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Perform various checks to make sure we can build" +help_sanity: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Same as 'make checks'" +help_javadocs: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Build the javadocs" +help_help: + @$(PRINTF) "# $(HELP_FORMAT)" "$(subst help_,,$@) - " \ + "Print out the help messages" + +# Keep track of user targets +USER_TARGETS += help + ########################################################################### # Phony targets -.PHONY: $(PHONY_LIST) +.PHONY: $(PHONY_LIST) $(USER_TARGETS) # Force target FRC: - diff --git a/common/autoconf/Makefile.in b/common/autoconf/Makefile.in index 629fadf5e8a..d1f148604df 100644 --- a/common/autoconf/Makefile.in +++ b/common/autoconf/Makefile.in @@ -21,6 +21,7 @@ # questions. # -# Generated Makefile @DATE_WHEN_CONFIGURED@ +# This Makefile was generated by configure @DATE_WHEN_CONFIGURED@ +# GENERATED FILE, DO NOT EDIT SPEC:=@OUTPUT_ROOT@/spec.gmk include @SRC_ROOT@/common/makefiles/Makefile diff --git a/common/autoconf/autogen.sh b/common/autoconf/autogen.sh index 1ab55f77ff6..d4da90c77ee 100644 --- a/common/autoconf/autogen.sh +++ b/common/autoconf/autogen.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. @@ -29,14 +29,11 @@ if test "x`uname -s`" = "xSunOS"; then # date +%s is not available on Solaris, use this workaround # from http://solarisjedi.blogspot.co.uk/2006/06/solaris-date-command-and-epoch-time.html TIMESTAMP=`/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= '/^time\(\)/ {gsub(/ /,"",$2);print $2}'` - # On Solaris /bin/sh doesn't support test -e but /usr/bin/test does. - TEST=`which test` else TIMESTAMP=`date +%s` - TEST="test" fi -if $TEST "$CUSTOM_CONFIG_DIR" = ""; then +if test "x$CUSTOM_CONFIG_DIR" = "x"; then custom_script_dir="$script_dir/../../jdk/make/closed/autoconf" else custom_script_dir=$CUSTOM_CONFIG_DIR @@ -44,16 +41,22 @@ fi custom_hook=$custom_script_dir/custom-hook.m4 +if test "x`which autoconf 2> /dev/null`" = x; then + echo You need autoconf installed to be able to regenerate the configure script + echo Error: Cannot find autoconf 1>&2 + exit 1 +fi + echo Generating generated-configure.sh cat $script_dir/configure.ac | sed -e "s|@DATE_WHEN_GENERATED@|$TIMESTAMP|" | autoconf -W all -I$script_dir - > $script_dir/generated-configure.sh rm -rf autom4te.cache -if $TEST -e $custom_hook; then +if test -e $custom_hook; then echo Generating custom generated-configure.sh # We have custom sources available; also generate configure script # with custom hooks compiled in. cat $script_dir/configure.ac | sed -e "s|@DATE_WHEN_GENERATED@|$TIMESTAMP|" | \ - sed -e "s|AC_DEFUN_ONCE(\[CUSTOM_HOOK\])|m4_include([$custom_hook])|" | autoconf -W all -I$script_dir - > $custom_script_dir/generated-configure.sh + sed -e "s|#CUSTOM_AUTOCONF_INCLUDE|m4_include([$custom_hook])|" | autoconf -W all -I$script_dir - > $custom_script_dir/generated-configure.sh rm -rf autom4te.cache else echo No custom hook found: $custom_hook diff --git a/common/autoconf/basics.m4 b/common/autoconf/basics.m4 index e0e7cf63d11..bd058af26e8 100644 --- a/common/autoconf/basics.m4 +++ b/common/autoconf/basics.m4 @@ -34,84 +34,102 @@ AC_DEFUN([ADD_JVM_ARG_IF_OK], fi ]) -AC_DEFUN([SET_FULL_PATH], +# This will make sure the given variable points to a full and proper +# path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# $1: The name of the variable to fix +AC_DEFUN([BASIC_FIXUP_PATH], [ - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="[$]$1" - car="${tmp%% *}" - tmp="[$]$1 EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - SET_FULL_PATH_SPACESAFE(car) - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - $1="$car ${cdr% *}" - else - $1="$car" - fi -]) - -AC_DEFUN([SPACESAFE], -[ - # Fail with message $2 if var $1 contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "[$]$1" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - $1=`$CYGPATH -s -m -a "[$]$1"` - # Now it's case insensitive; let's make it lowercase to improve readability - $1=`$ECHO "[$]$1" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - $1=`$CYGPATH -u "[$]$1"` - else - AC_MSG_ERROR([You cannot have spaces in $2! "[$]$1"]) - fi - fi -]) - -AC_DEFUN([SET_FULL_PATH_SPACESAFE], -[ - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="[$]$1" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + BASIC_FIXUP_PATH_CYGWIN($1) + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + BASIC_FIXUP_PATH_MSYS($1) + else + # We're on a posix platform. Hooray! :) + path="[$]$1" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "[$]$1"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + if test ! -f "$path" && test ! -d "$path"; then + AC_MSG_ERROR([The path of $1, which resolves as "$path", is not found.]) fi - $1="$tmp" + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([The path of $1, which resolves as "$path", is invalid.]) + AC_MSG_ERROR([Spaces are not allowed in this path.]) + fi + fi ]) -AC_DEFUN([REMOVE_SYMBOLIC_LINKS], +# This will make sure the given variable points to a executable +# with a full and proper path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# Any arguments given to the executable is preserved. +# If the input variable does not have a directory specification, then +# it need to be in the PATH. +# $1: The name of the variable to fix +AC_DEFUN([BASIC_FIXUP_EXECUTABLE], +[ + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + BASIC_FIXUP_EXECUTABLE_CYGWIN($1) + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + BASIC_FIXUP_EXECUTABLE_MSYS($1) + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="[$]$1" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + AC_MSG_NOTICE([Resolving $1 (as $path) with 'which' failed, using $path directly.]) + new_path="$path" + else + AC_MSG_NOTICE([The path of $1, which resolves as "$complete", is not found.]) + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([This might be caused by spaces in the path, which is not allowed.]) + fi + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + $1="$new_complete" + AC_MSG_NOTICE([Rewriting $1 to "$new_complete"]) + fi +]) + +AC_DEFUN([BASIC_REMOVE_SYMBOLIC_LINKS], [ if test "x$OPENJDK_BUILD_OS" != xwindows; then # Follow a chain of symbolic links. Use readlink # where it exists, else fall back to horribly # complicated shell code. - AC_PATH_PROG(READLINK, readlink) if test "x$READLINK_TESTED" != yes; then # On MacOSX there is a readlink tool with a different # purpose than the GNU readlink tool. Check the found readlink. - ISGNU=`$READLINK --help 2>&1 | grep GNU` + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` if test "x$ISGNU" = x; then # A readlink that we do not know how to use. # Are there other non-GNU readlinks out there? @@ -125,23 +143,25 @@ AC_DEFUN([REMOVE_SYMBOLIC_LINKS], else STARTDIR=$PWD COUNTER=0 - DIR=`dirname [$]$1` - FIL=`basename [$]$1` + sym_link_dir=`$DIRNAME [$]$1` + sym_link_file=`$BASENAME [$]$1` while test $COUNTER -lt 20; do - ISLINK=`ls -l $DIR/$FIL | grep '\->' | sed -e 's/.*-> \(.*\)/\1/'` + ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` if test "x$ISLINK" == x; then # This is not a symbolic link! We are done! break fi # The link might be relative! We have to use cd to travel safely. - cd $DIR - cd `dirname $ISLINK` - DIR=`pwd` - FIL=`basename $ISLINK` + cd $sym_link_dir + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + sym_link_dir=`$THEPWDCMD` + sym_link_file=`$BASENAME $ISLINK` let COUNTER=COUNTER+1 done cd $STARTDIR - $1=$DIR/$FIL + $1=$sym_link_dir/$sym_link_file fi fi ]) @@ -152,6 +172,107 @@ AC_DEFUN_ONCE([BASIC_INIT], AC_SUBST(CONFIGURE_COMMAND_LINE) DATE_WHEN_CONFIGURED=`LANG=C date` AC_SUBST(DATE_WHEN_CONFIGURED) +AC_MSG_NOTICE([Configuration created at $DATE_WHEN_CONFIGURED.]) +AC_MSG_NOTICE([configure script generated at timestamp $DATE_WHEN_GENERATED.]) +]) + +# Test that variable $1 denoting a program is not empty. If empty, exit with an error. +# $1: variable to check +# $2: executable name to print in warning (optional) +AC_DEFUN([BASIC_CHECK_NONEMPTY], +[ + if test "x[$]$1" = x; then + if test "x$2" = x; then + PROG_NAME=translit($1,A-Z,a-z) + else + PROG_NAME=$2 + fi + AC_MSG_NOTICE([Could not find $PROG_NAME!]) + AC_MSG_ERROR([Cannot continue]) + fi +]) + +# Does AC_PATH_PROG followed by BASIC_CHECK_NONEMPTY. +# Arguments as AC_PATH_PROG: +# $1: variable to set +# $2: executable name to look for +AC_DEFUN([BASIC_REQUIRE_PROG], +[ + AC_PATH_PROGS($1, $2) + BASIC_CHECK_NONEMPTY($1, $2) +]) + +# Setup the most fundamental tools that relies on not much else to set up, +# but is used by much of the early bootstrap code. +AC_DEFUN_ONCE([BASIC_SETUP_FUNDAMENTAL_TOOLS], +[ + +# Start with tools that do not need have cross compilation support +# and can be expected to be found in the default PATH. These tools are +# used by configure. Nor are these tools expected to be found in the +# devkit from the builddeps server either, since they are +# needed to download the devkit. + +# First are all the simple required tools. +BASIC_REQUIRE_PROG(BASENAME, basename) +BASIC_REQUIRE_PROG(BASH, bash) +BASIC_REQUIRE_PROG(CAT, cat) +BASIC_REQUIRE_PROG(CHMOD, chmod) +BASIC_REQUIRE_PROG(CMP, cmp) +BASIC_REQUIRE_PROG(CP, cp) +BASIC_REQUIRE_PROG(CUT, cut) +BASIC_REQUIRE_PROG(DATE, date) +BASIC_REQUIRE_PROG(DIFF, [gdiff diff]) +BASIC_REQUIRE_PROG(DIRNAME, dirname) +BASIC_REQUIRE_PROG(ECHO, echo) +BASIC_REQUIRE_PROG(EXPR, expr) +BASIC_REQUIRE_PROG(FILE, file) +BASIC_REQUIRE_PROG(FIND, find) +BASIC_REQUIRE_PROG(HEAD, head) +BASIC_REQUIRE_PROG(LN, ln) +BASIC_REQUIRE_PROG(LS, ls) +BASIC_REQUIRE_PROG(MKDIR, mkdir) +BASIC_REQUIRE_PROG(MKTEMP, mktemp) +BASIC_REQUIRE_PROG(MV, mv) +BASIC_REQUIRE_PROG(PRINTF, printf) +BASIC_REQUIRE_PROG(THEPWDCMD, pwd) +BASIC_REQUIRE_PROG(RM, rm) +BASIC_REQUIRE_PROG(SH, sh) +BASIC_REQUIRE_PROG(SORT, sort) +BASIC_REQUIRE_PROG(TAIL, tail) +BASIC_REQUIRE_PROG(TAR, tar) +BASIC_REQUIRE_PROG(TEE, tee) +BASIC_REQUIRE_PROG(TOUCH, touch) +BASIC_REQUIRE_PROG(TR, tr) +BASIC_REQUIRE_PROG(UNAME, uname) +BASIC_REQUIRE_PROG(UNIQ, uniq) +BASIC_REQUIRE_PROG(WC, wc) +BASIC_REQUIRE_PROG(WHICH, which) +BASIC_REQUIRE_PROG(XARGS, xargs) + +# Then required tools that require some special treatment. +AC_PROG_AWK +BASIC_CHECK_NONEMPTY(AWK) +AC_PROG_GREP +BASIC_CHECK_NONEMPTY(GREP) +AC_PROG_EGREP +BASIC_CHECK_NONEMPTY(EGREP) +AC_PROG_FGREP +BASIC_CHECK_NONEMPTY(FGREP) +AC_PROG_SED +BASIC_CHECK_NONEMPTY(SED) + +AC_PATH_PROGS(NAWK, [nawk gawk awk]) +BASIC_CHECK_NONEMPTY(NAWK) + +# Always force rm. +RM="$RM -f" + +# These are not required on all platforms +AC_PATH_PROG(CYGPATH, cygpath) +AC_PATH_PROG(READLINK, readlink) +AC_PATH_PROG(DF, df) +AC_PATH_PROG(SETFILE, SetFile) ]) # Setup basic configuration paths, and platform-specific stuff related to PATHs. @@ -159,46 +280,37 @@ AC_DEFUN_ONCE([BASIC_SETUP_PATHS], [ # Locate the directory of this script. SCRIPT="[$]0" -REMOVE_SYMBOLIC_LINKS(SCRIPT) -AUTOCONF_DIR=`dirname [$]0` +BASIC_REMOVE_SYMBOLIC_LINKS(SCRIPT) +AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD` # Where is the source? It is located two levels above the configure script. CURDIR="$PWD" cd "$AUTOCONF_DIR/../.." SRC_ROOT="`pwd`" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - SRC_ROOT_LENGTH=`pwd|wc -m` - if test $SRC_ROOT_LENGTH -gt 100; then - AC_MSG_ERROR([Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported]) - fi + +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + PATH_SEP=";" + BASIC_CHECK_PATHS_WINDOWS +else + PATH_SEP=":" fi + AC_SUBST(SRC_ROOT) +AC_SUBST(PATH_SEP) cd "$CURDIR" -SPACESAFE(SRC_ROOT,[the path to the source root]) -SPACESAFE(CURDIR,[the path to the current directory]) +BASIC_FIXUP_PATH(SRC_ROOT) +BASIC_FIXUP_PATH(CURDIR) if test "x$OPENJDK_BUILD_OS" = "xsolaris"; then # Add extra search paths on solaris for utilities like ar and as etc... PATH="$PATH:/usr/ccs/bin:/usr/sfw/bin:/opt/csw/bin" fi -# For cygwin we need cygpath first, since it is used everywhere. -AC_PATH_PROG(CYGPATH, cygpath) -PATH_SEP=":" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - if test "x$CYGPATH" = x; then - AC_MSG_ERROR([Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path]) - fi - PATH_SEP=";" -fi -AC_SUBST(PATH_SEP) - # You can force the sys-root if the sys-root encoded into the cross compiler tools # is not correct. AC_ARG_WITH(sys-root, [AS_HELP_STRING([--with-sys-root], - [pass this sys-root to the compilers and linker (useful if the sys-root encoded in - the cross compiler tools is incorrect)])]) + [pass this sys-root to the compilers and tools (for cross-compiling)])]) if test "x$with_sys_root" != x; then SYS_ROOT=$with_sys_root @@ -208,7 +320,7 @@ fi AC_SUBST(SYS_ROOT) AC_ARG_WITH([tools-dir], [AS_HELP_STRING([--with-tools-dir], - [search this directory for (cross-compiling) compilers and tools])], [TOOLS_DIR=$with_tools_dir]) + [search this directory for compilers and tools (for cross-compiling)])], [TOOLS_DIR=$with_tools_dir]) AC_ARG_WITH([devkit], [AS_HELP_STRING([--with-devkit], [use this directory as base for tools-dir and sys-root (for cross-compiling)])], @@ -229,7 +341,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_OUTPUT_DIR], [ AC_ARG_WITH(conf-name, [AS_HELP_STRING([--with-conf-name], - [use this as the name of the configuration, overriding the generated default])], + [use this as the name of the configuration @<:@generated from important configuration options@:>@])], [ CONF_NAME=${with_conf_name} ]) # Test from where we are running configure, in or outside of src root. @@ -240,7 +352,7 @@ if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" || te CONF_NAME="${OPENJDK_TARGET_OS}-${OPENJDK_TARGET_CPU}-${JDK_VARIANT}-${ANDED_JVM_VARIANTS}-${DEBUG_LEVEL}" fi OUTPUT_ROOT="$SRC_ROOT/build/${CONF_NAME}" - mkdir -p "$OUTPUT_ROOT" + $MKDIR -p "$OUTPUT_ROOT" if test ! -d "$OUTPUT_ROOT"; then AC_MSG_ERROR([Could not create build directory $OUTPUT_ROOT]) fi @@ -253,9 +365,34 @@ else CONF_NAME=`$ECHO $CURDIR | $SED -e "s!^${SRC_ROOT}/build/!!"` fi OUTPUT_ROOT="$CURDIR" -fi -SPACESAFE(OUTPUT_ROOT,[the path to the output root]) + # WARNING: This might be a bad thing to do. You need to be sure you want to + # have a configuration in this directory. Do some sanity checks! + + if test ! -e "$OUTPUT_ROOT/spec.gmk"; then + # If we have a spec.gmk, we have run here before and we are OK. Otherwise, check for + # other files + files_present=`$LS $OUTPUT_ROOT` + # Configure has already touched config.log and confdefs.h in the current dir when this check + # is performed. + filtered_files=`$ECHO "$files_present" | $SED -e 's/config.log//g' -e 's/confdefs.h//g' -e 's/ //g' \ + | $TR -d '\n'` + if test "x$filtered_files" != x; then + AC_MSG_NOTICE([Current directory is $CURDIR.]) + AC_MSG_NOTICE([Since this is not the source root, configure will output the configuration here]) + AC_MSG_NOTICE([(as opposed to creating a configuration in /build/).]) + AC_MSG_NOTICE([However, this directory is not empty. This is not allowed, since it could]) + AC_MSG_NOTICE([seriously mess up just about everything.]) + AC_MSG_NOTICE([Try 'cd $SRC_ROOT' and restart configure]) + AC_MSG_NOTICE([(or create a new empty directory and cd to it).]) + AC_MSG_ERROR([Will not continue creating configuration in $CURDIR]) + fi + fi +fi +AC_MSG_CHECKING([what configuration name to use]) +AC_MSG_RESULT([$CONF_NAME]) + +BASIC_FIXUP_PATH(OUTPUT_ROOT) AC_SUBST(SPEC, $OUTPUT_ROOT/spec.gmk) AC_SUBST(CONF_NAME, $CONF_NAME) @@ -287,7 +424,7 @@ AC_DEFUN_ONCE([BASIC_SETUP_LOGGING], # Setup default logging of stdout and stderr to build.log in the output root. BUILD_LOG='$(OUTPUT_ROOT)/build.log' BUILD_LOG_PREVIOUS='$(OUTPUT_ROOT)/build.log.old' -BUILD_LOG_WRAPPER='$(SH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' +BUILD_LOG_WRAPPER='$(BASH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' AC_SUBST(BUILD_LOG) AC_SUBST(BUILD_LOG_PREVIOUS) AC_SUBST(BUILD_LOG_WRAPPER) @@ -305,7 +442,6 @@ AC_DEFUN([BASIC_CHECK_MAKE_VERSION], DESCRIPTION="$2" if test "x$MAKE_CANDIDATE" != x; then AC_MSG_NOTICE([Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION]) - SET_FULL_PATH(MAKE_CANDIDATE) MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` if test "x$IS_GNU_MAKE" = x; then @@ -314,8 +450,27 @@ AC_DEFUN([BASIC_CHECK_MAKE_VERSION], IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[[12346789]]'` if test "x$IS_MODERN_MAKE" = x; then AC_MSG_NOTICE([Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring.]) - else - FOUND_MAKE=$MAKE_CANDIDATE + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + AC_MSG_ERROR([Unknown Windows environment]) + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + AC_MSG_NOTICE([Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring.]) + else + FOUND_MAKE=$MAKE_CANDIDATE + BASIC_FIXUP_EXECUTABLE(FOUND_MAKE) + fi fi fi fi @@ -330,7 +485,7 @@ AC_DEFUN([BASIC_CHECK_GNU_MAKE], if test ! -f "$MAKE"; then AC_MSG_ERROR([The specified make (by MAKE=$MAKE) is not found.]) fi - BASIC_CHECK_MAKE_VERSION("$MAKE", [user supplied MAKE=]) + BASIC_CHECK_MAKE_VERSION("$MAKE", [user supplied MAKE=$MAKE]) if test "x$FOUND_MAKE" = x; then AC_MSG_ERROR([The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer.]) fi @@ -375,7 +530,7 @@ AC_DEFUN([BASIC_CHECK_FIND_DELETE], AC_MSG_CHECKING([if find supports -delete]) FIND_DELETE="-delete" - DELETEDIR=`mktemp -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) + DELETEDIR=`$MKTEMP -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) echo Hejsan > $DELETEDIR/TestIfFindSupportsDelete @@ -389,102 +544,22 @@ AC_DEFUN([BASIC_CHECK_FIND_DELETE], AC_MSG_RESULT([yes]) fi rmdir $DELETEDIR + AC_SUBST(FIND_DELETE) ]) -# Test that variable $1 denoting a program is not empty. If empty, exit with an error. -# $1: variable to check -# $2: executable name to print in warning (optional) -AC_DEFUN([CHECK_NONEMPTY], +AC_DEFUN_ONCE([BASIC_SETUP_COMPLEX_TOOLS], [ - if test "x[$]$1" = x; then - if test "x$2" = x; then - PROG_NAME=translit($1,A-Z,a-z) - else - PROG_NAME=$2 - fi - AC_MSG_NOTICE([Could not find $PROG_NAME!]) - AC_MSG_ERROR([Cannot continue]) - fi -]) - -# Does AC_PATH_PROG followed by CHECK_NONEMPTY. -# Arguments as AC_PATH_PROG: -# $1: variable to set -# $2: executable name to look for -AC_DEFUN([BASIC_REQUIRE_PROG], -[ - AC_PATH_PROGS($1, $2) - CHECK_NONEMPTY($1, $2) -]) - -AC_DEFUN_ONCE([BASIC_SETUP_TOOLS], -[ -# Start with tools that do not need have cross compilation support -# and can be expected to be found in the default PATH. These tools are -# used by configure. Nor are these tools expected to be found in the -# devkit from the builddeps server either, since they are -# needed to download the devkit. - -# First are all the simple required tools. -BASIC_REQUIRE_PROG(BASENAME, basename) -BASIC_REQUIRE_PROG(CAT, cat) -BASIC_REQUIRE_PROG(CHMOD, chmod) -BASIC_REQUIRE_PROG(CMP, cmp) -BASIC_REQUIRE_PROG(CP, cp) -BASIC_REQUIRE_PROG(CPIO, cpio) -BASIC_REQUIRE_PROG(CUT, cut) -BASIC_REQUIRE_PROG(DATE, date) -BASIC_REQUIRE_PROG(DF, df) -BASIC_REQUIRE_PROG(DIFF, [gdiff diff]) -BASIC_REQUIRE_PROG(ECHO, echo) -BASIC_REQUIRE_PROG(EXPR, expr) -BASIC_REQUIRE_PROG(FILE, file) -BASIC_REQUIRE_PROG(FIND, find) -BASIC_REQUIRE_PROG(HEAD, head) -BASIC_REQUIRE_PROG(LN, ln) -BASIC_REQUIRE_PROG(LS, ls) -BASIC_REQUIRE_PROG(MKDIR, mkdir) -BASIC_REQUIRE_PROG(MV, mv) -BASIC_REQUIRE_PROG(PRINTF, printf) -BASIC_REQUIRE_PROG(SH, sh) -BASIC_REQUIRE_PROG(SORT, sort) -BASIC_REQUIRE_PROG(TAIL, tail) -BASIC_REQUIRE_PROG(TAR, tar) -BASIC_REQUIRE_PROG(TEE, tee) -BASIC_REQUIRE_PROG(TOUCH, touch) -BASIC_REQUIRE_PROG(TR, tr) -BASIC_REQUIRE_PROG(UNIQ, uniq) -BASIC_REQUIRE_PROG(UNZIP, unzip) -BASIC_REQUIRE_PROG(WC, wc) -BASIC_REQUIRE_PROG(XARGS, xargs) -BASIC_REQUIRE_PROG(ZIP, zip) - -# Then required tools that require some special treatment. -AC_PROG_AWK -CHECK_NONEMPTY(AWK) -AC_PROG_GREP -CHECK_NONEMPTY(GREP) -AC_PROG_EGREP -CHECK_NONEMPTY(EGREP) -AC_PROG_FGREP -CHECK_NONEMPTY(FGREP) -AC_PROG_SED -CHECK_NONEMPTY(SED) - -AC_PATH_PROGS(NAWK, [nawk gawk awk]) -CHECK_NONEMPTY(NAWK) - BASIC_CHECK_GNU_MAKE -BASIC_REQUIRE_PROG(RM, rm) -RM="$RM -f" - BASIC_CHECK_FIND_DELETE -AC_SUBST(FIND_DELETE) + +# These tools might not be installed by default, +# need hint on how to install them. +BASIC_REQUIRE_PROG(UNZIP, unzip) +BASIC_REQUIRE_PROG(ZIP, zip) # Non-required basic tools -AC_PATH_PROG(THEPWDCMD, pwd) AC_PATH_PROG(LDD, ldd) if test "x$LDD" = "x"; then # List shared lib dependencies is used for @@ -497,52 +572,17 @@ if test "x$OTOOL" = "x"; then OTOOL="true" fi AC_PATH_PROGS(READELF, [readelf greadelf]) -AC_PATH_PROGS(OBJDUMP, [objdump gobjdump]) AC_PATH_PROG(HG, hg) -]) +AC_PATH_PROG(STAT, stat) +AC_PATH_PROG(TIME, time) -AC_DEFUN_ONCE([BASIC_COMPILE_UNCYGDRIVE], -[ -# When using cygwin, we need a wrapper binary that renames -# /cygdrive/c/ arguments into c:/ arguments and peeks into -# @files and rewrites these too! This wrapper binary is -# called uncygdrive.exe. -UNCYGDRIVE= -if test "x$OPENJDK_BUILD_OS" = xwindows; then - AC_MSG_CHECKING([if uncygdrive can be created]) - UNCYGDRIVE_SRC=`$CYGPATH -m $SRC_ROOT/common/src/uncygdrive.c` - rm -f $OUTPUT_ROOT/uncygdrive* - UNCYGDRIVE=`$CYGPATH -m $OUTPUT_ROOT/uncygdrive.exe` - cd $OUTPUT_ROOT - $CC $UNCYGDRIVE_SRC /Fe$UNCYGDRIVE > $OUTPUT_ROOT/uncygdrive1.log 2>&1 - cd $CURDIR - - if test ! -x $OUTPUT_ROOT/uncygdrive.exe; then - AC_MSG_RESULT([no]) - cat $OUTPUT_ROOT/uncygdrive1.log - AC_MSG_ERROR([Could not create $OUTPUT_ROOT/uncygdrive.exe]) - fi - AC_MSG_RESULT([$UNCYGDRIVE]) - AC_MSG_CHECKING([if uncygdrive.exe works]) - cd $OUTPUT_ROOT - $UNCYGDRIVE $CC $SRC_ROOT/common/src/uncygdrive.c /Fe$OUTPUT_ROOT/uncygdrive2.exe > $OUTPUT_ROOT/uncygdrive2.log 2>&1 - cd $CURDIR - if test ! -x $OUTPUT_ROOT/uncygdrive2.exe; then - AC_MSG_RESULT([no]) - cat $OUTPUT_ROOT/uncygdrive2.log - AC_MSG_ERROR([Uncygdrive did not work!]) - fi - AC_MSG_RESULT([yes]) - rm -f $OUTPUT_ROOT/uncygdrive?.??? $OUTPUT_ROOT/uncygdrive.obj - # The path to uncygdrive to use should be Unix-style - UNCYGDRIVE="$OUTPUT_ROOT/uncygdrive.exe" +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + BASIC_REQUIRE_PROG(COMM, comm) fi - -AC_SUBST(UNCYGDRIVE) ]) - -# Check if build directory is on local disk. +# 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 # Argument 2: what to do if it is on local disk # Argument 3: what to do otherwise (remote disk or failure) @@ -550,11 +590,26 @@ AC_DEFUN([BASIC_CHECK_DIR_ON_LOCAL_DISK], [ # df -l lists only local disks; if the given directory is not found then # a non-zero exit code is given - if $DF -l $1 > /dev/null 2>&1; then - $2 - else - $3 - fi + if test "x$DF" = x; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + # msys does not have df; use Windows "net use" instead. + IS_NETWORK_DISK=`net use | grep \`pwd -W | cut -d ":" -f 1 | tr a-z A-Z\`:` + if test "x$IS_NETWORK_DISK" = x; then + $2 + else + $3 + fi + else + # No df here, say it's local + $2 + fi + else + if $DF -l $1 > /dev/null 2>&1; then + $2 + else + $3 + fi + fi ]) AC_DEFUN_ONCE([BASIC_TEST_USABILITY_ISSUES], diff --git a/common/autoconf/basics_windows.m4 b/common/autoconf/basics_windows.m4 new file mode 100644 index 00000000000..c7f3d5213ee --- /dev/null +++ b/common/autoconf/basics_windows.m4 @@ -0,0 +1,420 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +AC_DEFUN([BASIC_WINDOWS_REWRITE_AS_UNIX_PATH], +[ + windows_path="[$]$1" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + $1="$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'` + $1="$unix_path" + fi +]) + +AC_DEFUN([BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH], +[ + unix_path="[$]$1" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + $1="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + $1="$windows_path" + fi +]) + +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check +AC_DEFUN([BASIC_MAKE_WINDOWS_SPACE_SAFE_CYGWIN], +[ + input_path="$1" + # 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-stile (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 $1 | $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 +]) + +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check +AC_DEFUN([BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS], +[ + input_path="$1" + # 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 +]) + +# FIXME: The BASIC_FIXUP_*_CYGWIN/MSYS is most likely too convoluted +# and could probably be heavily simplified. However, all changes in this +# area tend to need lot of testing in different scenarios, and in lack of +# proper unit testing, cleaning this up has not been deemed worth the effort +# at the moment. + +AC_DEFUN([BASIC_FIXUP_PATH_CYGWIN], +[ + # Input might be given as Windows format, start by converting to + # unix format. + path="[$]$1" + 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 + AC_MSG_NOTICE([The path of $1, which resolves as "$path", is invalid.]) + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + BASIC_MAKE_WINDOWS_SPACE_SAFE_CYGWIN([$new_path]) + + if test "x$path" != "x$new_path"; then + $1="$new_path" + AC_MSG_NOTICE([Rewriting $1 to "$new_path"]) + fi +]) + +AC_DEFUN([BASIC_FIXUP_PATH_MSYS], +[ + path="[$]$1" + 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 + + BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS([$new_path]) + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + if test "x$path" != "x$new_path"; then + $1="$new_path" + AC_MSG_NOTICE([Rewriting $1 to "$new_path"]) + 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}") +]) + +AC_DEFUN([BASIC_FIXUP_EXECUTABLE_CYGWIN], +[ + # First separate the path from the arguments. This will split at the first + # space. + complete="[$]$1" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + AC_MSG_NOTICE([The path of $1, which resolves as "$complete", is not found.]) + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([You might be mixing spaces in the path and extra arguments, which is not allowed.]) + fi + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + AC_MSG_NOTICE([The path of $1, which resolves as "$new_path", is invalid.]) + AC_MSG_NOTICE([Neither "$new_path" nor "$new_path.exe/cmd" can be found]) + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + BASIC_MAKE_WINDOWS_SPACE_SAFE_CYGWIN([$input_to_shortpath]) + # remove trailing .exe if any + new_path="${new_path/%.exe/}" +]) + +AC_DEFUN([BASIC_FIXUP_EXECUTABLE_MSYS], +[ + # First separate the path from the arguments. This will split at the first + # space. + complete="[$]$1" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + AC_MSG_NOTICE([The path of $1, which resolves as "$complete", is not found.]) + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + AC_MSG_NOTICE([You might be mixing spaces in the path and extra arguments, which is not allowed.]) + fi + AC_MSG_ERROR([Cannot locate the the path of $1]) + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $new_path` + BASIC_MAKE_WINDOWS_SPACE_SAFE_MSYS([$new_path]) + # Output is in $new_path + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(new_path) + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi +]) + +# Setup basic configuration paths, and platform-specific stuff related to PATHs. +AC_DEFUN([BASIC_CHECK_PATHS_WINDOWS], +[ + SRC_ROOT_LENGTH=`$THEPWDCMD|$WC -m` + if test $SRC_ROOT_LENGTH -gt 100; then + AC_MSG_ERROR([Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported]) + fi + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + AC_MSG_CHECKING([cygwin release]) + CYGWIN_VERSION=`$UNAME -r` + AC_MSG_RESULT([$CYGWIN_VERSION]) + WINDOWS_ENV_VENDOR='cygwin' + WINDOWS_ENV_VERSION="$CYGWIN_VERSION" + + CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^1.7.` + if test "x$CYGWIN_VERSION_OK" = x; then + AC_MSG_NOTICE([Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade.]) + AC_MSG_ERROR([Cannot continue]) + fi + if test "x$CYGPATH" = x; then + AC_MSG_ERROR([Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path]) + fi + AC_MSG_CHECKING([cygwin root directory as unix-style path]) + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + cygwin_winpath_root=`cd / ; cmd /c cd | grep ".*"` + # Force cygpath to report the proper root by including a trailing space, and then stripping it off again. + CYGWIN_ROOT_PATH=`$CYGPATH -u "$cygwin_winpath_root " | $CUT -f 1 -d " "` + AC_MSG_RESULT([$CYGWIN_ROOT_PATH]) + WINDOWS_ENV_ROOT_PATH="$CYGWIN_ROOT_PATH" + test_cygdrive_prefix=`$ECHO $CYGWIN_ROOT_PATH | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + AC_MSG_ERROR([Your cygdrive prefix is not /cygdrive. This is currently not supported. Change with mount -c.]) + fi + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + AC_MSG_CHECKING([msys release]) + MSYS_VERSION=`$UNAME -r` + AC_MSG_RESULT([$MSYS_VERSION]) + + WINDOWS_ENV_VENDOR='msys' + WINDOWS_ENV_VERSION="$MSYS_VERSION" + + AC_MSG_CHECKING([msys root directory as unix-style path]) + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + MSYS_ROOT_PATH=`cd / ; cmd /c cd | grep ".*"` + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(MSYS_ROOT_PATH) + AC_MSG_RESULT([$MSYS_ROOT_PATH]) + WINDOWS_ENV_ROOT_PATH="$MSYS_ROOT_PATH" + else + AC_MSG_ERROR([Unknown Windows environment. Neither cygwin nor msys was detected.]) + fi + + # Test if windows or unix (cygwin/msys) find is first in path. + AC_MSG_CHECKING([what kind of 'find' is first on the PATH]) + FIND_BINARY_OUTPUT=`find --version 2>&1` + if test "x`echo $FIND_BINARY_OUTPUT | $GREP GNU`" != x; then + AC_MSG_RESULT([unix style]) + elif test "x`echo $FIND_BINARY_OUTPUT | $GREP FIND`" != x; then + AC_MSG_RESULT([Windows]) + AC_MSG_NOTICE([Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools.]) + AC_MSG_NOTICE([This will not work. Please correct and make sure /usr/bin (or similar) is first in path.]) + AC_MSG_ERROR([Cannot continue]) + else + AC_MSG_RESULT([unknown]) + AC_MSG_WARN([It seems that your find utility is non-standard.]) + fi +]) + +AC_DEFUN_ONCE([BASIC_COMPILE_FIXPATH], +[ +# When using cygwin or msys, we need a wrapper binary that renames +# /cygdrive/c/ arguments into c:/ arguments and peeks into +# @files and rewrites these too! This wrapper binary is +# called fixpath. +FIXPATH= +if test "x$OPENJDK_BUILD_OS" = xwindows; then + AC_MSG_CHECKING([if fixpath can be created]) + FIXPATH_SRC="$SRC_ROOT/common/src/fixpath.c" + FIXPATH_BIN="$OUTPUT_ROOT/fixpath.exe" + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + FIXPATH_SRC=`$CYGPATH -m $FIXPATH_SRC` + FIXPATH_BIN=`$CYGPATH -m $FIXPATH_BIN` + # Important to keep the .exe suffix on Cygwin for Hotspot makefiles + FIXPATH="$OUTPUT_ROOT/fixpath.exe -c" + elif test "x$OPENJDK_BUILD_OS_ENV" = xwindows.msys; then + FIXPATH_SRC=`cmd //c echo $FIXPATH_SRC` + FIXPATH_BIN=`cmd //c echo $FIXPATH_BIN` + + # Take all collected prefixes and turn them into a -m/c/foo@/c/bar@... command line + # @ was chosen as separator to minimize risk of other tools messing around with it + all_unique_prefixes=`echo "${all_fixpath_prefixes@<:@@@:>@}" | tr ' ' '\n' | grep '^/./' | sort | uniq` + fixpath_argument_list=`echo $all_unique_prefixes | tr ' ' '@'` + + FIXPATH="$OUTPUT_ROOT/fixpath -m$fixpath_argument_list" + fi + rm -f $OUTPUT_ROOT/fixpath* + cd $OUTPUT_ROOT + $CC $FIXPATH_SRC -Fe$FIXPATH_BIN > $OUTPUT_ROOT/fixpath1.log 2>&1 + cd $CURDIR + + if test ! -x $OUTPUT_ROOT/fixpath.exe; then + AC_MSG_RESULT([no]) + cat $OUTPUT_ROOT/fixpath1.log + AC_MSG_ERROR([Could not create $OUTPUT_ROOT/fixpath.exe]) + fi + AC_MSG_RESULT([yes]) + AC_MSG_CHECKING([if fixpath.exe works]) + cd $OUTPUT_ROOT + $FIXPATH $CC $SRC_ROOT/common/src/fixpath.c -Fe$OUTPUT_ROOT/fixpath2.exe > $OUTPUT_ROOT/fixpath2.log 2>&1 + cd $CURDIR + if test ! -x $OUTPUT_ROOT/fixpath2.exe; then + AC_MSG_RESULT([no]) + cat $OUTPUT_ROOT/fixpath2.log + AC_MSG_ERROR([fixpath did not work!]) + fi + AC_MSG_RESULT([yes]) + rm -f $OUTPUT_ROOT/fixpath?.??? $OUTPUT_ROOT/fixpath.obj +fi + +AC_SUBST(FIXPATH) +]) diff --git a/common/autoconf/boot-jdk.m4 b/common/autoconf/boot-jdk.m4 index c4ce883363a..4a4ea36b50d 100644 --- a/common/autoconf/boot-jdk.m4 +++ b/common/autoconf/boot-jdk.m4 @@ -62,9 +62,12 @@ AC_DEFUN([BOOTJDK_DO_CHECK], else # We're done! :-) BOOT_JDK_FOUND=yes - SPACESAFE(BOOT_JDK,[the path to the Boot JDK]) + BASIC_FIXUP_PATH(BOOT_JDK) AC_MSG_CHECKING([for Boot JDK]) - AC_MSG_RESULT([$BOOT_JDK ($BOOT_JDK_VERSION)]) + AC_MSG_RESULT([$BOOT_JDK]) + AC_MSG_CHECKING([Boot JDK version]) + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + AC_MSG_RESULT([$BOOT_JDK_VERSION]) fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -93,12 +96,8 @@ AC_DEFUN([BOOTJDK_CHECK_BUILDDEPS], AC_DEFUN([BOOTJDK_CHECK_JAVA_HOME], [ if test "x$JAVA_HOME" != x; then - if test "x$OPENJDK_TARGET_OS" = xwindows; then - # On Windows, JAVA_HOME is likely in DOS-style - JAVA_HOME_PROCESSED="`$CYGPATH -u "$JAVA_HOME"`" - else - JAVA_HOME_PROCESSED="$JAVA_HOME" - fi + JAVA_HOME_PROCESSED="$JAVA_HOME" + BASIC_FIXUP_PATH(JAVA_HOME_PROCESSED) if test ! -d "$JAVA_HOME_PROCESSED"; then AC_MSG_NOTICE([Your JAVA_HOME points to a non-existing directory!]) else @@ -125,8 +124,7 @@ AC_DEFUN([BOOTJDK_CHECK_JAVA_IN_PATH_IS_SYMLINK], # Lets find the JDK/JRE directory by following symbolic links. # Linux/GNU systems often have links from /usr/bin/java to # /etc/alternatives/java to the real JDK binary. - SET_FULL_PATH_SPACESAFE(BINARY) - REMOVE_SYMBOLIC_LINKS(BINARY) + BASIC_REMOVE_SYMBOLIC_LINKS(BINARY) BOOT_JDK=`dirname "$BINARY"` BOOT_JDK=`cd "$BOOT_JDK/.."; pwd` if test -x "$BOOT_JDK/bin/javac" && test -x "$BOOT_JDK/bin/java"; then @@ -155,13 +153,17 @@ AC_DEFUN([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY], [ BOOT_JDK_PREFIX="$1" BOOT_JDK_SUFFIX="$2" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - AC_MSG_NOTICE([Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)]) - fi + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + BOOTJDK_DO_CHECK([ + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + AC_MSG_NOTICE([Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)]) + fi + ]) + done fi ]) @@ -171,7 +173,9 @@ AC_DEFUN([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY], AC_DEFUN([BOOTJDK_FIND_BEST_JDK_IN_WINDOWS_VIRTUAL_DIRECTORY], [ if test "x[$]$1" != x; then - BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([`$CYGPATH -u "[$]$1"`/Java]) + VIRTUAL_DIR="[$]$1/Java" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(VIRTUAL_DIR) + BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY($VIRTUAL_DIR) fi ]) @@ -187,6 +191,8 @@ AC_DEFUN([BOOTJDK_CHECK_WELL_KNOWN_LOCATIONS], elif test "x$OPENJDK_TARGET_OS" = xmacosx; then BOOTJDK_DO_CHECK([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([/Library/Java/JavaVirtualMachines],[/Contents/Home])]) BOOTJDK_DO_CHECK([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([/System/Library/Java/JavaVirtualMachines],[/Contents/Home])]) + elif test "x$OPENJDK_TARGET_OS" = xlinux; then + BOOTJDK_DO_CHECK([BOOTJDK_FIND_BEST_JDK_IN_DIRECTORY([/usr/lib/jvm])]) fi ]) diff --git a/common/autoconf/build-aux/config.guess b/common/autoconf/build-aux/config.guess index 9d9d29b0b23..572ed2be3e8 100644 --- a/common/autoconf/build-aux/config.guess +++ b/common/autoconf/build-aux/config.guess @@ -48,6 +48,9 @@ fi # Test and fix cygwin on x86_64 echo $OUT | grep 86-pc-cygwin > /dev/null 2> /dev/null +if test $? != 0; then + echo $OUT | grep 86-pc-mingw > /dev/null 2> /dev/null +fi if test $? = 0; then case `echo $PROCESSOR_IDENTIFIER | cut -f1 -d' '` in intel64|Intel64|INTEL64|em64t|EM64T|amd64|AMD64|8664|x86_64) diff --git a/common/autoconf/build-performance.m4 b/common/autoconf/build-performance.m4 index 5ad5837eb78..0838e867028 100644 --- a/common/autoconf/build-performance.m4 +++ b/common/autoconf/build-performance.m4 @@ -41,6 +41,10 @@ AC_DEFUN([BPERF_CHECK_CORES], # Looks like a MacOSX system NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print [$]5}'` FOUND_CORES=yes + elif test -n "$NUMBER_OF_PROCESSORS"; then + # On windows, look in the env + NUM_CORES=$NUMBER_OF_PROCESSORS + FOUND_CORES=yes fi # For c/c++ code we run twice as many concurrent build @@ -50,7 +54,8 @@ AC_DEFUN([BPERF_CHECK_CORES], if test "x$FOUND_CORES" = xyes; then AC_MSG_RESULT([$NUM_CORES]) else - AC_MSG_RESULT([could not detect number of cores, defaulting to 1!]) + AC_MSG_RESULT([could not detect number of cores, defaulting to 1]) + AC_MSG_WARN([This will disable all parallelism from build!]) fi ]) @@ -76,16 +81,18 @@ AC_DEFUN([BPERF_CHECK_MEMORY_SIZE], MEMORY_SIZE=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Memory' | awk '{print [$]2}'` MEMORY_SIZE=`expr $MEMORY_SIZE \* 1024` FOUND_MEM=yes - elif test "x$build_os" = xwindows; then + elif test "x$OPENJDK_BUILD_OS" = xwindows; then # Windows, but without cygwin - MEMORY_SIZE=`systeminfo | grep 'Total Physical Memory:' | awk '{ print [$]4 }' | sed 's/,//'` + MEMORY_SIZE=`wmic computersystem get totalphysicalmemory -value | grep = | cut -d "=" -f 2-` + MEMORY_SIZE=`expr $MEMORY_SIZE / 1024 / 1024` FOUND_MEM=yes fi if test "x$FOUND_MEM" = xyes; then AC_MSG_RESULT([$MEMORY_SIZE MB]) else - AC_MSG_RESULT([could not detect memory size defaulting to 1024 MB!]) + AC_MSG_RESULT([could not detect memory size, defaulting to 1024 MB]) + AC_MSG_WARN([This might seriously impact build performance!]) fi ]) @@ -123,7 +130,7 @@ AC_DEFUN([BPERF_SETUP_CCACHE], [ AC_ARG_ENABLE([ccache], [AS_HELP_STRING([--disable-ccache], - [use ccache to speed up recompilations @<:@enabled@:>@])], + [disable using ccache to speed up recompilations @<:@enabled@:>@])], [ENABLE_CCACHE=${enable_ccache}], [ENABLE_CCACHE=yes]) if test "x$ENABLE_CCACHE" = xyes; then AC_PATH_PROG(CCACHE, ccache) @@ -196,7 +203,7 @@ AC_DEFUN_ONCE([BPERF_SETUP_PRECOMPILED_HEADERS], # Can the C/C++ compiler use precompiled headers? # AC_ARG_ENABLE([precompiled-headers], [AS_HELP_STRING([--disable-precompiled-headers], - [use precompiled headers when compiling C++ @<:@enabled@:>@])], + [disable using precompiled headers when compiling C++ @<:@enabled@:>@])], [ENABLE_PRECOMPH=${enable_precompiled-headers}], [ENABLE_PRECOMPH=yes]) USE_PRECOMPILED_HEADER=1 @@ -228,8 +235,7 @@ AC_SUBST(USE_PRECOMPILED_HEADER) AC_DEFUN_ONCE([BPERF_SETUP_SMART_JAVAC], [ AC_ARG_WITH(sjavac-server-java, [AS_HELP_STRING([--with-sjavac-server-java], - [use this java binary for running the sjavac background server and other long running java tasks in the build process, - e.g. ---with-sjavac-server-java="/opt/jrockit/bin/java -server"])]) + [use this java binary for running the sjavac background server @<:@Boot JDK java@:>@])]) if test "x$with_sjavac_server_java" != x; then SJAVAC_SERVER_JAVA="$with_sjavac_server_java" diff --git a/common/autoconf/builddeps.m4 b/common/autoconf/builddeps.m4 index 661001d7d24..207be33c88a 100644 --- a/common/autoconf/builddeps.m4 +++ b/common/autoconf/builddeps.m4 @@ -235,26 +235,13 @@ AC_ARG_WITH(builddeps-conf, [AS_HELP_STRING([--with-builddeps-conf], [use this configuration file for the builddeps])]) AC_ARG_WITH(builddeps-server, [AS_HELP_STRING([--with-builddeps-server], - [download and use build dependencies from this server url, e.g. --with-builddeps-server=ftp://example.com/dir])]) + [download and use build dependencies from this server url])]) AC_ARG_WITH(builddeps-dir, [AS_HELP_STRING([--with-builddeps-dir], - [store downloaded build dependencies here @<:@d/localhome/builddeps@:>@])], + [store downloaded build dependencies here @<:@/localhome/builddeps@:>@])], [], [with_builddeps_dir=/localhome/builddeps]) AC_ARG_WITH(builddeps-group, [AS_HELP_STRING([--with-builddeps-group], [chgrp the downloaded build dependencies to this group])]) - -AC_ARG_ENABLE([list-builddeps], [AS_HELP_STRING([--enable-list-builddeps], - [list all build dependencies known to the configure script])], - [LIST_BUILDDEPS="${enableval}"], [LIST_BUILDDEPS='no']) - -if test "x$LIST_BUILDDEPS" = xyes; then - echo - echo List of build dependencies known to the configure script, - echo that can be used in builddeps.conf files: - cat $AUTOCONF_DIR/*.ac $AUTOCONF_DIR/*.m4 | grep BDEPS_CHECK_MODUL[E]\( | cut -f 2 -d ',' | tr -d ' ' | sort - echo - exit 1 -fi ]) diff --git a/common/autoconf/closed.version.numbers b/common/autoconf/closed.version.numbers index b119cd9bd97..b22ad976cbc 100644 --- a/common/autoconf/closed.version.numbers +++ b/common/autoconf/closed.version.numbers @@ -26,3 +26,7 @@ PRODUCT_NAME="Java(TM)" PRODUCT_SUFFIX="SE Runtime Environment" JDK_RC_PLATFORM_NAME="Platform SE" COMPANY_NAME="Oracle Corporation" + +# Might need better names for these +MACOSX_BUNDLE_NAME_BASE="Java SE" +MACOSX_BUNDLE_ID_BASE="com.oracle.java" diff --git a/common/autoconf/compare.sh.in b/common/autoconf/compare.sh.in index 25c8c7e9fad..1a1b997da24 100644 --- a/common/autoconf/compare.sh.in +++ b/common/autoconf/compare.sh.in @@ -40,12 +40,12 @@ CMP="@CMP@" CP="@CP@" CUT="@CUT@" DIFF="@DIFF@" -DUMPBIN="@UNCYGDRIVE@ @DUMPBIN@" +DUMPBIN="@FIXPATH@ @DUMPBIN@" EXPR="@EXPR@" FILE="@FILE@" FIND="@FIND@" GREP="@GREP@" -JAVAP="@UNCYGDRIVE@ @BOOT_JDK@/bin/javap" +JAVAP="@FIXPATH@ @BOOT_JDK@/bin/javap" LDD="@LDD@" MKDIR="@MKDIR@" NM="@NM@" @@ -56,1614 +56,24 @@ READELF="@READELF@" RM="@RM@" SED="@SED@" SORT="@SORT@" +STAT="@STAT@" STRIP="@POST_STRIP_CMD@" TEE="@TEE@" UNIQ="@UNIQ@" +UNPACK200="@FIXPATH@ @BOOT_JDK@/bin/unpack200" UNZIP="@UNZIP@" SRC_ROOT="@SRC_ROOT@" -if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then - READELF_CMD="otool -v -V -h -X -t -d" -elif [ -n "$READELF" ] && [ "$OPENJDK_TARGET_OS" != "windows" ]; then - READELF_CMD="$READELF -a" -fi - -if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then - LDD_CMD="$OTOOL -L" -elif [ -n "$LDD" ]; then - LDD_CMD="$LDD" -fi - -########################################################################################## -# Diff exceptions - -if [ "$OPENJDK_TARGET_OS" = "linux" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then -STRIP_BEFORE_COMPARE=" -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -" - -KNOWN_BIN_DIFF=" -" - -ACCEPTED_BIN_DIFF=" -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -./jre/lib/amd64/libattach.so -./jre/lib/amd64/libdt_socket.so -./jre/lib/amd64/libhprof.so -./jre/lib/amd64/libinstrument.so -./jre/lib/amd64/libjava_crw_demo.so -./jre/lib/amd64/libjsdt.so -./jre/lib/amd64/libjsig.so -./jre/lib/amd64/libmanagement.so -./jre/lib/amd64/libnpt.so -./jre/lib/amd64/libsaproc.so -./jre/lib/amd64/libverify.so -./jre/lib/amd64/server/libjsig.so -./jre/lib/amd64/server/libjvm.so -./bin/appletviewer -./bin/extcheck -./bin/idlj -./bin/jar -./bin/jarsigner -./bin/java -./bin/javac -./bin/javadoc -./bin/javah -./bin/javap -./bin/jcmd -./bin/jconsole -./bin/jdb -./bin/jhat -./bin/jinfo -./bin/jmap -./bin/jps -./bin/jrunscript -./bin/jsadebugd -./bin/jstack -./bin/jstat -./bin/jstatd -./bin/keytool -./bin/native2ascii -./bin/orbd -./bin/pack200 -./bin/policytool -./bin/rmic -./bin/rmid -./bin/rmiregistry -./bin/schemagen -./bin/serialver -./bin/servertool -./bin/tnameserv -./bin/wsgen -./bin/wsimport -./bin/xjc -./jre/bin/java -./jre/bin/keytool -./jre/bin/orbd -./jre/bin/pack200 -./jre/bin/policytool -./jre/bin/rmid -./jre/bin/rmiregistry -./jre/bin/servertool -./jre/bin/tnameserv -" - -KNOWN_SIZE_DIFF=" -" - -KNOWN_SYM_DIFF=" -" - -KNOWN_ELF_DIFF=" -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/waiters/lib/libwaiters.so -" -fi - -if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86" ]; then - -STRIP_BEFORE_COMPARE=" -./demo/jni/Poller/lib/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -./jre/lib/i386/jexec -" - -SORT_SYMBOLS=" -./jre/lib/i386/client/libjvm.so -./jre/lib/i386/server/libjvm.so -" - -SKIP_BIN_DIFF="true" - -ACCEPTED_SMALL_SIZE_DIFF=" -./demo/jni/Poller/lib/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/libgctest.so -./demo/jvmti/heapTracker/lib/libheapTracker.so -./demo/jvmti/heapViewer/lib/libheapViewer.so -./demo/jvmti/hprof/lib/libhprof.so -./demo/jvmti/minst/lib/libminst.so -./demo/jvmti/mtrace/lib/libmtrace.so -./demo/jvmti/versionCheck/lib/libversionCheck.so -./demo/jvmti/waiters/lib/libwaiters.so -./jre/lib/i386/client/libjvm.so -./jre/lib/i386/jli/libjli.so -./jre/lib/i386/libJdbcOdbc.so -./jre/lib/i386/libattach.so -./jre/lib/i386/libawt.so -./jre/lib/i386/libawt_headless.so -./jre/lib/i386/libawt_xawt.so -./jre/lib/i386/libdcpr.so -./jre/lib/i386/libdt_socket.so -./jre/lib/i386/libfontmanager.so -./jre/lib/i386/libhprof.so -./jre/lib/i386/libinstrument.so -./jre/lib/i386/libj2gss.so -./jre/lib/i386/libj2pcsc.so -./jre/lib/i386/libj2pkcs11.so -./jre/lib/i386/libj2ucrypto.so -./jre/lib/i386/libjaas_unix.so -./jre/lib/i386/libjava.so -./jre/lib/i386/libjava_crw_demo.so -./jre/lib/i386/libjawt.so -./jre/lib/i386/libjdwp.so -./jre/lib/i386/libjfr.so -./jre/lib/i386/libjpeg.so -./jre/lib/i386/libjsdt.so -./jre/lib/i386/libjsound.so -./jre/lib/i386/libkcms.so -./jre/lib/i386/libmanagement.so -./jre/lib/i386/libmlib_image.so -./jre/lib/i386/libnet.so -./jre/lib/i386/libnio.so -./jre/lib/i386/libnpt.so -./jre/lib/i386/libsctp.so -./jre/lib/i386/libsplashscreen.so -./jre/lib/i386/libsunec.so -./jre/lib/i386/libsunwjdga.so -./jre/lib/i386/libt2k.so -./jre/lib/i386/libunpack.so -./jre/lib/i386/libverify.so -./jre/lib/i386/libzip.so -./jre/lib/i386/server/libjvm.so -./bin/appletviewer -./bin/extcheck -./bin/idlj -./bin/jar -./bin/jarsigner -./bin/java -./bin/javac -./bin/javadoc -./bin/javah -./bin/javap -./bin/jcmd -./bin/jconsole -./bin/jdb -./bin/jhat -./bin/jinfo -./bin/jmap -./bin/jps -./bin/jrunscript -./bin/jsadebugd -./bin/jstack -./bin/jstat -./bin/jstatd -./bin/keytool -./bin/native2ascii -./bin/orbd -./bin/pack200 -./bin/policytool -./bin/rmic -./bin/rmid -./bin/rmiregistry -./bin/schemagen -./bin/serialver -./bin/servertool -./bin/tnameserv -./bin/unpack200 -./bin/wsgen -./bin/wsimport -./bin/xjc -./jre/bin/java -./jre/bin/keytool -./jre/bin/orbd -./jre/bin/pack200 -./jre/bin/policytool -./jre/bin/rmid -./jre/bin/rmiregistry -./jre/bin/servertool -./jre/bin/tnameserv -./jre/bin/unpack200 -./jre/lib/i386/jexec -" - -SKIP_ELF_DIFF="true" - -# libjvm.so differs in the random 15 char prefix on some symbols. -ACCEPTED_DIS_DIFF=" -./jre/lib/i386/client/libjvm.so -./jre/lib/i386/server/libjvm.so -" - -fi - -if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then - -STRIP_BEFORE_COMPARE=" -./demo/jni/Poller/lib/amd64/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/amd64/libgctest.so -./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so -./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so -./demo/jvmti/hprof/lib/amd64/libhprof.so -./demo/jvmti/minst/lib/amd64/libminst.so -./demo/jvmti/mtrace/lib/amd64/libmtrace.so -./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so -./demo/jvmti/waiters/lib/amd64/libwaiters.so -" - -SORT_SYMBOLS=" -./jre/lib/amd64/server/libjvm.so -" - -SKIP_BIN_DIFF="true" - -ACCEPTED_SMALL_SIZE_DIFF=" -./demo/jni/Poller/lib/amd64/libPoller.so -./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so -./demo/jvmti/gctest/lib/amd64/libgctest.so -./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so -./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so -./demo/jvmti/hprof/lib/amd64/libhprof.so -./demo/jvmti/minst/lib/amd64/libminst.so -./demo/jvmti/mtrace/lib/amd64/libmtrace.so -./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so -./demo/jvmti/waiters/lib/amd64/libwaiters.so -./jre/lib/amd64/jli/libjli.so -./jre/lib/amd64/libJdbcOdbc.so -./jre/lib/amd64/libattach.so -./jre/lib/amd64/libawt.so -./jre/lib/amd64/libawt_headless.so -./jre/lib/amd64/libawt_xawt.so -./jre/lib/amd64/libdcpr.so -./jre/lib/amd64/libdt_socket.so -./jre/lib/amd64/libfontmanager.so -./jre/lib/amd64/libhprof.so -./jre/lib/amd64/libinstrument.so -./jre/lib/amd64/libj2gss.so -./jre/lib/amd64/libj2pcsc.so -./jre/lib/amd64/libj2pkcs11.so -./jre/lib/amd64/libj2ucrypto.so -./jre/lib/amd64/libjaas_unix.so -./jre/lib/amd64/libjava.so -./jre/lib/amd64/libjava_crw_demo.so -./jre/lib/amd64/libjawt.so -./jre/lib/amd64/libjdwp.so -./jre/lib/amd64/libjfr.so -./jre/lib/amd64/libjpeg.so -./jre/lib/amd64/libjsdt.so -./jre/lib/amd64/libjsound.so -./jre/lib/amd64/libkcms.so -./jre/lib/amd64/libmanagement.so -./jre/lib/amd64/libmlib_image.so -./jre/lib/amd64/libnet.so -./jre/lib/amd64/libnio.so -./jre/lib/amd64/libnpt.so -./jre/lib/amd64/libsctp.so -./jre/lib/amd64/libsplashscreen.so -./jre/lib/amd64/libsunec.so -./jre/lib/amd64/libsunwjdga.so -./jre/lib/amd64/libt2k.so -./jre/lib/amd64/libunpack.so -./jre/lib/amd64/libverify.so -./jre/lib/amd64/libzip.so -./jre/lib/amd64/server/64/libjvm_db.so -./jre/lib/amd64/server/64/libjvm_dtrace.so -./bin/amd64/appletviewer -./bin/amd64/extcheck -./bin/amd64/idlj -./bin/amd64/jar -./bin/amd64/jarsigner -./bin/amd64/java -./bin/amd64/javac -./bin/amd64/javadoc -./bin/amd64/javah -./bin/amd64/javap -./bin/amd64/jcmd -./bin/amd64/jconsole -./bin/amd64/jdb -./bin/amd64/jhat -./bin/amd64/jinfo -./bin/amd64/jmap -./bin/amd64/jps -./bin/amd64/jrunscript -./bin/amd64/jsadebugd -./bin/amd64/jstack -./bin/amd64/jstat -./bin/amd64/jstatd -./bin/amd64/keytool -./bin/amd64/native2ascii -./bin/amd64/orbd -./bin/amd64/pack200 -./bin/amd64/policytool -./bin/amd64/rmic -./bin/amd64/rmid -./bin/amd64/rmiregistry -./bin/amd64/schemagen -./bin/amd64/serialver -./bin/amd64/servertool -./bin/amd64/tnameserv -./bin/amd64/unpack200 -./bin/amd64/wsgen -./bin/amd64/wsimport -./bin/amd64/xjc -./jre/bin/amd64/java -./jre/bin/amd64/keytool -./jre/bin/amd64/orbd -./jre/bin/amd64/pack200 -./jre/bin/amd64/policytool -./jre/bin/amd64/rmid -./jre/bin/amd64/rmiregistry -./jre/bin/amd64/servertool -./jre/bin/amd64/tnameserv -./jre/bin/amd64/unpack200 -./jre/lib/amd64/jexec -" - -SKIP_ELF_DIFF="true" - -# Can't find an explaination for the diff in libmlib_image.so. -KNOWN_DIS_DIFF=" -./jre/lib/amd64/libmlib_image.so -" -# libjvm.so differs in the random 15 char prefix on some symbols. -ACCEPTED_DIS_DIFF=" -./jre/lib/amd64/server/libjvm.so -" - -fi - -if [ "$OPENJDK_TARGET_OS" = "windows" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then - -ACCEPTED_BIN_DIFF=" -./bin/jli.dll -./demo/jvmti/compiledMethodLoad/lib/compiledMethodLoad.dll -./demo/jvmti/gctest/lib/gctest.dll -./demo/jvmti/heapTracker/lib/heapTracker.dll -./demo/jvmti/heapViewer/lib/heapViewer.dll -./demo/jvmti/hprof/lib/hprof.dll -./demo/jvmti/minst/lib/minst.dll -./demo/jvmti/mtrace/lib/mtrace.dll -./demo/jvmti/versionCheck/lib/versionCheck.dll -./demo/jvmti/waiters/lib/waiters.dll -./jre/bin/attach.dll -./jre/bin/awt.dll -./jre/bin/dcpr.dll -./jre/bin/dt_shmem.dll -./jre/bin/dt_socket.dll -./jre/bin/fontmanager.dll -./jre/bin/hprof.dll -./jre/bin/instrument.dll -./jre/bin/j2pcsc.dll -./jre/bin/j2pkcs11.dll -./jre/bin/jaas_nt.dll -./jre/bin/java.dll -./jre/bin/java_crw_demo.dll -./jre/bin/jawt.dll -./jre/bin/JdbcOdbc.dll -./jre/bin/jdwp.dll -./jre/bin/jfr.dll -./jre/bin/jli.dll -./jre/bin/jpeg.dll -./jre/bin/jsdt.dll -./jre/bin/jsound.dll -./jre/bin/jsoundds.dll -./jre/bin/kcms.dll -./jre/bin/management.dll -./jre/bin/mlib_image.dll -./jre/bin/net.dll -./jre/bin/nio.dll -./jre/bin/npt.dll -./jre/bin/sawindbg.dll -./jre/bin/server/jvm.dll -./jre/bin/splashscreen.dll -./jre/bin/sunec.dll -./jre/bin/sunmscapi.dll -./jre/bin/t2k.dll -./jre/bin/unpack.dll -./jre/bin/verify.dll -./jre/bin/w2k_lsa_auth.dll -./jre/bin/zip.dll -./bin/appletviewer.exe -./bin/extcheck.exe -./bin/idlj.exe -./bin/jar.exe -./bin/jarsigner.exe -./bin/java.exe -./bin/javac.exe -./bin/javadoc.exe -./bin/javah.exe -./bin/javap.exe -./bin/java-rmi.exe -./bin/javaw.exe -./bin/jcmd.exe -./bin/jconsole.exe -./bin/jdb.exe -./bin/jhat.exe -./bin/jinfo.exe -./bin/jmap.exe -./bin/jps.exe -./bin/jrunscript.exe -./bin/jsadebugd.exe -./bin/jstack.exe -./bin/jstat.exe -./bin/jstatd.exe -./bin/keytool.exe -./bin/kinit.exe -./bin/klist.exe -./bin/ktab.exe -./bin/native2ascii.exe -./bin/orbd.exe -./bin/pack200.exe -./bin/policytool.exe -./bin/rmic.exe -./bin/rmid.exe -./bin/rmiregistry.exe -./bin/schemagen.exe -./bin/serialver.exe -./bin/servertool.exe -./bin/tnameserv.exe -./bin/unpack200.exe -./bin/wsgen.exe -./bin/wsimport.exe -./bin/xjc.exe -./jre/bin/java.exe -./jre/bin/java-rmi.exe -./jre/bin/javaw.exe -./jre/bin/keytool.exe -./jre/bin/kinit.exe -./jre/bin/klist.exe -./jre/bin/ktab.exe -./jre/bin/orbd.exe -./jre/bin/pack200.exe -./jre/bin/policytool.exe -./jre/bin/rmid.exe -./jre/bin/rmiregistry.exe -./jre/bin/servertool.exe -./jre/bin/tnameserv.exe -./jre/bin/unpack200.exe -" - -KNOWN_SIZE_DIFF=" -./demo/jvmti/heapTracker/lib/heapTracker.dll -./demo/jvmti/minst/lib/minst.dll -./jre/bin/awt.dll -./jre/bin/java_crw_demo.dll -./bin/java.exe -./bin/javaw.exe -./bin/unpack200.exe -./jre/bin/java.exe -./jre/bin/javaw.exe -./jre/bin/unpack200.exe -" - -KNOWN_SYM_DIFF=" -./jre/bin/awt.dll -./jre/bin/java_crw_demo.dll -" -fi - - - -if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then -ACCEPTED_JARZIP_CONTENTS=" -/META-INF/INDEX.LIST -" - -KNOWN_BIN_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/libsaproc.dylib -./jre/lib/server/libjvm.dylib -" - -ACCEPTED_BIN_DIFF=" -./bin/appletviewer -./bin/extcheck -./bin/idlj -./bin/jar -./bin/jarsigner -./bin/java -./bin/javac -./bin/javadoc -./bin/javah -./bin/javap -./bin/jcmd -./bin/jconsole -./bin/jdb -./bin/jhat -./bin/jinfo -./bin/jmap -./bin/jps -./bin/jrunscript -./bin/jsadebugd -./bin/jstack -./bin/jstat -./bin/jstatd -./bin/keytool -./bin/native2ascii -./bin/orbd -./bin/pack200 -./bin/policytool -./bin/rmic -./bin/rmid -./bin/rmiregistry -./bin/schemagen -./bin/serialver -./bin/servertool -./bin/tnameserv -./bin/wsgen -./bin/wsimport -./bin/xjc -./jre/bin/java -./jre/bin/keytool -./jre/bin/orbd -./jre/bin/pack200 -./jre/bin/policytool -./jre/bin/rmid -./jre/bin/rmiregistry -./jre/bin/servertool -./jre/bin/tnameserv -" - -KNOWN_SIZE_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/server/libjvm.dylib -" - -KNOWN_SYM_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/server/libjvm.dylib -" - -KNOWN_ELF_DIFF=" -./jre/lib/libJObjC.dylib -./jre/lib/server/libjvm.dylib -" - -SKIP_DIS_DIFF="true" - -fi - -########################################################################################## -# Compare text files and ignore specific differences: -# -# * Timestamps in Java sources generated by idl2java -# * Sorting order and cleanup style in .properties files - -diff_text() { - OTHER_FILE=$1 - THIS_FILE=$2 - - SUFFIX="${THIS_FILE##*.}" - - TMP=1 - - if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then - TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ - $GREP '^[<>]' | \ - $SED -e '/[<>] Ant-Version: Apache Ant .*/d' \ - -e '/[<>] Created-By: .* (Oracle Corporation).*/d') - fi - if test "x$SUFFIX" = "xjava"; then - TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ - $GREP '^[<>]' | \ - $SED -e '/[<>] \* from.*\.idl/d' \ - -e '/[<>] \*.*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ - -e '/[<>] \*.*[0-9]\{4\} [0-9][0-9]*:[0-9]\{2\}:[0-9]\{2\}.*/d' \ - -e '/\/\/ Generated from input file.*/d' \ - -e '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' \ - -e '/\/\/ java GenerateCharacter.*/d') - fi - # Ignore date strings in class files. - # On Macosx the system sources for generated java classes produce different output on - # consequtive invokations seemingly randomly. - # For example a method parameter randomly named "thePoint" or "aPoint". Ignore this. - if test "x$SUFFIX" = "xclass"; then - $JAVAP -c -constants -l -p ${OTHER_FILE} > ${OTHER_FILE}.javap - $JAVAP -c -constants -l -p ${THIS_FILE} > ${THIS_FILE}.javap - TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \ - $GREP '^[<>]' | \ - $SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ - -e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \ - -e '/[<>].*public com\.apple\.jobjc\.Pointer].*public void setItemsPtr(com\.apple\.jobjc\.Pointer $OTHER_FILE.cleaned - TMP=$(LANG=C $DIFF $OTHER_FILE.cleaned $THIS_FILE) - fi - if test -n "$TMP"; then - echo Files $OTHER_FILE and $THIS_FILE differ - return 1 - fi - - return 0 -} - -########################################################################################## -# Compare directory structure - -compare_dirs() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - mkdir -p $WORK_DIR - - (cd $OTHER_DIR && $FIND . -type d | $SORT > $WORK_DIR/other_dirs) - (cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/this_dirs) - - echo -n Directory structure... - if $DIFF $WORK_DIR/other_dirs $WORK_DIR/this_dirs > /dev/null; then - echo Identical! - else - echo Differences found. - REGRESSIONS=true - # Differences in directories found. - ONLY_OTHER=$($DIFF $WORK_DIR/other_dirs $WORK_DIR/this_dirs | $GREP '<') - if [ "$ONLY_OTHER" ]; then - echo Only in $OTHER - echo $ONLY_OTHER | $SED 's|< ./|\t|g' | $SED 's/ /\n/g' - fi - # Differences in directories found. - ONLY_THIS=$($DIFF $WORK_DIR/other_dirs $WORK_DIR/this_dirs | $GREP '>') - if [ "$ONLY_THIS" ]; then - echo Only in $THIS - echo $ONLY_THIS | $SED 's|> ./|\t|g' | $SED 's/ /\n/g' - fi - fi -} - - -########################################################################################## -# Compare file structure - -compare_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - mkdir -p $WORK_DIR - - (cd $OTHER_DIR && $FIND . -type f | $SORT > $WORK_DIR/other_files) - (cd $THIS_DIR && $FIND . -type f | $SORT > $WORK_DIR/this_files) - - echo -n File names... - if diff $WORK_DIR/other_files $WORK_DIR/this_files > /dev/null; then - echo Identical! - else - echo Differences found. - REGRESSIONS=true - # Differences in directories found. - ONLY_OTHER=$(diff $WORK_DIR/other_files $WORK_DIR/this_files | $GREP '<') - if [ "$ONLY_OTHER" ]; then - echo Only in $OTHER - echo "$ONLY_OTHER" | sed 's|< ./| |g' - fi - # Differences in directories found. - ONLY_THIS=$(diff $WORK_DIR/other_files $WORK_DIR/this_files | $GREP '>') - if [ "$ONLY_THIS" ]; then - echo Only in $THIS - echo "$ONLY_THIS" | sed 's|> ./| |g' - fi - fi -} - - -########################################################################################## -# Compare permissions - -compare_permissions() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - mkdir -p $WORK_DIR - - echo -n Permissions... - found="" - for f in `cd $OTHER_DIR && $FIND . -type f` - do - if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi - if [ ! -f ${THIS_DIR}/$f ]; then continue; fi - OP=`ls -l ${OTHER_DIR}/$f | awk '{printf("%.10s\n", $1);}'` - TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'` - if [ "$OP" != "$TP" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - $PRINTF "\told: ${OP} new: ${TP}\t$f\n" - fi - done - if [ -z "$found" ]; then - echo "Identical!" - else - REGRESSIONS=true - fi -} - -########################################################################################## -# Compare file command output - -compare_file_types() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - $MKDIR -p $WORK_DIR - - echo -n File types... - found="" - for f in `cd $OTHER_DIR && $FIND . -type f` - do - if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi - if [ ! -f ${THIS_DIR}/$f ]; then continue; fi - OF=`cd ${OTHER_DIR} && $FILE $f` - TF=`cd ${THIS_DIR} && $FILE $f` - if [ "$f" = "./src.zip" ] || [ "$f" = "./jre/lib/JObjC.jar" ] || [ "$f" = "./lib/JObjC.jar" ] - then - if [ "`echo $OF | $GREP -ic zip`" -gt 0 -a "`echo $TF | $GREP -ic zip`" -gt 0 ] - then - # the way we produces zip-files make it so that directories are stored in old file - # but not in new (only files with full-path) - # this makes file-5.09 report them as different - continue; - fi - fi - - if [ "$OF" != "$TF" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n" - fi - done - if [ -z "$found" ]; then - echo "Identical!" - else - REGRESSIONS=true - fi -} - -########################################################################################## -# Compare the rest of the files - -compare_general_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \ - ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \ - ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \ - ! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \ - ! -name "*.lib" \ - | $GREP -v "./bin/" | $SORT | $FILTER) - - echo General files... - for f in $GENERAL_FILES - do - if [ -e $OTHER_DIR/$f ]; then - DIFF_OUT=$($DIFF $OTHER_DIR/$f $THIS_DIR/$f 2>&1) - if [ -n "$DIFF_OUT" ]; then - echo $f - REGRESSIONS=true - if [ "$SHOW_DIFFS" = "true" ]; then - echo "$DIFF_OUT" - fi - fi - fi - done - - -} - -########################################################################################## -# Compare zip file - -compare_zip_file() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - ZIP_FILE=$4 - - THIS_ZIP=$THIS_DIR/$ZIP_FILE - OTHER_ZIP=$OTHER_DIR/$ZIP_FILE - - THIS_SUFFIX="${THIS_ZIP##*.}" - OTHER_SUFFIX="${OTHER_ZIP##*.}" - if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then - echo The files do not have the same suffix type! - return 2 - fi - - UNARCHIVE="$UNZIP -q" - - TYPE="$THIS_SUFFIX" - - if $CMP $OTHER_ZIP $THIS_ZIP > /dev/null - then - return 0 - fi - # Not quite identical, the might still contain the same data. - # Unpack the jar/zip files in temp dirs - - THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this - OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other - $RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR - $MKDIR -p $THIS_UNZIPDIR - $MKDIR -p $OTHER_UNZIPDIR - (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP) - (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP) - - CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff - LANG=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE - - ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE) - ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE) - - return_value=0 - - if [ -n "$ONLY_OTHER" ]; then - echo " Only OTHER $ZIP_FILE contains:" - echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR| |"g | sed 's|: |/|g' - return_value=1 - fi - - if [ -n "$ONLY_THIS" ]; then - echo " Only THIS $ZIP_FILE contains:" - echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR| |"g | sed 's|: |/|g' - return_value=1 - fi - - DIFFING_FILES=$($GREP differ $CONTENTS_DIFF_FILE | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g") - - $RM -f $WORK_DIR/$ZIP_FILE.diffs - for file in $DIFFING_FILES; do - if [[ "$ACCEPTED_JARZIP_CONTENTS" != *"$file"* ]]; then - diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs - fi - done - - if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then - return_value=1 - echo " Differing files in $ZIP_FILE" - $CAT $WORK_DIR/$ZIP_FILE.diffs | $GREP differ | cut -f 2 -d ' ' | \ - $SED "s|$OTHER_UNZIPDIR| |g" > $WORK_DIR/$ZIP_FILE.difflist - $CAT $WORK_DIR/$ZIP_FILE.difflist - - if [ -n "$SHOW_DIFFS" ]; then - for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do - if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then - LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap - elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then - LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i - else - LANG=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i - fi - done - fi - fi - - return $return_value -} - - -########################################################################################## -# Compare all zip files - -compare_all_zip_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.zip" | $SORT | $FILTER ) - - if [ -n "$ZIPS" ]; then - echo Zip files... - - return_value=0 - for f in $ZIPS; do - if [ -f "$OTHER_DIR/$f" ]; then - compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f - if [ "$?" != "0" ]; then - return_value=1 - REGRESSIONS=true - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Compare all jar files - -compare_all_jar_files() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - # TODO filter? - ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" | $SORT | $FILTER) - - if [ -n "$ZIPS" ]; then - echo Jar files... - - return_value=0 - for f in $ZIPS; do - if [ -f "$OTHER_DIR/$f" ]; then - compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f - if [ "$?" != "0" ]; then - return_value=1 - REGRESSIONS=true - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Compare binary (executable/library) file - -compare_bin_file() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - BIN_FILE=$4 - - THIS_FILE=$THIS_DIR/$BIN_FILE - OTHER_FILE=$OTHER_DIR/$BIN_FILE - NAME=$(basename $BIN_FILE) - WORK_FILE_BASE=$WORK_DIR/$BIN_FILE - FILE_WORK_DIR=$(dirname $WORK_FILE_BASE) - - $MKDIR -p $FILE_WORK_DIR - - ORIG_THIS_FILE="$THIS_FILE" - ORIG_OTHER_FILE="$OTHER_FILE" - - if [[ "$STRIP_BEFORE_COMPARE" = *"$BIN_FILE"* ]]; then - THIS_STRIPPED_FILE=$FILE_WORK_DIR/this/$NAME - OTHER_STRIPPED_FILE=$FILE_WORK_DIR/other/$NAME - $MKDIR -p $FILE_WORK_DIR/this $FILE_WORK_DIR/other - $CP $THIS_FILE $THIS_STRIPPED_FILE - $CP $OTHER_FILE $OTHER_STRIPPED_FILE - $STRIP $THIS_STRIPPED_FILE - $STRIP $OTHER_STRIPPED_FILE - THIS_FILE="$THIS_STRIPPED_FILE" - OTHER_FILE="$OTHER_STRIPPED_FILE" - fi - - if [ -z "$SKIP_BIN_DIFF" ]; then - if cmp $OTHER_FILE $THIS_FILE > /dev/null; then - # The files were bytewise identical. - if [ -n "$VERBOSE" ]; then - echo " : : : : : $BIN_FILE" - fi - return 0 - fi - BIN_MSG=" diff " - if [[ "$ACCEPTED_BIN_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_BIN=true - if [[ "$KNOWN_BIN_DIFF" != *"$BIN_FILE"* ]]; then - BIN_MSG="*$BIN_MSG*" - REGRESSIONS=true - else - BIN_MSG=" $BIN_MSG " - fi - else - BIN_MSG="($BIN_MSG)" - DIFF_BIN= - fi - fi - - THIS_SIZE=$(ls -l "$THIS_FILE" | awk '{ print $5 }') - OTHER_SIZE=$(ls -l "$OTHER_FILE" | awk '{ print $5 }') - if [ $THIS_SIZE -ne $OTHER_SIZE ]; then - DIFF_SIZE_NUM=$($EXPR $THIS_SIZE - $OTHER_SIZE) - DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE) - SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM) - if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_REL" -gt 98 ] && [ "$DIFF_SIZE_REL" -lt 102 ]; then - SIZE_MSG="($SIZE_MSG)" - DIFF_SIZE= - else - if [[ "$ACCEPTED_SIZE_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_SIZE=true - if [[ "$KNOWN_SIZE_DIFF" != *"$BIN_FILE"* ]]; then - SIZE_MSG="*$SIZE_MSG*" - REGRESSIONS=true - else - SIZE_MSG=" $SIZE_MSG " - fi - else - SIZE_MSG="($SIZE_MSG)" - DIFF_SIZE= - fi - fi - else - SIZE_MSG=" " - DIFF_SIZE= - if [[ "$KNOWN_SIZE_DIFF $ACCEPTED_SIZE_DIFF" = *"$BIN_FILE"* ]]; then - SIZE_MSG=" ! " - fi - fi - - if [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then - SYM_SORT_CMD="sort" - else - SYM_SORT_CMD="cat" - fi - - # Check symbols - if [ "$OPENJDK_TARGET_OS" = "windows" ]; then - $DUMPBIN -exports $OTHER_FILE | $GREP " = " | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other - $DUMPBIN -exports $THIS_FILE | $GREP " = " | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this - elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then - # Some symbols get seemingly random 15 character prefixes. Filter them out. - $NM -a $ORIG_OTHER_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] \.\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other - $NM -a $ORIG_THIS_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] \.\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this - else - $NM -a $ORIG_OTHER_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other - $NM -a $ORIG_THIS_FILE | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this - fi - - LANG=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff - if [ -s $WORK_FILE_BASE.symbols.diff ]; then - SYM_MSG=" diff " - if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_SYM=true - if [[ "$KNOWN_SYM_DIFF" != *"$BIN_FILE"* ]]; then - SYM_MSG="*$SYM_MSG*" - REGRESSIONS=true - else - SYM_MSG=" $SYM_MSG " - fi - else - SYM_MSG="($SYM_MSG)" - DIFF_SYM= - fi - else - SYM_MSG=" " - DIFF_SYM= - if [[ "$KNOWN_SYM_DIFF $ACCEPTED_SYM_DIFF" = *"$BIN_FILE"* ]]; then - SYM_MSG=" ! " - fi - fi - - # Check dependencies - if [ -n "$LDD_CMD" ];then - (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.other | $UNIQ > $WORK_FILE_BASE.deps.other.uniq) - (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.this | $UNIQ > $WORK_FILE_BASE.deps.this.uniq) - (cd $FILE_WORK_DIR && $RM -f $NAME) - - LANG=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff - LANG=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq - - if [ -s $WORK_FILE_BASE.deps.diff ]; then - if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then - DEP_MSG=" diff " - else - DEP_MSG=" redun " - fi - if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_DEP=true - if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then - DEP_MSG="*$DEP_MSG*" - REGRESSIONS=true - else - DEP_MSG=" $DEP_MSG " - fi - else - DEP_MSG="($DEP_MSG)" - DIFF_DEP= - fi - else - DEP_MSG=" " - DIFF_DEP= - if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then - DEP_MSG=" ! " - fi - fi - fi - - # Compare readelf output - if [ -n "$READELF_CMD" ] && [ -z "$SKIP_ELF_DIFF" ]; then - $READELF_CMD $OTHER_FILE > $WORK_FILE_BASE.readelf.other 2>&1 - $READELF_CMD $THIS_FILE > $WORK_FILE_BASE.readelf.this 2>&1 - - LANG=C $DIFF $WORK_FILE_BASE.readelf.other $WORK_FILE_BASE.readelf.this > $WORK_FILE_BASE.readelf.diff - - if [ -s $WORK_FILE_BASE.readelf.diff ]; then - ELF_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.readelf.diff | awk '{print $5}') - ELF_MSG=$($PRINTF "%8d" $ELF_DIFF_SIZE) - if [[ "$ACCEPTED_ELF_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_ELF=true - if [[ "$KNOWN_ELF_DIFF" != *"$BIN_FILE"* ]]; then - ELF_MSG="*$ELF_MSG*" - REGRESSIONS=true - else - ELF_MSG=" $ELF_MSG " - fi - else - ELF_MSG="($ELF_MSG)" - DIFF_ELF= - fi - else - ELF_MSG=" " - DIFF_ELF= - if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then - ELF_MSG=" ! " - fi - fi - fi - - # Compare disassemble output - if [ -f "$OBJDUMP" ] && [ -z "$SKIP_DIS_DIFF" ]; then - $OBJDUMP -d $OTHER_FILE | $GREP -v $NAME > $WORK_FILE_BASE.dis.other 2>&1 - $OBJDUMP -d $THIS_FILE | $GREP -v $NAME > $WORK_FILE_BASE.dis.this 2>&1 - - LANG=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff - - if [ -s $WORK_FILE_BASE.dis.diff ]; then - DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}') - DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE) - if [[ "$ACCEPTED_DIS_DIFF" != *"$BIN_FILE"* ]]; then - DIFF_DIS=true - if [[ "$KNOWN_DIS_DIFF" != *"$BIN_FILE"* ]]; then - DIS_MSG="*$DIS_MSG*" - REGRESSIONS=true - else - DIS_MSG=" $DIS_MSG " - fi - else - DIS_MSG="($DIS_MSG)" - DIFF_DIS= - fi - else - DIS_MSG=" " - DIFF_DIS= - if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then - DIS_MSG=" ! " - fi - fi - fi - - - if [ -n "$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_ELF$DIFF_DIS" ] || [ -n "$VERBOSE" ]; then - if [ -n "$BIN_MSG" ]; then echo -n "$BIN_MSG:"; fi - if [ -n "$SIZE_MSG" ]; then echo -n "$SIZE_MSG:"; fi - if [ -n "$SYM_MSG" ]; then echo -n "$SYM_MSG:"; fi - if [ -n "$DEP_MSG" ]; then echo -n "$DEP_MSG:"; fi - if [ -n "$ELF_MSG" ]; then echo -n "$ELF_MSG:"; fi - if [ -n "$DIS_MSG" ]; then echo -n "$DIS_MSG:"; fi - echo " $BIN_FILE" - if [ "$SHOW_DIFFS" = "true" ]; then - if [ -s "$WORK_FILE_BASE.symbols.diff" ]; then - echo "Symbols diff:" - $CAT $WORK_FILE_BASE.symbols.diff - fi - if [ -s "$WORK_FILE_BASE.deps.diff" ]; then - echo "Deps diff:" - $CAT $WORK_FILE_BASE.deps.diff - fi - if [ -s "$WORK_FILE_BASE.readelf.diff" ]; then - echo "Readelf diff:" - $CAT $WORK_FILE_BASE.readelf.diff - fi - if [ -s "$WORK_FILE_BASE.dis.diff" ]; then - echo "Disassembly diff:" - $CAT $WORK_FILE_BASE.dis.diff - fi - fi - return 1 - fi - return 0 -} - -########################################################################################## -# Print binary diff header - -print_binary_diff_header() { - if [ -z "$SKIP_BIN_DIFF" ]; then echo -n " Binary :"; fi - if [ -z "$SKIP_SIZE_DIFF" ]; then echo -n " Size :"; fi - if [ -z "$SKIP_SYM_DIFF" ]; then echo -n " Symbols :"; fi - if [ -z "$SKIP_DEP_DIFF" ]; then echo -n " Deps :"; fi - if [ -z "$SKIP_ELF_DIFF" ]; then echo -n " Readelf :"; fi - if [ -z "$SKIP_DIS_DIFF" ]; then echo -n " Disass :"; fi - echo -} - -########################################################################################## -# Compare all libraries - -compare_all_libs() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - LIBS=$(cd $THIS_DIR && $FIND . -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' | $SORT | $FILTER) - - if [ -n "$LIBS" ]; then - echo Libraries... - print_binary_diff_header - for l in $LIBS; do - if [ -f "$OTHER_DIR/$l" ]; then - compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $l - if [ "$?" != "0" ]; then - return_value=1 - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Compare all executables - -compare_all_execs() { - THIS_DIR=$1 - OTHER_DIR=$2 - WORK_DIR=$3 - - if [ "$OPENJDK_TARGET_OS" = "windows" ]; then - EXECS=$(cd $THIS_DIR && $FIND . -type f -name '*.exe' | $SORT | $FILTER) - else - EXECS=$(cd $THIS_DIR && $FIND . -name db -prune -o -type f -perm -100 \! \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' -o -name '*.cgi' \) | $SORT | $FILTER) - fi - - if [ -n "$EXECS" ]; then - echo Executables... - print_binary_diff_header - for e in $EXECS; do - if [ -f "$OTHER_DIR/$e" ]; then - compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $e - if [ "$?" != "0" ]; then - return_value=1 - fi - fi - done - fi - - return $return_value -} - -########################################################################################## -# Initiate configuration - -COMPARE_ROOT=/tmp/cimages.$USER -$MKDIR -p $COMPARE_ROOT if [ "$OPENJDK_TARGET_OS" = "windows" ]; then - if [ "$(uname -o)" = "Cygwin" ]; then - COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT) - fi + PATH="@VS_PATH@" fi -THIS="$( cd "$( dirname "$0" )" && pwd )" -echo "$THIS" -THIS_SCRIPT="$0" - -if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1" = "/?" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then - echo "bash ./compare.sh [OPTIONS] [FILTER]" - echo "" - echo "-all Compare all files in all known ways" - echo "-names Compare the file names and directory structure" - echo "-perms Compare the permission bits on all files and directories" - echo "-types Compare the output of the file command on all files" - echo "-general Compare the files not convered by the specialized comparisons" - echo "-zips Compare the contents of all zip files" - echo "-jars Compare the contents of all jar files" - echo "-libs Compare all native libraries" - echo "-execs Compare all executables" - echo "-v Verbose output, does not hide known differences" - echo "-vv More verbose output, shows diff output of all comparisons" - echo "-o [OTHER] Compare with build in other directory. Will default to the old build directory" - echo "" - echo "[FILTER] List filenames in the image to compare, works for jars, zips, libs and execs" - echo "Example:" - echo "bash ./common/bin/compareimages.sh CodePointIM.jar" - exit 10 -fi - -CMP_NAMES=false -CMP_PERMS=false -CMP_TYPES=false -CMP_GENERAL=false -CMP_ZIPS=false -CMP_JARS=false -CMP_LIBS=false -CMP_EXECS=false - -while [ -n "$1" ]; do - case "$1" in - -v) - VERBOSE=true - ;; - -vv) - VERBOSE=true - SHOW_DIFFS=true - ;; - -o) - OTHER=$2 - shift - ;; - -all) - CMP_NAMES=true - if [ "$OPENJDK_TARGET_OS" != "windows" ]; then - CMP_PERMS=true - fi - CMP_TYPES=true - CMP_GENERAL=true - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - ;; - -names) - CMP_NAMES=true - ;; - -perms) - CMP_PERMS=true - ;; - -types) - CMP_TYPES=true - ;; - -general) - CMP_GENERAL=true - ;; - -zips) - CMP_ZIPS=true - ;; - -jars) - CMP_JARS=true - ;; - -libs) - CMP_LIBS=true - ;; - -execs) - CMP_EXECS=true - ;; - *) - CMP_NAMES=false - CMP_PERMS=false - CMP_TYPES=false - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - - if [ -z "$FILTER" ]; then - FILTER="$GREP" - fi - FILTER="$FILTER -e $1" - ;; - esac - shift -done - -if [ "$CMP_NAMES" = "false" ] && [ "$CMP_TYPES" = "false" ] && [ "$CMP_PERMS" = "false" ] && [ "$CMP_GENERAL" = "false" ] && [ "$CMP_ZIPS" = "false" ] && [ "$CMP_JARS" = "false" ] && [ "$CMP_LIBS" = "false" ] && [ "$CMP_EXECS" = "false" ]; then - CMP_NAMES=true - CMP_PERMS=true - CMP_TYPES=true - CMP_GENERAL=true - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true -fi - -if [ -z "$FILTER" ]; then - FILTER="$CAT" -fi - -if [ -z "$OTHER" ]; then - OTHER="$THIS/../$LEGACY_BUILD_DIR" - if [ -d "$OTHER" ]; then - OTHER="$( cd "$OTHER" && pwd )" - else - echo "Default old build directory does not exist:" - echo "$OTHER" - fi - echo "Comparing to default old build:" - echo "$OTHER" - echo -else - echo "Comparing to:" - echo "$OTHER" - echo -fi - -if [ ! -d "$OTHER" ]; then - echo "Other build directory does not exist:" - echo "$OTHER" - exit 1; -fi - -# Figure out the layout of the new build. Which kinds of images have been produced -if [ -d "$THIS/images/j2sdk-image" ]; then - THIS_J2SDK="$THIS/images/j2sdk-image" - THIS_J2RE="$THIS/images/j2re-image" -fi -if [ -d "$THIS/images/j2sdk-overlay-image" ]; then - THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image" - THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image" -fi - -# Figure out the layout of the other build (old or new, normal or overlay image) -if [ -d "$OTHER/j2sdk-image" ]; then - if [ -f "$OTHER/j2sdk-image/LICENSE" ]; then - OTHER_J2SDK="$OTHER/j2sdk-image" - OTHER_J2RE="$OTHER/j2re-image" - else - OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image" - OTHER_J2RE_OVERLAY="$OTHER/j2re-image" - fi - -fi - -if [ -z "$OTHER_J2SDK" ] && [ -n "$OTHER_J2SDK_OVERLAY" ] && [ -z "$THIS_J2SDK_OVERLAY" ]; then - echo "OTHER build only has an overlay image while this build does not. Nothing to compare!" +# Now locate the main script and run it. +REAL_COMPARE_SCRIPT="$SRC_ROOT/common/bin/compare.sh" +if [ ! -e "$REAL_COMPARE_SCRIPT" ]; then + echo "Error: Cannot locate compare script, it should have been in $REAL_COMPARE_SCRIPT" exit 1 fi - -########################################################################################## -# Do the work - -if [ "$CMP_NAMES" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_dirs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_dirs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - - echo -n "J2SDK " - compare_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_dirs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_dirs $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - - echo -n "J2SDK Overlay " - compare_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_PERMS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_permissions $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_permissions $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_permissions $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_permissions $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_TYPES" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_file_types $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_file_types $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_file_types $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_file_types $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_GENERAL" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - echo -n "J2SDK " - compare_general_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - echo -n "J2RE " - compare_general_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "J2SDK Overlay " - compare_general_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - echo -n "J2RE Overlay " - compare_general_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay - fi -fi - -if [ "$CMP_ZIPS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_zip_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi -fi - -if [ "$CMP_JARS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_jar_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi -fi - -if [ "$CMP_LIBS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_libs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "Overlay " - compare_all_libs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - fi -fi - -if [ "$CMP_EXECS" = "true" ]; then - if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then - compare_all_execs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk - fi - if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then - echo -n "Overlay " - compare_all_execs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay - fi -fi - -echo - -if [ -n "$REGRESSIONS" ]; then - echo "REGRESSIONS FOUND!" - echo - exit 1 -else - echo "No regressions found" - echo - exit 0 -fi +. "$REAL_COMPARE_SCRIPT" "$@" diff --git a/common/autoconf/configure b/common/autoconf/configure index 5007a617e8c..8e4560df114 100644 --- a/common/autoconf/configure +++ b/common/autoconf/configure @@ -1,4 +1,32 @@ -#!/bin/sh +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +if test "x$BASH_VERSION" = x; then + echo This script needs bash to run. + echo It is recommended to use the configure script in the source tree root instead. + exit 1 +fi CONFIGURE_COMMAND_LINE="$@" conf_script_dir=`dirname $0` @@ -13,58 +41,81 @@ fi ### Test that the generated configure is up-to-date ### -# On Solaris /bin/sh doesn't support test -nt but /usr/bin/test does. -TEST=`which test` - -print_error_not_up_to_date() { - echo "Error: The configure source files is newer than the generated files." - echo "Please run 'sh autogen.sh' to update the generated files." - echo "Note that this test might trigger incorrectly sometimes due to hg timestamps". +run_autogen_or_fail() { + if test "x`which autoconf 2> /dev/null`" = x; then + echo "Cannot locate autoconf, unable to correct situation." + echo "Please install autoconf and run 'bash autogen.sh' to update the generated files." + echo "Error: Cannot continue" 1>&2 + exit 1 + else + echo "Running autogen.sh to correct the situation" + bash $conf_script_dir/autogen.sh + fi } -# NOTE: This test can occasionally go wrong due to the way mercurial handles -# timestamps. It it supposed to aid during development of build-infra, but should -# go away before making this the default build system. -for file in configure.ac *.m4 ; do - if $TEST $file -nt generated-configure.sh; then - print_error_not_up_to_date - exit 1 - fi -done - -if $TEST -e $conf_custom_script_dir/generated-configure.sh; then - # If custom source configure is available, make sure it is up-to-date as well. - for file in configure.ac *.m4 $conf_custom_script_dir/*.m4; do - if $TEST $file -nt $conf_custom_script_dir/generated-configure.sh; then - print_error_not_up_to_date - exit 1 +check_autoconf_timestamps() { + for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 ; do + if test $file -nt $conf_script_dir/generated-configure.sh; then + echo "Warning: The configure source files is newer than the generated files." + run_autogen_or_fail fi done + if test -e $conf_custom_script_dir/generated-configure.sh; then + # If custom source configure is available, make sure it is up-to-date as well. + for file in $conf_script_dir/configure.ac $conf_script_dir/*.m4 $conf_custom_script_dir/*.m4; do + if test $file -nt $conf_custom_script_dir/generated-configure.sh; then + echo "Warning: The configure source files is newer than the custom generated files." + run_autogen_or_fail + fi + done + fi +} + +check_hg_updates() { + if test "x`which hg 2> /dev/null`" != x; then + conf_updated_autoconf_files=`cd $conf_script_dir && hg status -mard 2> /dev/null | grep autoconf` + if test "x$conf_updated_autoconf_files" != x; then + echo "Configure source code has been updated, checking time stamps" + check_autoconf_timestamps + fi + + if test -e $conf_custom_script_dir; then + # If custom source configure is available, make sure it is up-to-date as well. + conf_custom_updated_autoconf_files=`cd $conf_custom_script_dir && hg status -mard 2> /dev/null | grep autoconf` + if test "x$conf_custom_updated_autoconf_files" != x; then + echo "Configure custom source code has been updated, checking time stamps" + check_autoconf_timestamps + fi + fi + + fi +} + +# Check for local changes +check_hg_updates + +if test -e $conf_custom_script_dir/generated-configure.sh; then # Test if open configure is newer than custom configure, if so, custom needs to # be regenerated. This test is required to ensure consistency with custom source. - conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED: $conf_script_dir/generated-configure.sh | cut -d" " -f 3` - conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED: $conf_custom_script_dir/generated-configure.sh | cut -d" " -f 3` - if $TEST $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then - echo "Error: The generated configure file contains changes not present in the custom generated file." - echo "Please run 'sh autogen.sh' to update the generated files." - exit 1 + conf_open_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_script_dir/generated-configure.sh | cut -d"=" -f 2` + conf_custom_configure_timestamp=`grep DATE_WHEN_GENERATED= $conf_custom_script_dir/generated-configure.sh | cut -d"=" -f 2` + if test $conf_open_configure_timestamp -gt $conf_custom_configure_timestamp; then + echo "Warning: The generated configure file contains changes not present in the custom generated file." + run_autogen_or_fail fi - fi # Autoconf calls the configure script recursively sometimes. # Don't start logging twice in that case -if $TEST "x$conf_debug_configure" = xtrue; then +if test "x$conf_debug_configure" = xtrue; then conf_debug_configure=recursive fi ### ### Process command-line arguments ### -conf_processed_arguments= +conf_processed_arguments=() conf_openjdk_target= -conf_extra_cflags= -conf_extra_cxxflags= for conf_option do @@ -72,20 +123,14 @@ do --openjdk-target=*) conf_openjdk_target=`expr "X$conf_option" : '[^=]*=\(.*\)'` continue ;; - --with-extra-cflags=*) - conf_extra_cflags=`expr "X$conf_option" : '[^=]*=\(.*\)'` - continue ;; - --with-extra-cxxflags=*) - conf_extra_cxxflags=`expr "X$conf_option" : '[^=]*=\(.*\)'` - continue ;; --debug-configure) - if $TEST "x$conf_debug_configure" != xrecursive; then + if test "x$conf_debug_configure" != xrecursive; then conf_debug_configure=true export conf_debug_configure fi continue ;; *) - conf_processed_arguments="$conf_processed_arguments $conf_option" ;; + conf_processed_arguments=("${conf_processed_arguments[@]}" "$conf_option") ;; esac case $conf_option in @@ -95,11 +140,13 @@ do conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; -host | --host | --hos | --ho | -host=* | --host=* | --hos=* | --ho=*) conf_legacy_crosscompile="$conf_legacy_crosscompile $conf_option" ;; + -help | --help | --hel | --he | -h) + conf_print_help=true ;; esac done -if $TEST "x$conf_legacy_crosscompile" != "x"; then - if $TEST "x$conf_openjdk_target" != "x"; then +if test "x$conf_legacy_crosscompile" != "x"; then + if test "x$conf_openjdk_target" != "x"; then echo "Error: Specifying --openjdk-target together with autoconf" echo "legacy cross-compilation flags is not supported." echo "You specified: --openjdk-target=$conf_openjdk_target and $conf_legacy_crosscompile." @@ -112,20 +159,20 @@ if $TEST "x$conf_legacy_crosscompile" != "x"; then fi fi -if $TEST "x$conf_openjdk_target" != "x"; then +if test "x$conf_openjdk_target" != "x"; then conf_build_platform=`sh $conf_script_dir/build-aux/config.guess` - conf_processed_arguments="--build=$conf_build_platform --host=$conf_openjdk_target --target=$conf_openjdk_target $conf_processed_arguments" + conf_processed_arguments=("--build=$conf_build_platform" "--host=$conf_openjdk_target" "--target=$conf_openjdk_target" "${conf_processed_arguments[@]}") fi # Make configure exit with error on invalid options as default. # Can be overridden by --disable-option-checking, since we prepend our argument # and later options override earlier. -conf_processed_arguments="--enable-option-checking=fatal $conf_processed_arguments" +conf_processed_arguments=("--enable-option-checking=fatal" "${conf_processed_arguments[@]}") ### ### Call the configure script ### -if $TEST -e $conf_custom_script_dir/generated-configure.sh; then +if test -e $conf_custom_script_dir/generated-configure.sh; then # Custom source configure available; run that instead echo Running custom generated-configure.sh conf_script_to_run=$conf_custom_script_dir/generated-configure.sh @@ -134,17 +181,17 @@ else conf_script_to_run=$conf_script_dir/generated-configure.sh fi -if $TEST "x$conf_debug_configure" != x; then +if test "x$conf_debug_configure" != x; then # Turn on shell debug output if requested (initial or recursive) set -x fi -if $TEST "x$conf_debug_configure" = xtrue; then +if test "x$conf_debug_configure" = xtrue; then # Turn on logging, but don't turn on twice when called recursive conf_debug_logfile=./debug-configure.log - (exec 3>&1 ; (. $conf_script_to_run $conf_processed_arguments --with-extra-cflags="$conf_extra_cflags" --with-extra-cxxflags="$conf_extra_cxxflags" 2>&1 1>&3 ) | tee -a $conf_debug_logfile 1>&2 ; exec 3>&-) | tee -a $conf_debug_logfile + (exec 3>&1 ; (. $conf_script_to_run "${conf_processed_arguments[@]}" 2>&1 1>&3 ) | tee -a $conf_debug_logfile 1>&2 ; exec 3>&-) | tee -a $conf_debug_logfile else - . $conf_script_to_run $conf_processed_arguments --with-extra-cflags="$conf_extra_cflags" --with-extra-cxxflags="$conf_extra_cxxflags" + ( . $conf_script_to_run "${conf_processed_arguments[@]}" ) fi conf_result_code=$? @@ -152,8 +199,28 @@ conf_result_code=$? ### Post-processing ### +if test $conf_result_code -eq 0; then + if test "x$conf_print_help" = xtrue; then + cat < + --debug-configure Run the configure script with additional debug + logging enabled. + +Please be aware that, when cross-compiling, the OpenJDK configure script will +generally use 'target' where autoconf traditionally uses 'host'. +EOT + fi +else + echo configure exiting with result code $conf_result_code +fi + # Move the log file to the output root, if this was successfully created -if $TEST -d "$OUTPUT_ROOT"; then +if test -d "$OUTPUT_ROOT"; then mv -f config.log "$OUTPUT_ROOT" 2> /dev/null fi diff --git a/common/autoconf/configure.ac b/common/autoconf/configure.ac index d9b1f6b8757..0dc235535ea 100644 --- a/common/autoconf/configure.ac +++ b/common/autoconf/configure.ac @@ -31,16 +31,14 @@ AC_PREREQ([2.61]) -AC_INIT(openjdk, jdk8, build-dev@openjdk.java.net) - -# Do not change or remove the following line, it is needed for consistency checks: -# DATE_WHEN_GENERATED: @DATE_WHEN_GENERATED@ +AC_INIT(OpenJDK, jdk8, build-dev@openjdk.java.net,,http://openjdk.java.net) AC_CONFIG_AUX_DIR([build-aux]) m4_include([build-aux/pkg.m4]) # Include these first... m4_include([basics.m4]) +m4_include([basics_windows.m4]) m4_include([builddeps.m4]) # ... then the rest m4_include([boot-jdk.m4]) @@ -51,35 +49,57 @@ m4_include([libraries.m4]) m4_include([platform.m4]) m4_include([source-dirs.m4]) m4_include([toolchain.m4]) +m4_include([toolchain_windows.m4]) -# This line needs to be here, verbatim, after all includes. -# It is replaced with custom functionality when building +AC_DEFUN_ONCE([CUSTOM_EARLY_HOOK]) +AC_DEFUN_ONCE([CUSTOM_LATE_HOOK]) + +# This line needs to be here, verbatim, after all includes and the dummy hook +# definitions. It is replaced with custom functionality when building # custom sources. -AC_DEFUN_ONCE([CUSTOM_HOOK]) +#CUSTOM_AUTOCONF_INCLUDE + +# Do not change or remove the following line, it is needed for consistency checks: +DATE_WHEN_GENERATED=@DATE_WHEN_GENERATED@ ############################################################################### # -# Initialization +# Initialization / Boot-strapping +# +# The bootstrapping process needs to solve the "chicken or the egg" problem, +# thus it jumps back and forth, each time gaining something needed later on. # ############################################################################### # Basic initialization that must happen first of all BASIC_INIT +BASIC_SETUP_FUNDAMENTAL_TOOLS # Now we can determine OpenJDK build and target platforms. This is required to # have early on. PLATFORM_SETUP_OPENJDK_BUILD_AND_TARGET -# Continue setting up basic stuff. +# Continue setting up basic stuff. Most remaining code require fundamental tools. BASIC_SETUP_PATHS BASIC_SETUP_LOGGING +# These are needed to be able to create a configuration name (and thus the output directory) +JDKOPT_SETUP_JDK_VARIANT +JDKOPT_SETUP_JVM_VARIANTS +JDKOPT_SETUP_DEBUG_LEVEL + +# With basic setup done, call the custom early hook. +CUSTOM_EARLY_HOOK + +# To properly create a configuration name, we need to have the OpenJDK target +# and options (variants and debug level) parsed. +BASIC_SETUP_OUTPUT_DIR + # Must be done before we can call HELP_MSG_MISSING_DEPENDENCY. HELP_SETUP_DEPENDENCY_HELP -# Setup simple tools, that do not need have cross compilation support. -# Without these, we can't properly run the rest of the configure script. -BASIC_SETUP_TOOLS +# Setup tools that requires more complex handling, or that is not needed by the configure script. +BASIC_SETUP_COMPLEX_TOOLS # Check if pkg-config is available. PKG_PROG_PKG_CONFIG @@ -100,16 +120,9 @@ BDEPS_SCAN_FOR_BUILDDEPS ############################################################################### # We need build & target for this. -JDKOPT_SETUP_JDK_VARIANT -JDKOPT_SETUP_JVM_VARIANTS -JDKOPT_SETUP_DEBUG_LEVEL JDKOPT_SETUP_JDK_OPTIONS JDKOPT_SETUP_JDK_VERSION_NUMBERS -# To properly create a configuration name, we need to have the OpenJDK target -# and options (variants and debug level) parsed. -BASIC_SETUP_OUTPUT_DIR - ############################################################################### # # Setup BootJDK, used to bootstrap the build. @@ -137,7 +150,6 @@ SRCDIRS_SETUP_OUTPUT_DIRS ############################################################################### TOOLCHAIN_SETUP_SYSROOT_AND_OUT_OPTIONS -TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV # Locate the actual tools TOOLCHAIN_SETUP_PATHS @@ -152,10 +164,6 @@ TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_LIBS TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_OPTIMIZATION TOOLCHAIN_SETUP_COMPILER_FLAGS_FOR_JDK -# After we have toolchain, we can compile the uncygdrive helper -BASIC_COMPILE_UNCYGDRIVE - - # Setup debug symbols (need objcopy from the toolchain for that) JDKOPT_SETUP_DEBUG_SYMBOLS @@ -173,6 +181,9 @@ LIB_SETUP_ALSA LIB_SETUP_MISC_LIBS LIB_SETUP_STATIC_LINK_LIBSTDCPP +# After we have toolchain and the paths to all libraries (needed by msys), we can compile the fixpath helper +BASIC_COMPILE_FIXPATH + ############################################################################### # # We need to do some final tweaking, when everything else is done. @@ -210,7 +221,7 @@ BPERF_SETUP_CCACHE BASIC_TEST_USABILITY_ISSUES # At the end, call the custom hook. (Dummy macro if no custom sources available) -CUSTOM_HOOK +CUSTOM_LATE_HOOK # We're messing a bit with internal autoconf variables to put the config.status # in the output directory instead of the current directory. diff --git a/common/autoconf/generated-configure.sh b/common/autoconf/generated-configure.sh index 9dc456112b3..160265d6e5a 100644 --- a/common/autoconf/generated-configure.sh +++ b/common/autoconf/generated-configure.sh @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.67 for openjdk jdk8. +# Generated by GNU Autoconf 2.67 for OpenJDK jdk8. # # Report bugs to . # @@ -550,12 +550,12 @@ MFLAGS= MAKEFLAGS= # Identity of this package. -PACKAGE_NAME='openjdk' +PACKAGE_NAME='OpenJDK' PACKAGE_TARNAME='openjdk' PACKAGE_VERSION='jdk8' -PACKAGE_STRING='openjdk jdk8' +PACKAGE_STRING='OpenJDK jdk8' PACKAGE_BUGREPORT='build-dev@openjdk.java.net' -PACKAGE_URL='' +PACKAGE_URL='http://openjdk.java.net' # Factoring default headers for most tests. ac_includes_default="\ @@ -606,7 +606,9 @@ CONCURRENT_BUILD_JOBS NUM_CORES SALIB_NAME HOTSPOT_MAKE_ARGS +FIXPATH LIBCXX +STATIC_CXX_SETTING LIBDL LIBM LIBZIP_CAN_USE_MMAP @@ -619,7 +621,6 @@ FREETYPE2_LIB_PATH USING_SYSTEM_FT_LIB FREETYPE2_LIBS FREETYPE2_CFLAGS -CUPS_LIBS CUPS_CFLAGS OPENWIN_HOME X_EXTRA_LIBS @@ -631,7 +632,6 @@ CXXFLAGS_DEBUG_SYMBOLS CFLAGS_DEBUG_SYMBOLS ZIP_DEBUGINFO_FILES ENABLE_DEBUG_SYMBOLS -UNCYGDRIVE LDFLAGS_CXX_JDK LDFLAGS_JDKEXE_SUFFIX LDFLAGS_JDKLIB_SUFFIX @@ -672,6 +672,9 @@ STATIC_LIBRARY SHARED_LIBRARY OBJ_SUFFIX LIPO +ac_ct_OBJDUMP +OBJDUMP +ac_ct_OBJCOPY OBJCOPY MCS STRIP @@ -683,9 +686,13 @@ COMPILER_TYPE RC_FLAGS DUMPBIN WINAR +HOTSPOT_RC +HOTSPOT_MT RC MT WINLD +HOTSPOT_LD +HOTSPOT_CXX ARFLAGS AR LDEXECXX @@ -698,6 +705,9 @@ OBJC ac_ct_CXX CXXFLAGS CXX +ac_ct_PROPER_COMPILER_CXX +PROPER_COMPILER_CXX +POTENTIAL_CXX OBJEXT EXEEXT ac_ct_CC @@ -705,12 +715,16 @@ CPPFLAGS LDFLAGS CFLAGS CC +ac_ct_PROPER_COMPILER_CC +PROPER_COMPILER_CC +POTENTIAL_CC BUILD_LD BUILD_CXX BUILD_CC -MSVCR100DLL -CHECK_FOR_VCINSTALLDIR -SETUPDEVENV +MSVCR_DLL +VS_PATH +VS_LIB +VS_INCLUDE CYGWIN_LINK AR_OUT_OPTION LD_OUT_OPTION @@ -733,15 +747,14 @@ BOOT_TOOLSJAR BOOT_RTJAR JAVA_CHECK JAVAC_CHECK -OUTPUT_ROOT -CONF_NAME -SPEC COOKED_BUILD_NUMBER FULL_VERSION RELEASE JDK_VERSION RUNTIME_NAME COPYRIGHT_YEAR +MACOSX_BUNDLE_ID_BASE +MACOSX_BUNDLE_NAME_BASE COMPANY_NAME JDK_RC_PLATFORM_NAME PRODUCT_SUFFIX @@ -753,16 +766,39 @@ JDK_UPDATE_VERSION JDK_MICRO_VERSION JDK_MINOR_VERSION JDK_MAJOR_VERSION -ENABLE_JFR COMPRESS_JARS +UNLIMITED_CRYPTO CACERTS_FILE TEST_IN_BUILD -DISABLE_NIMBUS BUILD_HEADLESS SUPPORT_HEADFUL SUPPORT_HEADLESS -JIGSAW SET_OPENJDK +BDEPS_FTP +BDEPS_UNZIP +OS_VERSION_MICRO +OS_VERSION_MINOR +OS_VERSION_MAJOR +PKG_CONFIG +COMM +TIME +STAT +HG +READELF +OTOOL +LDD +ZIP +UNZIP +FIND_DELETE +MAKE +CHECK_TOOLSDIR_MAKE +CHECK_TOOLSDIR_GMAKE +CHECK_MAKE +CHECK_GMAKE +PKGHANDLER +OUTPUT_ROOT +CONF_NAME +SPEC BUILD_VARIANT_RELEASE DEBUG_CLASSFILES FASTDEBUG @@ -776,72 +812,12 @@ JVM_VARIANT_CLIENT JVM_VARIANT_SERVER JVM_VARIANTS JDK_VARIANT -BDEPS_FTP -BDEPS_UNZIP -OS_VERSION_MICRO -OS_VERSION_MINOR -OS_VERSION_MAJOR -PKG_CONFIG -HG -OBJDUMP -READELF -OTOOL -LDD -THEPWDCMD -FIND_DELETE -RM -MAKE -CHECK_TOOLSDIR_MAKE -CHECK_TOOLSDIR_GMAKE -CHECK_MAKE -CHECK_GMAKE -NAWK -SED -FGREP -EGREP -GREP -AWK -ZIP -XARGS -WC -UNZIP -UNIQ -TR -TOUCH -TEE -TAR -TAIL -SORT -SH -PRINTF -MV -MKDIR -LS -LN -HEAD -FIND -FILE -EXPR -ECHO -DIFF -DF -DATE -CUT -CPIO -CP -CMP -CHMOD -CAT -BASENAME -PKGHANDLER BUILD_LOG_WRAPPER BUILD_LOG_PREVIOUS BUILD_LOG SYS_ROOT PATH_SEP -CYGPATH SRC_ROOT -READLINK DEFINE_CROSS_COMPILE_ARCH LP64 OPENJDK_TARGET_OS_API_DIR @@ -854,18 +830,18 @@ OPENJDK_TARGET_CPU_LEGACY REQUIRED_OS_VERSION REQUIRED_OS_NAME COMPILE_TYPE -OPENJDK_BUILD_CPU_ENDIAN -OPENJDK_BUILD_CPU_BITS -OPENJDK_BUILD_CPU_ARCH -OPENJDK_BUILD_CPU -OPENJDK_BUILD_OS_API -OPENJDK_BUILD_OS OPENJDK_TARGET_CPU_ENDIAN OPENJDK_TARGET_CPU_BITS OPENJDK_TARGET_CPU_ARCH OPENJDK_TARGET_CPU OPENJDK_TARGET_OS_API OPENJDK_TARGET_OS +OPENJDK_BUILD_CPU_ENDIAN +OPENJDK_BUILD_CPU_BITS +OPENJDK_BUILD_CPU_ARCH +OPENJDK_BUILD_CPU +OPENJDK_BUILD_OS_API +OPENJDK_BUILD_OS OPENJDK_BUILD_AUTOCONF_NAME OPENJDK_TARGET_AUTOCONF_NAME target_os @@ -880,6 +856,51 @@ build_os build_vendor build_cpu build +SETFILE +DF +READLINK +CYGPATH +NAWK +SED +FGREP +EGREP +GREP +AWK +XARGS +WHICH +WC +UNIQ +UNAME +TR +TOUCH +TEE +TAR +TAIL +SORT +SH +RM +THEPWDCMD +PRINTF +MV +MKTEMP +MKDIR +LS +LN +HEAD +FIND +FILE +EXPR +ECHO +DIRNAME +DIFF +DATE +CUT +CP +CMP +CHMOD +CAT +BASH +BASENAME DATE_WHEN_CONFIGURED CONFIGURE_COMMAND_LINE CUSTOM_MAKE_DIR @@ -929,23 +950,20 @@ with_target_bits with_sys_root with_tools_dir with_devkit -with_builddeps_conf -with_builddeps_server -with_builddeps_dir -with_builddeps_group -enable_list_builddeps with_jdk_variant with_jvm_variants enable_debug with_debug_level +with_conf_name +with_builddeps_conf +with_builddeps_server +with_builddeps_dir +with_builddeps_group enable_openjdk_only -enable_jigsaw enable_headful -enable_nimbus enable_hotspot_test_in_build with_cacerts_file -enable_jfr -with_conf_name +enable_unlimited_crypto with_boot_jdk with_boot_jdk_jvmargs with_add_source_root @@ -957,7 +975,7 @@ with_override_jaxp with_override_jaxws with_override_hotspot with_override_jdk -with_msvcr100dll +with_msvcr_dll with_extra_cflags with_extra_cxxflags with_extra_ldflags @@ -967,7 +985,6 @@ enable_macosx_runtime_support with_x with_cups with_cups_include -with_cups_lib with_freetype with_alsa with_alsa_include @@ -1546,7 +1563,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures openjdk jdk8 to adapt to many kinds of systems. +\`configure' configures OpenJDK jdk8 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1616,7 +1633,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of openjdk jdk8:";; + short | recursive ) echo "Configuration of OpenJDK jdk8:";; esac cat <<\_ACEOF @@ -1624,24 +1641,19 @@ Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --enable-list-builddeps list all build dependencies known to the configure - script --enable-debug set the debug level to fastdebug (shorthand for --with-debug-level=fastdebug) [disabled] - --enable-openjdk-only build OpenJDK regardless of the presence of closed - repositories [disabled] - --enable-jigsaw build Jigsaw images (not yet available) [disabled] - --disable-headful build headful support (graphical UI support) - [enabled] - --disable-nimbus disable Nimbus L&F [enabled] + --enable-openjdk-only supress building closed source even if present + [disabled] + --disable-headful disable building headful support (graphical UI + support) [enabled] --enable-hotspot-test-in-build - enable running of Queens test after Hotspot build - (not yet available) [disabled] - --enable-jfr enable jfr (default is no) - ENABLE_JFR="${enableval}" - --disable-debug-symbols disable generation of debug symbols ([enabled]) + run the Queens test after Hotspot build [disabled] + --enable-unlimited-crypto + Enable unlimited crypto policy [disabled] + --disable-debug-symbols disable generation of debug symbols [enabled] --disable-zip-debug-info - don't zip debug-info files ([enabled@:@) + disable zipping of debug-info files [enabled] --disable-macosx-runtime-support disable the use of MacOSX Java runtime support framework [enabled] @@ -1651,38 +1663,38 @@ Optional Features: --enable-sjavac use sjavac to do fast incremental compiles [disabled] --disable-precompiled-headers - use precompiled headers when compiling C++ [enabled] - --disable-ccache use ccache to speed up recompilations [enabled] + disable using precompiled headers when compiling C++ + [enabled] + --disable-ccache disable using ccache to speed up recompilations + [enabled] Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --with-custom-make-dir directory containing custom build/make files + --with-custom-make-dir use this directory for custom build/make files --with-target-bits build 32-bit or 64-bit binaries (for platforms that support it), e.g. --with-target-bits=32 [guessed] - --with-sys-root pass this sys-root to the compilers and linker - (useful if the sys-root encoded in the cross - compiler tools is incorrect) - --with-tools-dir search this directory for (cross-compiling) - compilers and tools + --with-sys-root pass this sys-root to the compilers and tools (for + cross-compiling) + --with-tools-dir search this directory for compilers and tools (for + cross-compiling) --with-devkit use this directory as base for tools-dir and sys-root (for cross-compiling) - --with-builddeps-conf use this configuration file for the builddeps - --with-builddeps-server download and use build dependencies from this server - url, e.g. - --with-builddeps-server=ftp://example.com/dir - --with-builddeps-dir store downloaded build dependencies here - [d/localhome/builddeps] - --with-builddeps-group chgrp the downloaded build dependencies to this - group --with-jdk-variant JDK variant to build (normal) [normal] --with-jvm-variants JVM variants (separated by commas) to build (server, client, kernel, zero, zeroshark) [server] --with-debug-level set the debug level (release, fastdebug, slowdebug) [release] + --with-conf-name use this as the name of the configuration [generated + from important configuration options] + --with-builddeps-conf use this configuration file for the builddeps + --with-builddeps-server download and use build dependencies from this server + url + --with-builddeps-dir store downloaded build dependencies here + [/localhome/builddeps] + --with-builddeps-group chgrp the downloaded build dependencies to this + group --with-cacerts-file specify alternative cacerts file - --with-conf-name use this as the name of the configuration, - overriding the generated default --with-boot-jdk path to Boot JDK (used to bootstrap build) [probed] --with-boot-jdk-jvmargs specify JVM arguments to be passed to all invocations of the Boot JDK, overriding the default @@ -1707,16 +1719,15 @@ Optional Packages: --with-override-jaxws use this jaxws dir for the build --with-override-hotspot use this hotspot dir for the build --with-override-jdk use this jdk dir for the build - --with-msvcr100dll copy this msvcr100.dll into the built JDK + --with-msvcr-dll copy this msvcr100.dll into the built JDK (Windows + only) [probed] --with-extra-cflags extra flags to be used when compiling jdk c-files --with-extra-cxxflags extra flags to be used when compiling jdk c++-files --with-extra-ldflags extra flags to be used when linking jdk --with-x use the X Window System --with-cups specify prefix directory for the cups package - (expecting the libraries under PATH/lib and the - headers under PATH/include) + (expecting the headers under PATH/include) --with-cups-include specify directory for the cups include files - --with-cups-lib specify directory for the cups library --with-freetype specify prefix directory for the freetype2 package (expecting the libraries under PATH/lib and the headers under PATH/include) @@ -1733,10 +1744,7 @@ Optional Packages: --with-memory-size=1024 [probed] --with-sjavac-server-java use this java binary for running the sjavac - background server and other long running java tasks - in the build process, e.g. - ---with-sjavac-server-java="/opt/jrockit/bin/java - -server" + background server [Boot JDK java] --with-sjavac-server-cores use at most this number of concurrent threads on the sjavac server [probed] @@ -1769,6 +1777,7 @@ Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to . +OpenJDK home page: . _ACEOF ac_status=$? fi @@ -1831,7 +1840,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -openjdk configure jdk8 +OpenJDK configure jdk8 generated by GNU Autoconf 2.67 Copyright (C) 2010 Free Software Foundation, Inc. @@ -2488,101 +2497,41 @@ $as_echo "$ac_res" >&6; } } # ac_fn_cxx_check_func -# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- -# Tests whether HEADER exists, giving a warning if it cannot be compiled using -# the include files in INCLUDES and setting the cache variable VAR -# accordingly. -ac_fn_c_check_header_mongrel () +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack - if eval "test \"\${$3+set}\"" = set; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval "test \"\${$3+set}\"" = set; then : $as_echo_n "(cached) " >&6 -fi -eval ac_res=\$$3 - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 -$as_echo "$ac_res" >&6; } else - # Is the header compilable? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 -$as_echo_n "checking $2 usability... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext + cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : - ac_header_compiler=yes + eval "$3=yes" else - ac_header_compiler=no + eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 -$as_echo "$ac_header_compiler" >&6; } - -# Is the header present? -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 -$as_echo_n "checking $2 presence... " >&6; } -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -#include <$2> -_ACEOF -if ac_fn_c_try_cpp "$LINENO"; then : - ac_header_preproc=yes -else - ac_header_preproc=no -fi -rm -f conftest.err conftest.i conftest.$ac_ext -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 -$as_echo "$ac_header_preproc" >&6; } - -# So? What about this header? -case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( - yes:no: ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 -$as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} - ;; - no:yes:* ) - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 -$as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 -$as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 -$as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 -$as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 -$as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} -( $as_echo "## ----------------------------------------- ## -## Report this to build-dev@openjdk.java.net ## -## ----------------------------------------- ##" - ) | sed "s/^/$as_me: WARNING: /" >&2 - ;; -esac - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 -$as_echo_n "checking for $2... " >&6; } -if eval "test \"\${$3+set}\"" = set; then : - $as_echo_n "(cached) " >&6 -else - eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } -fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} -} # ac_fn_c_check_header_mongrel +} # ac_fn_c_check_header_compile cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by openjdk $as_me jdk8, which was +It was created by OpenJDK $as_me jdk8, which was generated by GNU Autoconf 2.67. Invocation command line was $ $0 $@ @@ -2931,9 +2880,6 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -# Do not change or remove the following line, it is needed for consistency checks: -# DATE_WHEN_GENERATED: 1347963060 - ac_aux_dir= for ac_dir in build-aux "$srcdir"/build-aux; do if test -f "$ac_dir/install-sh"; then @@ -3053,14 +2999,46 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +# This will make sure the given variable points to a full and proper +# path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# $1: The name of the variable to fix + + +# This will make sure the given variable points to a executable +# with a full and proper path. This means: +# 1) There will be no spaces in the path. On posix platforms, +# spaces in the path will result in an error. On Windows, +# the path will be rewritten using short-style to be space-free. +# 2) The path will be absolute, and it will be in unix-style (on +# cygwin). +# Any arguments given to the executable is preserved. +# If the input variable does not have a directory specification, then +# it need to be in the PATH. +# $1: The name of the variable to fix +# Test that variable $1 denoting a program is not empty. If empty, exit with an error. +# $1: variable to check +# $2: executable name to print in warning (optional) +# Does AC_PATH_PROG followed by BASIC_CHECK_NONEMPTY. +# Arguments as AC_PATH_PROG: +# $1: variable to set +# $2: executable name to look for + + +# Setup the most fundamental tools that relies on not much else to set up, +# but is used by much of the early bootstrap code. # Setup basic configuration paths, and platform-specific stuff related to PATHs. @@ -3083,23 +3061,10 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -# Test that variable $1 denoting a program is not empty. If empty, exit with an error. -# $1: variable to check -# $2: executable name to print in warning (optional) -# Does AC_PATH_PROG followed by CHECK_NONEMPTY. -# Arguments as AC_PATH_PROG: -# $1: variable to set -# $2: executable name to look for - - - - - - - -# Check if build directory is on local disk. +# 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 # Argument 2: what to do if it is on local disk # Argument 3: what to do otherwise (remote disk or failure) @@ -3136,6 +3101,64 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check + + +# Helper function which possibly converts a path using DOS-style short mode. +# If so, the updated path is stored in $new_path. +# $1: The path to check + + +# FIXME: The BASIC_FIXUP_*_CYGWIN/MSYS is most likely too convoluted +# and could probably be heavily simplified. However, all changes in this +# area tend to need lot of testing in different scenarios, and in lack of +# proper unit testing, cleaning this up has not been deemed worth the effort +# at the moment. + + + + + + + + + +# Setup basic configuration paths, and platform-specific stuff related to PATHs. + + + + +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + + + + + @@ -3287,6 +3310,19 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. +cygwin_help() { + case $1 in + unzip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P unzip" ;; + zip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P zip" ;; + make) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P make" ;; + * ) + break ;; + esac +} + apt_help() { case $1 in devkit) @@ -3561,6 +3597,16 @@ fi # questions. # +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) + + + + + +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) +# $3 = list of compiler names to search for @@ -3573,16 +3619,60 @@ fi +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# -# This line needs to be here, verbatim, after all includes. -# It is replaced with custom functionality when building + + + + + +# Check if the VS env variables were setup prior to running configure. +# If not, then find vcvarsall.bat and run it automatically, and integrate +# the set env variables into the spec file. + + + + + + +# This line needs to be here, verbatim, after all includes and the dummy hook +# definitions. It is replaced with custom functionality when building # custom sources. +#CUSTOM_AUTOCONF_INCLUDE +# Do not change or remove the following line, it is needed for consistency checks: +DATE_WHEN_GENERATED=1351854415 ############################################################################### # -# Initialization +# Initialization / Boot-strapping +# +# The bootstrapping process needs to solve the "chicken or the egg" problem, +# thus it jumps back and forth, each time gaining something needed later on. # ############################################################################### @@ -3592,789 +3682,12 @@ fi DATE_WHEN_CONFIGURED=`LANG=C date` +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuration created at $DATE_WHEN_CONFIGURED." >&5 +$as_echo "$as_me: Configuration created at $DATE_WHEN_CONFIGURED." >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: configure script generated at timestamp $DATE_WHEN_GENERATED." >&5 +$as_echo "$as_me: configure script generated at timestamp $DATE_WHEN_GENERATED." >&6;} -# Now we can determine OpenJDK build and target platforms. This is required to -# have early on. -# Make sure we can run config.sub. -$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || - as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 -$as_echo_n "checking build system type... " >&6; } -if test "${ac_cv_build+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - ac_build_alias=$build_alias -test "x$ac_build_alias" = x && - ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` -test "x$ac_build_alias" = x && - as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 -ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 -$as_echo "$ac_cv_build" >&6; } -case $ac_cv_build in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; -esac -build=$ac_cv_build -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_build -shift -build_cpu=$1 -build_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -build_os=$* -IFS=$ac_save_IFS -case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 -$as_echo_n "checking host system type... " >&6; } -if test "${ac_cv_host+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "x$host_alias" = x; then - ac_cv_host=$ac_cv_build -else - ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 -$as_echo "$ac_cv_host" >&6; } -case $ac_cv_host in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; -esac -host=$ac_cv_host -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_host -shift -host_cpu=$1 -host_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -host_os=$* -IFS=$ac_save_IFS -case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 -$as_echo_n "checking target system type... " >&6; } -if test "${ac_cv_target+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test "x$target_alias" = x; then - ac_cv_target=$ac_cv_host -else - ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || - as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 -$as_echo "$ac_cv_target" >&6; } -case $ac_cv_target in -*-*-*) ;; -*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; -esac -target=$ac_cv_target -ac_save_IFS=$IFS; IFS='-' -set x $ac_cv_target -shift -target_cpu=$1 -target_vendor=$2 -shift; shift -# Remember, the first character of IFS is used to create $*, -# except with old shells: -target_os=$* -IFS=$ac_save_IFS -case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac - - -# The aliases save the names the user supplied, while $host etc. -# will get canonicalized. -test -n "$target_alias" && - test "$program_prefix$program_suffix$program_transform_name" = \ - NONENONEs,x,x, && - program_prefix=${target_alias}- - -# Figure out the build and target systems. # Note that in autoconf terminology, "build" is obvious, but "target" -# is confusing; it assumes you are cross-compiling a cross-compiler (!) and "target" is thus the target of the -# product you're building. The target of this build is called "host". Since this is confusing to most people, we -# have not adopted that system, but use "target" as the platform we are building for. In some places though we need -# to use the configure naming style. - - - - - - # Copy the autoconf trip/quadruplet verbatim to OPENJDK_TARGET_AUTOCONF_NAME - # (from the autoconf "host") and OPENJDK_BUILD_AUTOCONF_NAME - # Note that we might later on rewrite e.g. OPENJDK_TARGET_CPU due to reduced build, - # but this will not change the value of OPENJDK_TARGET_AUTOCONF_NAME. - OPENJDK_TARGET_AUTOCONF_NAME="$host" - OPENJDK_BUILD_AUTOCONF_NAME="$build" - - - - # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. - - case "$host_os" in - *linux*) - VAR_OS=linux - VAR_OS_API=posix - ;; - *solaris*) - VAR_OS=solaris - VAR_OS_API=posix - ;; - *darwin*) - VAR_OS=macosx - VAR_OS_API=posix - ;; - *bsd*) - VAR_OS=bsd - VAR_OS_API=posix - ;; - *cygwin*|*windows*) - VAR_OS=windows - VAR_OS_API=winapi - ;; - *) - as_fn_error $? "unsupported operating system $host_os" "$LINENO" 5 - ;; - esac - - - # First argument is the cpu name from the trip/quad - case "$host_cpu" in - x86_64) - VAR_CPU=x86_64 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=little - ;; - i?86) - VAR_CPU=x86 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - arm*) - VAR_CPU=arm - VAR_CPU_ARCH=arm - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - powerpc) - VAR_CPU=ppc - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - powerpc64) - VAR_CPU=ppc64 - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - sparc) - VAR_CPU=sparc - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - sparcv9) - VAR_CPU=sparcv9 - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - *) - as_fn_error $? "unsupported cpu $host_cpu" "$LINENO" 5 - ;; - esac - - # ... and setup our own variables. (Do this explicitely to facilitate searching) - OPENJDK_TARGET_OS="$VAR_OS" - OPENJDK_TARGET_OS_API="$VAR_OS_API" - OPENJDK_TARGET_CPU="$VAR_CPU" - OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH" - OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS" - OPENJDK_TARGET_CPU_ENDIAN="$VAR_CPU_ENDIAN" - - - - - - - - # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. - - case "$build_os" in - *linux*) - VAR_OS=linux - VAR_OS_API=posix - ;; - *solaris*) - VAR_OS=solaris - VAR_OS_API=posix - ;; - *darwin*) - VAR_OS=macosx - VAR_OS_API=posix - ;; - *bsd*) - VAR_OS=bsd - VAR_OS_API=posix - ;; - *cygwin*|*windows*) - VAR_OS=windows - VAR_OS_API=winapi - ;; - *) - as_fn_error $? "unsupported operating system $build_os" "$LINENO" 5 - ;; - esac - - - # First argument is the cpu name from the trip/quad - case "$build_cpu" in - x86_64) - VAR_CPU=x86_64 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=little - ;; - i?86) - VAR_CPU=x86 - VAR_CPU_ARCH=x86 - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - arm*) - VAR_CPU=arm - VAR_CPU_ARCH=arm - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=little - ;; - powerpc) - VAR_CPU=ppc - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - powerpc64) - VAR_CPU=ppc64 - VAR_CPU_ARCH=ppc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - sparc) - VAR_CPU=sparc - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=32 - VAR_CPU_ENDIAN=big - ;; - sparcv9) - VAR_CPU=sparcv9 - VAR_CPU_ARCH=sparc - VAR_CPU_BITS=64 - VAR_CPU_ENDIAN=big - ;; - *) - as_fn_error $? "unsupported cpu $build_cpu" "$LINENO" 5 - ;; - esac - - # ..and setup our own variables. (Do this explicitely to facilitate searching) - OPENJDK_BUILD_OS="$VAR_OS" - OPENJDK_BUILD_OS_API="$VAR_OS_API" - OPENJDK_BUILD_CPU="$VAR_CPU" - OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" - OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" - OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" - - - - - - - - - -# Check whether --with-target-bits was given. -if test "${with_target_bits+set}" = set; then : - withval=$with_target_bits; -fi - - - # We have three types of compiles: - # native == normal compilation, target system == build system - # cross == traditional cross compilation, target system != build system; special toolchain needed - # reduced == using native compilers, but with special flags (e.g. -m32) to produce 32-bit builds on 64-bit machines - # - if test "x$OPENJDK_BUILD_AUTOCONF_NAME" != "x$OPENJDK_TARGET_AUTOCONF_NAME"; then - # We're doing a proper cross-compilation - COMPILE_TYPE="cross" - else - COMPILE_TYPE="native" - fi - - if test "x$with_target_bits" != x; then - if test "x$COMPILE_TYPE" = "xcross"; then - as_fn_error $? "It is not possible to combine --with-target-bits=X and proper cross-compilation. Choose either." "$LINENO" 5 - fi - - if test "x$with_target_bits" = x32 && test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - # A reduced build is requested - COMPILE_TYPE="reduced" - OPENJDK_TARGET_CPU_BITS=32 - if test "x$OPENJDK_TARGET_CPU_ARCH" = "xx86"; then - OPENJDK_TARGET_CPU=x86 - elif test "x$OPENJDK_TARGET_CPU_ARCH" = "xsparc"; then - OPENJDK_TARGET_CPU=sparc - else - as_fn_error $? "Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" "$LINENO" 5 - fi - elif test "x$with_target_bits" = x64 && test "x$OPENJDK_TARGET_CPU_BITS" = x32; then - as_fn_error $? "It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead." "$LINENO" 5 - elif test "x$with_target_bits" = "x$OPENJDK_TARGET_CPU_BITS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: --with-target-bits are set to build platform address size; argument has no meaning" >&5 -$as_echo "$as_me: --with-target-bits are set to build platform address size; argument has no meaning" >&6;} - else - as_fn_error $? "--with-target-bits can only be 32 or 64, you specified $with_target_bits!" "$LINENO" 5 - fi - fi - - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for compilation type" >&5 -$as_echo_n "checking for compilation type... " >&6; } -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMPILE_TYPE" >&5 -$as_echo "$COMPILE_TYPE" >&6; } - - - if test "x$OPENJDK_TARGET_OS" = "xsolaris"; then - REQUIRED_OS_NAME=SunOS - REQUIRED_OS_VERSION=5.10 - fi - if test "x$OPENJDK_TARGET_OS" = "xlinux"; then - REQUIRED_OS_NAME=Linux - REQUIRED_OS_VERSION=2.6 - fi - if test "x$OPENJDK_TARGET_OS" = "xwindows"; then - REQUIRED_OS_NAME=Windows - if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then - REQUIRED_OS_VERSION=5.2 - else - REQUIRED_OS_VERSION=5.1 - fi - fi - if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then - REQUIRED_OS_NAME=Darwin - REQUIRED_OS_VERSION=11.2 - fi - - - - - - # Also store the legacy naming of the cpu. - # Ie i586 and amd64 instead of x86 and x86_64 - OPENJDK_TARGET_CPU_LEGACY="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_CPU" = xx86; then - OPENJDK_TARGET_CPU_LEGACY="i586" - elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then - # On all platforms except MacOSX replace x86_64 with amd64. - OPENJDK_TARGET_CPU_LEGACY="amd64" - fi - - - # And the second legacy naming of the cpu. - # Ie i386 and amd64 instead of x86 and x86_64. - OPENJDK_TARGET_CPU_LEGACY_LIB="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_CPU" = xx86; then - OPENJDK_TARGET_CPU_LEGACY_LIB="i386" - elif test "x$OPENJDK_TARGET_CPU" = xx86_64; then - OPENJDK_TARGET_CPU_LEGACY_LIB="amd64" - fi - - - # This is the name of the cpu (but using i386 and amd64 instead of - # x86 and x86_64, respectively), preceeded by a /, to be used when - # locating libraries. On macosx, it's empty, though. - OPENJDK_TARGET_CPU_LIBDIR="/$OPENJDK_TARGET_CPU_LEGACY_LIB" - if test "x$OPENJDK_TARGET_OS" = xmacosx; then - OPENJDK_TARGET_CPU_LIBDIR="" - fi - - - # OPENJDK_TARGET_CPU_ISADIR is normally empty. On 64-bit Solaris systems, it is set to - # /amd64 or /sparcv9. This string is appended to some library paths, like this: - # /usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libexample.so - OPENJDK_TARGET_CPU_ISADIR="" - if test "x$OPENJDK_TARGET_OS" = xsolaris; then - if test "x$OPENJDK_TARGET_CPU" = xx86_64; then - OPENJDK_TARGET_CPU_ISADIR="/amd64" - elif test "x$OPENJDK_TARGET_CPU" = xsparcv9; then - OPENJDK_TARGET_CPU_ISADIR="/sparcv9" - fi - fi - - - # Setup OPENJDK_TARGET_CPU_OSARCH, which is used to set the os.arch Java system property - OPENJDK_TARGET_CPU_OSARCH="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$OPENJDK_TARGET_CPU" = xx86; then - # On linux only, we replace x86 with i386. - OPENJDK_TARGET_CPU_OSARCH="i386" - elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then - # On all platforms except macosx, we replace x86_64 with amd64. - OPENJDK_TARGET_CPU_OSARCH="amd64" - fi - - - OPENJDK_TARGET_CPU_JLI="$OPENJDK_TARGET_CPU" - if test "x$OPENJDK_TARGET_CPU" = xx86; then - OPENJDK_TARGET_CPU_JLI="i386" - elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then - # On all platforms except macosx, we replace x86_64 with amd64. - OPENJDK_TARGET_CPU_JLI="amd64" - fi - # Now setup the -D flags for building libjli. - OPENJDK_TARGET_CPU_JLI_CFLAGS="-DLIBARCHNAME='\"$OPENJDK_TARGET_CPU_JLI\"'" - if test "x$OPENJDK_TARGET_OS" = xsolaris; then - if test "x$OPENJDK_TARGET_CPU_ARCH" = xsparc; then - OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"sparc\"' -DLIBARCH64NAME='\"sparcv9\"'" - elif test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then - OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"i386\"' -DLIBARCH64NAME='\"amd64\"'" - fi - fi - - - # Setup OPENJDK_TARGET_OS_API_DIR, used in source paths. - if test "x$OPENJDK_TARGET_OS_API" = xposix; then - OPENJDK_TARGET_OS_API_DIR="solaris" - fi - if test "x$OPENJDK_TARGET_OS_API" = xwinapi; then - OPENJDK_TARGET_OS_API_DIR="windows" - fi - - - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - A_LP64="LP64:=" - ADD_LP64="-D_LP64=1" - fi - LP64=$A_LP64 - - - if test "x$COMPILE_TYPE" = "xcross"; then - # FIXME: ... or should this include reduced builds..? - DEFINE_CROSS_COMPILE_ARCH="CROSS_COMPILE_ARCH:=$OPENJDK_TARGET_CPU_LEGACY" - else - DEFINE_CROSS_COMPILE_ARCH="" - fi - - - - -# Continue setting up basic stuff. - -# Locate the directory of this script. -SCRIPT="$0" - - if test "x$OPENJDK_BUILD_OS" != xwindows; then - # Follow a chain of symbolic links. Use readlink - # where it exists, else fall back to horribly - # complicated shell code. - # Extract the first word of "readlink", so it can be a program name with args. -set dummy readlink; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READLINK+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $READLINK in - [\\/]* | ?:[\\/]*) - ac_cv_path_READLINK="$READLINK" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_READLINK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -READLINK=$ac_cv_path_READLINK -if test -n "$READLINK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINK" >&5 -$as_echo "$READLINK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - if test "x$READLINK_TESTED" != yes; then - # On MacOSX there is a readlink tool with a different - # purpose than the GNU readlink tool. Check the found readlink. - ISGNU=`$READLINK --help 2>&1 | grep GNU` - if test "x$ISGNU" = x; then - # A readlink that we do not know how to use. - # Are there other non-GNU readlinks out there? - READLINK_TESTED=yes - READLINK= - fi - fi - - if test "x$READLINK" != x; then - SCRIPT=`$READLINK -f $SCRIPT` - else - STARTDIR=$PWD - COUNTER=0 - DIR=`dirname $SCRIPT` - FIL=`basename $SCRIPT` - while test $COUNTER -lt 20; do - ISLINK=`ls -l $DIR/$FIL | grep '\->' | sed -e 's/.*-> \(.*\)/\1/'` - if test "x$ISLINK" == x; then - # This is not a symbolic link! We are done! - break - fi - # The link might be relative! We have to use cd to travel safely. - cd $DIR - cd `dirname $ISLINK` - DIR=`pwd` - FIL=`basename $ISLINK` - let COUNTER=COUNTER+1 - done - cd $STARTDIR - SCRIPT=$DIR/$FIL - fi - fi - -AUTOCONF_DIR=`dirname $0` - -# Where is the source? It is located two levels above the configure script. -CURDIR="$PWD" -cd "$AUTOCONF_DIR/../.." -SRC_ROOT="`pwd`" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - SRC_ROOT_LENGTH=`pwd|wc -m` - if test $SRC_ROOT_LENGTH -gt 100; then - as_fn_error $? "Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported" "$LINENO" 5 - fi -fi - -cd "$CURDIR" - - - # Fail with message the path to the source root if var SRC_ROOT contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$SRC_ROOT" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - SRC_ROOT=`$CYGPATH -s -m -a "$SRC_ROOT"` - # Now it's case insensitive; let's make it lowercase to improve readability - SRC_ROOT=`$ECHO "$SRC_ROOT" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - SRC_ROOT=`$CYGPATH -u "$SRC_ROOT"` - else - as_fn_error $? "You cannot have spaces in the path to the source root! \"$SRC_ROOT\"" "$LINENO" 5 - fi - fi - - - # Fail with message the path to the current directory if var CURDIR contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$CURDIR" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - CURDIR=`$CYGPATH -s -m -a "$CURDIR"` - # Now it's case insensitive; let's make it lowercase to improve readability - CURDIR=`$ECHO "$CURDIR" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - CURDIR=`$CYGPATH -u "$CURDIR"` - else - as_fn_error $? "You cannot have spaces in the path to the current directory! \"$CURDIR\"" "$LINENO" 5 - fi - fi - - -if test "x$OPENJDK_BUILD_OS" = "xsolaris"; then - # Add extra search paths on solaris for utilities like ar and as etc... - PATH="$PATH:/usr/ccs/bin:/usr/sfw/bin:/opt/csw/bin" -fi - -# For cygwin we need cygpath first, since it is used everywhere. -# Extract the first word of "cygpath", so it can be a program name with args. -set dummy cygpath; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CYGPATH+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CYGPATH in - [\\/]* | ?:[\\/]*) - ac_cv_path_CYGPATH="$CYGPATH" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CYGPATH="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CYGPATH=$ac_cv_path_CYGPATH -if test -n "$CYGPATH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 -$as_echo "$CYGPATH" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -PATH_SEP=":" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - if test "x$CYGPATH" = x; then - as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5 - fi - PATH_SEP=";" -fi - - -# You can force the sys-root if the sys-root encoded into the cross compiler tools -# is not correct. - -# Check whether --with-sys-root was given. -if test "${with_sys_root+set}" = set; then : - withval=$with_sys_root; -fi - - -if test "x$with_sys_root" != x; then - SYS_ROOT=$with_sys_root -else - SYS_ROOT=/ -fi - - - -# Check whether --with-tools-dir was given. -if test "${with_tools_dir+set}" = set; then : - withval=$with_tools_dir; TOOLS_DIR=$with_tools_dir -fi - - - -# Check whether --with-devkit was given. -if test "${with_devkit+set}" = set; then : - withval=$with_devkit; - if test "x$with_sys_root" != x; then - as_fn_error $? "Cannot specify both --with-devkit and --with-sys-root at the same time" "$LINENO" 5 - fi - if test "x$with_tools_dir" != x; then - as_fn_error $? "Cannot specify both --with-devkit and --with-tools-dir at the same time" "$LINENO" 5 - fi - TOOLS_DIR=$with_devkit/bin - SYS_ROOT=$with_devkit/$host_alias/libc - -fi - - - - -# Setup default logging of stdout and stderr to build.log in the output root. -BUILD_LOG='$(OUTPUT_ROOT)/build.log' -BUILD_LOG_PREVIOUS='$(OUTPUT_ROOT)/build.log.old' -BUILD_LOG_WRAPPER='$(SH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' - - - - - -# Must be done before we can call HELP_MSG_MISSING_DEPENDENCY. - - for ac_prog in apt-get yum 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 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_PKGHANDLER+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$PKGHANDLER"; then - ac_cv_prog_PKGHANDLER="$PKGHANDLER" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_PKGHANDLER="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -PKGHANDLER=$ac_cv_prog_PKGHANDLER -if test -n "$PKGHANDLER"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGHANDLER" >&5 -$as_echo "$PKGHANDLER" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$PKGHANDLER" && break -done - - - -# Setup simple tools, that do not need have cross compilation support. -# Without these, we can't properly run the rest of the configure script. # Start with tools that do not need have cross compilation support # and can be expected to be found in the default PATH. These tools are @@ -4443,6 +3756,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in bash +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_BASH+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $BASH in + [\\/]* | ?:[\\/]*) + ac_cv_path_BASH="$BASH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_BASH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +BASH=$ac_cv_path_BASH +if test -n "$BASH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BASH" >&5 +$as_echo "$BASH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$BASH" && break +done + + + if test "x$BASH" = x; then + if test "xbash" = x; then + PROG_NAME=bash + else + PROG_NAME=bash + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in cat do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -4679,65 +4051,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in cpio -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CPIO+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CPIO in - [\\/]* | ?:[\\/]*) - ac_cv_path_CPIO="$CPIO" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CPIO="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CPIO=$ac_cv_path_CPIO -if test -n "$CPIO"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPIO" >&5 -$as_echo "$CPIO" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CPIO" && break -done - - - if test "x$CPIO" = x; then - if test "xcpio" = x; then - PROG_NAME=cpio - else - PROG_NAME=cpio - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - for ac_prog in cut do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -4856,65 +4169,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in df -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_DF+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $DF in - [\\/]* | ?:[\\/]*) - ac_cv_path_DF="$DF" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_DF="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -DF=$ac_cv_path_DF -if test -n "$DF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DF" >&5 -$as_echo "$DF" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$DF" && break -done - - - if test "x$DF" = x; then - if test "xdf" = x; then - PROG_NAME=df - else - PROG_NAME=df - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - for ac_prog in gdiff diff do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -4974,6 +4228,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in dirname +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_DIRNAME+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $DIRNAME in + [\\/]* | ?:[\\/]*) + ac_cv_path_DIRNAME="$DIRNAME" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_DIRNAME="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +DIRNAME=$ac_cv_path_DIRNAME +if test -n "$DIRNAME"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DIRNAME" >&5 +$as_echo "$DIRNAME" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$DIRNAME" && break +done + + + if test "x$DIRNAME" = x; then + if test "xdirname" = x; then + PROG_NAME=dirname + else + PROG_NAME=dirname + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in echo do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -5446,6 +4759,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in mktemp +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_MKTEMP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $MKTEMP in + [\\/]* | ?:[\\/]*) + ac_cv_path_MKTEMP="$MKTEMP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_MKTEMP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +MKTEMP=$ac_cv_path_MKTEMP +if test -n "$MKTEMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKTEMP" >&5 +$as_echo "$MKTEMP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$MKTEMP" && break +done + + + if test "x$MKTEMP" = x; then + if test "xmktemp" = x; then + PROG_NAME=mktemp + else + PROG_NAME=mktemp + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in mv do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -5564,6 +4936,124 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in pwd +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_THEPWDCMD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $THEPWDCMD in + [\\/]* | ?:[\\/]*) + ac_cv_path_THEPWDCMD="$THEPWDCMD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_THEPWDCMD="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +THEPWDCMD=$ac_cv_path_THEPWDCMD +if test -n "$THEPWDCMD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $THEPWDCMD" >&5 +$as_echo "$THEPWDCMD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$THEPWDCMD" && break +done + + + if test "x$THEPWDCMD" = x; then + if test "xpwd" = x; then + PROG_NAME=thepwdcmd + else + PROG_NAME=pwd + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + + for ac_prog in rm +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_RM+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $RM in + [\\/]* | ?:[\\/]*) + ac_cv_path_RM="$RM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +RM=$ac_cv_path_RM +if test -n "$RM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 +$as_echo "$RM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$RM" && break +done + + + if test "x$RM" = x; then + if test "xrm" = x; then + PROG_NAME=rm + else + PROG_NAME=rm + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in sh do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -5977,6 +5467,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in uname +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_UNAME+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $UNAME in + [\\/]* | ?:[\\/]*) + ac_cv_path_UNAME="$UNAME" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_UNAME="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +UNAME=$ac_cv_path_UNAME +if test -n "$UNAME"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNAME" >&5 +$as_echo "$UNAME" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$UNAME" && break +done + + + if test "x$UNAME" = x; then + if test "xuname" = x; then + PROG_NAME=uname + else + PROG_NAME=uname + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in uniq do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -6036,65 +5585,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in unzip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_UNZIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $UNZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_UNZIP="$UNZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_UNZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -UNZIP=$ac_cv_path_UNZIP -if test -n "$UNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNZIP" >&5 -$as_echo "$UNZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$UNZIP" && break -done - - - if test "x$UNZIP" = x; then - if test "xunzip" = x; then - PROG_NAME=unzip - else - PROG_NAME=unzip - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - for ac_prog in wc do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -6154,6 +5644,65 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + for ac_prog in which +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_WHICH+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $WHICH in + [\\/]* | ?:[\\/]*) + ac_cv_path_WHICH="$WHICH" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_WHICH="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +WHICH=$ac_cv_path_WHICH +if test -n "$WHICH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WHICH" >&5 +$as_echo "$WHICH" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$WHICH" && break +done + + + if test "x$WHICH" = x; then + if test "xwhich" = x; then + PROG_NAME=which + else + PROG_NAME=which + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + for ac_prog in xargs do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -6213,65 +5762,6 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - for ac_prog in zip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ZIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ZIP in - [\\/]* | ?:[\\/]*) - ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ZIP=$ac_cv_path_ZIP -if test -n "$ZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 -$as_echo "$ZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$ZIP" && break -done - - - if test "x$ZIP" = x; then - if test "xzip" = x; then - PROG_NAME=zip - else - PROG_NAME=zip - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - - # Then required tools that require some special treatment. for ac_prog in gawk mawk nawk awk do @@ -6700,647 +6190,20 @@ $as_echo "$as_me: Could not find $PROG_NAME!" >&6;} fi - - # We need to find a recent version of GNU make. Especially on Solaris, this can be tricky. - if test "x$MAKE" != x; then - # User has supplied a make, test it. - if test ! -f "$MAKE"; then - as_fn_error $? "The specified make (by MAKE=$MAKE) is not found." "$LINENO" 5 - fi - - MAKE_CANDIDATE=""$MAKE"" - DESCRIPTION="user supplied MAKE=" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - if test "x$FOUND_MAKE" = x; then - as_fn_error $? "The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer." "$LINENO" 5 - fi - else - # Try our hardest to locate a correct version of GNU make - for ac_prog in gmake -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_GMAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_GMAKE="$CHECK_GMAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_GMAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_GMAKE=$ac_cv_path_CHECK_GMAKE -if test -n "$CHECK_GMAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_GMAKE" >&5 -$as_echo "$CHECK_GMAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_GMAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_GMAKE"" - DESCRIPTION="gmake in PATH" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - - if test "x$FOUND_MAKE" = x; then - for ac_prog in make -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_MAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_MAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_MAKE="$CHECK_MAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_MAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_MAKE=$ac_cv_path_CHECK_MAKE -if test -n "$CHECK_MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_MAKE" >&5 -$as_echo "$CHECK_MAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_MAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_MAKE"" - DESCRIPTION="make in PATH" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - fi - - if test "x$FOUND_MAKE" = x; then - if test "x$TOOLS_DIR" != x; then - # We have a tools-dir, check that as well before giving up. - OLD_PATH=$PATH - PATH=$TOOLS_DIR:$PATH - for ac_prog in gmake -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_TOOLSDIR_GMAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_TOOLSDIR_GMAKE="$CHECK_TOOLSDIR_GMAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_TOOLSDIR_GMAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_TOOLSDIR_GMAKE=$ac_cv_path_CHECK_TOOLSDIR_GMAKE -if test -n "$CHECK_TOOLSDIR_GMAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_GMAKE" >&5 -$as_echo "$CHECK_TOOLSDIR_GMAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_TOOLSDIR_GMAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_TOOLSDIR_GMAKE"" - DESCRIPTION="gmake in tools-dir" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - if test "x$FOUND_MAKE" = x; then - for ac_prog in make -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $CHECK_TOOLSDIR_MAKE in - [\\/]* | ?:[\\/]*) - ac_cv_path_CHECK_TOOLSDIR_MAKE="$CHECK_TOOLSDIR_MAKE" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_CHECK_TOOLSDIR_MAKE="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -CHECK_TOOLSDIR_MAKE=$ac_cv_path_CHECK_TOOLSDIR_MAKE -if test -n "$CHECK_TOOLSDIR_MAKE"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_MAKE" >&5 -$as_echo "$CHECK_TOOLSDIR_MAKE" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$CHECK_TOOLSDIR_MAKE" && break -done - - - MAKE_CANDIDATE=""$CHECK_TOOLSDIR_MAKE"" - DESCRIPTION="make in tools-dir" - if test "x$MAKE_CANDIDATE" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 -$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} - - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MAKE_CANDIDATE" - car="${tmp%% *}" - tmp="$MAKE_CANDIDATE EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MAKE_CANDIDATE="$car ${cdr% *}" - else - MAKE_CANDIDATE="$car" - fi - - MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` - IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` - if test "x$IS_GNU_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 -$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} - else - IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` - if test "x$IS_MODERN_MAKE" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 -$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} - else - FOUND_MAKE=$MAKE_CANDIDATE - fi - fi - fi - - fi - PATH=$OLD_PATH - fi - fi - - if test "x$FOUND_MAKE" = x; then - as_fn_error $? "Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure." "$LINENO" 5 - fi - fi - - MAKE=$FOUND_MAKE - - { $as_echo "$as_me:${as_lineno-$LINENO}: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&5 -$as_echo "$as_me: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&6;} - - - - for ac_prog in rm -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_RM+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $RM in - [\\/]* | ?:[\\/]*) - ac_cv_path_RM="$RM" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_RM="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -RM=$ac_cv_path_RM -if test -n "$RM"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RM" >&5 -$as_echo "$RM" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$RM" && break -done - - - if test "x$RM" = x; then - if test "xrm" = x; then - PROG_NAME=rm - else - PROG_NAME=rm - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 -$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} - as_fn_error $? "Cannot continue" "$LINENO" 5 - fi - - +# Always force rm. RM="$RM -f" - - # Test if find supports -delete - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if find supports -delete" >&5 -$as_echo_n "checking if find supports -delete... " >&6; } - FIND_DELETE="-delete" - - DELETEDIR=`mktemp -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) - - echo Hejsan > $DELETEDIR/TestIfFindSupportsDelete - - TEST_DELETE=`$FIND "$DELETEDIR" -name TestIfFindSupportsDelete $FIND_DELETE 2>&1` - if test -f $DELETEDIR/TestIfFindSupportsDelete; then - # No, it does not. - rm $DELETEDIR/TestIfFindSupportsDelete - FIND_DELETE="-exec rm \{\} \+" - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - fi - rmdir $DELETEDIR - - - -# Non-required basic tools - -# Extract the first word of "pwd", so it can be a program name with args. -set dummy pwd; ac_word=$2 +# These are not required on all platforms +# Extract the first word of "cygpath", so it can be a program name with args. +set dummy cygpath; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_THEPWDCMD+set}" = set; then : +if test "${ac_cv_path_CYGPATH+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $THEPWDCMD in + case $CYGPATH in [\\/]* | ?:[\\/]*) - ac_cv_path_THEPWDCMD="$THEPWDCMD" # Let the user override the test with a path. + ac_cv_path_CYGPATH="$CYGPATH" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7350,7 +6213,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_THEPWDCMD="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_CYGPATH="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7361,26 +6224,26 @@ IFS=$as_save_IFS ;; esac fi -THEPWDCMD=$ac_cv_path_THEPWDCMD -if test -n "$THEPWDCMD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $THEPWDCMD" >&5 -$as_echo "$THEPWDCMD" >&6; } +CYGPATH=$ac_cv_path_CYGPATH +if test -n "$CYGPATH"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGPATH" >&5 +$as_echo "$CYGPATH" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -# Extract the first word of "ldd", so it can be a program name with args. -set dummy ldd; ac_word=$2 +# Extract the first word of "readlink", so it can be a program name with args. +set dummy readlink; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_LDD+set}" = set; then : +if test "${ac_cv_path_READLINK+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $LDD in + case $READLINK in [\\/]* | ?:[\\/]*) - ac_cv_path_LDD="$LDD" # Let the user override the test with a path. + ac_cv_path_READLINK="$READLINK" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7390,7 +6253,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_LDD="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_READLINK="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7401,32 +6264,26 @@ IFS=$as_save_IFS ;; esac fi -LDD=$ac_cv_path_LDD -if test -n "$LDD"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDD" >&5 -$as_echo "$LDD" >&6; } +READLINK=$ac_cv_path_READLINK +if test -n "$READLINK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINK" >&5 +$as_echo "$READLINK" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if test "x$LDD" = "x"; then - # List shared lib dependencies is used for - # debug output and checking for forbidden dependencies. - # We can build without it. - LDD="true" -fi -# Extract the first word of "otool", so it can be a program name with args. -set dummy otool; ac_word=$2 +# Extract the first word of "df", so it can be a program name with args. +set dummy df; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OTOOL+set}" = set; then : +if test "${ac_cv_path_DF+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $OTOOL in + case $DF in [\\/]* | ?:[\\/]*) - ac_cv_path_OTOOL="$OTOOL" # Let the user override the test with a path. + ac_cv_path_DF="$DF" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7436,7 +6293,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OTOOL="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_DF="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7447,31 +6304,26 @@ IFS=$as_save_IFS ;; esac fi -OTOOL=$ac_cv_path_OTOOL -if test -n "$OTOOL"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 -$as_echo "$OTOOL" >&6; } +DF=$ac_cv_path_DF +if test -n "$DF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DF" >&5 +$as_echo "$DF" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi -if test "x$OTOOL" = "x"; then - OTOOL="true" -fi -for ac_prog in readelf greadelf -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 +# Extract the first word of "SetFile", so it can be a program name with args. +set dummy SetFile; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READELF+set}" = set; then : +if test "${ac_cv_path_SETFILE+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $READELF in + case $SETFILE in [\\/]* | ?:[\\/]*) - ac_cv_path_READELF="$READELF" # Let the user override the test with a path. + ac_cv_path_SETFILE="$SETFILE" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR @@ -7481,7 +6333,7 @@ do test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_READELF="$as_dir/$ac_word$ac_exec_ext" + ac_cv_path_SETFILE="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -7492,439 +6344,996 @@ IFS=$as_save_IFS ;; esac fi -READELF=$ac_cv_path_READELF -if test -n "$READELF"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 -$as_echo "$READELF" >&6; } +SETFILE=$ac_cv_path_SETFILE +if test -n "$SETFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SETFILE" >&5 +$as_echo "$SETFILE" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - test -n "$READELF" && break -done -for ac_prog in objdump gobjdump -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OBJDUMP+set}" = set; then : + +# Now we can determine OpenJDK build and target platforms. This is required to +# have early on. +# Make sure we can run config.sub. +$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || + as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 +$as_echo_n "checking build system type... " >&6; } +if test "${ac_cv_build+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $OBJDUMP in - [\\/]* | ?:[\\/]*) - ac_cv_path_OBJDUMP="$OBJDUMP" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OBJDUMP="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + ac_build_alias=$build_alias +test "x$ac_build_alias" = x && + ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` +test "x$ac_build_alias" = x && + as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 +ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 - ;; +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 +$as_echo "$ac_cv_build" >&6; } +case $ac_cv_build in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical build" "$LINENO" 5 ;; esac -fi -OBJDUMP=$ac_cv_path_OBJDUMP -if test -n "$OBJDUMP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 -$as_echo "$OBJDUMP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi +build=$ac_cv_build +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_build +shift +build_cpu=$1 +build_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +build_os=$* +IFS=$ac_save_IFS +case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac - test -n "$OBJDUMP" && break -done - -# Extract the first word of "hg", so it can be a program name with args. -set dummy hg; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_HG+set}" = set; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 +$as_echo_n "checking host system type... " >&6; } +if test "${ac_cv_host+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $HG in - [\\/]* | ?:[\\/]*) - ac_cv_path_HG="$HG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_HG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -HG=$ac_cv_path_HG -if test -n "$HG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HG" >&5 -$as_echo "$HG" >&6; } + if test "x$host_alias" = x; then + ac_cv_host=$ac_cv_build else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 +$as_echo "$ac_cv_host" >&6; } +case $ac_cv_host in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical host" "$LINENO" 5 ;; +esac +host=$ac_cv_host +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_host +shift +host_cpu=$1 +host_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +host_os=$* +IFS=$ac_save_IFS +case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac - -# Check if pkg-config is available. - - -if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. -set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking target system type" >&5 +$as_echo_n "checking target system type... " >&6; } +if test "${ac_cv_target+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS + if test "x$target_alias" = x; then + ac_cv_target=$ac_cv_host +else + ac_cv_target=`$SHELL "$ac_aux_dir/config.sub" $target_alias` || + as_fn_error $? "$SHELL $ac_aux_dir/config.sub $target_alias failed" "$LINENO" 5 +fi - ;; +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_target" >&5 +$as_echo "$ac_cv_target" >&6; } +case $ac_cv_target in +*-*-*) ;; +*) as_fn_error $? "invalid value of canonical target" "$LINENO" 5 ;; esac -fi -PKG_CONFIG=$ac_cv_path_PKG_CONFIG -if test -n "$PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -$as_echo "$PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } +target=$ac_cv_target +ac_save_IFS=$IFS; IFS='-' +set x $ac_cv_target +shift +target_cpu=$1 +target_vendor=$2 +shift; shift +# Remember, the first character of IFS is used to create $*, +# except with old shells: +target_os=$* +IFS=$ac_save_IFS +case $target_os in *\ *) target_os=`echo "$target_os" | sed 's/ /-/g'`;; esac + + +# The aliases save the names the user supplied, while $host etc. +# will get canonicalized. +test -n "$target_alias" && + test "$program_prefix$program_suffix$program_transform_name" = \ + NONENONEs,x,x, && + program_prefix=${target_alias}- + +# Figure out the build and target systems. # Note that in autoconf terminology, "build" is obvious, but "target" +# is confusing; it assumes you are cross-compiling a cross-compiler (!) and "target" is thus the target of the +# product you're building. The target of this build is called "host". Since this is confusing to most people, we +# have not adopted that system, but use "target" as the platform we are building for. In some places though we need +# to use the configure naming style. + + + + + + # Copy the autoconf trip/quadruplet verbatim to OPENJDK_TARGET_AUTOCONF_NAME + # (from the autoconf "host") and OPENJDK_BUILD_AUTOCONF_NAME + # Note that we might later on rewrite e.g. OPENJDK_TARGET_CPU due to reduced build, + # but this will not change the value of OPENJDK_TARGET_AUTOCONF_NAME. + OPENJDK_TARGET_AUTOCONF_NAME="$host" + OPENJDK_BUILD_AUTOCONF_NAME="$build" + + + + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. + + case "$build_os" in + *linux*) + VAR_OS=linux + VAR_OS_API=posix + VAR_OS_ENV=linux + ;; + *solaris*) + VAR_OS=solaris + VAR_OS_API=posix + VAR_OS_ENV=solaris + ;; + *darwin*) + VAR_OS=macosx + VAR_OS_API=posix + VAR_OS_ENV=macosx + ;; + *bsd*) + VAR_OS=bsd + VAR_OS_API=posix + VAR_OS_ENV=bsd + ;; + *cygwin*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.cygwin + ;; + *mingw*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys + ;; + *) + as_fn_error $? "unsupported operating system $build_os" "$LINENO" 5 + ;; + esac + + + # First argument is the cpu name from the trip/quad + case "$build_cpu" in + x86_64) + VAR_CPU=x86_64 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=little + ;; + i?86) + VAR_CPU=x86 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + arm*) + VAR_CPU=arm + VAR_CPU_ARCH=arm + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + powerpc) + VAR_CPU=ppc + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + powerpc64) + VAR_CPU=ppc64 + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + sparc) + VAR_CPU=sparc + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + sparcv9) + VAR_CPU=sparcv9 + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + *) + as_fn_error $? "unsupported cpu $build_cpu" "$LINENO" 5 + ;; + esac + + # ..and setup our own variables. (Do this explicitely to facilitate searching) + OPENJDK_BUILD_OS="$VAR_OS" + OPENJDK_BUILD_OS_API="$VAR_OS_API" + OPENJDK_BUILD_OS_ENV="$VAR_OS_ENV" + OPENJDK_BUILD_CPU="$VAR_CPU" + OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" + OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" + OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking openjdk-build os-cpu" >&5 +$as_echo_n "checking openjdk-build os-cpu... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&5 +$as_echo "$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU" >&6; } + + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. + + case "$host_os" in + *linux*) + VAR_OS=linux + VAR_OS_API=posix + VAR_OS_ENV=linux + ;; + *solaris*) + VAR_OS=solaris + VAR_OS_API=posix + VAR_OS_ENV=solaris + ;; + *darwin*) + VAR_OS=macosx + VAR_OS_API=posix + VAR_OS_ENV=macosx + ;; + *bsd*) + VAR_OS=bsd + VAR_OS_API=posix + VAR_OS_ENV=bsd + ;; + *cygwin*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.cygwin + ;; + *mingw*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys + ;; + *) + as_fn_error $? "unsupported operating system $host_os" "$LINENO" 5 + ;; + esac + + + # First argument is the cpu name from the trip/quad + case "$host_cpu" in + x86_64) + VAR_CPU=x86_64 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=little + ;; + i?86) + VAR_CPU=x86 + VAR_CPU_ARCH=x86 + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + arm*) + VAR_CPU=arm + VAR_CPU_ARCH=arm + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=little + ;; + powerpc) + VAR_CPU=ppc + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + powerpc64) + VAR_CPU=ppc64 + VAR_CPU_ARCH=ppc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + sparc) + VAR_CPU=sparc + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=32 + VAR_CPU_ENDIAN=big + ;; + sparcv9) + VAR_CPU=sparcv9 + VAR_CPU_ARCH=sparc + VAR_CPU_BITS=64 + VAR_CPU_ENDIAN=big + ;; + *) + as_fn_error $? "unsupported cpu $host_cpu" "$LINENO" 5 + ;; + esac + + # ... and setup our own variables. (Do this explicitely to facilitate searching) + OPENJDK_TARGET_OS="$VAR_OS" + OPENJDK_TARGET_OS_API="$VAR_OS_API" + OPENJDK_TARGET_OS_ENV="$VAR_OS_ENV" + OPENJDK_TARGET_CPU="$VAR_CPU" + OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH" + OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS" + OPENJDK_TARGET_CPU_ENDIAN="$VAR_CPU_ENDIAN" + + + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking openjdk-target os-cpu" >&5 +$as_echo_n "checking openjdk-target os-cpu... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" >&5 +$as_echo "$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" >&6; } + + + +# Check whether --with-target-bits was given. +if test "${with_target_bits+set}" = set; then : + withval=$with_target_bits; fi -fi -if test -z "$ac_cv_path_PKG_CONFIG"; then - ac_pt_PKG_CONFIG=$PKG_CONFIG - # Extract the first word of "pkg-config", so it can be a program name with args. -set dummy pkg-config; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_PKG_CONFIG in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG -if test -n "$ac_pt_PKG_CONFIG"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -$as_echo "$ac_pt_PKG_CONFIG" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_PKG_CONFIG" = x; then - PKG_CONFIG="" + # We have three types of compiles: + # native == normal compilation, target system == build system + # cross == traditional cross compilation, target system != build system; special toolchain needed + # reduced == using native compilers, but with special flags (e.g. -m32) to produce 32-bit builds on 64-bit machines + # + if test "x$OPENJDK_BUILD_AUTOCONF_NAME" != "x$OPENJDK_TARGET_AUTOCONF_NAME"; then + # We're doing a proper cross-compilation + COMPILE_TYPE="cross" else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - PKG_CONFIG=$ac_pt_PKG_CONFIG + COMPILE_TYPE="native" fi -else - PKG_CONFIG="$ac_cv_path_PKG_CONFIG" -fi -fi -if test -n "$PKG_CONFIG"; then - _pkg_min_version=0.9.0 - { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } - if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - PKG_CONFIG="" - fi - -fi - -# After basic tools have been setup, we can check build os specific details. - -############################################################################### - -# Note that this is the build platform OS version! - -OS_VERSION="`uname -r | ${SED} 's!\.! !g' | ${SED} 's!-! !g'`" -OS_VERSION_MAJOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 1 -d ' '`" -OS_VERSION_MINOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 2 -d ' '`" -OS_VERSION_MICRO="`${ECHO} ${OS_VERSION} | ${CUT} -f 3 -d ' '`" - - - - - -# Setup builddeps, for automatic downloading of tools we need. -# This is needed before we can call BDEPS_CHECK_MODULE, which is done in -# boot-jdk setup, but we need to have basic tools setup first. - - -# Check whether --with-builddeps-conf was given. -if test "${with_builddeps_conf+set}" = set; then : - withval=$with_builddeps_conf; -fi - - - -# Check whether --with-builddeps-server was given. -if test "${with_builddeps_server+set}" = set; then : - withval=$with_builddeps_server; -fi - - - -# Check whether --with-builddeps-dir was given. -if test "${with_builddeps_dir+set}" = set; then : - withval=$with_builddeps_dir; -else - with_builddeps_dir=/localhome/builddeps -fi - - - -# Check whether --with-builddeps-group was given. -if test "${with_builddeps_group+set}" = set; then : - withval=$with_builddeps_group; -fi - - -# Check whether --enable-list-builddeps was given. -if test "${enable_list_builddeps+set}" = set; then : - enableval=$enable_list_builddeps; LIST_BUILDDEPS="${enableval}" -else - LIST_BUILDDEPS='no' -fi - - -if test "x$LIST_BUILDDEPS" = xyes; then - echo - echo List of build dependencies known to the configure script, - echo that can be used in builddeps.conf files: - cat $AUTOCONF_DIR/*.ac $AUTOCONF_DIR/*.m4 | grep BDEPS_CHECK_MODULE\( | cut -f 2 -d ',' | tr -d ' ' | sort - echo - exit 1 -fi - - - - if test "x$with_builddeps_server" != x || test "x$with_builddeps_conf" != x; then - if test "x$with_builddeps_conf" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for supplied builddeps configuration file" >&5 -$as_echo_n "checking for supplied builddeps configuration file... " >&6; } - builddepsfile=$with_builddeps_conf - if test -s $builddepsfile; then - . $builddepsfile - { $as_echo "$as_me:${as_lineno-$LINENO}: result: loaded!" >&5 -$as_echo "loaded!" >&6; } - else - as_fn_error $? "The given builddeps conf file $with_builddeps_conf could not be loaded!" "$LINENO" 5 - fi - else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for builddeps.conf files in sources..." >&5 -$as_echo_n "checking for builddeps.conf files in sources...... " >&6; } - builddepsfile=`mktemp` - touch $builddepsfile - # Put all found confs into a single file. - find ${SRC_ROOT} -name builddeps.conf -exec cat \{\} \; >> $builddepsfile - # Source the file to acquire the variables - if test -s $builddepsfile; then - . $builddepsfile - { $as_echo "$as_me:${as_lineno-$LINENO}: result: found at least one!" >&5 -$as_echo "found at least one!" >&6; } - else - as_fn_error $? "Could not find any builddeps.conf at all!" "$LINENO" 5 - fi - fi - # Create build and target names that use _ instead of "-" and ".". - # This is necessary to use them in variable names. - build_var=`echo ${OPENJDK_BUILD_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` - target_var=`echo ${OPENJDK_TARGET_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` - # Extract rewrite information for build and target - eval rewritten_build=\${REWRITE_${build_var}} - if test "x$rewritten_build" = x; then - rewritten_build=${OPENJDK_BUILD_AUTOCONF_NAME} - echo Build stays the same $rewritten_build - else - echo Rewriting build for builddeps into $rewritten_build - fi - eval rewritten_target=\${REWRITE_${target_var}} - if test "x$rewritten_target" = x; then - rewritten_target=${OPENJDK_TARGET_AUTOCONF_NAME} - echo Target stays the same $rewritten_target - else - echo Rewriting target for builddeps into $rewritten_target - fi - rewritten_build_var=`echo ${rewritten_build} | tr '-' '_' | tr '.' '_'` - rewritten_target_var=`echo ${rewritten_target} | tr '-' '_' | tr '.' '_'` - fi - for ac_prog in 7z unzip -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$BDEPS_UNZIP"; then - ac_cv_prog_BDEPS_UNZIP="$BDEPS_UNZIP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_BDEPS_UNZIP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -BDEPS_UNZIP=$ac_cv_prog_BDEPS_UNZIP -if test -n "$BDEPS_UNZIP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_UNZIP" >&5 -$as_echo "$BDEPS_UNZIP" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$BDEPS_UNZIP" && break -done - - if test "x$BDEPS_UNZIP" = x7z; then - BDEPS_UNZIP="7z x" + if test "x$with_target_bits" != x; then + if test "x$COMPILE_TYPE" = "xcross"; then + as_fn_error $? "It is not possible to combine --with-target-bits=X and proper cross-compilation. Choose either." "$LINENO" 5 fi - for ac_prog in wget lftp ftp -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$BDEPS_FTP"; then - ac_cv_prog_BDEPS_FTP="$BDEPS_FTP" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_prog_BDEPS_FTP="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + if test "x$with_target_bits" = x32 && test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + # A reduced build is requested + COMPILE_TYPE="reduced" + OPENJDK_TARGET_CPU_BITS=32 + if test "x$OPENJDK_TARGET_CPU_ARCH" = "xx86"; then + OPENJDK_TARGET_CPU=x86 + elif test "x$OPENJDK_TARGET_CPU_ARCH" = "xsparc"; then + OPENJDK_TARGET_CPU=sparc + else + as_fn_error $? "Reduced build (--with-target-bits=32) is only supported on x86_64 and sparcv9" "$LINENO" 5 + fi + elif test "x$with_target_bits" = x64 && test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + as_fn_error $? "It is not possible to use --with-target-bits=64 on a 32 bit system. Use proper cross-compilation instead." "$LINENO" 5 + elif test "x$with_target_bits" = "x$OPENJDK_TARGET_CPU_BITS"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: --with-target-bits are set to build platform address size; argument has no meaning" >&5 +$as_echo "$as_me: --with-target-bits are set to build platform address size; argument has no meaning" >&6;} + else + as_fn_error $? "--with-target-bits can only be 32 or 64, you specified $with_target_bits!" "$LINENO" 5 + fi + fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking compilation type" >&5 +$as_echo_n "checking compilation type... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMPILE_TYPE" >&5 +$as_echo "$COMPILE_TYPE" >&6; } + + + if test "x$OPENJDK_TARGET_OS" = "xsolaris"; then + REQUIRED_OS_NAME=SunOS + REQUIRED_OS_VERSION=5.10 + fi + if test "x$OPENJDK_TARGET_OS" = "xlinux"; then + REQUIRED_OS_NAME=Linux + REQUIRED_OS_VERSION=2.6 + fi + if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + REQUIRED_OS_NAME=Windows + if test "x$OPENJDK_TARGET_CPU_BITS" = "x64"; then + REQUIRED_OS_VERSION=5.2 + else + REQUIRED_OS_VERSION=5.1 + fi + fi + if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then + REQUIRED_OS_NAME=Darwin + REQUIRED_OS_VERSION=11.2 + fi + + + + + + # Also store the legacy naming of the cpu. + # Ie i586 and amd64 instead of x86 and x86_64 + OPENJDK_TARGET_CPU_LEGACY="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_CPU" = xx86; then + OPENJDK_TARGET_CPU_LEGACY="i586" + elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + # On all platforms except MacOSX replace x86_64 with amd64. + OPENJDK_TARGET_CPU_LEGACY="amd64" + fi + + + # And the second legacy naming of the cpu. + # Ie i386 and amd64 instead of x86 and x86_64. + OPENJDK_TARGET_CPU_LEGACY_LIB="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_CPU" = xx86; then + OPENJDK_TARGET_CPU_LEGACY_LIB="i386" + elif test "x$OPENJDK_TARGET_CPU" = xx86_64; then + OPENJDK_TARGET_CPU_LEGACY_LIB="amd64" + fi + + + # This is the name of the cpu (but using i386 and amd64 instead of + # x86 and x86_64, respectively), preceeded by a /, to be used when + # locating libraries. On macosx, it's empty, though. + OPENJDK_TARGET_CPU_LIBDIR="/$OPENJDK_TARGET_CPU_LEGACY_LIB" + if test "x$OPENJDK_TARGET_OS" = xmacosx; then + OPENJDK_TARGET_CPU_LIBDIR="" + fi + + + # OPENJDK_TARGET_CPU_ISADIR is normally empty. On 64-bit Solaris systems, it is set to + # /amd64 or /sparcv9. This string is appended to some library paths, like this: + # /usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libexample.so + OPENJDK_TARGET_CPU_ISADIR="" + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_CPU" = xx86_64; then + OPENJDK_TARGET_CPU_ISADIR="/amd64" + elif test "x$OPENJDK_TARGET_CPU" = xsparcv9; then + OPENJDK_TARGET_CPU_ISADIR="/sparcv9" + fi + fi + + + # Setup OPENJDK_TARGET_CPU_OSARCH, which is used to set the os.arch Java system property + OPENJDK_TARGET_CPU_OSARCH="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_OS" = xlinux && test "x$OPENJDK_TARGET_CPU" = xx86; then + # On linux only, we replace x86 with i386. + OPENJDK_TARGET_CPU_OSARCH="i386" + elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + # On all platforms except macosx, we replace x86_64 with amd64. + OPENJDK_TARGET_CPU_OSARCH="amd64" + fi + + + OPENJDK_TARGET_CPU_JLI="$OPENJDK_TARGET_CPU" + if test "x$OPENJDK_TARGET_CPU" = xx86; then + OPENJDK_TARGET_CPU_JLI="i386" + elif test "x$OPENJDK_TARGET_OS" != xmacosx && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + # On all platforms except macosx, we replace x86_64 with amd64. + OPENJDK_TARGET_CPU_JLI="amd64" + fi + # Now setup the -D flags for building libjli. + OPENJDK_TARGET_CPU_JLI_CFLAGS="-DLIBARCHNAME='\"$OPENJDK_TARGET_CPU_JLI\"'" + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_CPU_ARCH" = xsparc; then + OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"sparc\"' -DLIBARCH64NAME='\"sparcv9\"'" + elif test "x$OPENJDK_TARGET_CPU_ARCH" = xx86; then + OPENJDK_TARGET_CPU_JLI_CFLAGS="$OPENJDK_TARGET_CPU_JLI_CFLAGS -DLIBARCH32NAME='\"i386\"' -DLIBARCH64NAME='\"amd64\"'" + fi + fi + + + # Setup OPENJDK_TARGET_OS_API_DIR, used in source paths. + if test "x$OPENJDK_TARGET_OS_API" = xposix; then + OPENJDK_TARGET_OS_API_DIR="solaris" + fi + if test "x$OPENJDK_TARGET_OS_API" = xwinapi; then + OPENJDK_TARGET_OS_API_DIR="windows" + fi + + + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + A_LP64="LP64:=" + # -D_LP64=1 is only set on linux and mac. Setting on windows causes diff in + # unpack200.exe + if test "x$OPENJDK_TARGET_OS" = xlinux || test "x$OPENJDK_TARGET_OS" = xmacosx; then + ADD_LP64="-D_LP64=1" + fi + fi + LP64=$A_LP64 + + + if test "x$COMPILE_TYPE" = "xcross"; then + # FIXME: ... or should this include reduced builds..? + DEFINE_CROSS_COMPILE_ARCH="CROSS_COMPILE_ARCH:=$OPENJDK_TARGET_CPU_LEGACY" + else + DEFINE_CROSS_COMPILE_ARCH="" + fi + + + + +# Continue setting up basic stuff. Most remaining code require fundamental tools. + +# Locate the directory of this script. +SCRIPT="$0" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + SCRIPT=`$READLINK -f $SCRIPT` + else + STARTDIR=$PWD + COUNTER=0 + sym_link_dir=`$DIRNAME $SCRIPT` + sym_link_file=`$BASENAME $SCRIPT` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $sym_link_dir + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + sym_link_dir=`$THEPWDCMD` + sym_link_file=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + SCRIPT=$sym_link_dir/$sym_link_file + fi + fi + +AUTOCONF_DIR=`cd \`$DIRNAME $SCRIPT\`; $THEPWDCMD` + +# Where is the source? It is located two levels above the configure script. +CURDIR="$PWD" +cd "$AUTOCONF_DIR/../.." +SRC_ROOT="`pwd`" + +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + PATH_SEP=";" + + SRC_ROOT_LENGTH=`$THEPWDCMD|$WC -m` + if test $SRC_ROOT_LENGTH -gt 100; then + as_fn_error $? "Your base path is too long. It is $SRC_ROOT_LENGTH characters long, but only 100 is supported" "$LINENO" 5 + fi + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking cygwin release" >&5 +$as_echo_n "checking cygwin release... " >&6; } + CYGWIN_VERSION=`$UNAME -r` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGWIN_VERSION" >&5 +$as_echo "$CYGWIN_VERSION" >&6; } + WINDOWS_ENV_VENDOR='cygwin' + WINDOWS_ENV_VERSION="$CYGWIN_VERSION" + + CYGWIN_VERSION_OK=`$ECHO $CYGWIN_VERSION | $GREP ^1.7.` + if test "x$CYGWIN_VERSION_OK" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&5 +$as_echo "$as_me: Your cygwin is too old. You are running $CYGWIN_VERSION, but at least cygwin 1.7 is required. Please upgrade." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + if test "x$CYGPATH" = x; then + as_fn_error $? "Something is wrong with your cygwin installation since I cannot find cygpath.exe in your path" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking cygwin root directory as unix-style path" >&5 +$as_echo_n "checking cygwin root directory as unix-style path... " >&6; } + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + cygwin_winpath_root=`cd / ; cmd /c cd | grep ".*"` + # Force cygpath to report the proper root by including a trailing space, and then stripping it off again. + CYGWIN_ROOT_PATH=`$CYGPATH -u "$cygwin_winpath_root " | $CUT -f 1 -d " "` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CYGWIN_ROOT_PATH" >&5 +$as_echo "$CYGWIN_ROOT_PATH" >&6; } + WINDOWS_ENV_ROOT_PATH="$CYGWIN_ROOT_PATH" + test_cygdrive_prefix=`$ECHO $CYGWIN_ROOT_PATH | $GREP ^/cygdrive/` + if test "x$test_cygdrive_prefix" = x; then + as_fn_error $? "Your cygdrive prefix is not /cygdrive. This is currently not supported. Change with mount -c." "$LINENO" 5 + fi + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking msys release" >&5 +$as_echo_n "checking msys release... " >&6; } + MSYS_VERSION=`$UNAME -r` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSYS_VERSION" >&5 +$as_echo "$MSYS_VERSION" >&6; } + + WINDOWS_ENV_VENDOR='msys' + WINDOWS_ENV_VERSION="$MSYS_VERSION" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking msys root directory as unix-style path" >&5 +$as_echo_n "checking msys root directory as unix-style path... " >&6; } + # The cmd output ends with Windows line endings (CR/LF), the grep command will strip that away + MSYS_ROOT_PATH=`cd / ; cmd /c cd | grep ".*"` + + windows_path="$MSYS_ROOT_PATH" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + MSYS_ROOT_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'` + MSYS_ROOT_PATH="$unix_path" + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSYS_ROOT_PATH" >&5 +$as_echo "$MSYS_ROOT_PATH" >&6; } + WINDOWS_ENV_ROOT_PATH="$MSYS_ROOT_PATH" + else + as_fn_error $? "Unknown Windows environment. Neither cygwin nor msys was detected." "$LINENO" 5 + fi + + # Test if windows or unix (cygwin/msys) find is first in path. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking what kind of 'find' is first on the PATH" >&5 +$as_echo_n "checking what kind of 'find' is first on the PATH... " >&6; } + FIND_BINARY_OUTPUT=`find --version 2>&1` + if test "x`echo $FIND_BINARY_OUTPUT | $GREP GNU`" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unix style" >&5 +$as_echo "unix style" >&6; } + elif test "x`echo $FIND_BINARY_OUTPUT | $GREP FIND`" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Windows" >&5 +$as_echo "Windows" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools." >&5 +$as_echo "$as_me: Your path contains Windows tools (C:\Windows\system32) before your unix (cygwin or msys) tools." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: This will not work. Please correct and make sure /usr/bin (or similar) is first in path." >&5 +$as_echo "$as_me: This will not work. Please correct and make sure /usr/bin (or similar) is first in path." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unknown" >&5 +$as_echo "unknown" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: It seems that your find utility is non-standard." >&5 +$as_echo "$as_me: WARNING: It seems that your find utility is non-standard." >&2;} fi -done - done -IFS=$as_save_IFS -fi -fi -BDEPS_FTP=$ac_cv_prog_BDEPS_FTP -if test -n "$BDEPS_FTP"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_FTP" >&5 -$as_echo "$BDEPS_FTP" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + PATH_SEP=":" fi - test -n "$BDEPS_FTP" && break -done + +cd "$CURDIR" + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$SRC_ROOT" + 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 SRC_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of SRC_ROOT" "$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-stile (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 + SRC_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting SRC_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting SRC_ROOT to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$SRC_ROOT" + 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 + SRC_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting SRC_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting SRC_ROOT 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 posix platform. Hooray! :) + path="$SRC_ROOT" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of SRC_ROOT, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of SRC_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$CURDIR" + 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 CURDIR, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of CURDIR, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of CURDIR" "$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-stile (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 + CURDIR="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CURDIR to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting CURDIR to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$CURDIR" + 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 + CURDIR="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CURDIR to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting CURDIR 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 posix platform. Hooray! :) + path="$CURDIR" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of CURDIR, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CURDIR, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of CURDIR, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + +if test "x$OPENJDK_BUILD_OS" = "xsolaris"; then + # Add extra search paths on solaris for utilities like ar and as etc... + PATH="$PATH:/usr/ccs/bin:/usr/sfw/bin:/opt/csw/bin" +fi + +# You can force the sys-root if the sys-root encoded into the cross compiler tools +# is not correct. + +# Check whether --with-sys-root was given. +if test "${with_sys_root+set}" = set; then : + withval=$with_sys_root; +fi + + +if test "x$with_sys_root" != x; then + SYS_ROOT=$with_sys_root +else + SYS_ROOT=/ +fi -############################################################################### -# -# Determine OpenJDK variants, options and version numbers. -# -############################################################################### +# Check whether --with-tools-dir was given. +if test "${with_tools_dir+set}" = set; then : + withval=$with_tools_dir; TOOLS_DIR=$with_tools_dir +fi -# We need build & target for this. + + +# Check whether --with-devkit was given. +if test "${with_devkit+set}" = set; then : + withval=$with_devkit; + if test "x$with_sys_root" != x; then + as_fn_error $? "Cannot specify both --with-devkit and --with-sys-root at the same time" "$LINENO" 5 + fi + if test "x$with_tools_dir" != x; then + as_fn_error $? "Cannot specify both --with-devkit and --with-tools-dir at the same time" "$LINENO" 5 + fi + TOOLS_DIR=$with_devkit/bin + SYS_ROOT=$with_devkit/$host_alias/libc + +fi + + + + +# Setup default logging of stdout and stderr to build.log in the output root. +BUILD_LOG='$(OUTPUT_ROOT)/build.log' +BUILD_LOG_PREVIOUS='$(OUTPUT_ROOT)/build.log.old' +BUILD_LOG_WRAPPER='$(BASH) $(SRC_ROOT)/common/bin/logger.sh $(BUILD_LOG)' + + + + + +# These are needed to be able to create a configuration name (and thus the output directory) ############################################################################### # @@ -7969,8 +7378,8 @@ $as_echo "$JDK_VARIANT" >&6; } # ie normal interpreter and C1, only the serial GC, kernel jvmti etc # zero: no machine code interpreter, no compiler # zeroshark: zero interpreter and shark/llvm compiler backend -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which variants of the JVM that should be built" >&5 -$as_echo_n "checking which variants of the JVM that should be built... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking which variants of the JVM to build" >&5 +$as_echo_n "checking which variants of the JVM to build... " >&6; } # Check whether --with-jvm-variants was given. if test "${with_jvm_variants+set}" = set; then : @@ -8151,6 +7560,2761 @@ fi +# With basic setup done, call the custom early hook. + + +# To properly create a configuration name, we need to have the OpenJDK target +# and options (variants and debug level) parsed. + + + +# Check whether --with-conf-name was given. +if test "${with_conf_name+set}" = set; then : + withval=$with_conf_name; CONF_NAME=${with_conf_name} +fi + + +# Test from where we are running configure, in or outside of src root. +if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" || test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" || test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then + # We are running configure from the src root. + # Create a default ./build/target-variant-debuglevel output root. + if test "x${CONF_NAME}" = x; then + CONF_NAME="${OPENJDK_TARGET_OS}-${OPENJDK_TARGET_CPU}-${JDK_VARIANT}-${ANDED_JVM_VARIANTS}-${DEBUG_LEVEL}" + fi + OUTPUT_ROOT="$SRC_ROOT/build/${CONF_NAME}" + $MKDIR -p "$OUTPUT_ROOT" + if test ! -d "$OUTPUT_ROOT"; then + as_fn_error $? "Could not create build directory $OUTPUT_ROOT" "$LINENO" 5 + fi +else + # We are running configure from outside of the src dir. + # Then use the current directory as output dir! + # If configuration is situated in normal build directory, just use the build + # directory name as configuration name, otherwise use the complete path. + if test "x${CONF_NAME}" = x; then + CONF_NAME=`$ECHO $CURDIR | $SED -e "s!^${SRC_ROOT}/build/!!"` + fi + OUTPUT_ROOT="$CURDIR" + + # WARNING: This might be a bad thing to do. You need to be sure you want to + # have a configuration in this directory. Do some sanity checks! + + if test ! -e "$OUTPUT_ROOT/spec.gmk"; then + # If we have a spec.gmk, we have run here before and we are OK. Otherwise, check for + # other files + files_present=`$LS $OUTPUT_ROOT` + # Configure has already touched config.log and confdefs.h in the current dir when this check + # is performed. + filtered_files=`$ECHO "$files_present" | $SED -e 's/config.log//g' -e 's/confdefs.h//g' -e 's/ //g' \ + | $TR -d '\n'` + if test "x$filtered_files" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Current directory is $CURDIR." >&5 +$as_echo "$as_me: Current directory is $CURDIR." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Since this is not the source root, configure will output the configuration here" >&5 +$as_echo "$as_me: Since this is not the source root, configure will output the configuration here" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (as opposed to creating a configuration in /build/)." >&5 +$as_echo "$as_me: (as opposed to creating a configuration in /build/)." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: However, this directory is not empty. This is not allowed, since it could" >&5 +$as_echo "$as_me: However, this directory is not empty. This is not allowed, since it could" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: seriously mess up just about everything." >&5 +$as_echo "$as_me: seriously mess up just about everything." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Try 'cd $SRC_ROOT' and restart configure" >&5 +$as_echo "$as_me: Try 'cd $SRC_ROOT' and restart configure" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (or create a new empty directory and cd to it)." >&5 +$as_echo "$as_me: (or create a new empty directory and cd to it)." >&6;} + as_fn_error $? "Will not continue creating configuration in $CURDIR" "$LINENO" 5 + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking what configuration name to use" >&5 +$as_echo_n "checking what configuration name to use... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CONF_NAME" >&5 +$as_echo "$CONF_NAME" >&6; } + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$OUTPUT_ROOT" + 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 OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of OUTPUT_ROOT" "$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-stile (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 + OUTPUT_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting OUTPUT_ROOT to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$OUTPUT_ROOT" + 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 + OUTPUT_ROOT="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OUTPUT_ROOT to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting OUTPUT_ROOT 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 posix platform. Hooray! :) + path="$OUTPUT_ROOT" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of OUTPUT_ROOT, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of OUTPUT_ROOT, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + +SPEC=$OUTPUT_ROOT/spec.gmk + +CONF_NAME=$CONF_NAME + +OUTPUT_ROOT=$OUTPUT_ROOT + + +# Most of the probed defines are put into config.h +ac_config_headers="$ac_config_headers $OUTPUT_ROOT/config.h:$AUTOCONF_DIR/config.h.in" + +# The spec.gmk file contains all variables for the make system. +ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.gmk:$AUTOCONF_DIR/spec.gmk.in" + +# The hotspot-spec.gmk file contains legacy variables for the hotspot make system. +ac_config_files="$ac_config_files $OUTPUT_ROOT/hotspot-spec.gmk:$AUTOCONF_DIR/hotspot-spec.gmk.in" + +# The bootcycle-spec.gmk file contains support for boot cycle builds. +ac_config_files="$ac_config_files $OUTPUT_ROOT/bootcycle-spec.gmk:$AUTOCONF_DIR/bootcycle-spec.gmk.in" + +# The compare.sh is used to compare the build output to other builds. +ac_config_files="$ac_config_files $OUTPUT_ROOT/compare.sh:$AUTOCONF_DIR/compare.sh.in" + +# Spec.sh is currently used by compare-objects.sh +ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.sh:$AUTOCONF_DIR/spec.sh.in" + +# The generated Makefile knows where the spec.gmk is and where the source is. +# You can run make from the OUTPUT_ROOT, or from the top-level Makefile +# which will look for generated configurations +ac_config_files="$ac_config_files $OUTPUT_ROOT/Makefile:$AUTOCONF_DIR/Makefile.in" + + +# Save the arguments given to us +echo "$CONFIGURE_COMMAND_LINE" > $OUTPUT_ROOT/configure-arguments + + +# Must be done before we can call HELP_MSG_MISSING_DEPENDENCY. + + for ac_prog in apt-get yum 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 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PKGHANDLER+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PKGHANDLER"; then + ac_cv_prog_PKGHANDLER="$PKGHANDLER" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PKGHANDLER="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PKGHANDLER=$ac_cv_prog_PKGHANDLER +if test -n "$PKGHANDLER"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKGHANDLER" >&5 +$as_echo "$PKGHANDLER" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PKGHANDLER" && break +done + + + +# Setup tools that requires more complex handling, or that is not needed by the configure script. + + + # We need to find a recent version of GNU make. Especially on Solaris, this can be tricky. + if test "x$MAKE" != x; then + # User has supplied a make, test it. + if test ! -f "$MAKE"; then + as_fn_error $? "The specified make (by MAKE=$MAKE) is not found." "$LINENO" 5 + fi + + MAKE_CANDIDATE=""$MAKE"" + DESCRIPTION="user supplied MAKE=$MAKE" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + if test "x$FOUND_MAKE" = x; then + as_fn_error $? "The specified make (by MAKE=$MAKE) is not GNU make 3.81 or newer." "$LINENO" 5 + fi + else + # Try our hardest to locate a correct version of GNU make + for ac_prog in gmake +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_GMAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_GMAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_GMAKE="$CHECK_GMAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_GMAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_GMAKE=$ac_cv_path_CHECK_GMAKE +if test -n "$CHECK_GMAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_GMAKE" >&5 +$as_echo "$CHECK_GMAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_GMAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_GMAKE"" + DESCRIPTION="gmake in PATH" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + + if test "x$FOUND_MAKE" = x; then + for ac_prog in make +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_MAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_MAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_MAKE="$CHECK_MAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_MAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_MAKE=$ac_cv_path_CHECK_MAKE +if test -n "$CHECK_MAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_MAKE" >&5 +$as_echo "$CHECK_MAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_MAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_MAKE"" + DESCRIPTION="make in PATH" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + fi + + if test "x$FOUND_MAKE" = x; then + if test "x$TOOLS_DIR" != x; then + # We have a tools-dir, check that as well before giving up. + OLD_PATH=$PATH + PATH=$TOOLS_DIR:$PATH + for ac_prog in gmake +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_TOOLSDIR_GMAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_TOOLSDIR_GMAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_TOOLSDIR_GMAKE="$CHECK_TOOLSDIR_GMAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_TOOLSDIR_GMAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_TOOLSDIR_GMAKE=$ac_cv_path_CHECK_TOOLSDIR_GMAKE +if test -n "$CHECK_TOOLSDIR_GMAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_GMAKE" >&5 +$as_echo "$CHECK_TOOLSDIR_GMAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_TOOLSDIR_GMAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_TOOLSDIR_GMAKE"" + DESCRIPTION="gmake in tools-dir" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + if test "x$FOUND_MAKE" = x; then + for ac_prog in make +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_CHECK_TOOLSDIR_MAKE+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $CHECK_TOOLSDIR_MAKE in + [\\/]* | ?:[\\/]*) + ac_cv_path_CHECK_TOOLSDIR_MAKE="$CHECK_TOOLSDIR_MAKE" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_CHECK_TOOLSDIR_MAKE="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +CHECK_TOOLSDIR_MAKE=$ac_cv_path_CHECK_TOOLSDIR_MAKE +if test -n "$CHECK_TOOLSDIR_MAKE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CHECK_TOOLSDIR_MAKE" >&5 +$as_echo "$CHECK_TOOLSDIR_MAKE" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CHECK_TOOLSDIR_MAKE" && break +done + + + MAKE_CANDIDATE=""$CHECK_TOOLSDIR_MAKE"" + DESCRIPTION="make in tools-dir" + if test "x$MAKE_CANDIDATE" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&5 +$as_echo "$as_me: Testing potential make at $MAKE_CANDIDATE, found using $DESCRIPTION" >&6;} + MAKE_VERSION_STRING=`$MAKE_CANDIDATE --version | $HEAD -n 1` + IS_GNU_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP 'GNU Make'` + if test "x$IS_GNU_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&5 +$as_echo "$as_me: Found potential make at $MAKE_CANDIDATE, however, this is not GNU Make. Ignoring." >&6;} + else + IS_MODERN_MAKE=`$ECHO $MAKE_VERSION_STRING | $GREP '3.8[12346789]'` + if test "x$IS_MODERN_MAKE" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&5 +$as_echo "$as_me: Found GNU make at $MAKE_CANDIDATE, however this is not version 3.81 or later. (it is: $MAKE_VERSION_STRING). Ignoring." >&6;} + else + if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + MAKE_EXPECTED_ENV='cygwin' + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + MAKE_EXPECTED_ENV='msys' + else + as_fn_error $? "Unknown Windows environment" "$LINENO" 5 + fi + MAKE_BUILT_FOR=`$MAKE_CANDIDATE --version | $GREP -i 'built for'` + IS_MAKE_CORRECT_ENV=`$ECHO $MAKE_BUILT_FOR | $GREP $MAKE_EXPECTED_ENV` + else + # Not relevant for non-Windows + IS_MAKE_CORRECT_ENV=true + fi + if test "x$IS_MAKE_CORRECT_ENV" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&5 +$as_echo "$as_me: Found GNU make version $MAKE_VERSION_STRING at $MAKE_CANDIDATE, but it is not for $MAKE_EXPECTED_ENV (it says: $MAKE_BUILT_FOR). Ignoring." >&6;} + else + FOUND_MAKE=$MAKE_CANDIDATE + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$FOUND_MAKE" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving FOUND_MAKE (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of FOUND_MAKE, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of FOUND_MAKE" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + FOUND_MAKE="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FOUND_MAKE to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting FOUND_MAKE to \"$new_complete\"" >&6;} + fi + + fi + fi + fi + fi + + fi + PATH=$OLD_PATH + fi + fi + + if test "x$FOUND_MAKE" = x; then + as_fn_error $? "Cannot find GNU make 3.81 or newer! Please put it in the path, or add e.g. MAKE=/opt/gmake3.81/make as argument to configure." "$LINENO" 5 + fi + fi + + MAKE=$FOUND_MAKE + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&5 +$as_echo "$as_me: Using GNU make 3.81 (or later) at $FOUND_MAKE (version: $MAKE_VERSION_STRING)" >&6;} + + + + # Test if find supports -delete + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if find supports -delete" >&5 +$as_echo_n "checking if find supports -delete... " >&6; } + FIND_DELETE="-delete" + + DELETEDIR=`$MKTEMP -d tmp.XXXXXXXXXX` || (echo Could not create temporary directory!; exit $?) + + echo Hejsan > $DELETEDIR/TestIfFindSupportsDelete + + TEST_DELETE=`$FIND "$DELETEDIR" -name TestIfFindSupportsDelete $FIND_DELETE 2>&1` + if test -f $DELETEDIR/TestIfFindSupportsDelete; then + # No, it does not. + rm $DELETEDIR/TestIfFindSupportsDelete + FIND_DELETE="-exec rm \{\} \+" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + fi + rmdir $DELETEDIR + + + +# These tools might not be installed by default, +# need hint on how to install them. + + for ac_prog in unzip +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_UNZIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $UNZIP in + [\\/]* | ?:[\\/]*) + ac_cv_path_UNZIP="$UNZIP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_UNZIP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +UNZIP=$ac_cv_path_UNZIP +if test -n "$UNZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNZIP" >&5 +$as_echo "$UNZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$UNZIP" && break +done + + + if test "x$UNZIP" = x; then + if test "xunzip" = x; then + PROG_NAME=unzip + else + PROG_NAME=unzip + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + + for ac_prog in zip +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ZIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ZIP in + [\\/]* | ?:[\\/]*) + ac_cv_path_ZIP="$ZIP" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ZIP="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ZIP=$ac_cv_path_ZIP +if test -n "$ZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ZIP" >&5 +$as_echo "$ZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ZIP" && break +done + + + if test "x$ZIP" = x; then + if test "xzip" = x; then + PROG_NAME=zip + else + PROG_NAME=zip + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + + +# Non-required basic tools + +# Extract the first word of "ldd", so it can be a program name with args. +set dummy ldd; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_LDD+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $LDD in + [\\/]* | ?:[\\/]*) + ac_cv_path_LDD="$LDD" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_LDD="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +LDD=$ac_cv_path_LDD +if test -n "$LDD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LDD" >&5 +$as_echo "$LDD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$LDD" = "x"; then + # List shared lib dependencies is used for + # debug output and checking for forbidden dependencies. + # We can build without it. + LDD="true" +fi +# Extract the first word of "otool", so it can be a program name with args. +set dummy otool; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_OTOOL+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $OTOOL in + [\\/]* | ?:[\\/]*) + ac_cv_path_OTOOL="$OTOOL" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_OTOOL="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +OTOOL=$ac_cv_path_OTOOL +if test -n "$OTOOL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OTOOL" >&5 +$as_echo "$OTOOL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +if test "x$OTOOL" = "x"; then + OTOOL="true" +fi +for ac_prog in readelf greadelf +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_READELF+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $READELF in + [\\/]* | ?:[\\/]*) + ac_cv_path_READELF="$READELF" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_READELF="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +READELF=$ac_cv_path_READELF +if test -n "$READELF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READELF" >&5 +$as_echo "$READELF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$READELF" && break +done + +# Extract the first word of "hg", so it can be a program name with args. +set dummy hg; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_HG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $HG in + [\\/]* | ?:[\\/]*) + ac_cv_path_HG="$HG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_HG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +HG=$ac_cv_path_HG +if test -n "$HG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $HG" >&5 +$as_echo "$HG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "stat", so it can be a program name with args. +set dummy stat; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_STAT+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $STAT in + [\\/]* | ?:[\\/]*) + ac_cv_path_STAT="$STAT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_STAT="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +STAT=$ac_cv_path_STAT +if test -n "$STAT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STAT" >&5 +$as_echo "$STAT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +# Extract the first word of "time", so it can be a program name with args. +set dummy time; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_TIME+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $TIME in + [\\/]* | ?:[\\/]*) + ac_cv_path_TIME="$TIME" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_TIME="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +TIME=$ac_cv_path_TIME +if test -n "$TIME"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TIME" >&5 +$as_echo "$TIME" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + + for ac_prog in comm +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_COMM+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $COMM in + [\\/]* | ?:[\\/]*) + ac_cv_path_COMM="$COMM" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_COMM="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +COMM=$ac_cv_path_COMM +if test -n "$COMM"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $COMM" >&5 +$as_echo "$COMM" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$COMM" && break +done + + + if test "x$COMM" = x; then + if test "xcomm" = x; then + PROG_NAME=comm + else + PROG_NAME=comm + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find $PROG_NAME!" >&5 +$as_echo "$as_me: Could not find $PROG_NAME!" >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + +fi + + +# Check if pkg-config is available. + + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +PKG_CONFIG=$ac_cv_path_PKG_CONFIG +if test -n "$PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +$as_echo "$PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_path_PKG_CONFIG"; then + ac_pt_PKG_CONFIG=$PKG_CONFIG + # Extract the first word of "pkg-config", so it can be a program name with args. +set dummy pkg-config; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $ac_pt_PKG_CONFIG in + [\\/]* | ?:[\\/]*) + ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +if test -n "$ac_pt_PKG_CONFIG"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +$as_echo "$ac_pt_PKG_CONFIG" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_pt_PKG_CONFIG" = x; then + PKG_CONFIG="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PKG_CONFIG=$ac_pt_PKG_CONFIG + fi +else + PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +fi + +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=0.9.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + PKG_CONFIG="" + fi + +fi + +# After basic tools have been setup, we can check build os specific details. + +############################################################################### + +# Note that this is the build platform OS version! + +OS_VERSION="`uname -r | ${SED} 's!\.! !g' | ${SED} 's!-! !g'`" +OS_VERSION_MAJOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 1 -d ' '`" +OS_VERSION_MINOR="`${ECHO} ${OS_VERSION} | ${CUT} -f 2 -d ' '`" +OS_VERSION_MICRO="`${ECHO} ${OS_VERSION} | ${CUT} -f 3 -d ' '`" + + + + + +# Setup builddeps, for automatic downloading of tools we need. +# This is needed before we can call BDEPS_CHECK_MODULE, which is done in +# boot-jdk setup, but we need to have basic tools setup first. + + +# Check whether --with-builddeps-conf was given. +if test "${with_builddeps_conf+set}" = set; then : + withval=$with_builddeps_conf; +fi + + + +# Check whether --with-builddeps-server was given. +if test "${with_builddeps_server+set}" = set; then : + withval=$with_builddeps_server; +fi + + + +# Check whether --with-builddeps-dir was given. +if test "${with_builddeps_dir+set}" = set; then : + withval=$with_builddeps_dir; +else + with_builddeps_dir=/localhome/builddeps +fi + + + +# Check whether --with-builddeps-group was given. +if test "${with_builddeps_group+set}" = set; then : + withval=$with_builddeps_group; +fi + + + + + if test "x$with_builddeps_server" != x || test "x$with_builddeps_conf" != x; then + if test "x$with_builddeps_conf" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for supplied builddeps configuration file" >&5 +$as_echo_n "checking for supplied builddeps configuration file... " >&6; } + builddepsfile=$with_builddeps_conf + if test -s $builddepsfile; then + . $builddepsfile + { $as_echo "$as_me:${as_lineno-$LINENO}: result: loaded!" >&5 +$as_echo "loaded!" >&6; } + else + as_fn_error $? "The given builddeps conf file $with_builddeps_conf could not be loaded!" "$LINENO" 5 + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for builddeps.conf files in sources..." >&5 +$as_echo_n "checking for builddeps.conf files in sources...... " >&6; } + builddepsfile=`mktemp` + touch $builddepsfile + # Put all found confs into a single file. + find ${SRC_ROOT} -name builddeps.conf -exec cat \{\} \; >> $builddepsfile + # Source the file to acquire the variables + if test -s $builddepsfile; then + . $builddepsfile + { $as_echo "$as_me:${as_lineno-$LINENO}: result: found at least one!" >&5 +$as_echo "found at least one!" >&6; } + else + as_fn_error $? "Could not find any builddeps.conf at all!" "$LINENO" 5 + fi + fi + # Create build and target names that use _ instead of "-" and ".". + # This is necessary to use them in variable names. + build_var=`echo ${OPENJDK_BUILD_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` + target_var=`echo ${OPENJDK_TARGET_AUTOCONF_NAME} | tr '-' '_' | tr '.' '_'` + # Extract rewrite information for build and target + eval rewritten_build=\${REWRITE_${build_var}} + if test "x$rewritten_build" = x; then + rewritten_build=${OPENJDK_BUILD_AUTOCONF_NAME} + echo Build stays the same $rewritten_build + else + echo Rewriting build for builddeps into $rewritten_build + fi + eval rewritten_target=\${REWRITE_${target_var}} + if test "x$rewritten_target" = x; then + rewritten_target=${OPENJDK_TARGET_AUTOCONF_NAME} + echo Target stays the same $rewritten_target + else + echo Rewriting target for builddeps into $rewritten_target + fi + rewritten_build_var=`echo ${rewritten_build} | tr '-' '_' | tr '.' '_'` + rewritten_target_var=`echo ${rewritten_target} | tr '-' '_' | tr '.' '_'` + fi + for ac_prog in 7z unzip +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_BDEPS_UNZIP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$BDEPS_UNZIP"; then + ac_cv_prog_BDEPS_UNZIP="$BDEPS_UNZIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_BDEPS_UNZIP="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +BDEPS_UNZIP=$ac_cv_prog_BDEPS_UNZIP +if test -n "$BDEPS_UNZIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_UNZIP" >&5 +$as_echo "$BDEPS_UNZIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$BDEPS_UNZIP" && break +done + + if test "x$BDEPS_UNZIP" = x7z; then + BDEPS_UNZIP="7z x" + fi + + for ac_prog in wget lftp ftp +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_BDEPS_FTP+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$BDEPS_FTP"; then + ac_cv_prog_BDEPS_FTP="$BDEPS_FTP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_BDEPS_FTP="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +BDEPS_FTP=$ac_cv_prog_BDEPS_FTP +if test -n "$BDEPS_FTP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BDEPS_FTP" >&5 +$as_echo "$BDEPS_FTP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$BDEPS_FTP" && break +done + + + +############################################################################### +# +# Determine OpenJDK variants, options and version numbers. +# +############################################################################### + +# We need build & target for this. + ############################################################################### # @@ -8159,44 +10323,47 @@ fi # Check whether --enable-openjdk-only was given. if test "${enable_openjdk_only+set}" = set; then : enableval=$enable_openjdk_only; +else + enable_openjdk_only="no" fi -if test "x$enable_openjdk_only" = "xyes"; then - OPENJDK=true -elif test "x$enable_openjdk_only" = "xno"; then - OPENJDK=false -elif test -d "$SRC_ROOT/jdk/src/closed"; then - OPENJDK=false +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for presence of closed sources" >&5 +$as_echo_n "checking for presence of closed sources... " >&6; } +if test -d "$SRC_ROOT/jdk/src/closed"; then + CLOSED_SOURCE_PRESENT=yes else + CLOSED_SOURCE_PRESENT=no +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $CLOSED_SOURCE_PRESENT" >&5 +$as_echo "$CLOSED_SOURCE_PRESENT" >&6; } + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if closed source is supressed (openjdk-only)" >&5 +$as_echo_n "checking if closed source is supressed (openjdk-only)... " >&6; } +SUPRESS_CLOSED_SOURCE="$enable_openjdk_only" +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $SUPRESS_CLOSED_SOURCE" >&5 +$as_echo "$SUPRESS_CLOSED_SOURCE" >&6; } + +if test "x$CLOSED_SOURCE_PRESENT" = xno; then + OPENJDK=true + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: No closed source present, --enable-openjdk-only makes no sense" >&5 +$as_echo "$as_me: WARNING: No closed source present, --enable-openjdk-only makes no sense" >&2;} + fi +else + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then OPENJDK=true + else + OPENJDK=false + fi fi if test "x$OPENJDK" = "xtrue"; then - SET_OPENJDK=OPENJDK=true + SET_OPENJDK="OPENJDK=true" fi -############################################################################### -# -# JIGSAW or not. The JIGSAW variable is used during the intermediate -# stage when we are building both the old style JDK and the new style modularized JDK. -# When the modularized JDK is finalized, this option will go away. -# -# Check whether --enable-jigsaw was given. -if test "${enable_jigsaw+set}" = set; then : - enableval=$enable_jigsaw; -fi - - -if test "x$enable_jigsaw" = "xyes"; then - JIGSAW=true -else - JIGSAW=false -fi - - ############################################################################### # # Should we build a JDK/JVM with headful support (ie a graphical ui)? @@ -8233,28 +10400,6 @@ $as_echo "$headful_msg" >&6; } -############################################################################### -# -# Should we compile nimbus swing L&F? We can probably remove this option -# since nimbus is officially part of javax now. -# -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build nimbus L&F" >&5 -$as_echo_n "checking whether to build nimbus L&F... " >&6; } -# Check whether --enable-nimbus was given. -if test "${enable_nimbus+set}" = set; then : - enableval=$enable_nimbus; ENABLE_NIMBUS="${enableval}" -else - ENABLE_NIMBUS='yes' -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ENABLE_NIMBUS" >&5 -$as_echo "$ENABLE_NIMBUS" >&6; } -DISABLE_NIMBUS= -if test "x$ENABLE_NIMBUS" = xno; then - DISABLE_NIMBUS=true -fi - - # Control wether Hotspot runs Queens test after build. # Check whether --enable-hotspot-test-in-build was given. if test "${enable_hotspot_test_in_build+set}" = set; then : @@ -8293,45 +10438,27 @@ fi ############################################################################### # -# Compress jars +# Enable or disable unlimited crypto # -COMPRESS_JARS=false +# Check whether --enable-unlimited-crypto was given. +if test "${enable_unlimited_crypto+set}" = set; then : + enableval=$enable_unlimited_crypto; +else + enable_unlimited_crypto=no +fi +if test "x$enable_unlimited_crypto" = "xyes"; then + UNLIMITED_CRYPTO=true +else + UNLIMITED_CRYPTO=false +fi ############################################################################### # -# Should we compile JFR -# default no, except for on closed-jdk +# Compress jars # -ENABLE_JFR=no - -# Is the JFR source present - -# -# For closed default is yes -# -if test "x${OPENJDK}" != "xtrue"; then - ENABLE_JFR=yes -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to build jfr" >&5 -$as_echo_n "checking whether to build jfr... " >&6; } -# Check whether --enable-jfr was given. -if test "${enable_jfr+set}" = set; then : - enableval=$enable_jfr; -fi - -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: ${ENABLE_JFR}" >&5 -$as_echo "${ENABLE_JFR}" >&6; } - -if test "x$ENABLE_JFR" = "xyes"; then - ENABLE_JFR=true -elif test "x$ENABLE_JFR" = "xno"; then - ENABLE_JFR=false -else - as_fn_error $? "Invalid argument to --enable-jfr" "$LINENO" 5 -fi +COMPRESS_JARS=false @@ -8354,6 +10481,8 @@ fi + + COPYRIGHT_YEAR=`date +'%Y'` @@ -8381,7 +10510,7 @@ else BUILD_DATE=`date '+%Y_%m_%d_%H_%M'` # Avoid [:alnum:] since it depends on the locale. CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyz0123456789'` - USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` + USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FULL_VERSION="${RELEASE}-${USER_RELEASE_SUFFIX}-${JDK_BUILD_NUMBER}" fi @@ -8389,93 +10518,6 @@ COOKED_BUILD_NUMBER=`$ECHO $JDK_BUILD_NUMBER | $SED -e 's/^b//' -e 's/^0//'` -# To properly create a configuration name, we need to have the OpenJDK target -# and options (variants and debug level) parsed. - - - -# Check whether --with-conf-name was given. -if test "${with_conf_name+set}" = set; then : - withval=$with_conf_name; CONF_NAME=${with_conf_name} -fi - - -# Test from where we are running configure, in or outside of src root. -if test "x$CURDIR" = "x$SRC_ROOT" || test "x$CURDIR" = "x$SRC_ROOT/common" || test "x$CURDIR" = "x$SRC_ROOT/common/autoconf" || test "x$CURDIR" = "x$SRC_ROOT/common/makefiles" ; then - # We are running configure from the src root. - # Create a default ./build/target-variant-debuglevel output root. - if test "x${CONF_NAME}" = x; then - CONF_NAME="${OPENJDK_TARGET_OS}-${OPENJDK_TARGET_CPU}-${JDK_VARIANT}-${ANDED_JVM_VARIANTS}-${DEBUG_LEVEL}" - fi - OUTPUT_ROOT="$SRC_ROOT/build/${CONF_NAME}" - mkdir -p "$OUTPUT_ROOT" - if test ! -d "$OUTPUT_ROOT"; then - as_fn_error $? "Could not create build directory $OUTPUT_ROOT" "$LINENO" 5 - fi -else - # We are running configure from outside of the src dir. - # Then use the current directory as output dir! - # If configuration is situated in normal build directory, just use the build - # directory name as configuration name, otherwise use the complete path. - if test "x${CONF_NAME}" = x; then - CONF_NAME=`$ECHO $CURDIR | $SED -e "s!^${SRC_ROOT}/build/!!"` - fi - OUTPUT_ROOT="$CURDIR" -fi - - - # Fail with message the path to the output root if var OUTPUT_ROOT contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$OUTPUT_ROOT" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - OUTPUT_ROOT=`$CYGPATH -s -m -a "$OUTPUT_ROOT"` - # Now it's case insensitive; let's make it lowercase to improve readability - OUTPUT_ROOT=`$ECHO "$OUTPUT_ROOT" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - OUTPUT_ROOT=`$CYGPATH -u "$OUTPUT_ROOT"` - else - as_fn_error $? "You cannot have spaces in the path to the output root! \"$OUTPUT_ROOT\"" "$LINENO" 5 - fi - fi - - -SPEC=$OUTPUT_ROOT/spec.gmk - -CONF_NAME=$CONF_NAME - -OUTPUT_ROOT=$OUTPUT_ROOT - - -# Most of the probed defines are put into config.h -ac_config_headers="$ac_config_headers $OUTPUT_ROOT/config.h:$AUTOCONF_DIR/config.h.in" - -# The spec.gmk file contains all variables for the make system. -ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.gmk:$AUTOCONF_DIR/spec.gmk.in" - -# The hotspot-spec.gmk file contains legacy variables for the hotspot make system. -ac_config_files="$ac_config_files $OUTPUT_ROOT/hotspot-spec.gmk:$AUTOCONF_DIR/hotspot-spec.gmk.in" - -# The bootcycle-spec.gmk file contains support for boot cycle builds. -ac_config_files="$ac_config_files $OUTPUT_ROOT/bootcycle-spec.gmk:$AUTOCONF_DIR/bootcycle-spec.gmk.in" - -# The compare.sh is used to compare the build output to other builds. -ac_config_files="$ac_config_files $OUTPUT_ROOT/compare.sh:$AUTOCONF_DIR/compare.sh.in" - -# Spec.sh is currently used by compare-objects.sh -ac_config_files="$ac_config_files $OUTPUT_ROOT/spec.sh:$AUTOCONF_DIR/spec.sh.in" - -# The generated Makefile knows where the spec.gmk is and where the source is. -# You can run make from the OUTPUT_ROOT, or from the top-level Makefile -# which will look for generated configurations -ac_config_files="$ac_config_files $OUTPUT_ROOT/Makefile:$AUTOCONF_DIR/Makefile.in" - - -# Save the arguments given to us -echo "$CONFIGURE_COMMAND_LINE" > $OUTPUT_ROOT/configure-arguments - - ############################################################################### # # Setup BootJDK, used to bootstrap the build. @@ -8546,26 +10588,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -8768,26 +10917,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -8802,12 +11058,126 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$JAVA_HOME" != x; then - if test "x$OPENJDK_TARGET_OS" = xwindows; then - # On Windows, JAVA_HOME is likely in DOS-style - JAVA_HOME_PROCESSED="`$CYGPATH -u "$JAVA_HOME"`" - else - JAVA_HOME_PROCESSED="$JAVA_HOME" - fi + JAVA_HOME_PROCESSED="$JAVA_HOME" + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$JAVA_HOME_PROCESSED" + 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 JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of JAVA_HOME_PROCESSED" "$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-stile (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 + JAVA_HOME_PROCESSED="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$JAVA_HOME_PROCESSED" + 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 + JAVA_HOME_PROCESSED="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting JAVA_HOME_PROCESSED to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting JAVA_HOME_PROCESSED 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 posix platform. Hooray! :) + path="$JAVA_HOME_PROCESSED" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of JAVA_HOME_PROCESSED, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + if test ! -d "$JAVA_HOME_PROCESSED"; then { $as_echo "$as_me:${as_lineno-$LINENO}: Your JAVA_HOME points to a non-existing directory!" >&5 $as_echo "$as_me: Your JAVA_HOME points to a non-existing directory!" >&6;} @@ -8859,26 +11229,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -8937,26 +11414,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9060,75 +11644,14 @@ fi # Linux/GNU systems often have links from /usr/bin/java to # /etc/alternatives/java to the real JDK binary. - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$BINARY" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$BINARY"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - BINARY="$tmp" - - if test "x$OPENJDK_BUILD_OS" != xwindows; then # Follow a chain of symbolic links. Use readlink # where it exists, else fall back to horribly # complicated shell code. - # Extract the first word of "readlink", so it can be a program name with args. -set dummy readlink; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_READLINK+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $READLINK in - [\\/]* | ?:[\\/]*) - ac_cv_path_READLINK="$READLINK" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_READLINK="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -READLINK=$ac_cv_path_READLINK -if test -n "$READLINK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $READLINK" >&5 -$as_echo "$READLINK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$READLINK_TESTED" != yes; then # On MacOSX there is a readlink tool with a different # purpose than the GNU readlink tool. Check the found readlink. - ISGNU=`$READLINK --help 2>&1 | grep GNU` + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` if test "x$ISGNU" = x; then # A readlink that we do not know how to use. # Are there other non-GNU readlinks out there? @@ -9142,23 +11665,25 @@ fi else STARTDIR=$PWD COUNTER=0 - DIR=`dirname $BINARY` - FIL=`basename $BINARY` + sym_link_dir=`$DIRNAME $BINARY` + sym_link_file=`$BASENAME $BINARY` while test $COUNTER -lt 20; do - ISLINK=`ls -l $DIR/$FIL | grep '\->' | sed -e 's/.*-> \(.*\)/\1/'` + ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` if test "x$ISLINK" == x; then # This is not a symbolic link! We are done! break fi # The link might be relative! We have to use cd to travel safely. - cd $DIR - cd `dirname $ISLINK` - DIR=`pwd` - FIL=`basename $ISLINK` + cd $sym_link_dir + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + sym_link_dir=`$THEPWDCMD` + sym_link_file=`$BASENAME $ISLINK` let COUNTER=COUNTER+1 done cd $STARTDIR - BINARY=$DIR/$FIL + BINARY=$sym_link_dir/$sym_link_file fi fi @@ -9210,26 +11735,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9249,19 +11881,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$ProgramW6432" != x; then + VIRTUAL_DIR="$ProgramW6432/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$ProgramW6432"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$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'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9302,26 +12124,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9334,19 +12263,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$PROGRAMW6432" != x; then + VIRTUAL_DIR="$PROGRAMW6432/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$PROGRAMW6432"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$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'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9387,26 +12506,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9419,19 +12645,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$PROGRAMFILES" != x; then + VIRTUAL_DIR="$PROGRAMFILES/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$PROGRAMFILES"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$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'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9472,26 +12888,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9504,19 +13027,209 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } # Now execute the test if test "x$ProgramFiles" != x; then + VIRTUAL_DIR="$ProgramFiles/Java" - BOOT_JDK_PREFIX="`$CYGPATH -u "$ProgramFiles"`/Java" + windows_path="$VIRTUAL_DIR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VIRTUAL_DIR="$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'` + VIRTUAL_DIR="$unix_path" + fi + + + BOOT_JDK_PREFIX="$VIRTUAL_DIR" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + fi @@ -9557,26 +13270,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9590,16 +13410,195 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } BOOT_JDK_PREFIX="/cygdrive/c/Program Files/Java" BOOT_JDK_SUFFIX="" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. if test "x$BOOT_JDK_FOUND" = xmaybe; then @@ -9638,26 +13637,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9672,16 +13778,195 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } BOOT_JDK_PREFIX="/Library/Java/JavaVirtualMachines" BOOT_JDK_SUFFIX="/Contents/Home" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. if test "x$BOOT_JDK_FOUND" = xmaybe; then @@ -9720,26 +14005,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9753,16 +14145,195 @@ $as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } BOOT_JDK_PREFIX="/System/Library/Java/JavaVirtualMachines" BOOT_JDK_SUFFIX="/Contents/Home" - BEST_JDK_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $GREP jdk | $SORT -r | $HEAD -n 1 ` - if test "x$BEST_JDK_FOUND" != x; then - BOOT_JDK="${BOOT_JDK_PREFIX}/${BEST_JDK_FOUND}${BOOT_JDK_SUFFIX}" - if test -d "$BOOT_JDK"; then - BOOT_JDK_FOUND=maybe - { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&5 -$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX)" >&6;} + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. if test "x$BOOT_JDK_FOUND" = xmaybe; then @@ -9801,26 +14372,501 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + elif test "x$OPENJDK_TARGET_OS" = xlinux; then + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK_PREFIX="/usr/lib/jvm" + BOOT_JDK_SUFFIX="" + ALL_JDKS_FOUND=`$LS "$BOOT_JDK_PREFIX" 2> /dev/null | $SORT -r` + if test "x$ALL_JDKS_FOUND" != x; then + for JDK_TO_TRY in $ALL_JDKS_FOUND ; do + + if test "x$BOOT_JDK_FOUND" = xno; then + # Now execute the test + + BOOT_JDK="${BOOT_JDK_PREFIX}/${JDK_TO_TRY}${BOOT_JDK_SUFFIX}" + if test -d "$BOOT_JDK"; then + BOOT_JDK_FOUND=maybe + { $as_echo "$as_me:${as_lineno-$LINENO}: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&5 +$as_echo "$as_me: Found potential Boot JDK using well-known locations (in $BOOT_JDK_PREFIX/$JDK_TO_TRY)" >&6;} + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } + fi # end check jdk version + fi # end check rt.jar + fi # end check javac + fi # end check java + fi # end check boot jdk found + fi + + done + fi + + + # If previous step claimed to have found a JDK, check it to see if it seems to be valid. + if test "x$BOOT_JDK_FOUND" = xmaybe; then + # Do we have a bin/java? + if test ! -x "$BOOT_JDK/bin/java"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/java; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have a bin/javac? + if test ! -x "$BOOT_JDK/bin/javac"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain bin/javac; ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (This might be an JRE instead of an JDK)" >&5 +$as_echo "$as_me: (This might be an JRE instead of an JDK)" >&6;} + BOOT_JDK_FOUND=no + else + # Do we have an rt.jar? (On MacOSX it is called classes.jar) + if test ! -f "$BOOT_JDK/jre/lib/rt.jar" && test ! -f "$BOOT_JDK/../Classes/classes.jar"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK did not contain an rt.jar; ignoring" >&6;} + BOOT_JDK_FOUND=no + else + # Oh, this is looking good! We probably have found a proper JDK. Is it the correct version? + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | head -n 1` + + # Extra M4 quote needed to protect [] in grep expression. + FOUND_VERSION_78=`echo $BOOT_JDK_VERSION | grep '\"1\.[78]\.'` + if test "x$FOUND_VERSION_78" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&5 +$as_echo "$as_me: Potential Boot JDK found at $BOOT_JDK is incorrect JDK version ($BOOT_JDK_VERSION); ignoring" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: (Your Boot JDK must be version 7 or 8)" >&5 +$as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} + BOOT_JDK_FOUND=no + else + # We're done! :-) + BOOT_JDK_FOUND=yes + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 +$as_echo_n "checking for Boot JDK... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -9868,26 +14914,133 @@ $as_echo "$as_me: (Your Boot JDK must be version 7 or 8)" >&6;} # We're done! :-) BOOT_JDK_FOUND=yes - # Fail with message the path to the Boot JDK if var BOOT_JDK contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$BOOT_JDK" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - BOOT_JDK=`$CYGPATH -s -m -a "$BOOT_JDK"` - # Now it's case insensitive; let's make it lowercase to improve readability - BOOT_JDK=`$ECHO "$BOOT_JDK" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - BOOT_JDK=`$CYGPATH -u "$BOOT_JDK"` - else - as_fn_error $? "You cannot have spaces in the path to the Boot JDK! \"$BOOT_JDK\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$BOOT_JDK" + 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 BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of BOOT_JDK" "$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-stile (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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$BOOT_JDK" + 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 + BOOT_JDK="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BOOT_JDK to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting BOOT_JDK 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 posix platform. Hooray! :) + path="$BOOT_JDK" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of BOOT_JDK, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of BOOT_JDK, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Boot JDK" >&5 $as_echo_n "checking for Boot JDK... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK ($BOOT_JDK_VERSION)" >&5 -$as_echo "$BOOT_JDK ($BOOT_JDK_VERSION)" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK" >&5 +$as_echo "$BOOT_JDK" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking Boot JDK version" >&5 +$as_echo_n "checking Boot JDK version... " >&6; } + BOOT_JDK_VERSION=`"$BOOT_JDK/bin/java" -version 2>&1 | $TR '\n\r' ' '` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BOOT_JDK_VERSION" >&5 +$as_echo "$BOOT_JDK_VERSION" >&6; } fi # end check jdk version fi # end check rt.jar fi # end check javac @@ -10465,16 +15618,13 @@ AR_OUT_OPTION='rcs$(SPACE)' +# Locate the actual tools +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then -# Check if the VS env variables were setup prior to running configure. -# If not, then find vcvarsall.bat and run it automatically, and integrate -# the set env variables into the spec file. -SETUPDEVENV="# No special vars" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # Store path to cygwin link.exe to help excluding it when searching for - # VS linker. - # Extract the first word of "link", so it can be a program name with args. + # Store path to cygwin link.exe to help excluding it when searching for + # VS linker. This must be done before changing the PATH when looking for VS. + # Extract the first word of "link", so it can be a program name with args. set dummy link; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } @@ -10514,6 +15664,7 @@ $as_echo "no" >&6; } fi + if test "x$CYGWIN_LINK" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the first found link.exe is actually the Cygwin link tool" >&5 $as_echo_n "checking if the first found link.exe is actually the Cygwin link tool... " >&6; } "$CYGWIN_LINK" --version > /dev/null @@ -10526,124 +15677,876 @@ $as_echo "no" >&6; } # This might be the VS linker. Don't exclude it later on. CYGWIN_LINK="" fi + fi - # If vcvarsall.bat has been run, then VCINSTALLDIR is set. - if test "x$VCINSTALLDIR" != x; then - # No further setup is needed. The build will happen from this kind - # of shell. - SETUPDEVENV="# This spec file expects that you are running bash from within a VS command prompt." - # Make sure to remind you, if you forget to run make from a cygwin bash shell - # that is spawned "bash -l" from a VS command prompt. - CHECK_FOR_VCINSTALLDIR=yes - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if you are running from within a VS command prompt" >&5 -$as_echo_n "checking if you are running from within a VS command prompt... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } + # First-hand choice is to locate and run the vsvars bat file. + + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILE="vc/bin/vcvars32.bat" + else + VCVARSFILE="vc/bin/amd64/vcvars64.bat" + fi + + VS_ENV_CMD="" + VS_ENV_ARGS="" + if test "x$with_toolsdir" != x; then + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$with_toolsdir/../.." + METHOD="--with-tools-dir" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$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'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + fi + + if test "x$with_toolsdir" != x && test "x$VS_ENV_CMD" = x; then + # Having specified an argument which is incorrect will produce an instant failure; + # we should not go on looking + { $as_echo "$as_me:${as_lineno-$LINENO}: The path given by --with-tools-dir does not contain a valid Visual Studio installation" >&5 +$as_echo "$as_me: The path given by --with-tools-dir does not contain a valid Visual Studio installation" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Please point to the VC/bin directory within the Visual Studio installation" >&5 +$as_echo "$as_me: Please point to the VC/bin directory within the Visual Studio installation" >&6;} + as_fn_error $? "Cannot locate a valid Visual Studio installation" "$LINENO" 5 + fi + + if test "x$ProgramW6432" != x; then + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$ProgramW6432/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$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'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + fi + if test "x$PROGRAMW6432" != x; then + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$PROGRAMW6432/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$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'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + fi + if test "x$PROGRAMFILES" != x; then + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$PROGRAMFILES/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$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'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + fi + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="C:/Program Files/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$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'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1/Bin" + METHOD="well-known name" + + windows_path="$WIN_SDK_BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + WIN_SDK_BASE="$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'` + WIN_SDK_BASE="$unix_path" + fi + + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&5 +$as_echo "$as_me: Found Windows SDK installation at $WIN_SDK_BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&5 +$as_echo "$as_me: Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS100COMNTOOLS" != x; then + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$VS100COMNTOOLS/../.." + METHOD="VS100COMNTOOLS variable" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$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'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + fi + if test "x$PROGRAMFILES" != x; then + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$PROGRAMFILES/Microsoft Visual Studio 10.0" + METHOD="well-known name" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$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'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + fi + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="C:/Program Files/Microsoft Visual Studio 10.0" + METHOD="well-known name" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$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'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS_ENV_CMD" = x; then + VS100BASE="C:/Program Files (x86)/Microsoft Visual Studio 10.0" + METHOD="well-known name" + + windows_path="$VS100BASE" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + unix_path=`$CYGPATH -u "$windows_path"` + VS100BASE="$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'` + VS100BASE="$unix_path" + fi + + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Found Visual Studio installation at $VS100BASE using $METHOD" >&5 +$as_echo "$as_me: Found Visual Studio installation at $VS100BASE using $METHOD" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&5 +$as_echo "$as_me: Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring" >&6;} + fi + fi + fi + + + if test "x$VS_ENV_CMD" != x; then + # We have found a Visual Studio environment on disk, let's extract variables from the vsvars bat file. + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$VS_ENV_CMD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" else - # Ah, we have not yet run vcvarsall.bat/vsvars32.bat/vsvars64.bat. Lets do that. First find it. - if test "x$VS100COMNTOOLS" != x; then - VARSBAT=`find "$VS100COMNTOOLS/../.." -name vcvarsall.bat` - SEARCH_ROOT="$VS100COMNTOOLS" - else - VARSBAT=`find "$PROGRAMFILES" -name vcvarsall.bat` - SEARCH_ROOT="$PROGRAMFILES" - fi - VCPATH=`dirname "$VARSBAT"` - VCPATH=`cygpath -w "$VCPATH"` - if test "x$VARSBAT" = x || test ! -d "$VCPATH"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can find the VS installation" >&5 -$as_echo_n "checking if we can find the VS installation... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Tried to find a VS installation using both $SEARCH_ROOT but failed. Please run \"c:\\cygwin\\bin\\bash.exe -l\" from a VS command prompt and then run configure/make from there." "$LINENO" 5 - fi - case "$OPENJDK_TARGET_CPU" in - x86) - VARSBAT_ARCH=x86 - ;; - x86_64) - VARSBAT_ARCH=amd64 - ;; - esac - # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat - cd $OUTPUT_ROOT - bash $SRC_ROOT/common/bin/extractvcvars.sh "$VARSBAT" "$VARSBAT_ARCH" - cd $CURDIR - if test ! -s $OUTPUT_ROOT/localdevenv.sh || test ! -s $OUTPUT_ROOT/localdevenv.gmk; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can extract the needed env variables" >&5 -$as_echo_n "checking if we can extract the needed env variables... " >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Could not succesfully extract the env variables needed for the VS setup. Please run \"c:\\cygwin\\bin\\bash.exe -l\" from a VS command prompt and then run configure/make from there." "$LINENO" 5 - fi - # Now set all paths and other env variables. This will allow the rest of - # the configure script to find and run the compiler in the proper way. - . $OUTPUT_ROOT/localdevenv.sh - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we can find the VS installation" >&5 -$as_echo_n "checking if we can find the VS installation... " >&6; } - if test "x$VCINSTALLDIR" != x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $VCINSTALLDIR" >&5 -$as_echo "$VCINSTALLDIR" >&6; } - else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - as_fn_error $? "Could not find VS installation. Please install. If you are sure you have installed VS, then please run \"c:\\cygwin\\bin\\bash.exe -l\" from a VS command prompt and then run configure/make from there." "$LINENO" 5 - fi - CHECK_FOR_VCINSTALLDIR=no - SETUPDEVENV="include $OUTPUT_ROOT/localdevenv.gmk" + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for msvcr100.dll" >&5 + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$VS_ENV_CMD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$VS_ENV_CMD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving VS_ENV_CMD (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving VS_ENV_CMD (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of VS_ENV_CMD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of VS_ENV_CMD" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + VS_ENV_CMD="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting VS_ENV_CMD to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting VS_ENV_CMD to \"$new_complete\"" >&6;} + fi + + + # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat + { $as_echo "$as_me:${as_lineno-$LINENO}: Trying to extract Visual Studio environment variables" >&5 +$as_echo "$as_me: Trying to extract Visual Studio environment variables" >&6;} + cd $OUTPUT_ROOT + # FIXME: The code betweeen ---- was inlined from a separate script and is not properly adapted + # to autoconf standards. + + #---- + + # Cannot use the VS10 setup script directly (since it only updates the DOS subshell environment) + # but calculate the difference in Cygwin environment before/after running it and then + # apply the diff. + + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + _vs10varsall=`cygpath -a -m -s "$VS_ENV_CMD"` + _dosvs10varsall=`cygpath -a -w -s $_vs10varsall` + _dosbash=`cygpath -a -w -s \`which bash\`.*` + else + _dosvs10varsall=`cmd //c echo $VS_ENV_CMD` + _dosbash=`cmd //c echo \`which bash\`` + fi + + # generate the set of exported vars before/after the vs10 setup + $ECHO "@echo off" > localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export0" >> localdevenvtmp.bat + $ECHO "call $_dosvs10varsall $VS_ENV_ARGS" >> localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export1" >> localdevenvtmp.bat + + # Now execute the newly created bat file. + # The | cat is to stop SetEnv.Cmd to mess with system colors on msys + cmd /c localdevenvtmp.bat | cat + + # apply the diff (less some non-vs10 vars named by "!") + $SORT localdevenvtmp.export0 | $GREP -v "!" > localdevenvtmp.export0.sort + $SORT localdevenvtmp.export1 | $GREP -v "!" > localdevenvtmp.export1.sort + $COMM -1 -3 localdevenvtmp.export0.sort localdevenvtmp.export1.sort > localdevenv.sh + + # cleanup + $RM localdevenvtmp* + #---- + cd $CURDIR + if test ! -s $OUTPUT_ROOT/localdevenv.sh; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: Could not succesfully extract the envionment variables needed for the VS setup." >&5 +$as_echo "$as_me: Could not succesfully extract the envionment variables needed for the VS setup." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 +$as_echo "$as_me: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 +$as_echo "$as_me: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + # Now set all paths and other env variables. This will allow the rest of + # the configure script to find and run the compiler in the proper way. + { $as_echo "$as_me:${as_lineno-$LINENO}: Setting extracted environment variables" >&5 +$as_echo "$as_me: Setting extracted environment variables" >&6;} + . $OUTPUT_ROOT/localdevenv.sh + else + # We did not find a vsvars bat file, let's hope we are run from a VS command prompt. + { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot locate a valid Visual Studio installation, checking current environment" >&5 +$as_echo "$as_me: Cannot locate a valid Visual Studio installation, checking current environment" >&6;} + fi + + # At this point, we should have corrent variables in the environment, or we can't continue. + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for Visual Studio variables" >&5 +$as_echo_n "checking for Visual Studio variables... " >&6; } + + if test "x$VCINSTALLDIR" != x || test "x$WindowsSDKDir" != x || test "x$WINDOWSSDKDIR" != x; then + if test "x$INCLUDE" = x || test "x$LIB" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: present but broken" >&5 +$as_echo "present but broken" >&6; } + as_fn_error $? "Your VC command prompt seems broken, INCLUDE and/or LIB is missing." "$LINENO" 5 + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + VS_INCLUDE="$INCLUDE" + VS_LIB="$LIB" + VS_PATH="$PATH" + + + + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 +$as_echo "not found" >&6; } + + if test "x$VS_ENV_CMD" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Cannot locate a valid Visual Studio or Windows SDK installation on disk," >&5 +$as_echo "$as_me: Cannot locate a valid Visual Studio or Windows SDK installation on disk," >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: nor is this script run from a Visual Studio command prompt." >&5 +$as_echo "$as_me: nor is this script run from a Visual Studio command prompt." >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Running the extraction script failed." >&5 +$as_echo "$as_me: Running the extraction script failed." >&6;} + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&5 +$as_echo "$as_me: Try setting --with-tools-dir to the VC/bin directory within the VS installation" >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&5 +$as_echo "$as_me: or run \"bash.exe -l\" from a VS command prompt and then run configure from there." >&6;} + as_fn_error $? "Cannot continue" "$LINENO" 5 + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for msvcr100.dll" >&5 $as_echo_n "checking for msvcr100.dll... " >&6; } -# Check whether --with-msvcr100dll was given. -if test "${with_msvcr100dll+set}" = set; then : - withval=$with_msvcr100dll; +# Check whether --with-msvcr-dll was given. +if test "${with_msvcr_dll+set}" = set; then : + withval=$with_msvcr_dll; fi - if test "x$with_msvcr100dll" != x; then - MSVCR100DLL="$with_msvcr100dll" - else - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x64 | head --lines 1` - else - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` - if test "x$MSVCR100DLL" = x; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | head --lines 1` - fi - fi + if test "x$with_msvcr_dll" != x; then + MSVCR_DLL="$with_msvcr_dll" + else + if test "x$VCINSTALLDIR" != x; then + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x64 | head --lines 1` + else + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` + if test "x$MSVCR_DLL" = x; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | head --lines 1` fi - if test "x$MSVCR100DLL" = x; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 + fi + if test "x$MSVCR_DLL" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR" >&5 +$as_echo "$as_me: msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR" >&6;} + else + { $as_echo "$as_me:${as_lineno-$LINENO}: Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR" >&5 +$as_echo "$as_me: Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR" >&6;} + fi + fi + if test "x$MSVCR_DLL" = x; then + if test -f "$SYSTEMROOT/system32/msvcr100.dll"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: msvcr100.dll found in $SYSTEMROOT/system32" >&5 +$as_echo "$as_me: msvcr100.dll found in $SYSTEMROOT/system32" >&6;} + MSVCR_DLL="$SYSTEMROOT/system32/msvcr100.dll" + fi + fi + fi + if test "x$MSVCR_DLL" = x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } - as_fn_error $? "Could not find msvcr100.dll !" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSVCR100DLL" >&5 -$as_echo "$MSVCR100DLL" >&6; } + as_fn_error $? "Could not find msvcr100.dll !" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MSVCR_DLL" >&5 +$as_echo "$MSVCR_DLL" >&6; } - # Fail with message the path to msvcr100.dll if var MSVCR100DLL contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$MSVCR100DLL" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - MSVCR100DLL=`$CYGPATH -s -m -a "$MSVCR100DLL"` - # Now it's case insensitive; let's make it lowercase to improve readability - MSVCR100DLL=`$ECHO "$MSVCR100DLL" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - MSVCR100DLL=`$CYGPATH -u "$MSVCR100DLL"` - else - as_fn_error $? "You cannot have spaces in the path to msvcr100.dll! \"$MSVCR100DLL\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$MSVCR_DLL" + 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 MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of MSVCR_DLL" "$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-stile (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 + MSVCR_DLL="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MSVCR_DLL to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting MSVCR_DLL to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$MSVCR_DLL" + 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 + MSVCR_DLL="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MSVCR_DLL to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting MSVCR_DLL 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 posix platform. Hooray! :) + path="$MSVCR_DLL" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of MSVCR_DLL, which resolves as \"$path\", is not found." "$LINENO" 5 fi + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of MSVCR_DLL, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 fi + fi + + fi - -# Locate the actual tools - # If --build AND --host is set, then the configure script will find any # cross compilation tools in the PATH. Cross compilation tools # follows the cross compilation standard where they are prefixed with ${host}. @@ -10707,47 +16610,259 @@ fi done - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$BUILD_CC" - car="${tmp%% *}" - tmp="$BUILD_CC EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_CC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving BUILD_CC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of BUILD_CC" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - BUILD_CC="$car ${cdr% *}" - else - BUILD_CC="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + BUILD_CC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_CC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting BUILD_CC to \"$new_complete\"" >&6;} + fi for ac_prog in cl CC g++ do @@ -10795,47 +16910,259 @@ fi done - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$BUILD_CXX" - car="${tmp%% *}" - tmp="$BUILD_CXX EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_CXX (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving BUILD_CXX (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of BUILD_CXX" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - BUILD_CXX="$car ${cdr% *}" - else - BUILD_CXX="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + BUILD_CXX="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_CXX to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting BUILD_CXX to \"$new_complete\"" >&6;} + fi # Extract the first word of "ld", so it can be a program name with args. set dummy ld; ac_word=$2 @@ -10878,47 +17205,259 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$BUILD_LD" - car="${tmp%% *}" - tmp="$BUILD_LD EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_LD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_LD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$BUILD_LD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving BUILD_LD (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving BUILD_LD (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of BUILD_LD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of BUILD_LD" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - BUILD_LD="$car ${cdr% *}" - else - BUILD_LD="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + BUILD_LD="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting BUILD_LD to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting BUILD_LD to \"$new_complete\"" >&6;} + fi fi @@ -11102,16 +17641,902 @@ if test "x$TOOLS_DIR" != x; then PATH=$TOOLS_DIR:$PATH fi + +### Locate C compiler (CC) + # gcc is almost always present, but on Windows we # prefer cl.exe and on Solaris we prefer CC. # Thus test for them in this order. +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for cc on MacOSX. + COMPILER_CHECK_LIST="cl gcc" +else + COMPILER_CHECK_LIST="cl cc gcc" +fi + + + COMPILER_NAME=C + + # Do a first initial attempt at searching the list of compiler names. + # AC_PATH_PROGS can't be run multiple times with the same variable, + # so create a new name for this run. + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_POTENTIAL_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $POTENTIAL_CC in + [\\/]* | ?:[\\/]*) + ac_cv_path_POTENTIAL_CC="$POTENTIAL_CC" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_POTENTIAL_CC="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +POTENTIAL_CC=$ac_cv_path_POTENTIAL_CC +if test -n "$POTENTIAL_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POTENTIAL_CC" >&5 +$as_echo "$POTENTIAL_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$POTENTIAL_CC" && break +done + + CC=$POTENTIAL_CC + + if test "x$$CC" = x; then + + # Print a helpful message on how to acquire the necessary build dependency. + # devkit is the help tag: freetyp2, cups, pulse, alsa etc + MISSING_DEPENDENCY=devkit + PKGHANDLER_COMMAND= + + case $PKGHANDLER in + apt-get) + apt_help $MISSING_DEPENDENCY ;; + yum) + yum_help $MISSING_DEPENDENCY ;; + port) + port_help $MISSING_DEPENDENCY ;; + pkgutil) + pkgutil_help $MISSING_DEPENDENCY ;; + pkgadd) + pkgadd_help $MISSING_DEPENDENCY ;; + * ) + break ;; + esac + + if test "x$PKGHANDLER_COMMAND" != x; then + HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." + fi + + as_fn_error $? "Could not find a $COMPILER_NAME compiler. $HELP_MSG" "$LINENO" 5 + fi + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CC" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CC to \"$new_complete\"" >&6;} + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CC" >&5 +$as_echo_n "checking resolved symbolic links for CC... " >&6; } + TEST_COMPILER="$CC" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + TEST_COMPILER=`$READLINK -f $TEST_COMPILER` + else + STARTDIR=$PWD + COUNTER=0 + sym_link_dir=`$DIRNAME $TEST_COMPILER` + sym_link_file=`$BASENAME $TEST_COMPILER` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $sym_link_dir + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + sym_link_dir=`$THEPWDCMD` + sym_link_file=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + TEST_COMPILER=$sym_link_dir/$sym_link_file + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 +$as_echo "$TEST_COMPILER" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CC is disguised ccache" >&5 +$as_echo_n "checking if CC is disguised ccache... " >&6; } + + COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` + if test "x$COMPILER_BASENAME" = "xccache"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 +$as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } + # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. + # We want to control ccache invocation ourselves, so ignore this cc and try + # searching again. + + # Remove the path to the fake ccache cc from the PATH + RETRY_COMPILER_SAVED_PATH="$PATH" + COMPILER_DIRNAME=`$DIRNAME $CC` + PATH="`$ECHO $PATH | $SED -e "s,$COMPILER_DIRNAME,,g" -e "s,::,:,g" -e "s,^:,,g"`" + + # Try again looking for our compiler + if test -n "$ac_tool_prefix"; then + for ac_prog in $COMPILER_CHECK_LIST + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PROPER_COMPILER_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PROPER_COMPILER_CC"; then + ac_cv_prog_PROPER_COMPILER_CC="$PROPER_COMPILER_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PROPER_COMPILER_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PROPER_COMPILER_CC=$ac_cv_prog_PROPER_COMPILER_CC +if test -n "$PROPER_COMPILER_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CC" >&5 +$as_echo "$PROPER_COMPILER_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PROPER_COMPILER_CC" && break + done +fi +if test -z "$PROPER_COMPILER_CC"; then + ac_ct_PROPER_COMPILER_CC=$PROPER_COMPILER_CC + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CC+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_PROPER_COMPILER_CC"; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CC="$ac_ct_PROPER_COMPILER_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_PROPER_COMPILER_CC=$ac_cv_prog_ac_ct_PROPER_COMPILER_CC +if test -n "$ac_ct_PROPER_COMPILER_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PROPER_COMPILER_CC" >&5 +$as_echo "$ac_ct_PROPER_COMPILER_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_PROPER_COMPILER_CC" && break +done + + if test "x$ac_ct_PROPER_COMPILER_CC" = x; then + PROPER_COMPILER_CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PROPER_COMPILER_CC=$ac_ct_PROPER_COMPILER_CC + fi +fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving PROPER_COMPILER_CC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving PROPER_COMPILER_CC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CC" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + PROPER_COMPILER_CC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting PROPER_COMPILER_CC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting PROPER_COMPILER_CC to \"$new_complete\"" >&6;} + fi + + PATH="$RETRY_COMPILER_SAVED_PATH" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for resolved symbolic links for CC" >&5 +$as_echo_n "checking for resolved symbolic links for CC... " >&6; } + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + PROPER_COMPILER_CC=`$READLINK -f $PROPER_COMPILER_CC` + else + STARTDIR=$PWD + COUNTER=0 + sym_link_dir=`$DIRNAME $PROPER_COMPILER_CC` + sym_link_file=`$BASENAME $PROPER_COMPILER_CC` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $sym_link_dir + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + sym_link_dir=`$THEPWDCMD` + sym_link_file=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + PROPER_COMPILER_CC=$sym_link_dir/$sym_link_file + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CC" >&5 +$as_echo "$PROPER_COMPILER_CC" >&6; } + CC="$PROPER_COMPILER_CC" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, keeping CC" >&5 +$as_echo "no, keeping CC" >&6; } + CC="$TEST_COMPILER" + fi + + COMPILER=$CC + COMPILER_NAME=$COMPILER_NAME + + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + # Make sure we use the Sun Studio compiler and not gcc on Solaris, which won't work + COMPILER_VERSION_TEST=`$COMPILER -V 2>&1 | $HEAD -n 1` + $ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&6;} + as_fn_error $? "Sun Studio compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + else + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 + COMPILER_VERSION_TEST=`$COMPILER 2>&1 | $HEAD -n 1` + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*Version \([1-9][0-9.]*\) .*/\1/p"` + COMPILER_VENDOR="Microsoft CL.EXE" + COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` + if test "x$OPENJDK_TARGET_CPU" = "xx86"; then + if test "x$COMPILER_CPU_TEST" != "x80x86"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." "$LINENO" 5 + fi + elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then + if test "x$COMPILER_CPU_TEST" != "xx64"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." "$LINENO" 5 + fi + fi + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. + $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;} + as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5 + fi + + # First line typically looks something like: + # gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \([1-9][0-9.]*\)/\1/p"` + COMPILER_VENDOR=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^\(.*\) [1-9][0-9.]*/\1/p"` + fi + # This sets CC_VERSION or CXX_VERSION. (This comment is a grep marker) + CC_VERSION="$COMPILER_VERSION" + # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) + CC_VENDOR="$COMPILER_VENDOR" + + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 +$as_echo "$as_me: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&6;} + + +# Now that we have resolved CC ourself, let autoconf have it's go at it ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then - for ac_prog in cl cc gcc + for ac_prog in $CC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 @@ -11155,7 +18580,7 @@ fi fi if test -z "$CC"; then ac_ct_CC=$CC - for ac_prog in cl cc gcc + for ac_prog in $CC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -11703,7 +19128,69 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test "x$CC" = x; then + +### Locate C++ compiler (CXX) + +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for CC on MacOSX. + COMPILER_CHECK_LIST="cl g++" +else + COMPILER_CHECK_LIST="cl CC g++" +fi + + COMPILER_NAME=C++ + + # Do a first initial attempt at searching the list of compiler names. + # AC_PATH_PROGS can't be run multiple times with the same variable, + # so create a new name for this run. + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_path_POTENTIAL_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + case $POTENTIAL_CXX in + [\\/]* | ?:[\\/]*) + ac_cv_path_POTENTIAL_CXX="$POTENTIAL_CXX" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_path_POTENTIAL_CXX="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + ;; +esac +fi +POTENTIAL_CXX=$ac_cv_path_POTENTIAL_CXX +if test -n "$POTENTIAL_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $POTENTIAL_CXX" >&5 +$as_echo "$POTENTIAL_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$POTENTIAL_CXX" && break +done + + CXX=$POTENTIAL_CXX + + if test "x$$CXX" = x; then # Print a helpful message on how to acquire the necessary build dependency. # devkit is the help tag: freetyp2, cups, pulse, alsa etc @@ -11729,56 +19216,803 @@ if test "x$CC" = x; then HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." fi - as_fn_error $? "Could not find a compiler. $HELP_MSG" "$LINENO" 5 -fi -if test "x$CC" = xcc && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # Do not use cc on MacOSX use gcc instead. - CC="gcc" -fi + as_fn_error $? "Could not find a $COMPILER_NAME compiler. $HELP_MSG" "$LINENO" 5 + fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CC" - car="${tmp%% *}" - tmp="$CC EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CXX (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CXX (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of CXX" "$LINENO" 5 + fi fi - car="$tmp" + fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CXX="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CXX to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CXX to \"$new_complete\"" >&6;} + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking resolved symbolic links for CXX" >&5 +$as_echo_n "checking resolved symbolic links for CXX... " >&6; } + TEST_COMPILER="$CXX" + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + TEST_COMPILER=`$READLINK -f $TEST_COMPILER` + else + STARTDIR=$PWD + COUNTER=0 + sym_link_dir=`$DIRNAME $TEST_COMPILER` + sym_link_file=`$BASENAME $TEST_COMPILER` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $sym_link_dir + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + sym_link_dir=`$THEPWDCMD` + sym_link_file=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + TEST_COMPILER=$sym_link_dir/$sym_link_file + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TEST_COMPILER" >&5 +$as_echo "$TEST_COMPILER" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if CXX is disguised ccache" >&5 +$as_echo_n "checking if CXX is disguised ccache... " >&6; } + + COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` + if test "x$COMPILER_BASENAME" = "xccache"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes, trying to find proper $COMPILER_NAME compiler" >&5 +$as_echo "yes, trying to find proper $COMPILER_NAME compiler" >&6; } + # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. + # We want to control ccache invocation ourselves, so ignore this cc and try + # searching again. + + # Remove the path to the fake ccache cc from the PATH + RETRY_COMPILER_SAVED_PATH="$PATH" + COMPILER_DIRNAME=`$DIRNAME $CXX` + PATH="`$ECHO $PATH | $SED -e "s,$COMPILER_DIRNAME,,g" -e "s,::,:,g" -e "s,^:,,g"`" + + # Try again looking for our compiler + if test -n "$ac_tool_prefix"; then + for ac_prog in $COMPILER_CHECK_LIST + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_PROPER_COMPILER_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$PROPER_COMPILER_CXX"; then + ac_cv_prog_PROPER_COMPILER_CXX="$PROPER_COMPILER_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_PROPER_COMPILER_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +PROPER_COMPILER_CXX=$ac_cv_prog_PROPER_COMPILER_CXX +if test -n "$PROPER_COMPILER_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CXX" >&5 +$as_echo "$PROPER_COMPILER_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$PROPER_COMPILER_CXX" && break + done +fi +if test -z "$PROPER_COMPILER_CXX"; then + ac_ct_PROPER_COMPILER_CXX=$PROPER_COMPILER_CXX + for ac_prog in $COMPILER_CHECK_LIST +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_PROPER_COMPILER_CXX+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_PROPER_COMPILER_CXX"; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CXX="$ac_ct_PROPER_COMPILER_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_PROPER_COMPILER_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_PROPER_COMPILER_CXX=$ac_cv_prog_ac_ct_PROPER_COMPILER_CXX +if test -n "$ac_ct_PROPER_COMPILER_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_PROPER_COMPILER_CXX" >&5 +$as_echo "$ac_ct_PROPER_COMPILER_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_PROPER_COMPILER_CXX" && break +done + + if test "x$ac_ct_PROPER_COMPILER_CXX" = x; then + PROPER_COMPILER_CXX="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + PROPER_COMPILER_CXX=$ac_ct_PROPER_COMPILER_CXX + fi +fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 fi - if test "x$cdr" != xEOL; then - CC="$car ${cdr% *}" + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$PROPER_COMPILER_CXX" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving PROPER_COMPILER_CXX (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving PROPER_COMPILER_CXX (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of PROPER_COMPILER_CXX, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of PROPER_COMPILER_CXX" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + PROPER_COMPILER_CXX="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting PROPER_COMPILER_CXX to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting PROPER_COMPILER_CXX to \"$new_complete\"" >&6;} + fi + + PATH="$RETRY_COMPILER_SAVED_PATH" + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for resolved symbolic links for CXX" >&5 +$as_echo_n "checking for resolved symbolic links for CXX... " >&6; } + + if test "x$OPENJDK_BUILD_OS" != xwindows; then + # Follow a chain of symbolic links. Use readlink + # where it exists, else fall back to horribly + # complicated shell code. + if test "x$READLINK_TESTED" != yes; then + # On MacOSX there is a readlink tool with a different + # purpose than the GNU readlink tool. Check the found readlink. + ISGNU=`$READLINK --help 2>&1 | $GREP GNU` + if test "x$ISGNU" = x; then + # A readlink that we do not know how to use. + # Are there other non-GNU readlinks out there? + READLINK_TESTED=yes + READLINK= + fi + fi + + if test "x$READLINK" != x; then + PROPER_COMPILER_CXX=`$READLINK -f $PROPER_COMPILER_CXX` + else + STARTDIR=$PWD + COUNTER=0 + sym_link_dir=`$DIRNAME $PROPER_COMPILER_CXX` + sym_link_file=`$BASENAME $PROPER_COMPILER_CXX` + while test $COUNTER -lt 20; do + ISLINK=`$LS -l $sym_link_dir/$sym_link_file | $GREP '\->' | $SED -e 's/.*-> \(.*\)/\1/'` + if test "x$ISLINK" == x; then + # This is not a symbolic link! We are done! + break + fi + # The link might be relative! We have to use cd to travel safely. + cd $sym_link_dir + # ... and we must get the to the absolute path, not one using symbolic links. + cd `pwd -P` + cd `$DIRNAME $ISLINK` + sym_link_dir=`$THEPWDCMD` + sym_link_file=`$BASENAME $ISLINK` + let COUNTER=COUNTER+1 + done + cd $STARTDIR + PROPER_COMPILER_CXX=$sym_link_dir/$sym_link_file + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PROPER_COMPILER_CXX" >&5 +$as_echo "$PROPER_COMPILER_CXX" >&6; } + CXX="$PROPER_COMPILER_CXX" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, keeping CXX" >&5 +$as_echo "no, keeping CXX" >&6; } + CXX="$TEST_COMPILER" + fi + + COMPILER=$CXX + COMPILER_NAME=$COMPILER_NAME + + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + # Make sure we use the Sun Studio compiler and not gcc on Solaris, which won't work + COMPILER_VERSION_TEST=`$COMPILER -V 2>&1 | $HEAD -n 1` + $ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with -V was: \"$COMPILER_VERSION_TEST\" and with --version: \"$GCC_VERSION_TEST\"" >&6;} + as_fn_error $? "Sun Studio compiler is required. Try setting --with-tools-dir." "$LINENO" 5 else - CC="$car" + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*[ ,\t]$COMPILER_NAME[ ,\t]\([1-9]\.[0-9][0-9]*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 + COMPILER_VERSION_TEST=`$COMPILER 2>&1 | $HEAD -n 1` + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*Version \([1-9][0-9.]*\) .*/\1/p"` + COMPILER_VENDOR="Microsoft CL.EXE" + COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` + if test "x$OPENJDK_TARGET_CPU" = "xx86"; then + if test "x$COMPILER_CPU_TEST" != "x80x86"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"80x86\"." "$LINENO" 5 + fi + elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then + if test "x$COMPILER_CPU_TEST" != "xx64"; then + as_fn_error $? "Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for \"$COMPILER_CPU_TEST\"; expected \"x64\"." "$LINENO" 5 + fi + fi + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. + $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&5 +$as_echo "$as_me: The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&5 +$as_echo "$as_me: The result from running with --version was: \"$COMPILER_VERSION_TEST\"" >&6;} + as_fn_error $? "GCC compiler is required. Try setting --with-tools-dir." "$LINENO" 5 fi + # First line typically looks something like: + # gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \([1-9][0-9.]*\)/\1/p"` + COMPILER_VENDOR=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^\(.*\) [1-9][0-9.]*/\1/p"` + fi + # This sets CC_VERSION or CXX_VERSION. (This comment is a grep marker) + CXX_VERSION="$COMPILER_VERSION" + # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) + CXX_VENDOR="$COMPILER_VENDOR" + { $as_echo "$as_me:${as_lineno-$LINENO}: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&5 +$as_echo "$as_me: Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)" >&6;} + + +# Now that we have resolved CXX ourself, let autoconf have it's go at it ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -11789,7 +20023,7 @@ if test -z "$CXX"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then - for ac_prog in cl CC g++ + for ac_prog in $CXX do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 @@ -11833,7 +20067,7 @@ fi fi if test -z "$CXX"; then ac_ct_CXX=$CXX - for ac_prog in cl CC g++ + for ac_prog in $CXX do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 @@ -12036,85 +20270,10 @@ ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu -if test "x$CXX" = xCC && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # The found CC, even though it seems to be a g++ derivate, cannot compile - # c++ code. Override. - CXX="g++" -fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CXX" - car="${tmp%% *}" - tmp="$CXX EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then +### Locate other tools - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" - - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` - fi - car="$tmp" - - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - CXX="$car ${cdr% *}" - else - CXX="$car" - fi - - -if test "x$CXX" = x || test "x$CC" = x; then - - # Print a helpful message on how to acquire the necessary build dependency. - # devkit is the help tag: freetyp2, cups, pulse, alsa etc - MISSING_DEPENDENCY=devkit - PKGHANDLER_COMMAND= - - case $PKGHANDLER in - apt-get) - apt_help $MISSING_DEPENDENCY ;; - yum) - yum_help $MISSING_DEPENDENCY ;; - port) - port_help $MISSING_DEPENDENCY ;; - pkgutil) - pkgutil_help $MISSING_DEPENDENCY ;; - pkgadd) - pkgadd_help $MISSING_DEPENDENCY ;; - * ) - break ;; - esac - - if test "x$PKGHANDLER_COMMAND" != x; then - HELP_MSG="You might be able to fix this by running '$PKGHANDLER_COMMAND'." - fi - - as_fn_error $? "Could not find the needed compilers! $HELP_MSG " "$LINENO" 5 -fi - -if test "x$OPENJDK_BUILD_OS" != xwindows; then +if test "x$OPENJDK_TARGET_OS" = xmacosx; then ac_ext=m ac_cpp='$OBJCPP $CPPFLAGS' ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5' @@ -12367,47 +20526,259 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$OBJC" - car="${tmp%% *}" - tmp="$OBJC EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving OBJC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of OBJC" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - OBJC="$car ${cdr% *}" - else - OBJC="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + OBJC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting OBJC to \"$new_complete\"" >&6;} + fi else OBJC= @@ -12431,7 +20802,7 @@ LDEXECXX="$CXX" # Linking C++ executables. -if test "x$OPENJDK_BUILD_OS" != xwindows; then +if test "x$OPENJDK_TARGET_OS" != xwindows; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. set dummy ${ac_tool_prefix}ar; ac_word=$2 @@ -12525,59 +20896,277 @@ else fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$AR" - car="${tmp%% *}" - tmp="$AR EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$AR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$AR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$AR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving AR (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving AR (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of AR" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - AR="$car ${cdr% *}" - else - AR="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + AR="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting AR to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting AR to \"$new_complete\"" >&6;} + fi fi -if test "x$OPENJDK_BUILD_OS" = xmacosx; then +if test "x$OPENJDK_TARGET_OS" = xmacosx; then ARFLAGS="-r" else ARFLAGS="" fi +# For hotspot, we need these in Windows mixed path; other platforms keep them the same +HOTSPOT_CXX="$CXX" +HOTSPOT_LD="$LD" + + + COMPILER_NAME=gcc COMPILER_TYPE=CC -if test "x$OPENJDK_BUILD_OS" = xwindows; then : +if test "x$OPENJDK_TARGET_OS" = xwindows; then : # For now, assume that we are always compiling using cl.exe. CC_OUT_OPTION=-Fo @@ -12643,25 +21232,259 @@ fi # Since we must ignore the first found link, WINLD will contain # the full path to the link.exe program. - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$WINLD" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$WINLD"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINLD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` fi - WINLD="$tmp" + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINLD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINLD" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving WINLD (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving WINLD (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINLD, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINLD, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINLD" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + WINLD="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting WINLD to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting WINLD to \"$new_complete\"" >&6;} + fi printf "Windows linker was found at $WINLD\n" { $as_echo "$as_me:${as_lineno-$LINENO}: checking if the found link.exe is actually the Visual Studio linker" >&5 @@ -12735,25 +21558,259 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$MT" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$MT"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$MT" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` fi - MT="$tmp" + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$MT" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$MT" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving MT (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving MT (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MT, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MT, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MT" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + MT="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MT to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting MT to \"$new_complete\"" >&6;} + fi # The resource compiler # Extract the first word of "rc", so it can be a program name with args. @@ -12811,28 +21868,311 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$RC" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$RC"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$RC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` fi - RC="$tmp" + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$RC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 - RC_FLAGS="-nologo /l 0x409 /r" + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$RC" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving RC (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving RC (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of RC, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of RC, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of RC" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + RC="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting RC to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting RC to \"$new_complete\"" >&6;} + fi + + + # For hotspot, we need these in Windows mixed path, + # so rewrite them all. Need added .exe suffix. + HOTSPOT_CXX="$CXX.exe" + HOTSPOT_LD="$LD.exe" + HOTSPOT_MT="$MT.exe" + HOTSPOT_RC="$RC.exe" + + unix_path="$HOTSPOT_CXX" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_CXX="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_CXX="$windows_path" + fi + + + unix_path="$HOTSPOT_LD" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_LD="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_LD="$windows_path" + fi + + + unix_path="$HOTSPOT_MT" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_MT="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_MT="$windows_path" + fi + + + unix_path="$HOTSPOT_RC" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + windows_path=`$CYGPATH -m "$unix_path"` + HOTSPOT_RC="$windows_path" + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + windows_path=`cmd //c echo $unix_path` + HOTSPOT_RC="$windows_path" + fi + + + + + RC_FLAGS="-nologo -l 0x409 -r" if test "x$VARIANT" = xOPT; then : RC_FLAGS="$RC_FLAGS -d NDEBUG" @@ -12891,25 +22231,259 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$WINAR" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$WINAR"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINAR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` fi - WINAR="$tmp" + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINAR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$WINAR" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving WINAR (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving WINAR (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of WINAR, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of WINAR, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of WINAR" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + WINAR="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting WINAR to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting WINAR to \"$new_complete\"" >&6;} + fi AR="$WINAR" ARFLAGS="-nologo -NODEFAULTLIB:MSVCRT" @@ -12952,25 +22526,259 @@ fi - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$DUMPBIN" + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$DUMPBIN"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" - fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + # First separate the path from the arguments. This will split at the first + # space. + complete="$DUMPBIN" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` fi - DUMPBIN="$tmp" + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$DUMPBIN" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$DUMPBIN" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving DUMPBIN (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving DUMPBIN (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of DUMPBIN, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of DUMPBIN" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + DUMPBIN="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting DUMPBIN to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting DUMPBIN to \"$new_complete\"" >&6;} + fi COMPILER_TYPE=CL @@ -13118,47 +22926,259 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CPP" - car="${tmp%% *}" - tmp="$CPP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$CPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CPP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CPP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of CPP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - CPP="$car ${cdr% *}" - else - CPP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CPP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CPP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CPP to \"$new_complete\"" >&6;} + fi ac_ext=cpp @@ -13295,47 +23315,259 @@ ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ex ac_compiler_gnu=$ac_cv_cxx_compiler_gnu - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$CXXCPP" - car="${tmp%% *}" - tmp="$CXXCPP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXXCPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXXCPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$CXXCPP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving CXXCPP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving CXXCPP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of CXXCPP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of CXXCPP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of CXXCPP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - CXXCPP="$car ${cdr% *}" - else - CXXCPP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + CXXCPP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting CXXCPP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting CXXCPP to \"$new_complete\"" >&6;} + fi if test "x$COMPILE_TYPE" != "xcross"; then @@ -13359,7 +23591,7 @@ if test "x$OPENJDK_BUILD_OS" = xsolaris; then fi # Find the right assembler. -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then # Extract the first word of "as", so it can be a program name with args. set dummy as; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 @@ -13401,54 +23633,266 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$AS" - car="${tmp%% *}" - tmp="$AS EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$AS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$AS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$AS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving AS (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving AS (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of AS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of AS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of AS" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - AS="$car ${cdr% *}" - else - AS="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + AS="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting AS to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting AS to \"$new_complete\"" >&6;} + fi else AS="$CC -c" fi -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then for ac_prog in gnm nm do # Extract the first word of "$ac_prog", so it can be a program name with args. @@ -13495,47 +23939,259 @@ fi done - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$NM" - car="${tmp%% *}" - tmp="$NM EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving NM (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - NM="$car ${cdr% *}" - else - NM="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + NM="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting NM to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;} + fi # Extract the first word of "strip", so it can be a program name with args. set dummy strip; ac_word=$2 @@ -13578,47 +24234,259 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$STRIP" - car="${tmp%% *}" - tmp="$STRIP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - STRIP="$car ${cdr% *}" - else - STRIP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + STRIP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting STRIP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting STRIP to \"$new_complete\"" >&6;} + fi # Extract the first word of "mcs", so it can be a program name with args. set dummy mcs; ac_word=$2 @@ -13661,49 +24529,261 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$MCS" - car="${tmp%% *}" - tmp="$MCS EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$MCS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$MCS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$MCS" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving MCS (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving MCS (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of MCS, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of MCS, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of MCS" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - MCS="$car ${cdr% *}" - else - MCS="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi -elif test "x$OPENJDK_BUILD_OS" != xwindows; then + if test "x$complete" != "x$new_complete"; then + MCS="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting MCS to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting MCS to \"$new_complete\"" >&6;} + fi + +elif test "x$OPENJDK_TARGET_OS" != xwindows; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}nm", so it can be a program name with args. set dummy ${ac_tool_prefix}nm; ac_word=$2 @@ -13797,47 +24877,259 @@ else fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$NM" - car="${tmp%% *}" - tmp="$NM EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$NM" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving NM (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving NM (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of NM, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of NM, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of NM" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - NM="$car ${cdr% *}" - else - NM="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + NM="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting NM to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting NM to \"$new_complete\"" >&6;} + fi if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. @@ -13932,78 +25224,643 @@ else fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$STRIP" - car="${tmp%% *}" - tmp="$STRIP EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$STRIP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving STRIP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of STRIP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of STRIP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of STRIP" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - STRIP="$car ${cdr% *}" - else - STRIP="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + STRIP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting STRIP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting STRIP to \"$new_complete\"" >&6;} + fi + +fi + +# objcopy is used for moving debug symbols to separate files when +# full debug symbols are enabled. +if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then + if test -n "$ac_tool_prefix"; then + for ac_prog in gobjcopy objcopy + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_OBJCOPY+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OBJCOPY"; then + ac_cv_prog_OBJCOPY="$OBJCOPY" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_OBJCOPY="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +OBJCOPY=$ac_cv_prog_OBJCOPY +if test -n "$OBJCOPY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5 +$as_echo "$OBJCOPY" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$OBJCOPY" && break + done +fi +if test -z "$OBJCOPY"; then + ac_ct_OBJCOPY=$OBJCOPY + for ac_prog in gobjcopy objcopy +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if test "${ac_cv_prog_ac_ct_OBJCOPY+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OBJCOPY"; then + ac_cv_prog_ac_ct_OBJCOPY="$ac_ct_OBJCOPY" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then + ac_cv_prog_ac_ct_OBJCOPY="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_OBJCOPY=$ac_cv_prog_ac_ct_OBJCOPY +if test -n "$ac_ct_OBJCOPY"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJCOPY" >&5 +$as_echo "$ac_ct_OBJCOPY" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_OBJCOPY" && break +done + + if test "x$ac_ct_OBJCOPY" = x; then + OBJCOPY="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + OBJCOPY=$ac_ct_OBJCOPY + fi +fi + + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJCOPY" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJCOPY" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJCOPY" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJCOPY (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving OBJCOPY (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJCOPY, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJCOPY" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + OBJCOPY="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJCOPY to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting OBJCOPY to \"$new_complete\"" >&6;} + fi fi -### -# -# Check for objcopy -# -# but search for gobjcopy first... -# since I on solaris found a broken objcopy...buhh -# if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}gobjcopy", so it can be a program name with args. -set dummy ${ac_tool_prefix}gobjcopy; ac_word=$2 + for ac_prog in gobjdump objdump + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OBJCOPY+set}" = set; then : +if test "${ac_cv_prog_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_OBJCOPY="$OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + if test -n "$OBJDUMP"; then + ac_cv_prog_OBJDUMP="$OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" + ac_cv_prog_OBJDUMP="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -14011,42 +25868,43 @@ done done IFS=$as_save_IFS - ;; -esac fi -OBJCOPY=$ac_cv_path_OBJCOPY -if test -n "$OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5 -$as_echo "$OBJCOPY" >&6; } +fi +OBJDUMP=$ac_cv_prog_OBJDUMP +if test -n "$OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJDUMP" >&5 +$as_echo "$OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi + test -n "$OBJDUMP" && break + done fi -if test -z "$ac_cv_path_OBJCOPY"; then - ac_pt_OBJCOPY=$OBJCOPY - # Extract the first word of "gobjcopy", so it can be a program name with args. -set dummy gobjcopy; ac_word=$2 +if test -z "$OBJDUMP"; then + ac_ct_OBJDUMP=$OBJDUMP + for ac_prog in gobjdump objdump +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_OBJCOPY+set}" = set; then : +if test "${ac_cv_prog_ac_ct_OBJDUMP+set}" = set; then : $as_echo_n "(cached) " >&6 else - case $ac_pt_OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_OBJCOPY="$ac_pt_OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + if test -n "$ac_ct_OBJDUMP"; then + ac_cv_prog_ac_ct_OBJDUMP="$ac_ct_OBJDUMP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" + ac_cv_prog_ac_ct_OBJDUMP="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi @@ -14054,20 +25912,23 @@ done done IFS=$as_save_IFS - ;; -esac fi -ac_pt_OBJCOPY=$ac_cv_path_ac_pt_OBJCOPY -if test -n "$ac_pt_OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_OBJCOPY" >&5 -$as_echo "$ac_pt_OBJCOPY" >&6; } +fi +ac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP +if test -n "$ac_ct_OBJDUMP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP" >&5 +$as_echo "$ac_ct_OBJDUMP" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi - if test "x$ac_pt_OBJCOPY" = x; then - OBJCOPY="" + + test -n "$ac_ct_OBJDUMP" && break +done + + if test "x$ac_ct_OBJDUMP" = x; then + OBJDUMP="" else case $cross_compiling:$ac_tool_warned in yes:) @@ -14075,110 +25936,266 @@ yes:) $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac - OBJCOPY=$ac_pt_OBJCOPY + OBJDUMP=$ac_ct_OBJDUMP fi -else - OBJCOPY="$ac_cv_path_OBJCOPY" fi -if test "x$OBJCOPY" = x; then - if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args. -set dummy ${ac_tool_prefix}objcopy; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_OBJCOPY+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_OBJCOPY="$OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 +if test "x$OBJDUMP" != x; then + # Only used for compare.sh; we can live without it. BASIC_FIXUP_EXECUTABLE bails if argument is missing. + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJDUMP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` fi -done - done -IFS=$as_save_IFS - - ;; -esac -fi -OBJCOPY=$ac_cv_path_OBJCOPY -if test -n "$OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OBJCOPY" >&5 -$as_echo "$OBJCOPY" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - -fi -if test -z "$ac_cv_path_OBJCOPY"; then - ac_pt_OBJCOPY=$OBJCOPY - # Extract the first word of "objcopy", so it can be a program name with args. -set dummy objcopy; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if test "${ac_cv_path_ac_pt_OBJCOPY+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - case $ac_pt_OBJCOPY in - [\\/]* | ?:[\\/]*) - ac_cv_path_ac_pt_OBJCOPY="$ac_pt_OBJCOPY" # Let the user override the test with a path. - ;; - *) - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then - ac_cv_path_ac_pt_OBJCOPY="$as_dir/$ac_word$ac_exec_ext" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi fi -done - done -IFS=$as_save_IFS - ;; -esac -fi -ac_pt_OBJCOPY=$ac_cv_path_ac_pt_OBJCOPY -if test -n "$ac_pt_OBJCOPY"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_OBJCOPY" >&5 -$as_echo "$ac_pt_OBJCOPY" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_pt_OBJCOPY" = x; then - OBJCOPY="" + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - OBJCOPY=$ac_pt_OBJCOPY + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJDUMP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$OBJDUMP" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving OBJDUMP (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving OBJDUMP (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of OBJDUMP, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of OBJDUMP" "$LINENO" 5 + fi + fi + fi + + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + OBJDUMP="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting OBJDUMP to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting OBJDUMP to \"$new_complete\"" >&6;} fi -else - OBJCOPY="$ac_cv_path_OBJCOPY" -fi fi @@ -14224,47 +26241,259 @@ fi - # Translate "gcc -E" into "`which gcc` -E" ie - # extract the full path to the binary and at the - # same time maintain any arguments passed to it. - # The command MUST exist in the path, or else! - tmp="$LIPO" - car="${tmp%% *}" - tmp="$LIPO EOL" - cdr="${tmp#* }" - # On windows we want paths without spaces. - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then - # Translate long cygdrive or C:\sdfsf path - # into a short mixed mode path that has no - # spaces in it. - tmp="$car" + # First separate the path from the arguments. This will split at the first + # space. + complete="$LIPO" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - tmp=`$CYGPATH -u "$car"` - tmp=`which "$tmp"` - # If file exists with .exe appended, that's the real filename - # and cygpath needs that to convert to short style path. - if test -f "${tmp}.exe"; then - tmp="${tmp}.exe" - elif test -f "${tmp}.cmd"; then - tmp="${tmp}.cmd" + # Input might be given as Windows format, start by converting to + # unix format. + new_path=`$CYGPATH -u "$path"` + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path=`$CYGPATH -u "$path"` + new_path=`$WHICH "$new_path" 2> /dev/null` + # bat and cmd files are not always considered executable in cygwin causing which + # to not find them + if test "x$new_path" = x \ + && test "x`$ECHO \"$path\" | $GREP -e \"\\.bat$\" -e \"\\.cmd$\"`" != x \ + && test "x`$LS \"$path\" 2>/dev/null`" != x; then + new_path=`$CYGPATH -u "$path"` + fi + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi + fi + + # 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 + # Short path failed, file does not exist as specified. + # Try adding .exe or .cmd + if test -f "${new_path}.exe"; then + input_to_shortpath="${new_path}.exe" + elif test -f "${new_path}.cmd"; then + input_to_shortpath="${new_path}.cmd" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$new_path\", is invalid." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$new_path\", is invalid." >&6;} + { $as_echo "$as_me:${as_lineno-$LINENO}: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&5 +$as_echo "$as_me: Neither \"$new_path\" nor \"$new_path.exe/cmd\" can be found" >&6;} + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi + else + input_to_shortpath="$new_path" + fi + + # Call helper function which possibly converts this using DOS-style short mode. + # If so, the updated path is stored in $new_path. + new_path="$input_to_shortpath" + + input_path="$input_to_shortpath" + # 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-stile (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 $input_to_shortpath | $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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + # First separate the path from the arguments. This will split at the first + # space. + complete="$LIPO" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + # Input might be given as Windows format, start by converting to + # unix format. + new_path="$path" + + 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 + + + # Now try to locate executable using which + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # Oops. Which didn't find the executable. + # The splitting of arguments from the executable at a space might have been incorrect, + # since paths with space are more likely in Windows. Give it another try with the whole + # argument. + path="$complete" + arguments="EOL" + new_path="$path" + + 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 + + + new_path=`$WHICH "$new_path" 2> /dev/null` + + if test "x$new_path" = x; then + # It's still not found. Now this is an unrecoverable error. + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: You might be mixing spaces in the path and extra arguments, which is not allowed." >&5 +$as_echo "$as_me: You might be mixing spaces in the path and extra arguments, which is not allowed." >&6;} + fi + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi + fi + + # Now new_path has a complete unix path to the binary + if test "x`$ECHO $new_path | $GREP ^/bin/`" != x; then + # Keep paths in /bin as-is, but remove trailing .exe if any + new_path="${new_path/%.exe/}" + # Do not save /bin paths to all_fixpath_prefixes! + else + # Not in mixed or Windows style, start by that. + new_path=`cmd //c echo $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 \) + new_path=`cmd /c "for %A in (\"$input_path\") do @echo %~sA"|$TR \\\\\\\\ / | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + fi + + # Output is in $new_path + + 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 + + # remove trailing .exe if any + new_path="${new_path/%.exe/}" + + # 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}") + fi + + else + # We're on a posix platform. Hooray! :) + # First separate the path from the arguments. This will split at the first + # space. + complete="$LIPO" + path="${complete%% *}" + tmp="$complete EOL" + arguments="${tmp#* }" + + new_path=`$WHICH $path 2> /dev/null` + if test "x$new_path" = x; then + is_absolute_path=`$ECHO "$path" | $GREP ^/` + if test "x$is_absolute_path" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: Resolving LIPO (as $path) with 'which' failed, using $path directly." >&5 +$as_echo "$as_me: Resolving LIPO (as $path) with 'which' failed, using $path directly." >&6;} + new_path="$path" + else + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of LIPO, which resolves as \"$complete\", is not found." >&5 +$as_echo "$as_me: The path of LIPO, which resolves as \"$complete\", is not found." >&6;} + has_space=`$ECHO "$complete" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: This might be caused by spaces in the path, which is not allowed." >&5 +$as_echo "$as_me: This might be caused by spaces in the path, which is not allowed." >&6;} fi - # Convert to C:/ mixed style path without spaces. - tmp=`$CYGPATH -s -m "$tmp"` + as_fn_error $? "Cannot locate the the path of LIPO" "$LINENO" 5 + fi fi - car="$tmp" + fi - else - # "which" is not portable, but is used here - # because we know that the command exists! - car=`which $car` - fi - if test "x$cdr" != xEOL; then - LIPO="$car ${cdr% *}" - else - LIPO="$car" - fi + # Now join together the path and the arguments once again + if test "x$arguments" != xEOL; then + new_complete="$new_path ${arguments% *}" + else + new_complete="$new_path" + fi + + if test "x$complete" != "x$new_complete"; then + LIPO="$new_complete" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting LIPO to \"$new_complete\"" >&5 +$as_echo "$as_me: Rewriting LIPO to \"$new_complete\"" >&6;} + fi fi @@ -14800,7 +27029,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -g" # Linking is different on MacOSX - if test "x$OPENJDK_BUILD_OS" = xmacosx; then + if test "x$OPENJDK_TARGET_OS" = xmacosx; then # Might change in the future to clang. COMPILER_NAME=gcc SHARED_LIBRARY='lib$1.dylib' @@ -14814,7 +27043,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -S" fi else - if test "x$OPENJDK_BUILD_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_OS" = xsolaris; then # If it is not gcc, then assume it is the Oracle Solaris Studio Compiler COMPILER_NAME=ossc PICFLAG="-KPIC" @@ -14838,7 +27067,7 @@ else POST_STRIP_CMD="$STRIP -x" POST_MCS_CMD="$MCS -d -a \"JDK $FULL_VERSION\"" fi - if test "x$OPENJDK_BUILD_OS" = xwindows; then + if test "x$OPENJDK_TARGET_OS" = xwindows; then # If it is not gcc, then assume it is the MS Visual Studio compiler COMPILER_NAME=cl PICFLAG="" @@ -14986,6 +27215,11 @@ case $COMPILER_TYPE in # Can cause undefined external on Solaris 8 X86 on __sincos, removing for now #CC_HIGHEST="$CC_HIGHEST -xlibmopt" + if test "x$OPENJDK_TARGET_CPU" = xsparc; then + CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" + CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" + fi + case $OPENJDK_TARGET_CPU_ARCH in x86) C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xregs=no%frameptr" @@ -15002,8 +27236,6 @@ case $COMPILER_TYPE in fi ;; sparc) - CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" - CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" CFLAGS_JDKLIB_EXTRA="${CFLAGS_JDKLIB_EXTRA} -xregs=no%appl" CXXFLAGS_JDKLIB_EXTRA="${CXXFLAGS_JDKLIB_EXTRA} -xregs=no%appl" C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra" @@ -15132,7 +27364,7 @@ case $COMPILER_NAME in CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" case $OPENJDK_TARGET_CPU_ARCH in x86 ) - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -Di386" + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE" ;; esac @@ -15232,7 +27464,7 @@ CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK" # libraries will link to whatever is in memory. Yuck. # # Thus we offer the compiler to find libjvm.so first in server then in client. It works. Ugh. -if test "x$COMPILER_TYPE" = xCL; then +if test "x$COMPILER_NAME" = xcl; then LDFLAGS_JDK="$LDFLAGS_JDK -nologo -opt:ref -incremental:no" if test "x$OPENJDK_TARGET_CPU" = xx86; then LDFLAGS_JDK="$LDFLAGS_JDK -safeseh" @@ -15248,19 +27480,23 @@ if test "x$COMPILER_TYPE" = xCL; then fi LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE" else - # If this is a --hash-style=gnu system, use --hash-style=both, why? - HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` - if test -n "$HAS_GNU_HASH"; then - # And since we now know that the linker is gnu, then add -z defs, to forbid - # undefined symbols in object files. - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both -Xlinker -z -Xlinker defs" - if test "x$DEBUG_LEVEL" == "xrelease"; then - # When building release libraries, tell the linker optimize them. - # Should this be supplied to the OSS linker as well? - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + if test "x$COMPILER_NAME" = xgcc; then + # If this is a --hash-style=gnu system, use --hash-style=both, why? + HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` + if test -n "$HAS_GNU_HASH"; then + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both " + fi + if test "x$OPENJDK_TARGET_OS" = xlinux; then + # And since we now know that the linker is gnu, then add -z defs, to forbid + # undefined symbols in object files. + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" + if test "x$DEBUG_LEVEL" = "xrelease"; then + # When building release libraries, tell the linker optimize them. + # Should this be supplied to the OSS linker as well? + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + fi fi fi - LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/server \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/client \ @@ -15307,53 +27543,6 @@ esac -# After we have toolchain, we can compile the uncygdrive helper - -# When using cygwin, we need a wrapper binary that renames -# /cygdrive/c/ arguments into c:/ arguments and peeks into -# @files and rewrites these too! This wrapper binary is -# called uncygdrive.exe. -UNCYGDRIVE= -if test "x$OPENJDK_BUILD_OS" = xwindows; then - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if uncygdrive can be created" >&5 -$as_echo_n "checking if uncygdrive can be created... " >&6; } - UNCYGDRIVE_SRC=`$CYGPATH -m $SRC_ROOT/common/src/uncygdrive.c` - rm -f $OUTPUT_ROOT/uncygdrive* - UNCYGDRIVE=`$CYGPATH -m $OUTPUT_ROOT/uncygdrive.exe` - cd $OUTPUT_ROOT - $CC $UNCYGDRIVE_SRC /Fe$UNCYGDRIVE > $OUTPUT_ROOT/uncygdrive1.log 2>&1 - cd $CURDIR - - if test ! -x $OUTPUT_ROOT/uncygdrive.exe; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - cat $OUTPUT_ROOT/uncygdrive1.log - as_fn_error $? "Could not create $OUTPUT_ROOT/uncygdrive.exe" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $UNCYGDRIVE" >&5 -$as_echo "$UNCYGDRIVE" >&6; } - { $as_echo "$as_me:${as_lineno-$LINENO}: checking if uncygdrive.exe works" >&5 -$as_echo_n "checking if uncygdrive.exe works... " >&6; } - cd $OUTPUT_ROOT - $UNCYGDRIVE $CC $SRC_ROOT/common/src/uncygdrive.c /Fe$OUTPUT_ROOT/uncygdrive2.exe > $OUTPUT_ROOT/uncygdrive2.log 2>&1 - cd $CURDIR - if test ! -x $OUTPUT_ROOT/uncygdrive2.exe; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } - cat $OUTPUT_ROOT/uncygdrive2.log - as_fn_error $? "Uncygdrive did not work!" "$LINENO" 5 - fi - { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -$as_echo "yes" >&6; } - rm -f $OUTPUT_ROOT/uncygdrive?.??? $OUTPUT_ROOT/uncygdrive.obj - # The path to uncygdrive to use should be Unix-style - UNCYGDRIVE="$OUTPUT_ROOT/uncygdrive.exe" -fi - - - - - # Setup debug symbols (need objcopy from the toolchain for that) # @@ -15384,7 +27573,7 @@ fi if test "x$ENABLE_DEBUG_SYMBOLS" = "xdefault"; then # Default is on if objcopy is found, otherwise off - if test "x$OBJCOPY" != x; then + if test "x$OBJCOPY" != x || test "x$OPENJDK_TARGET_OS" = xwindows; then ENABLE_DEBUG_SYMBOLS=yes else ENABLE_DEBUG_SYMBOLS=no @@ -15536,7 +27725,6 @@ fi - ############################################################################### # # Check for X Windows @@ -16308,10 +28496,15 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu OLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" + +# Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10 for ac_header in X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` -ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" +ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" " # include + # include + +" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 @@ -16323,6 +28516,7 @@ fi done + CFLAGS="$OLD_CFLAGS" ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' @@ -16382,28 +28576,20 @@ if test "${with_cups_include+set}" = set; then : fi -# Check whether --with-cups-lib was given. -if test "${with_cups_lib+set}" = set; then : - withval=$with_cups_lib; -fi - - if test "x$CUPS_NOT_NEEDED" = xyes; then - if test "x${with_cups}" != x || test "x${with_cups_include}" != x || test "x${with_cups_lib}" != x; then + if test "x${with_cups}" != x || test "x${with_cups_include}" != x; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cups not used, so --with-cups is ignored" >&5 $as_echo "$as_me: WARNING: cups not used, so --with-cups is ignored" >&2;} fi CUPS_CFLAGS= - CUPS_LIBS= else CUPS_FOUND=no - if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno || test "x${with_cups_lib}" = xno; then + if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno; then as_fn_error $? "It is not possible to disable the use of cups. Remove the --without-cups option." "$LINENO" 5 fi if test "x${with_cups}" != x; then - CUPS_LIBS="-L${with_cups}/lib -lcups" CUPS_CFLAGS="-I${with_cups}/include" CUPS_FOUND=yes fi @@ -16411,10 +28597,6 @@ else CUPS_CFLAGS="-I${with_cups_include}" CUPS_FOUND=yes fi - if test "x${with_cups_lib}" != x; then - CUPS_LIBS="-L${with_cups_lib} -lcups" - CUPS_FOUND=yes - fi if test "x$CUPS_FOUND" = xno; then @@ -16572,7 +28754,6 @@ if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : _ACEOF CUPS_FOUND=yes CUPS_CFLAGS= - CUPS_LIBS="-lcups" DEFAULT_CUPS=yes fi @@ -16582,18 +28763,16 @@ done if test "x$CUPS_FOUND" = xno; then # Getting nervous now? Lets poke around for standard Solaris third-party # package installation locations. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cups headers and libs" >&5 -$as_echo_n "checking for cups headers and libs... " >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cups headers" >&5 +$as_echo_n "checking for cups headers... " >&6; } if test -s /opt/sfw/cups/include/cups/cups.h; then # An SFW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/sfw/cups/include" - CUPS_LIBS="-L/opt/sfw/cups/lib -lcups" elif test -s /opt/csw/include/cups/cups.h; then # A CSW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/csw/include" - CUPS_LIBS="-L/opt/csw/lib -lcups" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CUPS_FOUND" >&5 $as_echo "$CUPS_FOUND" >&6; } @@ -16633,7 +28812,6 @@ fi - ############################################################################### # # The ubiquitous freetype2 library is used to render fonts. @@ -16661,32 +28839,138 @@ else if test "x$with_freetype" != x; then - # Fail with message the path to freetype if var with_freetype contains a path with no spaces in it. - # Unless on Windows, where we can rewrite the path. - HAS_SPACE=`echo "$with_freetype" | grep " "` - if test "x$HAS_SPACE" != x; then - if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # First convert it to DOS-style, short mode (no spaces) - with_freetype=`$CYGPATH -s -m -a "$with_freetype"` - # Now it's case insensitive; let's make it lowercase to improve readability - with_freetype=`$ECHO "$with_freetype" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` - # Now convert it back to Unix-stile (cygpath) - with_freetype=`$CYGPATH -u "$with_freetype"` - else - as_fn_error $? "You cannot have spaces in the path to freetype! \"$with_freetype\"" "$LINENO" 5 - fi + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$with_freetype" + 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 with_freetype, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of with_freetype" "$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-stile (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 + with_freetype="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting with_freetype to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting with_freetype to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$with_freetype" + 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 + with_freetype="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting with_freetype to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting with_freetype 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 posix platform. Hooray! :) + path="$with_freetype" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of with_freetype, which resolves as \"$path\", is not found." "$LINENO" 5 fi + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of with_freetype, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of with_freetype, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + FREETYPE2_LIBS="-L$with_freetype/lib -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib" + if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64 && test -d "$with_freetype/lib/amd64"; then + FREETYPE2_LIBS="-L$with_freetype/lib/amd64 -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib/amd64" + fi if test "x$OPENJDK_TARGET_OS" = xwindows; then FREETYPE2_LIBS="$with_freetype/lib/freetype.lib" fi - FREETYPE2_LIB_PATH="$with_freetype/lib" FREETYPE2_CFLAGS="-I$with_freetype/include" if test -s $with_freetype/include/ft2build.h && test -d $with_freetype/include/freetype2/freetype; then FREETYPE2_CFLAGS="-I$with_freetype/include/freetype2 -I$with_freetype/include" fi - FREETYPE2_FOUND=yes + FREETYPE2_FOUND=yes if test "x$FREETYPE2_FOUND" = xyes; then # Verify that the directories exist if ! test -d "$with_freetype/lib" || ! test -d "$with_freetype/include"; then @@ -16695,7 +28979,7 @@ else # List the contents of the lib. FREETYPELIB=`ls $with_freetype/lib/libfreetype.so $with_freetype/lib/freetype.dll 2> /dev/null` if test "x$FREETYPELIB" = x; then - as_fn_error $? "Could not find libfreetype.se nor freetype.dll in $with_freetype/lib" "$LINENO" 5 + as_fn_error $? "Could not find libfreetype.so nor freetype.dll in $with_freetype/lib" "$LINENO" 5 fi # Check one h-file if ! test -s "$with_freetype/include/ft2build.h"; then @@ -16851,6 +29135,145 @@ $as_echo "$as_me: Downloading build dependency freetype2 from $with_builddeps_se USING_SYSTEM_FT_LIB=true fi + if test "x$FREETYPE2_FOUND" = xno && test "x$OPENJDK_TARGET_OS" = xwindows; then + FREETYPELOCATION="$PROGRAMFILES/GnuWin32" + + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.cygwin"; then + + # Input might be given as Windows format, start by converting to + # unix format. + path="$FREETYPELOCATION" + 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 FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Cannot locate the the path of FREETYPELOCATION" "$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-stile (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 + FREETYPELOCATION="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting FREETYPELOCATION to \"$new_path\"" >&6;} + fi + + elif test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + + path="$FREETYPELOCATION" + 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 + FREETYPELOCATION="$new_path" + { $as_echo "$as_me:${as_lineno-$LINENO}: Rewriting FREETYPELOCATION to \"$new_path\"" >&5 +$as_echo "$as_me: Rewriting FREETYPELOCATION 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 posix platform. Hooray! :) + path="$FREETYPELOCATION" + + if test ! -f "$path" && test ! -d "$path"; then + as_fn_error $? "The path of FREETYPELOCATION, which resolves as \"$path\", is not found." "$LINENO" 5 + fi + + has_space=`$ECHO "$path" | $GREP " "` + if test "x$has_space" != x; then + { $as_echo "$as_me:${as_lineno-$LINENO}: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&5 +$as_echo "$as_me: The path of FREETYPELOCATION, which resolves as \"$path\", is invalid." >&6;} + as_fn_error $? "Spaces are not allowed in this path." "$LINENO" 5 + fi + fi + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype in some standard windows locations" >&5 +$as_echo_n "checking for freetype in some standard windows locations... " >&6; } + if test -s "$FREETYPELOCATION/include/ft2build.h" && test -d "$FREETYPELOCATION/include/freetype2/freetype"; then + FREETYPE2_CFLAGS="-I$FREETYPELOCATION/include/freetype2 -I$FREETYPELOCATION/include" + FREETYPE2_LIBS="$FREETYPELOCATION/lib/freetype.lib" + FREETYPE2_LIB_PATH="$FREETYPELOCATION/lib" + if ! test -s "$FREETYPE2_LIBS"; then + as_fn_error $? "Could not find $FREETYPE2_LIBS" "$LINENO" 5 + fi + if ! test -s "$FREETYPE2_LIB_PATH/freetype.dll"; then + as_fn_error $? "Could not find $FREETYPE2_LIB_PATH/freetype.dll" "$LINENO" 5 + fi + USING_SYSTEM_FT_LIB=true + FREETYPE2_FOUND=yes + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $FREETYPE2_FOUND" >&5 +$as_echo "$FREETYPE2_FOUND" >&6; } + fi if test "x$FREETYPE2_FOUND" = xno; then pkg_failed=no @@ -16919,7 +29342,13 @@ else $as_echo "yes" >&6; } FREETYPE2_FOUND=yes fi + # On solaris, pkg_check adds -lz to freetype libs, which isn't necessary for us. + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's/-lz//g'` USING_SYSTEM_FT_LIB=true + # 64-bit libs for Solaris x86 are installed in the amd64 subdirectory, change lib to lib/amd64 + if test "x$FREETYPE2_FOUND" = xyes && test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's?/lib?/lib/amd64?g'` + fi fi if test "x$FREETYPE2_FOUND" = xno; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for freetype in some standard locations" >&5 @@ -16993,6 +29422,55 @@ $as_echo "$FREETYPE2_FOUND" >&6; } as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5 fi + + if test "x$OPENJDK_TARGET_OS" != xwindows; then + # AC_CHECK_LIB does not support use of cl.exe + PREV_LDFLAGS="$LDFLAGS" + LDFLAGS="$FREETYPE2_LIBS" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for FT_Init_FreeType in -lfreetype" >&5 +$as_echo_n "checking for FT_Init_FreeType in -lfreetype... " >&6; } +if test "${ac_cv_lib_freetype_FT_Init_FreeType+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfreetype $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char FT_Init_FreeType (); +int +main () +{ +return FT_Init_FreeType (); + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_link "$LINENO"; then : + ac_cv_lib_freetype_FT_Init_FreeType=yes +else + ac_cv_lib_freetype_FT_Init_FreeType=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_freetype_FT_Init_FreeType" >&5 +$as_echo "$ac_cv_lib_freetype_FT_Init_FreeType" >&6; } +if test "x$ac_cv_lib_freetype_FT_Init_FreeType" = x""yes; then : + FREETYPE2_FOUND=true +else + as_fn_error $? "Could not find freetype2! $HELP_MSG " "$LINENO" 5 +fi + + LDFLAGS="$PREV_LDFLAGS" + fi fi @@ -17795,16 +30273,19 @@ $as_echo_n "checking how to link with libstdc++... " >&6; } if test "x$enable_static_link_stdc__" = xyes; then LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS" LDCXX="$CC" + STATIC_CXX_SETTING="STATIC_CXX=true" { $as_echo "$as_me:${as_lineno-$LINENO}: result: static" >&5 $as_echo "static" >&6; } else LIBCXX="$LIBCXX -lstdc++" LDCXX="$CXX" + STATIC_CXX_SETTING="STATIC_CXX=false" { $as_echo "$as_me:${as_lineno-$LINENO}: result: dynamic" >&5 $as_echo "dynamic" >&6; } fi fi + # libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so) if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$LIBCXX" = x; then LIBCXX="/usr/lib${OPENJDK_TARGET_CPU_ISADIR}/libCrun.so.1" @@ -17819,6 +30300,66 @@ fi +# After we have toolchain and the paths to all libraries (needed by msys), we can compile the fixpath helper + +# When using cygwin or msys, we need a wrapper binary that renames +# /cygdrive/c/ arguments into c:/ arguments and peeks into +# @files and rewrites these too! This wrapper binary is +# called fixpath. +FIXPATH= +if test "x$OPENJDK_BUILD_OS" = xwindows; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fixpath can be created" >&5 +$as_echo_n "checking if fixpath can be created... " >&6; } + FIXPATH_SRC="$SRC_ROOT/common/src/fixpath.c" + FIXPATH_BIN="$OUTPUT_ROOT/fixpath.exe" + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + FIXPATH_SRC=`$CYGPATH -m $FIXPATH_SRC` + FIXPATH_BIN=`$CYGPATH -m $FIXPATH_BIN` + # Important to keep the .exe suffix on Cygwin for Hotspot makefiles + FIXPATH="$OUTPUT_ROOT/fixpath.exe -c" + elif test "x$OPENJDK_BUILD_OS_ENV" = xwindows.msys; then + FIXPATH_SRC=`cmd //c echo $FIXPATH_SRC` + FIXPATH_BIN=`cmd //c echo $FIXPATH_BIN` + + # Take all collected prefixes and turn them into a -m/c/foo@/c/bar@... command line + # @ was chosen as separator to minimize risk of other tools messing around with it + all_unique_prefixes=`echo "${all_fixpath_prefixes[@]}" | tr ' ' '\n' | grep '^/./' | sort | uniq` + fixpath_argument_list=`echo $all_unique_prefixes | tr ' ' '@'` + + FIXPATH="$OUTPUT_ROOT/fixpath -m$fixpath_argument_list" + fi + rm -f $OUTPUT_ROOT/fixpath* + cd $OUTPUT_ROOT + $CC $FIXPATH_SRC -Fe$FIXPATH_BIN > $OUTPUT_ROOT/fixpath1.log 2>&1 + cd $CURDIR + + if test ! -x $OUTPUT_ROOT/fixpath.exe; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + cat $OUTPUT_ROOT/fixpath1.log + as_fn_error $? "Could not create $OUTPUT_ROOT/fixpath.exe" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if fixpath.exe works" >&5 +$as_echo_n "checking if fixpath.exe works... " >&6; } + cd $OUTPUT_ROOT + $FIXPATH $CC $SRC_ROOT/common/src/fixpath.c -Fe$OUTPUT_ROOT/fixpath2.exe > $OUTPUT_ROOT/fixpath2.log 2>&1 + cd $CURDIR + if test ! -x $OUTPUT_ROOT/fixpath2.exe; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + cat $OUTPUT_ROOT/fixpath2.log + as_fn_error $? "fixpath did not work!" "$LINENO" 5 + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + rm -f $OUTPUT_ROOT/fixpath?.??? $OUTPUT_ROOT/fixpath.obj +fi + + + + ############################################################################### # # We need to do some final tweaking, when everything else is done. @@ -17873,6 +30414,10 @@ $as_echo_n "checking for number of cores... " >&6; } # Looks like a MacOSX system NUM_CORES=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Cores' | awk '{print $5}'` FOUND_CORES=yes + elif test -n "$NUMBER_OF_PROCESSORS"; then + # On windows, look in the env + NUM_CORES=$NUMBER_OF_PROCESSORS + FOUND_CORES=yes fi # For c/c++ code we run twice as many concurrent build @@ -17883,8 +30428,10 @@ $as_echo_n "checking for number of cores... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $NUM_CORES" >&5 $as_echo "$NUM_CORES" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect number of cores, defaulting to 1!" >&5 -$as_echo "could not detect number of cores, defaulting to 1!" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect number of cores, defaulting to 1" >&5 +$as_echo "could not detect number of cores, defaulting to 1" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This will disable all parallelism from build!" >&5 +$as_echo "$as_me: WARNING: This will disable all parallelism from build!" >&2;} fi @@ -17926,9 +30473,10 @@ $as_echo_n "checking for memory size... " >&6; } MEMORY_SIZE=`/usr/sbin/system_profiler -detailLevel full SPHardwareDataType | grep 'Memory' | awk '{print $2}'` MEMORY_SIZE=`expr $MEMORY_SIZE \* 1024` FOUND_MEM=yes - elif test "x$build_os" = xwindows; then + elif test "x$OPENJDK_BUILD_OS" = xwindows; then # Windows, but without cygwin - MEMORY_SIZE=`systeminfo | grep 'Total Physical Memory:' | awk '{ print $4 }' | sed 's/,//'` + MEMORY_SIZE=`wmic computersystem get totalphysicalmemory -value | grep = | cut -d "=" -f 2-` + MEMORY_SIZE=`expr $MEMORY_SIZE / 1024 / 1024` FOUND_MEM=yes fi @@ -17936,8 +30484,10 @@ $as_echo_n "checking for memory size... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MEMORY_SIZE MB" >&5 $as_echo "$MEMORY_SIZE MB" >&6; } else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect memory size defaulting to 1024 MB!" >&5 -$as_echo "could not detect memory size defaulting to 1024 MB!" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: could not detect memory size, defaulting to 1024 MB" >&5 +$as_echo "could not detect memory size, defaulting to 1024 MB" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: This might seriously impact build performance!" >&5 +$as_echo "$as_me: WARNING: This might seriously impact build performance!" >&2;} fi else @@ -18366,11 +30916,26 @@ $as_echo_n "checking if build directory is on local disk... " >&6; } # df -l lists only local disks; if the given directory is not found then # a non-zero exit code is given - if $DF -l $OUTPUT_ROOT > /dev/null 2>&1; then - OUTPUT_DIR_IS_LOCAL="yes" - else - OUTPUT_DIR_IS_LOCAL="no" - fi + if test "x$DF" = x; then + if test "x$OPENJDK_BUILD_OS_ENV" = "xwindows.msys"; then + # msys does not have df; use Windows "net use" instead. + IS_NETWORK_DISK=`net use | grep \`pwd -W | cut -d ":" -f 1 | tr a-z A-Z\`:` + if test "x$IS_NETWORK_DISK" = x; then + OUTPUT_DIR_IS_LOCAL="yes" + else + OUTPUT_DIR_IS_LOCAL="no" + fi + else + # No df here, say it's local + OUTPUT_DIR_IS_LOCAL="yes" + fi + else + if $DF -l $OUTPUT_ROOT > /dev/null 2>&1; then + OUTPUT_DIR_IS_LOCAL="yes" + else + OUTPUT_DIR_IS_LOCAL="no" + fi + fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OUTPUT_DIR_IS_LOCAL" >&5 $as_echo "$OUTPUT_DIR_IS_LOCAL" >&6; } @@ -18909,7 +31474,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by openjdk $as_me jdk8, which was +This file was extended by OpenJDK $as_me jdk8, which was generated by GNU Autoconf 2.67. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -18965,13 +31530,14 @@ $config_files Configuration headers: $config_headers -Report bugs to ." +Report bugs to . +OpenJDK home page: ." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -openjdk config.status jdk8 +OpenJDK config.status jdk8 configured by $0, generated by GNU Autoconf 2.67, with options \\"\$ac_cs_config\\" @@ -19718,7 +32284,15 @@ printf "* Debug level: $DEBUG_LEVEL\n" printf "* JDK variant: $JDK_VARIANT\n" printf "* JVM variants: $with_jvm_variants\n" printf "* OpenJDK target: OS: $OPENJDK_TARGET_OS, CPU architecture: $OPENJDK_TARGET_CPU_ARCH, address length: $OPENJDK_TARGET_CPU_BITS\n" -printf "* Boot JDK: $BOOT_JDK\n" + +printf "\n" +printf "Tools summary:\n" +if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + printf "* Environment: $WINDOWS_ENV_VENDOR version $WINDOWS_ENV_VERSION (root at $WINDOWS_ENV_ROOT_PATH)\n" +fi +printf "* Boot JDK: $BOOT_JDK_VERSION (at $BOOT_JDK)\n" +printf "* C Compiler: $CC_VENDOR version $CC_VERSION (at $CC)\n" +printf "* C++ Compiler: $CXX_VENDOR version $CXX_VERSION (at $CXX)\n" printf "\n" printf "Build performance summary:\n" diff --git a/common/autoconf/help.m4 b/common/autoconf/help.m4 index 01b48172dae..12ff371dd20 100644 --- a/common/autoconf/help.m4 +++ b/common/autoconf/help.m4 @@ -55,6 +55,19 @@ AC_DEFUN([HELP_MSG_MISSING_DEPENDENCY], fi ]) +cygwin_help() { + case $1 in + unzip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P unzip" ;; + zip) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P zip" ;; + make) + PKGHANDLER_COMMAND="cd && cmd /c setup -q -P make" ;; + * ) + break ;; + esac +} + apt_help() { case $1 in devkit) @@ -149,7 +162,15 @@ printf "* Debug level: $DEBUG_LEVEL\n" printf "* JDK variant: $JDK_VARIANT\n" printf "* JVM variants: $with_jvm_variants\n" printf "* OpenJDK target: OS: $OPENJDK_TARGET_OS, CPU architecture: $OPENJDK_TARGET_CPU_ARCH, address length: $OPENJDK_TARGET_CPU_BITS\n" -printf "* Boot JDK: $BOOT_JDK\n" + +printf "\n" +printf "Tools summary:\n" +if test "x$OPENJDK_BUILD_OS" = "xwindows"; then + printf "* Environment: $WINDOWS_ENV_VENDOR version $WINDOWS_ENV_VERSION (root at $WINDOWS_ENV_ROOT_PATH)\n" +fi +printf "* Boot JDK: $BOOT_JDK_VERSION (at $BOOT_JDK)\n" +printf "* C Compiler: $CC_VENDOR version $CC_VERSION (at $CC)\n" +printf "* C++ Compiler: $CXX_VENDOR version $CXX_VERSION (at $CXX)\n" printf "\n" printf "Build performance summary:\n" diff --git a/common/autoconf/hotspot-spec.gmk.in b/common/autoconf/hotspot-spec.gmk.in index b4e9d5c95e7..68cc8e4eea7 100644 --- a/common/autoconf/hotspot-spec.gmk.in +++ b/common/autoconf/hotspot-spec.gmk.in @@ -48,8 +48,8 @@ ALT_CUPS_HEADERS_PATH:=$(patsubst -I%,%,$(filter -I%,@CUPS_CFLAGS@)) # The HOSTCC/HOSTCXX is Hotspot terminology for the BUILD_CC/BUILD_CXX, i.e. the # compiler that produces code that can be run on the build platform. -HOSTCC:=@UNCYGDRIVE@ @BUILD_CC@ -HOSTCXX:=@UNCYGDRIVE@ @BUILD_CXX@ +HOSTCC:=@FIXPATH@ @BUILD_CC@ +HOSTCXX:=@FIXPATH@ @BUILD_CXX@ #################################################### # @@ -78,13 +78,23 @@ ARCH=$(OPENJDK_TARGET_CPU_LEGACY) ALT_OUTPUTDIR=$(HOTSPOT_OUTPUTDIR) ALT_EXPORT_PATH=$(HOTSPOT_DIST) -HOTSPOT_MAKE_ARGS:=@HOTSPOT_MAKE_ARGS@ +HOTSPOT_MAKE_ARGS:=@HOTSPOT_MAKE_ARGS@ @STATIC_CXX_SETTING@ # This is used from the libjvm build for C/C++ code. HOTSPOT_BUILD_JOBS:=@CONCURRENT_BUILD_JOBS@ # Control wether Hotspot runs Queens test after building TEST_IN_BUILD=@TEST_IN_BUILD@ +# For hotspot, override compiler/tools definition to not include FIXPATH prefix. +# Hotspot has its own handling on the Windows path situation. +CXX:=@CCACHE@ @HOTSPOT_CXX@ +LD:=@HOTSPOT_LD@ +MT:=@HOTSPOT_MT@ +RC:=@HOTSPOT_RC@ EXTRA_CFLAGS=@LEGACY_EXTRA_CFLAGS@ EXTRA_CXXFLAGS=@LEGACY_EXTRA_CXXFLAGS@ EXTRA_LDFLAGS=@LEGACY_EXTRA_LDFLAGS@ + +# Sneak this in via the spec.gmk file, since we don't want to mess around too much with the Hotspot make files. +# This is needed to get the LOG setting to work properly. +include $(SRC_ROOT)/common/makefiles/MakeBase.gmk diff --git a/common/autoconf/jdk-options.m4 b/common/autoconf/jdk-options.m4 index 92d97e21cf2..39e003fd9f0 100644 --- a/common/autoconf/jdk-options.m4 +++ b/common/autoconf/jdk-options.m4 @@ -64,7 +64,7 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JVM_VARIANTS], # ie normal interpreter and C1, only the serial GC, kernel jvmti etc # zero: no machine code interpreter, no compiler # zeroshark: zero interpreter and shark/llvm compiler backend -AC_MSG_CHECKING([which variants of the JVM that should be built]) +AC_MSG_CHECKING([which variants of the JVM to build]) AC_ARG_WITH([jvm-variants], [AS_HELP_STRING([--with-jvm-variants], [JVM variants (separated by commas) to build (server, client, kernel, zero, zeroshark) @<:@server@:>@])]) @@ -241,40 +241,39 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_OPTIONS], # Should we build only OpenJDK even if closed sources are present? # AC_ARG_ENABLE([openjdk-only], [AS_HELP_STRING([--enable-openjdk-only], - [build OpenJDK regardless of the presence of closed repositories @<:@disabled@:>@])],,) + [supress building closed source even if present @<:@disabled@:>@])],,[enable_openjdk_only="no"]) -if test "x$enable_openjdk_only" = "xyes"; then - OPENJDK=true -elif test "x$enable_openjdk_only" = "xno"; then - OPENJDK=false -elif test -d "$SRC_ROOT/jdk/src/closed"; then - OPENJDK=false +AC_MSG_CHECKING([for presence of closed sources]) +if test -d "$SRC_ROOT/jdk/src/closed"; then + CLOSED_SOURCE_PRESENT=yes else + CLOSED_SOURCE_PRESENT=no +fi +AC_MSG_RESULT([$CLOSED_SOURCE_PRESENT]) + +AC_MSG_CHECKING([if closed source is supressed (openjdk-only)]) +SUPRESS_CLOSED_SOURCE="$enable_openjdk_only" +AC_MSG_RESULT([$SUPRESS_CLOSED_SOURCE]) + +if test "x$CLOSED_SOURCE_PRESENT" = xno; then + OPENJDK=true + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then + AC_MSG_WARN([No closed source present, --enable-openjdk-only makes no sense]) + fi +else + if test "x$SUPRESS_CLOSED_SOURCE" = "xyes"; then OPENJDK=true + else + OPENJDK=false + fi fi if test "x$OPENJDK" = "xtrue"; then - SET_OPENJDK=OPENJDK=true + SET_OPENJDK="OPENJDK=true" fi AC_SUBST(SET_OPENJDK) -############################################################################### -# -# JIGSAW or not. The JIGSAW variable is used during the intermediate -# stage when we are building both the old style JDK and the new style modularized JDK. -# When the modularized JDK is finalized, this option will go away. -# -AC_ARG_ENABLE([jigsaw], [AS_HELP_STRING([--enable-jigsaw], - [build Jigsaw images (not yet available) @<:@disabled@:>@])],,) - -if test "x$enable_jigsaw" = "xyes"; then - JIGSAW=true -else - JIGSAW=false -fi -AC_SUBST(JIGSAW) - ############################################################################### # # Should we build a JDK/JVM with headful support (ie a graphical ui)? @@ -282,7 +281,7 @@ AC_SUBST(JIGSAW) # AC_MSG_CHECKING([headful support]) AC_ARG_ENABLE([headful], [AS_HELP_STRING([--disable-headful], - [build headful support (graphical UI support) @<:@enabled@:>@])], + [disable building headful support (graphical UI support) @<:@enabled@:>@])], [SUPPORT_HEADFUL=${enable_headful}], [SUPPORT_HEADFUL=yes]) SUPPORT_HEADLESS=yes @@ -305,25 +304,9 @@ AC_SUBST(SUPPORT_HEADLESS) AC_SUBST(SUPPORT_HEADFUL) AC_SUBST(BUILD_HEADLESS) -############################################################################### -# -# Should we compile nimbus swing L&F? We can probably remove this option -# since nimbus is officially part of javax now. -# -AC_MSG_CHECKING([whether to build nimbus L&F]) -AC_ARG_ENABLE([nimbus], [AS_HELP_STRING([--disable-nimbus], - [disable Nimbus L&F @<:@enabled@:>@])], - [ENABLE_NIMBUS="${enableval}"], [ENABLE_NIMBUS='yes']) -AC_MSG_RESULT([$ENABLE_NIMBUS]) -DISABLE_NIMBUS= -if test "x$ENABLE_NIMBUS" = xno; then - DISABLE_NIMBUS=true -fi -AC_SUBST(DISABLE_NIMBUS) - # Control wether Hotspot runs Queens test after build. AC_ARG_ENABLE([hotspot-test-in-build], [AS_HELP_STRING([--enable-hotspot-test-in-build], - [enable running of Queens test after Hotspot build (not yet available) @<:@disabled@:>@])],, + [run the Queens test after Hotspot build @<:@disabled@:>@])],, [enable_hotspot_test_in_build=no]) if test "x$enable_hotspot_test_in_build" = "xyes"; then TEST_IN_BUILD=true @@ -349,6 +332,20 @@ else fi AC_SUBST(CACERTS_FILE) +############################################################################### +# +# Enable or disable unlimited crypto +# +AC_ARG_ENABLE(unlimited-crypto, [AS_HELP_STRING([--enable-unlimited-crypto], + [Enable unlimited crypto policy @<:@disabled@:>@])],, + [enable_unlimited_crypto=no]) +if test "x$enable_unlimited_crypto" = "xyes"; then + UNLIMITED_CRYPTO=true +else + UNLIMITED_CRYPTO=false +fi +AC_SUBST(UNLIMITED_CRYPTO) + ############################################################################### # # Compress jars @@ -356,38 +353,6 @@ AC_SUBST(CACERTS_FILE) COMPRESS_JARS=false AC_SUBST(COMPRESS_JARS) - -############################################################################### -# -# Should we compile JFR -# default no, except for on closed-jdk -# -ENABLE_JFR=no - -# Is the JFR source present - -# -# For closed default is yes -# -if test "x${OPENJDK}" != "xtrue"; then - ENABLE_JFR=yes -fi - -AC_MSG_CHECKING([whether to build jfr]) -AC_ARG_ENABLE([jfr], [AS_HELP_STRING([--enable-jfr], - [enable jfr (default is no)])] - [ENABLE_JFR="${enableval}"]) -AC_MSG_RESULT([${ENABLE_JFR}]) - -if test "x$ENABLE_JFR" = "xyes"; then - ENABLE_JFR=true -elif test "x$ENABLE_JFR" = "xno"; then - ENABLE_JFR=false -else - AC_MSG_ERROR([Invalid argument to --enable-jfr]) -fi - -AC_SUBST(ENABLE_JFR) ]) AC_DEFUN_ONCE([JDKOPT_SETUP_JDK_VERSION_NUMBERS], @@ -409,6 +374,8 @@ AC_SUBST(PRODUCT_NAME) AC_SUBST(PRODUCT_SUFFIX) AC_SUBST(JDK_RC_PLATFORM_NAME) AC_SUBST(COMPANY_NAME) +AC_SUBST(MACOSX_BUNDLE_NAME_BASE) +AC_SUBST(MACOSX_BUNDLE_ID_BASE) COPYRIGHT_YEAR=`date +'%Y'` AC_SUBST(COPYRIGHT_YEAR) @@ -437,7 +404,7 @@ else BUILD_DATE=`date '+%Y_%m_%d_%H_%M'` # Avoid [:alnum:] since it depends on the locale. CLEAN_USERNAME=`echo "$USER" | $TR -d -c 'abcdefghijklmnopqrstuvqxyz0123456789'` - USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvqxyz'` + USER_RELEASE_SUFFIX=`echo "${CLEAN_USERNAME}_${BUILD_DATE}" | $TR 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FULL_VERSION="${RELEASE}-${USER_RELEASE_SUFFIX}-${JDK_BUILD_NUMBER}" fi AC_SUBST(FULL_VERSION) @@ -473,7 +440,7 @@ if test "x$OPENJDK_TARGET_OS" = xmacosx; then fi AC_ARG_ENABLE([debug-symbols], - [AS_HELP_STRING([--disable-debug-symbols],[disable generation of debug symbols (@<:@enabled@:>@)])], + [AS_HELP_STRING([--disable-debug-symbols],[disable generation of debug symbols @<:@enabled@:>@])], [ENABLE_DEBUG_SYMBOLS=${enable_debug_symbols}], ) @@ -487,7 +454,7 @@ fi if test "x$ENABLE_DEBUG_SYMBOLS" = "xdefault"; then # Default is on if objcopy is found, otherwise off - if test "x$OBJCOPY" != x; then + if test "x$OBJCOPY" != x || test "x$OPENJDK_TARGET_OS" = xwindows; then ENABLE_DEBUG_SYMBOLS=yes else ENABLE_DEBUG_SYMBOLS=no @@ -502,7 +469,7 @@ AC_MSG_RESULT([$ENABLE_DEBUG_SYMBOLS]) ZIP_DEBUGINFO_FILES=yes AC_ARG_ENABLE([zip-debug-info], - [AS_HELP_STRING([--disable-zip-debug-info],[don't zip debug-info files (@<:@enabled@:@)])], + [AS_HELP_STRING([--disable-zip-debug-info],[disable zipping of debug-info files @<:@enabled@:>@])], [ZIP_DEBUGINFO_FILES=${enable_zip_debug_info}], ) @@ -528,5 +495,5 @@ AC_SUBST(CXXFLAGS_DEBUG_SYMBOLS) # for a degree of customization of the build targets and the rules/recipes # to create them AC_ARG_WITH([custom-make-dir], [AS_HELP_STRING([--with-custom-make-dir], - [directory containing custom build/make files])], [CUSTOM_MAKE_DIR=$with_custom_make_dir]) + [use this directory for custom build/make files])], [CUSTOM_MAKE_DIR=$with_custom_make_dir]) AC_SUBST(CUSTOM_MAKE_DIR) diff --git a/common/autoconf/libraries.m4 b/common/autoconf/libraries.m4 index 8c09744c555..aebdf8b93fb 100644 --- a/common/autoconf/libraries.m4 +++ b/common/autoconf/libraries.m4 @@ -172,9 +172,15 @@ fi AC_LANG_PUSH(C) OLD_CFLAGS="$CFLAGS" CFLAGS="$CFLAGS $X_CFLAGS" + +# Need to include Xlib.h and Xutil.h to avoid "present but cannot be compiled" warnings on Solaris 10 AC_CHECK_HEADERS([X11/extensions/shape.h X11/extensions/Xrender.h X11/extensions/XTest.h], - [X11_A_OK=yes], - [X11_A_OK=no]) + [X11_A_OK=yes], + [X11_A_OK=no], + [ # include + # include + ]) + CFLAGS="$OLD_CFLAGS" AC_LANG_POP(C) @@ -196,27 +202,23 @@ AC_DEFUN_ONCE([LIB_SETUP_CUPS], # AC_ARG_WITH(cups, [AS_HELP_STRING([--with-cups], [specify prefix directory for the cups package - (expecting the libraries under PATH/lib and the headers under PATH/include)])]) + (expecting the headers under PATH/include)])]) AC_ARG_WITH(cups-include, [AS_HELP_STRING([--with-cups-include], [specify directory for the cups include files])]) -AC_ARG_WITH(cups-lib, [AS_HELP_STRING([--with-cups-lib], - [specify directory for the cups library])]) if test "x$CUPS_NOT_NEEDED" = xyes; then - if test "x${with_cups}" != x || test "x${with_cups_include}" != x || test "x${with_cups_lib}" != x; then + if test "x${with_cups}" != x || test "x${with_cups_include}" != x; then AC_MSG_WARN([cups not used, so --with-cups is ignored]) fi CUPS_CFLAGS= - CUPS_LIBS= else CUPS_FOUND=no - if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno || test "x${with_cups_lib}" = xno; then + if test "x${with_cups}" = xno || test "x${with_cups_include}" = xno; then AC_MSG_ERROR([It is not possible to disable the use of cups. Remove the --without-cups option.]) fi if test "x${with_cups}" != x; then - CUPS_LIBS="-L${with_cups}/lib -lcups" CUPS_CFLAGS="-I${with_cups}/include" CUPS_FOUND=yes fi @@ -224,10 +226,6 @@ else CUPS_CFLAGS="-I${with_cups_include}" CUPS_FOUND=yes fi - if test "x${with_cups_lib}" != x; then - CUPS_LIBS="-L${with_cups_lib} -lcups" - CUPS_FOUND=yes - fi if test "x$CUPS_FOUND" = xno; then BDEPS_CHECK_MODULE(CUPS, cups, xxx, [CUPS_FOUND=yes]) fi @@ -236,23 +234,20 @@ else AC_CHECK_HEADERS([cups/cups.h cups/ppd.h], [CUPS_FOUND=yes CUPS_CFLAGS= - CUPS_LIBS="-lcups" DEFAULT_CUPS=yes]) fi if test "x$CUPS_FOUND" = xno; then # Getting nervous now? Lets poke around for standard Solaris third-party # package installation locations. - AC_MSG_CHECKING([for cups headers and libs]) + AC_MSG_CHECKING([for cups headers]) if test -s /opt/sfw/cups/include/cups/cups.h; then # An SFW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/sfw/cups/include" - CUPS_LIBS="-L/opt/sfw/cups/lib -lcups" elif test -s /opt/csw/include/cups/cups.h; then # A CSW package seems to be installed! CUPS_FOUND=yes CUPS_CFLAGS="-I/opt/csw/include" - CUPS_LIBS="-L/opt/csw/lib -lcups" fi AC_MSG_RESULT([$CUPS_FOUND]) fi @@ -263,7 +258,6 @@ else fi AC_SUBST(CUPS_CFLAGS) -AC_SUBST(CUPS_LIBS) ]) @@ -292,17 +286,21 @@ else FREETYPE2_FOUND=no if test "x$with_freetype" != x; then - SPACESAFE(with_freetype,[the path to freetype]) + BASIC_FIXUP_PATH(with_freetype) FREETYPE2_LIBS="-L$with_freetype/lib -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib" + if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64 && test -d "$with_freetype/lib/amd64"; then + FREETYPE2_LIBS="-L$with_freetype/lib/amd64 -lfreetype" + FREETYPE2_LIB_PATH="$with_freetype/lib/amd64" + fi if test "x$OPENJDK_TARGET_OS" = xwindows; then FREETYPE2_LIBS="$with_freetype/lib/freetype.lib" fi - FREETYPE2_LIB_PATH="$with_freetype/lib" FREETYPE2_CFLAGS="-I$with_freetype/include" if test -s $with_freetype/include/ft2build.h && test -d $with_freetype/include/freetype2/freetype; then FREETYPE2_CFLAGS="-I$with_freetype/include/freetype2 -I$with_freetype/include" fi - FREETYPE2_FOUND=yes + FREETYPE2_FOUND=yes if test "x$FREETYPE2_FOUND" = xyes; then # Verify that the directories exist if ! test -d "$with_freetype/lib" || ! test -d "$with_freetype/include"; then @@ -311,7 +309,7 @@ else # List the contents of the lib. FREETYPELIB=`ls $with_freetype/lib/libfreetype.so $with_freetype/lib/freetype.dll 2> /dev/null` if test "x$FREETYPELIB" = x; then - AC_MSG_ERROR([Could not find libfreetype.se nor freetype.dll in $with_freetype/lib]) + AC_MSG_ERROR([Could not find libfreetype.so nor freetype.dll in $with_freetype/lib]) fi # Check one h-file if ! test -s "$with_freetype/include/ft2build.h"; then @@ -323,9 +321,34 @@ else BDEPS_CHECK_MODULE(FREETYPE2, freetype2, xxx, [FREETYPE2_FOUND=yes], [FREETYPE2_FOUND=no]) USING_SYSTEM_FT_LIB=true fi + if test "x$FREETYPE2_FOUND" = xno && test "x$OPENJDK_TARGET_OS" = xwindows; then + FREETYPELOCATION="$PROGRAMFILES/GnuWin32" + BASIC_FIXUP_PATH(FREETYPELOCATION) + AC_MSG_CHECKING([for freetype in some standard windows locations]) + if test -s "$FREETYPELOCATION/include/ft2build.h" && test -d "$FREETYPELOCATION/include/freetype2/freetype"; then + FREETYPE2_CFLAGS="-I$FREETYPELOCATION/include/freetype2 -I$FREETYPELOCATION/include" + FREETYPE2_LIBS="$FREETYPELOCATION/lib/freetype.lib" + FREETYPE2_LIB_PATH="$FREETYPELOCATION/lib" + if ! test -s "$FREETYPE2_LIBS"; then + AC_MSG_ERROR([Could not find $FREETYPE2_LIBS]) + fi + if ! test -s "$FREETYPE2_LIB_PATH/freetype.dll"; then + AC_MSG_ERROR([Could not find $FREETYPE2_LIB_PATH/freetype.dll]) + fi + USING_SYSTEM_FT_LIB=true + FREETYPE2_FOUND=yes + fi + AC_MSG_RESULT([$FREETYPE2_FOUND]) + fi if test "x$FREETYPE2_FOUND" = xno; then PKG_CHECK_MODULES(FREETYPE2, freetype2, [FREETYPE2_FOUND=yes], [FREETYPE2_FOUND=no]) + # On solaris, pkg_check adds -lz to freetype libs, which isn't necessary for us. + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's/-lz//g'` USING_SYSTEM_FT_LIB=true + # 64-bit libs for Solaris x86 are installed in the amd64 subdirectory, change lib to lib/amd64 + if test "x$FREETYPE2_FOUND" = xyes && test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$OPENJDK_TARGET_CPU" = xx86_64; then + FREETYPE2_LIBS=`$ECHO $FREETYPE2_LIBS | $SED 's?/lib?/lib/amd64?g'` + fi fi if test "x$FREETYPE2_FOUND" = xno; then AC_MSG_CHECKING([for freetype in some standard locations]) @@ -364,7 +387,17 @@ else if test "x$FREETYPE2_FOUND" = xno; then HELP_MSG_MISSING_DEPENDENCY([freetype2]) AC_MSG_ERROR([Could not find freetype2! $HELP_MSG ]) - fi + fi + + if test "x$OPENJDK_TARGET_OS" != xwindows; then + # AC_CHECK_LIB does not support use of cl.exe + PREV_LDFLAGS="$LDFLAGS" + LDFLAGS="$FREETYPE2_LIBS" + AC_CHECK_LIB(freetype, FT_Init_FreeType, + FREETYPE2_FOUND=true, + AC_MSG_ERROR([Could not find freetype2! $HELP_MSG ])) + LDFLAGS="$PREV_LDFLAGS" + fi fi AC_SUBST(USING_SYSTEM_FT_LIB) @@ -621,13 +654,16 @@ if test "x$OPENJDK_TARGET_OS" = xlinux; then if test "x$enable_static_link_stdc__" = xyes; then LIBCXX="$LIBCXX $STATIC_STDCXX_FLAGS" LDCXX="$CC" + STATIC_CXX_SETTING="STATIC_CXX=true" AC_MSG_RESULT([static]) else LIBCXX="$LIBCXX -lstdc++" LDCXX="$CXX" + STATIC_CXX_SETTING="STATIC_CXX=false" AC_MSG_RESULT([dynamic]) fi fi +AC_SUBST(STATIC_CXX_SETTING) # libCrun is the c++ runtime-library with SunStudio (roughly the equivalent of gcc's libstdc++.so) if test "x$OPENJDK_TARGET_OS" = xsolaris && test "x$LIBCXX" = x; then diff --git a/common/autoconf/platform.m4 b/common/autoconf/platform.m4 index afa32ade726..2977606ba79 100644 --- a/common/autoconf/platform.m4 +++ b/common/autoconf/platform.m4 @@ -87,22 +87,32 @@ AC_DEFUN([PLATFORM_EXTRACT_VARS_FROM_OS], *linux*) VAR_OS=linux VAR_OS_API=posix + VAR_OS_ENV=linux ;; *solaris*) VAR_OS=solaris VAR_OS_API=posix + VAR_OS_ENV=solaris ;; *darwin*) VAR_OS=macosx VAR_OS_API=posix + VAR_OS_ENV=macosx ;; *bsd*) VAR_OS=bsd VAR_OS_API=posix + VAR_OS_ENV=bsd ;; - *cygwin*|*windows*) + *cygwin*) VAR_OS=windows VAR_OS_API=winapi + VAR_OS_ENV=windows.cygwin + ;; + *mingw*) + VAR_OS=windows + VAR_OS_API=winapi + VAR_OS_ENV=windows.msys ;; *) AC_MSG_ERROR([unsupported operating system $1]) @@ -127,12 +137,34 @@ AC_DEFUN([PLATFORM_EXTRACT_TARGET_AND_BUILD], AC_SUBST(OPENJDK_TARGET_AUTOCONF_NAME) AC_SUBST(OPENJDK_BUILD_AUTOCONF_NAME) + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. + PLATFORM_EXTRACT_VARS_FROM_OS($build_os) + PLATFORM_EXTRACT_VARS_FROM_CPU($build_cpu) + # ..and setup our own variables. (Do this explicitely to facilitate searching) + OPENJDK_BUILD_OS="$VAR_OS" + OPENJDK_BUILD_OS_API="$VAR_OS_API" + OPENJDK_BUILD_OS_ENV="$VAR_OS_ENV" + OPENJDK_BUILD_CPU="$VAR_CPU" + OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" + OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" + OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" + AC_SUBST(OPENJDK_BUILD_OS) + AC_SUBST(OPENJDK_BUILD_OS_API) + AC_SUBST(OPENJDK_BUILD_CPU) + AC_SUBST(OPENJDK_BUILD_CPU_ARCH) + AC_SUBST(OPENJDK_BUILD_CPU_BITS) + AC_SUBST(OPENJDK_BUILD_CPU_ENDIAN) + + AC_MSG_CHECKING([openjdk-build os-cpu]) + AC_MSG_RESULT([$OPENJDK_BUILD_OS-$OPENJDK_BUILD_CPU]) + # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. PLATFORM_EXTRACT_VARS_FROM_OS($host_os) PLATFORM_EXTRACT_VARS_FROM_CPU($host_cpu) # ... and setup our own variables. (Do this explicitely to facilitate searching) OPENJDK_TARGET_OS="$VAR_OS" OPENJDK_TARGET_OS_API="$VAR_OS_API" + OPENJDK_TARGET_OS_ENV="$VAR_OS_ENV" OPENJDK_TARGET_CPU="$VAR_CPU" OPENJDK_TARGET_CPU_ARCH="$VAR_CPU_ARCH" OPENJDK_TARGET_CPU_BITS="$VAR_CPU_BITS" @@ -144,22 +176,8 @@ AC_DEFUN([PLATFORM_EXTRACT_TARGET_AND_BUILD], AC_SUBST(OPENJDK_TARGET_CPU_BITS) AC_SUBST(OPENJDK_TARGET_CPU_ENDIAN) - # Convert the autoconf OS/CPU value to our own data, into the VAR_OS/CPU variables. - PLATFORM_EXTRACT_VARS_FROM_OS($build_os) - PLATFORM_EXTRACT_VARS_FROM_CPU($build_cpu) - # ..and setup our own variables. (Do this explicitely to facilitate searching) - OPENJDK_BUILD_OS="$VAR_OS" - OPENJDK_BUILD_OS_API="$VAR_OS_API" - OPENJDK_BUILD_CPU="$VAR_CPU" - OPENJDK_BUILD_CPU_ARCH="$VAR_CPU_ARCH" - OPENJDK_BUILD_CPU_BITS="$VAR_CPU_BITS" - OPENJDK_BUILD_CPU_ENDIAN="$VAR_CPU_ENDIAN" - AC_SUBST(OPENJDK_BUILD_OS) - AC_SUBST(OPENJDK_BUILD_OS_API) - AC_SUBST(OPENJDK_BUILD_CPU) - AC_SUBST(OPENJDK_BUILD_CPU_ARCH) - AC_SUBST(OPENJDK_BUILD_CPU_BITS) - AC_SUBST(OPENJDK_BUILD_CPU_ENDIAN) + AC_MSG_CHECKING([openjdk-target os-cpu]) + AC_MSG_RESULT([$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU]) ]) # Check if a reduced build (32-bit on 64-bit platforms) is requested, and modify behaviour @@ -208,7 +226,7 @@ AC_DEFUN([PLATFORM_SETUP_TARGET_CPU_BITS], fi AC_SUBST(COMPILE_TYPE) -AC_MSG_CHECKING([for compilation type]) +AC_MSG_CHECKING([compilation type]) AC_MSG_RESULT([$COMPILE_TYPE]) ]) @@ -299,7 +317,11 @@ AC_DEFUN([PLATFORM_SETUP_LEGACY_VARS], if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then A_LP64="LP64:=" - ADD_LP64="-D_LP64=1" + # -D_LP64=1 is only set on linux and mac. Setting on windows causes diff in + # unpack200.exe + if test "x$OPENJDK_TARGET_OS" = xlinux || test "x$OPENJDK_TARGET_OS" = xmacosx; then + ADD_LP64="-D_LP64=1" + fi fi AC_SUBST(LP64,$A_LP64) diff --git a/common/autoconf/spec.gmk.in b/common/autoconf/spec.gmk.in index 21502341237..b8d3e104b79 100644 --- a/common/autoconf/spec.gmk.in +++ b/common/autoconf/spec.gmk.in @@ -41,7 +41,9 @@ SQUOTE:=' #' DQUOTE:=" #" -define NEWLINE:= +define NEWLINE + + endef # A self-referential reference to this file. @@ -50,11 +52,7 @@ SPEC:=@SPEC@ # Specify where the spec file is. MAKE_ARGS="SPEC=$(SPEC)" -# TODO The logic for finding and setting MAKE is currently not working -# well on windows. Disable it TEMPORARILY there for now. -ifneq (@OPENJDK_TARGET_OS@,windows) - MAKE:=@MAKE@ -endif +MAKE:=@MAKE@ # Pass along the verbosity setting. ifeq (,$(findstring VERBOSE=,$(MAKE))) @@ -77,6 +75,7 @@ CONF_NAME:=@CONF_NAME@ # The built jdk will run in this target system. OPENJDK_TARGET_OS:=@OPENJDK_TARGET_OS@ OPENJDK_TARGET_OS_API:=@OPENJDK_TARGET_OS_API@ +OPENJDK_TARGET_OS_ENV:=@OPENJDK_TARGET_OS_ENV@ OPENJDK_TARGET_CPU:=@OPENJDK_TARGET_CPU@ OPENJDK_TARGET_CPU_ARCH:=@OPENJDK_TARGET_CPU_ARCH@ @@ -109,16 +108,21 @@ REQUIRED_OS_NAME:=@REQUIRED_OS_NAME@ REQUIRED_OS_VERSION:=@REQUIRED_OS_VERSION@ @SET_OPENJDK@ -JIGSAW:=@JIGSAW@ LIBM:=-lm LIBDL:=@LIBDL@ # colon or semicolon PATH_SEP:=@PATH_SEP@ -# Set special env variables, to be passed to external tools. -# Used for cygwin setups. -@SETUPDEVENV@ +ifeq ($(OPENJDK_TARGET_OS), windows) + # On Windows, the Visual Studio toolchain needs the LIB and INCLUDE + # environment variables (in Windows path style), and the PATH needs to + # be adjusted to include Visual Studio tools (but this needs to be in + # cygwin/msys style). + export PATH:=@VS_PATH@ + export INCLUDE:=@VS_INCLUDE@ + export LIB:=@VS_LIB@ +endif # The sys root where standard headers and libraries are found. # Usually not needed since the configure script should have @@ -131,7 +135,6 @@ ADD_SRC_ROOT:=@ADD_SRC_ROOT@ OVERRIDE_SRC_ROOT:=@OVERRIDE_SRC_ROOT@ TOPDIR:=@SRC_ROOT@ OUTPUT_ROOT:=@OUTPUT_ROOT@ -JDK_MAKE_SHARED_DIR:=@JDK_TOPDIR@/makefiles/common/shared JDK_TOPDIR:=@JDK_TOPDIR@ LANGTOOLS_TOPDIR:=@LANGTOOLS_TOPDIR@ CORBA_TOPDIR:=@CORBA_TOPDIR@ @@ -155,6 +158,8 @@ PRODUCT_NAME:=@PRODUCT_NAME@ PRODUCT_SUFFIX:=@PRODUCT_SUFFIX@ JDK_RC_PLATFORM_NAME:=@JDK_RC_PLATFORM_NAME@ COMPANY_NAME:=@COMPANY_NAME@ +MACOSX_BUNDLE_NAME_BASE=@MACOSX_BUNDLE_NAME_BASE@ +MACOSX_BUNDLE_ID_BASE=@MACOSX_BUNDLE_ID_BASE@ # Different version strings generated from the above information. JDK_VERSION:=@JDK_VERSION@ @@ -260,6 +265,9 @@ PACKAGE_PATH=@PACKAGE_PATH@ # Source file for cacerts CACERTS_FILE=@CACERTS_FILE@ +# Enable unlimited crypto policy +UNLIMITED_CRYPTO=@UNLIMITED_CRYPTO@ + # Necessary additional compiler flags to compile X11 X_CFLAGS:=@X_CFLAGS@ X_LIBS:=@X_LIBS@ @@ -289,7 +297,7 @@ C_FLAG_DEPS:=@C_FLAG_DEPS@ CXX_FLAG_DEPS:=@CXX_FLAG_DEPS@ # Tools that potentially need to be cross compilation aware. -CC:=@UNCYGDRIVE@ @CCACHE@ @CC@ +CC:=@FIXPATH@ @CCACHE@ @CC@ # CFLAGS used to compile the jdk native libraries (C-code) CFLAGS_JDKLIB:=@CFLAGS_JDKLIB@ @@ -299,17 +307,17 @@ CXXFLAGS_JDKLIB:=@CXXFLAGS_JDKLIB@ CFLAGS_JDKEXE:=@CFLAGS_JDKEXE@ CXXFLAGS_JDKEXE:=@CXXFLAGS_JDKEXE@ -CXX:=@UNCYGDRIVE@ @CCACHE@ @CXX@ +CXX:=@FIXPATH@ @CCACHE@ @CXX@ #CXXFLAGS:=@CXXFLAGS@ OBJC:=@CCACHE@ @OBJC@ #OBJCFLAGS:=@OBJCFLAGS@ -CPP:=@UNCYGDRIVE@ @CPP@ +CPP:=@FIXPATH@ @CPP@ #CPPFLAGS:=@CPPFLAGS@ # The linker can be gcc or ld on posix systems, or link.exe on windows systems. -LD:=@UNCYGDRIVE@ @LD@ +LD:=@FIXPATH@ @LD@ # LDFLAGS used to link the jdk native libraries (C-code) LDFLAGS_JDKLIB:=@LDFLAGS_JDKLIB@ @@ -317,7 +325,7 @@ LDFLAGS_JDKLIB_SUFFIX:=@LDFLAGS_JDKLIB_SUFFIX@ # On some platforms the linker cannot be used to create executables, thus # the need for a separate LDEXE command. -LDEXE:=@UNCYGDRIVE@ @LDEXE@ +LDEXE:=@FIXPATH@ @LDEXE@ # LDFLAGS used to link the jdk native launchers (C-code) LDFLAGS_JDKEXE:=@LDFLAGS_JDKEXE@ @@ -327,22 +335,22 @@ LDFLAGS_JDKEXE_SUFFIX:=@LDFLAGS_JDKEXE_SUFFIX@ LDFLAGS_CXX_JDK:=@LDFLAGS_CXX_JDK@ # Sometimes a different linker is needed for c++ libs -LDCXX:=@UNCYGDRIVE@ @LDCXX@ +LDCXX:=@FIXPATH@ @LDCXX@ # The flags for linking libstdc++ linker. LIBCXX:=@LIBCXX@ # Sometimes a different linker is needed for c++ executables -LDEXECXX:=@UNCYGDRIVE@ @LDEXECXX@ +LDEXECXX:=@FIXPATH@ @LDEXECXX@ # BUILD_CC/BUILD_LD is a compiler/linker that generates code that is runnable on the # build platform. -BUILD_CC:=@UNCYGDRIVE@ @BUILD_CC@ -BUILD_LD:=@UNCYGDRIVE@ @BUILD_LD@ +BUILD_CC:=@FIXPATH@ @BUILD_CC@ +BUILD_LD:=@FIXPATH@ @BUILD_LD@ -AS:=@UNCYGDRIVE@ @AS@ +AS:=@FIXPATH@ @AS@ # AR is used to create a static library (is ar in posix, lib.exe in windows) -AR:=@UNCYGDRIVE@ @AR@ +AR:=@FIXPATH@ @AR@ ARFLAGS:=@ARFLAGS@ NM:=@NM@ @@ -400,20 +408,20 @@ POST_MCS_CMD:=@POST_MCS_CMD@ JAVA_FLAGS:=@BOOT_JDK_JVMARGS@ -JAVA=@UNCYGDRIVE@ $(BOOT_JDK)/bin/java $(JAVA_FLAGS) +JAVA=@FIXPATH@ $(BOOT_JDK)/bin/java $(JAVA_FLAGS) -JAVAC=@UNCYGDRIVE@ $(BOOT_JDK)/bin/javac +JAVAC=@FIXPATH@ $(BOOT_JDK)/bin/javac # Hotspot sets this variable before reading the SPEC when compiling sa-jdi.jar. Avoid # overriding that value by using ?=. JAVAC_FLAGS?=@JAVAC_FLAGS@ -JAVAH=@UNCYGDRIVE@ $(BOOT_JDK)/bin/javah +JAVAH=@FIXPATH@ $(BOOT_JDK)/bin/javah -JAR=@UNCYGDRIVE@ $(BOOT_JDK)/bin/jar +JAR=@FIXPATH@ $(BOOT_JDK)/bin/jar -RMIC=@UNCYGDRIVE@ $(BOOT_JDK)/bin/rmic +RMIC=@FIXPATH@ $(BOOT_JDK)/bin/rmic -NATIVE2ASCII=@UNCYGDRIVE@ $(BOOT_JDK)/bin/native2ascii +NATIVE2ASCII=@FIXPATH@ $(BOOT_JDK)/bin/native2ascii # Base flags for RC # Guarding this against resetting value. Legacy make files include spec multiple @@ -424,21 +432,20 @@ endif # A specific java binary with specific options can be used to run # the long running background sjavac servers and other long running tasks. -SJAVAC_SERVER_JAVA:=@UNCYGDRIVE@ @SJAVAC_SERVER_JAVA@ +SJAVAC_SERVER_JAVA:=@FIXPATH@ @SJAVAC_SERVER_JAVA@ # Tools adhering to a minimal and common standard of posix compliance. AWK:=@AWK@ BASENAME:=@BASENAME@ +BASH:=@BASH@ CAT:=@CAT@ CCACHE:=@CCACHE@ # CD is going away, but remains to cater for legacy makefiles. CD:=cd CHMOD:=@CHMOD@ CP:=@CP@ -CPIO:=@CPIO@ CUT:=@CUT@ DATE:=@DATE@ -DF:=@DF@ DIFF:=@DIFF@ FIND:=@FIND@ FIND_DELETE:=@FIND_DELETE@ @@ -461,6 +468,7 @@ SORT:=@SORT@ TAR:=@TAR@ TAIL:=@TAIL@ TEE:=@TEE@ +TIME:=@TIME@ TR:=@TR@ TOUCH:=@TOUCH@ WC:=@WC@ @@ -468,9 +476,9 @@ XARGS:=@XARGS@ ZIPEXE:=@ZIP@ ZIP:=@ZIP@ UNZIP:=@UNZIP@ -MT:=@UNCYGDRIVE@ @MT@ -RC:=@UNCYGDRIVE@ @RC@ -DUMPBIN:=@UNCYGDRIVE@ @DUMPBIN@ +MT:=@FIXPATH@ @MT@ +RC:=@FIXPATH@ @RC@ +DUMPBIN:=@FIXPATH@ @DUMPBIN@ CYGPATH:=@CYGPATH@ LDD:=@LDD@ OTOOL:=@OTOOL@ @@ -479,8 +487,9 @@ EXPR:=@EXPR@ FILE:=@FILE@ HG:=@HG@ OBJCOPY:=@OBJCOPY@ +SETFILE:=@SETFILE@ -UNCYGDRIVE:=@UNCYGDRIVE@ +FIXPATH:=@FIXPATH@ # Where the build output is stored for your convenience. BUILD_LOG:=@BUILD_LOG@ @@ -488,14 +497,12 @@ BUILD_LOG_PREVIOUS:=@BUILD_LOG_PREVIOUS@ BUILD_LOG_WRAPPER:=@BUILD_LOG_WRAPPER@ # Build setup -DISABLE_NIMBUS:=@DISABLE_NIMBUS@ ENABLE_JFR=@ENABLE_JFR@ USE_EXTERNAL_LIBJPEG:=@USE_EXTERNAL_LIBJPEG@ USE_EXTERNAL_LIBGIF:=@USE_EXTERNAL_LIBGIF@ USE_EXTERNAL_LIBZ:=@USE_EXTERNAL_LIBZ@ LIBZIP_CAN_USE_MMAP:=@LIBZIP_CAN_USE_MMAP@ -CHECK_FOR_VCINSTALLDIR=@CHECK_FOR_VCINSTALLDIR@ -MSVCRNN_DLL:=@MSVCR100DLL@ +MSVCR_DLL:=@MSVCR_DLL@ # ADD_SRCS takes a single argument with source roots diff --git a/common/autoconf/toolchain.m4 b/common/autoconf/toolchain.m4 index 45c376fb074..eb8d2b1ccc5 100644 --- a/common/autoconf/toolchain.m4 +++ b/common/autoconf/toolchain.m4 @@ -23,111 +23,67 @@ # questions. # -AC_DEFUN_ONCE([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV], +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) +AC_DEFUN([TOOLCHAIN_CHECK_COMPILER_VERSION], [ + COMPILER=[$]$1 + COMPILER_NAME=$2 -# Check if the VS env variables were setup prior to running configure. -# If not, then find vcvarsall.bat and run it automatically, and integrate -# the set env variables into the spec file. -SETUPDEVENV="# No special vars" -if test "x$OPENJDK_BUILD_OS" = "xwindows"; then - # Store path to cygwin link.exe to help excluding it when searching for - # VS linker. - AC_PATH_PROG(CYGWIN_LINK, link) - AC_MSG_CHECKING([if the first found link.exe is actually the Cygwin link tool]) - "$CYGWIN_LINK" --version > /dev/null - if test $? -eq 0 ; then - AC_MSG_RESULT([yes]) + if test "x$OPENJDK_TARGET_OS" = xsolaris; then + # Make sure we use the Sun Studio compiler and not gcc on Solaris, which won't work + COMPILER_VERSION_TEST=`$COMPILER -V 2>&1 | $HEAD -n 1` + $ECHO $COMPILER_VERSION_TEST | $GREP "^.*: Sun $COMPILER_NAME" > /dev/null + if test $? -ne 0; then + GCC_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + + AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required Sun Studio compiler.]) + AC_MSG_NOTICE([The result from running with -V was: "$COMPILER_VERSION_TEST" and with --version: "$GCC_VERSION_TEST"]) + AC_MSG_ERROR([Sun Studio compiler is required. Try setting --with-tools-dir.]) else - AC_MSG_RESULT([no]) - # This might be the VS linker. Don't exclude it later on. - CYGWIN_LINK="" + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*@<:@ ,\t@:>@$COMPILER_NAME@<:@ ,\t@:>@\(@<:@1-9@:>@\.@<:@0-9@:>@@<:@0-9@:>@*\).*/\1/p"` + COMPILER_VENDOR="Sun Studio" + fi + elif test "x$OPENJDK_TARGET_OS" = xwindows; then + # First line typically looks something like: + # Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 16.00.30319.01 for 80x86 + COMPILER_VERSION_TEST=`$COMPILER 2>&1 | $HEAD -n 1` + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.*Version \(@<:@1-9@:>@@<:@0-9.@:>@*\) .*/\1/p"` + COMPILER_VENDOR="Microsoft CL.EXE" + COMPILER_CPU_TEST=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* for \(.*\)$/\1/p"` + if test "x$OPENJDK_TARGET_CPU" = "xx86"; then + if test "x$COMPILER_CPU_TEST" != "x80x86"; then + AC_MSG_ERROR([Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for "$COMPILER_CPU_TEST"; expected "80x86".]) + fi + elif test "x$OPENJDK_TARGET_CPU" = "xx86_64"; then + if test "x$COMPILER_CPU_TEST" != "xx64"; then + AC_MSG_ERROR([Target CPU mismatch. We are building for $OPENJDK_TARGET_CPU but CL is for "$COMPILER_CPU_TEST"; expected "x64".]) + fi + fi + else + COMPILER_VERSION_TEST=`$COMPILER --version 2>&1 | $HEAD -n 1` + # Check that this is likely to be GCC. + $COMPILER --version 2>&1 | $GREP "Free Software Foundation" > /dev/null + if test $? -ne 0; then + AC_MSG_NOTICE([The $COMPILER_NAME compiler (located as $COMPILER) does not seem to be the required GCC compiler.]) + AC_MSG_NOTICE([The result from running with --version was: "$COMPILER_VERSION_TEST"]) + AC_MSG_ERROR([GCC compiler is required. Try setting --with-tools-dir.]) fi - # If vcvarsall.bat has been run, then VCINSTALLDIR is set. - if test "x$VCINSTALLDIR" != x; then - # No further setup is needed. The build will happen from this kind - # of shell. - SETUPDEVENV="# This spec file expects that you are running bash from within a VS command prompt." - # Make sure to remind you, if you forget to run make from a cygwin bash shell - # that is spawned "bash -l" from a VS command prompt. - CHECK_FOR_VCINSTALLDIR=yes - AC_MSG_CHECKING([if you are running from within a VS command prompt]) - AC_MSG_RESULT([yes]) - else - # Ah, we have not yet run vcvarsall.bat/vsvars32.bat/vsvars64.bat. Lets do that. First find it. - if test "x$VS100COMNTOOLS" != x; then - VARSBAT=`find "$VS100COMNTOOLS/../.." -name vcvarsall.bat` - SEARCH_ROOT="$VS100COMNTOOLS" - else - VARSBAT=`find "$PROGRAMFILES" -name vcvarsall.bat` - SEARCH_ROOT="$PROGRAMFILES" - fi - VCPATH=`dirname "$VARSBAT"` - VCPATH=`cygpath -w "$VCPATH"` - if test "x$VARSBAT" = x || test ! -d "$VCPATH"; then - AC_MSG_CHECKING([if we can find the VS installation]) - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Tried to find a VS installation using both $SEARCH_ROOT but failed. Please run "c:\\cygwin\\bin\\bash.exe -l" from a VS command prompt and then run configure/make from there.]) - fi - case "$OPENJDK_TARGET_CPU" in - x86) - VARSBAT_ARCH=x86 - ;; - x86_64) - VARSBAT_ARCH=amd64 - ;; - esac - # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat - cd $OUTPUT_ROOT - bash $SRC_ROOT/common/bin/extractvcvars.sh "$VARSBAT" "$VARSBAT_ARCH" - cd $CURDIR - if test ! -s $OUTPUT_ROOT/localdevenv.sh || test ! -s $OUTPUT_ROOT/localdevenv.gmk; then - AC_MSG_CHECKING([if we can extract the needed env variables]) - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Could not succesfully extract the env variables needed for the VS setup. Please run "c:\\cygwin\\bin\\bash.exe -l" from a VS command prompt and then run configure/make from there.]) - fi - # Now set all paths and other env variables. This will allow the rest of - # the configure script to find and run the compiler in the proper way. - . $OUTPUT_ROOT/localdevenv.sh - AC_MSG_CHECKING([if we can find the VS installation]) - if test "x$VCINSTALLDIR" != x; then - AC_MSG_RESULT([$VCINSTALLDIR]) - else - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Could not find VS installation. Please install. If you are sure you have installed VS, then please run "c:\\cygwin\\bin\\bash.exe -l" from a VS command prompt and then run configure/make from there.]) - fi - CHECK_FOR_VCINSTALLDIR=no - SETUPDEVENV="include $OUTPUT_ROOT/localdevenv.gmk" + # First line typically looks something like: + # gcc (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2 + COMPILER_VERSION=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^.* \(@<:@1-9@:>@@<:@0-9.@:>@*\)/\1/p"` + COMPILER_VENDOR=`$ECHO $COMPILER_VERSION_TEST | $SED -n "s/^\(.*\) @<:@1-9@:>@@<:@0-9.@:>@*/\1/p"` + fi + # This sets CC_VERSION or CXX_VERSION. (This comment is a grep marker) + $1_VERSION="$COMPILER_VERSION" + # This sets CC_VENDOR or CXX_VENDOR. (This comment is a grep marker) + $1_VENDOR="$COMPILER_VENDOR" - AC_MSG_CHECKING([for msvcr100.dll]) - AC_ARG_WITH(msvcr100dll, [AS_HELP_STRING([--with-msvcr100dll], - [copy this msvcr100.dll into the built JDK])]) - if test "x$with_msvcr100dll" != x; then - MSVCR100DLL="$with_msvcr100dll" - else - if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x64 | head --lines 1` - else - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` - if test "x$MSVCR100DLL" = x; then - MSVCR100DLL=`find "$VCINSTALLDIR/.." -name msvcr100.dll | head --lines 1` - fi - fi - fi - if test "x$MSVCR100DLL" = x; then - AC_MSG_RESULT([no]) - AC_MSG_ERROR([Could not find msvcr100.dll !]) - fi - AC_MSG_RESULT([$MSVCR100DLL]) - SPACESAFE(MSVCR100DLL,[the path to msvcr100.dll]) - fi -fi -AC_SUBST(SETUPDEVENV) -AC_SUBST(CHECK_FOR_VCINSTALLDIR) -AC_SUBST(MSVCR100DLL) + AC_MSG_NOTICE([Using $COMPILER_VENDOR $COMPILER_NAME compiler version $COMPILER_VERSION (located at $COMPILER)]) ]) + AC_DEFUN_ONCE([TOOLCHAIN_SETUP_SYSROOT_AND_OUT_OPTIONS], [ ############################################################################### @@ -151,8 +107,67 @@ AC_SUBST(LD_OUT_OPTION) AC_SUBST(AR_OUT_OPTION) ]) -AC_DEFUN_ONCE([TOOLCHAIN_SETUP_PATHS], +# $1 = compiler to test (CC or CXX) +# $2 = human readable name of compiler (C or C++) +# $3 = list of compiler names to search for +AC_DEFUN([TOOLCHAIN_FIND_COMPILER], [ + COMPILER_NAME=$2 + + # Do a first initial attempt at searching the list of compiler names. + # AC_PATH_PROGS can't be run multiple times with the same variable, + # so create a new name for this run. + AC_PATH_PROGS(POTENTIAL_$1, $3) + $1=$POTENTIAL_$1 + + if test "x$[$]$1" = x; then + HELP_MSG_MISSING_DEPENDENCY([devkit]) + AC_MSG_ERROR([Could not find a $COMPILER_NAME compiler. $HELP_MSG]) + fi + BASIC_FIXUP_EXECUTABLE($1) + AC_MSG_CHECKING([resolved symbolic links for $1]) + TEST_COMPILER="[$]$1" + BASIC_REMOVE_SYMBOLIC_LINKS(TEST_COMPILER) + AC_MSG_RESULT([$TEST_COMPILER]) + AC_MSG_CHECKING([if $1 is disguised ccache]) + + COMPILER_BASENAME=`$BASENAME "$TEST_COMPILER"` + if test "x$COMPILER_BASENAME" = "xccache"; then + AC_MSG_RESULT([yes, trying to find proper $COMPILER_NAME compiler]) + # We /usr/lib/ccache in the path, so cc is a symlink to /usr/bin/ccache. + # We want to control ccache invocation ourselves, so ignore this cc and try + # searching again. + + # Remove the path to the fake ccache cc from the PATH + RETRY_COMPILER_SAVED_PATH="$PATH" + COMPILER_DIRNAME=`$DIRNAME [$]$1` + PATH="`$ECHO $PATH | $SED -e "s,$COMPILER_DIRNAME,,g" -e "s,::,:,g" -e "s,^:,,g"`" + + # Try again looking for our compiler + AC_CHECK_TOOLS(PROPER_COMPILER_$1, $3) + BASIC_FIXUP_EXECUTABLE(PROPER_COMPILER_$1) + PATH="$RETRY_COMPILER_SAVED_PATH" + + AC_MSG_CHECKING([for resolved symbolic links for $1]) + BASIC_REMOVE_SYMBOLIC_LINKS(PROPER_COMPILER_$1) + AC_MSG_RESULT([$PROPER_COMPILER_$1]) + $1="$PROPER_COMPILER_$1" + else + AC_MSG_RESULT([no, keeping $1]) + $1="$TEST_COMPILER" + fi + TOOLCHAIN_CHECK_COMPILER_VERSION([$1], [$COMPILER_NAME]) +]) + + +AC_DEFUN([TOOLCHAIN_SETUP_PATHS], +[ +if test "x$OPENJDK_TARGET_OS" = "xwindows"; then + TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV +fi + +AC_SUBST(MSVCR_DLL) + # If --build AND --host is set, then the configure script will find any # cross compilation tools in the PATH. Cross compilation tools # follows the cross compilation standard where they are prefixed with ${host}. @@ -171,11 +186,11 @@ if test "x$COMPILE_TYPE" = "xcross"; then # Otherwise, we'll set the BUILD_tools to the native tools, but that'll have # to wait until they are properly discovered. AC_PATH_PROGS(BUILD_CC, [cl cc gcc]) - SET_FULL_PATH(BUILD_CC) + BASIC_FIXUP_EXECUTABLE(BUILD_CC) AC_PATH_PROGS(BUILD_CXX, [cl CC g++]) - SET_FULL_PATH(BUILD_CXX) + BASIC_FIXUP_EXECUTABLE(BUILD_CXX) AC_PATH_PROG(BUILD_LD, ld) - SET_FULL_PATH(BUILD_LD) + BASIC_FIXUP_EXECUTABLE(BUILD_LD) fi AC_SUBST(BUILD_CC) AC_SUBST(BUILD_CXX) @@ -218,36 +233,40 @@ if test "x$TOOLS_DIR" != x; then PATH=$TOOLS_DIR:$PATH fi + +### Locate C compiler (CC) + # gcc is almost always present, but on Windows we # prefer cl.exe and on Solaris we prefer CC. # Thus test for them in this order. -AC_PROG_CC([cl cc gcc]) -if test "x$CC" = x; then - HELP_MSG_MISSING_DEPENDENCY([devkit]) - AC_MSG_ERROR([Could not find a compiler. $HELP_MSG]) -fi -if test "x$CC" = xcc && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # Do not use cc on MacOSX use gcc instead. - CC="gcc" -fi -SET_FULL_PATH(CC) - -AC_PROG_CXX([cl CC g++]) -if test "x$CXX" = xCC && test "x$OPENJDK_BUILD_OS" = xmacosx; then - # The found CC, even though it seems to be a g++ derivate, cannot compile - # c++ code. Override. - CXX="g++" -fi -SET_FULL_PATH(CXX) - -if test "x$CXX" = x || test "x$CC" = x; then - HELP_MSG_MISSING_DEPENDENCY([devkit]) - AC_MSG_ERROR([Could not find the needed compilers! $HELP_MSG ]) +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for cc on MacOSX. + COMPILER_CHECK_LIST="cl gcc" +else + COMPILER_CHECK_LIST="cl cc gcc" fi -if test "x$OPENJDK_BUILD_OS" != xwindows; then +TOOLCHAIN_FIND_COMPILER([CC],[C],[$COMPILER_CHECK_LIST]) +# Now that we have resolved CC ourself, let autoconf have it's go at it +AC_PROG_CC([$CC]) + +### Locate C++ compiler (CXX) + +if test "x$OPENJDK_TARGET_OS" = xmacosx; then + # Do not probe for CC on MacOSX. + COMPILER_CHECK_LIST="cl g++" +else + COMPILER_CHECK_LIST="cl CC g++" +fi +TOOLCHAIN_FIND_COMPILER([CXX],[C++],[$COMPILER_CHECK_LIST]) +# Now that we have resolved CXX ourself, let autoconf have it's go at it +AC_PROG_CXX([$CXX]) + +### Locate other tools + +if test "x$OPENJDK_TARGET_OS" = xmacosx; then AC_PROG_OBJC - SET_FULL_PATH(OBJC) + BASIC_FIXUP_EXECUTABLE(OBJC) else OBJC= fi @@ -270,20 +289,26 @@ AC_SUBST(LDCXX) # Linking C++ executables. AC_SUBST(LDEXECXX) -if test "x$OPENJDK_BUILD_OS" != xwindows; then +if test "x$OPENJDK_TARGET_OS" != xwindows; then AC_CHECK_TOOL(AR, ar) - SET_FULL_PATH(AR) + BASIC_FIXUP_EXECUTABLE(AR) fi -if test "x$OPENJDK_BUILD_OS" = xmacosx; then +if test "x$OPENJDK_TARGET_OS" = xmacosx; then ARFLAGS="-r" else ARFLAGS="" fi AC_SUBST(ARFLAGS) +# For hotspot, we need these in Windows mixed path; other platforms keep them the same +HOTSPOT_CXX="$CXX" +HOTSPOT_LD="$LD" +AC_SUBST(HOTSPOT_CXX) +AC_SUBST(HOTSPOT_LD) + COMPILER_NAME=gcc COMPILER_TYPE=CC -AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ +AS_IF([test "x$OPENJDK_TARGET_OS" = xwindows], [ # For now, assume that we are always compiling using cl.exe. CC_OUT_OPTION=-Fo EXE_OUT_OPTION=-out: @@ -294,7 +319,7 @@ AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ AC_CHECK_PROG([WINLD], [link],[link],,, [$CYGWIN_LINK]) # Since we must ignore the first found link, WINLD will contain # the full path to the link.exe program. - SET_FULL_PATH_SPACESAFE([WINLD]) + BASIC_FIXUP_EXECUTABLE(WINLD) printf "Windows linker was found at $WINLD\n" AC_MSG_CHECKING([if the found link.exe is actually the Visual Studio linker]) "$WINLD" --version > /dev/null @@ -310,12 +335,25 @@ AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ LDEXECXX="$WINLD" AC_CHECK_PROG([MT], [mt], [mt],,, [/usr/bin/mt]) - SET_FULL_PATH_SPACESAFE([MT]) + BASIC_FIXUP_EXECUTABLE(MT) # The resource compiler AC_CHECK_PROG([RC], [rc], [rc],,, [/usr/bin/rc]) - SET_FULL_PATH_SPACESAFE([RC]) + BASIC_FIXUP_EXECUTABLE(RC) - RC_FLAGS="-nologo /l 0x409 /r" + # For hotspot, we need these in Windows mixed path, + # so rewrite them all. Need added .exe suffix. + HOTSPOT_CXX="$CXX.exe" + HOTSPOT_LD="$LD.exe" + HOTSPOT_MT="$MT.exe" + HOTSPOT_RC="$RC.exe" + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_CXX) + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_LD) + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_MT) + BASIC_WINDOWS_REWRITE_AS_WINDOWS_MIXED_PATH(HOTSPOT_RC) + AC_SUBST(HOTSPOT_MT) + AC_SUBST(HOTSPOT_RC) + + RC_FLAGS="-nologo -l 0x409 -r" AS_IF([test "x$VARIANT" = xOPT], [ RC_FLAGS="$RC_FLAGS -d NDEBUG" ]) @@ -333,12 +371,12 @@ AS_IF([test "x$OPENJDK_BUILD_OS" = xwindows], [ # lib.exe is used to create static libraries. AC_CHECK_PROG([WINAR], [lib],[lib],,,) - SET_FULL_PATH_SPACESAFE([WINAR]) + BASIC_FIXUP_EXECUTABLE(WINAR) AR="$WINAR" ARFLAGS="-nologo -NODEFAULTLIB:MSVCRT" AC_CHECK_PROG([DUMPBIN], [dumpbin], [dumpbin],,,) - SET_FULL_PATH_SPACESAFE([DUMPBIN]) + BASIC_FIXUP_EXECUTABLE(DUMPBIN) COMPILER_TYPE=CL CCXXFLAGS="$CCXXFLAGS -nologo" @@ -347,10 +385,10 @@ AC_SUBST(RC_FLAGS) AC_SUBST(COMPILER_TYPE) AC_PROG_CPP -SET_FULL_PATH(CPP) +BASIC_FIXUP_EXECUTABLE(CPP) AC_PROG_CXXCPP -SET_FULL_PATH(CXXCPP) +BASIC_FIXUP_EXECUTABLE(CXXCPP) if test "x$COMPILE_TYPE" != "xcross"; then # If we are not cross compiling, use the same compilers for @@ -373,43 +411,44 @@ if test "x$OPENJDK_BUILD_OS" = xsolaris; then fi # Find the right assembler. -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then AC_PATH_PROG(AS, as) - SET_FULL_PATH(AS) + BASIC_FIXUP_EXECUTABLE(AS) else AS="$CC -c" fi AC_SUBST(AS) -if test "x$OPENJDK_BUILD_OS" = xsolaris; then +if test "x$OPENJDK_TARGET_OS" = xsolaris; then AC_PATH_PROGS(NM, [gnm nm]) - SET_FULL_PATH(NM) + BASIC_FIXUP_EXECUTABLE(NM) AC_PATH_PROG(STRIP, strip) - SET_FULL_PATH(STRIP) + BASIC_FIXUP_EXECUTABLE(STRIP) AC_PATH_PROG(MCS, mcs) - SET_FULL_PATH(MCS) -elif test "x$OPENJDK_BUILD_OS" != xwindows; then + BASIC_FIXUP_EXECUTABLE(MCS) +elif test "x$OPENJDK_TARGET_OS" != xwindows; then AC_CHECK_TOOL(NM, nm) - SET_FULL_PATH(NM) + BASIC_FIXUP_EXECUTABLE(NM) AC_CHECK_TOOL(STRIP, strip) - SET_FULL_PATH(STRIP) + BASIC_FIXUP_EXECUTABLE(STRIP) fi -### -# -# Check for objcopy -# -# but search for gobjcopy first... -# since I on solaris found a broken objcopy...buhh -# -AC_PATH_TOOL(OBJCOPY, gobjcopy) -if test "x$OBJCOPY" = x; then - AC_PATH_TOOL(OBJCOPY, objcopy) +# objcopy is used for moving debug symbols to separate files when +# full debug symbols are enabled. +if test "x$OPENJDK_TARGET_OS" = xsolaris || test "x$OPENJDK_TARGET_OS" = xlinux; then + AC_CHECK_TOOLS(OBJCOPY, [gobjcopy objcopy]) + BASIC_FIXUP_EXECUTABLE(OBJCOPY) +fi + +AC_CHECK_TOOLS(OBJDUMP, [gobjdump objdump]) +if test "x$OBJDUMP" != x; then + # Only used for compare.sh; we can live without it. BASIC_FIXUP_EXECUTABLE bails if argument is missing. + BASIC_FIXUP_EXECUTABLE(OBJDUMP) fi if test "x$OPENJDK_TARGET_OS" = "xmacosx"; then AC_PATH_PROG(LIPO, lipo) - SET_FULL_PATH(LIPO) + BASIC_FIXUP_EXECUTABLE(LIPO) fi # Restore old path without tools dir @@ -449,7 +488,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -g" # Linking is different on MacOSX - if test "x$OPENJDK_BUILD_OS" = xmacosx; then + if test "x$OPENJDK_TARGET_OS" = xmacosx; then # Might change in the future to clang. COMPILER_NAME=gcc SHARED_LIBRARY='lib[$]1.dylib' @@ -463,7 +502,7 @@ if test "x$GCC" = xyes; then POST_STRIP_CMD="$STRIP -S" fi else - if test "x$OPENJDK_BUILD_OS" = xsolaris; then + if test "x$OPENJDK_TARGET_OS" = xsolaris; then # If it is not gcc, then assume it is the Oracle Solaris Studio Compiler COMPILER_NAME=ossc PICFLAG="-KPIC" @@ -487,7 +526,7 @@ else POST_STRIP_CMD="$STRIP -x" POST_MCS_CMD="$MCS -d -a \"JDK $FULL_VERSION\"" fi - if test "x$OPENJDK_BUILD_OS" = xwindows; then + if test "x$OPENJDK_TARGET_OS" = xwindows; then # If it is not gcc, then assume it is the MS Visual Studio compiler COMPILER_NAME=cl PICFLAG="" @@ -626,6 +665,11 @@ case $COMPILER_TYPE in # Can cause undefined external on Solaris 8 X86 on __sincos, removing for now #CC_HIGHEST="$CC_HIGHEST -xlibmopt" + if test "x$OPENJDK_TARGET_CPU" = xsparc; then + CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" + CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" + fi + case $OPENJDK_TARGET_CPU_ARCH in x86) C_O_FLAG_HIGHEST="-xO4 -Wu,-O4~yz $CC_HIGHEST -xregs=no%frameptr" @@ -642,8 +686,6 @@ case $COMPILER_TYPE in fi ;; sparc) - CFLAGS_JDK="${CFLAGS_JDK} -xmemalign=4s" - CXXFLAGS_JDK="${CXXFLAGS_JDK} -xmemalign=4s" CFLAGS_JDKLIB_EXTRA="${CFLAGS_JDKLIB_EXTRA} -xregs=no%appl" CXXFLAGS_JDKLIB_EXTRA="${CXXFLAGS_JDKLIB_EXTRA} -xregs=no%appl" C_O_FLAG_HIGHEST="-xO4 -Wc,-Qrm-s -Wc,-Qiselect-T0 $CC_HIGHEST -xprefetch=auto,explicit -xchip=ultra" @@ -759,7 +801,7 @@ case $COMPILER_NAME in CCXXFLAGS_JDK="$CCXXFLAGS $CCXXFLAGS_JDK -DTRACING -DMACRO_MEMSYS_OPS -DBREAKPTS" case $OPENJDK_TARGET_CPU_ARCH in x86 ) - CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -Di386" + CCXXFLAGS_JDK="$CCXXFLAGS_JDK -DcpuIntel -Di586 -D$OPENJDK_TARGET_CPU_LEGACY_LIB" CFLAGS_JDK="$CFLAGS_JDK -erroff=E_BAD_PRAGMA_PACK_VALUE" ;; esac @@ -859,7 +901,7 @@ CXXFLAGS_JDKEXE="$CCXXFLAGS_JDK $CXXFLAGS_JDK" # libraries will link to whatever is in memory. Yuck. # # Thus we offer the compiler to find libjvm.so first in server then in client. It works. Ugh. -if test "x$COMPILER_TYPE" = xCL; then +if test "x$COMPILER_NAME" = xcl; then LDFLAGS_JDK="$LDFLAGS_JDK -nologo -opt:ref -incremental:no" if test "x$OPENJDK_TARGET_CPU" = xx86; then LDFLAGS_JDK="$LDFLAGS_JDK -safeseh" @@ -875,19 +917,23 @@ if test "x$COMPILER_TYPE" = xCL; then fi LDFLAGS_JDKEXE="${LDFLAGS_JDK} /STACK:$LDFLAGS_STACK_SIZE" else - # If this is a --hash-style=gnu system, use --hash-style=both, why? - HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` - if test -n "$HAS_GNU_HASH"; then - # And since we now know that the linker is gnu, then add -z defs, to forbid - # undefined symbols in object files. - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both -Xlinker -z -Xlinker defs" - if test "x$DEBUG_LEVEL" == "xrelease"; then - # When building release libraries, tell the linker optimize them. - # Should this be supplied to the OSS linker as well? - LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + if test "x$COMPILER_NAME" = xgcc; then + # If this is a --hash-style=gnu system, use --hash-style=both, why? + HAS_GNU_HASH=`$CC -dumpspecs 2>/dev/null | $GREP 'hash-style=gnu'` + if test -n "$HAS_GNU_HASH"; then + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker --hash-style=both " + fi + if test "x$OPENJDK_TARGET_OS" = xlinux; then + # And since we now know that the linker is gnu, then add -z defs, to forbid + # undefined symbols in object files. + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -z -Xlinker defs" + if test "x$DEBUG_LEVEL" = "xrelease"; then + # When building release libraries, tell the linker optimize them. + # Should this be supplied to the OSS linker as well? + LDFLAGS_JDK="${LDFLAGS_JDK} -Xlinker -O1" + fi fi fi - LDFLAGS_JDKLIB="${LDFLAGS_JDK} $SHARED_LIBRARY_FLAGS \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/server \ -L${JDK_OUTPUTDIR}/lib${OPENJDK_TARGET_CPU_LIBDIR}/client \ diff --git a/common/autoconf/toolchain_windows.m4 b/common/autoconf/toolchain_windows.m4 new file mode 100644 index 00000000000..f034ded638c --- /dev/null +++ b/common/autoconf/toolchain_windows.m4 @@ -0,0 +1,258 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT], +[ + if test "x$VS_ENV_CMD" = x; then + VS100BASE="$1" + METHOD="$2" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(VS100BASE) + if test -d "$VS100BASE"; then + if test -f "$VS100BASE/$VCVARSFILE"; then + AC_MSG_NOTICE([Found Visual Studio installation at $VS100BASE using $METHOD]) + VS_ENV_CMD="$VS100BASE/$VCVARSFILE" + else + AC_MSG_NOTICE([Found Visual Studio installation at $VS100BASE using $METHOD]) + AC_MSG_NOTICE([Warning: $VCVARSFILE is missing, this is probably Visual Studio Express. Ignoring]) + fi + fi + fi +]) + +AC_DEFUN([TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT], +[ + if test "x$VS_ENV_CMD" = x; then + WIN_SDK_BASE="$1" + METHOD="$2" + BASIC_WINDOWS_REWRITE_AS_UNIX_PATH(WIN_SDK_BASE) + if test -d "$WIN_SDK_BASE"; then + if test -f "$WIN_SDK_BASE/SetEnv.Cmd"; then + AC_MSG_NOTICE([Found Windows SDK installation at $WIN_SDK_BASE using $METHOD]) + VS_ENV_CMD="$WIN_SDK_BASE/SetEnv.Cmd" + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VS_ENV_ARGS="/x86" + else + VS_ENV_ARGS="/x64" + fi + else + AC_MSG_NOTICE([Found Windows SDK installation at $WIN_SDK_BASE using $METHOD]) + AC_MSG_NOTICE([Warning: Installation is broken, SetEnv.Cmd is missing. Ignoring]) + fi + fi + fi +]) + +AC_DEFUN([TOOLCHAIN_FIND_VISUAL_STUDIO_BAT_FILE], +[ + if test "x$OPENJDK_TARGET_CPU_BITS" = x32; then + VCVARSFILE="vc/bin/vcvars32.bat" + else + VCVARSFILE="vc/bin/amd64/vcvars64.bat" + fi + + VS_ENV_CMD="" + VS_ENV_ARGS="" + if test "x$with_toolsdir" != x; then + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([$with_toolsdir/../..], [--with-tools-dir]) + fi + + if test "x$with_toolsdir" != x && test "x$VS_ENV_CMD" = x; then + # Having specified an argument which is incorrect will produce an instant failure; + # we should not go on looking + AC_MSG_NOTICE([The path given by --with-tools-dir does not contain a valid Visual Studio installation]) + AC_MSG_NOTICE([Please point to the VC/bin directory within the Visual Studio installation]) + AC_MSG_ERROR([Cannot locate a valid Visual Studio installation]) + fi + + if test "x$ProgramW6432" != x; then + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([$ProgramW6432/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + fi + if test "x$PROGRAMW6432" != x; then + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([$PROGRAMW6432/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + fi + if test "x$PROGRAMFILES" != x; then + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([$PROGRAMFILES/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + fi + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([C:/Program Files/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + TOOLCHAIN_CHECK_POSSIBLE_WIN_SDK_ROOT([C:/Program Files (x86)/Microsoft SDKs/Windows/v7.1/Bin], [well-known name]) + + if test "x$VS100COMNTOOLS" != x; then + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([$VS100COMNTOOLS/../..], [VS100COMNTOOLS variable]) + fi + if test "x$PROGRAMFILES" != x; then + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([$PROGRAMFILES/Microsoft Visual Studio 10.0], [well-known name]) + fi + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([C:/Program Files/Microsoft Visual Studio 10.0], [well-known name]) + TOOLCHAIN_CHECK_POSSIBLE_VISUAL_STUDIO_ROOT([C:/Program Files (x86)/Microsoft Visual Studio 10.0], [well-known name]) +]) + +# Check if the VS env variables were setup prior to running configure. +# If not, then find vcvarsall.bat and run it automatically, and integrate +# the set env variables into the spec file. +AC_DEFUN([TOOLCHAIN_SETUP_VISUAL_STUDIO_ENV], +[ + # Store path to cygwin link.exe to help excluding it when searching for + # VS linker. This must be done before changing the PATH when looking for VS. + AC_PATH_PROG(CYGWIN_LINK, link) + if test "x$CYGWIN_LINK" != x; then + AC_MSG_CHECKING([if the first found link.exe is actually the Cygwin link tool]) + "$CYGWIN_LINK" --version > /dev/null + if test $? -eq 0 ; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + # This might be the VS linker. Don't exclude it later on. + CYGWIN_LINK="" + fi + fi + + # First-hand choice is to locate and run the vsvars bat file. + TOOLCHAIN_FIND_VISUAL_STUDIO_BAT_FILE + if test "x$VS_ENV_CMD" != x; then + # We have found a Visual Studio environment on disk, let's extract variables from the vsvars bat file. + BASIC_FIXUP_EXECUTABLE(VS_ENV_CMD) + + # Lets extract the variables that are set by vcvarsall.bat/vsvars32.bat/vsvars64.bat + AC_MSG_NOTICE([Trying to extract Visual Studio environment variables]) + cd $OUTPUT_ROOT + # FIXME: The code betweeen ---- was inlined from a separate script and is not properly adapted + # to autoconf standards. + + #---- + + # Cannot use the VS10 setup script directly (since it only updates the DOS subshell environment) + # but calculate the difference in Cygwin environment before/after running it and then + # apply the diff. + + if test "x$OPENJDK_BUILD_OS_ENV" = xwindows.cygwin; then + _vs10varsall=`cygpath -a -m -s "$VS_ENV_CMD"` + _dosvs10varsall=`cygpath -a -w -s $_vs10varsall` + _dosbash=`cygpath -a -w -s \`which bash\`.*` + else + _dosvs10varsall=`cmd //c echo $VS_ENV_CMD` + _dosbash=`cmd //c echo \`which bash\`` + fi + + # generate the set of exported vars before/after the vs10 setup + $ECHO "@echo off" > localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export0" >> localdevenvtmp.bat + $ECHO "call $_dosvs10varsall $VS_ENV_ARGS" >> localdevenvtmp.bat + $ECHO "$_dosbash -c \"export -p\" > localdevenvtmp.export1" >> localdevenvtmp.bat + + # Now execute the newly created bat file. + # The | cat is to stop SetEnv.Cmd to mess with system colors on msys + cmd /c localdevenvtmp.bat | cat + + # apply the diff (less some non-vs10 vars named by "!") + $SORT localdevenvtmp.export0 | $GREP -v "!" > localdevenvtmp.export0.sort + $SORT localdevenvtmp.export1 | $GREP -v "!" > localdevenvtmp.export1.sort + $COMM -1 -3 localdevenvtmp.export0.sort localdevenvtmp.export1.sort > localdevenv.sh + + # cleanup + $RM localdevenvtmp* + #---- + cd $CURDIR + if test ! -s $OUTPUT_ROOT/localdevenv.sh; then + AC_MSG_RESULT([no]) + AC_MSG_NOTICE([Could not succesfully extract the envionment variables needed for the VS setup.]) + AC_MSG_NOTICE([Try setting --with-tools-dir to the VC/bin directory within the VS installation]) + AC_MSG_NOTICE([or run "bash.exe -l" from a VS command prompt and then run configure from there.]) + AC_MSG_ERROR([Cannot continue]) + fi + + # Now set all paths and other env variables. This will allow the rest of + # the configure script to find and run the compiler in the proper way. + AC_MSG_NOTICE([Setting extracted environment variables]) + . $OUTPUT_ROOT/localdevenv.sh + else + # We did not find a vsvars bat file, let's hope we are run from a VS command prompt. + AC_MSG_NOTICE([Cannot locate a valid Visual Studio installation, checking current environment]) + fi + + # At this point, we should have corrent variables in the environment, or we can't continue. + AC_MSG_CHECKING([for Visual Studio variables]) + + if test "x$VCINSTALLDIR" != x || test "x$WindowsSDKDir" != x || test "x$WINDOWSSDKDIR" != x; then + if test "x$INCLUDE" = x || test "x$LIB" = x; then + AC_MSG_RESULT([present but broken]) + AC_MSG_ERROR([Your VC command prompt seems broken, INCLUDE and/or LIB is missing.]) + else + AC_MSG_RESULT([ok]) + VS_INCLUDE="$INCLUDE" + VS_LIB="$LIB" + VS_PATH="$PATH" + AC_SUBST(VS_INCLUDE) + AC_SUBST(VS_LIB) + AC_SUBST(VS_PATH) + fi + else + AC_MSG_RESULT([not found]) + + if test "x$VS_ENV_CMD" = x; then + AC_MSG_NOTICE([Cannot locate a valid Visual Studio or Windows SDK installation on disk,]) + AC_MSG_NOTICE([nor is this script run from a Visual Studio command prompt.]) + else + AC_MSG_NOTICE([Running the extraction script failed.]) + fi + AC_MSG_NOTICE([Try setting --with-tools-dir to the VC/bin directory within the VS installation]) + AC_MSG_NOTICE([or run "bash.exe -l" from a VS command prompt and then run configure from there.]) + AC_MSG_ERROR([Cannot continue]) + fi + + AC_MSG_CHECKING([for msvcr100.dll]) + AC_ARG_WITH(msvcr-dll, [AS_HELP_STRING([--with-msvcr-dll], + [copy this msvcr100.dll into the built JDK (Windows only) @<:@probed@:>@])]) + if test "x$with_msvcr_dll" != x; then + MSVCR_DLL="$with_msvcr_dll" + else + if test "x$VCINSTALLDIR" != x; then + if test "x$OPENJDK_TARGET_CPU_BITS" = x64; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x64 | head --lines 1` + else + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | grep x86 | grep -v ia64 | grep -v x64 | head --lines 1` + if test "x$MSVCR_DLL" = x; then + MSVCR_DLL=`find "$VCINSTALLDIR" -name msvcr100.dll | head --lines 1` + fi + fi + if test "x$MSVCR_DLL" != x; then + AC_MSG_NOTICE([msvcr100.dll found in VCINSTALLDIR: $VCINSTALLDIR]) + else + AC_MSG_NOTICE([Warning: msvcr100.dll not found in VCINSTALLDIR: $VCINSTALLDIR]) + fi + fi + if test "x$MSVCR_DLL" = x; then + if test -f "$SYSTEMROOT/system32/msvcr100.dll"; then + AC_MSG_NOTICE([msvcr100.dll found in $SYSTEMROOT/system32]) + MSVCR_DLL="$SYSTEMROOT/system32/msvcr100.dll" + fi + fi + fi + if test "x$MSVCR_DLL" = x; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([Could not find msvcr100.dll !]) + fi + AC_MSG_RESULT([$MSVCR_DLL]) + BASIC_FIXUP_PATH(MSVCR_DLL) +]) diff --git a/common/autoconf/version.numbers b/common/autoconf/version.numbers index fc558c22818..f174ed4228f 100644 --- a/common/autoconf/version.numbers +++ b/common/autoconf/version.numbers @@ -34,3 +34,7 @@ PRODUCT_NAME=OpenJDK PRODUCT_SUFFIX="Runtime Environment" JDK_RC_PLATFORM_NAME=Platform COMPANY_NAME=N/A + +# Might need better names for these +MACOSX_BUNDLE_NAME_BASE="OpenJDK" +MACOSX_BUNDLE_ID_BASE="net.java.openjdk" diff --git a/common/bin/compare.sh b/common/bin/compare.sh new file mode 100644 index 00000000000..5816f838900 --- /dev/null +++ b/common/bin/compare.sh @@ -0,0 +1,1249 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This script is processed by configure before it's usable. It is run from +# the root of the build directory. + + +########################################################################################## + +# Check that we are run via the wrapper generated by configure +if [ -z "$SRC_ROOT" ]; then + echo "Error: You must run this script using build/[conf]/compare.sh" + exit 1 +fi + +if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then + FULLDUMP_CMD="$OTOOL -v -V -h -X -t -d" + LDD_CMD="$OTOOL -L" + DIS_CMD="$OTOOL -v -t" + STAT_PRINT_SIZE="-f %z" +elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then + FULLDUMP_CMD="$DUMPBIN -all" + LDD_CMD="$DUMPBIN -dependants | $GREP .dll" + DIS_CMD="$DUMPBIN -disasm:nobytes" + STAT_PRINT_SIZE="-c %s" +else + FULLDUMP_CMD="$READELF -a" + LDD_CMD="$LDD" + DIS_CMD="$OBJDUMP -d" + STAT_PRINT_SIZE="-c %s" +fi + +UNARCHIVE="$UNZIP -q" + +COMPARE_EXCEPTIONS_INCLUDE="$SRC_ROOT/common/bin/compare_exceptions.sh.incl" +if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then + echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE" + exit 1 +fi +# Include exception definitions +. "$COMPARE_EXCEPTIONS_INCLUDE" + +########################################################################################## +# Compare text files and ignore specific differences: +# +# * Timestamps in Java sources generated by idl2java +# * Sorting order and cleanup style in .properties files + +diff_text() { + OTHER_FILE=$1 + THIS_FILE=$2 + + SUFFIX="${THIS_FILE##*.}" + + TMP=1 + + if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then + TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ + $GREP '^[<>]' | \ + $SED -e '/[<>] Ant-Version: Apache Ant .*/d' \ + -e '/[<>] Created-By: .* (Oracle Corporation).*/d') + fi + if test "x$SUFFIX" = "xjava"; then + TMP=$(LANG=C $DIFF $OTHER_FILE $THIS_FILE | \ + $GREP '^[<>]' | \ + $SED -e '/[<>] \* from.*\.idl/d' \ + -e '/[<>] \*.*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ + -e '/[<>] \*.*[0-9]\{4\} [0-9][0-9]*:[0-9]\{2\}:[0-9]\{2\}.*/d' \ + -e '/\/\/ Generated from input file.*/d' \ + -e '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' \ + -e '/\/\/ java GenerateCharacter.*/d') + fi + # Ignore date strings in class files. + # On Macosx the system sources for generated java classes produce different output on + # consequtive invokations seemingly randomly. + # For example a method parameter randomly named "thePoint" or "aPoint". Ignore this. + if test "x$SUFFIX" = "xclass"; then + # To improve performance when large diffs are found, do a rough filtering of classes + # elibeble for these exceptions + if $GREP -R -e '[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}' -e thePoint -e aPoint -e setItemsPtr ${THIS_FILE} > /dev/null; then + $JAVAP -c -constants -l -p ${OTHER_FILE} > ${OTHER_FILE}.javap + $JAVAP -c -constants -l -p ${THIS_FILE} > ${THIS_FILE}.javap + TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \ + $GREP '^[<>]' | \ + $SED -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \ + -e '/[<>].*Point Lcom\/apple\/jobjc\/foundation\/NSPoint;/d' \ + -e '/[<>].*public com\.apple\.jobjc\.Pointer].*public void setItemsPtr(com\.apple\.jobjc\.Pointer $OTHER_FILE.cleaned + TMP=$(LANG=C $DIFF $OTHER_FILE.cleaned $THIS_FILE) + fi + if test -n "$TMP"; then + echo Files $OTHER_FILE and $THIS_FILE differ + return 1 + fi + + return 0 +} + +########################################################################################## +# Compare directory structure + +compare_dirs() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + mkdir -p $WORK_DIR + + (cd $OTHER_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_other) + (cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_this) + + $DIFF $WORK_DIR/dirs_other $WORK_DIR/dirs_other > $WORK_DIR/dirs_diff + + echo -n Directory structure... + if [ -s $WORK_DIR/dirs_diff ]; then + echo Differences found. + REGRESSIONS=true + # Differences in directories found. + ONLY_OTHER=$($GREP '<' $WORK_DIR/dirs_diff) + if [ "$ONLY_OTHER" ]; then + echo Only in $OTHER + $GREP '<' $WORK_DIR/dirs_diff | $SED 's|< ./| |g' + fi + ONLY_THIS=$($GREP '>' $WORK_DIR/dirs_diff) + if [ "$ONLY_THIS" ]; then + echo Only in $THIS + $GREP '>' $WORK_DIR/dirs_diff | $SED 's|> ./| |g' + fi + else + echo Identical! + fi +} + + +########################################################################################## +# Compare file structure + +compare_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + $MKDIR -p $WORK_DIR + + (cd $OTHER_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_other) + (cd $THIS_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_this) + + $DIFF $WORK_DIR/files_other $WORK_DIR/files_this > $WORK_DIR/files_diff + + echo -n File names... + if [ -s $WORK_DIR/files_diff ]; then + echo Differences found. + REGRESSIONS=true + # Differences in files found. + ONLY_OTHER=$($GREP '<' $WORK_DIR/files_diff) + if [ "$ONLY_OTHER" ]; then + echo Only in $OTHER + $GREP '<' $WORK_DIR/files_diff | $SED 's|< ./| |g' + fi + ONLY_THIS=$($GREP '>' $WORK_DIR/files_diff) + if [ "$ONLY_THIS" ]; then + echo Only in $THIS + $GREP '>' $WORK_DIR/files_diff | $SED 's|> ./| |g' + fi + else + echo Identical! + fi +} + + +########################################################################################## +# Compare permissions + +compare_permissions() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + mkdir -p $WORK_DIR + + echo -n Permissions... + found="" + for f in `cd $OTHER_DIR && $FIND . -type f` + do + if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi + if [ ! -f ${THIS_DIR}/$f ]; then continue; fi + OP=`ls -l ${OTHER_DIR}/$f | awk '{printf("%.10s\n", $1);}'` + TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'` + if [ "$OP" != "$TP" ] + then + if [ -z "$found" ]; then echo ; found="yes"; fi + $PRINTF "\told: ${OP} new: ${TP}\t$f\n" + fi + done + if [ -z "$found" ]; then + echo "Identical!" + else + REGRESSIONS=true + fi +} + +########################################################################################## +# Compare file command output + +compare_file_types() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + $MKDIR -p $WORK_DIR + + echo -n File types... + found="" + for f in `cd $OTHER_DIR && $FIND . ! -type d` + do + if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi + if [ ! -f ${THIS_DIR}/$f ]; then continue; fi + OF=`cd ${OTHER_DIR} && $FILE -h $f` + TF=`cd ${THIS_DIR} && $FILE -h $f` + if [ "$f" = "./src.zip" ] || [[ "$f" = *"/Home/src.zip" ]] || [[ "$f" = *"/lib/JObjC.jar" ]] + then + if [ "`echo $OF | $GREP -ic zip`" -gt 0 -a "`echo $TF | $GREP -ic zip`" -gt 0 ] + then + # the way we produces zip-files make it so that directories are stored in old file + # but not in new (only files with full-path) + # this makes file-5.09 report them as different + continue; + fi + fi + + if [ "$OF" != "$TF" ] + then + if [ -z "$found" ]; then echo ; found="yes"; fi + $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n" + fi + done + if [ -z "$found" ]; then + echo "Identical!" + else + REGRESSIONS=true + fi +} + +########################################################################################## +# Compare the rest of the files + +compare_general_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \ + ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \ + ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \ + ! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \ + ! -name "*.lib" ! -name "*.war" \ + | $GREP -v "./bin/" | $SORT | $FILTER) + + echo General files... + for f in $GENERAL_FILES + do + if [ -e $OTHER_DIR/$f ]; then + if [ "$(basename $f)" = "release" ]; then + # Ignore differences in change numbers in release file. + OTHER_FILE=$WORK_DIR/$f.other + THIS_FILE=$WORK_DIR/$f.this + $MKDIR -p $(dirname $OTHER_FILE) + $MKDIR -p $(dirname $THIS_FILE) + $CAT $OTHER_DIR/$f | $SED 's/\:[0-9a-f]\{12,12\}/:CHANGE/g' > $OTHER_FILE + $CAT $THIS_DIR/$f | $SED 's/\:[0-9a-f]\{12,12\}/:CHANGE/g' > $THIS_FILE + else + OTHER_FILE=$OTHER_DIR/$f + THIS_FILE=$THIS_DIR/$f + fi + DIFF_OUT=$($DIFF $OTHER_FILE $THIS_FILE 2>&1) + if [ -n "$DIFF_OUT" ]; then + echo $f + REGRESSIONS=true + if [ "$SHOW_DIFFS" = "true" ]; then + echo "$DIFF_OUT" + fi + fi + fi + done + + +} + +########################################################################################## +# Compare zip file + +compare_zip_file() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + ZIP_FILE=$4 + + THIS_ZIP=$THIS_DIR/$ZIP_FILE + OTHER_ZIP=$OTHER_DIR/$ZIP_FILE + + THIS_SUFFIX="${THIS_ZIP##*.}" + OTHER_SUFFIX="${OTHER_ZIP##*.}" + if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then + echo The files do not have the same suffix type! + return 2 + fi + + TYPE="$THIS_SUFFIX" + + if $CMP $OTHER_ZIP $THIS_ZIP > /dev/null + then + return 0 + fi + # Not quite identical, the might still contain the same data. + # Unpack the jar/zip files in temp dirs + + THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this + OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other + $RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR + $MKDIR -p $THIS_UNZIPDIR + $MKDIR -p $OTHER_UNZIPDIR + (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP) + (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP) + + # Find all archives inside and unzip them as well to compare the contents rather than + # the archives. + EXCEPTIONS="" + for pack in $($FIND $THIS_UNZIPDIR -name "*.pack" -o -name "*.pack.gz"); do + ($UNPACK200 $pack $pack.jar) + # Filter out the unzipped archives from the diff below. + EXCEPTIONS="$EXCEPTIONS $pack $pack.jar" + done + for pack in $($FIND $OTHER_UNZIPDIR -name "*.pack" -o -name "*.pack.gz"); do + ($UNPACK200 $pack $pack.jar) + EXCEPTIONS="$EXCEPTIONS $pack $pack.jar" + done + for zip in $($FIND $THIS_UNZIPDIR -name "*.jar" -o -name "*.zip"); do + $MKDIR $zip.unzip + (cd $zip.unzip && $UNARCHIVE $zip) + EXCEPTIONS="$EXCEPTIONS $zip" + done + for zip in $($FIND $OTHER_UNZIPDIR -name "*.jar" -o -name "*.zip"); do + $MKDIR $zip.unzip + (cd $zip.unzip && $UNARCHIVE $zip) + EXCEPTIONS="$EXCEPTIONS $zip" + done + + CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff + # On solaris, there is no -q option. + if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then + LANG=C $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \ + | $GREP -v -e "^<" -e "^>" -e "^Common subdirectories:" \ + > $CONTENTS_DIFF_FILE + else + LANG=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE + fi + + ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE) + ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE) + + return_value=0 + + if [ -n "$ONLY_OTHER" ]; then + echo " Only OTHER $ZIP_FILE contains:" + echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR| |"g | sed 's|: |/|g' + return_value=1 + fi + + if [ -n "$ONLY_THIS" ]; then + echo " Only THIS $ZIP_FILE contains:" + echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR| |"g | sed 's|: |/|g' + return_value=1 + fi + + if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then + DIFFING_FILES=$($GREP -e "differ$" -e "^diff " $CONTENTS_DIFF_FILE \ + | $CUT -f 3 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g") + else + DIFFING_FILES=$($GREP -e "differ$" $CONTENTS_DIFF_FILE \ + | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g") + fi + + $RM -f $WORK_DIR/$ZIP_FILE.diffs + for file in $DIFFING_FILES; do + if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then + diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs + fi + done + + if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then + return_value=1 + echo " Differing files in $ZIP_FILE" + $CAT $WORK_DIR/$ZIP_FILE.diffs | $GREP differ | cut -f 2 -d ' ' | \ + $SED "s|$OTHER_UNZIPDIR| |g" > $WORK_DIR/$ZIP_FILE.difflist + $CAT $WORK_DIR/$ZIP_FILE.difflist + + if [ -n "$SHOW_DIFFS" ]; then + for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do + if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then + LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap + elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then + LANG=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i + else + LANG=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i + fi + done + fi + fi + + return $return_value +} + + +########################################################################################## +# Compare all zip files + +compare_all_zip_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.zip" | $SORT | $FILTER ) + + if [ -n "$ZIPS" ]; then + echo Zip files... + + return_value=0 + for f in $ZIPS; do + if [ -f "$OTHER_DIR/$f" ]; then + compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f + if [ "$?" != "0" ]; then + return_value=1 + REGRESSIONS=true + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Compare all jar files + +compare_all_jar_files() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + # TODO filter? + ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" -o -name "*.war" | $SORT | $FILTER) + + if [ -n "$ZIPS" ]; then + echo Jar files... + + return_value=0 + for f in $ZIPS; do + if [ -f "$OTHER_DIR/$f" ]; then + compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f + if [ "$?" != "0" ]; then + return_value=1 + REGRESSIONS=true + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Compare binary (executable/library) file + +compare_bin_file() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + BIN_FILE=$4 + + THIS_FILE=$THIS_DIR/$BIN_FILE + OTHER_FILE=$OTHER_DIR/$BIN_FILE + NAME=$(basename $BIN_FILE) + WORK_FILE_BASE=$WORK_DIR/$BIN_FILE + FILE_WORK_DIR=$(dirname $WORK_FILE_BASE) + + $MKDIR -p $FILE_WORK_DIR + + ORIG_THIS_FILE="$THIS_FILE" + ORIG_OTHER_FILE="$OTHER_FILE" + + if [[ "$STRIP_BEFORE_COMPARE" = *"$BIN_FILE"* ]]; then + THIS_STRIPPED_FILE=$FILE_WORK_DIR/this/$NAME + OTHER_STRIPPED_FILE=$FILE_WORK_DIR/other/$NAME + $MKDIR -p $FILE_WORK_DIR/this $FILE_WORK_DIR/other + $CP $THIS_FILE $THIS_STRIPPED_FILE + $CP $OTHER_FILE $OTHER_STRIPPED_FILE + $STRIP $THIS_STRIPPED_FILE + $STRIP $OTHER_STRIPPED_FILE + THIS_FILE="$THIS_STRIPPED_FILE" + OTHER_FILE="$OTHER_STRIPPED_FILE" + fi + + if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + unset _NT_SYMBOL_PATH + # On windows we need to unzip the debug symbols, if present + OTHER_FILE_BASE=${OTHER_FILE/.dll/} + OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/} + DIZ_NAME=$(basename $OTHER_FILE_BASE).diz + # java.exe and java.dll diz files will have the same name. Have to + # make sure java.exe gets the right one. This is only needed for + # OTHER since in the new build, all pdb files are left around. + if [ "$NAME" = "java.exe" ] && [ -f "$OTHER/tmp/java/java/obj64/java.diz" ]; then + OTHER_DIZ_FILE="$OTHER/tmp/java/java/obj64/java.diz" + elif [ -f "${OTHER_FILE_BASE}.diz" ]; then + OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz + else + # Some files, jli.dll, appears twice in the image but only one of + # thme has a diz file next to it. + OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)" + if [ ! -f "$OTHER_DIZ_FILE" ]; then + # As a last resort, look for diz file in the whole build output + # dir. + OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)" + fi + fi + if [ -n "$OTHER_DIZ_FILE" ]; then + $MKDIR -p $FILE_WORK_DIR/other + (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE) + export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other" + fi + THIS_FILE_BASE=${THIS_FILE/.dll/} + THIS_FILE_BASE=${THIS_FILE_BASE/.exe/} + if [ -f "${THIS_FILE/.dll/}.diz" ]; then + THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz + else + THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)" + if [ ! -f "$THIS_DIZ_FILE" ]; then + # As a last resort, look for diz file in the whole build output + # dir. + THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)" + fi + fi + if [ -n "$THIS_DIZ_FILE" ]; then + $MKDIR -p $FILE_WORK_DIR/this + (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE) + export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this" + fi + fi + + if [ -z "$SKIP_BIN_DIFF" ]; then + if cmp $OTHER_FILE $THIS_FILE > /dev/null; then + # The files were bytewise identical. + if [ -n "$VERBOSE" ]; then + echo " : : : : : $BIN_FILE" + fi + return 0 + fi + BIN_MSG=" diff " + if [[ "$ACCEPTED_BIN_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_BIN=true + if [[ "$KNOWN_BIN_DIFF" != *"$BIN_FILE"* ]]; then + BIN_MSG="*$BIN_MSG*" + REGRESSIONS=true + else + BIN_MSG=" $BIN_MSG " + fi + else + BIN_MSG="($BIN_MSG)" + DIFF_BIN= + fi + fi + + if [ -n "$STAT" ]; then + THIS_SIZE=$($STAT $STAT_PRINT_SIZE "$THIS_FILE") + OTHER_SIZE=$($STAT $STAT_PRINT_SIZE "$OTHER_FILE") + else + THIS_SIZE=$(ls -l "$THIS_FILE" | awk '{ print $5 }') + OTHER_SIZE=$(ls -l "$OTHER_FILE" | awk '{ print $5 }') + fi + if [ $THIS_SIZE -ne $OTHER_SIZE ]; then + DIFF_SIZE_NUM=$($EXPR $THIS_SIZE - $OTHER_SIZE) + DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE) + SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM) + if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_REL" -gt 98 ] && [ "$DIFF_SIZE_REL" -lt 102 ]; then + SIZE_MSG="($SIZE_MSG)" + DIFF_SIZE= + elif [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_NUM" = 512 ]; then + # On windows, size of binaries increase in 512 increments. + SIZE_MSG="($SIZE_MSG)" + DIFF_SIZE= + else + if [[ "$ACCEPTED_SIZE_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_SIZE=true + if [[ "$KNOWN_SIZE_DIFF" != *"$BIN_FILE"* ]]; then + SIZE_MSG="*$SIZE_MSG*" + REGRESSIONS=true + else + SIZE_MSG=" $SIZE_MSG " + fi + else + SIZE_MSG="($SIZE_MSG)" + DIFF_SIZE= + fi + fi + else + SIZE_MSG=" " + DIFF_SIZE= + if [[ "$KNOWN_SIZE_DIFF $ACCEPTED_SIZE_DIFF" = *"$BIN_FILE"* ]]; then + SIZE_MSG=" ! " + fi + fi + + if [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then + SYM_SORT_CMD="sort" + else + SYM_SORT_CMD="cat" + fi + + # Check symbols + if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + # The output from dumpbin on windows differs depending on if the debug symbol + # files are still around at the location the binary is pointing too. Need + # to filter out that extra information. + $DUMPBIN -exports $OTHER_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other + $DUMPBIN -exports $THIS_FILE | $GREP -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this + elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then + # Some symbols get seemingly random 15 character prefixes. Filter them out. + $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other + $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this + else + $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other + $NM -a $ORIG_THIS_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this + fi + + LANG=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff + if [ -s $WORK_FILE_BASE.symbols.diff ]; then + SYM_MSG=" diff " + if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_SYM=true + if [[ "$KNOWN_SYM_DIFF" != *"$BIN_FILE"* ]]; then + SYM_MSG="*$SYM_MSG*" + REGRESSIONS=true + else + SYM_MSG=" $SYM_MSG " + fi + else + SYM_MSG="($SYM_MSG)" + DIFF_SYM= + fi + else + SYM_MSG=" " + DIFF_SYM= + if [[ "$KNOWN_SYM_DIFF $ACCEPTED_SYM_DIFF" = *"$BIN_FILE"* ]]; then + SYM_MSG=" ! " + fi + fi + + # Check dependencies + if [ -n "$LDD_CMD" ]; then + (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME 2>/dev/null | $AWK '{ print $1;}' | $SORT | $TEE $WORK_FILE_BASE.deps.other | $UNIQ > $WORK_FILE_BASE.deps.other.uniq) + (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME 2 $WORK_FILE_BASE.deps.this.uniq) + (cd $FILE_WORK_DIR && $RM -f $NAME) + + LANG=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this > $WORK_FILE_BASE.deps.diff + LANG=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq > $WORK_FILE_BASE.deps.diff.uniq + + if [ -s $WORK_FILE_BASE.deps.diff ]; then + if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then + DEP_MSG=" diff " + else + DEP_MSG=" redun " + fi + if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_DEP=true + if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then + DEP_MSG="*$DEP_MSG*" + REGRESSIONS=true + else + DEP_MSG=" $DEP_MSG " + fi + else + DEP_MSG="($DEP_MSG)" + DIFF_DEP= + fi + else + DEP_MSG=" " + DIFF_DEP= + if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then + DEP_MSG=" ! " + fi + fi + else + DEP_MSG=" - " + fi + + # Compare fulldump output + if [ -n "$FULLDUMP_CMD" ] && [ -z "$SKIP_FULLDUMP_DIFF" ]; then + $FULLDUMP_CMD $OTHER_FILE > $WORK_FILE_BASE.fulldump.other 2>&1 + $FULLDUMP_CMD $THIS_FILE > $WORK_FILE_BASE.fulldump.this 2>&1 + LANG=C $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this > $WORK_FILE_BASE.fulldump.diff + + if [ -s $WORK_FILE_BASE.fulldump.diff ]; then + ELF_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.fulldump.diff | awk '{print $5}') + ELF_MSG=$($PRINTF "%8d" $ELF_DIFF_SIZE) + if [[ "$ACCEPTED_ELF_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_ELF=true + if [[ "$KNOWN_ELF_DIFF" != *"$BIN_FILE"* ]]; then + ELF_MSG="*$ELF_MSG*" + REGRESSIONS=true + else + ELF_MSG=" $ELF_MSG " + fi + else + ELF_MSG="($ELF_MSG)" + DIFF_ELF= + fi + else + ELF_MSG=" " + DIFF_ELF= + if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then + ELF_MSG=" ! " + fi + fi + fi + + # Compare disassemble output + if [ -n "$DIS_CMD" ] && [ -z "$SKIP_DIS_DIFF" ]; then + if [ -z "$DIS_DIFF_FILTER" ]; then + DIS_DIFF_FILTER="$CAT" + fi + $DIS_CMD $OTHER_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.other 2>&1 + $DIS_CMD $THIS_FILE | $GREP -v $NAME | $DIS_DIFF_FILTER > $WORK_FILE_BASE.dis.this 2>&1 + + LANG=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff + + if [ -s $WORK_FILE_BASE.dis.diff ]; then + DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}') + DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE) + if [[ "$ACCEPTED_DIS_DIFF" != *"$BIN_FILE"* ]]; then + DIFF_DIS=true + if [[ "$KNOWN_DIS_DIFF" != *"$BIN_FILE"* ]]; then + DIS_MSG="*$DIS_MSG*" + REGRESSIONS=true + else + DIS_MSG=" $DIS_MSG " + fi + else + DIS_MSG="($DIS_MSG)" + DIFF_DIS= + fi + else + DIS_MSG=" " + DIFF_DIS= + if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then + DIS_MSG=" ! " + fi + fi + fi + + + if [ -n "$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_ELF$DIFF_DIS" ] || [ -n "$VERBOSE" ]; then + if [ -n "$BIN_MSG" ]; then echo -n "$BIN_MSG:"; fi + if [ -n "$SIZE_MSG" ]; then echo -n "$SIZE_MSG:"; fi + if [ -n "$SYM_MSG" ]; then echo -n "$SYM_MSG:"; fi + if [ -n "$DEP_MSG" ]; then echo -n "$DEP_MSG:"; fi + if [ -n "$ELF_MSG" ]; then echo -n "$ELF_MSG:"; fi + if [ -n "$DIS_MSG" ]; then echo -n "$DIS_MSG:"; fi + echo " $BIN_FILE" + if [ "$SHOW_DIFFS" = "true" ]; then + if [ -s "$WORK_FILE_BASE.symbols.diff" ]; then + echo "Symbols diff:" + $CAT $WORK_FILE_BASE.symbols.diff + fi + if [ -s "$WORK_FILE_BASE.deps.diff" ]; then + echo "Deps diff:" + $CAT $WORK_FILE_BASE.deps.diff + fi + if [ -s "$WORK_FILE_BASE.fulldump.diff" ]; then + echo "Fulldump diff:" + $CAT $WORK_FILE_BASE.fulldump.diff + fi + if [ -s "$WORK_FILE_BASE.dis.diff" ]; then + echo "Disassembly diff:" + $CAT $WORK_FILE_BASE.dis.diff + fi + fi + return 1 + fi + return 0 +} + +########################################################################################## +# Print binary diff header + +print_binary_diff_header() { + if [ -z "$SKIP_BIN_DIFF" ]; then echo -n " Binary :"; fi + if [ -z "$SKIP_SIZE_DIFF" ]; then echo -n " Size :"; fi + if [ -z "$SKIP_SYM_DIFF" ]; then echo -n " Symbols :"; fi + if [ -z "$SKIP_DEP_DIFF" ]; then echo -n " Deps :"; fi + if [ -z "$SKIP_FULLDUMP_DIFF" ]; then echo -n " Fulldump :"; fi + if [ -z "$SKIP_DIS_DIFF" ]; then echo -n " Disass :"; fi + echo +} + +########################################################################################## +# Compare all libraries + +compare_all_libs() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + LIBS=$(cd $THIS_DIR && $FIND . -type f \( -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' \) | $SORT | $FILTER) + + if [ -n "$LIBS" ]; then + echo Libraries... + print_binary_diff_header + for l in $LIBS; do + if [ -f "$OTHER_DIR/$l" ]; then + compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $l + if [ "$?" != "0" ]; then + return_value=1 + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Compare all executables + +compare_all_execs() { + THIS_DIR=$1 + OTHER_DIR=$2 + WORK_DIR=$3 + + if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + EXECS=$(cd $THIS_DIR && $FIND . -type f -name '*.exe' | $SORT | $FILTER) + else + EXECS=$(cd $THIS_DIR && $FIND . -name db -prune -o -type f -perm -100 \! \ + \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' -o -name '*.cgi' \ + -o -name '*.jar' -o -name '*.diz' -o -name 'jcontrol' -o -name '*.properties' \ + -o -name '*.data' -o -name '*.bfc' -o -name '*.src' -o -name '*.txt' \ + -o -name '*.cfg' -o -name 'meta-index' -o -name '*.properties.ja' \ + -o -name 'classlist' \) | $SORT | $FILTER) + fi + + if [ -n "$EXECS" ]; then + echo Executables... + print_binary_diff_header + for e in $EXECS; do + if [ -f "$OTHER_DIR/$e" ]; then + compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $e + if [ "$?" != "0" ]; then + return_value=1 + fi + fi + done + fi + + return $return_value +} + +########################################################################################## +# Initiate configuration + +COMPARE_ROOT=/tmp/cimages.$USER +$MKDIR -p $COMPARE_ROOT +if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + if [ "$(uname -o)" = "Cygwin" ]; then + COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT) + fi +fi + +THIS="$( cd "$( dirname "$0" )" && pwd )" +echo "$THIS" +THIS_SCRIPT="$0" + +if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1" = "/?" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then + echo "bash ./compare.sh [OPTIONS] [FILTER]" + echo "" + echo "-all Compare all files in all known ways" + echo "-names Compare the file names and directory structure" + echo "-perms Compare the permission bits on all files and directories" + echo "-types Compare the output of the file command on all files" + echo "-general Compare the files not convered by the specialized comparisons" + echo "-zips Compare the contents of all zip files" + echo "-jars Compare the contents of all jar files" + echo "-libs Compare all native libraries" + echo "-execs Compare all executables" + echo "-v Verbose output, does not hide known differences" + echo "-vv More verbose output, shows diff output of all comparisons" + echo "-o [OTHER] Compare with build in other directory. Will default to the old build directory" + echo "" + echo "[FILTER] List filenames in the image to compare, works for jars, zips, libs and execs" + echo "Example:" + echo "bash ./common/bin/compareimages.sh CodePointIM.jar" + exit 10 +fi + +CMP_NAMES=false +CMP_PERMS=false +CMP_TYPES=false +CMP_GENERAL=false +CMP_ZIPS=false +CMP_JARS=false +CMP_LIBS=false +CMP_EXECS=false + +while [ -n "$1" ]; do + case "$1" in + -v) + VERBOSE=true + ;; + -vv) + VERBOSE=true + SHOW_DIFFS=true + ;; + -o) + OTHER="$2" + shift + ;; + -all) + CMP_NAMES=true + if [ "$OPENJDK_TARGET_OS" != "windows" ]; then + CMP_PERMS=true + fi + CMP_TYPES=true + CMP_GENERAL=true + CMP_ZIPS=true + CMP_JARS=true + CMP_LIBS=true + CMP_EXECS=true + ;; + -names) + CMP_NAMES=true + ;; + -perms) + CMP_PERMS=true + ;; + -types) + CMP_TYPES=true + ;; + -general) + CMP_GENERAL=true + ;; + -zips) + CMP_ZIPS=true + ;; + -jars) + CMP_JARS=true + ;; + -libs) + CMP_LIBS=true + ;; + -execs) + CMP_EXECS=true + ;; + *) + CMP_NAMES=false + CMP_PERMS=false + CMP_TYPES=false + CMP_ZIPS=true + CMP_JARS=true + CMP_LIBS=true + CMP_EXECS=true + + if [ -z "$FILTER" ]; then + FILTER="$GREP" + fi + FILTER="$FILTER -e $1" + ;; + esac + shift +done + +if [ "$CMP_NAMES" = "false" ] && [ "$CMP_TYPES" = "false" ] && [ "$CMP_PERMS" = "false" ] && [ "$CMP_GENERAL" = "false" ] && [ "$CMP_ZIPS" = "false" ] && [ "$CMP_JARS" = "false" ] && [ "$CMP_LIBS" = "false" ] && [ "$CMP_EXECS" = "false" ]; then + CMP_NAMES=true + CMP_PERMS=true + CMP_TYPES=true + CMP_GENERAL=true + CMP_ZIPS=true + CMP_JARS=true + CMP_LIBS=true + CMP_EXECS=true +fi + +if [ -z "$FILTER" ]; then + FILTER="$CAT" +fi + +if [ -z "$OTHER" ]; then + OTHER="$THIS/../$LEGACY_BUILD_DIR" + if [ -d "$OTHER" ]; then + OTHER="$( cd "$OTHER" && pwd )" + else + echo "Default old build directory does not exist:" + echo "$OTHER" + exit 1 + fi + echo "Comparing to default old build:" + echo "$OTHER" + echo +else + if [ ! -d "$OTHER" ]; then + echo "Other build directory does not exist:" + echo "$OTHER" + exit 1 + fi + OTHER="$( cd "$OTHER" && pwd )" + echo "Comparing to:" + echo "$OTHER" + echo +fi + + +# Figure out the layout of the this build. Which kinds of images have been produced +if [ -d "$THIS/deploy/j2sdk-image" ]; then + THIS_J2SDK="$THIS/deploy/j2sdk-image" + THIS_J2RE="$THIS/deploy/j2re-image" + echo "Comparing deploy images" +elif [ -d "$THIS/images/j2sdk-image" ]; then + THIS_J2SDK="$THIS/images/j2sdk-image" + THIS_J2RE="$THIS/images/j2re-image" +fi +if [ -d "$THIS/images/j2sdk-overlay-image" ]; then + THIS_J2SDK_OVERLAY="$THIS/images/j2sdk-overlay-image" + THIS_J2RE_OVERLAY="$THIS/images/j2re-overlay-image" +fi + +if [ -d "$THIS/images/j2sdk-bundle" ]; then + THIS_J2SDK_BUNDLE="$THIS/images/j2sdk-bundle" + THIS_J2RE_BUNDLE="$THIS/images/j2re-bundle" +fi + +# Figure out the layout of the other build (old or new, normal or overlay image) +if [ -d "$OTHER/j2sdk-image" ]; then + if [ -f "$OTHER/j2sdk-image/LICENSE" ]; then + OTHER_J2SDK="$OTHER/j2sdk-image" + OTHER_J2RE="$OTHER/j2re-image" + else + OTHER_J2SDK_OVERLAY="$OTHER/j2sdk-image" + OTHER_J2RE_OVERLAY="$OTHER/j2re-image" + fi + +fi + +if [ -d "$OTHER/j2sdk-bundle" ]; then + OTHER_J2SDK_BUNDLE="$OTHER/j2sdk-bundle" + OTHER_J2RE_BUNDLE="$OTHER/j2re-bundle" +elif [ -d "$OTHER/images/j2sdk-bundle" ]; then + OTHER_J2SDK_BUNDLE="$OTHER/images/j2sdk-bundle" + OTHER_J2RE_BUNDLE="$OTHER/images/j2re-bundle" +fi + +if [ -z "$THIS_J2SDK" ] || [ -z "$THIS_J2RE" ]; then + if [ -z "$THIS_J2SDK_OVERLAY" ]; then + echo "Cannot locate images for this build. Are you sure you have run 'make images'?" + exit 1 + fi +fi + +if [ -z "$OTHER_J2SDK" ] && [ -n "$OTHER_J2SDK_OVERLAY" ] && [ -z "$THIS_J2SDK_OVERLAY" ]; then + echo "OTHER build only has an overlay image while this build does not. Nothing to compare!" + exit 1 +fi + +if [ -z "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo "WARNING! OTHER build has bundles built while this build does not." + echo "Skipping bundle compare!" +fi + +########################################################################################## +# Do the work + +if [ "$CMP_NAMES" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_dirs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_dirs $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + + echo -n "J2SDK " + compare_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_dirs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_dirs $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + + echo -n "J2SDK Overlay " + compare_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_dirs $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_dirs $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + + echo -n "J2SDK Bundle " + compare_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_PERMS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_permissions $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_permissions $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_permissions $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_permissions $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_permissions $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_permissions $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_TYPES" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_file_types $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_file_types $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_file_types $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_file_types $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_file_types $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_file_types $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_GENERAL" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + echo -n "J2SDK " + compare_general_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + echo -n "J2RE " + compare_general_files $THIS_J2RE $OTHER_J2RE $COMPARE_ROOT/j2re + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "J2SDK Overlay " + compare_general_files $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + echo -n "J2RE Overlay " + compare_general_files $THIS_J2RE_OVERLAY $OTHER_J2RE_OVERLAY $COMPARE_ROOT/j2re-overlay + fi + if [ -n "$THIS_J2SDK_BUNDLE" ] && [ -n "$OTHER_J2SDK_BUNDLE" ]; then + echo -n "J2SDK Bundle " + compare_general_files $THIS_J2SDK_BUNDLE $OTHER_J2SDK_BUNDLE $COMPARE_ROOT/j2sdk-bundle + echo -n "J2RE Bundle " + compare_general_files $THIS_J2RE_BUNDLE $OTHER_J2RE_BUNDLE $COMPARE_ROOT/j2re-bundle + fi +fi + +if [ "$CMP_ZIPS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_zip_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi +fi + +if [ "$CMP_JARS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_jar_files $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi +fi + +if [ "$CMP_LIBS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_libs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "Bundle " + compare_all_libs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + fi +fi + +if [ "$CMP_EXECS" = "true" ]; then + if [ -n "$THIS_J2SDK" ] && [ -n "$OTHER_J2SDK" ]; then + compare_all_execs $THIS_J2SDK $OTHER_J2SDK $COMPARE_ROOT/j2sdk + fi + if [ -n "$THIS_J2SDK_OVERLAY" ] && [ -n "$OTHER_J2SDK_OVERLAY" ]; then + echo -n "Overlay " + compare_all_execs $THIS_J2SDK_OVERLAY $OTHER_J2SDK_OVERLAY $COMPARE_ROOT/j2sdk-overlay + fi +fi + +echo + +if [ -n "$REGRESSIONS" ]; then + echo "REGRESSIONS FOUND!" + echo + exit 1 +else + echo "No regressions found" + echo + exit 0 +fi diff --git a/common/bin/compare_exceptions.sh.incl b/common/bin/compare_exceptions.sh.incl new file mode 100644 index 00000000000..c9fc3cc6c86 --- /dev/null +++ b/common/bin/compare_exceptions.sh.incl @@ -0,0 +1,957 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This script is not to be run as stand-alone, it should be included from +# compare.sh. + +########################################################################################## +# Check that we are run via inclusion from compare.sh and not as stand-alone. +if [ -z "$COMPARE_EXCEPTIONS_INCLUDE" ]; then + echo "Error: This script should not be run as stand-alone. It is included by compare.sh" + exit 1 +fi + +########################################################################################## +# Diff exceptions + +if [ "$OPENJDK_TARGET_OS" = "linux" ] && [ "$OPENJDK_TARGET_CPU" = "x86" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +" + +ACCEPTED_BIN_DIFF=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/i386/client/libjvm.so +./jre/lib/i386/libattach.so +./jre/lib/i386/libdt_socket.so +./jre/lib/i386/libhprof.so +./jre/lib/i386/libinstrument.so +./jre/lib/i386/libjava_crw_demo.so +./jre/lib/i386/libjsdt.so +./jre/lib/i386/libmanagement.so +./jre/lib/i386/libnpt.so +./jre/lib/i386/libverify.so +./jre/lib/i386/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +" + +fi + +if [ "$OPENJDK_TARGET_OS" = "linux" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +" + +ACCEPTED_BIN_DIFF=" +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/amd64/libattach.so +./jre/lib/amd64/libdt_socket.so +./jre/lib/amd64/libhprof.so +./jre/lib/amd64/libinstrument.so +./jre/lib/amd64/libjava_crw_demo.so +./jre/lib/amd64/libjsdt.so +./jre/lib/amd64/libjsig.so +./jre/lib/amd64/libmanagement.so +./jre/lib/amd64/libnpt.so +./jre/lib/amd64/libsaproc.so +./jre/lib/amd64/libverify.so +./jre/lib/amd64/server/libjsig.so +./jre/lib/amd64/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/i386/jexec +" + +SORT_SYMBOLS=" +./jre/lib/i386/client/libjvm.so +./jre/lib/i386/libsaproc.so +./jre/lib/i386/server/libjvm.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/i386/client/libjvm.so +./jre/lib/i386/jli/libjli.so +./jre/lib/i386/libJdbcOdbc.so +./jre/lib/i386/libattach.so +./jre/lib/i386/libawt.so +./jre/lib/i386/libawt_headless.so +./jre/lib/i386/libawt_xawt.so +./jre/lib/i386/libdcpr.so +./jre/lib/i386/libdt_socket.so +./jre/lib/i386/libfontmanager.so +./jre/lib/i386/libhprof.so +./jre/lib/i386/libinstrument.so +./jre/lib/i386/libj2gss.so +./jre/lib/i386/libj2pcsc.so +./jre/lib/i386/libj2pkcs11.so +./jre/lib/i386/libj2ucrypto.so +./jre/lib/i386/libjaas_unix.so +./jre/lib/i386/libjava.so +./jre/lib/i386/libjava_crw_demo.so +./jre/lib/i386/libjawt.so +./jre/lib/i386/libjdwp.so +./jre/lib/i386/libjfr.so +./jre/lib/i386/libjpeg.so +./jre/lib/i386/libjsdt.so +./jre/lib/i386/libjsound.so +./jre/lib/i386/libkcms.so +./jre/lib/i386/liblcms.so +./jre/lib/i386/libmanagement.so +./jre/lib/i386/libmlib_image.so +./jre/lib/i386/libnet.so +./jre/lib/i386/libnio.so +./jre/lib/i386/libnpt.so +./jre/lib/i386/libsctp.so +./jre/lib/i386/libsplashscreen.so +./jre/lib/i386/libsunec.so +./jre/lib/i386/libsunwjdga.so +./jre/lib/i386/libt2k.so +./jre/lib/i386/libunpack.so +./jre/lib/i386/libverify.so +./jre/lib/i386/libzip.so +./jre/lib/i386/libdeploy.so +./jre/lib/i386/libjavaplugin.so +./jre/lib/i386/libjavaplugin_jni.so +./jre/lib/i386/libjavaplugin_nscp.so +./jre/lib/i386/libjavaplugin_oji.so +./jre/lib/i386/libnpjp2.so +./jre/plugin/i386/ns4/libjavaplugin.so +./jre/plugin/i386/ns7/libjavaplugin_oji.so +./jre/lib/i386/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/javaws +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/unpack200 +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/java_vm +./jre/bin/javaws +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +./jre/bin/unpack200 +./jre/lib/i386/jexec +" + +SKIP_FULLDUMP_DIFF="true" + +# Filter random C++ symbol strings. +DIS_DIFF_FILTER="$SED -e s/\.[a-zA-Z0-9_\$]\{15,15\}//g" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/amd64/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/amd64/libgctest.so +./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so +./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so +./demo/jvmti/hprof/lib/amd64/libhprof.so +./demo/jvmti/minst/lib/amd64/libminst.so +./demo/jvmti/mtrace/lib/amd64/libmtrace.so +./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so +./demo/jvmti/waiters/lib/amd64/libwaiters.so +" + +SORT_SYMBOLS=" +./jre/lib/amd64/server/libjvm.so +./jre/lib/amd64/libsaproc.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/amd64/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/amd64/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/amd64/libgctest.so +./demo/jvmti/heapTracker/lib/amd64/libheapTracker.so +./demo/jvmti/heapViewer/lib/amd64/libheapViewer.so +./demo/jvmti/hprof/lib/amd64/libhprof.so +./demo/jvmti/minst/lib/amd64/libminst.so +./demo/jvmti/mtrace/lib/amd64/libmtrace.so +./demo/jvmti/versionCheck/lib/amd64/libversionCheck.so +./demo/jvmti/waiters/lib/amd64/libwaiters.so +./jre/lib/amd64/jli/libjli.so +./jre/lib/amd64/libJdbcOdbc.so +./jre/lib/amd64/libattach.so +./jre/lib/amd64/libawt.so +./jre/lib/amd64/libawt_headless.so +./jre/lib/amd64/libawt_xawt.so +./jre/lib/amd64/libdcpr.so +./jre/lib/amd64/libdt_socket.so +./jre/lib/amd64/libfontmanager.so +./jre/lib/amd64/libhprof.so +./jre/lib/amd64/libinstrument.so +./jre/lib/amd64/libj2gss.so +./jre/lib/amd64/libj2pcsc.so +./jre/lib/amd64/libj2pkcs11.so +./jre/lib/amd64/libj2ucrypto.so +./jre/lib/amd64/libjaas_unix.so +./jre/lib/amd64/libjava.so +./jre/lib/amd64/libjava_crw_demo.so +./jre/lib/amd64/libjawt.so +./jre/lib/amd64/libjdwp.so +./jre/lib/amd64/libjfr.so +./jre/lib/amd64/libjpeg.so +./jre/lib/amd64/libjsdt.so +./jre/lib/amd64/libjsound.so +./jre/lib/amd64/libkcms.so +./jre/lib/amd64/liblcms.so +./jre/lib/amd64/libmanagement.so +./jre/lib/amd64/libmlib_image.so +./jre/lib/amd64/libnet.so +./jre/lib/amd64/libnio.so +./jre/lib/amd64/libnpt.so +./jre/lib/amd64/libsctp.so +./jre/lib/amd64/libsplashscreen.so +./jre/lib/amd64/libsunec.so +./jre/lib/amd64/libsunwjdga.so +./jre/lib/amd64/libt2k.so +./jre/lib/amd64/libunpack.so +./jre/lib/amd64/libverify.so +./jre/lib/amd64/libzip.so +./jre/lib/amd64/server/64/libjvm_db.so +./jre/lib/amd64/server/64/libjvm_dtrace.so +./bin/amd64/appletviewer +./bin/amd64/extcheck +./bin/amd64/idlj +./bin/amd64/jar +./bin/amd64/jarsigner +./bin/amd64/java +./bin/amd64/javac +./bin/amd64/javadoc +./bin/amd64/javah +./bin/amd64/javap +./bin/amd64/jcmd +./bin/amd64/jconsole +./bin/amd64/jdb +./bin/amd64/jhat +./bin/amd64/jinfo +./bin/amd64/jmap +./bin/amd64/jps +./bin/amd64/jrunscript +./bin/amd64/jsadebugd +./bin/amd64/jstack +./bin/amd64/jstat +./bin/amd64/jstatd +./bin/amd64/keytool +./bin/amd64/native2ascii +./bin/amd64/orbd +./bin/amd64/pack200 +./bin/amd64/policytool +./bin/amd64/rmic +./bin/amd64/rmid +./bin/amd64/rmiregistry +./bin/amd64/schemagen +./bin/amd64/serialver +./bin/amd64/servertool +./bin/amd64/tnameserv +./bin/amd64/unpack200 +./bin/amd64/wsgen +./bin/amd64/wsimport +./bin/amd64/xjc +./jre/bin/amd64/java +./jre/bin/amd64/keytool +./jre/bin/amd64/orbd +./jre/bin/amd64/pack200 +./jre/bin/amd64/policytool +./jre/bin/amd64/rmid +./jre/bin/amd64/rmiregistry +./jre/bin/amd64/servertool +./jre/bin/amd64/tnameserv +./jre/bin/amd64/unpack200 +./jre/lib/amd64/jexec +" + +SKIP_FULLDUMP_DIFF="true" + +# Filter random C++ symbol strings. +DIS_DIFF_FILTER="$SED -e s/\.[a-zA-Z0-9_\$]\{15,15\}//g" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparc" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/sparc/jexec +" + +SORT_SYMBOLS=" +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/sparc/client/64/libjvm_db.so +./jre/lib/sparc/client/64/libjvm_dtrace.so +./jre/lib/sparc/client/libjsig.so +./jre/lib/sparc/client/libjvm.so +./jre/lib/sparc/client/libjvm_db.so +./jre/lib/sparc/client/libjvm_dtrace.so +./jre/lib/sparc/libjsig.so +./jre/lib/sparc/libsaproc.so +./jre/lib/sparc/server/64/libjvm_db.so +./jre/lib/sparc/server/64/libjvm_dtrace.so +./jre/lib/sparc/server/libjsig.so +./jre/lib/sparc/server/libjvm.so +./jre/lib/sparc/server/libjvm_db.so +./jre/lib/sparc/server/libjvm_dtrace.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/libgctest.so +./demo/jvmti/heapTracker/lib/libheapTracker.so +./demo/jvmti/heapViewer/lib/libheapViewer.so +./demo/jvmti/hprof/lib/libhprof.so +./demo/jvmti/minst/lib/libminst.so +./demo/jvmti/mtrace/lib/libmtrace.so +./demo/jvmti/versionCheck/lib/libversionCheck.so +./demo/jvmti/waiters/lib/libwaiters.so +./jre/lib/sparc/client/libjvm.so +./jre/lib/sparc/jli/libjli.so +./jre/lib/sparc/libJdbcOdbc.so +./jre/lib/sparc/libattach.so +./jre/lib/sparc/libawt.so +./jre/lib/sparc/libawt_headless.so +./jre/lib/sparc/libawt_xawt.so +./jre/lib/sparc/libdcpr.so +./jre/lib/sparc/libdt_socket.so +./jre/lib/sparc/libfontmanager.so +./jre/lib/sparc/libhprof.so +./jre/lib/sparc/libinstrument.so +./jre/lib/sparc/libj2gss.so +./jre/lib/sparc/libj2pcsc.so +./jre/lib/sparc/libj2pkcs11.so +./jre/lib/sparc/libj2ucrypto.so +./jre/lib/sparc/libjaas_unix.so +./jre/lib/sparc/libjava.so +./jre/lib/sparc/libjava_crw_demo.so +./jre/lib/sparc/libjawt.so +./jre/lib/sparc/libjdwp.so +./jre/lib/sparc/libjfr.so +./jre/lib/sparc/libjpeg.so +./jre/lib/sparc/libjsdt.so +./jre/lib/sparc/libjsound.so +./jre/lib/sparc/libkcms.so +./jre/lib/sparc/liblcms.so +./jre/lib/sparc/libmanagement.so +./jre/lib/sparc/libmlib_image.so +./jre/lib/sparc/libmlib_image_v.so +./jre/lib/sparc/libnet.so +./jre/lib/sparc/libnio.so +./jre/lib/sparc/libnpt.so +./jre/lib/sparc/libsctp.so +./jre/lib/sparc/libsplashscreen.so +./jre/lib/sparc/libsunec.so +./jre/lib/sparc/libsunwjdga.so +./jre/lib/sparc/libt2k.so +./jre/lib/sparc/libunpack.so +./jre/lib/sparc/libverify.so +./jre/lib/sparc/libzip.so +./jre/lib/sparc/libdeploy.so +./jre/lib/sparc/libjavaplugin.so +./jre/lib/sparc/libjavaplugin_jni.so +./jre/lib/sparc/libjavaplugin_nscp.so +./jre/lib/sparc/libjavaplugin_oji.so +./jre/lib/sparc/libnpjp2.so +./jre/plugin/sparc/ns4/libjavaplugin.so +./jre/plugin/sparc/ns7/libjavaplugin_oji.so +./jre/lib/sparc/server/libjvm.so +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/javaws +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/unpack200 +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/java_vm +./jre/bin/javaws +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +./jre/bin/unpack200 +./jre/lib/sparc/jexec +" + +# Filter random C++ symbol strings. +# Some numbers differ randomly. +DIS_DIFF_FILTER="$SED -e s/\$[a-zA-Z0-9_\$]\{15,15\}//g -e s/\([0-9a-f][0-9a-f].[0-9a-f][0-9a-f].[0-9a-f][0-9a-f].\)[0-9a-f][0-9a-f]/\1/g -e s/\(%g1,.0x\)[0-9a-f]*\(,.%g1\)/\1\2/g -e s/\(!.\)[0-9a-f]*\(.\2/g" + +# Some xor instructions end up with different args in the lib but not in the object files. +ACCEPTED_DIS_DIFF=" +./demo/jvmti/waiters/lib/libwaiters.so +" + +SKIP_FULLDUMP_DIFF="true" + +fi + +if [ "$OPENJDK_TARGET_OS" = "solaris" ] && [ "$OPENJDK_TARGET_CPU" = "sparcv9" ]; then + +STRIP_BEFORE_COMPARE=" +./demo/jni/Poller/lib/sparcv9/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/sparcv9/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/sparcv9/libgctest.so +./demo/jvmti/heapTracker/lib/sparcv9/libheapTracker.so +./demo/jvmti/heapViewer/lib/sparcv9/libheapViewer.so +./demo/jvmti/hprof/lib/sparcv9/libhprof.so +./demo/jvmti/minst/lib/sparcv9/libminst.so +./demo/jvmti/mtrace/lib/sparcv9/libmtrace.so +./demo/jvmti/versionCheck/lib/sparcv9/libversionCheck.so +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +" + +SORT_SYMBOLS=" +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +./jre/lib/sparcv9/libjsig.so +./jre/lib/sparcv9/libsaproc.so +./jre/lib/sparcv9/server/libjvm.so +./jre/lib/sparcv9/server/libjvm_dtrace.so +" + +SKIP_BIN_DIFF="true" + +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jni/Poller/lib/sparcv9/libPoller.so +./demo/jvmti/compiledMethodLoad/lib/sparcv9/libcompiledMethodLoad.so +./demo/jvmti/gctest/lib/sparcv9/libgctest.so +./demo/jvmti/heapTracker/lib/sparcv9/libheapTracker.so +./demo/jvmti/heapViewer/lib/sparcv9/libheapViewer.so +./demo/jvmti/hprof/lib/sparcv9/libhprof.so +./demo/jvmti/minst/lib/sparcv9/libminst.so +./demo/jvmti/mtrace/lib/sparcv9/libmtrace.so +./demo/jvmti/versionCheck/lib/sparcv9/libversionCheck.so +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +./jre/lib/sparcv9/client/libjvm.so +./jre/lib/sparcv9/jli/libjli.so +./jre/lib/sparcv9/libJdbcOdbc.so +./jre/lib/sparcv9/libattach.so +./jre/lib/sparcv9/libawt.so +./jre/lib/sparcv9/libawt_headless.so +./jre/lib/sparcv9/libawt_xawt.so +./jre/lib/sparcv9/libdcpr.so +./jre/lib/sparcv9/libdt_socket.so +./jre/lib/sparcv9/libfontmanager.so +./jre/lib/sparcv9/libhprof.so +./jre/lib/sparcv9/libinstrument.so +./jre/lib/sparcv9/libj2gss.so +./jre/lib/sparcv9/libj2pcsc.so +./jre/lib/sparcv9/libj2pkcs11.so +./jre/lib/sparcv9/libj2ucrypto.so +./jre/lib/sparcv9/libjaas_unix.so +./jre/lib/sparcv9/libjava.so +./jre/lib/sparcv9/libjava_crw_demo.so +./jre/lib/sparcv9/libjawt.so +./jre/lib/sparcv9/libjdwp.so +./jre/lib/sparcv9/libjfr.so +./jre/lib/sparcv9/libjpeg.so +./jre/lib/sparcv9/libjsdt.so +./jre/lib/sparcv9/libjsound.so +./jre/lib/sparcv9/libkcms.so +./jre/lib/sparcv9/liblcms.so +./jre/lib/sparcv9/libmanagement.so +./jre/lib/sparcv9/libmlib_image.so +./jre/lib/sparcv9/libmlib_image_v.so +./jre/lib/sparcv9/libnet.so +./jre/lib/sparcv9/libnio.so +./jre/lib/sparcv9/libnpt.so +./jre/lib/sparcv9/libsctp.so +./jre/lib/sparcv9/libsplashscreen.so +./jre/lib/sparcv9/libsunec.so +./jre/lib/sparcv9/libsunwjdga.so +./jre/lib/sparcv9/libt2k.so +./jre/lib/sparcv9/libunpack.so +./jre/lib/sparcv9/libverify.so +./jre/lib/sparcv9/libzip.so +./jre/lib/sparcv9/server/libjvm.so +./bin/sparcv9/appletviewer +./bin/sparcv9/extcheck +./bin/sparcv9/idlj +./bin/sparcv9/jar +./bin/sparcv9/jarsigner +./bin/sparcv9/java +./bin/sparcv9/javac +./bin/sparcv9/javadoc +./bin/sparcv9/javah +./bin/sparcv9/javap +./bin/sparcv9/jcmd +./bin/sparcv9/jconsole +./bin/sparcv9/jdb +./bin/sparcv9/jhat +./bin/sparcv9/jinfo +./bin/sparcv9/jmap +./bin/sparcv9/jps +./bin/sparcv9/jrunscript +./bin/sparcv9/jsadebugd +./bin/sparcv9/jstack +./bin/sparcv9/jstat +./bin/sparcv9/jstatd +./bin/sparcv9/keytool +./bin/sparcv9/native2ascii +./bin/sparcv9/orbd +./bin/sparcv9/pack200 +./bin/sparcv9/policytool +./bin/sparcv9/rmic +./bin/sparcv9/rmid +./bin/sparcv9/rmiregistry +./bin/sparcv9/schemagen +./bin/sparcv9/serialver +./bin/sparcv9/servertool +./bin/sparcv9/tnameserv +./bin/sparcv9/unpack200 +./bin/sparcv9/wsgen +./bin/sparcv9/wsimport +./bin/sparcv9/xjc +./jre/bin/sparcv9/java +./jre/bin/sparcv9/keytool +./jre/bin/sparcv9/orbd +./jre/bin/sparcv9/pack200 +./jre/bin/sparcv9/policytool +./jre/bin/sparcv9/rmid +./jre/bin/sparcv9/rmiregistry +./jre/bin/sparcv9/servertool +./jre/bin/sparcv9/tnameserv +./jre/bin/sparcv9/unpack200 +" + +# Filter random C++ symbol strings. +# Some numbers differ randomly. +DIS_DIFF_FILTER="$SED -e s/\$[a-zA-Z0-9_\$]\{15,15\}//g -e s/[0-9a-f][0-9a-f].[0-9a-f][0-9a-f].[0-9a-f][0-9a-f].[0-9a-f][0-9a-f]//g -e s/\(%g1,.0x\)[0-9a-f]*\(,.%g1\)/\1\2/g -e s/\(!.\)[0-9a-f]*\(.\2/g" + +# Some xor instructions end up with different args in the lib but not in the object files. +ACCEPTED_DIS_DIFF=" +./demo/jvmti/waiters/lib/sparcv9/libwaiters.so +" + +SKIP_FULLDUMP_DIFF="true" + +fi + + +if [ "$OPENJDK_TARGET_OS" = "windows" ]; then + +# Probably should add all libs here +ACCEPTED_SMALL_SIZE_DIFF=" +./demo/jvmti/gctest/lib/gctest.dll +./demo/jvmti/heapTracker/lib/heapTracker.dll +./demo/jvmti/minst/lib/minst.dll +./jre/bin/attach.dll +./jre/bin/java_crw_demo.dll +./jre/bin/jsoundds.dll +./bin/appletviewer.exe +./bin/extcheck.exe +./bin/idlj.exe +./bin/jar.exe +./bin/jarsigner.exe +./bin/java-rmi.exe +./bin/java.exe +./bin/javac.exe +./bin/javadoc.exe +./bin/javah.exe +./bin/javap.exe +./bin/javaw.exe +./bin/jcmd.exe +./bin/jconsole.exe +./bin/jdb.exe +./bin/jhat.exe +./bin/jinfo.exe +./bin/jmap.exe +./bin/jps.exe +./bin/jrunscript.exe +./bin/jsadebugd.exe +./bin/jstack.exe +./bin/jstat.exe +./bin/jstatd.exe +./bin/keytool.exe +./bin/kinit.exe +./bin/klist.exe +./bin/ktab.exe +./bin/native2ascii.exe +./bin/orbd.exe +./bin/pack200.exe +./bin/policytool.exe +./bin/rmic.exe +./bin/rmid.exe +./bin/rmiregistry.exe +./bin/schemagen.exe +./bin/serialver.exe +./bin/servertool.exe +./bin/tnameserv.exe +./bin/unpack200.exe +./bin/wsgen.exe +./bin/wsimport.exe +./bin/xjc.exe +./jre/bin/java-rmi.exe +./jre/bin/java.exe +./jre/bin/javaw.exe +./jre/bin/keytool.exe +./jre/bin/kinit.exe +./jre/bin/klist.exe +./jre/bin/ktab.exe +./jre/bin/orbd.exe +./jre/bin/pack200.exe +./jre/bin/policytool.exe +./jre/bin/rmid.exe +./jre/bin/rmiregistry.exe +./jre/bin/servertool.exe +./jre/bin/tnameserv.exe +./jre/bin/unpack200.exe +" + +# On windows, there are unavoidable allignment issues making +# a perfect disasm diff impossible. Filter out the following: +# * Random parts of C++ symbols (this is a bit greedy, but does the trick) +# @XXXXX +# * Hexadecimal addresses that are sometimes alligned differently. +# * Dates in version strings XXXX_XX_XX. +DIS_DIFF_FILTER="$SED -e s/[@?][A-Z0-9_]\{1,25\}//g -e s/^.\{2,2\}[0-9A-F]\{16,16\}.\{2,2\}//g -e s/[0-9A-F]\{4,16\}h//g -e s/_[0-9]\{4,4\}_[0-9][0-9]_[0-9][0-9]//g" + +SKIP_BIN_DIFF="true" +SKIP_FULLDUMP_DIFF="true" + +fi + + +if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then +ACCEPTED_JARZIP_CONTENTS=" +/META-INF/INDEX.LIST +" + +KNOWN_BIN_DIFF=" +./jre/lib/libJObjC.dylib +" + +ACCEPTED_BIN_DIFF=" +./bin/appletviewer +./bin/extcheck +./bin/idlj +./bin/jar +./bin/jarsigner +./bin/java +./bin/javac +./bin/javadoc +./bin/javah +./bin/javap +./bin/jcmd +./bin/jconsole +./bin/jdb +./bin/jhat +./bin/jinfo +./bin/jmap +./bin/jps +./bin/jrunscript +./bin/jsadebugd +./bin/jstack +./bin/jstat +./bin/jstatd +./bin/keytool +./bin/native2ascii +./bin/orbd +./bin/pack200 +./bin/policytool +./bin/rmic +./bin/rmid +./bin/rmiregistry +./bin/schemagen +./bin/serialver +./bin/servertool +./bin/tnameserv +./bin/wsgen +./bin/wsimport +./bin/xjc +./jre/bin/java +./jre/bin/keytool +./jre/bin/orbd +./jre/bin/pack200 +./jre/bin/policytool +./jre/bin/rmid +./jre/bin/rmiregistry +./jre/bin/servertool +./jre/bin/tnameserv +./jre/lib/libsaproc.dylib +./jre/lib/server/libjvm.dylib +" + +KNOWN_SIZE_DIFF=" +./jre/lib/libJObjC.dylib +" + +SORT_SYMBOLS=" +./jre/lib/libJObjC.dylib +" + +KNOWN_SYM_DIFF=" +./jre/lib/libJObjC.dylib +" + +KNOWN_ELF_DIFF=" +./jre/lib/libJObjC.dylib +" + +KNOWN_DIS_DIFF=" +./jre/lib/libJObjC.dylib +" + +fi diff --git a/common/bin/compareimage.sh b/common/bin/compareimage.sh deleted file mode 100644 index 0e5d1f031dd..00000000000 --- a/common/bin/compareimage.sh +++ /dev/null @@ -1,335 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# MANUAL -# -# ./common/bin/compareimages.sh old_jdk_image new_jdk_image -# -# Compare the directory structure. -# Compare the filenames in the directories. -# Compare the contents of the zip archives -# Compare the contents of the jar archives -# Compare the native libraries -# Compare the native executables -# Compare the remaining files -# -# ./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other] -# -# Compare only the selected subset of the images. -# -# ./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar -# -# Compare only the CodePointIM.jar file -# Can be used to compare zips, libraries and executables. -# - -if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then - echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image" - echo "" - echo "Compare the directory structure." - echo "Compare the filenames in the directories." - echo "Compare the contents of the zip archives" - echo "Compare the contents of the jar archives" - echo "Compare the native libraries" - echo "Compare the native executables" - echo "Compare the remaining files" - echo "" - echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other]" - echo "" - echo "Compare only the selected subset of the images." - echo "" - echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar" - echo "" - echo "Compare only the CodePointIM.jar file" - echo "Can be used to compare zips, libraries and executables." - exit 10 -fi - -OLD="$1" -NEW="$2" -CMD="$3" - -DIFF_RESULT=0 - -CMP_ZIPS=false -CMP_JARS=false -CMP_LIBS=false -CMP_EXECS=false -CMP_OTHER=false - -FILTER="cat" - -if [ -n "$CMD" ]; then - case "$CMD" in - zips) - CMP_ZIPS=true - ;; - jars) - CMP_JARS=true - ;; - libs) - CMP_LIBS=true - ;; - execs) - CMP_EXECS=true - ;; - other) - CMP_OTHER=true - ;; - *) - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - CMP_OTHER=true - FILTER="grep $3" - ;; - esac -else - CMP_ZIPS=true - CMP_JARS=true - CMP_LIBS=true - CMP_EXECS=true - CMP_OTHER=true -fi - -DIFFJARZIP="/bin/bash `dirname $0`/diffjarzip.sh" -DIFFLIB="/bin/bash `dirname $0`/difflib.sh" -DIFFEXEC="/bin/bash `dirname $0`/diffexec.sh" -export COMPARE_ROOT=/tmp/cimages.$USER -mkdir -p $COMPARE_ROOT - -# Load the correct exception list. -case "`uname -s`" in - Linux) - . `dirname $0`/exception_list_linux - ;; -esac - -echo -echo Comparing $OLD to $NEW -echo - -(cd $OLD && find . -type d | sort > $COMPARE_ROOT/from_dirs) -(cd $NEW && find . -type d | sort > $COMPARE_ROOT/to_dirs) - -echo -n Directory structure... -if diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs > /dev/null; then - echo Identical! -else - echo Differences found. - DIFF_RESULT=1 - # Differences in directories found. - ONLY_OLD=$(diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs | grep '<') - if [ "$ONLY_OLD" ]; then - echo Only in $OLD - echo $ONLY_OLD | sed 's|< ./|\t|g' | sed 's/ /\n/g' - fi - # Differences in directories found. - ONLY_NEW=$(diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs | grep '>') - if [ "$ONLY_NEW" ]; then - echo Only in $NEW - echo $ONLY_NEW | sed 's|> ./|\t|g' | sed 's/ /\n/g' - fi -fi - -(cd $OLD && find . -type f | sort > $COMPARE_ROOT/from_files) -(cd $NEW && find . -type f | sort > $COMPARE_ROOT/to_files) - -echo -n File names... -if diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files > /dev/null; then - echo Identical! -else - echo Differences found. - DIFF_RESULT=1 - # Differences in directories found. - ONLY_OLD=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '<') - if [ "$ONLY_OLD" ]; then - echo Only in $OLD - echo "$ONLY_OLD" | sed 's|< ./| |g' - fi - # Differences in directories found. - ONLY_NEW=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '>') - if [ "$ONLY_NEW" ]; then - echo Only in $NEW - echo "$ONLY_NEW" | sed 's|> ./| |g' - fi -fi - -echo -n Permissions... -found="" -for f in `cd $OLD && find . -type f` -do - if [ ! -f ${OLD}/$f ]; then continue; fi - if [ ! -f ${NEW}/$f ]; then continue; fi - OP=`ls -l ${OLD}/$f | awk '{printf("%.10s\n", $1);}'` - NP=`ls -l ${NEW}/$f | awk '{printf("%.10s\n", $1);}'` - if [ "$OP" != "$NP" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - printf "\told: ${OP} new: ${NP}\t$f\n" - fi - - OF=`cd ${OLD} && file $f` - NF=`cd ${NEW} && file $f` - if [ "$f" = "./src.zip" ] - then - if [ "`echo $OF | grep -ic zip`" -gt 0 -a "`echo $NF | grep -ic zip`" -gt 0 ] - then - # the way we produces zip-files make it so that directories are stored in old file - # but not in new (only files with full-path) - # this makes file-5.09 report them as different - continue; - fi - fi - - if [ "$OF" != "$NF" ] - then - if [ -z "$found" ]; then echo ; found="yes"; fi - printf "\tFILE: old: ${OF} new: ${NF}\t$f\n" - fi -done -if [ -z "$found" ]; then echo ; found="yes"; fi - -GENERAL_FILES=$(cd $OLD && find . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \ - ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \ - ! -name "ct.sym" ! -name "*.diz" \ - | grep -v "./bin/" | sort | $FILTER) -echo General files... -for f in $GENERAL_FILES -do - if [ -e $NEW/$f ]; then - DIFF_OUT=$(diff $OLD/$f $NEW/$f 2>&1) - if [ -n "$DIFF_OUT" ]; then - echo $f - echo "$DIFF_OUT" - fi - fi -done - - -if [ "x$CMP_ZIPS" == "xtrue" ]; then - ZIPS=$(cd $OLD && find . -type f -name "*.zip" | sort | $FILTER) - - if [ -n "$ZIPS" ]; then - echo Zip files... - - for f in $ZIPS - do - $DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW - if [ "$?" != "0" ]; then - DIFF_RESULT=1 - fi - done - fi -fi - -if [ "x$CMP_JARS" == "xtrue" ]; then - JARS=$(cd $OLD && find . -type f -name "*.jar" -o -name "ct.sym" | sort | $FILTER) - - if [ -n "$JARS" ]; then - echo Jar files... - - for f in $JARS - do - DIFFJAR_OUTPUT=`$DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW` - DIFFJAR_RESULT=$? - if [ "$DIFFJAR_RESULT" != "0" ]; then - for diff in $LIST_DIFF_JAR; do - DIFFJAR_OUTPUT=`echo "$DIFFJAR_OUTPUT" | grep -v "$diff"` - done - if [ "`echo "$DIFFJAR_OUTPUT" | grep -v "Differing files in"`" != "" ]; then - DIFF_RESULT=1 - echo "$DIFFJAR_OUTPUT" - fi - fi - done - fi -fi - -if [ "x$FILTER" != "xcat" ]; then - VIEW=view -else - VIEW= -fi - -if [ "x$CMP_LIBS" == "xtrue" ]; then - LIBS=$(cd $OLD && find . -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' | sort | $FILTER) - - if [ -n "$LIBS" ]; then - echo Libraries... - for f in $LIBS - do - DIFFLIB_OUTPUT=`$DIFFLIB $OLD/$f $NEW/$f $OLD $NEW $VIEW` - DIFFLIB_RESULT=$? - if [ "$DIFFLIB_RESULT" = "0" ]; then - : - #echo "OK: $DIFFLIB_OUTPUT" - elif [ "$DIFFLIB_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFLIB_OUTPUT" - elif [ "$DIFFLIB_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFLIB_OUTPUT" - else - echo "$DIFFLIB_OUTPUT" - DIFF_RESULT=1 - fi - done - fi -fi - -if [ "x$CMP_EXECS" == "xtrue" ]; then - if [ $OSTYPE == "cygwin" ]; then - EXECS=$(cd $OLD && find . -type f -name '*.exe' | sort | $FILTER) - else - EXECS=$(cd $OLD && find . -type f -perm -100 \! \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' \) | sort | $FILTER) - fi - - - if [ -n "$EXECS" ]; then - echo Executables... - - for f in $EXECS - do - DIFFEXEC_OUTPUT=`$DIFFEXEC $OLD/$f $NEW/$f $OLD $NEW $VIEW` - DIFFEXEC_RESULT=$? - if [ "$DIFFEXEC_RESULT" = "0" ]; then - : - #echo "OK: $DIFFEXEC_OUTPUT" - elif [ "$DIFFEXEC_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFEXEC_OUTPUT" - elif [ "$DIFFEXEC_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then - : - #echo "OK: $DIFFEXEC_OUTPUT" - else - echo "$DIFFEXEC_OUTPUT" - DIFF_RESULT=1 - fi - done - fi -fi - -exit $DIFF_RESULT diff --git a/common/bin/diffexec.sh b/common/bin/diffexec.sh deleted file mode 100644 index 85f7b67c69f..00000000000 --- a/common/bin/diffexec.sh +++ /dev/null @@ -1,186 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -if [ $# -lt 2 ] -then - echo "Diff two executables. Return codes:" - echo "0 - no diff" - echo "1 - Identical symbols AND size, BUT not bytewise identical" - echo "2 - Identical symbols BUT NEW size" - echo "3 - Differences, content BUT SAME size" - echo "4 - Differences, content AND size" - echo "10 - Could not perform diff" - echo "Use 'quiet' to disable any output." - echo "Syntax: $0 file1 file2 [quiet]" - exit 10 -fi - -if [ ! -f $1 ] -then - echo $1 does not exist - exit 10 -fi - -if [ ! -f $2 ] -then - echo $2 does not exist - exit 10 -fi - -if [ "`uname`" == "SunOS" ]; then - if [ -f "`which nm`" ]; then - NM=nm - elif [ -f "`which gnm`" ]; then - NM=gnm - else - echo "No nm command found" - exit 10 - fi - LDD=ldd -elif [ $OSTYPE == "cygwin" ]; then - NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe" - NM_ARGS=/exports - LDD= -elif [ "`uname`" == "Darwin" ]; then - NM=nm - LDD="otool -L" -else - NM=nm - LDD=ldd -fi - -# Should the differences be viewed? -VIEW= -# You can do export DIFF=meld to view -# any differences using meld instead. -if [ -n "$DIFF" ]; then - DIFF="$DIFF" -else - DIFF=diff -fi -OLD=$(cd $(dirname $1) && pwd)/$(basename $1) -NEW=$(cd $(dirname $2) && pwd)/$(basename $2) - -OLD_SIZE=$(ls -l "$OLD" | awk '{ print $5 }') -NEW_SIZE=$(ls -l "$NEW" | awk '{ print $5 }') - -if [ $# -gt 3 ] -then - ROOT1=$(cd $3 && pwd) - ROOT2=$(cd $4 && pwd) - OLD_NAME=$(echo $OLD | sed "s|$ROOT1/||") - NEW_NAME=$(echo $NEW | sed "s|$ROOT2/||") - if [ "x$5" == "xview" ]; then VIEW=view; fi -else - ROOT1=$(dirname $OLD)/ - ROOT2=$(dirname $NEW)/ - OLD_NAME=$OLD - NEW_NAME=$NEW - if [ "x$3" == "xview" ]; then VIEW=view; fi -fi - -if cmp $OLD $NEW > /dev/null -then - # The files were bytewise identical. - echo Identical: $OLD_NAME - exit 0 -fi - -OLD_SYMBOLS=$COMPARE_ROOT/$OLD_NAME.old -NEW_SYMBOLS=$COMPARE_ROOT/$NEW_NAME.new - -mkdir -p $(dirname $OLD_SYMBOLS) -mkdir -p $(dirname $NEW_SYMBOLS) - -if [ $OSTYPE == "cygwin" ]; then - "$NM" $NM_ARGS $OLD | grep " = " > $OLD_SYMBOLS - "$NM" $NM_ARGS $NEW | grep " = " > $NEW_SYMBOLS - "$NM" $NM_ARGS $OLD > $OLD_SYMBOLS.full - "$NM" $NM_ARGS $NEW > $NEW_SYMBOLS.full -else - # Strip the addresses, just compare the ordering of the symbols. - $NM $OLD | cut -f 2- -d ' ' > $OLD_SYMBOLS - $NM $NEW | cut -f 2- -d ' ' > $NEW_SYMBOLS - # But store the full information for easy diff access. - $NM $OLD > $OLD_SYMBOLS.full - $NM $NEW > $NEW_SYMBOLS.full -fi - -DIFFS=$(LANG=C diff $OLD_SYMBOLS $NEW_SYMBOLS) - -if [ "${LDD}" ] -then - NAME=`basename $OLD` - TMP=$COMPARE_ROOT/ldd/ldd.${NAME} - rm -rf "${TMP}" - mkdir -p "${TMP}" - - (cd "${TMP}" && cp $OLD . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.old | uniq > dep.uniq.old) - (cd "${TMP}" && cp $NEW . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.new | uniq > dep.uniq.new) - (cd "${TMP}" && rm -f ${NAME}) - - DIFFS_DEP=$(LANG=C diff "${TMP}/dep.old" "${TMP}/dep.new") - DIFFS_UNIQ_DEP=$(LANG=C diff "${TMP}/dep.uniq.old" "${TMP}/dep.uniq.new") - - DEP_MSG= - if [ -z "${DIFFS_UNIQ_DEP}" -a -z "${DIFFS_DEP}" ]; then - DEP_MSG="Identical dependencies" - elif [ -z "${DIFFS_UNIQ_DEP}" ]; then - DEP_MSG="Redundant duplicate dependencies added" - RES=1 - else - DEP_MSG="DIFFERENT dependencies" - RES=1 - fi -fi - -RESULT=0 - -if [ -n "$DIFFS" ]; then - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Differences, content AND size : $DEP_MSG : $OLD_NAME - RESULT=4 - else - echo Differences, content BUT SAME size: $DEP_MSG : $OLD_NAME - RESULT=3 - fi - if [ "x$VIEW" == "xview" ]; then - LANG=C $DIFF $OLD_SYMBOLS $NEW_SYMBOLS - fi -else - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Identical symbols BUT NEW size : $DEP_MSG : $OLD_NAME - RESULT=2 - else - echo Identical symbols AND size, BUT not bytewise identical: $DEP_MSG : $OLD_NAME - RESULT=1 - fi -fi - -exit $RESULT - - - diff --git a/common/bin/diffjarzip.sh b/common/bin/diffjarzip.sh deleted file mode 100644 index 6ad0a42c2f6..00000000000 --- a/common/bin/diffjarzip.sh +++ /dev/null @@ -1,155 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# Simple tool to diff two jar or zip files. It unpacks the jar/zip files and -# reports if files differs and if files are new or missing. -# Assumes gnu diff. - -# There are a few source files that have DOS line endings in the -# jaxp/jaxws source drops, when the sources were added to the repository -# the source files were converted to UNIX line endings. -# For now we ignore these differences. -DIFF_FLAGS="--strip-trailing-cr" -#set -x - -if [ $# -lt 2 ] -then - echo "Diff two jar/zip files. Return codes: 0 - no diff, 1 - diff, 2 - couldn't perform diff" - echo "Syntax: $0 old_archive new_archive [old_root new_root]" - exit 2 -fi - -if [ ! -f $1 ] -then - echo $1 does not exist - exit 2 -fi - -if [ ! -f $2 ] -then - echo $2 does not exist - exit 2 -fi - -IGNORES="cat" -OLD=$(cd $(dirname $1) && pwd)/$(basename $1) -NEW=$(cd $(dirname $2) && pwd)/$(basename $2) - -if [ $# -gt 3 ] -then - ROOT1=$(cd $3 && pwd) - ROOT2=$(cd $4 && pwd) - OLD_NAME=$(echo $OLD | sed "s|$ROOT1/||") - NEW_NAME=$(echo $NEW | sed "s|$ROOT2/||") - if [ $# == 5 ]; then IGNORES="$5"; fi -else - ROOT1=$(dirname $OLD)/ - ROOT2=$(dirname $NEW)/ - OLD_NAME=$OLD - NEW_NAME=$NEW - if [ $# == 3 ]; then IGNORES="$3"; fi -fi - -if [ "`uname`" == "SunOS" ]; then - if [ -f "`which gdiff`" ]; then - DIFF=gdiff - else - DIFF=diff - fi -else - DIFF=diff -fi - -OLD_SUFFIX="${OLD##*.}" -NEW_SUFFIX="${NEW##*.}" -if [ "$OLD_SUFFIX" != "$NEW_SUFFIX" ]; then - echo The files do not have the same suffix type! - exit 2 -fi - -if [ "$OLD_SUFFIX" != "zip" ] && [ "$OLD_SUFFIX" != "jar" ] && [ "$OLD_SUFFIX" != "sym" ]; then - echo The files have to be zip, jar or sym! They are $OLD_SUFFIX - exit 2 -fi - -UNARCHIVE="unzip -q" - -TYPE="$OLD_SUFFIX" - -if cmp $OLD $NEW > /dev/null -then - # The files were bytewise identical. - exit 0 -fi - -# Not quite identical, the might still contain the same data. -# Unpack the jar/zip files in temp dirs -if test "x$COMPARE_ROOT" == "x"; then - COMPARE_ROOT=/tmp/compare_root.$$ - REMOVE_COMPARE_ROOT=true -fi -OLD_TEMPDIR=$COMPARE_ROOT/$OLD_NAME.old -NEW_TEMPDIR=$COMPARE_ROOT/$NEW_NAME.new -mkdir -p $OLD_TEMPDIR -mkdir -p $NEW_TEMPDIR -(cd $OLD_TEMPDIR && rm -rf * ; $UNARCHIVE $OLD) -(cd $NEW_TEMPDIR && rm -rf * ; $UNARCHIVE $NEW) - -ONLY1=$(LANG=C $DIFF -rq $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $OLD_TEMPDIR") - -if [ -n "$ONLY1" ]; then - echo " Only the OLD $OLD_NAME contains:" - LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $OLD_TEMPDIR" \ - | sed "s|Only in $OLD_TEMPDIR| |"g | sed 's|: |/|g' -fi - -ONLY2=$(LANG=C $DIFF -rq $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $NEW_TEMPDIR") - -if [ -n "$ONLY2" ]; then - echo " Only the NEW $NEW_NAME contains:" - LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep "^Only in $NEW_TEMPDIR" \ - | sed "s|Only in $NEW_TEMPDIR| |"g | sed 's|: |/|g' -fi - -DIFFTEXT="/bin/bash `dirname $0`/difftext.sh" - -LANG=C $DIFF -rq $DIFF_FLAGS $OLD_TEMPDIR $NEW_TEMPDIR | grep differ | cut -f 2,4 -d ' ' | \ - awk "{ print \"$DIFFTEXT \"\$1\" \"\$2 }" > $COMPARE_ROOT/diffing - -/bin/bash $COMPARE_ROOT/diffing > $COMPARE_ROOT/diffs - -if [ -s "$COMPARE_ROOT/diffs" ]; then - echo " Differing files in $OLD_NAME" - cat $COMPARE_ROOT/diffs | grep differ | $IGNORES | cut -f 2 -d ' ' | \ - sed "s|$OLD_TEMPDIR| |g" -fi - -# Clean up - -if [ "x$REMOVE_COMPARE_ROOT" == xtrue ]; then - rm -rf $REMOVE_COMPARE_ROOT -fi - -exit 1 - diff --git a/common/bin/difflib.sh b/common/bin/difflib.sh deleted file mode 100644 index dc5eed14877..00000000000 --- a/common/bin/difflib.sh +++ /dev/null @@ -1,207 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# Simple tool to diff two shared libraries. -# Criterias: two shared libraries are considered equal if: -# the file sizes are the same AND the symbols outputs from the nm command are equal - -if [ $# -lt 2 ] -then - echo "Diff two shared libs. Return codes:" - echo "0 - no diff" - echo "1 - Identical symbols AND size, BUT not bytewise identical" - echo "2 - Identical symbols BUT NEW size" - echo "3 - Differences, content BUT SAME size" - echo "4 - Differences, content AND size" - echo "10 - Could not perform diff" - echo "Use 'quiet' to disable any output." - echo "Syntax: $0 file1 file2 [quiet]" - exit 10 -fi - -if [ ! -f $1 ] -then - echo $1 does not exist - exit 10 -fi - -if [ ! -f $2 ] -then - echo $2 does not exist - exit 10 -fi - -if [ "`uname`" == "SunOS" ]; then - if [ -f "`which gnm`" ]; then - NM=gnm -# Jonas 2012-05-29: solaris native nm produces radically different output than gnm -# so if using that...we need different filter than "cut -f 2-" -# - elif [ -f "`which nm`" ]; then - NM=nm - else - echo "No nm command found" - exit 10 - fi - LDD=ldd -elif [ $OSTYPE == "cygwin" ]; then - NM="$VS100COMNTOOLS/../../VC/bin/amd64/dumpbin.exe" - NM_ARGS=/exports - LDD= -elif [ "`uname`" == "Darwin" ]; then - NM=nm - LDD="otool -L" -else - NM=nm - LDD=ldd -fi - -# Should the differences be viewed? -VIEW= -# You can do export DIFF=meld to view -# any differences using meld instead. -if [ -n "$DIFF" ]; then - DIFF="$DIFF" -else - DIFF=diff -fi -OLD=$(cd $(dirname $1) && pwd)/$(basename $1) -NEW=$(cd $(dirname $2) && pwd)/$(basename $2) - -OLD_SIZE=$(ls -l "$OLD" | awk '{ print $5 }') -NEW_SIZE=$(ls -l "$NEW" | awk '{ print $5 }') - -if [ $# -gt 3 ] -then - ROOT1=$(cd $3 && pwd) - ROOT2=$(cd $4 && pwd) - OLD_NAME=$(echo $OLD | sed "s|$ROOT1/||") - NEW_NAME=$(echo $NEW | sed "s|$ROOT2/||") - if [ "x$5" == "xview" ]; then VIEW=view; fi -else - ROOT1=$(dirname $OLD)/ - ROOT2=$(dirname $NEW)/ - OLD_NAME=$OLD - NEW_NAME=$NEW - if [ "x$3" == "xview" ]; then VIEW=view; fi -fi - -OLD_SUFFIX="${OLD##*.}" -NEW_SUFFIX="${NEW##*.}" -if [ "$OLD_SUFFIX" != "$NEW_SUFFIX" ]; then - echo The files do not have the same suffix type! - exit 10 -fi - -if [ "$OLD_SUFFIX" != "so" ] && [ "$OLD_SUFFIX" != "dylib" ] && [ "$OLD_SUFFIX" != "dll" ]; then - echo The files have to be .so, .dylib or .dll! They are $OLD_SUFFIX - exit 10 -fi - -TYPE="$OLD_SUFFIX" - -if cmp $OLD $NEW > /dev/null -then - # The files were bytewise identical. - echo Identical: $OLD_NAME - exit 0 -fi - -OLD_SYMBOLS=$COMPARE_ROOT/nm.$OLD_NAME.old -NEW_SYMBOLS=$COMPARE_ROOT/nm.$NEW_NAME.new - -mkdir -p $(dirname $OLD_SYMBOLS) -mkdir -p $(dirname $NEW_SYMBOLS) - -if [ $OSTYPE == "cygwin" ]; then - "$NM" $NM_ARGS $OLD | grep " = " > $OLD_SYMBOLS - "$NM" $NM_ARGS $NEW | grep " = " > $NEW_SYMBOLS - "$NM" $NM_ARGS $OLD > $OLD_SYMBOLS.full - "$NM" $NM_ARGS $NEW > $NEW_SYMBOLS.full -else - # Strip the addresses, just compare the ordering of the symbols. - $NM $OLD | cut -f 2- -d ' ' > $OLD_SYMBOLS - $NM $NEW | cut -f 2- -d ' ' > $NEW_SYMBOLS - # But store the full information for easy diff access. - $NM $OLD > $OLD_SYMBOLS.full - $NM $NEW > $NEW_SYMBOLS.full -fi - -DIFFS=$(LANG=C diff $OLD_SYMBOLS $NEW_SYMBOLS) - -RESULT=0 - -if [ "${LDD}" ] -then - NAME=`basename $OLD` - TMP=$COMPARE_ROOT/ldd/ldd.${NAME} - rm -rf "${TMP}" - mkdir -p "${TMP}" - - (cd "${TMP}" && cp $OLD . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.old | uniq > dep.uniq.old) - (cd "${TMP}" && cp $NEW . && ${LDD} ${NAME} | awk '{ print $1;}' | sort | tee dep.new | uniq > dep.uniq.new) - (cd "${TMP}" && rm -f ${NAME}) - - DIFFS_DEP=$(LANG=C diff "${TMP}/dep.old" "${TMP}/dep.new") - DIFFS_UNIQ_DEP=$(LANG=C diff "${TMP}/dep.uniq.old" "${TMP}/dep.uniq.new") - - DEP_MSG= - if [ -z "${DIFFS_UNIQ_DEP}" -a -z "${DIFFS_DEP}" ]; then - DEP_MSG="Identical dependencies" - elif [ -z "${DIFFS_UNIQ_DEP}" ]; then - DEP_MSG="Redundant duplicate dependencies added" - RES=1 - else - DEP_MSG="DIFFERENT dependencies" - RES=1 - fi -fi - -if [ -n "$DIFFS" ]; then - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Differences, content AND size : $DEP_MSG : $OLD_NAME - RESULT=4 - else - echo Differences, content BUT SAME size: $DEP_MSG : $OLD_NAME - RESULT=3 - fi - if [ "x$VIEW" == "xview" ]; then - LANG=C $DIFF $OLD_SYMBOLS $NEW_SYMBOLS - fi -else - if [ $OLD_SIZE -ne $NEW_SIZE ] - then - echo Identical symbols BUT NEW size : $DEP_MSG : $OLD_NAME - RESULT=2 - else - echo Identical symbols AND size, BUT not bytewise identical: $DEP_MSG : $OLD_NAME - RESULT=1 - fi -fi - -exit $RESULT - - - diff --git a/common/bin/difftext.sh b/common/bin/difftext.sh deleted file mode 100644 index ae903731f59..00000000000 --- a/common/bin/difftext.sh +++ /dev/null @@ -1,157 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# The difftext.sh knows how to compare text files and -# ignore some specific differences. -# When difftext.sh is called, we already know that the -# files differ. But if the tests below trigger, then -# we ignore differences caused by: -# -# Timestamps in Java sources generated by idl2java -# Sorting order and cleanup style in .properties files. - -OLD="$1" -NEW="$2" -SUF="${OLD##*.}" -TMP=1 -if test "x$SUF" == "xjava"; then - TMP=$(LANG=C diff $OLD $NEW | \ - grep '^[<>]' | \ - sed '/[<>] \* from.*\.idl/d' | \ - sed '/[<>] \*.*201[12].*/d' | \ - sed '/\/\/ Generated from input file.*/d' | \ - sed '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' | \ - sed '/\/\/ java GenerateCharacter.*/d') -fi -if test "x$SUF" == "xproperties"; then - cat $OLD | sed -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \ --e 's/\\u0020/\x20/g' \ --e 's/\\u003A/\x3A/g' \ --e 's/\\u006B/\x6B/g' \ --e 's/\\u0075/\x75/g' \ --e 's/\\u00A0/\xA0/g' \ --e 's/\\u00A3/\xA3/g' \ --e 's/\\u00B0/\xB0/g' \ --e 's/\\u00B7/\xB7/g' \ --e 's/\\u00BA/\xBA/g' \ --e 's/\\u00BF/\xBF/g' \ --e 's/\\u00C0/\xC0/g' \ --e 's/\\u00C1/\xC1/g' \ --e 's/\\u00C2/\xC2/g' \ --e 's/\\u00C4/\xC4/g' \ --e 's/\\u00C5/\xC5/g' \ --e 's/\\u00C8/\xC8/g' \ --e 's/\\u00C9/\xC9/g' \ --e 's/\\u00CA/\xCA/g' \ --e 's/\\u00CD/\xCD/g' \ --e 's/\\u00CE/\xCE/g' \ --e 's/\\u00D3/\xD3/g' \ --e 's/\\u00D4/\xD4/g' \ --e 's/\\u00D6/\xD6/g' \ --e 's/\\u00DA/\xDA/g' \ --e 's/\\u00DC/\xDC/g' \ --e 's/\\u00DD/\xDD/g' \ --e 's/\\u00DF/\xDF/g' \ --e 's/\\u00E0/\xE0/g' \ --e 's/\\u00E1/\xE1/g' \ --e 's/\\u00E2/\xE2/g' \ --e 's/\\u00E3/\xE3/g' \ --e 's/\\u00E4/\xE4/g' \ --e 's/\\u00E5/\xE5/g' \ --e 's/\\u00E6/\xE6/g' \ --e 's/\\u00E7/\xE7/g' \ --e 's/\\u00E8/\xE8/g' \ --e 's/\\u00E9/\xE9/g' \ --e 's/\\u00EA/\xEA/g' \ --e 's/\\u00EB/\xEB/g' \ --e 's/\\u00EC/\xEC/g' \ --e 's/\\u00ED/\xED/g' \ --e 's/\\u00EE/\xEE/g' \ --e 's/\\u00EF/\xEF/g' \ --e 's/\\u00F1/\xF1/g' \ --e 's/\\u00F2/\xF2/g' \ --e 's/\\u00F3/\xF3/g' \ --e 's/\\u00F4/\xF4/g' \ --e 's/\\u00F5/\xF5/g' \ --e 's/\\u00F6/\xF6/g' \ --e 's/\\u00F9/\xF9/g' \ --e 's/\\u00FA/\xFA/g' \ --e 's/\\u00FC/\xFC/g' \ --e 's/\\u0020/\x20/g' \ --e 's/\\u003f/\x3f/g' \ --e 's/\\u006f/\x6f/g' \ --e 's/\\u0075/\x75/g' \ --e 's/\\u00a0/\xa0/g' \ --e 's/\\u00a3/\xa3/g' \ --e 's/\\u00b0/\xb0/g' \ --e 's/\\u00ba/\xba/g' \ --e 's/\\u00bf/\xbf/g' \ --e 's/\\u00c1/\xc1/g' \ --e 's/\\u00c4/\xc4/g' \ --e 's/\\u00c5/\xc5/g' \ --e 's/\\u00c8/\xc8/g' \ --e 's/\\u00c9/\xc9/g' \ --e 's/\\u00ca/\xca/g' \ --e 's/\\u00cd/\xcd/g' \ --e 's/\\u00d6/\xd6/g' \ --e 's/\\u00dc/\xdc/g' \ --e 's/\\u00dd/\xdd/g' \ --e 's/\\u00df/\xdf/g' \ --e 's/\\u00e0/\xe0/g' \ --e 's/\\u00e1/\xe1/g' \ --e 's/\\u00e2/\xe2/g' \ --e 's/\\u00e3/\xe3/g' \ --e 's/\\u00e4/\xe4/g' \ --e 's/\\u00e5/\xe5/g' \ --e 's/\\u00e7/\xe7/g' \ --e 's/\\u00e8/\xe8/g' \ --e 's/\\u00e9/\xe9/g' \ --e 's/\\u00ea/\xea/g' \ --e 's/\\u00eb/\xeb/g' \ --e 's/\\u00ec/\xec/g' \ --e 's/\\u00ed/\xed/g' \ --e 's/\\u00ee/\xee/g' \ --e 's/\\u00ef/\xef/g' \ --e 's/\\u00f0/\xf0/g' \ --e 's/\\u00f1/\xf1/g' \ --e 's/\\u00f2/\xf2/g' \ --e 's/\\u00f3/\xf3/g' \ --e 's/\\u00f4/\xf4/g' \ --e 's/\\u00f5/\xf5/g' \ --e 's/\\u00f6/\xf6/g' \ --e 's/\\u00f7/\xf7/g' \ --e 's/\\u00f8/\xf8/g' \ --e 's/\\u00f9/\xf9/g' \ --e 's/\\u00fa/\xfa/g' \ --e 's/\\u00fc/\xfc/g' \ --e 's/\\u00ff/\xff/g' \ - | sed -e '/^#/d' -e '/^$/d' \ - -e :a -e '/\\$/N; s/\\\n//; ta' \ - -e 's/^[ \t]*//;s/[ \t]*$//' \ - -e 's/\\=/=/' | LANG=C sort > $OLD.cleaned - TMP=$(LANG=C diff $OLD.cleaned $NEW) -fi -if test -n "$TMP"; then - echo Files $OLD and $NEW differ -fi diff --git a/common/bin/exception_list_linux b/common/bin/exception_list_linux deleted file mode 100644 index 4dcf2724cbf..00000000000 --- a/common/bin/exception_list_linux +++ /dev/null @@ -1,114 +0,0 @@ -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# List of files inside jar archives that are ok if they differ. -LIST_DIFF_JAR=" -/sun/misc/Version.class -/sun/tools/jconsole/Version.class -/com/sun/tools/javac/resources/version.class -/com/sun/tools/javah/resources/version.class -/com/sun/tools/javap/resources/version.class -" - -# List of binaries that only need to match symbols -LIST_DIFF_SIZE=" -jre/lib/amd64/libfontmanager.so -jre/lib/amd64/libjdwp.so -jre/lib/amd64/libt2k.so -bin/unpack200 -jre/bin/unpack200 -jre/lib/amd64/libjsig.debuginfo -jre/lib/amd64/libsaproc.debuginfo -jre/lib/amd64/server/libjvm.debuginfo -" - -# List of binares that need to match both symbols and size -LIST_DIFF_BYTE=" -jre/lib/amd64/libdt_socket.so -jre/lib/amd64/libattach.so -jre/lib/amd64/libjaas_unix.so -jre/lib/amd64/libjawt.so -jre/lib/amd64/libjpeg.so -jre/lib/amd64/libjsdt.so -jre/lib/amd64/libjsig.so -jre/lib/amd64/libsaproc.so -jre/lib/amd64/libsctp.so -jre/lib/amd64/libsunec.so -jre/lib/amd64/libunpack.so -jre/lib/amd64/libverify.so -jre/lib/amd64/libzip.so -jre/lib/amd64/server/libjsig.so -jre/lib/amd64/server/libjvm.so -jre/lib/amd64/liblcms.so -demo/jvmti/heapTracker/lib/libheapTracker.so -demo/jvmti/hprof/lib/libhprof.so -demo/jvmti/minst/lib/libminst.so -demo/jvmti/mtrace/lib/libmtrace.so -demo/jvmti/waiters/lib/libwaiters.so -bin/appletviewer -bin/extcheck -bin/idlj -bin/jar -bin/jarsigner -bin/java -bin/javac -bin/javadoc -bin/javah -bin/javap -bin/jcmd -bin/jconsole -bin/jdb -bin/jhat -bin/jinfo -bin/jmap -bin/jps -bin/jrunscript -bin/jsadebugd -bin/jstack -bin/jstat -bin/jstatd -bin/keytool -bin/native2ascii -bin/orbd -bin/pack200 -bin/policytool -bin/rmic -bin/rmid -bin/rmiregistry -bin/schemagen -bin/serialver -bin/servertool -bin/tnameserv -bin/wsgen -bin/wsimport -bin/xjc -jre/bin/java -jre/bin/keytool -jre/bin/orbd -jre/bin/pack200 -jre/bin/policytool -jre/bin/rmid -jre/bin/rmiregistry -jre/bin/servertool -jre/bin/tnameserv -" diff --git a/common/bin/extractvcvars.sh b/common/bin/extractvcvars.sh deleted file mode 100644 index 32e7d6993bd..00000000000 --- a/common/bin/extractvcvars.sh +++ /dev/null @@ -1,53 +0,0 @@ -#!/bin/bash -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -# Must be bash, but that is ok since we are running from cygwin. -# The first argument is the vcvarsall.bat file to run. -# The second argument is the arch arg to give to vcvars. -VCVARSALL="$1" -ARCH_ARG="$2" - -# Cannot use the VS10 setup script directly (since it only updates the DOS subshell environment) -# but calculate the difference in Cygwin environment before/after running it and then -# apply the diff. -_vs10varsall=`cygpath -a -m -s "$VCVARSALL"` -_dosvs10varsall=`cygpath -a -w -s $_vs10varsall` -_dosbash=`cygpath -a -w -s \`which bash\`.*` - -# generate the set of exported vars before/after the vs10 setup -echo "@echo off" > localdevenvtmp.bat -echo "$_dosbash -c \"export -p\" > localdevenvtmp.export0" >> localdevenvtmp.bat -echo "call $_dosvs10varsall $ARCH_ARG" >> localdevenvtmp.bat -echo "$_dosbash -c \"export -p\" > localdevenvtmp.export1" >> localdevenvtmp.bat -cmd /c localdevenvtmp.bat - -# apply the diff (less some non-vs10 vars named by "!") -sort localdevenvtmp.export0 |grep -v "!" > localdevenvtmp.export0.sort -sort localdevenvtmp.export1 |grep -v "!" > localdevenvtmp.export1.sort -comm -1 -3 localdevenvtmp.export0.sort localdevenvtmp.export1.sort > localdevenv.sh -cat localdevenv.sh | sed 's/declare -x /export /g' | sed 's/="/:="/g' | sed 's/\\\\/\\/g' | sed 's/"//g' | \ - sed 's/#/\$\(HASH\)/g' > localdevenv.gmk - -# cleanup -rm -f localdevenvtmp* diff --git a/common/bin/hide_important_warnings_from_javac.sh b/common/bin/hide_important_warnings_from_javac.sh index 412c71aa3ba..04336350a74 100644 --- a/common/bin/hide_important_warnings_from_javac.sh +++ b/common/bin/hide_important_warnings_from_javac.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/common/bin/logger.sh b/common/bin/logger.sh index 70c3dab047c..46ab48ae47b 100644 --- a/common/bin/logger.sh +++ b/common/bin/logger.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash # # Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. diff --git a/common/bin/shell-tracer.sh b/common/bin/shell-tracer.sh new file mode 100644 index 00000000000..27a964c977e --- /dev/null +++ b/common/bin/shell-tracer.sh @@ -0,0 +1,47 @@ +#!/bin/bash +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# Usage: sh shell-tracer.sh +# +# This shell script is supposed to be set as a replacement for SHELL in make, +# causing it to be called whenever make wants to execute shell commands. +# The is suitable for passing on to the old shell, +# typically beginning with -c. +# +# This script will make sure the shell command line is executed with +# OLD_SHELL -x, and it will also store a simple log of the the time it takes to +# execute the command in the OUTPUT_FILE, using the "time" utility as pointed +# to by TIME_CMD. If TIME_CMD is "-", no timestamp will be stored. + +TIME_CMD="$1" +OUTPUT_FILE="$2" +OLD_SHELL="$3" +shift +shift +shift +if [ "$TIME_CMD" != "-" ]; then +"$TIME_CMD" -f "[TIME:%E] $*" -a -o "$OUTPUT_FILE" "$OLD_SHELL" -x "$@" +else +"$OLD_SHELL" -x "$@" +fi diff --git a/common/makefiles/HotspotWrapper.gmk b/common/makefiles/HotspotWrapper.gmk index 48f1c3854d9..8a1ae6447e6 100644 --- a/common/makefiles/HotspotWrapper.gmk +++ b/common/makefiles/HotspotWrapper.gmk @@ -36,9 +36,12 @@ include MakeBase.gmk default: all # Get all files except .hg in the hotspot directory. -HOTSPOT_FILES := $(shell $(FIND) $(HOTSPOT_TOPDIR) -name ".hg" -prune -o -print) +HOTSPOT_FILES := $(shell $(FIND) -L $(HOTSPOT_TOPDIR) -name ".hg" -prune -o -print) +# The old build creates hotspot output dir before calling hotspot and +# not doing it breaks builds on msys. $(HOTSPOT_OUTPUTDIR)/_hotspot.timestamp: $(HOTSPOT_FILES) + @$(MKDIR) -p $(HOTSPOT_OUTPUTDIR) @($(CD) $(HOTSPOT_TOPDIR)/make && $(MAKE) -j1 $(HOTSPOT_MAKE_ARGS) SPEC=$(HOTSPOT_SPEC) BASE_SPEC=$(BASE_SPEC)) $(TOUCH) $@ diff --git a/common/makefiles/IdlCompilation.gmk b/common/makefiles/IdlCompilation.gmk index 799c7d6fbf9..11f661a4622 100644 --- a/common/makefiles/IdlCompilation.gmk +++ b/common/makefiles/IdlCompilation.gmk @@ -59,7 +59,7 @@ define add_idl_package $(MKDIR) -p $3/$$($4_TMPDIR) $(RM) -rf $3/$$($4_TMPDIR) $(MKDIR) -p $(dir $5) - $(ECHO) Compiling IDL $(patsubst $2/%,%,$4) + $(ECHO) $(LOG_INFO) Compiling IDL $(patsubst $2/%,%,$4) $8 -td $3/$$($4_TMPDIR) \ -i $2/org/omg/CORBA \ -i $2/org/omg/PortableInterceptor \ @@ -79,15 +79,9 @@ define SetupIdlCompilation # param 1 is for example BUILD_IDLS # param 2,3,4,5,6,7,8 are named args. # IDLJ,SRC,BIN,INCLUDES,EXCLUDES,OLDIMPLBASES,DELETES -$(if $2,$1_$(strip $2)) -$(if $3,$1_$(strip $3)) -$(if $4,$1_$(strip $4)) -$(if $5,$1_$(strip $5)) -$(if $6,$1_$(strip $6)) -$(if $7,$1_$(strip $7)) -$(if $8,$1_$(strip $8)) -$(if $9,$1_$(strip $9)) -$(if $(10),$(error Internal makefile error: Too many arguments to SetupIdlCompilation, please update IdlCompilation.gmk)) +$(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) +$(call LogSetupMacroEntry,SetupIdlCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) +$(if $(16),$(error Internal makefile error: Too many arguments to SetupIdlCompilation, please update IdlCompilation.gmk)) # Remove any relative addressing in the paths. $1_SRC := $$(abspath $$($1_SRC)) diff --git a/common/makefiles/JavaCompilation.gmk b/common/makefiles/JavaCompilation.gmk index 1e8593f9d54..06726629533 100644 --- a/common/makefiles/JavaCompilation.gmk +++ b/common/makefiles/JavaCompilation.gmk @@ -50,27 +50,17 @@ define SetupJavaCompiler # FLAGS:=Flags to be supplied to javac # SERVER_DIR:=Use a javac server (-XDserver) and store the server related files here # SERVER_JVM:=Use this JVM for the server. Defaults to the JVM above. - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$(error Internal makefile error: Too many arguments to SetupJavaCompiler, please update JavaCompilation.gmk)) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupJavaCompiler($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupJavaCompiler, please update JavaCompilation.gmk)) - ifeq ($$(ENABLE_SJAVAC),yes) - # The port file contains the tcp/ip on which the server listens - # and the cookie necessary to talk to the server. - $1_JAVAC_PORTFILE:=$$($1_SERVER_DIR)/server.port - # You can use a different JVM to run the background javac server. - ifeq ($$($1_SERVER_JVM),) - # It defaults to the same JVM that is used to start the javac command. - $1_SERVER_JVM:=$$($1_JVM) - endif - # Set the $1_REMOTE to spawn a background javac server. - $1_REMOTE:=-XDserver:portfile=$$($1_JAVAC_PORTFILE),poolsize=$(SJAVAC_SERVER_CORES),id=$1,javac=$$(subst $$(SPACE),%20,$$(subst $$(COMMA),%2C,$$(strip $$($1_SERVER_JVM) $$($1_JAVAC)))) + # The port file contains the tcp/ip on which the server listens + # and the cookie necessary to talk to the server. + $1_SJAVAC_PORTFILE:=$$($1_SERVER_DIR)/server.port + # You can use a different JVM to run the background javac server. + ifeq ($$($1_SERVER_JVM),) + # It defaults to the same JVM that is used to start the javac command. + $1_SERVER_JVM:=$$($1_JVM) endif endef @@ -92,19 +82,11 @@ define SetupArchive # added to the archive. # EXTRA_MANIFEST_ATTR:=Extra attribute to add to manifest. # CHECK_COMPRESS_JAR Check the COMPRESS_JAR variable - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$1_$(strip $(10))) - $(if $(11),$1_$(strip $(11))) - $(if $(12),$1_$(strip $(12))) - $(if $(13),$1_$(strip $(13))) - $(if $(14),$1_$(strip $(14))) - $(if $(15),$1_$(strip $(15))) + + # NOTE: $2 is dependencies, not a named argument! + $(foreach i,3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupArchive($1),,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(findstring $(LOG),debug trace), $(info *[2] = $(strip $2))) $(if $(16),$(error Internal makefile error: Too many arguments to SetupArchive, please update JavaCompilation.gmk)) $1_JARMAIN:=$(strip $$($1_JARMAIN)) @@ -125,16 +107,28 @@ define SetupArchive ifneq (,$$($1_INCLUDES)) $1_GREP_INCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS),\ $$(addprefix $$(src)/,$$($1_INCLUDES))) - $$(eval $$(call ListPathsSafelyNow,$1_GREP_INCLUDE_PATTERNS,\n, \ + # If there are a lot of include patterns, output to file to shorten command lines + ifeq ($$(word 20,$$($1_GREP_INCLUDE_PATTERNS)),) + $1_GREP_INCLUDES:=| $(GREP) $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_INCLUDE_PATTERNS)) + else + $$(shell $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_include) + $$(eval $$(call ListPathsSafelyNow,$1_GREP_INCLUDE_PATTERNS,\n, \ >> $$($1_BIN)/_the.$$($1_JARNAME)_include)) - $1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include + $1_GREP_INCLUDES:=| $(GREP) -f $$($1_BIN)/_the.$$($1_JARNAME)_include + endif endif ifneq (,$$($1_EXCLUDES)$$($1_EXCLUDE_FILES)) $1_GREP_EXCLUDE_PATTERNS:=$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,\ $$($1_EXCLUDES) $$($1_EXCLUDE_FILES))) - $$(eval $$(call ListPathsSafelyNow,$1_GREP_EXCLUDE_PATTERNS,\n, \ + # If there are a lot of include patterns, output to file to shorten command lines + ifeq ($$(word 20,$$($1_GREP_EXCLUDE_PATTERNS)),) + $1_GREP_EXCLUDES:=| $(GREP) -v $$(patsubst %,$(SPACE)-e$(SPACE)$(DQUOTE)%$(DQUOTE),$$($1_GREP_EXCLUDE_PATTERNS)) + else + $$(shell $(RM) $$($1_BIN)/_the.$$($1_JARNAME)_exclude) + $$(eval $$(call ListPathsSafelyNow,$1_GREP_EXCLUDE_PATTERNS,\n, \ >> $$($1_BIN)/_the.$$($1_JARNAME)_exclude)) - $1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude + $1_GREP_EXCLUDES:=| $(GREP) -v -f $$($1_BIN)/_the.$$($1_JARNAME)_exclude + endif endif # Check if this jar needs to have its index generated. @@ -149,11 +143,13 @@ define SetupArchive ifneq (,$2) $1_DEPS:=$2 else - $1_DEPS:=$$(foreach src,$$($1_SRCS),$$(shell ($(FIND) $$(src) -type f \ - -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \ - $$($1_GREP_EXCLUDES) && $(ECHO) $$(addprefix $$(src)/,$$($1_EXTRA_FILES))))) + # The subst of \ is needed because $ has to be escaped with \ in EXTRA_FILES for the command + # lines, but not here for use in make dependencies. + $1_DEPS:=$$(shell $(FIND) $$($1_SRCS) -type f -a \( $$($1_FIND_PATTERNS) \) \ + $$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES)) \ + $$(subst \,,$$(foreach src,$$($1_SRCS),$$(addprefix $$(src)/,$$($1_EXTRA_FILES)))) ifeq (,$$($1_SKIP_METAINF)) - $1_DEPS+=$$(foreach src,$$($1_SRCS),$$(shell $(FIND) $$(src)/META-INF -type f 2> /dev/null)) + $1_DEPS+=$$(shell $(FIND) $$(addsuffix /META-INF,$$($1_SRCS)) -type f 2> /dev/null)) endif endif @@ -161,34 +157,39 @@ define SetupArchive # The capture contents macro finds all files (matching the patterns, typically # .class and .prp) that are newer than the jar-file, ie the new content to be put into the jar. - $1_CAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),(($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) -a -newer $$@ $$($1_GREP_INCLUDES) $$($1_GREP_EXCLUDES) && $(ECHO) $$($1_EXTRA_FILES)) | $(SED) 's|$$(src)/||g' > $$(src)/_the.$$($1_JARNAME)_contents) && ) + $1_CAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),\ + (($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) -a -newer $$@ $$($1_GREP_INCLUDES) \ + $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' &&\ + $(ECHO) $$(subst $$(src)/,,$$($1_EXTRA_FILES))) > \ + $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) # The capture metainf macro finds all files below the META-INF directory that are newer than the jar-file. ifeq (,$$($1_SKIP_METAINF)) - $1_CAPTURE_METAINF =$$(foreach src,$$($1_SRCS),($(FIND) $$(src)/META-INF -type f -a -newer $$@ 2> /dev/null | $(SED) 's|$$(src)/||g' >> $$(src)/_the.$$($1_JARNAME)_contents ) && ) + $1_CAPTURE_METAINF =$$(foreach src,$$($1_SRCS),($(FIND) $$(src)/META-INF -type f -a -newer $$@ 2> /dev/null | $(SED) 's|$$(src)/||g' >> $$(src)/_the.$$($1_JARNAME)_contents ) $$(NEWLINE)) endif # The capture deletes macro finds all deleted files and concatenates them. The resulting file # tells us what to remove from the jar-file. - $1_CAPTURE_DELETES=$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.deleted -newer $$@ -exec $(SED) 's|$$(src)||g' \{\} >> $$($1_DELETES_FILE) \;) &&) + $1_CAPTURE_DELETES=$$(foreach src,$$($1_SRCS),($(FIND) $$(src) -name _the.package.deleted -newer $$@ -exec $(SED) 's|$$(src)||g' \{\} >> $$($1_DELETES_FILE) \;) $$(NEWLINE)) # The update contents macro updates the jar file with the previously capture contents. $1_UPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\ (cd $$(src) && \ if [ -s _the.$$($1_JARNAME)_contents ]; then \ $(ECHO) " updating" `$(WC) -l _the.$$($1_JARNAME)_contents | $(AWK) '{ print $$$$1 }'` files && \ $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @_the.$$($1_JARNAME)_contents; \ - fi) &&) + fi) $$(NEWLINE)) # The s-variants of the above macros are used when the jar is created from scratch. $1_SCAPTURE_CONTENTS=$$(foreach src,$$($1_SRCS),\ (($(FIND) $$(src) -type f -a \( $$($1_FIND_PATTERNS) \) $$($1_GREP_INCLUDES) \ - $$($1_GREP_EXCLUDES) && $(ECHO) $$($1_EXTRA_FILES)) | $(SED) 's|$$(src)/||g' > \ - $$(src)/_the.$$($1_JARNAME)_contents) && ) + $$($1_GREP_EXCLUDES) | $(SED) 's|$$(src)/||g' &&\ + $$(subst $$(src)/,,$(ECHO) $$($1_EXTRA_FILES))) > \ + $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) ifeq (,$$($1_SKIP_METAINF)) $1_SCAPTURE_METAINF=$$(foreach src,$$($1_SRCS),\ ($(FIND) $$(src)/META-INF -type f 2> /dev/null | $(SED) 's|$$(src)/||g' >> \ - $$(src)/_the.$$($1_JARNAME)_contents) && ) + $$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) endif $1_SUPDATE_CONTENTS=$$(foreach src,$$($1_SRCS),\ - (cd $$(src) && $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @$$(src)/_the.$$($1_JARNAME)_contents) &&) + (cd $$(src) && $(JAR) $$($1_JAR_UPDATE_OPTIONS) $$@ @$$(src)/_the.$$($1_JARNAME)_contents) $$(NEWLINE)) # Use a slightly shorter name for logging, but with enough path to identify this jar. $1_NAME:=$$(subst $$(OUTPUT_ROOT)/,,$$($1_JAR)) @@ -208,38 +209,32 @@ define SetupArchive # Here is the rule that creates/updates the jar file. $$($1_JAR) : $$($1_DEPS) $(MKDIR) -p $$($1_BIN) - if [ -n "$$($1_MANIFEST)" ]; then \ + $$(if $$($1_MANIFEST),\ $(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \ - -e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $$($1_MANIFEST) > $$($1_MANIFEST_FILE); \ - else \ - $(RM) $$($1_MANIFEST_FILE) && $(TOUCH) $$($1_MANIFEST_FILE); \ - fi - if [ -n "$$(strip $$($1_JARMAIN))" ]; then \ - $(ECHO) "Main-Class: $$(strip $$($1_JARMAIN))" >> $$($1_MANIFEST_FILE); \ - fi - if [ -n "$$($1_EXTRA_MANIFEST_ATTR)" ]; then \ - $(PRINTF) "$$($1_EXTRA_MANIFEST_ATTR)\n" >> $$($1_MANIFEST_FILE); \ - fi - +if [ -s $$@ ]; then \ - $(ECHO) Modifying $$($1_NAME) && \ + -e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" $$($1_MANIFEST) > $$($1_MANIFEST_FILE) \ + ,\ + $(RM) $$($1_MANIFEST_FILE) && $(TOUCH) $$($1_MANIFEST_FILE)) + $$(if $$($1_JARMAIN),$(ECHO) "Main-Class: $$(strip $$($1_JARMAIN))" >> $$($1_MANIFEST_FILE)) + $$(if $$($1_EXTRA_MANIFEST_ATTR),$(PRINTF) "$$($1_EXTRA_MANIFEST_ATTR)\n" >> $$($1_MANIFEST_FILE)) + $$(if $$(wildcard $$@),\ + $(ECHO) Modifying $$($1_NAME) $$(NEWLINE)\ $$($1_CAPTURE_CONTENTS) \ $$($1_CAPTURE_METAINF) \ - $(RM) $$($1_DELETES_FILE) && \ + $(RM) $$($1_DELETES_FILE) $$(NEWLINE)\ $$($1_CAPTURE_DELETES) \ - $(CAT) $$($1_DELETES_FILE) > $$($1_DELETESS_FILE) && \ + $(CAT) $$($1_DELETES_FILE) > $$($1_DELETESS_FILE) $$(NEWLINE)\ if [ -s $$($1_DELETESS_FILE) ]; then \ $(ECHO) " deleting" `$(WC) -l $$($1_DELETESS_FILE) | $(AWK) '{ print $$$$1 }'` files && \ $(ZIP) -q -d $$@ `$(CAT) $$($1_DELETESS_FILE)` ; \ - fi && \ - $$($1_UPDATE_CONTENTS) true && \ - $$($1_JARINDEX) && true ; \ - else \ - $(ECHO) Creating $$($1_NAME) && $(JAR) $$($1_JAR_CREATE_OPTIONS) $$@ $$($1_MANIFEST_FILE) && \ + fi $$(NEWLINE) \ + $$($1_UPDATE_CONTENTS) true $$(NEWLINE) \ + $$($1_JARINDEX) && true \ + ,\ + $(ECHO) Creating $$($1_NAME) && $(JAR) $$($1_JAR_CREATE_OPTIONS) $$@ $$($1_MANIFEST_FILE) $$(NEWLINE) \ $$($1_SCAPTURE_CONTENTS) \ $$($1_SCAPTURE_METAINF) \ $$($1_SUPDATE_CONTENTS) \ - $$($1_JARINDEX) && true ; \ - fi; + $$($1_JARINDEX) && true ) endef @@ -247,15 +242,9 @@ define SetupZipArchive # param 1 is for example ZIP_MYSOURCE # param 2,3,4,5,6,7,8,9 are named args. # SRC,ZIP,INCLUDES,EXCLUDES,EXCLUDE_FILES,SUFFIXES,EXTRA_DEPS - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$(error Internal makefile error: Too many arguments to SetupZipArchive, please update JavaCompilation.gmk)) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupZipArchive($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupZipArchive, please update JavaCompilation.gmk)) # Find all files in the source tree. $1_SUFFIX_FILTER := $$(patsubst %,-o -name $(DQUOTE)*%$(DQUOTE),$$($1_SUFFIXES)) @@ -274,7 +263,7 @@ define SetupZipArchive ifneq ($$($1_EXCLUDES),) $1_SRC_EXCLUDES := $$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$(addsuffix /%,$$($1_EXCLUDES)))) $1_ZIP_EXCLUDES := $$(addprefix -x$(SPACE)$(DQUOTE),$$(addsuffix /*$(DQUOTE),$$($1_EXCLUDES))) - $1_ALL_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_SRC)) + $1_ALL_SRCS := $$(filter-out $$($1_SRC_EXCLUDES),$$($1_ALL_SRCS)) endif # Use a slightly shorter name for logging, but with enough path to identify this zip. @@ -288,7 +277,7 @@ define SetupZipArchive $$($1_ZIP) : $$($1_ALL_SRCS) $$($1_EXTRA_DEPS) $(MKDIR) -p $$(@D) $(ECHO) Updating $$($1_NAME) - $$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$@ . $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* $$(addprefix -x$(SPACE),$$(patsubst $$i/%,%,$$($1_EXCLUDE_FILES)))) ;) true + $$(foreach i,$$($1_SRC),(cd $$i && $(ZIP) -qru $$@ . $$($1_ZIP_INCLUDES) $$($1_ZIP_EXCLUDES) -x \*_the.\* $$(addprefix -x$(SPACE),$$(patsubst $$i/%,%,$$($1_EXCLUDE_FILES))))$$(NEWLINE)) true $(TOUCH) $$@ endef @@ -324,7 +313,7 @@ define add_file_to_copy_and_clean $$($1_BIN)$$($2_TARGET) : $2 $(MKDIR) -p $$(@D) $(CAT) $$< | $(SED) -e 's/\([^\\]\):/\1\\:/g' -e 's/\([^\\]\)=/\1\\=/g' -e 's/#.*/#/g' \ - | $(SED) -f "$(SRC_ROOT)/common/bin/unicode2x.sed" \ + | $(SED) -f "$(SRC_ROOT)/common/makefiles/support/unicode2x.sed" \ | $(SED) -e '/^#/d' -e '/^$$$$/d' \ -e :a -e '/\\$$$$/N; s/\\\n//; ta' \ -e 's/^[ \t]*//;s/[ \t]*$$$$//' \ @@ -364,36 +353,27 @@ define SetupJavaCompilation # Its only here until we cleanup some nasty source code pasta in the jdk. # HEADERS:=path to directory where all generated c-headers are written. # DEPENDS:=Extra dependecy - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$1_$(strip $(10))) - $(if $(11),$1_$(strip $(11))) - $(if $(12),$1_$(strip $(12))) - $(if $(13),$1_$(strip $(13))) - $(if $(14),$1_$(strip $(14))) - $(if $(15),$(error Internal makefile error: Too many arguments to SetupJavaCompilation, please update JavaCompilation.gmk)) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupJavaCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupJavaCompilation, please update JavaCompilation.gmk)) # Extract the info from the java compiler setup. - $1_REMOTE := $$($$($1_SETUP)_REMOTE) $1_JVM := $$($$($1_SETUP)_JVM) $1_JAVAC := $$($$($1_SETUP)_JAVAC) $1_FLAGS := $$($$($1_SETUP)_FLAGS) $(JAVAC_FLAGS) $$($1_ADD_JAVAC_FLAGS) ifeq ($$($1_JAVAC),) $$(error The Java compilation $1 refers to a non-existant java compiler setup $$($1_SETUP)) endif + $1_SJAVAC_PORTFILE := $$($$($1_SETUP)_SJAVAC_PORTFILE) + $1_SERVER_JVM := $$($$($1_SETUP)_SERVER_JVM) # Handle addons and overrides. $1_SRC:=$$(call ADD_SRCS,$$($1_SRC)) # Make sure the dirs exist. - $$(shell $(MKDIR) -p $$($1_SRC) $$($1_BIN)) + $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupJavaCompilation $1 contains missing directory $$d))) + $$(eval $$(call MakeDir,$$($1_BIN))) # Find all files in the source trees. - $1_ALL_SRCS := $$(filter-out $(OVR_SRCS),$$(foreach i,$$($1_SRC),$$(shell $(FIND) $$i -type f))) + $1_ALL_SRCS := $$(filter-out $(OVR_SRCS),$$(shell $(FIND) $$($1_SRC) -type f)) # Extract the java files. ifneq ($$($1_EXCLUDE_FILES),) $1_EXCLUDE_FILES_PATTERN:=$$(addprefix %,$$($1_EXCLUDE_FILES)) @@ -428,7 +408,7 @@ define SetupJavaCompilation # Rewrite list of patterns into a find statement. $1_COPY_PATTERN:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_COPY)) # Search for all files to be copied. - $1_ALL_COPIES := $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i \( $$($1_COPY_PATTERN) \) -a -type f)) + $1_ALL_COPIES := $$(filter $$(addprefix %,$$($1_COPY)),$$($1_ALL_SRCS)) # Copy these explicitly $1_ALL_COPIES += $$($1_COPY_FILES) # Copy must also respect filters. @@ -442,7 +422,7 @@ define SetupJavaCompilation $1_ALL_COPIES := $$(filter-out $$($1_EXCLUDE_FILES_PATTERN),$$($1_ALL_COPIES)) endif # All files below META-INF are always copied. - $1_ALL_COPIES += $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i/META-INF -type f 2> /dev/null)) + $1_ALL_COPIES += $$(filter $$(addsuffix /META-INF%,$$($1_SRC)),$$($1_ALL_SRCS)) ifneq (,$$($1_ALL_COPIES)) # Yep, there are files to be copied! $1_ALL_COPY_TARGETS:= @@ -456,7 +436,7 @@ define SetupJavaCompilation # Rewrite list of patterns into a find statement. $1_CLEAN_PATTERN:=$(FALSE_FIND_PATTERN) $$(patsubst %,$(SPACE)-o$(SPACE)-name$(SPACE)$(DQUOTE)*%$(DQUOTE),$$($1_CLEAN)) # Search for all files to be copied. - $1_ALL_CLEANS := $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i \( $$($1_CLEAN_PATTERN) \) -a -type f)) + $1_ALL_CLEANS := $$(filter $$(addprefix %,$$($1_CLEAN)),$$($1_ALL_SRCS)) # Copy and clean must also respect filters. ifneq (,$$($1_INCLUDES)) $1_ALL_CLEANS := $$(filter $$($1_SRC_INCLUDES),$$($1_ALL_CLEANS)) @@ -482,30 +462,64 @@ define SetupJavaCompilation $$(eval $$(call replace_space_with_pathsep,$1_SRCROOTSC,$$($1_SRC))) endif - ifneq (,$$($1_HEADERS)) - $1_HEADERS_ARG := -h $$($1_HEADERS) - endif - # Create a sed expression to remove the source roots and to replace / with . # and remove .java at the end. $1_REWRITE_INTO_CLASSES:=$$(foreach i,$$($1_SRC),-e 's|$$i/||g') -e 's|/|.|g' -e 's|.java$$$$||g' ifeq ($$($1_DISABLE_SJAVAC)x$$(ENABLE_SJAVAC),xyes) + ifneq (,$$($1_HEADERS)) + $1_HEADERS_ARG := -h $$($1_HEADERS) + endif + # Using sjavac to compile. $1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_BIN)/javac_state + # Create SJAVAC variable, + # expects $1_JAVAC to be "bootclasspathprepend -jar ...javac.jar" + # and it is rewritten into "bootclasspathprepend com.sun.tools.sjavac.Main" + $1_SJAVAC:=$$(word 1,$$($1_JAVAC)) -cp $$(word 3,$$($1_JAVAC)) com.sun.tools.sjavac.Main + + # Set the $1_REMOTE to spawn a background javac server. + $1_REMOTE:=--server:portfile=$$($1_SJAVAC_PORTFILE),id=$1,sjavac=$$(subst $$(SPACE),%20,$$(subst $$(COMMA),%2C,$$(strip $$($1_SERVER_JVM) $$($1_SJAVAC)))) + $$($1_BIN)/javac_state: $$($1_SRCS) $$($1_DEPENDS) $(MKDIR) -p $$(@D) $$(call ListPathsSafely,$1_SRCS,\n, >> $$($1_BIN)/_the.batch.tmp) $(ECHO) Compiling $1 - $$($1_JVM) $$(word 1,$$($1_JAVAC)) com.sun.tools.sjavac.Main \ - $$($1_REMOTE) $$($1_SJAVAC_ARGS) --permit-unidentified-artifacts -mfl $$($1_BIN)/_the.batch.tmp \ + ($$($1_JVM) $$($1_SJAVAC) \ + $$($1_REMOTE) \ + -j $(NUM_CORES) \ + --permit-unidentified-artifacts \ + --permit-sources-without-package \ + --compare-found-sources $$($1_BIN)/_the.batch.tmp \ + --log=$(LOG) \ + $$($1_SJAVAC_ARGS) \ $$($1_FLAGS) \ - -implicit:none -d $$($1_BIN) $$($1_HEADERS_ARG) + $$($1_HEADERS_ARG) \ + -d $$($1_BIN) && \ + $(MV) $$($1_BIN)/_the.batch.tmp $$($1_BIN)/_the.batch) else # Using plain javac to batch compile everything. $1 := $$($1_ALL_COPY_TARGETS) $$($1_ALL_COPY_CLEAN_TARGETS) $$($1_BIN)/_the.batch + # When buliding in batch, put headers in a temp dir to filter out those that actually + # changed before copying them to the real header dir. + ifneq (,$$($1_HEADERS)) + $1_HEADERS_ARG := -h $$($1_HEADERS).tmp + + $$($1_HEADERS)/_the.headers: $$($1_BIN)/_the.batch + $(MKDIR) -p $$(@D) + for f in `ls $$($1_HEADERS).tmp`; do \ + if [ ! -f "$$($1_HEADERS)/$$$$f" ] || [ "`$(DIFF) $$($1_HEADERS)/$$$$f $$($1_HEADERS).tmp/$$$$f`" != "" ]; then \ + $(CP) -f $$($1_HEADERS).tmp/$$$$f $$($1_HEADERS)/$$$$f; \ + fi; \ + done + $(RM) -r $$($1_HEADERS).tmp + $(TOUCH) $$@ + + $1 += $$($1_HEADERS)/_the.headers + endif + # When not using sjavac, pass along all sources to javac using an @file. $$($1_BIN)/_the.batch: $$($1_SRCS) $$($1_DEPENDS) $(MKDIR) -p $$(@D) @@ -516,6 +530,7 @@ define SetupJavaCompilation -implicit:none -sourcepath "$$($1_SRCROOTSC)" \ -d $$($1_BIN) $$($1_HEADERS_ARG) @$$($1_BIN)/_the.batch.tmp && \ $(MV) $$($1_BIN)/_the.batch.tmp $$($1_BIN)/_the.batch) + endif # Check if a jar file was specified, then setup the rules for the jar. diff --git a/common/makefiles/Main.gmk b/common/makefiles/Main.gmk new file mode 100644 index 00000000000..b9322aba81a --- /dev/null +++ b/common/makefiles/Main.gmk @@ -0,0 +1,208 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +### This is the main part of the Makefile, for the normal case with SPEC specifying a single existing spec.gmk file. + +# Now load the spec +include $(SPEC) + +# Load the vital tools for all the makefiles. +include $(SRC_ROOT)/common/makefiles/MakeBase.gmk + +# Include the corresponding custom file, if present. +-include $(CUSTOM_MAKE_DIR)/Main.gmk + +### Clean up from previous run + +# Remove any build.log from a previous run, if they exist +ifneq (,$(BUILD_LOG)) + ifneq (,$(BUILD_LOG_PREVIOUS)) + # Rotate old log + $(shell $(RM) $(BUILD_LOG_PREVIOUS) 2> /dev/null) + $(shell $(MV) $(BUILD_LOG) $(BUILD_LOG_PREVIOUS) 2> /dev/null) + else + $(shell $(RM) $(BUILD_LOG) 2> /dev/null) + endif + $(shell $(RM) $(OUTPUT_ROOT)/build-trace-time.log 2> /dev/null) +endif +# Remove any javac server logs and port files. This +# prevents a new make run to reuse the previous servers. +ifneq (,$(SJAVAC_SERVER_DIR)) + $(shell $(MKDIR) -p $(SJAVAC_SERVER_DIR) && $(RM) -rf $(SJAVAC_SERVER_DIR)/*) +endif + +# Reset the build timers. +$(eval $(call ResetAllTimers)) + +# Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line, +# hence this workaround. +ifeq ($(JOBS),) + JOBS=$(NUM_CORES) +endif +MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS) + +### Main targets + +all: jdk + +start-make: + @$(call AtMakeStart) + +langtools: langtools-only +langtools-only: start-make + @$(call TargetEnter) + @($(CD) $(LANGTOOLS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildLangtools.gmk) + @$(call TargetExit) + +corba: langtools corba-only +corba-only: start-make + @$(call TargetEnter) + @($(CD) $(CORBA_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildCorba.gmk) + @$(call TargetExit) + +jaxp: langtools jaxp-only +jaxp-only: start-make + @$(call TargetEnter) + @($(CD) $(JAXP_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJaxp.gmk) + @$(call TargetExit) + +jaxws: langtools jaxp jaxws-only +jaxws-only: start-make + @$(call TargetEnter) + @($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJaxws.gmk) + @$(call TargetExit) + +hotspot: hotspot-only +hotspot-only: start-make + @$(call TargetEnter) + @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f HotspotWrapper.gmk) + @$(call TargetExit) + +jdk: langtools hotspot corba jaxp jaxws jdk-only +jdk-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk $(JDK_TARGET)) + @$(call TargetExit) + +demos: jdk demos-only +demos-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk demos) + @$(call TargetExit) + +images: source-tips demos images-only +images-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk images) + @$(call TargetExit) + +overlay-images: source-tips demos overlay-images-only +overlay-images-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk overlay-images) + @$(call TargetExit) + +bundles: images bundles-only +bundles-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk bundles) + @$(call TargetExit) + +install: images install-only +install-only: start-make + @$(call TargetEnter) + @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f BuildJdk.gmk install) + @$(call TargetExit) + +docs: jdk docs-only +docs-only: start-make + @$(call TargetEnter) + @($(CD) $(SRC_ROOT)/common/makefiles/javadoc && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs) + @$(call TargetExit) + +bootcycle-images: + @$(ECHO) Boot cycle build step 1: Building the JDK image normally + @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(SPEC) images) + @$(ECHO) Boot cycle build step 2: Building a new JDK image using previously built image + @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(dir $(SPEC))bootcycle-spec.gmk images) + +test: start-make + @$(call TargetEnter) + @($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) MAKEFLAGS= -j1 PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true + @$(call TargetExit) + +# Stores the tips for each repository. This file is be used when constructing the jdk image and can be +# used to track the exact sources used to build that image. +source-tips: $(OUTPUT_ROOT)/source_tips +$(OUTPUT_ROOT)/source_tips: FRC + @$(MKDIR) -p $(@D) + @$(RM) $@ + @$(if $(HG),$(call GetSourceTips),$(ECHO) "hg not installed" > $@) + + +# Remove everything, except the output from configure. +clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-overlay-images clean-bootcycle-build + @($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log* build-trace*.log*) + @$(ECHO) Cleaned all build artifacts. + +# Remove everything, including configure configuration. +# If the output directory was created by configure and now becomes empty, remove it as well. +# FIXME: tmp should not be here, fix ResetTimers instead. And remove spec.sh! +dist-clean: clean + @($(CD) $(OUTPUT_ROOT) && $(RM) -r *spec.gmk config.* configure-arguments Makefile compare.sh spec.sh tmp) + @$(if $(filter $(CONF_NAME),$(notdir $(OUTPUT_ROOT))), \ + if test "x`$(LS) $(OUTPUT_ROOT)`" != x; then \ + $(ECHO) "Warning: Not removing non-empty configuration directory for '$(CONF_NAME)'" ;\ + else \ + ($(CD) $(SRC_ROOT) && $(ECHO) "Removing configuration directory for '$(CONF_NAME)'" && $(RM) -r $(OUTPUT_ROOT)) \ + fi \ + ) + @$(ECHO) Cleaned everything, you will have to re-run configure. + +clean-langtools: + $(call CleanComponent,langtools) +clean-corba: + $(call CleanComponent,corba) +clean-jaxp: + $(call CleanComponent,jaxp) +clean-jaxws: + $(call CleanComponent,jaxws) +clean-hotspot: + $(call CleanComponent,hotspot) +clean-jdk: + $(call CleanComponent,jdk) +clean-images: + $(call CleanComponent,images) +clean-overlay-images: + $(call CleanComponent,overlay-images) +clean-bootcycle-build: + $(call CleanComponent,bootcycle-build) + +.PHONY: langtools corba jaxp jaxws hotspot jdk images overlay-images install +.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only +.PHONY: all test clean dist-clean bootcycle-images start-make +.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-overlay-images clean-bootcycle-build + +FRC: # Force target diff --git a/common/makefiles/MakeBase.gmk b/common/makefiles/MakeBase.gmk index e9caaa89f87..5f334462195 100644 --- a/common/makefiles/MakeBase.gmk +++ b/common/makefiles/MakeBase.gmk @@ -33,129 +33,13 @@ ifndef _MAKEBASE_GMK _MAKEBASE_GMK := 1 -ifeq (,$(findstring 3.81,$(MAKE_VERSION))) - ifeq (,$(findstring 3.82,$(MAKE_VERSION))) - $(error This version of GNU Make is too low ($(MAKE_VERSION)). Please upgrade to 3.81 or newer.) - endif -endif - -ifneq (,$(CYGPATH)) - # Cygwin styff, if needed but most is going to be - # done in configure! - ifeq (yes,$(CHECK_FOR_VCINSTALLDIR)) - ifeq (,$(VCINSTALLDIR)) - $(info Could not find compiler paths!) - $(info You probably configured the build from within a) - $(info VS command prompt, but you are not using such a) - $(info prompt right now.) - $(info If you instead run configure from a plain cygwin shell, it) - $(info will attempt to setup VS for you! Please try that.) - $(error Giving up for now.) - endif - endif -endif - -# The build times report is turned off by setting REPORT_BUILD_TIMES to nothing. -# This is necessary for the target clean which will erase the -# directories where the buildtimes are stored. -REPORT_BUILD_TIMES=1 -# Store the build times in this directory. -BUILDTIMESDIR=$(OUTPUT_ROOT)/tmp/buildtimes - -# Record starting time for build of a sub repository. -define RecordStartTime -$(MKDIR) -p $(BUILDTIMESDIR) -$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_start_$1 -$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_start_$1_human_readable -endef - -# Indicate that we started to build a sub repository and record starting time. -define MakeStart -$(call RecordStartTime,$1) -$(BUILD_LOG_WRAPPER) $(PRINTF) "\n\n%s\n%s\n##### %-60.60s #####\n%s\n\n" \ -"########################################################################" \ -"########################################################################" \ -"Entering $1 for target(s) $2" \ -"########################################################################" -endef - -# Record ending time and calculate the difference and store it in a -# easy to read format. Handles builds that cross midnight. Expects -# that a build will never take 24 hours or more. -define RecordEndTime -$(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_end_$1 -$(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_end_$1_human_readable -$(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/build_time_end_$1` $1 | \ - $(NAWK) '{ F=$$7; T=$$14; if (F > T) { T+=3600*24 }; D=T-F; H=int(D/3600); \ - M=int((D-H*3600)/60); S=D-H*3600-M*60; printf("%02d:%02d:%02d %s\n",H,M,S,$$15); }' \ - > $(BUILDTIMESDIR)/build_time_diff_$1 -endef - -# Check if the current target is the final target, as specified by -# the user on the command line. If so, call PrintEndMessage. -define CheckIfFinished -$(if $(filter $@,$(MAKECMDGOALS)),$(call PrintEndMessage)) -# If no taget is given, "all" is default. Check for that, too. -# At most one of the tests can be true. -$(if $(MAKECMDGOALS),,$(if $(filter $@,all),$(call PrintEndMessage))) -endef - -# Indicate that we are done. -# Record ending time and print out the total time it took to build. -define MakeFinish -$(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,$1),) -$(BUILD_LOG_WRAPPER) $(PRINTF) "%s\n##### %-60.60s #####\n%s\n##### %-60.60s #####\n%s\n\n" \ -"########################################################################" \ -"Leaving $1 for target(s) $2" \ -"########################################################################" \ -$(if $(REPORT_BUILD_TIMES),"Build time `$(CAT) $(BUILDTIMESDIR)/build_time_diff_$1` for target(s) $2","") \ -"########################################################################" -$(call CheckIfFinished) -endef - -# Find all build_time_* files and print their contents in a list sorted -# on the name of the sub repository. -define ReportBuildTimes -$(BUILD_LOG_WRAPPER) $(PRINTF) -- "-- Build times ----------\nTarget %s\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \ -"$1" \ -"`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \ -"`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \ -"`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | $(XARGS) $(CAT) | $(SORT) -k 2`" \ -"`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" -endef - -define ResetTimers -$$(shell $(MKDIR) -p $(BUILDTIMESDIR) && $(RM) $(BUILDTIMESDIR)/build_time_*) -endef - -define StartTimer - $(call RecordStartTime,TOTAL) -endef - -define StopTimer - $(if $(REPORT_BUILD_TIMES),$(call RecordEndTime,TOTAL) && $(call ReportBuildTimes,$1),) -endef - -# Hook to be called as the very first thing when running a normal build -define AtRootMakeStart - $(if $(findstring --jobserver,$(MAKEFLAGS)), $(error make -j is not supported, use make JOBS=n)) - $(call PrintStartMessage) - $(call StartTimer) -endef - -# Hook to be called as the very last thing for targets that are "top level" targets -define AtRootMakeEnd - $(call StopTimer) - $(call CheckIfFinished) -endef - # If the variable that you want to send to stdout for piping into a file or otherwise, # is potentially long, for example the a list of file paths, eg a list of all package directories. # Then you need to use ListPathsSafely, which optimistically splits the output into several shell # calls as well as use compression on recurrent file paths segments, to get around the potential # command line length problem that exists in cygwin and other shells. -compress_pre:=$(strip $(shell cat $(SRC_ROOT)/common/makefiles/compress.pre)) -compress_post:=$(strip $(shell cat $(SRC_ROOT)/common/makefiles/compress.post)) +compress_pre:=$(strip $(shell $(CAT) $(SRC_ROOT)/common/makefiles/support/ListPathsSafely-pre-compress.incl)) +compress_post:=$(strip $(shell $(CAT) $(SRC_ROOT)/common/makefiles/support/ListPathsSafely-post-compress.incl)) compress_paths=$(compress_pre)\ $(subst $(SRC_ROOT),X97,\ $(subst $(OUTPUT_ROOT),X98,\ @@ -163,7 +47,7 @@ $(subst X,X00,\ $(subst $(SPACE),\n,$(strip $1)))))\ $(compress_post) -decompress_paths=sed -f $(SRC_ROOT)/common/makefiles/uncompress.sed -e 's|X99|\\n|g' \ +decompress_paths=$(SED) -f $(SRC_ROOT)/common/makefiles/support/ListPathsSafely-uncompress.sed -e 's|X99|\\n|g' \ -e 's|X98|$(OUTPUT_ROOT)|g' -e 's|X97|$(SRC_ROOT)|g' \ -e 's|X00|X|g' | tr '\n' '$2' @@ -181,7 +65,7 @@ endef # The \n argument means translate spaces into \n # if instead , , (a space) is supplied, then spaces remain spaces. define ListPathsSafely - $(if $(word 10001,$($1)),$(error Cannot list safely more than 10000 paths. $1 has $(words $($1)) paths!)) + $(if $(word 16001,$($1)),$(error Cannot list safely more than 16000 paths. $1 has $(words $($1)) paths!)) $(call ListPathsSafely_If,$1,$2,1,250) $(call ListPathsSafely_If,$1,$2,251,500) $(call ListPathsSafely_If,$1,$2,501,750) @@ -232,6 +116,36 @@ define ListPathsSafely $(call ListPathsSafely_If,$1,$2,9501,9750) $(call ListPathsSafely_If,$1,$2,9751,10000) + $(call ListPathsSafely_If,$1,$2,10001,10250) + $(call ListPathsSafely_If,$1,$2,10251,10500) + $(call ListPathsSafely_If,$1,$2,10501,10750) + $(call ListPathsSafely_If,$1,$2,10751,11000) + + $(call ListPathsSafely_If,$1,$2,11001,11250) + $(call ListPathsSafely_If,$1,$2,11251,11500) + $(call ListPathsSafely_If,$1,$2,11501,11750) + $(call ListPathsSafely_If,$1,$2,11751,12000) + + $(call ListPathsSafely_If,$1,$2,12001,12250) + $(call ListPathsSafely_If,$1,$2,12251,12500) + $(call ListPathsSafely_If,$1,$2,12501,12750) + $(call ListPathsSafely_If,$1,$2,12751,13000) + + $(call ListPathsSafely_If,$1,$2,13001,13250) + $(call ListPathsSafely_If,$1,$2,13251,13500) + $(call ListPathsSafely_If,$1,$2,13501,13750) + $(call ListPathsSafely_If,$1,$2,13751,14000) + + $(call ListPathsSafely_If,$1,$2,14001,14250) + $(call ListPathsSafely_If,$1,$2,14251,14500) + $(call ListPathsSafely_If,$1,$2,14501,14750) + $(call ListPathsSafely_If,$1,$2,14751,15000) + + $(call ListPathsSafely_If,$1,$2,15001,15250) + $(call ListPathsSafely_If,$1,$2,15251,15500) + $(call ListPathsSafely_If,$1,$2,15501,15750) + $(call ListPathsSafely_If,$1,$2,15751,16000) + $(call ListPathsSafely_Printf,$1,$2,$3,1) $(call ListPathsSafely_Printf,$1,$2,$3,251) $(call ListPathsSafely_Printf,$1,$2,$3,501) @@ -281,6 +195,36 @@ define ListPathsSafely $(call ListPathsSafely_Printf,$1,$2,$3,9251) $(call ListPathsSafely_Printf,$1,$2,$3,9501) $(call ListPathsSafely_Printf,$1,$2,$3,9751) + + $(call ListPathsSafely_Printf,$1,$2,$3,10001) + $(call ListPathsSafely_Printf,$1,$2,$3,10251) + $(call ListPathsSafely_Printf,$1,$2,$3,10501) + $(call ListPathsSafely_Printf,$1,$2,$3,10751) + + $(call ListPathsSafely_Printf,$1,$2,$3,11001) + $(call ListPathsSafely_Printf,$1,$2,$3,11251) + $(call ListPathsSafely_Printf,$1,$2,$3,11501) + $(call ListPathsSafely_Printf,$1,$2,$3,11751) + + $(call ListPathsSafely_Printf,$1,$2,$3,12001) + $(call ListPathsSafely_Printf,$1,$2,$3,12251) + $(call ListPathsSafely_Printf,$1,$2,$3,12501) + $(call ListPathsSafely_Printf,$1,$2,$3,12751) + + $(call ListPathsSafely_Printf,$1,$2,$3,13001) + $(call ListPathsSafely_Printf,$1,$2,$3,13251) + $(call ListPathsSafely_Printf,$1,$2,$3,13501) + $(call ListPathsSafely_Printf,$1,$2,$3,13751) + + $(call ListPathsSafely_Printf,$1,$2,$3,14001) + $(call ListPathsSafely_Printf,$1,$2,$3,14251) + $(call ListPathsSafely_Printf,$1,$2,$3,14501) + $(call ListPathsSafely_Printf,$1,$2,$3,14751) + + $(call ListPathsSafely_Printf,$1,$2,$3,15001) + $(call ListPathsSafely_Printf,$1,$2,$3,15251) + $(call ListPathsSafely_Printf,$1,$2,$3,15501) + $(call ListPathsSafely_Printf,$1,$2,$3,15751) endef define ListPathsSafelyNow_IfPrintf @@ -384,14 +328,67 @@ $(ECHO) $1/$(HGTIP_FILENAME) endef define SetupLogging - ifneq ($(findstring $(LOG),debug trace),) + ifeq ($$(LOG), trace) # Shell redefinition trick inspired by http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make + # For each target executed, will print + # Building (from ) ( newer) + # but with a limit of 20 on , to avoid cluttering logs too much (and causing a crash on Cygwin). OLD_SHELL:=$$(SHELL) - SHELL = $$(warning Building $$@$$(if $$<, (from $$<))$(if $$?, ($$? newer)))$$(OLD_SHELL) -x + WRAPPER_SHELL:=$$(OLD_SHELL) $$(SRC_ROOT)/common/bin/shell-tracer.sh $$(if $$(TIME),$$(TIME),-) $$(OUTPUT_ROOT)/build-trace-time.log $$(OLD_SHELL) + SHELL=$$(warning $$(if $$@,Building $$@,Running shell command) $$(if $$<, (from $$<))$$(if $$?, ($$(wordlist 1, 20, $$?) $$(if $$(wordlist 21, 22, $$?), ... [in total $$(words $$?) files]) newer)))$$(WRAPPER_SHELL) + endif + # Never remove warning messages; this is just for completeness + LOG_WARN= + ifneq ($$(findstring $$(LOG),info debug trace),) + LOG_INFO= + else + LOG_INFO=> /dev/null + endif + ifneq ($$(findstring $$(LOG),debug trace),) + LOG_DEBUG= + else + LOG_DEBUG=> /dev/null + endif + ifneq ($$(findstring $$(LOG),trace),) + LOG_TRACE= + else + LOG_TRACE=> /dev/null endif endef # Make sure logging is setup for everyone that includes MakeBase.gmk. $(eval $(call SetupLogging)) +# This is to be called by all SetupFoo macros +define LogSetupMacroEntry + $(if $(26),$(error Internal makefile error: Too many arguments to LogSetupMacroEntry, please update MakeBase.gmk)) + $(if $(findstring $(LOG),debug trace), $(info $1 $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25,$(if $($i),$(NEWLINE) $(strip [$i] $($i)))))) +endef + +# Make directory without forking mkdir if not needed +define MakeDir + ifneq ($$(wildcard $1 $2 $3 $4 $5 $6 $7 $8 $9),$$(strip $1 $2 $3 $4 $5 $6 $7 $8 $9)) + $$(shell $(MKDIR) -p $1 $2 $3 $4 $5 $6 $7 $8 $9) + endif +endef + +ifeq ($(OPENJDK_TARGET_OS),solaris) +# On Solaris, if the target is a symlink and exists, cp won't overwrite. +define install-file + $(MKDIR) -p $(@D) + $(RM) '$@' + $(CP) -f -r -P '$<' '$(@D)' +endef +else ifeq ($(OPENJDK_TARGET_OS),macosx) +define install-file + $(MKDIR) -p $(@D) + $(CP) -fpRP '$<' '$@' +endef +else +define install-file + $(MKDIR) -p $(@D) + $(CP) -fP '$<' '$@' +endef +endif + endif # _MAKEBASE_GMK diff --git a/common/makefiles/MakeHelpers.gmk b/common/makefiles/MakeHelpers.gmk index ef84463be97..99103116311 100644 --- a/common/makefiles/MakeHelpers.gmk +++ b/common/makefiles/MakeHelpers.gmk @@ -45,13 +45,130 @@ MAKE_ARGS=$(foreach var,$(subst =command,,$(filter %=command,$(foreach var,$(.VA list_alt_overrides_with_origins=$(filter ALT_%=environment ALT_%=command,$(foreach var,$(.VARIABLES),$(var)=$(firstword $(origin $(var))))) list_alt_overrides=$(subst =command,,$(subst =environment,,$(list_alt_overrides_with_origins))) +# Store the build times in this directory. +BUILDTIMESDIR=$(OUTPUT_ROOT)/tmp/buildtimes + +# Global targets are possible to run either with or without a SPEC. The prototypical +# global target is "help". +global_targets=help configure + ############################## # Functions ############################## -define fatal-error +define CheckEnvironment + # Find all environment or command line variables that begin with ALT. + $(if $(list_alt_overrides), + @$(PRINTF) "\nWARNING: You have the following ALT_ variables set:\n" + @$(PRINTF) "$(foreach var,$(list_alt_overrides),$(var)=$$$(var))\n" + @$(PRINTF) "ALT_ variables are deprecated and will be ignored. Please clean your environment.\n\n" + ) +endef + +### Functions for timers + +# Record starting time for build of a sub repository. +define RecordStartTime + $(MKDIR) -p $(BUILDTIMESDIR) + $(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_start_$1 + $(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_start_$1_human_readable +endef + +# Record ending time and calculate the difference and store it in a +# easy to read format. Handles builds that cross midnight. Expects +# that a build will never take 24 hours or more. +define RecordEndTime + $(DATE) '+%Y %m %d %H %M %S' | $(NAWK) '{ print $$1,$$2,$$3,$$4,$$5,$$6,($$4*3600+$$5*60+$$6) }' > $(BUILDTIMESDIR)/build_time_end_$1 + $(DATE) '+%Y-%m-%d %H:%M:%S' > $(BUILDTIMESDIR)/build_time_end_$1_human_readable + $(ECHO) `$(CAT) $(BUILDTIMESDIR)/build_time_start_$1` `$(CAT) $(BUILDTIMESDIR)/build_time_end_$1` $1 | \ + $(NAWK) '{ F=$$7; T=$$14; if (F > T) { T+=3600*24 }; D=T-F; H=int(D/3600); \ + M=int((D-H*3600)/60); S=D-H*3600-M*60; printf("%02d:%02d:%02d %s\n",H,M,S,$$15); }' \ + > $(BUILDTIMESDIR)/build_time_diff_$1 +endef + +# Find all build_time_* files and print their contents in a list sorted +# on the name of the sub repository. +define ReportBuildTimes + $(BUILD_LOG_WRAPPER) $(PRINTF) -- "----- Build times -------\nStart %s\nEnd %s\n%s\n%s\n-------------------------\n" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_start_TOTAL_human_readable`" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_end_TOTAL_human_readable`" \ + "`$(LS) $(BUILDTIMESDIR)/build_time_diff_* | $(GREP) -v _TOTAL | $(XARGS) $(CAT) | $(SORT) -k 2`" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_TOTAL`" +endef + +define ResetAllTimers + $$(shell $(MKDIR) -p $(BUILDTIMESDIR) && $(RM) $(BUILDTIMESDIR)/build_time_*) +endef + +define StartGlobalTimer + $(call RecordStartTime,TOTAL) +endef + +define StopGlobalTimer + $(call RecordEndTime,TOTAL) +endef + +### Functions for managing makefile structure (start/end of makefile and individual targets) + +# Do not indent this function, this will add whitespace at the start which the caller won't handle +define GetRealTarget +$(strip $(if $(MAKECMDGOALS),$(MAKECMDGOALS),all)) +endef + +# Do not indent this function, this will add whitespace at the start which the caller won't handle +define LastGoal +$(strip $(lastword $(call GetRealTarget))) +endef + +# Check if the current target is the final target, as specified by +# the user on the command line. If so, call AtRootMakeEnd. +define CheckIfMakeAtEnd + # Check if the current target is the last goal + $(if $(filter $@,$(call LastGoal)),$(call AtMakeEnd)) + # If the target is 'foo-only', check if our goal was stated as 'foo' + $(if $(filter $(patsubst %-only,%,$@),$(call LastGoal)),$(call AtMakeEnd)) + # If no goal is given, 'all' is default, but the last target executed for all is 'jdk-only'. Check for that, too. + # At most one of the tests can be true. + $(if $(subst all,,$(call LastGoal)),,$(if $(filter $@,jdk-only),$(call AtMakeEnd))) +endef + +# Hook to be called when starting to execute a top-level target +define TargetEnter + $(BUILD_LOG_WRAPPER) $(PRINTF) "## Starting $(patsubst %-only,%,$@)\n" + $(call RecordStartTime,$(patsubst %-only,%,$@)) +endef + +# Hook to be called when finish executing a top-level target +define TargetExit + $(call RecordEndTime,$(patsubst %-only,%,$@)) + $(BUILD_LOG_WRAPPER) $(PRINTF) "## Finished $(patsubst %-only,%,$@) (build time %s)\n\n" \ + "`$(CAT) $(BUILDTIMESDIR)/build_time_diff_$(patsubst %-only,%,$@) | $(CUT) -f 1 -d " "`" + $(call CheckIfMakeAtEnd) +endef + +# Hook to be called as the very first thing when running a normal build +define AtMakeStart + $(if $(findstring --jobserver,$(MAKEFLAGS)),$(error make -j is not supported, use make JOBS=n)) + $(call CheckEnvironment) + @$(PRINTF) $(LOG_INFO) "Running make as '$(MAKE) $(MFLAGS) $(MAKE_ARGS)'\n" + @$(PRINTF) "Building $(PRODUCT_NAME) for target '$(call GetRealTarget)' in configuration '$(CONF_NAME)'\n\n" + $(call StartGlobalTimer) +endef + +# Hook to be called as the very last thing for targets that are "top level" targets +define AtMakeEnd + $(if $(SJAVAC_SERVER_DIR),@$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) + $(call StopGlobalTimer) + $(call ReportBuildTimes) + @$(PRINTF) "Finished building $(PRODUCT_NAME) for target '$(call GetRealTarget)'\n" + $(call CheckEnvironment) +endef + +### Functions for parsing and setting up make options from command-line + +define FatalError # If the user specificed a "global" target (e.g. 'help'), do not exit but continue running - $$(if $$(findstring help,$$(MAKECMDGOALS)),,$$(error Cannot continue)) + $$(if $$(filter-out $(global_targets),$$(call GetRealTarget)),$$(error Cannot continue)) endef define ParseLogLevel @@ -80,14 +197,14 @@ define ParseLogLevel ifeq ($$(LOG),warn) VERBOSE=-s else ifeq ($$(LOG),info) - VERBOSE= + VERBOSE=-s else ifeq ($$(LOG),debug) VERBOSE= else ifeq ($$(LOG),trace) - VERBOSE=-d -p + VERBOSE= else $$(info Error: LOG must be one of: warn, info, debug or trace.) - $$(eval $$(call fatal-error)) + $$(eval $$(call FatalError)) endif else ifneq ($$(LOG),) @@ -95,108 +212,84 @@ define ParseLogLevel # but complain if this is the top-level make call. ifeq ($$(MAKELEVEL),0) $$(info Cannot use LOG=$$(LOG) and VERBOSE=$$(VERBOSE) at the same time. Choose one.) - $$(eval $$(call fatal-error)) + $$(eval $$(call FatalError)) endif endif endif endef -# TODO: Fix duplication in MakeBase.gmk -define SetupLogging - ifneq ($(findstring $(LOG),debug trace),) - # Shell redefinition trick inspired by http://www.cmcrossroads.com/ask-mr-make/6535-tracing-rule-execution-in-gnu-make - OLD_SHELL:=$$(SHELL) - SHELL = $$(warning Building $$@$$(if $$<, (from $$<))$(if $$?, ($$? newer)))$$(OLD_SHELL) -x - endif -endef - define ParseConfAndSpec - ifneq ($$(origin SPEC),undefined) - # We have been given a SPEC, check that it works out properly - ifeq ($$(wildcard $$(SPEC)),) - $$(info Cannot locate spec.gmk, given by SPEC=$$(SPEC)) - $$(eval $$(call fatal-error)) - endif - ifneq ($$(origin CONF),undefined) - # We also have a CONF argument. This is OK only if this is a repeated call by ourselves, - # but complain if this is the top-level make call. - ifeq ($$(MAKELEVEL),0) - $$(info Cannot use CONF=$$(CONF) and SPEC=$$(SPEC) at the same time. Choose one.) - $$(eval $$(call fatal-error)) + ifneq ($$(filter-out $(global_targets),$$(call GetRealTarget)),) + # If we only have global targets, no need to bother with SPEC or CONF + ifneq ($$(origin SPEC),undefined) + # We have been given a SPEC, check that it works out properly + ifeq ($$(wildcard $$(SPEC)),) + $$(info Cannot locate spec.gmk, given by SPEC=$$(SPEC)) + $$(eval $$(call FatalError)) endif - endif - # ... OK, we're satisfied, we'll use this SPEC later on - else - # Find all spec.gmk files in the build output directory - output_dir=$$(root_dir)/build - all_spec_files=$$(wildcard $$(output_dir)/*/spec.gmk) - ifeq ($$(all_spec_files),) - $$(info No configurations found for $$(root_dir)! Please run configure to create a configuration.) - $$(eval $$(call fatal-error)) - endif - # Extract the configuration names from the path - all_confs=$$(patsubst %/spec.gmk,%,$$(patsubst $$(output_dir)/%,%,$$(all_spec_files))) - - ifneq ($$(origin CONF),undefined) - # User have given a CONF= argument. - ifeq ($$(CONF),) - # If given CONF=, match all configurations - matching_confs=$$(strip $$(all_confs)) - else - # Otherwise select those that contain the given CONF string - matching_confs=$$(strip $$(foreach var,$$(all_confs),$$(if $$(findstring $$(CONF),$$(var)),$$(var)))) - endif - ifeq ($$(matching_confs),) - $$(info No configurations found matching CONF=$$(CONF)) - $$(info Available configurations:) - $$(foreach var,$$(all_confs),$$(info * $$(var))) - $$(eval $$(call fatal-error)) - else - ifeq ($$(words $$(matching_confs)),1) - $$(info Building '$$(matching_confs)' (matching CONF=$$(CONF))) - else - $$(info Building the following configurations (matching CONF=$$(CONF)):) - $$(foreach var,$$(matching_confs),$$(info * $$(var))) + ifneq ($$(origin CONF),undefined) + # We also have a CONF argument. This is OK only if this is a repeated call by ourselves, + # but complain if this is the top-level make call. + ifeq ($$(MAKELEVEL),0) + $$(info Cannot use CONF=$$(CONF) and SPEC=$$(SPEC) at the same time. Choose one.) + $$(eval $$(call FatalError)) endif endif - - # Create a SPEC definition. This will contain the path to one or more spec.gmk files. - SPEC=$$(addsuffix /spec.gmk,$$(addprefix $$(output_dir)/,$$(matching_confs))) + # ... OK, we're satisfied, we'll use this SPEC later on else - # No CONF or SPEC given, check the available configurations - ifneq ($$(words $$(all_spec_files)),1) - $$(info No CONF or SPEC given, but more than one spec.gmk found in $$(output_dir).) - $$(info Available configurations:) - $$(foreach var,$$(all_confs),$$(info * $$(var))) - $$(info Please retry building with CONF= or SPEC=) - $$(eval $$(call fatal-error)) + # Find all spec.gmk files in the build output directory + output_dir=$$(root_dir)/build + all_spec_files=$$(wildcard $$(output_dir)/*/spec.gmk) + ifeq ($$(all_spec_files),) + $$(info No configurations found for $$(root_dir)! Please run configure to create a configuration.) + $$(eval $$(call FatalError)) endif + # Extract the configuration names from the path + all_confs=$$(patsubst %/spec.gmk,%,$$(patsubst $$(output_dir)/%,%,$$(all_spec_files))) - # We found exactly one configuration, use it - SPEC=$$(strip $$(all_spec_files)) + ifneq ($$(origin CONF),undefined) + # User have given a CONF= argument. + ifeq ($$(CONF),) + # If given CONF=, match all configurations + matching_confs=$$(strip $$(all_confs)) + else + # Otherwise select those that contain the given CONF string + matching_confs=$$(strip $$(foreach var,$$(all_confs),$$(if $$(findstring $$(CONF),$$(var)),$$(var)))) + endif + ifeq ($$(matching_confs),) + $$(info No configurations found matching CONF=$$(CONF)) + $$(info Available configurations:) + $$(foreach var,$$(all_confs),$$(info * $$(var))) + $$(eval $$(call FatalError)) + else + ifeq ($$(words $$(matching_confs)),1) + $$(info Building '$$(matching_confs)' (matching CONF=$$(CONF))) + else + $$(info Building target '$(call GetRealTarget)' in the following configurations (matching CONF=$$(CONF)):) + $$(foreach var,$$(matching_confs),$$(info * $$(var))) + endif + endif + + # Create a SPEC definition. This will contain the path to one or more spec.gmk files. + SPEC=$$(addsuffix /spec.gmk,$$(addprefix $$(output_dir)/,$$(matching_confs))) + else + # No CONF or SPEC given, check the available configurations + ifneq ($$(words $$(all_spec_files)),1) + $$(info No CONF given, but more than one configuration found in $$(output_dir).) + $$(info Available configurations:) + $$(foreach var,$$(all_confs),$$(info * $$(var))) + $$(info Please retry building with CONF= (or SPEC=)) + $$(eval $$(call FatalError)) + endif + + # We found exactly one configuration, use it + SPEC=$$(strip $$(all_spec_files)) + endif endif endif endef -define CheckEnvironment - # Find all environment or command line variables that begin with ALT. - $(if $(list_alt_overrides), - @$(PRINTF) "\nWARNING: You have the following ALT_ variables set:\n" - @$(PRINTF) "$(foreach var,$(list_alt_overrides),$(var)=$$$(var))\n" - @$(PRINTF) "ALT_ variables are deprecated and will be ignored. Please clean your environment.\n\n" - ) -endef - -define PrintStartMessage - $(if $(VERBOSE),,@$(ECHO) Running make as $(MAKE) $(MFLAGS) $(MAKE_ARGS)) - $(call CheckEnvironment) - @$(ECHO) "Building OpenJDK for target $(if $(MAKECMDGOALS),'$(MAKECMDGOALS)','all') in configuration '$(CONF_NAME)'" -endef - -define PrintEndMessage - @$(ECHO) "Finished building OpenJDK for target '$@'" - $(call CheckEnvironment) -endef +### Convenience functions from Main.gmk # Cleans the component given as $1 define CleanComponent diff --git a/common/makefiles/Makefile b/common/makefiles/Makefile index 9672bb4848f..cd5a9bfae34 100644 --- a/common/makefiles/Makefile +++ b/common/makefiles/Makefile @@ -24,13 +24,24 @@ # # This must be the first rule -default: all +all: # Inclusion of this pseudo-target will cause make to execute this file # serially, regardless of -j. Recursively called makefiles will not be # affected, however. This is required for correct dependency management. .NOTPARALLEL: +# The shell code below will be executed on /usr/ccs/bin/make on Solaris, but not in GNU make. +# /usr/ccs/bin/make lacks basically every other flow control mechanism. +TEST_FOR_NON_GNUMAKE:sh=echo You are not using GNU make/gmake, this is a requirement. Check your path. 1>&2 && exit 1 + +# Assume we have GNU make, but check version. +ifeq (,$(findstring 3.81,$(MAKE_VERSION))) + ifeq (,$(findstring 3.82,$(MAKE_VERSION))) + $(error This version of GNU Make is too low ($(MAKE_VERSION)). Check your path, or upgrade to 3.81 or newer.) + endif +endif + # Locate this Makefile ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) @@ -43,202 +54,32 @@ root_dir:=$(patsubst %/common/makefiles/Makefile,%,$(makefile_path)) include $(dir $(makefile_path))/MakeHelpers.gmk $(eval $(call ParseLogLevel)) -$(eval $(call SetupLogging)) $(eval $(call ParseConfAndSpec)) -ifneq ($(words $(SPEC)),1) -### We have multiple configurations to build, call make repeatedly -all clean dist-clean: -langtools corba jaxp jaxws hotspot jdk images overlay-images install: -langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only: -clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images: +# Now determine if we have zero, one or several configurations to build. +ifeq ($(SPEC),) + # Since we got past ParseConfAndSpec, we must be building a global target. Do nothing. +else + ifeq ($(words $(SPEC)),1) + # We are building a single configuration. This is the normal case. Execute the Main.gmk file. + include $(dir $(makefile_path))/Main.gmk + else + # We are building multiple configurations. + # First, find out the valid targets + # Run the makefile with an arbitraty SPEC using -p -q (quiet dry-run and dump rules) to find + # available PHONY targets. Use this list as valid targets to pass on to the repeated calls. + all_phony_targets=$(filter-out $(global_targets), $(strip $(shell \ + $(MAKE) -p -q -f $(makefile_path) SPEC=$(firstword $(SPEC)) | \ + grep ^.PHONY: | head -n 1 | cut -d " " -f 2-))) + +$(all_phony_targets): @$(foreach spec,$(SPEC),($(MAKE) -f $(makefile_path) SPEC=$(spec) $(VERBOSE) VERBOSE=$(VERBOSE) $@) &&) true -.PHONY: all clean dist-clean -.PHONY: langtools corba jaxp jaxws hotspot jdk images overlay-images install -.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only overlay-images-only install-only -.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images - -else -### This is the main part of the Makefile, for the normal case with SPEC specifying a single existing spec.gmk file. - -# Now load the spec -include $(SPEC) - -# Load the vital tools for all the makefiles. -include $(SRC_ROOT)/common/makefiles/MakeBase.gmk - -### Clean up from previous run - -# Remove any build.log from a previous run, if they exist -ifneq (,$(BUILD_LOG)) - ifneq (,$(BUILD_LOG_PREVIOUS)) - # Rotate old log - $(shell $(RM) $(BUILD_LOG_PREVIOUS) 2> /dev/null) - $(shell $(MV) $(BUILD_LOG) $(BUILD_LOG_PREVIOUS) 2> /dev/null) - else - $(shell $(RM) $(BUILD_LOG) 2> /dev/null) endif endif -# Remove any javac server logs and port files. This -# prevents a new make run to reuse the previous servers. -ifneq (,$(SJAVAC_SERVER_DIR)) - $(shell $(MKDIR) -p $(SJAVAC_SERVER_DIR) && $(RM) -rf $(SJAVAC_SERVER_DIR)/*) -endif -# Clean out any notifications from the previous build. -$(shell $(FIND) $(OUTPUT_ROOT) -name "_the.*.notify" $(FIND_DELETE)) - -# Reset the build timers. -$(eval $(call ResetTimers)) - -# Setup number of jobs to use. -jN is unfortunately not available for us to parse from the command line, -# hence this workaround. -ifeq ($(JOBS),) - JOBS=$(NUM_CORES) -endif -MAKE_ARGS:=$(MAKE_ARGS) -j$(JOBS) - -### Main targets - -all: jdk - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) -.PHONY: all - -langtools: start-make langtools-only -langtools-only: - @$(call MakeStart,langtools,all) - @($(CD) $(LANGTOOLS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,langtools,all) - -corba: langtools corba-only -corba-only: - @$(call MakeStart,corba,all) - @($(CD) $(CORBA_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,corba,all) - -jaxp: langtools jaxp-only -jaxp-only: - @$(call MakeStart,jaxp,all) - @($(CD) $(JAXP_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,jaxp,all) - -jaxws: langtools jaxp jaxws-only -jaxws-only: - @$(call MakeStart,jaxws,all) - @($(CD) $(JAXWS_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS)) - @$(call MakeFinish,jaxws,all) - -hotspot: langtools hotspot-only -hotspot-only: - @$(call MakeStart,hotspot,all) - @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f HotspotWrapper.gmk) - @$(call MakeFinish,hotspot,all) - -jdk: langtools corba jaxp jaxws hotspot jdk-only -jdk-only: - @$(call MakeStart,jdk,all) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) $(JDK_TARGET)) - @$(call MakeFinish,jdk,all) - -images: source-tips start-make jdk langtools corba jaxp jaxws hotspot images-only -images-only: - @$(call MakeStart,jdk-images,$@) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) images) - @$(call MakeFinish,jdk-images,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - -overlay-images: source-tips start-make jdk langtools corba jaxp jaxws hotspot overlay-images-only -overlay-images-only: - @$(call MakeStart,jdk-overlay-images,$@) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) overlay-images) - @$(call MakeFinish,jdk-overlay-images,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - -install: source-tips start-make jdk langtools corba jaxp jaxws hotspot install-only -install-only: - @$(call MakeStart,jdk-images,$@) - @($(CD) $(JDK_TOPDIR)/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) install) - @$(call MakeFinish,jdk-images,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - -docs: start-make jdk docs-only -docs-only: - @$(call MakeStart,docs,$@) - @($(CD) $(SRC_ROOT)/common/makefiles/javadoc && $(BUILD_LOG_WRAPPER) $(MAKE) $(MAKE_ARGS) -f Javadoc.gmk docs) - @$(call MakeFinish,docs,$@) - @$(if $(SJAVAC_SERVER_DIR),$(RM) -rf $(SJAVAC_SERVER_DIR)/*.port) - @$(call AtRootMakeEnd) - - -.PHONY: langtools corba jaxp jaxws hotspot jdk images install -.PHONY: langtools-only corba-only jaxp-only jaxws-only hotspot-only jdk-only images-only install-only - -start-make: - @$(call AtRootMakeStart) -.PHONY: start-make - -bootcycle-images: - @$(ECHO) Boot cycle build step 1: Building the JDK image normally - @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(SPEC) images) - @$(ECHO) Boot cycle build step 2: Building a new JDK image using previously built image - @($(CD) $(SRC_ROOT)/common/makefiles && $(BUILD_LOG_WRAPPER) $(MAKE) SPEC=$(dir $(SPEC))bootcycle-spec.gmk images) - -test: start-make - @$(call MakeStart,test,$(if $(TEST),$(TEST),all)) - @($(CD) $(SRC_ROOT)/test && $(BUILD_LOG_WRAPPER) $(MAKE) MAKEFLAGS= -j1 PRODUCT_HOME=$(OUTPUT_ROOT)/jdk JPRT_JAVA_HOME=$(OUTPUT_ROOT)/jdk ALT_OUTPUTDIR=$(OUTPUT_ROOT) $(TEST)) || true - @$(call MakeFinish,test,$(if $(TEST),$(TEST),all)) - @$(call AtRootMakeEnd) -.PHONY: test - - -# Stores the tips for each repository. This file is be used when constructing the jdk image and can be -# used to track the exact sources used to build that image. -source-tips: $(OUTPUT_ROOT)/source_tips -$(OUTPUT_ROOT)/source_tips: FRC - @$(MKDIR) -p $(@D) - @$(RM) $@ - @$(call GetSourceTips) - - -# Remove everything, except the output from configure. -clean: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images clean-bootcycle-build - @($(CD) $(OUTPUT_ROOT) && $(RM) -r tmp source_tips build.log*) - @$(ECHO) Cleaned everything except the build configuration. -.PHONY: clean - -# Remove everything, you have to rerun configure. -dist-clean: - @$(RM) -r $(OUTPUT_ROOT) - @$(ECHO) Cleaned everything, you will have to re-run configure. -.PHONY: dist-clean - -clean-langtools: - $(call CleanComponent,langtools) -clean-corba: - $(call CleanComponent,corba) -clean-jaxp: - $(call CleanComponent,jaxp) -clean-jaxws: - $(call CleanComponent,jaxws) -clean-hotspot: - $(call CleanComponent,hotspot) -clean-jdk: - $(call CleanComponent,jdk) -clean-images: - $(call CleanComponent,images) -clean-bootcycle-build: - $(call CleanComponent,bootcycle-build) - -.PHONY: clean-langtools clean-corba clean-jaxp clean-jaxws clean-hotspot clean-jdk clean-images - -endif # Here are "global" targets, i.e. targets that can be executed without specifying a single configuration. -# If you addd more global targets, please update the fatal-error macro. +# If you addd more global targets, please update the variable global_targets in MakeHelpers. help: $(info ) @@ -258,7 +99,7 @@ help: $(info . make test # Run tests, default is all tests (see TEST below)) $(info ) $(info Targets for specific components) - $(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk or images)) + $(info (Component is any of langtools, corba, jaxp, jaxws, hotspot, jdk, images or overlay-images)) $(info . make # Build and everything it depends on. ) $(info . make -only # Build only, without dependencies. This) $(info . # is faster but can result in incorrect build results!) @@ -272,7 +113,7 @@ help: $(info . make LOG= # Change the log level from warn to ) $(info . # Available log levels are:) $(info . # 'warn' (default), 'info', 'debug' and 'trace') - $(info . # To see executed command lines, use LOG=info) + $(info . # To see executed command lines, use LOG=debug) $(info ) $(info . make JOBS= # Run parallel make jobs) $(info . # Note that -jN does not work as expected!) @@ -280,5 +121,11 @@ help: $(info . make test TEST= # Only run the given test or tests, e.g.) $(info . # make test TEST="jdk_lang jdk_net") $(info ) -.PHONY: help -FRC: # Force target + +configure: + @$(SHELL) $(root_dir)/configure $(CONFIGURE_ARGS) + @echo ==================================================== + @echo "Note: This is a non-recommended way of running configure." + @echo "Instead, run 'sh configure' in the top-level directory" + +.PHONY: help configure diff --git a/common/makefiles/NativeCompilation.gmk b/common/makefiles/NativeCompilation.gmk index d93af0beb32..441dfafa502 100644 --- a/common/makefiles/NativeCompilation.gmk +++ b/common/makefiles/NativeCompilation.gmk @@ -32,10 +32,10 @@ ifeq (,$(_MAKEBASE_GMK)) endif ifeq ($(COMPILER_TYPE),CC) - COMPILING_MSG=echo Compiling $1 - LINKING_MSG=echo Linking $1 - LINKING_EXE_MSG=echo Linking executable $1 - ARCHIVING_MSG=echo Archiving $1 + COMPILING_MSG=echo $(LOG_INFO) "Compiling $(notdir $1) (for $(notdir $2))" + LINKING_MSG=echo $(LOG_INFO) "Linking $1" + LINKING_EXE_MSG=echo $(LOG_INFO) "Linking executable $1" + ARCHIVING_MSG=echo $(LOG_INFO) "Archiving $1" else COMPILING_MSG= LINKING_MSG= @@ -94,7 +94,7 @@ define add_native_source $$($1_$2_OBJ) : $2 ifeq ($(COMPILER_TYPE),CC) - $$(call COMPILING_MSG,$$(notdir $2)) + $$(call COMPILING_MSG,$2,$$($1_TARGET)) $$($1_$2_COMP) $$($1_$2_FLAGS) $$($1_$2_DEP_FLAG) $$($1_$2_DEP) $(CC_OUT_OPTION)$$($1_$2_OBJ) $2 endif ifeq ($(COMPILER_TYPE),CL) @@ -129,30 +129,8 @@ define SetupNativeCompilation # CC the compiler to use, default is $(CC) # LDEXE the linker to use for linking executables, default is $(LDEXE) # OPTIMIZATION sets optimization level to NONE, LOW, HIGH, HIGHEST - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$1_$(strip $(10))) - $(if $(11),$1_$(strip $(11))) - $(if $(12),$1_$(strip $(12))) - $(if $(13),$1_$(strip $(13))) - $(if $(14),$1_$(strip $(14))) - $(if $(15),$1_$(strip $(15))) - $(if $(16),$1_$(strip $(16))) - $(if $(17),$1_$(strip $(17))) - $(if $(18),$1_$(strip $(18))) - $(if $(19),$1_$(strip $(19))) - $(if $(20),$1_$(strip $(20))) - $(if $(21),$1_$(strip $(21))) - $(if $(22),$1_$(strip $(22))) - $(if $(23),$1_$(strip $(23))) - $(if $(24),$1_$(strip $(24))) - $(if $(25),$1_$(strip $(25))) + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupNativeCompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15),$(16),$(17),$(18),$(19),$(20),$(21),$(22),$(23),$(24),$(25)) $(if $(26),$(error Internal makefile error: Too many arguments to SetupNativeCompilation, please update NativeCompilation.gmk)) ifneq (,$$($1_BIN)) @@ -236,9 +214,9 @@ define SetupNativeCompilation $$(error You have to specify LANG for native compilation $1) endif ifeq (C,$$($1_LANG)) - ifeq ($$($1_LDEXE),) + ifeq ($$($1_LDEXE),) $1_LDEXE:=$(LDEXE) - endif + endif $1_LD:=$(LD) else ifeq (C++,$$($1_LANG)) @@ -254,9 +232,11 @@ define SetupNativeCompilation endif # Make sure the dirs exist. - $$(shell $(MKDIR) -p $$($1_SRC) $$($1_OBJECT_DIR) $$($1_OUTPUT_DIR)) + $$(eval $$(call MakeDir,$$($1_OBJECT_DIR) $$($1_OUTPUT_DIR))) + $$(foreach d,$$($1_SRC), $$(if $$(wildcard $$d),,$$(error SRC specified to SetupNativeCompilation $1 contains missing directory $$d))) + # Find all files in the source trees. Sort to remove duplicates. - $1_ALL_SRCS := $$(sort $$(foreach i,$$($1_SRC), $$(shell $(FIND) $$i -type f))) + $1_ALL_SRCS := $$(sort $$(shell $(FIND) $$($1_SRC) -type f)) # Extract the C/C++ files. $1_EXCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_EXCLUDE_FILES))) $1_INCLUDE_FILES:=$$(foreach i,$$($1_SRC),$$(addprefix $$i/,$$($1_INCLUDE_FILES))) @@ -291,7 +271,9 @@ define SetupNativeCompilation # Are there too many object files on disk? Perhaps because some source file was removed? $1_SUPERFLOUS_OBJS:=$$(sort $$(filter-out $$($1_EXPECTED_OBJS),$$($1_BINS))) # Clean out the superfluous object files. - $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS)) + ifneq ($$($1_SUPERFLUOUS_OBJS),) + $$(shell $(RM) -f $$($1_SUPERFLUOUS_OBJS)) + endif # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables for CFLAGS. $1_EXTRA_CFLAGS:=$$($1_CFLAGS_$(OPENJDK_TARGET_OS_API)) $$($1_CFLAGS_$(OPENJDK_TARGET_OS)) @@ -358,11 +340,6 @@ define SetupNativeCompilation $$(error Unknown value for OPTIMIZATION: $$($1_OPTIMIZATION)) endif - # Now create a list of the packages that are about to compile. Used when sending source - # in a batch to the compiler. - $$(shell $(RM) $$($1_OBJECT_DIR)/_the.list_of_sources) - $$(eval $$(call ListPathsSafelyNow,$1_SRCS,\n, >> $$($1_OBJECT_DIR)/_the.list_of_sources)) - # Now call add_native_source for each source file we are going to compile. $$(foreach p,$$($1_SRCS),\ $$(eval $$(call add_native_source,$1,$$p,$$($1_OBJECT_DIR),\ @@ -385,8 +362,6 @@ define SetupNativeCompilation endif # mapfile doesnt seem to be implemented on macosx (yet??) - ifneq ($(OPENJDK_TARGET_CPU),ppc) - ifneq ($(OPENJDK_TARGET_CPU),arm) ifneq ($(OPENJDK_TARGET_OS),macosx) ifneq ($(OPENJDK_TARGET_OS),windows) $1_REAL_MAPFILE:=$$($1_MAPFILE) @@ -401,8 +376,6 @@ define SetupNativeCompilation endif endif endif - endif - endif # Pickup extra OPENJDK_TARGET_OS_API and/or OPENJDK_TARGET_OS dependent variables # for LDFLAGS and LDFLAGS_SUFFIX @@ -445,9 +418,9 @@ define SetupNativeCompilation $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET) \ $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK) $(RM) $$@ - $(FIX_EMPTY_SEC_HDR_FLAGS) $$< + $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$< $(OBJCOPY) --only-keep-debug $$< $$@ - $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $$(@F) $$< + $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$< else # not solaris $$($1_OBJECT_DIR)/$$(LIBRARY_PREFIX)$$($1_LIBRARY).debuginfo : $$($1_TARGET) $(RM) $$@ @@ -523,9 +496,9 @@ define SetupNativeCompilation $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET) \ $(FIX_EMPTY_SEC_HDR_FLAGS) $(ADD_GNU_DEBUGLINK) $(RM) $$@ - $(FIX_EMPTY_SEC_HDR_FLAGS) $$< + $(FIX_EMPTY_SEC_HDR_FLAGS) $(LOG_INFO) $$< $(OBJCOPY) --only-keep-debug $$< $$@ - $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $$(@F) $$< + $(CD) $$(@D) && $(ADD_GNU_DEBUGLINK) $(LOG_INFO) $$(@F) $$< else # not solaris $$($1_OBJECT_DIR)/$$($1_PROGRAM).debuginfo : $$($1_TARGET) $(RM) $$@ @@ -564,7 +537,7 @@ define SetupNativeCompilation $$($1_EXPECTED_OBJS) $$($1_RES) $$($1_LDFLAGS_SUFFIX) \ $$($1_EXTRA_LDFLAGS_SUFFIX) ifneq (,$$($1_GEN_MANIFEST)) - $(MT) -nologo /manifest $$($1_GEN_MANIFEST) /outputresource:$$@;#1 + $(MT) -nologo -manifest $$($1_GEN_MANIFEST) -outputresource:$$@;#1 endif endif diff --git a/common/makefiles/RMICompilation.gmk b/common/makefiles/RMICompilation.gmk index 65ba9e621f9..fd332b4dbb5 100644 --- a/common/makefiles/RMICompilation.gmk +++ b/common/makefiles/RMICompilation.gmk @@ -34,16 +34,9 @@ define SetupRMICompilation # RUN_IIOP:=Set to run rmic with -iiop # RUN_IIOP_STDPKG:=Set to run rmic with -iiop -standardPackage # KEEP_GENERATED:=Set to keep generated sources around - $(if $2,$1_$(strip $2)) - $(if $3,$1_$(strip $3)) - $(if $4,$1_$(strip $4)) - $(if $5,$1_$(strip $5)) - $(if $6,$1_$(strip $6)) - $(if $7,$1_$(strip $7)) - $(if $8,$1_$(strip $8)) - $(if $9,$1_$(strip $9)) - $(if $(10),$(error Internal makefile error: Too many arguments to SetupRMICompilation, please update RMICompilation.gmk)) - + $(foreach i,2 3 4 5 6 7 8 9 10 11 12 13 14 15, $(if $($i),$1_$(strip $($i)))$(NEWLINE)) + $(call LogSetupMacroEntry,SetupRMICompilation($1),$2,$3,$4,$5,$6,$7,$8,$9,$(10),$(11),$(12),$(13),$(14),$(15)) + $(if $(16),$(error Internal makefile error: Too many arguments to SetupRMICompilation, please update RMICompilation.gmk)) $1_DEP_FILE := $$($1_STUB_CLASSES_DIR)/$1_rmic @@ -86,12 +79,12 @@ define SetupRMICompilation $$($1_DEP_FILE): $$($1_CLASS_FILES) $(MKDIR) -p $$($1_STUB_CLASSES_DIR) if [ "x$$($1_ARGS)" != "x" ]; then \ - $(ECHO) Running rmic $$($1_ARGS) for $$($1_DOLLAR_SAFE_CLASSES) &&\ + $(ECHO) $(LOG_INFO) Running rmic $$($1_ARGS) for $$($1_DOLLAR_SAFE_CLASSES) &&\ $(RMIC) $$($1_ARGS) -classpath "$$($1_CLASSES_DIR)" \ -d $$($1_STUB_CLASSES_DIR) $$($1_DOLLAR_SAFE_CLASSES);\ fi; if [ "x$$($1_ARGS2)" != "x" ]; then \ - $(ECHO) Running rmic $$($1_ARGS2) for $$($1_DOLLAR_SAFE_CLASSES) &&\ + $(ECHO) $(LOG_INFO) Running rmic $$($1_ARGS2) for $$($1_DOLLAR_SAFE_CLASSES) &&\ $(RMIC) $$($1_ARGS2) -classpath "$$($1_CLASSES_DIR)" \ -d $$($1_STUB_CLASSES_DIR) $$($1_DOLLAR_SAFE_CLASSES);\ fi; diff --git a/common/makefiles/compress.post b/common/makefiles/support/ListPathsSafely-post-compress.incl similarity index 87% rename from common/makefiles/compress.post rename to common/makefiles/support/ListPathsSafely-post-compress.incl index 06b44c43461..d8ccf22445c 100644 --- a/common/makefiles/compress.post +++ b/common/makefiles/support/ListPathsSafely-post-compress.incl @@ -1 +1 @@ -)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) \ No newline at end of file +)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))) diff --git a/common/makefiles/compress.pre b/common/makefiles/support/ListPathsSafely-pre-compress.incl similarity index 98% rename from common/makefiles/compress.pre rename to common/makefiles/support/ListPathsSafely-pre-compress.incl index ff41134e1e2..7230c6cc737 100644 --- a/common/makefiles/compress.pre +++ b/common/makefiles/support/ListPathsSafely-pre-compress.incl @@ -1 +1 @@ -$(subst com,X01,$(subst org,X02,$(subst sun,X03,$(subst java,X04,$(subst javax,X05,$(subst sun/io,X06,$(subst com/sun,X07,$(subst java/io,X08,$(subst org/omg,X09,$(subst org/w3c,X10,$(subst org/xml,X11,$(subst sun/awt,X12,$(subst sun/net,X13,$(subst sun/nio,X14,$(subst sun/rmi,X15,$(subst java/awt,X16,$(subst java/net,X17,$(subst java/nio,X18,$(subst java/rmi,X19,$(subst META-INF,X20,$(subst sun/font,X21,$(subst sun/misc,X22,$(subst sun/text,X23,$(subst sun/util,X24,$(subst java/lang,X25,$(subst java/math,X26,$(subst java/text,X27,$(subst java/util,X28,$(subst javax/jws,X29,$(subst javax/net,X30,$(subst javax/rmi,X31,$(subst javax/xml,X32,$(subst sun/corba,X33,$(subst sun/print,X34,$(subst sun/swing,X35,$(subst java/beans,X36,$(subst javax/lang,X37,$(subst sun/applet,X38,$(subst sun/java2d,X39,$(subst java/applet,X40,$(subst javax/print,X41,$(subst javax/sound,X42,$(subst javax/swing,X43,$(subst javax/tools,X44,$(subst jdk/classes,X45,$(subst org/relaxng,X46,$(subst sun/reflect,X47,$(subst javax/crypto,X48,$(subst javax/naming,X49,$(subst jaxp/classes,X50,$(subst sun/security,X51,$(subst corba/classes,X52,$(subst java/security,X53,$(subst javax/imageio,X54,$(subst jdk/btclasses,X55,$(subst javax/activity,X56,$(subst javax/security,X57,$(subst jdk/newclasses,X58,$(subst sun/instrument,X59,$(subst sun/management,X60,$(subst corba/btclasses,X61,$(subst jdk/democlasses,X62,$(subst javax/activation,X63,$(subst javax/annotation,X64,$(subst javax/management,X65,$(subst javax/transaction,X66,$(subst jaxws/jaf_classes,X67,$(subst langtools/classes,X68,$(subst META-INF/services,X69,$(subst jdk/newdemoclasses,X70,$(subst javax/accessibility,X71,$(subst jaxws/jaxws_classes,X72, \ No newline at end of file +$(subst com,X01,$(subst org,X02,$(subst sun,X03,$(subst java,X04,$(subst javax,X05,$(subst sun/io,X06,$(subst com/sun,X07,$(subst java/io,X08,$(subst org/omg,X09,$(subst org/w3c,X10,$(subst org/xml,X11,$(subst sun/awt,X12,$(subst sun/net,X13,$(subst sun/nio,X14,$(subst sun/rmi,X15,$(subst java/awt,X16,$(subst java/net,X17,$(subst java/nio,X18,$(subst java/rmi,X19,$(subst META-INF,X20,$(subst sun/font,X21,$(subst sun/misc,X22,$(subst sun/text,X23,$(subst sun/util,X24,$(subst java/lang,X25,$(subst java/math,X26,$(subst java/text,X27,$(subst java/util,X28,$(subst javax/jws,X29,$(subst javax/net,X30,$(subst javax/rmi,X31,$(subst javax/xml,X32,$(subst sun/corba,X33,$(subst sun/print,X34,$(subst sun/swing,X35,$(subst java/beans,X36,$(subst javax/lang,X37,$(subst sun/applet,X38,$(subst sun/java2d,X39,$(subst java/applet,X40,$(subst javax/print,X41,$(subst javax/sound,X42,$(subst javax/swing,X43,$(subst javax/tools,X44,$(subst jdk/classes,X45,$(subst org/relaxng,X46,$(subst sun/reflect,X47,$(subst javax/crypto,X48,$(subst javax/naming,X49,$(subst jaxp/classes,X50,$(subst sun/security,X51,$(subst corba/classes,X52,$(subst java/security,X53,$(subst javax/imageio,X54,$(subst jdk/btclasses,X55,$(subst javax/activity,X56,$(subst javax/security,X57,$(subst jdk/newclasses,X58,$(subst sun/instrument,X59,$(subst sun/management,X60,$(subst corba/btclasses,X61,$(subst jdk/democlasses,X62,$(subst javax/activation,X63,$(subst javax/annotation,X64,$(subst javax/management,X65,$(subst javax/transaction,X66,$(subst jaxws/jaf_classes,X67,$(subst langtools/classes,X68,$(subst META-INF/services,X69,$(subst jdk/newdemoclasses,X70,$(subst javax/accessibility,X71,$(subst jaxws/jaxws_classes,X72, diff --git a/common/makefiles/uncompress.sed b/common/makefiles/support/ListPathsSafely-uncompress.sed similarity index 100% rename from common/makefiles/uncompress.sed rename to common/makefiles/support/ListPathsSafely-uncompress.sed diff --git a/common/bin/unicode2x.sed b/common/makefiles/support/unicode2x.sed similarity index 100% rename from common/bin/unicode2x.sed rename to common/makefiles/support/unicode2x.sed diff --git a/common/src/uncygdrive.c b/common/src/fixpath.c similarity index 66% rename from common/src/uncygdrive.c rename to common/src/fixpath.c index 438e21434b9..835f6b7da6a 100644 --- a/common/src/uncygdrive.c +++ b/common/src/fixpath.c @@ -58,7 +58,7 @@ int is_cygdrive_here(int pos, char *in, int len) * Works in place since drive letter is always * shorter than /cygdrive/ */ -char *replace_cygdrive(char *in) +char *replace_cygdrive_cygwin(char *in) { int len = strlen(in); char *out = malloc(len+1); @@ -119,6 +119,61 @@ char *replace_substring(char *in, char *sub, char *rep) return out; } +char* msys_path_list; // @-separated list of paths prefix to look for +char* msys_path_list_end; // Points to last \0 in msys_path_list. + +void setup_msys_path_list(char* argument) +{ + char* p; + char* drive_letter_pos; + + msys_path_list = strdup(&argument[2]); + msys_path_list_end = &msys_path_list[strlen(msys_path_list)]; + + // Convert all at-sign (@) in path list to \0. + // @ was chosen as separator to minimize risk of other tools messing around with it + p = msys_path_list; + do { + if (p[1] == ':') { + // msys has mangled our path list, restore it from c:/... to /c/... + drive_letter_pos = p+1; + *drive_letter_pos = *p; + *p = '/'; + } + + // Look for an @ in the list + p = strchr(p, '@'); + if (p != NULL) { + *p = '\0'; + p++; + } + } while (p != NULL); +} + +char *replace_cygdrive_msys(char *in) +{ + char* str; + char* prefix; + char* p; + + str = strdup(in); + + // For each prefix in the path list, search for it and replace /c/... with c:/... + for (prefix = msys_path_list; prefix < msys_path_list_end && prefix != NULL; prefix += strlen(prefix)+1) { + p=str; + while ((p = strstr(p, prefix))) { + char* drive_letter = p+1; + *p = *drive_letter; + *drive_letter = ':'; + p++; + } + } + + return str; +} + +char*(*replace_cygdrive)(char *in) = NULL; + char *files_to_delete[1024]; int num_files_to_delete = 0; @@ -158,7 +213,7 @@ char *fix_at_file(char *in) atout = fopen(name, "w"); if (atout == NULL) { - fprintf(stderr, "Could open temporary file for writing! %s\n", name); + fprintf(stderr, "Could not open temporary file for writing! %s\n", name); exit(-1); } @@ -167,7 +222,13 @@ char *fix_at_file(char *in) append(&buffer, &buflen, &used, block, blocklen); } buffer[used] = 0; + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath input from @-file %s: %s\n", &in[1], buffer); + } fixed = replace_cygdrive(buffer); + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath converted to @-file %s is: %s\n", name, fixed); + } fwrite(fixed, strlen(fixed), 1, atout); fclose(atin); fclose(atout); @@ -194,12 +255,31 @@ int main(int argc, char **argv) int i; DWORD exitCode; - if (argc<2) { - fprintf(stderr, "Usage: uncygdrive.exe /cygdrive/c/WINDOWS/notepad.exe /cygdrive/c/x/test.txt"); + if (argc<3 || argv[1][0] != '-' || (argv[1][1] != 'c' && argv[1][1] != 'm')) { + fprintf(stderr, "Usage: fixpath -c|m /cygdrive/c/WINDOWS/notepad.exe /cygdrive/c/x/test.txt"); exit(0); } - line = replace_cygdrive(strstr(GetCommandLine(), argv[1])); + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath input line >%s<\n", strstr(GetCommandLine(), argv[1])); + } + + if (argv[1][1] == 'c' && argv[1][2] == '\0') { + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "using cygwin mode\n"); + } + replace_cygdrive = replace_cygdrive_cygwin; + } else if (argv[1][1] == 'm') { + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "using msys mode, with path list: %s\n", &argv[1][2]); + } + setup_msys_path_list(argv[1]); + replace_cygdrive = replace_cygdrive_msys; + } else { + fprintf(stderr, "Unknown mode: %s\n", argv[1]); + exit(-1); + } + line = replace_cygdrive(strstr(GetCommandLine(), argv[2])); for (i=1; i%s<\n", line); + if (getenv("DEBUG_FIXPATH") != NULL) { + fprintf(stderr, "fixpath converted line >%s<\n", line); } ZeroMemory(&si,sizeof(si)); @@ -238,9 +318,9 @@ int main(int argc, char **argv) WaitForSingleObject(pi.hProcess,INFINITE); GetExitCodeProcess(pi.hProcess,&exitCode); - if (getenv("DEBUG_UNCYGDRIVE") != NULL) { + if (getenv("DEBUG_FIXPATH") != NULL) { for (i=0; i $@ + +# The resources files are generated from lisp-like .mc files. +$(CORBA_OUTPUTDIR)/logwrappers/%SystemException.resource : $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc $(CORBA_OUTPUTDIR)/btjars/logutil.jar + $(MKDIR) -p $(@D) + $(RM) -f $(@D)/_the_wrappers.d + $(ECHO) $(LOG_INFO) Generating resource file from $*.mc + $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-resource $< $(@D) + + +$(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d : $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ActivationSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/IORSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/InterceptorsSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/NamingSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/OMGSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ORBUtilSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/POASystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/UtilSystemException.java \ + $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties + $(MKDIR) -p $(@D) + $(ECHO) LOGWRAPPERS_ARE_CREATED=yes > $@ + +# Trigger the generation of the logwrappers. After the logwrapper classes and +# resources have been created, then the makefile will restart and the newly +# created java files will become part of the build further along in the makefile. +-include $(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d + +ifeq ($(LOGWRAPPERS_ARE_CREATED),yes) + $(eval $(call SetupIdlCompilation,BUILD_IDLS,\ + IDLJ:=$(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/idlj.jar,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes,\ + BIN:=$(CORBA_OUTPUTDIR)/gensrc,\ + EXCLUDES:=com/sun/tools/corba/se/idl/% \ + org/omg/CORBA/% \ + com/sun/corba/se/GiopIDL/% \ + org/omg/PortableServer/corba.idl,\ + INCLUDES:=%,\ + OLDIMPLBASES:=com/sun/corba/se/PortableActivationIDL/activation.idl \ + com/sun/corba/se/spi/activation/activation.idl,\ + DELETES:=DYNANYDELETEFILES org/omg/DynamicAny/*POA* org/omg/DynamicAny/*Holder* org/omg/DynamicAny/DynValueBoxHelper.java org/omg/DynamicAny/DynValueCommonHelper.java org/omg/DynamicAny/_DynValueCommonStub.java org/omg/DynamicAny/_DynValueBoxStub.java org/omg/DynamicAny/DynAnyPackage/TypeMismatchHolder.java org/omg/DynamicAny/DynAnyPackage/InvalidValueHolder.java org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHolder.java IOPDELETEFILES org/omg/IOP/BI_DIR_IIOP.java org/omg/IOP/ChainBypassCheck.java org/omg/IOP/ChainBypassInfo.java org/omg/IOP/FORWARDED_IDENTITY.java org/omg/IOP/INVOCATION_POLICIES.java org/omg/IOP/LogicalThreadId.java org/omg/IOP/SendingContextRunTime.java org/omg/IOP/UnknownExceptionInfo.java org/omg/IOP/TaggedComponentSeqHolder.java POAHELHOLFILES org/omg/PortableServer/CurrentPackage/NoContextHolder.java org/omg/PortableServer/ForwardRequestHolder.java org/omg/PortableServer/IdAssignmentPolicyValueHelper.java org/omg/PortableServer/IdAssignmentPolicyValueHolder.java org/omg/PortableServer/IdUniquenessPolicyValueHelper.java org/omg/PortableServer/IdUniquenessPolicyValueHolder.java org/omg/PortableServer/ImplicitActivationPolicyValueHelper.java org/omg/PortableServer/ImplicitActivationPolicyValueHolder.java org/omg/PortableServer/LifespanPolicyValueHelper.java org/omg/PortableServer/LifespanPolicyValueHolder.java org/omg/PortableServer/ServantRetentionPolicyValueHelper.java org/omg/PortableServer/ServantRetentionPolicyValueHolder.java org/omg/PortableServer/ObjectIdHelper.java org/omg/PortableServer/ObjectIdHolder.java org/omg/PortableServer/POAListHelper.java org/omg/PortableServer/POAListHolder.java org/omg/PortableServer/POAManagerPackage/AdapterInactiveHolder.java org/omg/PortableServer/POAManagerPackage/StateHelper.java org/omg/PortableServer/POAManagerPackage/StateHolder.java org/omg/PortableServer/POAPackage/AdapterAlreadyExistsHolder.java org/omg/PortableServer/POAPackage/AdapterNonExistentHolder.java org/omg/PortableServer/POAPackage/InvalidPolicyHolder.java org/omg/PortableServer/POAPackage/NoServantHolder.java org/omg/PortableServer/POAPackage/ObjectAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ObjectNotActiveHolder.java org/omg/PortableServer/POAPackage/ServantAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ServantNotActiveHolder.java org/omg/PortableServer/POAPackage/WrongAdapterHolder.java org/omg/PortableServer/POAPackage/WrongPolicyHolder.java org/omg/PortableServer/RequestProcessingPolicyValueHelper.java org/omg/PortableServer/RequestProcessingPolicyValueHolder.java org/omg/PortableServer/ServantActivatorHolder.java org/omg/PortableServer/ServantLocatorHolder.java org/omg/PortableServer/ThreadPolicyValueHelper.java org/omg/PortableServer/ThreadPolicyValueHolder.java PIHELHOLFILES org/omg/PortableInterceptor/ClientRequestInfoHelper.java org/omg/PortableInterceptor/ClientRequestInterceptorHelper.java org/omg/PortableInterceptor/IORInfoHelper.java org/omg/PortableInterceptor/IORInterceptorHelper.java org/omg/PortableInterceptor/InterceptorHelper.java org/omg/PortableInterceptor/ORBInitInfoHelper.java org/omg/PortableInterceptor/ORBInitializerHelper.java org/omg/PortableInterceptor/PolicyFactoryHelper.java org/omg/PortableInterceptor/ReplyStatusHelper.java org/omg/PortableInterceptor/RequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInterceptorHelper.java org/omg/PortableInterceptor/SlotIdHelper.java org/omg/PortableInterceptor/ClientRequestInfoHolder.java org/omg/PortableInterceptor/ClientRequestInterceptorHolder.java org/omg/PortableInterceptor/CurrentHolder.java org/omg/PortableInterceptor/ForwardRequestHolder.java org/omg/PortableInterceptor/IORInfoHolder.java org/omg/PortableInterceptor/IORInterceptorHolder.java org/omg/PortableInterceptor/InterceptorHolder.java org/omg/PortableInterceptor/InvalidSlotHolder.java org/omg/PortableInterceptor/ORBInitInfoHolder.java org/omg/PortableInterceptor/ORBInitializerHolder.java org/omg/PortableInterceptor/PolicyFactoryHolder.java org/omg/PortableInterceptor/RequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInterceptorHolder.java org/omg/PortableInterceptor/TaggedComponentSeqHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHolder.java org/omg/IOP/CodecPackage/FormatMismatchHolder.java org/omg/IOP/CodecPackage/InvalidTypeForEncodingHolder.java org/omg/IOP/CodecPackage/TypeMismatchHolder.java org/omg/IOP/CodecHelper.java org/omg/IOP/EncodingFormatHelper.java org/omg/IOP/EncodingHelper.java org/omg/IOP/CodecFactoryPackage/UnknownEncodingHolder.java org/omg/IOP/CodecFactoryHolder.java org/omg/IOP/CodecHolder.java org/omg/IOP/EncodingHolder.java org/omg/IOP/TaggedComponentSeqHelper.java org/omg/Dynamic/ContextListHelper.java org/omg/Dynamic/ExceptionListHelper.java org/omg/Dynamic/ParameterHolder.java org/omg/Dynamic/ParameterListHolder.java org/omg/Dynamic/ExceptionListHolder.java org/omg/Dynamic/ParameterHelper.java org/omg/Dynamic/ParameterListHelper.java org/omg/Dynamic/RequestContextHelper.java CORBAX org/omg/CORBA/OctetSeqHelper.java org/omg/CORBA/OctetSeqHolder.java org/omg/CORBA/PolicyError.java org/omg/CORBA/RepositoryIdHelper.java)) + + $(BUILD_IDLS) : $(CORBA_OUTPUTDIR)/btjars/idlj.jar + + $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d : $(BUILD_IDLS) $(CORBA_OUTPUTDIR)/btjars/idlj.jar + $(MKDIR) -p $(@D) + $(ECHO) IDLS_ARE_CREATED=yes > $@ + + -include $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d + + ifeq ($(IDLS_ARE_CREATED),yes) + $(eval $(call SetupJavaCompilation,BUILD_CORBA,\ + SETUP:=GENERATE_NEWBYTECODE,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ + EXCLUDES:=com/sun/corba/se/PortableActivationIDL\ + com/sun/tools/corba/se/logutil,\ + EXCLUDE_FILES:=com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java \ + com/sun/corba/se/spi/presentation/rmi/StubWrapper.java \ + com/sun/org/omg/CORBA/IDLTypeOperations.java \ + com/sun/org/omg/CORBA/IRObjectOperations.java \ + org/omg/PortableInterceptor/UNKNOWN.java \ + com/sun/tools/corba/se/idl/ResourceBundleUtil.java\ + com/sun/corba/se/impl/presentation/rmi/jndi.properties,\ + COPY:=.prp LogStrings.properties,\ + BIN:=$(CORBA_OUTPUTDIR)/classes)) + + # Separate src.zip call to include sources that were excluded in the build to + # mimic behavior in old build system. + $(eval $(call SetupZipArchive,ARCHIVE_BUILD_CORBA,\ + SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ + ZIP:=$(CORBA_OUTPUTDIR)/dist/lib/src.zip)) + + $(BUILD_CORBA) : $(BUILD_IDLS) $(LOGWRAPPER_DEPENDENCIES) + + # Run stripproperties on all sunorb resource files. + STRIP_PROP_SRC_FILES:=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb*.properties") + STRIP_PROP_FILES:=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%,$(CORBA_OUTPUTDIR)/classes/%,\ + $(STRIP_PROP_SRC_FILES)) + # Simple delivery of zh_HK properties files just copies zh_TW properties files + STRIP_PROP_FILES+=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%_zh_TW.properties,\ + $(CORBA_OUTPUTDIR)/classes/%_zh_HK.properties,\ + $(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties")) + STRIP_PROP_SRC_FILES+=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties") + STRIP_PROP_CMDLINE:=$(subst _SPACE_,$(SPACE),\ + $(join $(addprefix -clean_SPACE_,$(STRIP_PROP_SRC_FILES)), \ + $(addprefix _SPACE_,$(STRIP_PROP_FILES)))) + + $(CORBA_OUTPUTDIR)/_the.stripped_properties: $(STRIP_PROP_SRC_FILES) \ + $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar + $(MKDIR) -p $(sort $(dir $(STRIP_PROP_FILES))) + $(call ListPathsSafely,STRIP_PROP_CMDLINE,\n, >> $(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline) + $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ + @$(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline + $(TOUCH) $@ + + $(eval $(call SetupArchive,ARCHIVE_CORBA,\ + $(BUILD_CORBA) $(CORBA_OUTPUTDIR)/_the.stripped_properties,\ + SRCS:=$(CORBA_OUTPUTDIR)/classes,\ + SUFFIXES:=.class .prp .properties,\ + JAR:=$(CORBA_OUTPUTDIR)/dist/lib/classes.jar)) + + # The created classes.jar now contains Corba compiled to run on the target JDK + # and is ready for inclusion in jdk rt.jar. + + # The created src.zip now contains .java and .properties files used to create the classes in classes.jar + # and is ready for inclusion into the jdk src.zip + + BIN_FILES:=$(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/orb.idl \ + $(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/ir.idl + + $(CORBA_OUTPUTDIR)/dist/lib/bin.zip : $(BIN_FILES) $(CORBA_OUTPUTDIR)/dist/lib/classes.jar + $(MKDIR) -p $(CORBA_OUTPUTDIR)/dist/lib + $(MKDIR) -p $(CORBA_OUTPUTDIR)/lib + $(RM) -f $@ + $(ECHO) Creating `basename $@` + $(CP) $(BIN_FILES) $(CORBA_OUTPUTDIR)/lib + $(CHMOD) ug+w $(CORBA_OUTPUTDIR)/lib/* + (cd $(CORBA_OUTPUTDIR); $(ZIP) -q $@ lib/orb.idl lib/ir.idl) + + # The created bin.zip now contains the corba specific binaries: orb.idl, ir.idl + + all: $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ + $(CORBA_OUTPUTDIR)/btjars/idlj.jar \ + $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ + $(CORBA_OUTPUTDIR)/dist/lib/classes.jar \ + $(CORBA_OUTPUTDIR)/dist/lib/src.zip \ + $(CORBA_OUTPUTDIR)/dist/lib/bin.zip + endif +endif + +clean: + $(RM) -rf $(CORBA_OUTPUTDIR) + +.PHONY: default all clean clobber diff --git a/corba/makefiles/Makefile b/corba/makefiles/Makefile index ee07dedc49c..9539fe0e255 100644 --- a/corba/makefiles/Makefile +++ b/corba/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,231 +23,27 @@ # questions. # -# -# Makefile for building the corba workspace. -# +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) +endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) -# This must be the first rule -default: all +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) -include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk -include IdlCompilation.gmk - -JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar -# The Corba sources are old and generates a LOT of warnings. -# Disable these using Xlint, until someone cares to fix them. -DISABLE_CORBA_WARNINGS:=-Xlint:all,-deprecation,-unchecked,-serial,-fallthrough,-cast,-rawtypes,-static,-dep-ann - -# The "generate old bytecode" javac setup uses the new compiler to compile for the -# boot jdk to generate tools that need to be run with the boot jdk. -# Thus we force the target bytecode to the boot jdk bytecode. -$(eval $(call SetupJavaCompiler,GENERATE_OLDBYTECODE,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=$(BOOT_JDK_SOURCETARGET) -bootclasspath $(BOOT_RTJAR) $(DISABLE_CORBA_WARNINGS),\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -# The "generate new bytecode" uses the new compiler to generate bytecode -# for the new jdk that is being built. The code compiled by this setup -# cannot necessarily be run with the boot jdk. -$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=-cp $(BOOT_TOOLSJAR) -XDignore.symbol.file=true $(DISABLE_CORBA_WARNINGS),\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -$(eval $(call SetupJavaCompilation,BUILD_STRIPPROP,\ - SETUP:=GENERATE_OLDBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/make/tools/src,\ - BIN:=$(CORBA_OUTPUTDIR)/btclasses/stripprop_classes)) - -$(eval $(call SetupArchive,ARCHIVE_STRIPPROP,$(BUILD_STRIPPROP),\ - SRCS:=$(CORBA_OUTPUTDIR)/btclasses/stripprop_classes,\ - JAR:=$(CORBA_OUTPUTDIR)/btjars/stripproperties.jar,\ - JARMAIN:=build.tools.stripproperties.StripPropertiesCorba)) - -$(eval $(call SetupJavaCompilation,BUILD_IDLJ,\ - SETUP:=GENERATE_OLDBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes,\ - BIN:=$(CORBA_OUTPUTDIR)/btclasses/idlj_classes,\ - COPY:=.prp,\ - INCLUDES:=com/sun/tools/corba/se/idl,\ - EXCLUDE_FILES:=ResourceBundleUtil.java)) - -$(eval $(call SetupArchive,ARCHIVE_IDLJ,$(BUILD_IDLJ),\ - SRCS:=$(CORBA_OUTPUTDIR)/btclasses/idlj_classes,\ - SUFFIXES:=.class .prp,\ - JAR:=$(CORBA_OUTPUTDIR)/btjars/idlj.jar,\ - JARMAIN:=com.sun.tools.corba.se.idl.toJavaPortable.Compile)) - -$(eval $(call SetupJavaCompilation,BUILD_LOGUTIL,\ - SETUP:=GENERATE_OLDBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes,\ - BIN:=$(CORBA_OUTPUTDIR)/btclasses/logutil_classes,\ - INCLUDES:=com/sun/tools/corba/se/logutil)) - -$(eval $(call SetupArchive,ARCHIVE_LOGUTIL,$(BUILD_LOGUTIL),\ - SRCS:=$(CORBA_OUTPUTDIR)/btclasses/logutil_classes,\ - JAR:=$(CORBA_OUTPUTDIR)/btjars/logutil.jar,\ - JARMAIN:=com.sun.tools.corba.se.logutil.MC)) - -# Generate LogWrapper classes -$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/%SystemException.java : \ - $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc \ - $(CORBA_OUTPUTDIR)/btjars/logutil.jar - $(MKDIR) -p $(@D) - $(RM) -f $(@D)/_the_wrappers.d - $(ECHO) Generating class file from $*.mc - $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-class $< $(@D) - -# Generate LogWrapper properties file by concatening resource files -$(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties: \ - $(CORBA_OUTPUTDIR)/logwrappers/ActivationSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/IORSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/InterceptorsSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/NamingSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/OMGSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/ORBUtilSystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/POASystemException.resource \ - $(CORBA_OUTPUTDIR)/logwrappers/UtilSystemException.resource - $(MKDIR) -p $(@D) - $(ECHO) Concatenating 8 resource files into $(@F) - $(CAT) $^ > $@ - -# The resources files are generated from lisp-like .mc files. -$(CORBA_OUTPUTDIR)/logwrappers/%SystemException.resource : $(CORBA_TOPDIR)/src/share/classes/com/sun/corba/se/spi/logging/data/%.mc $(CORBA_OUTPUTDIR)/btjars/logutil.jar - $(MKDIR) -p $(@D) - $(RM) -f $(@D)/_the_wrappers.d - $(ECHO) Generating resource file from $*.mc - $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/logutil.jar make-resource $< $(@D) - - -$(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d : $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ActivationSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/IORSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/InterceptorsSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/NamingSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/OMGSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/ORBUtilSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/POASystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/UtilSystemException.java \ - $(CORBA_OUTPUTDIR)/logwrappers/com/sun/corba/se/impl/logging/LogStrings.properties - $(MKDIR) -p $(@D) - $(ECHO) LOGWRAPPERS_ARE_CREATED=yes > $@ - -# Trigger the generation of the logwrappers. After the logwrapper classes and -# resources have been created, then the makefile will restart and the newly -# created java files will become part of the build further along in the makefile. --include $(CORBA_OUTPUTDIR)/logwrappers/_the_wrappers.d - -ifeq ($(LOGWRAPPERS_ARE_CREATED),yes) - $(eval $(call SetupIdlCompilation,BUILD_IDLS,\ - IDLJ:=$(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/idlj.jar,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes,\ - BIN:=$(CORBA_OUTPUTDIR)/gensrc,\ - EXCLUDES:=com/sun/tools/corba/se/idl/% \ - org/omg/CORBA/% \ - com/sun/corba/se/GiopIDL/% \ - org/omg/PortableServer/corba.idl,\ - INCLUDES:=%,\ - OLDIMPLBASES:=com/sun/corba/se/PortableActivationIDL/activation.idl \ - com/sun/corba/se/spi/activation/activation.idl,\ - DELETES:=DYNANYDELETEFILES org/omg/DynamicAny/*POA* org/omg/DynamicAny/*Holder* org/omg/DynamicAny/DynValueBoxHelper.java org/omg/DynamicAny/DynValueCommonHelper.java org/omg/DynamicAny/_DynValueCommonStub.java org/omg/DynamicAny/_DynValueBoxStub.java org/omg/DynamicAny/DynAnyPackage/TypeMismatchHolder.java org/omg/DynamicAny/DynAnyPackage/InvalidValueHolder.java org/omg/DynamicAny/DynAnyFactoryPackage/InconsistentTypeCodeHolder.java IOPDELETEFILES org/omg/IOP/BI_DIR_IIOP.java org/omg/IOP/ChainBypassCheck.java org/omg/IOP/ChainBypassInfo.java org/omg/IOP/FORWARDED_IDENTITY.java org/omg/IOP/INVOCATION_POLICIES.java org/omg/IOP/LogicalThreadId.java org/omg/IOP/SendingContextRunTime.java org/omg/IOP/UnknownExceptionInfo.java org/omg/IOP/TaggedComponentSeqHolder.java POAHELHOLFILES org/omg/PortableServer/CurrentPackage/NoContextHolder.java org/omg/PortableServer/ForwardRequestHolder.java org/omg/PortableServer/IdAssignmentPolicyValueHelper.java org/omg/PortableServer/IdAssignmentPolicyValueHolder.java org/omg/PortableServer/IdUniquenessPolicyValueHelper.java org/omg/PortableServer/IdUniquenessPolicyValueHolder.java org/omg/PortableServer/ImplicitActivationPolicyValueHelper.java org/omg/PortableServer/ImplicitActivationPolicyValueHolder.java org/omg/PortableServer/LifespanPolicyValueHelper.java org/omg/PortableServer/LifespanPolicyValueHolder.java org/omg/PortableServer/ServantRetentionPolicyValueHelper.java org/omg/PortableServer/ServantRetentionPolicyValueHolder.java org/omg/PortableServer/ObjectIdHelper.java org/omg/PortableServer/ObjectIdHolder.java org/omg/PortableServer/POAListHelper.java org/omg/PortableServer/POAListHolder.java org/omg/PortableServer/POAManagerPackage/AdapterInactiveHolder.java org/omg/PortableServer/POAManagerPackage/StateHelper.java org/omg/PortableServer/POAManagerPackage/StateHolder.java org/omg/PortableServer/POAPackage/AdapterAlreadyExistsHolder.java org/omg/PortableServer/POAPackage/AdapterNonExistentHolder.java org/omg/PortableServer/POAPackage/InvalidPolicyHolder.java org/omg/PortableServer/POAPackage/NoServantHolder.java org/omg/PortableServer/POAPackage/ObjectAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ObjectNotActiveHolder.java org/omg/PortableServer/POAPackage/ServantAlreadyActiveHolder.java org/omg/PortableServer/POAPackage/ServantNotActiveHolder.java org/omg/PortableServer/POAPackage/WrongAdapterHolder.java org/omg/PortableServer/POAPackage/WrongPolicyHolder.java org/omg/PortableServer/RequestProcessingPolicyValueHelper.java org/omg/PortableServer/RequestProcessingPolicyValueHolder.java org/omg/PortableServer/ServantActivatorHolder.java org/omg/PortableServer/ServantLocatorHolder.java org/omg/PortableServer/ThreadPolicyValueHelper.java org/omg/PortableServer/ThreadPolicyValueHolder.java PIHELHOLFILES org/omg/PortableInterceptor/ClientRequestInfoHelper.java org/omg/PortableInterceptor/ClientRequestInterceptorHelper.java org/omg/PortableInterceptor/IORInfoHelper.java org/omg/PortableInterceptor/IORInterceptorHelper.java org/omg/PortableInterceptor/InterceptorHelper.java org/omg/PortableInterceptor/ORBInitInfoHelper.java org/omg/PortableInterceptor/ORBInitializerHelper.java org/omg/PortableInterceptor/PolicyFactoryHelper.java org/omg/PortableInterceptor/ReplyStatusHelper.java org/omg/PortableInterceptor/RequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInfoHelper.java org/omg/PortableInterceptor/ServerRequestInterceptorHelper.java org/omg/PortableInterceptor/SlotIdHelper.java org/omg/PortableInterceptor/ClientRequestInfoHolder.java org/omg/PortableInterceptor/ClientRequestInterceptorHolder.java org/omg/PortableInterceptor/CurrentHolder.java org/omg/PortableInterceptor/ForwardRequestHolder.java org/omg/PortableInterceptor/IORInfoHolder.java org/omg/PortableInterceptor/IORInterceptorHolder.java org/omg/PortableInterceptor/InterceptorHolder.java org/omg/PortableInterceptor/InvalidSlotHolder.java org/omg/PortableInterceptor/ORBInitInfoHolder.java org/omg/PortableInterceptor/ORBInitializerHolder.java org/omg/PortableInterceptor/PolicyFactoryHolder.java org/omg/PortableInterceptor/RequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInfoHolder.java org/omg/PortableInterceptor/ServerRequestInterceptorHolder.java org/omg/PortableInterceptor/TaggedComponentSeqHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/DuplicateNameHolder.java org/omg/PortableInterceptor/ORBInitInfoPackage/InvalidNameHolder.java org/omg/IOP/CodecPackage/FormatMismatchHolder.java org/omg/IOP/CodecPackage/InvalidTypeForEncodingHolder.java org/omg/IOP/CodecPackage/TypeMismatchHolder.java org/omg/IOP/CodecHelper.java org/omg/IOP/EncodingFormatHelper.java org/omg/IOP/EncodingHelper.java org/omg/IOP/CodecFactoryPackage/UnknownEncodingHolder.java org/omg/IOP/CodecFactoryHolder.java org/omg/IOP/CodecHolder.java org/omg/IOP/EncodingHolder.java org/omg/IOP/TaggedComponentSeqHelper.java org/omg/Dynamic/ContextListHelper.java org/omg/Dynamic/ExceptionListHelper.java org/omg/Dynamic/ParameterHolder.java org/omg/Dynamic/ParameterListHolder.java org/omg/Dynamic/ExceptionListHolder.java org/omg/Dynamic/ParameterHelper.java org/omg/Dynamic/ParameterListHelper.java org/omg/Dynamic/RequestContextHelper.java CORBAX org/omg/CORBA/OctetSeqHelper.java org/omg/CORBA/OctetSeqHolder.java org/omg/CORBA/PolicyError.java org/omg/CORBA/RepositoryIdHelper.java)) - - $(BUILD_IDLS) : $(CORBA_OUTPUTDIR)/btjars/idlj.jar - - $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d : $(BUILD_IDLS) $(CORBA_OUTPUTDIR)/btjars/idlj.jar - $(MKDIR) -p $(@D) - $(ECHO) IDLS_ARE_CREATED=yes > $@ - - -include $(CORBA_OUTPUTDIR)/gensrc/_the_idls.d - - ifeq ($(IDLS_ARE_CREATED),yes) - $(eval $(call SetupJavaCompilation,BUILD_CORBA,\ - SETUP:=GENERATE_NEWBYTECODE,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ - EXCLUDES:=com/sun/corba/se/PortableActivationIDL\ - com/sun/tools/corba/se/logutil,\ - EXCLUDE_FILES:=com/sun/corba/se/impl/presentation/rmi/JNDIStateFactoryImpl.java \ - com/sun/corba/se/spi/presentation/rmi/StubWrapper.java \ - com/sun/org/omg/CORBA/IDLTypeOperations.java \ - com/sun/org/omg/CORBA/IRObjectOperations.java \ - org/omg/PortableInterceptor/UNKNOWN.java \ - com/sun/tools/corba/se/idl/ResourceBundleUtil.java\ - com/sun/corba/se/impl/presentation/rmi/jndi.properties,\ - COPY:=.prp LogStrings.properties,\ - BIN:=$(CORBA_OUTPUTDIR)/classes)) - - # Separate src.zip call to include sources that were excluded in the build to - # mimic behavior in old build system. - $(eval $(call SetupZipArchive,ARCHIVE_BUILD_CORBA,\ - SRC:=$(CORBA_TOPDIR)/src/share/classes $(CORBA_OUTPUTDIR)/gensrc $(CORBA_OUTPUTDIR)/logwrappers,\ - ZIP:=$(CORBA_OUTPUTDIR)/dist/lib/src.zip)) - - $(BUILD_CORBA) : $(BUILD_IDLS) $(LOGWRAPPER_DEPENDENCIES) - - # Run stripproperties on all sunorb resource files. - STRIP_PROP_SRC_FILES:=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb*.properties") - STRIP_PROP_FILES:=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%,$(CORBA_OUTPUTDIR)/classes/%,\ - $(STRIP_PROP_SRC_FILES)) - # Simple delivery of zh_HK properties files just copies zh_TW properties files - STRIP_PROP_FILES+=$(patsubst $(CORBA_TOPDIR)/src/share/classes/%_zh_TW.properties,\ - $(CORBA_OUTPUTDIR)/classes/%_zh_HK.properties,\ - $(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties")) - STRIP_PROP_SRC_FILES+=$(shell $(FIND) $(CORBA_TOPDIR)/src/share/classes -name "sunorb_zh_TW.properties") - STRIP_PROP_CMDLINE:=$(subst _SPACE_,$(SPACE),\ - $(join $(addprefix -clean_SPACE_,$(STRIP_PROP_SRC_FILES)), \ - $(addprefix _SPACE_,$(STRIP_PROP_FILES)))) - - $(CORBA_OUTPUTDIR)/_the.stripped_properties: $(STRIP_PROP_SRC_FILES) \ - $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar - $(MKDIR) -p $(sort $(dir $(STRIP_PROP_FILES))) - $(call ListPathsSafely,STRIP_PROP_CMDLINE,\n, >> $(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline) - $(JAVA) -jar $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ - @$(CORBA_OUTPUTDIR)/_the.strip_prop.cmdline - $(TOUCH) $@ - - $(eval $(call SetupArchive,ARCHIVE_CORBA,\ - $(BUILD_CORBA) $(CORBA_OUTPUTDIR)/_the.stripped_properties,\ - SRCS:=$(CORBA_OUTPUTDIR)/classes,\ - SUFFIXES:=.class .prp .properties,\ - JAR:=$(CORBA_OUTPUTDIR)/dist/lib/classes.jar)) - - # The created classes.jar now contains Corba compiled to run on the target JDK - # and is ready for inclusion in jdk rt.jar. - - # The created src.zip now contains .java and .properties files used to create the classes in classes.jar - # and is ready for inclusion into the jdk src.zip - - BIN_FILES:=$(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/orb.idl \ - $(CORBA_TOPDIR)/src/share/classes/com/sun/tools/corba/se/idl/ir.idl - - $(CORBA_OUTPUTDIR)/dist/lib/bin.zip : $(BIN_FILES) $(CORBA_OUTPUTDIR)/dist/lib/classes.jar - $(MKDIR) -p $(CORBA_OUTPUTDIR)/dist/lib - $(MKDIR) -p $(CORBA_OUTPUTDIR)/lib - $(RM) -f $@ - $(ECHO) Creating `basename $@` - $(CP) $(BIN_FILES) $(CORBA_OUTPUTDIR)/lib - $(CHMOD) ug+w $(CORBA_OUTPUTDIR)/lib/* - (cd $(CORBA_OUTPUTDIR); $(ZIP) -q $@ lib/orb.idl lib/ir.idl) - - # The created bin.zip now contains the corba specific binaries: orb.idl, ir.idl - - all: $(CORBA_OUTPUTDIR)/btjars/stripproperties.jar \ - $(CORBA_OUTPUTDIR)/btjars/idlj.jar \ - $(CORBA_OUTPUTDIR)/btjars/logutil.jar \ - $(CORBA_OUTPUTDIR)/dist/lib/classes.jar \ - $(CORBA_OUTPUTDIR)/dist/lib/src.zip \ - $(CORBA_OUTPUTDIR)/dist/lib/bin.zip - endif +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) endif -clean: - $(RM) -rf $(CORBA_OUTPUTDIR) - -.PHONY: default all clean clobber +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) diff --git a/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java index 1e65abe073b..c4ff3971fa4 100644 --- a/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java +++ b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtable.java @@ -42,16 +42,6 @@ import java.util.NoSuchElementException; * instead, it uses the System.identityHashcode() method and pointer comparison. * In addition, all synchronization has been removed. */ -/** - * IdentityHashtable collision list. - */ -class IdentityHashtableEntry { - int hash; - Object key; - Object value; - IdentityHashtableEntry next; -} - public final class IdentityHashtable extends Dictionary { /** * The hash table data. diff --git a/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEntry.java b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEntry.java new file mode 100644 index 00000000000..cb4198de96e --- /dev/null +++ b/corba/src/share/classes/com/sun/corba/se/impl/util/IdentityHashtableEntry.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. + * 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. + */ + +/* + * Licensed Materials - Property of IBM + * RMI-IIOP v1.0 + * Copyright IBM Corp. 1998 1999 All Rights Reserved + * + */ + +package com.sun.corba.se.impl.util; + +/** + * IdentityHashtable collision list. + */ +class IdentityHashtableEntry { + int hash; + Object key; + Object value; + IdentityHashtableEntry next; +} diff --git a/hotspot/.hgtags b/hotspot/.hgtags index 0da4f9dddd5..8ea3ed76521 100644 --- a/hotspot/.hgtags +++ b/hotspot/.hgtags @@ -287,3 +287,7 @@ f2e12eb74117c917c0bb264694c02de4a6a15a10 hs25-b03 b261523fe66c40a02968f0aa7e73602491bb3386 hs25-b05 4547dc71db765276e027b0c2780b724bae0a07d3 jdk8-b61 d0337c31c8be7716369b4e7c3bd5f352983c6a06 hs25-b06 +dccd40de8db1fa96f186e6179907818d75320440 jdk8-b62 +dc16fe422c535ecd4e9f80fb814a1bb9704da6f5 hs25-b07 +acabb5c282f59be7e3238920b2ea06b684ab68f7 jdk8-b63 +8cb93eadfb6dcab88d91b8e2cd3e0e07d0ac4048 hs25-b08 diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java index 979272cae4c..a6d3427daf0 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/ConstantPool.java @@ -121,7 +121,7 @@ public class ConstantPool extends Metadata implements ClassConstants { Address addr = cache.getValue(getAddress()); return (ConstantPoolCache) VMObjectFactory.newObject(ConstantPoolCache.class, addr); } - public Klass getPoolHolder() { return (Klass) poolHolder.getValue(this); } + public InstanceKlass getPoolHolder() { return (InstanceKlass)poolHolder.getValue(this); } public int getLength() { return (int)length.getValue(getAddress()); } public Oop getResolvedReferences() { Address handle = resolvedReferences.getValue(getAddress()); diff --git a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java index 6d6a2c07ad0..449c0695bd1 100644 --- a/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java +++ b/hotspot/agent/src/share/classes/sun/jvm/hotspot/oops/Method.java @@ -177,7 +177,7 @@ public class Method extends Metadata { bci. It is required that there is currently a bytecode at this bci. */ public int getOrigBytecodeAt(int bci) { - BreakpointInfo bp = ((InstanceKlass) getMethodHolder()).getBreakpoints(); + BreakpointInfo bp = getMethodHolder().getBreakpoints(); for (; bp != null; bp = bp.getNext()) { if (bp.match(this, bci)) { return bp.getOrigBytecode(); @@ -238,7 +238,7 @@ public class Method extends Metadata { } // Method holder (the Klass holding this method) - public Klass getMethodHolder() { return getConstants().getPoolHolder(); } + public InstanceKlass getMethodHolder() { return getConstants().getPoolHolder(); } // Access flags public boolean isPublic() { return getAccessFlagsObj().isPublic(); } diff --git a/hotspot/make/Makefile b/hotspot/make/Makefile index a0b7ba7687c..fe5a6b684d6 100644 --- a/hotspot/make/Makefile +++ b/hotspot/make/Makefile @@ -453,14 +453,30 @@ ifneq ($(OSNAME),windows) ifeq ($(JVM_VARIANT_ZEROSHARK), true) $(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo): $(SHARK_DIR)/%.debuginfo + $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(SHARK_DIR)/%.diz + $(install-file) $(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(SHARK_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_SERVER_DIR)/%.debuginfo: $(SHARK_DIR)/%.debuginfo + $(install-file) + $(EXPORT_SERVER_DIR)/%.diz: $(SHARK_DIR)/%.diz + $(install-file) endif ifeq ($(JVM_VARIANT_ZERO), true) $(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo + $(install-file) + $(EXPORT_JRE_LIB_ARCH_DIR)/%.diz: $(ZERO_DIR)/%.diz + $(install-file) $(EXPORT_SERVER_DIR)/%.$(LIBRARY_SUFFIX): $(ZERO_DIR)/%.$(LIBRARY_SUFFIX) $(install-file) + $(EXPORT_SERVER_DIR)/%.debuginfo: $(ZERO_DIR)/%.debuginfo + $(install-file) + $(EXPORT_SERVER_DIR)/%.diz: $(ZERO_DIR)/%.diz + $(install-file) endif ifeq ($(JVM_VARIANT_MINIMAL1), true) $(EXPORT_JRE_LIB_ARCH_DIR)/%.$(LIBRARY_SUFFIX): $(MINIMAL1_DIR)/%.$(LIBRARY_SUFFIX) diff --git a/hotspot/make/excludeSrc.make b/hotspot/make/excludeSrc.make index 00a1e3a706e..721aea5c7e5 100644 --- a/hotspot/make/excludeSrc.make +++ b/hotspot/make/excludeSrc.make @@ -79,10 +79,10 @@ ifeq ($(INCLUDE_ALTERNATE_GCS), false) CXXFLAGS += -DSERIALGC CFLAGS += -DSERIALGC Src_Files_EXCLUDE += \ - binaryTreeDictionary.cpp cmsAdaptiveSizePolicy.cpp cmsCollectorPolicy.cpp \ + cmsAdaptiveSizePolicy.cpp cmsCollectorPolicy.cpp \ cmsGCAdaptivePolicyCounters.cpp cmsLockVerifier.cpp cmsPermGen.cpp compactibleFreeListSpace.cpp \ - concurrentMarkSweepGeneration.cpp concurrentMarkSweepThread.cpp freeBlockDictionary.cpp \ - freeChunk.cpp freeList.cpp promotionInfo.cpp vmCMSOperations.cpp collectionSetChooser.cpp \ + concurrentMarkSweepGeneration.cpp concurrentMarkSweepThread.cpp \ + freeChunk.cpp adaptiveFreeList.cpp promotionInfo.cpp vmCMSOperations.cpp collectionSetChooser.cpp \ concurrentG1Refine.cpp concurrentG1RefineThread.cpp concurrentMark.cpp concurrentMarkThread.cpp \ dirtyCardQueue.cpp g1AllocRegion.cpp g1BlockOffsetTable.cpp g1CollectedHeap.cpp g1GCPhaseTimes.cpp \ g1CollectorPolicy.cpp g1ErgoVerbose.cpp g1_globals.cpp g1HRPrinter.cpp g1MarkSweep.cpp \ diff --git a/hotspot/make/hotspot_version b/hotspot/make/hotspot_version index 1f72e227aae..9ad3194b9eb 100644 --- a/hotspot/make/hotspot_version +++ b/hotspot/make/hotspot_version @@ -35,7 +35,7 @@ HOTSPOT_VM_COPYRIGHT=Copyright 2012 HS_MAJOR_VER=25 HS_MINOR_VER=0 -HS_BUILD_NUMBER=07 +HS_BUILD_NUMBER=09 JDK_MAJOR_VER=1 JDK_MINOR_VER=8 diff --git a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp index bc35d196dcf..ef8273f58f8 100644 --- a/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp +++ b/hotspot/src/cpu/sparc/vm/sharedRuntime_sparc.cpp @@ -2322,7 +2322,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, // Pre-load a static method's oop into O1. Used both by locking code and // the normal JNI call code. if (method->is_static() && !is_critical_native) { - __ set_oop_constant(JNIHandles::make_local(Klass::cast(method->method_holder())->java_mirror()), O1); + __ set_oop_constant(JNIHandles::make_local(method->method_holder()->java_mirror()), O1); // Now handlize the static class mirror in O1. It's known not-null. __ st_ptr(O1, SP, klass_offset + STACK_BIAS); diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.cpp b/hotspot/src/cpu/x86/vm/assembler_x86.cpp index 378c1f8c6e7..6b9677d30c5 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.cpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.cpp @@ -1007,6 +1007,67 @@ void Assembler::addss(XMMRegister dst, Address src) { emit_simd_arith(0x58, dst, src, VEX_SIMD_F3); } +void Assembler::aesdec(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xde); + emit_operand(dst, src); +} + +void Assembler::aesdec(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xde); + emit_byte(0xC0 | encode); +} + +void Assembler::aesdeclast(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdf); + emit_operand(dst, src); +} + +void Assembler::aesdeclast(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdf); + emit_byte(0xC0 | encode); +} + +void Assembler::aesenc(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdc); + emit_operand(dst, src); +} + +void Assembler::aesenc(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdc); + emit_byte(0xC0 | encode); +} + +void Assembler::aesenclast(XMMRegister dst, Address src) { + assert(VM_Version::supports_aes(), ""); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdd); + emit_operand(dst, src); +} + +void Assembler::aesenclast(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_aes(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0xdd); + emit_byte(0xC0 | encode); +} + + void Assembler::andl(Address dst, int32_t imm32) { InstructionMark im(this); prefix(dst); @@ -2307,6 +2368,22 @@ void Assembler::prefix(Prefix p) { a_byte(p); } +void Assembler::pshufb(XMMRegister dst, XMMRegister src) { + assert(VM_Version::supports_ssse3(), ""); + int encode = simd_prefix_and_encode(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0x00); + emit_byte(0xC0 | encode); +} + +void Assembler::pshufb(XMMRegister dst, Address src) { + assert(VM_Version::supports_ssse3(), ""); + assert((UseAVX > 0), "SSE mode requires address alignment 16 bytes"); + InstructionMark im(this); + simd_prefix(dst, dst, src, VEX_SIMD_66, VEX_OPCODE_0F_38); + emit_byte(0x00); + emit_operand(dst, src); +} + void Assembler::pshufd(XMMRegister dst, XMMRegister src, int mode) { assert(isByte(mode), "invalid value"); NOT_LP64(assert(VM_Version::supports_sse2(), "")); @@ -8067,6 +8144,15 @@ void MacroAssembler::movptr(Address dst, Register src) { LP64_ONLY(movq(dst, src)) NOT_LP64(movl(dst, src)); } +void MacroAssembler::movdqu(XMMRegister dst, AddressLiteral src) { + if (reachable(src)) { + Assembler::movdqu(dst, as_Address(src)); + } else { + lea(rscratch1, src); + Assembler::movdqu(dst, Address(rscratch1, 0)); + } +} + void MacroAssembler::movsd(XMMRegister dst, AddressLiteral src) { if (reachable(src)) { Assembler::movsd(dst, as_Address(src)); @@ -8357,6 +8443,17 @@ void MacroAssembler::xorps(XMMRegister dst, AddressLiteral src) { } } +void MacroAssembler::pshufb(XMMRegister dst, AddressLiteral src) { + // Used in sign-bit flipping with aligned address. + assert((UseAVX > 0) || (((intptr_t)src.target() & 15) == 0), "SSE mode requires address alignment 16 bytes"); + if (reachable(src)) { + Assembler::pshufb(dst, as_Address(src)); + } else { + lea(rscratch1, src); + Assembler::pshufb(dst, Address(rscratch1, 0)); + } +} + // AVX 3-operands instructions void MacroAssembler::vaddsd(XMMRegister dst, XMMRegister nds, AddressLiteral src) { diff --git a/hotspot/src/cpu/x86/vm/assembler_x86.hpp b/hotspot/src/cpu/x86/vm/assembler_x86.hpp index c936e13f5d8..8a9bbaf424e 100644 --- a/hotspot/src/cpu/x86/vm/assembler_x86.hpp +++ b/hotspot/src/cpu/x86/vm/assembler_x86.hpp @@ -875,6 +875,17 @@ private: void addss(XMMRegister dst, Address src); void addss(XMMRegister dst, XMMRegister src); + // AES instructions + void aesdec(XMMRegister dst, Address src); + void aesdec(XMMRegister dst, XMMRegister src); + void aesdeclast(XMMRegister dst, Address src); + void aesdeclast(XMMRegister dst, XMMRegister src); + void aesenc(XMMRegister dst, Address src); + void aesenc(XMMRegister dst, XMMRegister src); + void aesenclast(XMMRegister dst, Address src); + void aesenclast(XMMRegister dst, XMMRegister src); + + void andl(Address dst, int32_t imm32); void andl(Register dst, int32_t imm32); void andl(Register dst, Address src); @@ -1424,6 +1435,10 @@ private: void prefetcht2(Address src); void prefetchw(Address src); + // Shuffle Bytes + void pshufb(XMMRegister dst, XMMRegister src); + void pshufb(XMMRegister dst, Address src); + // Shuffle Packed Doublewords void pshufd(XMMRegister dst, XMMRegister src, int mode); void pshufd(XMMRegister dst, Address src, int mode); @@ -2611,6 +2626,12 @@ public: void divss(XMMRegister dst, Address src) { Assembler::divss(dst, src); } void divss(XMMRegister dst, AddressLiteral src); + // Move Unaligned Double Quadword + void movdqu(Address dst, XMMRegister src) { Assembler::movdqu(dst, src); } + void movdqu(XMMRegister dst, Address src) { Assembler::movdqu(dst, src); } + void movdqu(XMMRegister dst, XMMRegister src) { Assembler::movdqu(dst, src); } + void movdqu(XMMRegister dst, AddressLiteral src); + void movsd(XMMRegister dst, XMMRegister src) { Assembler::movsd(dst, src); } void movsd(Address dst, XMMRegister src) { Assembler::movsd(dst, src); } void movsd(XMMRegister dst, Address src) { Assembler::movsd(dst, src); } @@ -2658,6 +2679,10 @@ public: void xorps(XMMRegister dst, Address src) { Assembler::xorps(dst, src); } void xorps(XMMRegister dst, AddressLiteral src); + // Shuffle Bytes + void pshufb(XMMRegister dst, XMMRegister src) { Assembler::pshufb(dst, src); } + void pshufb(XMMRegister dst, Address src) { Assembler::pshufb(dst, src); } + void pshufb(XMMRegister dst, AddressLiteral src); // AVX 3-operands instructions void vaddsd(XMMRegister dst, XMMRegister nds, XMMRegister src) { Assembler::vaddsd(dst, nds, src); } diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp index 7cb2bb81edd..7c3116a489c 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_32.cpp @@ -1936,7 +1936,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, if (method->is_static() && !is_critical_native) { // load opp into a register - __ movoop(oop_handle_reg, JNIHandles::make_local(Klass::cast(method->method_holder())->java_mirror())); + __ movoop(oop_handle_reg, JNIHandles::make_local(method->method_holder()->java_mirror())); // Now handlize the static class mirror it's known not-null. __ movptr(Address(rsp, klass_offset), oop_handle_reg); diff --git a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp index 49ddcb8f255..271a045fb6d 100644 --- a/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/sharedRuntime_x86_64.cpp @@ -2179,7 +2179,7 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm, if (method->is_static() && !is_critical_native) { // load oop into a register - __ movoop(oop_handle_reg, JNIHandles::make_local(Klass::cast(method->method_holder())->java_mirror())); + __ movoop(oop_handle_reg, JNIHandles::make_local(method->method_holder()->java_mirror())); // Now handlize the static class mirror it's known not-null. __ movptr(Address(rsp, klass_offset), oop_handle_reg); diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp index f149fde83ab..d8b61e0b2fd 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_32.cpp @@ -2137,6 +2137,529 @@ class StubGenerator: public StubCodeGenerator { } } + // AES intrinsic stubs + enum {AESBlockSize = 16}; + + address generate_key_shuffle_mask() { + __ align(16); + StubCodeMark mark(this, "StubRoutines", "key_shuffle_mask"); + address start = __ pc(); + __ emit_data(0x00010203, relocInfo::none, 0 ); + __ emit_data(0x04050607, relocInfo::none, 0 ); + __ emit_data(0x08090a0b, relocInfo::none, 0 ); + __ emit_data(0x0c0d0e0f, relocInfo::none, 0 ); + return start; + } + + // Utility routine for loading a 128-bit key word in little endian format + // can optionally specify that the shuffle mask is already in an xmmregister + void load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + __ movdqu(xmmdst, Address(key, offset)); + if (xmm_shuf_mask != NULL) { + __ pshufb(xmmdst, xmm_shuf_mask); + } else { + __ pshufb(xmmdst, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + } + } + + // aesenc using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_enc_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesenc(xmmdst, xmmtmp); + } + + // aesdec using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_dec_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesdec(xmmdst, xmmtmp); + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_encryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_encryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register keylen = rax; + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + __ push(rsi); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); // get 16 bytes of input + + // For encryption, the java expanded key ordering is just what we need + + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ pxor(xmm_result, xmm_temp); + for (int offset = 0x10; offset <= 0x90; offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + load_key (xmm_temp, key, 0xa0, xmm_key_shuf_mask); + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 192 and 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + __ aesenclast(xmm_result, xmm_temp); + __ movdqu(Address(to, 0), xmm_result); // store the result + __ xorptr(rax, rax); // return 0 + __ pop(rsi); + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_decryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_decryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register keylen = rax; + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + __ push(rsi); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); + + // for decryption java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + // we don't know if the key is aligned, hence not using load-execute form + load_key(xmm_temp, key, 0x10, xmm_key_shuf_mask); + __ pxor (xmm_result, xmm_temp); + for (int offset = 0x20; offset <= 0xa0; offset += 0x10) { + aes_dec_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + // only in 192 and 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + // only in 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + // for decryption the aesdeclast operation is always on key+0x00 + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ aesdeclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, 0), xmm_result); // store the result + + __ xorptr(rax, rax); // return 0 + __ pop(rsi); + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + void handleSOERegisters(bool saving) { + const int saveFrameSizeInBytes = 4 * wordSize; + const Address saved_rbx (rbp, -3 * wordSize); + const Address saved_rsi (rbp, -2 * wordSize); + const Address saved_rdi (rbp, -1 * wordSize); + + if (saving) { + __ subptr(rsp, saveFrameSizeInBytes); + __ movptr(saved_rsi, rsi); + __ movptr(saved_rdi, rdi); + __ movptr(saved_rbx, rbx); + } else { + // restoring + __ movptr(rsi, saved_rsi); + __ movptr(rdi, saved_rdi); + __ movptr(rbx, saved_rbx); + } + } + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + address generate_cipherBlockChaining_encryptAESCrypt() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_encryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256, L_loopTop_128, L_loopTop_192, L_loopTop_256; + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register rvec = rdi; // r byte array initialized from initvector array address + // and left with the results of the last encryption block + const Register len_reg = rbx; // src len (must be multiple of blocksize 16) + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + // first 6 keys preloaded into xmm2-xmm7 + const int XMM_REG_NUM_KEY_FIRST = 2; + const int XMM_REG_NUM_KEY_LAST = 7; + const XMMRegister xmm_key0 = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + handleSOERegisters(true /*saving*/); + + // load registers from incoming parameters + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + const Address rvec_param (rbp, 8+12); + const Address len_param (rbp, 8+16); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + __ movptr(rvec , rvec_param); + __ movptr(len_reg , len_param); + + const XMMRegister xmm_key_shuf_mask = xmm_temp; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 2 thru 7 with keys 0-5 + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x00; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + __ movdqu(xmm_result, Address(rvec, 0x00)); // initialize xmm_result with r vec + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + // 128 bit code follows here + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_128); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = 0x60; key_offset <= 0x90; key_offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0xa0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_128); + + __ BIND(L_exit); + __ movdqu(Address(rvec, 0), xmm_result); // final value of r stored in rvec of CipherBlockChaining object + + handleSOERegisters(false /*restoring*/); + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_192); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = 0x60; key_offset <= 0xb0; key_offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0xc0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_256); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = 0x60; key_offset <= 0xd0; key_offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0xe0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_256); + __ jmp(L_exit); + + return start; + } + + + // CBC AES Decryption. + // In 32-bit stub, because of lack of registers we do not try to parallelize 4 blocks at a time. + // + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + + address generate_cipherBlockChaining_decryptAESCrypt() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_decryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256; + Label L_singleBlock_loopTop_128; + Label L_singleBlock_loopTop_192, L_singleBlock_loopTop_256; + const Register from = rsi; // source array address + const Register to = rdx; // destination array address + const Register key = rcx; // key array address + const Register rvec = rdi; // r byte array initialized from initvector array address + // and left with the results of the last encryption block + const Register len_reg = rbx; // src len (must be multiple of blocksize 16) + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + // first 6 keys preloaded into xmm2-xmm7 + const int XMM_REG_NUM_KEY_FIRST = 2; + const int XMM_REG_NUM_KEY_LAST = 7; + const int FIRST_NON_REG_KEY_offset = 0x70; + const XMMRegister xmm_key_first = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + handleSOERegisters(true /*saving*/); + + // load registers from incoming parameters + const Address from_param(rbp, 8+0); + const Address to_param (rbp, 8+4); + const Address key_param (rbp, 8+8); + const Address rvec_param (rbp, 8+12); + const Address len_param (rbp, 8+16); + __ movptr(from , from_param); + __ movptr(to , to_param); + __ movptr(key , key_param); + __ movptr(rvec , rvec_param); + __ movptr(len_reg , len_param); + + // the java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + const XMMRegister xmm_key_shuf_mask = xmm1; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 2 thru 6 with first 5 keys + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x10; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + // inside here, use the rvec register to point to previous block cipher + // with which we xor at the end of each newly decrypted block + const Register prev_block_cipher_ptr = rvec; + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + + // 128-bit code follows here, parallelized + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_128); + __ cmpptr(len_reg, 0); // any blocks left?? + __ jcc(Assembler::equal, L_exit); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = FIRST_NON_REG_KEY_offset; key_offset <= 0xa0; key_offset += 0x10) { // 128-bit runs up to key offset a0 + aes_dec_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0x00); // final key is stored in java expanded array at offset 0 + __ aesdeclast(xmm_result, xmm_temp); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ lea(prev_block_cipher_ptr, Address(from, pos, Address::times_1, 0)); // set up new ptr + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jmp(L_singleBlock_loopTop_128); + + + __ BIND(L_exit); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ movptr(rvec , rvec_param); // restore this since used in loop + __ movdqu(Address(rvec, 0), xmm_temp); // final value of r stored in rvec of CipherBlockChaining object + handleSOERegisters(false /*restoring*/); + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_192); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = FIRST_NON_REG_KEY_offset; key_offset <= 0xc0; key_offset += 0x10) { // 192-bit runs up to key offset c0 + aes_dec_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0x00); // final key is stored in java expanded array at offset 0 + __ aesdeclast(xmm_result, xmm_temp); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ lea(prev_block_cipher_ptr, Address(from, pos, Address::times_1, 0)); // set up new ptr + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_256); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + for (int key_offset = FIRST_NON_REG_KEY_offset; key_offset <= 0xe0; key_offset += 0x10) { // 256-bit runs up to key offset e0 + aes_dec_key(xmm_result, xmm_temp, key, key_offset); + } + load_key(xmm_temp, key, 0x00); // final key is stored in java expanded array at offset 0 + __ aesdeclast(xmm_result, xmm_temp); + __ movdqu(xmm_temp, Address(prev_block_cipher_ptr, 0x00)); + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ lea(prev_block_cipher_ptr, Address(from, pos, Address::times_1, 0)); // set up new ptr + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_256); + __ jmp(L_exit); + + return start; + } + + public: // Information about frame layout at time of blocking runtime call. // Note that we only have to preserve callee-saved registers since @@ -2332,6 +2855,16 @@ class StubGenerator: public StubCodeGenerator { generate_arraycopy_stubs(); generate_math_stubs(); + + // don't bother generating these AES intrinsic stubs unless global flag is set + if (UseAESIntrinsics) { + StubRoutines::x86::_key_shuffle_mask_addr = generate_key_shuffle_mask(); // might be needed by the others + + StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); + StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); + StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); + StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt(); + } } diff --git a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp index 8ae595a56da..3e223387c94 100644 --- a/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubGenerator_x86_64.cpp @@ -2941,6 +2941,548 @@ class StubGenerator: public StubCodeGenerator { } } + // AES intrinsic stubs + enum {AESBlockSize = 16}; + + address generate_key_shuffle_mask() { + __ align(16); + StubCodeMark mark(this, "StubRoutines", "key_shuffle_mask"); + address start = __ pc(); + __ emit_data64( 0x0405060700010203, relocInfo::none ); + __ emit_data64( 0x0c0d0e0f08090a0b, relocInfo::none ); + return start; + } + + // Utility routine for loading a 128-bit key word in little endian format + // can optionally specify that the shuffle mask is already in an xmmregister + void load_key(XMMRegister xmmdst, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + __ movdqu(xmmdst, Address(key, offset)); + if (xmm_shuf_mask != NULL) { + __ pshufb(xmmdst, xmm_shuf_mask); + } else { + __ pshufb(xmmdst, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + } + } + + // aesenc using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_enc_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesenc(xmmdst, xmmtmp); + } + + // aesdec using specified key+offset + // can optionally specify that the shuffle mask is already in an xmmregister + void aes_dec_key(XMMRegister xmmdst, XMMRegister xmmtmp, Register key, int offset, XMMRegister xmm_shuf_mask=NULL) { + load_key(xmmtmp, key, offset, xmm_shuf_mask); + __ aesdec(xmmdst, xmmtmp); + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_encryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_encryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register keylen = rax; + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); // get 16 bytes of input + + // For encryption, the java expanded key ordering is just what we need + // we don't know if the key is aligned, hence not using load-execute form + + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ pxor(xmm_result, xmm_temp); + for (int offset = 0x10; offset <= 0x90; offset += 0x10) { + aes_enc_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + load_key (xmm_temp, key, 0xa0, xmm_key_shuf_mask); + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 192 and 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + __ aesenc(xmm_result, xmm_temp); // only in 256 bit keys + aes_enc_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + load_key(xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + __ aesenclast(xmm_result, xmm_temp); + __ movdqu(Address(to, 0), xmm_result); // store the result + __ xorptr(rax, rax); // return 0 + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // + address generate_aescrypt_decryptBlock() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "aescrypt_decryptBlock"); + Label L_doLast; + address start = __ pc(); + + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register keylen = rax; + + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + const XMMRegister xmm_key_shuf_mask = xmm2; + + __ enter(); // required for proper stackwalking of RuntimeStub frame + + __ movl(keylen, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + // keylen = # of 32-bit words, convert to 128-bit words + __ shrl(keylen, 2); + __ subl(keylen, 11); // every key has at least 11 128-bit words, some have more + + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + __ movdqu(xmm_result, Address(from, 0)); + + // for decryption java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + // we don't know if the key is aligned, hence not using load-execute form + load_key(xmm_temp, key, 0x10, xmm_key_shuf_mask); + __ pxor (xmm_result, xmm_temp); + for (int offset = 0x20; offset <= 0xa0; offset += 0x10) { + aes_dec_key(xmm_result, xmm_temp, key, offset, xmm_key_shuf_mask); + } + __ cmpl(keylen, 0); + __ jcc(Assembler::equal, L_doLast); + // only in 192 and 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xb0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xc0, xmm_key_shuf_mask); + __ subl(keylen, 2); + __ jcc(Assembler::equal, L_doLast); + // only in 256 bit keys + aes_dec_key(xmm_result, xmm_temp, key, 0xd0, xmm_key_shuf_mask); + aes_dec_key(xmm_result, xmm_temp, key, 0xe0, xmm_key_shuf_mask); + + __ BIND(L_doLast); + // for decryption the aesdeclast operation is always on key+0x00 + load_key(xmm_temp, key, 0x00, xmm_key_shuf_mask); + __ aesdeclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, 0), xmm_result); // store the result + + __ xorptr(rax, rax); // return 0 + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + return start; + } + + + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + address generate_cipherBlockChaining_encryptAESCrypt() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_encryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256, L_loopTop_128, L_loopTop_192, L_loopTop_256; + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register rvec = c_rarg3; // r byte array initialized from initvector array address + // and left with the results of the last encryption block +#ifndef _WIN64 + const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) +#else + const Address len_mem(rsp, 6 * wordSize); // length is on stack on Win64 + const Register len_reg = r10; // pick the first volatile windows register +#endif + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + const XMMRegister xmm_temp = xmm1; + // keys 0-10 preloaded into xmm2-xmm12 + const int XMM_REG_NUM_KEY_FIRST = 2; + const int XMM_REG_NUM_KEY_LAST = 12; + const XMMRegister xmm_key0 = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + const XMMRegister xmm_key10 = as_XMMRegister(XMM_REG_NUM_KEY_LAST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + +#ifdef _WIN64 + // on win64, fill len_reg from stack position + __ movl(len_reg, len_mem); + // save the xmm registers which must be preserved 6-12 + __ subptr(rsp, -rsp_after_call_off * wordSize); + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(xmm_save(i), as_XMMRegister(i)); + } +#endif + + const XMMRegister xmm_key_shuf_mask = xmm_temp; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 2 thru 12 with key 0x00 - 0xa0 + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x00; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + __ movdqu(xmm_result, Address(rvec, 0x00)); // initialize xmm_result with r vec + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + // 128 bit code follows here + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_128); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + __ aesenclast(xmm_result, xmm_key10); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_128); + + __ BIND(L_exit); + __ movdqu(Address(rvec, 0), xmm_result); // final value of r stored in rvec of CipherBlockChaining object + +#ifdef _WIN64 + // restore xmm regs belonging to calling function + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(as_XMMRegister(i), xmm_save(i)); + } +#endif + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_192); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + aes_enc_key(xmm_result, xmm_temp, key, 0xb0); + load_key(xmm_temp, key, 0xc0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be changed to use more xmm registers) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_loopTop_256); + __ movdqu(xmm_temp, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of input + __ pxor (xmm_result, xmm_temp); // xor with the current r vector + + __ pxor (xmm_result, xmm_key0); // do the aes rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + __ aesenc(xmm_result, as_XMMRegister(rnum)); + } + aes_enc_key(xmm_result, xmm_temp, key, 0xb0); + aes_enc_key(xmm_result, xmm_temp, key, 0xc0); + aes_enc_key(xmm_result, xmm_temp, key, 0xd0); + load_key(xmm_temp, key, 0xe0); + __ aesenclast(xmm_result, xmm_temp); + + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual, L_loopTop_256); + __ jmp(L_exit); + + return start; + } + + + + // This is a version of CBC/AES Decrypt which does 4 blocks in a loop at a time + // to hide instruction latency + // + // Arguments: + // + // Inputs: + // c_rarg0 - source byte array address + // c_rarg1 - destination byte array address + // c_rarg2 - K (key) in little endian int array + // c_rarg3 - r vector byte array address + // c_rarg4 - input length + // + + address generate_cipherBlockChaining_decryptAESCrypt_Parallel() { + assert(UseAES && (UseAVX > 0), "need AES instructions and misaligned SSE support"); + __ align(CodeEntryAlignment); + StubCodeMark mark(this, "StubRoutines", "cipherBlockChaining_decryptAESCrypt"); + address start = __ pc(); + + Label L_exit, L_key_192_256, L_key_256; + Label L_singleBlock_loopTop_128, L_multiBlock_loopTop_128; + Label L_singleBlock_loopTop_192, L_singleBlock_loopTop_256; + const Register from = c_rarg0; // source array address + const Register to = c_rarg1; // destination array address + const Register key = c_rarg2; // key array address + const Register rvec = c_rarg3; // r byte array initialized from initvector array address + // and left with the results of the last encryption block +#ifndef _WIN64 + const Register len_reg = c_rarg4; // src len (must be multiple of blocksize 16) +#else + const Address len_mem(rsp, 6 * wordSize); // length is on stack on Win64 + const Register len_reg = r10; // pick the first volatile windows register +#endif + const Register pos = rax; + + // xmm register assignments for the loops below + const XMMRegister xmm_result = xmm0; + // keys 0-10 preloaded into xmm2-xmm12 + const int XMM_REG_NUM_KEY_FIRST = 5; + const int XMM_REG_NUM_KEY_LAST = 15; + const XMMRegister xmm_key_first = as_XMMRegister(XMM_REG_NUM_KEY_FIRST); + const XMMRegister xmm_key_last = as_XMMRegister(XMM_REG_NUM_KEY_LAST); + + __ enter(); // required for proper stackwalking of RuntimeStub frame + +#ifdef _WIN64 + // on win64, fill len_reg from stack position + __ movl(len_reg, len_mem); + // save the xmm registers which must be preserved 6-15 + __ subptr(rsp, -rsp_after_call_off * wordSize); + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(xmm_save(i), as_XMMRegister(i)); + } +#endif + // the java expanded key ordering is rotated one position from what we want + // so we start from 0x10 here and hit 0x00 last + const XMMRegister xmm_key_shuf_mask = xmm1; // used temporarily to swap key bytes up front + __ movdqu(xmm_key_shuf_mask, ExternalAddress(StubRoutines::x86::key_shuffle_mask_addr())); + // load up xmm regs 5 thru 15 with key 0x10 - 0xa0 - 0x00 + for (int rnum = XMM_REG_NUM_KEY_FIRST, offset = 0x10; rnum <= XMM_REG_NUM_KEY_LAST; rnum++) { + if (rnum == XMM_REG_NUM_KEY_LAST) offset = 0x00; + load_key(as_XMMRegister(rnum), key, offset, xmm_key_shuf_mask); + offset += 0x10; + } + + const XMMRegister xmm_prev_block_cipher = xmm1; // holds cipher of previous block + // registers holding the four results in the parallelized loop + const XMMRegister xmm_result0 = xmm0; + const XMMRegister xmm_result1 = xmm2; + const XMMRegister xmm_result2 = xmm3; + const XMMRegister xmm_result3 = xmm4; + + __ movdqu(xmm_prev_block_cipher, Address(rvec, 0x00)); // initialize with initial rvec + + // now split to different paths depending on the keylen (len in ints of AESCrypt.KLE array (52=192, or 60=256)) + __ movl(rax, Address(key, arrayOopDesc::length_offset_in_bytes() - arrayOopDesc::base_offset_in_bytes(T_INT))); + __ cmpl(rax, 44); + __ jcc(Assembler::notEqual, L_key_192_256); + + + // 128-bit code follows here, parallelized + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_multiBlock_loopTop_128); + __ cmpptr(len_reg, 4*AESBlockSize); // see if at least 4 blocks left + __ jcc(Assembler::less, L_singleBlock_loopTop_128); + + __ movdqu(xmm_result0, Address(from, pos, Address::times_1, 0*AESBlockSize)); // get next 4 blocks into xmmresult registers + __ movdqu(xmm_result1, Address(from, pos, Address::times_1, 1*AESBlockSize)); + __ movdqu(xmm_result2, Address(from, pos, Address::times_1, 2*AESBlockSize)); + __ movdqu(xmm_result3, Address(from, pos, Address::times_1, 3*AESBlockSize)); + +#define DoFour(opc, src_reg) \ + __ opc(xmm_result0, src_reg); \ + __ opc(xmm_result1, src_reg); \ + __ opc(xmm_result2, src_reg); \ + __ opc(xmm_result3, src_reg); + + DoFour(pxor, xmm_key_first); + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + DoFour(aesdec, as_XMMRegister(rnum)); + } + DoFour(aesdeclast, xmm_key_last); + // for each result, xor with the r vector of previous cipher block + __ pxor(xmm_result0, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 0*AESBlockSize)); + __ pxor(xmm_result1, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 1*AESBlockSize)); + __ pxor(xmm_result2, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 2*AESBlockSize)); + __ pxor(xmm_result3, xmm_prev_block_cipher); + __ movdqu(xmm_prev_block_cipher, Address(from, pos, Address::times_1, 3*AESBlockSize)); // this will carry over to next set of blocks + + __ movdqu(Address(to, pos, Address::times_1, 0*AESBlockSize), xmm_result0); // store 4 results into the next 64 bytes of output + __ movdqu(Address(to, pos, Address::times_1, 1*AESBlockSize), xmm_result1); + __ movdqu(Address(to, pos, Address::times_1, 2*AESBlockSize), xmm_result2); + __ movdqu(Address(to, pos, Address::times_1, 3*AESBlockSize), xmm_result3); + + __ addptr(pos, 4*AESBlockSize); + __ subptr(len_reg, 4*AESBlockSize); + __ jmp(L_multiBlock_loopTop_128); + + // registers used in the non-parallelized loops + const XMMRegister xmm_prev_block_cipher_save = xmm2; + const XMMRegister xmm_temp = xmm3; + + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_128); + __ cmpptr(len_reg, 0); // any blocks left?? + __ jcc(Assembler::equal, L_exit); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ movdqa(xmm_prev_block_cipher_save, xmm_result); // save for next r vector + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + __ aesdeclast(xmm_result, xmm_key_last); + __ pxor (xmm_result, xmm_prev_block_cipher); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ movdqa(xmm_prev_block_cipher, xmm_prev_block_cipher_save); // set up next r vector with cipher input from this block + + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jmp(L_singleBlock_loopTop_128); + + + __ BIND(L_exit); + __ movdqu(Address(rvec, 0), xmm_prev_block_cipher); // final value of r stored in rvec of CipherBlockChaining object +#ifdef _WIN64 + // restore regs belonging to calling function + for (int i = 6; i <= XMM_REG_NUM_KEY_LAST; i++) { + __ movdqu(as_XMMRegister(i), xmm_save(i)); + } +#endif + __ movl(rax, 0); // return 0 (why?) + __ leave(); // required for proper stackwalking of RuntimeStub frame + __ ret(0); + + + __ BIND(L_key_192_256); + // here rax = len in ints of AESCrypt.KLE array (52=192, or 60=256) + __ cmpl(rax, 52); + __ jcc(Assembler::notEqual, L_key_256); + + // 192-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_192); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ movdqa(xmm_prev_block_cipher_save, xmm_result); // save for next r vector + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + aes_dec_key(xmm_result, xmm_temp, key, 0xb0); // 192-bit key goes up to c0 + aes_dec_key(xmm_result, xmm_temp, key, 0xc0); + __ aesdeclast(xmm_result, xmm_key_last); // xmm15 always came from key+0 + __ pxor (xmm_result, xmm_prev_block_cipher); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ movdqa(xmm_prev_block_cipher, xmm_prev_block_cipher_save); // set up next r vector with cipher input from this block + + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_192); + __ jmp(L_exit); + + __ BIND(L_key_256); + // 256-bit code follows here (could be optimized to use parallelism) + __ movptr(pos, 0); + __ align(OptoLoopAlignment); + __ BIND(L_singleBlock_loopTop_256); + __ movdqu(xmm_result, Address(from, pos, Address::times_1, 0)); // get next 16 bytes of cipher input + __ movdqa(xmm_prev_block_cipher_save, xmm_result); // save for next r vector + __ pxor (xmm_result, xmm_key_first); // do the aes dec rounds + for (int rnum = XMM_REG_NUM_KEY_FIRST + 1; rnum <= XMM_REG_NUM_KEY_LAST - 1; rnum++) { + __ aesdec(xmm_result, as_XMMRegister(rnum)); + } + aes_dec_key(xmm_result, xmm_temp, key, 0xb0); // 256-bit key goes up to e0 + aes_dec_key(xmm_result, xmm_temp, key, 0xc0); + aes_dec_key(xmm_result, xmm_temp, key, 0xd0); + aes_dec_key(xmm_result, xmm_temp, key, 0xe0); + __ aesdeclast(xmm_result, xmm_key_last); // xmm15 came from key+0 + __ pxor (xmm_result, xmm_prev_block_cipher); // xor with the current r vector + __ movdqu(Address(to, pos, Address::times_1, 0), xmm_result); // store into the next 16 bytes of output + // no need to store r to memory until we exit + __ movdqa(xmm_prev_block_cipher, xmm_prev_block_cipher_save); // set up next r vector with cipher input from this block + + __ addptr(pos, AESBlockSize); + __ subptr(len_reg, AESBlockSize); + __ jcc(Assembler::notEqual,L_singleBlock_loopTop_256); + __ jmp(L_exit); + + return start; + } + + + #undef __ #define __ masm-> @@ -3135,6 +3677,16 @@ class StubGenerator: public StubCodeGenerator { generate_arraycopy_stubs(); generate_math_stubs(); + + // don't bother generating these AES intrinsic stubs unless global flag is set + if (UseAESIntrinsics) { + StubRoutines::x86::_key_shuffle_mask_addr = generate_key_shuffle_mask(); // needed by the others + + StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock(); + StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock(); + StubRoutines::_cipherBlockChaining_encryptAESCrypt = generate_cipherBlockChaining_encryptAESCrypt(); + StubRoutines::_cipherBlockChaining_decryptAESCrypt = generate_cipherBlockChaining_decryptAESCrypt_Parallel(); + } } public: diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp index 6ec4121b9e8..cfd4f33a6ca 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.cpp @@ -44,3 +44,4 @@ address StubRoutines::x86::_verify_mxcsr_entry = NULL; address StubRoutines::x86::_verify_fpu_cntrl_wrd_entry = NULL; +address StubRoutines::x86::_key_shuffle_mask_addr = NULL; diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp index 64767c8ad40..d53124fc6c8 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_32.hpp @@ -41,10 +41,14 @@ class x86 { private: static address _verify_mxcsr_entry; static address _verify_fpu_cntrl_wrd_entry; + // shuffle mask for fixing up 128-bit words consisting of big-endian 32-bit integers + static address _key_shuffle_mask_addr; public: static address verify_mxcsr_entry() { return _verify_mxcsr_entry; } static address verify_fpu_cntrl_wrd_entry() { return _verify_fpu_cntrl_wrd_entry; } + static address key_shuffle_mask_addr() { return _key_shuffle_mask_addr; } + }; static bool returns_to_call_stub(address return_pc) { return return_pc == _call_stub_return_address; } diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp index 084bbf8fb82..cf8ec5d7b4c 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.cpp @@ -56,3 +56,4 @@ address StubRoutines::x86::_float_sign_flip = NULL; address StubRoutines::x86::_double_sign_mask = NULL; address StubRoutines::x86::_double_sign_flip = NULL; address StubRoutines::x86::_mxcsr_std = NULL; +address StubRoutines::x86::_key_shuffle_mask_addr = NULL; diff --git a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp index 9b9cede4f2d..c3efeecb759 100644 --- a/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp +++ b/hotspot/src/cpu/x86/vm/stubRoutines_x86_64.hpp @@ -54,6 +54,8 @@ class x86 { static address _double_sign_mask; static address _double_sign_flip; static address _mxcsr_std; + // shuffle mask for fixing up 128-bit words consisting of big-endian 32-bit integers + static address _key_shuffle_mask_addr; public: @@ -116,6 +118,9 @@ class x86 { { return _mxcsr_std; } + + static address key_shuffle_mask_addr() { return _key_shuffle_mask_addr; } + }; #endif // CPU_X86_VM_STUBROUTINES_X86_64_HPP diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp index bf7b3c213f1..182b0ab1a5f 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86.cpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.cpp @@ -419,13 +419,16 @@ void VM_Version::get_processor_features() { if (UseAVX < 1) _cpuFeatures &= ~CPU_AVX; + if (!UseAES && !FLAG_IS_DEFAULT(UseAES)) + _cpuFeatures &= ~CPU_AES; + if (logical_processors_per_package() == 1) { // HT processor could be installed on a system which doesn't support HT. _cpuFeatures &= ~CPU_HT; } char buf[256]; - jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + jio_snprintf(buf, sizeof(buf), "(%u cores per cpu, %u threads per core) family %d model %d stepping %d%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", cores_per_cpu(), threads_per_core(), cpu_family(), _model, _stepping, (supports_cmov() ? ", cmov" : ""), @@ -441,6 +444,7 @@ void VM_Version::get_processor_features() { (supports_popcnt() ? ", popcnt" : ""), (supports_avx() ? ", avx" : ""), (supports_avx2() ? ", avx2" : ""), + (supports_aes() ? ", aes" : ""), (supports_mmx_ext() ? ", mmxext" : ""), (supports_3dnow_prefetch() ? ", 3dnowpref" : ""), (supports_lzcnt() ? ", lzcnt": ""), @@ -472,6 +476,29 @@ void VM_Version::get_processor_features() { if (!supports_avx ()) // Drop to 0 if no AVX support UseAVX = 0; + // Use AES instructions if available. + if (supports_aes()) { + if (FLAG_IS_DEFAULT(UseAES)) { + UseAES = true; + } + } else if (UseAES) { + if (!FLAG_IS_DEFAULT(UseAES)) + warning("AES instructions not available on this CPU"); + FLAG_SET_DEFAULT(UseAES, false); + } + + // The AES intrinsic stubs require AES instruction support (of course) + // but also require AVX mode for misaligned SSE access + if (UseAES && (UseAVX > 0)) { + if (FLAG_IS_DEFAULT(UseAESIntrinsics)) { + UseAESIntrinsics = true; + } + } else if (UseAESIntrinsics) { + if (!FLAG_IS_DEFAULT(UseAESIntrinsics)) + warning("AES intrinsics not available on this CPU"); + FLAG_SET_DEFAULT(UseAESIntrinsics, false); + } + #ifdef COMPILER2 if (UseFPUForSpilling) { if (UseSSE < 2) { @@ -714,6 +741,9 @@ void VM_Version::get_processor_features() { if (UseAVX > 0) { tty->print(" UseAVX=%d",UseAVX); } + if (UseAES) { + tty->print(" UseAES=1"); + } tty->cr(); tty->print("Allocation"); if (AllocatePrefetchStyle <= 0 || UseSSE == 0 && !supports_3dnow_prefetch()) { diff --git a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp index 92cdbd3fd03..12bd3b770d5 100644 --- a/hotspot/src/cpu/x86/vm/vm_version_x86.hpp +++ b/hotspot/src/cpu/x86/vm/vm_version_x86.hpp @@ -78,7 +78,9 @@ public: sse4_2 : 1, : 2, popcnt : 1, - : 3, + : 1, + aes : 1, + : 1, osxsave : 1, avx : 1, : 3; @@ -244,7 +246,8 @@ protected: CPU_TSC = (1 << 15), CPU_TSCINV = (1 << 16), CPU_AVX = (1 << 17), - CPU_AVX2 = (1 << 18) + CPU_AVX2 = (1 << 18), + CPU_AES = (1 << 19) } cpuFeatureFlags; enum { @@ -420,6 +423,8 @@ protected: result |= CPU_TSC; if (_cpuid_info.ext_cpuid7_edx.bits.tsc_invariance != 0) result |= CPU_TSCINV; + if (_cpuid_info.std_cpuid1_ecx.bits.aes != 0) + result |= CPU_AES; // AMD features. if (is_amd()) { @@ -544,6 +549,7 @@ public: static bool supports_avx() { return (_cpuFeatures & CPU_AVX) != 0; } static bool supports_avx2() { return (_cpuFeatures & CPU_AVX2) != 0; } static bool supports_tsc() { return (_cpuFeatures & CPU_TSC) != 0; } + static bool supports_aes() { return (_cpuFeatures & CPU_AES) != 0; } // Intel features static bool is_intel_family_core() { return is_intel() && diff --git a/hotspot/src/cpu/x86/vm/x86.ad b/hotspot/src/cpu/x86/vm/x86.ad index a2cf6f7945d..c49d0e6c31c 100644 --- a/hotspot/src/cpu/x86/vm/x86.ad +++ b/hotspot/src/cpu/x86/vm/x86.ad @@ -4102,9 +4102,158 @@ instruct vsll4L_reg_imm(vecY dst, vecY src, immI8 shift) %{ // ----------------------- LogicalRightShift ----------------------------------- -// Shorts/Chars vector logical right shift produces incorrect Java result +// Shorts vector logical right shift produces incorrect Java result // for negative data because java code convert short value into int with -// sign extension before a shift. +// sign extension before a shift. But char vectors are fine since chars are +// unsigned values. + +instruct vsrl2S(vecS dst, vecS shift) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed2S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, $shift$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl2S_imm(vecS dst, immI8 shift) %{ + predicate(n->as_Vector()->length() == 2); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed2S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, (int)$shift$$constant); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl2S_reg(vecS dst, vecS src, vecS shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 2); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl2S_reg_imm(vecS dst, vecS src, immI8 shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 2); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed2S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S(vecD dst, vecS shift) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed4S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, $shift$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S_imm(vecD dst, immI8 shift) %{ + predicate(n->as_Vector()->length() == 4); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed4S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, (int)$shift$$constant); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S_reg(vecD dst, vecD src, vecS shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 4); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl4S_reg_imm(vecD dst, vecD src, immI8 shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 4); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed4S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S(vecX dst, vecS shift) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed8S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, $shift$$XMMRegister); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S_imm(vecX dst, immI8 shift) %{ + predicate(n->as_Vector()->length() == 8); + match(Set dst (URShiftVS dst shift)); + format %{ "psrlw $dst,$shift\t! logical right shift packed8S" %} + ins_encode %{ + __ psrlw($dst$$XMMRegister, (int)$shift$$constant); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S_reg(vecX dst, vecX src, vecS shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 8); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl8S_reg_imm(vecX dst, vecX src, immI8 shift) %{ + predicate(UseAVX > 0 && n->as_Vector()->length() == 8); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed8S" %} + ins_encode %{ + bool vector256 = false; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl16S_reg(vecY dst, vecY src, vecS shift) %{ + predicate(UseAVX > 1 && n->as_Vector()->length() == 16); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %} + ins_encode %{ + bool vector256 = true; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, $shift$$XMMRegister, vector256); + %} + ins_pipe( pipe_slow ); +%} + +instruct vsrl16S_reg_imm(vecY dst, vecY src, immI8 shift) %{ + predicate(UseAVX > 1 && n->as_Vector()->length() == 16); + match(Set dst (URShiftVS src shift)); + format %{ "vpsrlw $dst,$src,$shift\t! logical right shift packed16S" %} + ins_encode %{ + bool vector256 = true; + __ vpsrlw($dst$$XMMRegister, $src$$XMMRegister, (int)$shift$$constant, vector256); + %} + ins_pipe( pipe_slow ); +%} // Integers vector logical right shift instruct vsrl2I(vecD dst, vecS shift) %{ diff --git a/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp b/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp index ff61306c760..6b2cacf5ae2 100644 --- a/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp +++ b/hotspot/src/cpu/zero/vm/cppInterpreterGenerator_zero.hpp @@ -31,12 +31,17 @@ return _masm; } - protected: - address generate_entry(address entry_point) { - ZeroEntry *entry = (ZeroEntry *) assembler()->pc(); - assembler()->advance(sizeof(ZeroEntry)); + public: + static address generate_entry_impl(MacroAssembler* masm, address entry_point) { + ZeroEntry *entry = (ZeroEntry *) masm->pc(); + masm->advance(sizeof(ZeroEntry)); entry->set_entry_point(entry_point); return (address) entry; } + protected: + address generate_entry(address entry_point) { + return generate_entry_impl(assembler(), entry_point); + } + #endif // CPU_ZERO_VM_CPPINTERPRETERGENERATOR_ZERO_HPP diff --git a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp index 1b2da5a5d15..ee855a9efbc 100644 --- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp +++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.cpp @@ -180,25 +180,6 @@ void CppInterpreter::main_loop(int recurse, TRAPS) { method, istate->osr_entry(), istate->osr_buf(), THREAD); return; } - else if (istate->msg() == BytecodeInterpreter::call_method_handle) { - oop method_handle = istate->callee(); - - // Trim back the stack to put the parameters at the top - stack->set_sp(istate->stack() + 1); - - // Make the call - process_method_handle(method_handle, THREAD); - fixup_after_potential_safepoint(); - - // Convert the result - istate->set_stack(stack->sp() - 1); - - // Restore the stack - stack->set_sp(istate->stack_limit() + 1); - - // Resume the interpreter - istate->set_msg(BytecodeInterpreter::method_resume); - } else { ShouldNotReachHere(); } @@ -535,35 +516,35 @@ int CppInterpreter::accessor_entry(Method* method, intptr_t UNUSED, TRAPS) { if (entry->is_volatile()) { switch (entry->flag_state()) { case ctos: - SET_LOCALS_INT(object->char_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->char_field_acquire(entry->f2_as_index()), 0); break; case btos: - SET_LOCALS_INT(object->byte_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->byte_field_acquire(entry->f2_as_index()), 0); break; case stos: - SET_LOCALS_INT(object->short_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->short_field_acquire(entry->f2_as_index()), 0); break; case itos: - SET_LOCALS_INT(object->int_field_acquire(entry->f2()), 0); + SET_LOCALS_INT(object->int_field_acquire(entry->f2_as_index()), 0); break; case ltos: - SET_LOCALS_LONG(object->long_field_acquire(entry->f2()), 0); + SET_LOCALS_LONG(object->long_field_acquire(entry->f2_as_index()), 0); break; case ftos: - SET_LOCALS_FLOAT(object->float_field_acquire(entry->f2()), 0); + SET_LOCALS_FLOAT(object->float_field_acquire(entry->f2_as_index()), 0); break; case dtos: - SET_LOCALS_DOUBLE(object->double_field_acquire(entry->f2()), 0); + SET_LOCALS_DOUBLE(object->double_field_acquire(entry->f2_as_index()), 0); break; case atos: - SET_LOCALS_OBJECT(object->obj_field_acquire(entry->f2()), 0); + SET_LOCALS_OBJECT(object->obj_field_acquire(entry->f2_as_index()), 0); break; default: @@ -573,35 +554,35 @@ int CppInterpreter::accessor_entry(Method* method, intptr_t UNUSED, TRAPS) { else { switch (entry->flag_state()) { case ctos: - SET_LOCALS_INT(object->char_field(entry->f2()), 0); + SET_LOCALS_INT(object->char_field(entry->f2_as_index()), 0); break; case btos: - SET_LOCALS_INT(object->byte_field(entry->f2()), 0); + SET_LOCALS_INT(object->byte_field(entry->f2_as_index()), 0); break; case stos: - SET_LOCALS_INT(object->short_field(entry->f2()), 0); + SET_LOCALS_INT(object->short_field(entry->f2_as_index()), 0); break; case itos: - SET_LOCALS_INT(object->int_field(entry->f2()), 0); + SET_LOCALS_INT(object->int_field(entry->f2_as_index()), 0); break; case ltos: - SET_LOCALS_LONG(object->long_field(entry->f2()), 0); + SET_LOCALS_LONG(object->long_field(entry->f2_as_index()), 0); break; case ftos: - SET_LOCALS_FLOAT(object->float_field(entry->f2()), 0); + SET_LOCALS_FLOAT(object->float_field(entry->f2_as_index()), 0); break; case dtos: - SET_LOCALS_DOUBLE(object->double_field(entry->f2()), 0); + SET_LOCALS_DOUBLE(object->double_field(entry->f2_as_index()), 0); break; case atos: - SET_LOCALS_OBJECT(object->obj_field(entry->f2()), 0); + SET_LOCALS_OBJECT(object->obj_field(entry->f2_as_index()), 0); break; default: @@ -629,516 +610,6 @@ int CppInterpreter::empty_entry(Method* method, intptr_t UNUSED, TRAPS) { return 0; } -int CppInterpreter::method_handle_entry(Method* method, - intptr_t UNUSED, TRAPS) { - JavaThread *thread = (JavaThread *) THREAD; - ZeroStack *stack = thread->zero_stack(); - int argument_slots = method->size_of_parameters(); - int result_slots = type2size[result_type_of(method)]; - intptr_t *vmslots = stack->sp(); - intptr_t *unwind_sp = vmslots + argument_slots; - - // Find the MethodType - address p = (address) method; - for (jint* pc = method->method_type_offsets_chain(); (*pc) != -1; pc++) { - p = *(address*)(p + (*pc)); - } - oop method_type = (oop) p; - - // The MethodHandle is in the slot after the arguments - int num_vmslots = argument_slots - 1; - oop method_handle = VMSLOTS_OBJECT(num_vmslots); - - // InvokeGeneric requires some extra shuffling - oop mhtype = java_lang_invoke_MethodHandle::type(method_handle); - bool is_exact = mhtype == method_type; - if (!is_exact) { - if (true || // FIXME - method->intrinsic_id() == vmIntrinsics::_invokeExact) { - CALL_VM_NOCHECK_NOFIX( - SharedRuntime::throw_WrongMethodTypeException( - thread, method_type, mhtype)); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - stack->set_sp(unwind_sp); - return 0; - } - assert(method->intrinsic_id() == vmIntrinsics::_invokeGeneric, "should be"); - - // Load up an adapter from the calling type - // NB the x86 code for this (in methodHandles_x86.cpp, search for - // "genericInvoker") is really really odd. I'm hoping it's trying - // to accomodate odd VM/class library combinations I can ignore. - oop adapter = NULL; //FIXME: load the adapter from the CP cache - IF (adapter == NULL) { - CALL_VM_NOCHECK_NOFIX( - SharedRuntime::throw_WrongMethodTypeException( - thread, method_type, mhtype)); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - stack->set_sp(unwind_sp); - return 0; - } - - // Adapters are shared among form-families of method-type. The - // type being called is passed as a trusted first argument so that - // the adapter knows the actual types of its arguments and return - // values. - insert_vmslots(num_vmslots + 1, 1, THREAD); - if (HAS_PENDING_EXCEPTION) { - // NB all oops trashed! - stack->set_sp(unwind_sp); - return 0; - } - - vmslots = stack->sp(); - num_vmslots++; - SET_VMSLOTS_OBJECT(method_type, num_vmslots); - - method_handle = adapter; - } - - // Start processing - process_method_handle(method_handle, THREAD); - if (HAS_PENDING_EXCEPTION) - result_slots = 0; - - // If this is an invokeExact then the eventual callee will not - // have unwound the method handle argument so we have to do it. - // If a result is being returned the it will be above the method - // handle argument we're unwinding. - if (is_exact) { - intptr_t result[2]; - for (int i = 0; i < result_slots; i++) - result[i] = stack->pop(); - stack->pop(); - for (int i = result_slots - 1; i >= 0; i--) - stack->push(result[i]); - } - - // Check - assert(stack->sp() == unwind_sp - result_slots, "should be"); - - // No deoptimized frames on the stack - return 0; -} - -void CppInterpreter::process_method_handle(oop method_handle, TRAPS) { - JavaThread *thread = (JavaThread *) THREAD; - ZeroStack *stack = thread->zero_stack(); - intptr_t *vmslots = stack->sp(); - - bool direct_to_method = false; - BasicType src_rtype = T_ILLEGAL; - BasicType dst_rtype = T_ILLEGAL; - - MethodHandleEntry *entry = - java_lang_invoke_MethodHandle::vmentry(method_handle); - MethodHandles::EntryKind entry_kind = - (MethodHandles::EntryKind) (((intptr_t) entry) & 0xffffffff); - - Method* method = NULL; - switch (entry_kind) { - case MethodHandles::_invokestatic_mh: - direct_to_method = true; - break; - - case MethodHandles::_invokespecial_mh: - case MethodHandles::_invokevirtual_mh: - case MethodHandles::_invokeinterface_mh: - { - oop receiver = - VMSLOTS_OBJECT( - java_lang_invoke_MethodHandle::vmslots(method_handle) - 1); - if (receiver == NULL) { - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_NullPointerException())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - if (entry_kind != MethodHandles::_invokespecial_mh) { - intptr_t index = java_lang_invoke_DirectMethodHandle::vmindex(method_handle); - InstanceKlass* rcvrKlass = - (InstanceKlass *) receiver->klass(); - if (entry_kind == MethodHandles::_invokevirtual_mh) { - method = (Method*) rcvrKlass->start_of_vtable()[index]; - } - else { - oop iclass = java_lang_invoke_MethodHandle::next_target(method_handle); - itableOffsetEntry* ki = - (itableOffsetEntry *) rcvrKlass->start_of_itable(); - int i, length = rcvrKlass->itable_length(); - for (i = 0; i < length; i++, ki++ ) { - if (ki->interface_klass() == iclass) - break; - } - if (i == length) { - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_IncompatibleClassChangeError())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - itableMethodEntry* im = ki->first_method_entry(receiver->klass()); - method = im[index].method(); - if (method == NULL) { - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_AbstractMethodError())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - } - } - } - direct_to_method = true; - break; - - case MethodHandles::_bound_ref_direct_mh: - case MethodHandles::_bound_int_direct_mh: - case MethodHandles::_bound_long_direct_mh: - direct_to_method = true; - // fall through - case MethodHandles::_bound_ref_mh: - case MethodHandles::_bound_int_mh: - case MethodHandles::_bound_long_mh: - { - BasicType arg_type = T_ILLEGAL; - int arg_mask = -1; - int arg_slots = -1; - MethodHandles::get_ek_bound_mh_info( - entry_kind, arg_type, arg_mask, arg_slots); - int arg_slot = - java_lang_invoke_BoundMethodHandle::vmargslot(method_handle); - - // Create the new slot(s) - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - insert_vmslots(arg_slot, arg_slots, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - vmslots = stack->sp(); - - // Store bound argument into new stack slot - oop arg = java_lang_invoke_BoundMethodHandle::argument(method_handle); - if (arg_type == T_OBJECT) { - assert(arg_slots == 1, "should be"); - SET_VMSLOTS_OBJECT(arg, arg_slot); - } - else { - jvalue arg_value; - arg_type = java_lang_boxing_object::get_value(arg, &arg_value); - switch (arg_type) { - case T_BOOLEAN: - SET_VMSLOTS_INT(arg_value.z, arg_slot); - break; - case T_CHAR: - SET_VMSLOTS_INT(arg_value.c, arg_slot); - break; - case T_BYTE: - SET_VMSLOTS_INT(arg_value.b, arg_slot); - break; - case T_SHORT: - SET_VMSLOTS_INT(arg_value.s, arg_slot); - break; - case T_INT: - SET_VMSLOTS_INT(arg_value.i, arg_slot); - break; - case T_FLOAT: - SET_VMSLOTS_FLOAT(arg_value.f, arg_slot); - break; - case T_LONG: - SET_VMSLOTS_LONG(arg_value.j, arg_slot + 1); - break; - case T_DOUBLE: - SET_VMSLOTS_DOUBLE(arg_value.d, arg_slot + 1); - break; - default: - tty->print_cr("unhandled type %s", type2name(arg_type)); - ShouldNotReachHere(); - } - } - } - break; - - case MethodHandles::_adapter_retype_only: - case MethodHandles::_adapter_retype_raw: - src_rtype = result_type_of_handle( - java_lang_invoke_MethodHandle::next_target(method_handle)); - dst_rtype = result_type_of_handle(method_handle); - break; - - case MethodHandles::_adapter_check_cast: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - oop arg = VMSLOTS_OBJECT(arg_slot); - if (arg != NULL) { - Klass* objKlassOop = arg->klass(); - Klass* klassOf = java_lang_Class::as_Klass( - java_lang_invoke_AdapterMethodHandle::argument(method_handle)); - - if (objKlassOop != klassOf && - !objKlassOop->is_subtype_of(klassOf)) { - ResourceMark rm(THREAD); - const char* objName = Klass::cast(objKlassOop)->external_name(); - const char* klassName = Klass::cast(klassOf)->external_name(); - char* message = SharedRuntime::generate_class_cast_message( - objName, klassName); - - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_ClassCastException(), message)); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - } - } - break; - - case MethodHandles::_adapter_dup_args: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int num_slots = -MethodHandles::adapter_conversion_stack_move(conv); - assert(num_slots > 0, "should be"); - - // Create the new slot(s) - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - stack->overflow_check(num_slots, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - - // Duplicate the arguments - for (int i = num_slots - 1; i >= 0; i--) - stack->push(*VMSLOTS_SLOT(arg_slot + i)); - - vmslots = stack->sp(); // unused, but let the compiler figure that out - } - break; - - case MethodHandles::_adapter_drop_args: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int num_slots = MethodHandles::adapter_conversion_stack_move(conv); - assert(num_slots > 0, "should be"); - - remove_vmslots(arg_slot, num_slots, THREAD); // doesn't trap - vmslots = stack->sp(); // unused, but let the compiler figure that out - } - break; - - case MethodHandles::_adapter_opt_swap_1: - case MethodHandles::_adapter_opt_swap_2: - case MethodHandles::_adapter_opt_rot_1_up: - case MethodHandles::_adapter_opt_rot_1_down: - case MethodHandles::_adapter_opt_rot_2_up: - case MethodHandles::_adapter_opt_rot_2_down: - { - int arg1 = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int conv = - java_lang_invoke_AdapterMethodHandle::conversion(method_handle); - int arg2 = MethodHandles::adapter_conversion_vminfo(conv); - - int swap_bytes = 0, rotate = 0; - MethodHandles::get_ek_adapter_opt_swap_rot_info( - entry_kind, swap_bytes, rotate); - int swap_slots = swap_bytes >> LogBytesPerWord; - - intptr_t tmp; - switch (rotate) { - case 0: // swap - for (int i = 0; i < swap_slots; i++) { - tmp = *VMSLOTS_SLOT(arg1 + i); - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(arg2 + i), arg1 + i); - SET_VMSLOTS_SLOT(&tmp, arg2 + i); - } - break; - - case 1: // up - assert(arg1 - swap_slots > arg2, "should be"); - - tmp = *VMSLOTS_SLOT(arg1); - for (int i = arg1 - swap_slots; i >= arg2; i--) - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i + swap_slots); - SET_VMSLOTS_SLOT(&tmp, arg2); - - break; - - case -1: // down - assert(arg2 - swap_slots > arg1, "should be"); - - tmp = *VMSLOTS_SLOT(arg1); - for (int i = arg1 + swap_slots; i <= arg2; i++) - SET_VMSLOTS_SLOT(VMSLOTS_SLOT(i), i - swap_slots); - SET_VMSLOTS_SLOT(&tmp, arg2); - break; - - default: - ShouldNotReachHere(); - } - } - break; - - case MethodHandles::_adapter_opt_i2l: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - int arg = VMSLOTS_INT(arg_slot); - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - insert_vmslots(arg_slot, 1, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - vmslots = stack->sp(); - arg_slot++; - SET_VMSLOTS_LONG(arg, arg_slot); - } - break; - - case MethodHandles::_adapter_opt_unboxi: - case MethodHandles::_adapter_opt_unboxl: - { - int arg_slot = - java_lang_invoke_AdapterMethodHandle::vmargslot(method_handle); - oop arg = VMSLOTS_OBJECT(arg_slot); - jvalue arg_value; - if (arg == NULL) { - // queue a nullpointer exception for the caller - stack->set_sp(calculate_unwind_sp(stack, method_handle)); - CALL_VM_NOCHECK_NOFIX( - throw_exception( - thread, vmSymbols::java_lang_NullPointerException())); - // NB all oops trashed! - assert(HAS_PENDING_EXCEPTION, "should do"); - return; - } - BasicType arg_type = java_lang_boxing_object::get_value(arg, &arg_value); - if (arg_type == T_LONG || arg_type == T_DOUBLE) { - intptr_t *unwind_sp = calculate_unwind_sp(stack, method_handle); - insert_vmslots(arg_slot, 1, THREAD); - if (HAS_PENDING_EXCEPTION) { - // all oops trashed - stack->set_sp(unwind_sp); - return; - } - vmslots = stack->sp(); - arg_slot++; - } - switch (arg_type) { - case T_BOOLEAN: - SET_VMSLOTS_INT(arg_value.z, arg_slot); - break; - case T_CHAR: - SET_VMSLOTS_INT(arg_value.c, arg_slot); - break; - case T_BYTE: - SET_VMSLOTS_INT(arg_value.b, arg_slot); - break; - case T_SHORT: - SET_VMSLOTS_INT(arg_value.s, arg_slot); - break; - case T_INT: - SET_VMSLOTS_INT(arg_value.i, arg_slot); - break; - case T_FLOAT: - SET_VMSLOTS_FLOAT(arg_value.f, arg_slot); - break; - case T_LONG: - SET_VMSLOTS_LONG(arg_value.j, arg_slot); - break; - case T_DOUBLE: - SET_VMSLOTS_DOUBLE(arg_value.d, arg_slot); - break; - default: - tty->print_cr("unhandled type %s", type2name(arg_type)); - ShouldNotReachHere(); - } - } - break; - - default: - tty->print_cr("unhandled entry_kind %s", - MethodHandles::entry_name(entry_kind)); - ShouldNotReachHere(); - } - - // Continue along the chain - if (direct_to_method) { - if (method == NULL) { - method = - (Method*) java_lang_invoke_MethodHandle::vmtarget(method_handle); - } - address entry_point = method->from_interpreted_entry(); - Interpreter::invoke_method(method, entry_point, THREAD); - } - else { - process_method_handle( - java_lang_invoke_MethodHandle::next_target(method_handle), THREAD); - } - // NB all oops now trashed - - // Adapt the result type, if necessary - if (src_rtype != dst_rtype && !HAS_PENDING_EXCEPTION) { - switch (dst_rtype) { - case T_VOID: - for (int i = 0; i < type2size[src_rtype]; i++) - stack->pop(); - return; - - case T_INT: - switch (src_rtype) { - case T_VOID: - stack->overflow_check(1, CHECK); - stack->push(0); - return; - - case T_BOOLEAN: - case T_CHAR: - case T_BYTE: - case T_SHORT: - return; - } - // INT results sometimes need narrowing - case T_BOOLEAN: - case T_CHAR: - case T_BYTE: - case T_SHORT: - switch (src_rtype) { - case T_INT: - return; - } - } - - tty->print_cr("unhandled conversion:"); - tty->print_cr("src_rtype = %s", type2name(src_rtype)); - tty->print_cr("dst_rtype = %s", type2name(dst_rtype)); - ShouldNotReachHere(); - } -} - // The new slots will be inserted before slot insert_before. // Slots < insert_before will have the same slot number after the insert. // Slots >= insert_before will become old_slot + num_slots. @@ -1380,10 +851,6 @@ address AbstractInterpreterGenerator::generate_method_entry( entry_point = ((InterpreterGenerator*) this)->generate_abstract_entry(); break; - case Interpreter::method_handle: - entry_point = ((InterpreterGenerator*) this)->generate_method_handle_entry(); - break; - case Interpreter::java_lang_math_sin: case Interpreter::java_lang_math_cos: case Interpreter::java_lang_math_tan: @@ -1391,6 +858,8 @@ address AbstractInterpreterGenerator::generate_method_entry( case Interpreter::java_lang_math_log: case Interpreter::java_lang_math_log10: case Interpreter::java_lang_math_sqrt: + case Interpreter::java_lang_math_pow: + case Interpreter::java_lang_math_exp: entry_point = ((InterpreterGenerator*) this)->generate_math_entry(kind); break; diff --git a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp index 2faae7169ab..3a6bd52f2cb 100644 --- a/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp +++ b/hotspot/src/cpu/zero/vm/cppInterpreter_zero.hpp @@ -36,7 +36,6 @@ static int native_entry(Method* method, intptr_t UNUSED, TRAPS); static int accessor_entry(Method* method, intptr_t UNUSED, TRAPS); static int empty_entry(Method* method, intptr_t UNUSED, TRAPS); - static int method_handle_entry(Method* method, intptr_t UNUSED, TRAPS); public: // Main loop of normal_entry @@ -44,7 +43,6 @@ private: // Helpers for method_handle_entry - static void process_method_handle(oop method_handle, TRAPS); static void insert_vmslots(int insert_before, int num_slots, TRAPS); static void remove_vmslots(int first_slot, int num_slots, TRAPS); static BasicType result_type_of_handle(oop method_handle); diff --git a/hotspot/src/cpu/zero/vm/frame_zero.cpp b/hotspot/src/cpu/zero/vm/frame_zero.cpp index 6ce4b23bc6b..8643af5953f 100644 --- a/hotspot/src/cpu/zero/vm/frame_zero.cpp +++ b/hotspot/src/cpu/zero/vm/frame_zero.cpp @@ -351,7 +351,7 @@ void SharkFrame::identify_word(int frame_index, switch (offset) { case pc_off: strncpy(fieldbuf, "pc", buflen); - if (method()->is_oop()) { + if (method()->is_method()) { nmethod *code = method()->code(); if (code && code->pc_desc_at(pc())) { SimpleScopeDesc ssd(code, pc()); @@ -367,7 +367,7 @@ void SharkFrame::identify_word(int frame_index, case method_off: strncpy(fieldbuf, "method", buflen); - if (method()->is_oop()) { + if (method()->is_method()) { method()->name_and_sig_as_C_string(valuebuf, buflen); } return; @@ -378,7 +378,7 @@ void SharkFrame::identify_word(int frame_index, } // Variable part - if (method()->is_oop()) { + if (method()->is_method()) { identify_vp_word(frame_index, addr_of_word(offset), addr_of_word(header_words + 1), unextended_sp() + method()->max_stack(), @@ -430,4 +430,3 @@ intptr_t *frame::initial_deoptimization_info() { // unused... but returns fp() to minimize changes introduced by 7087445 return fp(); } - diff --git a/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp b/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp index e41ec13798a..2bc703ae032 100644 --- a/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp +++ b/hotspot/src/cpu/zero/vm/frame_zero.inline.hpp @@ -36,6 +36,8 @@ inline frame::frame() { _deopt_state = unknown; } +inline address frame::sender_pc() const { ShouldNotCallThis(); } + inline frame::frame(ZeroFrame* zf, intptr_t* sp) { _zeroframe = zf; _sp = sp; diff --git a/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp b/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp index af2f8bec5c1..95d0e115a66 100644 --- a/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp +++ b/hotspot/src/cpu/zero/vm/icBuffer_zero.cpp @@ -40,7 +40,7 @@ int InlineCacheBuffer::ic_stub_code_size() { } void InlineCacheBuffer::assemble_ic_buffer_code(address code_begin, - Metadata* cached_oop, + void* cached_oop, address entry_point) { // NB ic_stub_code_size() must return the size of the code we generate ShouldNotCallThis(); @@ -51,7 +51,6 @@ address InlineCacheBuffer::ic_buffer_entry_point(address code_begin) { ShouldNotCallThis(); } -Metadata* InlineCacheBuffer::ic_buffer_cached_oop(address code_begin) { - // NB ic_stub_code_size() must return the size of the code we generate +void* InlineCacheBuffer::ic_buffer_cached_value(address code_begin) { ShouldNotCallThis(); } diff --git a/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp b/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp index 35f4b11f5d3..ea1bc0eedc1 100644 --- a/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp +++ b/hotspot/src/cpu/zero/vm/methodHandles_zero.cpp @@ -24,26 +24,159 @@ */ #include "precompiled.hpp" +#include "interpreter/interpreterGenerator.hpp" #include "interpreter/interpreter.hpp" #include "memory/allocation.inline.hpp" #include "prims/methodHandles.hpp" -int MethodHandles::adapter_conversion_ops_supported_mask() { - return ((1<zero_stack(); + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + + // Trim back the stack to put the parameters at the top + stack->set_sp(istate->stack() + 1); + + Interpreter::invoke_method(method, method->from_interpreted_entry(), THREAD); + + // Convert the result + istate->set_stack(stack->sp() - 1); + } -void MethodHandles::generate_method_handle_stub(MacroAssembler* masm, - MethodHandles::EntryKind ek) { - init_entry(ek, (MethodHandleEntry *) ek); +oop MethodHandles::popFromStack(TRAPS) { + + JavaThread *thread = (JavaThread *) THREAD; + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + intptr_t* topOfStack = istate->stack(); + + oop top = STACK_OBJECT(-1); + MORE_STACK(-1); + istate->set_stack(topOfStack); + + return top; + +} + +int MethodHandles::method_handle_entry_invokeBasic(Method* method, intptr_t UNUSED, TRAPS) { + + JavaThread *thread = (JavaThread *) THREAD; + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + intptr_t* topOfStack = istate->stack(); + + // 'this' is a MethodHandle. We resolve the target method by accessing this.form.vmentry.vmtarget. + int numArgs = method->size_of_parameters(); + oop lform1 = java_lang_invoke_MethodHandle::form(STACK_OBJECT(-numArgs)); // this.form + oop vmEntry1 = java_lang_invoke_LambdaForm::vmentry(lform1); + Method* vmtarget = (Method*) java_lang_invoke_MemberName::vmtarget(vmEntry1); + + invoke_target(vmtarget, THREAD); + + // No deoptimized frames on the stack + return 0; +} + +int MethodHandles::method_handle_entry_linkToStaticOrSpecial(Method* method, intptr_t UNUSED, TRAPS) { + + // Pop appendix argument from stack. This is a MemberName which we resolve to the + // target method. + oop vmentry = popFromStack(THREAD); + + Method* vmtarget = (Method*) java_lang_invoke_MemberName::vmtarget(vmentry); + + invoke_target(vmtarget, THREAD); + + return 0; +} + +int MethodHandles::method_handle_entry_linkToInterface(Method* method, intptr_t UNUSED, TRAPS) { + JavaThread *thread = (JavaThread *) THREAD; + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + + // Pop appendix argument from stack. This is a MemberName which we resolve to the + // target method. + oop vmentry = popFromStack(THREAD); + intptr_t* topOfStack = istate->stack(); + + // Resolve target method by looking up in the receiver object's itable. + Klass* clazz = java_lang_Class::as_Klass(java_lang_invoke_MemberName::clazz(vmentry)); + intptr_t vmindex = java_lang_invoke_MemberName::vmindex(vmentry); + Method* target = (Method*) java_lang_invoke_MemberName::vmtarget(vmentry); + + int numArgs = target->size_of_parameters(); + oop recv = STACK_OBJECT(-numArgs); + + InstanceKlass* klass_part = InstanceKlass::cast(recv->klass()); + itableOffsetEntry* ki = (itableOffsetEntry*) klass_part->start_of_itable(); + int i; + for ( i = 0 ; i < klass_part->itable_length() ; i++, ki++ ) { + if (ki->interface_klass() == clazz) break; + } + + itableMethodEntry* im = ki->first_method_entry(recv->klass()); + Method* vmtarget = im[vmindex].method(); + + invoke_target(vmtarget, THREAD); + + return 0; +} + +int MethodHandles::method_handle_entry_linkToVirtual(Method* method, intptr_t UNUSED, TRAPS) { + JavaThread *thread = (JavaThread *) THREAD; + + InterpreterFrame *frame = thread->top_zero_frame()->as_interpreter_frame(); + interpreterState istate = frame->interpreter_state(); + + // Pop appendix argument from stack. This is a MemberName which we resolve to the + // target method. + oop vmentry = popFromStack(THREAD); + intptr_t* topOfStack = istate->stack(); + + // Resolve target method by looking up in the receiver object's vtable. + intptr_t vmindex = java_lang_invoke_MemberName::vmindex(vmentry); + Method* target = (Method*) java_lang_invoke_MemberName::vmtarget(vmentry); + int numArgs = target->size_of_parameters(); + oop recv = STACK_OBJECT(-numArgs); + Klass* clazz = recv->klass(); + Klass* klass_part = InstanceKlass::cast(clazz); + klassVtable* vtable = klass_part->vtable(); + Method* vmtarget = vtable->method_at(vmindex); + + invoke_target(vmtarget, THREAD); + + return 0; +} + +int MethodHandles::method_handle_entry_invalid(Method* method, intptr_t UNUSED, TRAPS) { + ShouldNotReachHere(); + return 0; +} + +address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler* masm, + vmIntrinsics::ID iid) { + switch (iid) { + case vmIntrinsics::_invokeGeneric: + case vmIntrinsics::_compiledLambdaForm: + // Perhaps surprisingly, the symbolic references visible to Java are not directly used. + // They are linked to Java-generated adapters via MethodHandleNatives.linkMethod. + // They all allow an appendix argument. + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_invalid); + case vmIntrinsics::_invokeBasic: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_invokeBasic); + case vmIntrinsics::_linkToStatic: + case vmIntrinsics::_linkToSpecial: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_linkToStaticOrSpecial); + case vmIntrinsics::_linkToInterface: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_linkToInterface); + case vmIntrinsics::_linkToVirtual: + return InterpreterGenerator::generate_entry_impl(masm, (address) MethodHandles::method_handle_entry_linkToVirtual); + default: + ShouldNotReachHere(); + return NULL; + } } diff --git a/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp b/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp index a71fce34f12..f4eec005c4d 100644 --- a/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp +++ b/hotspot/src/cpu/zero/vm/methodHandles_zero.hpp @@ -26,6 +26,14 @@ // Adapters enum /* platform_dependent_constants */ { - adapter_code_size = 0 + adapter_code_size = sizeof(ZeroEntry) * (Interpreter::method_handle_invoke_LAST - Interpreter::method_handle_invoke_FIRST + 1) }; +private: + static oop popFromStack(TRAPS); + static void invoke_target(Method* method, TRAPS); + static int method_handle_entry_invokeBasic(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToStaticOrSpecial(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToVirtual(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_linkToInterface(Method* method, intptr_t UNUSED, TRAPS); + static int method_handle_entry_invalid(Method* method, intptr_t UNUSED, TRAPS); diff --git a/hotspot/src/cpu/zero/vm/register_zero.hpp b/hotspot/src/cpu/zero/vm/register_zero.hpp index 0bcc7638248..1ce7141adaf 100644 --- a/hotspot/src/cpu/zero/vm/register_zero.hpp +++ b/hotspot/src/cpu/zero/vm/register_zero.hpp @@ -114,5 +114,8 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl { }; CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1)); +#ifndef DONT_USE_REGISTER_DEFINES +#define noreg ((Register)(noreg_RegisterEnumValue)) +#endif #endif // CPU_ZERO_VM_REGISTER_ZERO_HPP diff --git a/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp b/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp index 13f095e4746..ed7ee7bca6a 100644 --- a/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp +++ b/hotspot/src/cpu/zero/vm/relocInfo_zero.cpp @@ -77,3 +77,7 @@ void poll_return_Relocation::fix_relocation_after_move(const CodeBuffer* src, CodeBuffer* dst) { ShouldNotCallThis(); } + +void metadata_Relocation::pd_fix_value(address x) { + ShouldNotCallThis(); +} diff --git a/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp b/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp index 3cb8cd7e46a..123d71ec044 100644 --- a/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp +++ b/hotspot/src/cpu/zero/vm/sharedRuntime_zero.cpp @@ -35,6 +35,7 @@ #include "runtime/sharedRuntime.hpp" #include "runtime/vframeArray.hpp" #include "vmreg_zero.inline.hpp" + #ifdef COMPILER1 #include "c1/c1_Runtime1.hpp" #endif @@ -47,6 +48,12 @@ #endif + +static address zero_null_code_stub() { + address start = ShouldNotCallThisStub(); + return start; +} + int SharedRuntime::java_calling_convention(const BasicType *sig_bt, VMRegPair *regs, int total_args_passed, @@ -63,16 +70,14 @@ AdapterHandlerEntry* SharedRuntime::generate_i2c2i_adapters( AdapterFingerPrint *fingerprint) { return AdapterHandlerLibrary::new_entry( fingerprint, - ShouldNotCallThisStub(), - ShouldNotCallThisStub(), - ShouldNotCallThisStub()); + CAST_FROM_FN_PTR(address,zero_null_code_stub), + CAST_FROM_FN_PTR(address,zero_null_code_stub), + CAST_FROM_FN_PTR(address,zero_null_code_stub)); } nmethod *SharedRuntime::generate_native_wrapper(MacroAssembler *masm, methodHandle method, int compile_id, - int total_args_passed, - int max_arg, BasicType *sig_bt, VMRegPair *regs, BasicType ret_type) { @@ -96,19 +101,20 @@ uint SharedRuntime::out_preserve_stack_slots() { ShouldNotCallThis(); } +JRT_LEAF(void, zero_stub()) + ShouldNotCallThis(); +JRT_END + static RuntimeStub* generate_empty_runtime_stub(const char* name) { - CodeBuffer buffer(name, 0, 0); - return RuntimeStub::new_runtime_stub(name, &buffer, 0, 0, NULL, false); + return CAST_FROM_FN_PTR(RuntimeStub*,zero_stub); } static SafepointBlob* generate_empty_safepoint_blob() { - CodeBuffer buffer("handler_blob", 0, 0); - return SafepointBlob::create(&buffer, NULL, 0); + return CAST_FROM_FN_PTR(SafepointBlob*,zero_stub); } static DeoptimizationBlob* generate_empty_deopt_blob() { - CodeBuffer buffer("handler_blob", 0, 0); - return DeoptimizationBlob::create(&buffer, NULL, 0, 0, 0, 0); + return CAST_FROM_FN_PTR(DeoptimizationBlob*,zero_stub); } @@ -116,7 +122,7 @@ void SharedRuntime::generate_deopt_blob() { _deopt_blob = generate_empty_deopt_blob(); } -SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, bool cause_return) { +SafepointBlob* SharedRuntime::generate_handler_blob(address call_ptr, int poll_type) { return generate_empty_safepoint_blob(); } @@ -124,6 +130,7 @@ RuntimeStub* SharedRuntime::generate_resolve_blob(address destination, const cha return generate_empty_runtime_stub("resolve_blob"); } + int SharedRuntime::c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, int total_args_passed) { diff --git a/hotspot/src/share/tools/hsdis/hsdis-demo.c b/hotspot/src/share/tools/hsdis/hsdis-demo.c index 2f7b67d3649..b9586ee32e8 100644 --- a/hotspot/src/share/tools/hsdis/hsdis-demo.c +++ b/hotspot/src/share/tools/hsdis/hsdis-demo.c @@ -85,9 +85,11 @@ void end_of_file() { } #include "dlfcn.h" -#define DECODE_INSTRUCTIONS_NAME "decode_instructions_virtual" +#define DECODE_INSTRUCTIONS_VIRTUAL_NAME "decode_instructions_virtual" +#define DECODE_INSTRUCTIONS_NAME "decode_instructions" #define HSDIS_NAME "hsdis" static void* decode_instructions_pv = 0; +static void* decode_instructions_sv = 0; static const char* hsdis_path[] = { HSDIS_NAME"-"LIBARCH LIB_EXT, "./" HSDIS_NAME"-"LIBARCH LIB_EXT, @@ -101,11 +103,12 @@ static const char* load_decode_instructions() { void* dllib = NULL; const char* *next_in_path = hsdis_path; while (1) { - decode_instructions_pv = dlsym(dllib, DECODE_INSTRUCTIONS_NAME); - if (decode_instructions_pv != NULL) + decode_instructions_pv = dlsym(dllib, DECODE_INSTRUCTIONS_VIRTUAL_NAME); + decode_instructions_sv = dlsym(dllib, DECODE_INSTRUCTIONS_NAME); + if (decode_instructions_pv != NULL || decode_instructions_sv != NULL) return NULL; if (dllib != NULL) - return "plugin does not defined "DECODE_INSTRUCTIONS_NAME; + return "plugin does not defined "DECODE_INSTRUCTIONS_VIRTUAL_NAME" and "DECODE_INSTRUCTIONS_NAME; for (dllib = NULL; dllib == NULL; ) { const char* next_lib = (*next_in_path++); if (next_lib == NULL) @@ -213,20 +216,44 @@ void disassemble(uintptr_t from, uintptr_t to) { printf("%s: %s\n", err, dlerror()); exit(1); } - printf("Decoding from %p to %p...\n", from, to); - decode_instructions_ftype decode_instructions - = (decode_instructions_ftype) decode_instructions_pv; + decode_func_vtype decode_instructions_v + = (decode_func_vtype) decode_instructions_pv; + decode_func_stype decode_instructions_s + = (decode_func_stype) decode_instructions_sv; void* res; - if (raw && xml) { - res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, simple_handle_event, stdout, NULL, stdout, options); - } else if (raw) { - res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, simple_handle_event, stdout, NULL, stdout, options); - } else { - res = (*decode_instructions)(from, to, (unsigned char*)from, to - from, - handle_event, (void*) event_cookie, - fprintf_callback, stdout, - options); + if (decode_instructions_pv != NULL) { + printf("\nDecoding from %p to %p...with %s\n", from, to, DECODE_INSTRUCTIONS_VIRTUAL_NAME); + if (raw) { + res = (*decode_instructions_v)(from, to, + (unsigned char*)from, to - from, + simple_handle_event, stdout, + NULL, stdout, + options, 0); + } else { + res = (*decode_instructions_v)(from, to, + (unsigned char*)from, to - from, + handle_event, (void*) event_cookie, + fprintf_callback, stdout, + options, 0); + } + if (res != (void*)to) + printf("*** Result was %p!\n", res); + } + void* sres; + if (decode_instructions_sv != NULL) { + printf("\nDecoding from %p to %p...with old decode_instructions\n", from, to, DECODE_INSTRUCTIONS_NAME); + if (raw) { + sres = (*decode_instructions_s)(from, to, + simple_handle_event, stdout, + NULL, stdout, + options); + } else { + sres = (*decode_instructions_s)(from, to, + handle_event, (void*) event_cookie, + fprintf_callback, stdout, + options); + } + if (sres != (void *)to) + printf("*** Result of decode_instructions %p!\n", sres); } - if (res != (void*)to) - printf("*** Result was %p!\n", res); } diff --git a/hotspot/src/share/tools/hsdis/hsdis.c b/hotspot/src/share/tools/hsdis/hsdis.c index 251344e0ce8..397793021c0 100644 --- a/hotspot/src/share/tools/hsdis/hsdis.c +++ b/hotspot/src/share/tools/hsdis/hsdis.c @@ -99,7 +99,7 @@ decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va, unsigned char* buffer, uintptr_t length, event_callback_t event_callback_arg, void* event_stream_arg, printf_callback_t printf_callback_arg, void* printf_stream_arg, - const char* options) { + const char* options, int newline) { struct hsdis_app_data app_data; memset(&app_data, 0, sizeof(app_data)); app_data.start_va = start_va; @@ -110,7 +110,7 @@ decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va, app_data.event_stream = event_stream_arg; app_data.printf_callback = printf_callback_arg; app_data.printf_stream = printf_stream_arg; - app_data.do_newline = false; + app_data.do_newline = newline == 0 ? false : true; return decode(&app_data, options); } @@ -132,7 +132,7 @@ decode_instructions(void* start_pv, void* end_pv, event_stream_arg, printf_callback_arg, printf_stream_arg, - options); + options, false); } static void* decode(struct hsdis_app_data* app_data, const char* options) { @@ -173,7 +173,7 @@ static void* decode(struct hsdis_app_data* app_data, const char* options) { if (!app_data->losing) { const char* insn_close = format_insn_close("/insn", &app_data->dinfo, buf, sizeof(buf)); - (*event_callback)(event_stream, insn_close, (void*) p) != NULL; + (*event_callback)(event_stream, insn_close, (void*) p); if (app_data->do_newline) { /* follow each complete insn by a nice newline */ @@ -182,13 +182,14 @@ static void* decode(struct hsdis_app_data* app_data, const char* options) { } } - (*event_callback)(event_stream, "/insns", (void*) p); + if (app_data->losing) (*event_callback)(event_stream, "/insns", (void*) p); return (void*) p; } } /* take the address of the function, for luck, and also test the typedef: */ -const decode_instructions_ftype decode_instructions_address = &decode_instructions_virtual; +const decode_func_vtype decode_func_virtual_address = &decode_instructions_virtual; +const decode_func_stype decode_func_address = &decode_instructions; static const char* format_insn_close(const char* close, disassemble_info* dinfo, diff --git a/hotspot/src/share/tools/hsdis/hsdis.h b/hotspot/src/share/tools/hsdis/hsdis.h index 5ab26ef086c..ca712e6fa29 100644 --- a/hotspot/src/share/tools/hsdis/hsdis.h +++ b/hotspot/src/share/tools/hsdis/hsdis.h @@ -47,6 +47,9 @@ where tag is a simple identifier, signifying (as in XML) a element start, element end, and standalone element. (To render as XML, add angle brackets.) */ +#ifndef SHARED_TOOLS_HSDIS_H +#define SHARED_TOOLS_HSDIS_H + extern #ifdef DLL_EXPORT DLL_EXPORT @@ -57,16 +60,37 @@ void* decode_instructions_virtual(uintptr_t start_va, uintptr_t end_va, void* event_stream, int (*printf_callback)(void*, const char*, ...), void* printf_stream, - const char* options); + const char* options, + int newline /* bool value for nice new line */); + +/* This is the compatability interface for older versions of hotspot */ +extern +#ifdef DLL_ENTRY + DLL_ENTRY +#endif +void* decode_instructions(void* start_pv, void* end_pv, + void* (*event_callback)(void*, const char*, void*), + void* event_stream, + int (*printf_callback)(void*, const char*, ...), + void* printf_stream, + const char* options); /* convenience typedefs */ typedef void* (*decode_instructions_event_callback_ftype) (void*, const char*, void*); typedef int (*decode_instructions_printf_callback_ftype) (void*, const char*, ...); -typedef void* (*decode_instructions_ftype) (uintptr_t start_va, uintptr_t end_va, - unsigned char* buffer, uintptr_t length, - decode_instructions_event_callback_ftype event_callback, - void* event_stream, - decode_instructions_printf_callback_ftype printf_callback, - void* printf_stream, - const char* options); +typedef void* (*decode_func_vtype) (uintptr_t start_va, uintptr_t end_va, + unsigned char* buffer, uintptr_t length, + decode_instructions_event_callback_ftype event_callback, + void* event_stream, + decode_instructions_printf_callback_ftype printf_callback, + void* printf_stream, + const char* options, + int newline); +typedef void* (*decode_func_stype) (void* start_pv, void* end_pv, + decode_instructions_event_callback_ftype event_callback, + void* event_stream, + decode_instructions_printf_callback_ftype printf_callback, + void* printf_stream, + const char* options); +#endif /* SHARED_TOOLS_HSDIS_H */ diff --git a/hotspot/src/share/vm/asm/codeBuffer.cpp b/hotspot/src/share/vm/asm/codeBuffer.cpp index bb1ae18fcb5..a3fc112f54f 100644 --- a/hotspot/src/share/vm/asm/codeBuffer.cpp +++ b/hotspot/src/share/vm/asm/codeBuffer.cpp @@ -758,7 +758,7 @@ void CodeBuffer::relocate_code_to(CodeBuffer* dest) const { } } - if (dest->blob() == NULL) { + if (dest->blob() == NULL && dest_filled != NULL) { // Destination is a final resting place, not just another buffer. // Normalize uninitialized bytes in the final padding. Copy::fill_to_bytes(dest_filled, dest_end - dest_filled, diff --git a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp index 1bbdc5afbca..941dd120a01 100644 --- a/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp +++ b/hotspot/src/share/vm/c1/c1_GraphBuilder.cpp @@ -1844,17 +1844,12 @@ void GraphBuilder::invoke(Bytecodes::Code code) { code == Bytecodes::_invokevirtual && target->is_final_method() || code == Bytecodes::_invokedynamic) { ciMethod* inline_target = (cha_monomorphic_target != NULL) ? cha_monomorphic_target : target; - bool success = false; - if (target->is_method_handle_intrinsic()) { - // method handle invokes - success = try_method_handle_inline(target); - } else { - // static binding => check if callee is ok - success = try_inline(inline_target, (cha_monomorphic_target != NULL) || (exact_target != NULL), code, better_receiver); - } - CHECK_BAILOUT(); + // static binding => check if callee is ok + bool success = try_inline(inline_target, (cha_monomorphic_target != NULL) || (exact_target != NULL), code, better_receiver); + CHECK_BAILOUT(); clear_inline_bailout(); + if (success) { // Register dependence if JVMTI has either breakpoint // setting or hotswapping of methods capabilities since they may @@ -3201,6 +3196,11 @@ bool GraphBuilder::try_inline(ciMethod* callee, bool holder_known, Bytecodes::Co return false; } + // method handle invokes + if (callee->is_method_handle_intrinsic()) { + return try_method_handle_inline(callee); + } + // handle intrinsics if (callee->intrinsic_id() != vmIntrinsics::_none) { if (try_inline_intrinsics(callee)) { @@ -3885,10 +3885,14 @@ bool GraphBuilder::try_method_handle_inline(ciMethod* callee) { ValueType* type = state()->stack_at(args_base)->type(); if (type->is_constant()) { ciMethod* target = type->as_ObjectType()->constant_value()->as_method_handle()->get_vmtarget(); - guarantee(!target->is_method_handle_intrinsic(), "should not happen"); // XXX remove - Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; - if (try_inline(target, /*holder_known*/ true, bc)) { - return true; + // We don't do CHA here so only inline static and statically bindable methods. + if (target->is_static() || target->can_be_statically_bound()) { + Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; + if (try_inline(target, /*holder_known*/ true, bc)) { + return true; + } + } else { + print_inlining(target, "not static or statically bindable", /*success*/ false); } } else { print_inlining(callee, "receiver not constant", /*success*/ false); @@ -3941,9 +3945,14 @@ bool GraphBuilder::try_method_handle_inline(ciMethod* callee) { } j += t->size(); // long and double take two slots } - Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; - if (try_inline(target, /*holder_known*/ true, bc)) { - return true; + // We don't do CHA here so only inline static and statically bindable methods. + if (target->is_static() || target->can_be_statically_bound()) { + Bytecodes::Code bc = target->is_static() ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual; + if (try_inline(target, /*holder_known*/ true, bc)) { + return true; + } + } else { + print_inlining(target, "not static or statically bindable", /*success*/ false); } } } else { diff --git a/hotspot/src/share/vm/ci/ciEnv.cpp b/hotspot/src/share/vm/ci/ciEnv.cpp index bdfd15f63fb..0465b9cf9c1 100644 --- a/hotspot/src/share/vm/ci/ciEnv.cpp +++ b/hotspot/src/share/vm/ci/ciEnv.cpp @@ -768,8 +768,8 @@ ciMethod* ciEnv::get_method_by_index_impl(constantPoolHandle cpool, Method* m = lookup_method(accessor->get_instanceKlass(), lookup, name_sym, sig_sym, bc); if (m != NULL && (bc == Bytecodes::_invokestatic - ? InstanceKlass::cast(m->method_holder())->is_not_initialized() - : !InstanceKlass::cast(m->method_holder())->is_loaded())) { + ? m->method_holder()->is_not_initialized() + : !m->method_holder()->is_loaded())) { m = NULL; } if (m != NULL) { @@ -1056,7 +1056,7 @@ void ciEnv::register_method(ciMethod* target, method_name, entry_bci); } - InstanceKlass::cast(method->method_holder())->add_osr_nmethod(nm); + method->method_holder()->add_osr_nmethod(nm); } } diff --git a/hotspot/src/share/vm/ci/ciMethod.cpp b/hotspot/src/share/vm/ci/ciMethod.cpp index 02d62752ec8..7071f54d0af 100644 --- a/hotspot/src/share/vm/ci/ciMethod.cpp +++ b/hotspot/src/share/vm/ci/ciMethod.cpp @@ -105,7 +105,7 @@ ciMethod::ciMethod(methodHandle h_m) : ciMetadata(h_m()) { CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops()); } - if (InstanceKlass::cast(h_m()->method_holder())->is_linked()) { + if (h_m()->method_holder()->is_linked()) { _can_be_statically_bound = h_m()->can_be_statically_bound(); } else { // Have to use a conservative value in this case. @@ -188,7 +188,7 @@ void ciMethod::load_code() { // Revert any breakpoint bytecodes in ci's copy if (me->number_of_breakpoints() > 0) { - BreakpointInfo* bp = InstanceKlass::cast(me->method_holder())->breakpoints(); + BreakpointInfo* bp = me->method_holder()->breakpoints(); for (; bp != NULL; bp = bp->next()) { if (bp->match(me)) { code_at_put(bp->bci(), bp->orig_bytecode()); diff --git a/hotspot/src/share/vm/classfile/bytecodeAssembler.cpp b/hotspot/src/share/vm/classfile/bytecodeAssembler.cpp new file mode 100644 index 00000000000..c7e08d94c47 --- /dev/null +++ b/hotspot/src/share/vm/classfile/bytecodeAssembler.cpp @@ -0,0 +1,269 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" + +#include "classfile/bytecodeAssembler.hpp" +#include "interpreter/bytecodes.hpp" +#include "memory/oopFactory.hpp" +#include "oops/constantPool.hpp" + +#ifdef TARGET_ARCH_x86 +# include "bytes_x86.hpp" +#endif +#ifdef TARGET_ARCH_sparc +# include "bytes_sparc.hpp" +#endif +#ifdef TARGET_ARCH_zero +# include "bytes_zero.hpp" +#endif +#ifdef TARGET_ARCH_arm +# include "bytes_arm.hpp" +#endif +#ifdef TARGET_ARCH_ppc +# include "bytes_ppc.hpp" +#endif + +u2 BytecodeConstantPool::find_or_add(BytecodeCPEntry const& bcpe) { + u2 index; + u2* probe = _indices.get(bcpe); + if (probe == NULL) { + index = _entries.length(); + _entries.append(bcpe); + _indices.put(bcpe, index); + } else { + index = *probe; + } + return index + _orig->length(); +} + +ConstantPool* BytecodeConstantPool::create_constant_pool(TRAPS) const { + if (_entries.length() == 0) { + return _orig; + } + + ConstantPool* cp = ConstantPool::allocate( + _orig->pool_holder()->class_loader_data(), + _orig->length() + _entries.length(), CHECK_NULL); + + cp->set_pool_holder(_orig->pool_holder()); + _orig->copy_cp_to(1, _orig->length() - 1, cp, 1, CHECK_NULL); + + for (int i = 0; i < _entries.length(); ++i) { + BytecodeCPEntry entry = _entries.at(i); + int idx = i + _orig->length(); + switch (entry._tag) { + case BytecodeCPEntry::UTF8: + cp->symbol_at_put(idx, entry._u.utf8); + entry._u.utf8->increment_refcount(); + break; + case BytecodeCPEntry::KLASS: + cp->unresolved_klass_at_put( + idx, cp->symbol_at(entry._u.klass)); + break; + case BytecodeCPEntry::STRING: + cp->unresolved_string_at_put( + idx, cp->symbol_at(entry._u.string)); + break; + case BytecodeCPEntry::NAME_AND_TYPE: + cp->name_and_type_at_put(idx, + entry._u.name_and_type.name_index, + entry._u.name_and_type.type_index); + break; + case BytecodeCPEntry::METHODREF: + cp->method_at_put(idx, + entry._u.methodref.class_index, + entry._u.methodref.name_and_type_index); + break; + default: + ShouldNotReachHere(); + } + } + return cp; +} + +void BytecodeAssembler::append(u1 imm_u1) { + _code->append(imm_u1); +} + +void BytecodeAssembler::append(u2 imm_u2) { + _code->append(0); + _code->append(0); + Bytes::put_Java_u2(_code->adr_at(_code->length() - 2), imm_u2); +} + +void BytecodeAssembler::append(u4 imm_u4) { + _code->append(0); + _code->append(0); + _code->append(0); + _code->append(0); + Bytes::put_Java_u4(_code->adr_at(_code->length() - 4), imm_u4); +} + +void BytecodeAssembler::xload(u4 index, u1 onebyteop, u1 twobyteop) { + if (index < 4) { + _code->append(onebyteop + index); + } else { + _code->append(twobyteop); + _code->append((u2)index); + } +} + +void BytecodeAssembler::dup() { + _code->append(Bytecodes::_dup); +} + +void BytecodeAssembler::_new(Symbol* sym) { + u2 cpool_index = _cp->klass(sym); + _code->append(Bytecodes::_new); + append(cpool_index); +} + +void BytecodeAssembler::load_string(Symbol* sym) { + u2 cpool_index = _cp->string(sym); + if (cpool_index < 0x100) { + ldc(cpool_index); + } else { + ldc_w(cpool_index); + } +} + +void BytecodeAssembler::ldc(u1 index) { + _code->append(Bytecodes::_ldc); + append(index); +} + +void BytecodeAssembler::ldc_w(u2 index) { + _code->append(Bytecodes::_ldc_w); + append(index); +} + +void BytecodeAssembler::athrow() { + _code->append(Bytecodes::_athrow); +} + +void BytecodeAssembler::iload(u4 index) { + xload(index, Bytecodes::_iload_0, Bytecodes::_iload); +} + +void BytecodeAssembler::lload(u4 index) { + xload(index, Bytecodes::_lload_0, Bytecodes::_lload); +} + +void BytecodeAssembler::fload(u4 index) { + xload(index, Bytecodes::_fload_0, Bytecodes::_fload); +} + +void BytecodeAssembler::dload(u4 index) { + xload(index, Bytecodes::_dload_0, Bytecodes::_dload); +} + +void BytecodeAssembler::aload(u4 index) { + xload(index, Bytecodes::_aload_0, Bytecodes::_aload); +} + +void BytecodeAssembler::load(BasicType bt, u4 index) { + switch (bt) { + case T_BOOLEAN: + case T_CHAR: + case T_BYTE: + case T_SHORT: + case T_INT: iload(index); break; + case T_FLOAT: fload(index); break; + case T_DOUBLE: dload(index); break; + case T_LONG: lload(index); break; + case T_OBJECT: + case T_ARRAY: aload(index); break; + default: + ShouldNotReachHere(); + } +} + +void BytecodeAssembler::checkcast(Symbol* sym) { + u2 cpool_index = _cp->klass(sym); + _code->append(Bytecodes::_checkcast); + append(cpool_index); +} + +void BytecodeAssembler::invokespecial(Method* method) { + invokespecial(method->klass_name(), method->name(), method->signature()); +} + +void BytecodeAssembler::invokespecial(Symbol* klss, Symbol* name, Symbol* sig) { + u2 methodref_index = _cp->methodref(klss, name, sig); + _code->append(Bytecodes::_invokespecial); + append(methodref_index); +} + +void BytecodeAssembler::invokevirtual(Method* method) { + invokevirtual(method->klass_name(), method->name(), method->signature()); +} + +void BytecodeAssembler::invokevirtual(Symbol* klss, Symbol* name, Symbol* sig) { + u2 methodref_index = _cp->methodref(klss, name, sig); + _code->append(Bytecodes::_invokevirtual); + append(methodref_index); +} + +void BytecodeAssembler::ireturn() { + _code->append(Bytecodes::_ireturn); +} + +void BytecodeAssembler::lreturn() { + _code->append(Bytecodes::_lreturn); +} + +void BytecodeAssembler::freturn() { + _code->append(Bytecodes::_freturn); +} + +void BytecodeAssembler::dreturn() { + _code->append(Bytecodes::_dreturn); +} + +void BytecodeAssembler::areturn() { + _code->append(Bytecodes::_areturn); +} + +void BytecodeAssembler::_return() { + _code->append(Bytecodes::_return); +} + +void BytecodeAssembler::_return(BasicType bt) { + switch (bt) { + case T_BOOLEAN: + case T_CHAR: + case T_BYTE: + case T_SHORT: + case T_INT: ireturn(); break; + case T_FLOAT: freturn(); break; + case T_DOUBLE: dreturn(); break; + case T_LONG: lreturn(); break; + case T_OBJECT: + case T_ARRAY: areturn(); break; + case T_VOID: _return(); break; + default: + ShouldNotReachHere(); + } +} diff --git a/hotspot/src/share/vm/classfile/bytecodeAssembler.hpp b/hotspot/src/share/vm/classfile/bytecodeAssembler.hpp new file mode 100644 index 00000000000..74301472a63 --- /dev/null +++ b/hotspot/src/share/vm/classfile/bytecodeAssembler.hpp @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CLASSFILE_BYTECODEASSEMBLER_HPP +#define SHARE_VM_CLASSFILE_BYTECODEASSEMBLER_HPP + +#include "memory/allocation.hpp" +#include "oops/method.hpp" +#include "oops/symbol.hpp" +#include "utilities/globalDefinitions.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/resourceHash.hpp" + + +/** + * Bytecode Assembler + * + * These classes are used to synthesize code for creating new methods from + * within the VM. This is only a partial implementation of an assembler; + * only the bytecodes that are needed by clients are implemented at this time. + * This is used during default method analysis to create overpass methods + * and add them to a call during parsing. Other uses (such as creating + * bridges) may come later. Any missing bytecodes can be implemented on an + * as-need basis. + */ + +class BytecodeBuffer : public GrowableArray { + public: + BytecodeBuffer() : GrowableArray(20) {} +}; + +// Entries in a yet-to-be-created constant pool. Limited types for now. +class BytecodeCPEntry VALUE_OBJ_CLASS_SPEC { + public: + enum tag { + ERROR_TAG, + UTF8, + KLASS, + STRING, + NAME_AND_TYPE, + METHODREF + }; + + u1 _tag; + union { + Symbol* utf8; + u2 klass; + u2 string; + struct { + u2 name_index; + u2 type_index; + } name_and_type; + struct { + u2 class_index; + u2 name_and_type_index; + } methodref; + uintptr_t hash; + } _u; + + BytecodeCPEntry() : _tag(ERROR_TAG) { _u.hash = 0; } + BytecodeCPEntry(u1 tag) : _tag(tag) { _u.hash = 0; } + + static BytecodeCPEntry utf8(Symbol* symbol) { + BytecodeCPEntry bcpe(UTF8); + bcpe._u.utf8 = symbol; + return bcpe; + } + + static BytecodeCPEntry klass(u2 index) { + BytecodeCPEntry bcpe(KLASS); + bcpe._u.klass = index; + return bcpe; + } + + static BytecodeCPEntry string(u2 index) { + BytecodeCPEntry bcpe(STRING); + bcpe._u.string = index; + return bcpe; + } + + static BytecodeCPEntry name_and_type(u2 name, u2 type) { + BytecodeCPEntry bcpe(NAME_AND_TYPE); + bcpe._u.name_and_type.name_index = name; + bcpe._u.name_and_type.type_index = type; + return bcpe; + } + + static BytecodeCPEntry methodref(u2 class_index, u2 nat) { + BytecodeCPEntry bcpe(METHODREF); + bcpe._u.methodref.class_index = class_index; + bcpe._u.methodref.name_and_type_index = nat; + return bcpe; + } + + static bool equals(BytecodeCPEntry const& e0, BytecodeCPEntry const& e1) { + return e0._tag == e1._tag && e0._u.hash == e1._u.hash; + } + + static unsigned hash(BytecodeCPEntry const& e0) { + return (unsigned)(e0._tag ^ e0._u.hash); + } +}; + +class BytecodeConstantPool : ResourceObj { + private: + typedef ResourceHashtable IndexHash; + + ConstantPool* _orig; + GrowableArray _entries; + IndexHash _indices; + + u2 find_or_add(BytecodeCPEntry const& bcpe); + + public: + + BytecodeConstantPool(ConstantPool* orig) : _orig(orig) {} + + BytecodeCPEntry const& at(u2 index) const { return _entries.at(index); } + + InstanceKlass* pool_holder() const { + return InstanceKlass::cast(_orig->pool_holder()); + } + + u2 utf8(Symbol* sym) { + return find_or_add(BytecodeCPEntry::utf8(sym)); + } + + u2 klass(Symbol* class_name) { + return find_or_add(BytecodeCPEntry::klass(utf8(class_name))); + } + + u2 string(Symbol* str) { + return find_or_add(BytecodeCPEntry::string(utf8(str))); + } + + u2 name_and_type(Symbol* name, Symbol* sig) { + return find_or_add(BytecodeCPEntry::name_and_type(utf8(name), utf8(sig))); + } + + u2 methodref(Symbol* class_name, Symbol* name, Symbol* sig) { + return find_or_add(BytecodeCPEntry::methodref( + klass(class_name), name_and_type(name, sig))); + } + + ConstantPool* create_constant_pool(TRAPS) const; +}; + +// Partial bytecode assembler - only what we need for creating +// overpass methods for default methods is implemented +class BytecodeAssembler : StackObj { + private: + BytecodeBuffer* _code; + BytecodeConstantPool* _cp; + + void append(u1 imm_u1); + void append(u2 imm_u2); + void append(u4 imm_u4); + + void xload(u4 index, u1 quick, u1 twobyte); + + public: + BytecodeAssembler(BytecodeBuffer* buffer, BytecodeConstantPool* cp) + : _code(buffer), _cp(cp) {} + + void aload(u4 index); + void areturn(); + void athrow(); + void checkcast(Symbol* sym); + void dload(u4 index); + void dreturn(); + void dup(); + void fload(u4 index); + void freturn(); + void iload(u4 index); + void invokespecial(Method* method); + void invokespecial(Symbol* cls, Symbol* name, Symbol* sig); + void invokevirtual(Method* method); + void invokevirtual(Symbol* cls, Symbol* name, Symbol* sig); + void ireturn(); + void ldc(u1 index); + void ldc_w(u2 index); + void lload(u4 index); + void lreturn(); + void _new(Symbol* sym); + void _return(); + + void load_string(Symbol* sym); + void load(BasicType bt, u4 index); + void _return(BasicType bt); +}; + +#endif // SHARE_VM_CLASSFILE_BYTECODEASSEMBLER_HPP diff --git a/hotspot/src/share/vm/classfile/classFileParser.cpp b/hotspot/src/share/vm/classfile/classFileParser.cpp index ae394e36e75..8ada34ab568 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.cpp +++ b/hotspot/src/share/vm/classfile/classFileParser.cpp @@ -27,6 +27,8 @@ #include "classfile/classLoader.hpp" #include "classfile/classLoaderData.hpp" #include "classfile/classLoaderData.inline.hpp" +#include "classfile/defaultMethods.hpp" +#include "classfile/genericSignatures.hpp" #include "classfile/javaClasses.hpp" #include "classfile/symbolTable.hpp" #include "classfile/systemDictionary.hpp" @@ -84,6 +86,9 @@ // - to check NameAndType_info signatures more aggressively #define JAVA_7_VERSION 51 +// Extension method support. +#define JAVA_8_VERSION 52 + void ClassFileParser::parse_constant_pool_entries(ClassLoaderData* loader_data, constantPoolHandle cp, int length, TRAPS) { // Use a local copy of ClassFileStream. It helps the C++ compiler to optimize @@ -785,6 +790,7 @@ Array* ClassFileParser::parse_interfaces(constantPoolHandle cp, ClassLoaderData* loader_data, Handle protection_domain, Symbol* class_name, + bool* has_default_methods, TRAPS) { ClassFileStream* cfs = stream(); assert(length > 0, "only called for length>0"); @@ -821,6 +827,9 @@ Array* ClassFileParser::parse_interfaces(constantPoolHandle cp, if (!Klass::cast(interf())->is_interface()) { THROW_MSG_(vmSymbols::java_lang_IncompatibleClassChangeError(), "Implementing class", NULL); } + if (InstanceKlass::cast(interf())->has_default_methods()) { + *has_default_methods = true; + } interfaces->at_put(index, interf()); } @@ -1928,7 +1937,8 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, if (method_attribute_name == vmSymbols::tag_code()) { // Parse Code attribute if (_need_verify) { - guarantee_property(!access_flags.is_native() && !access_flags.is_abstract(), + guarantee_property( + !access_flags.is_native() && !access_flags.is_abstract(), "Code attribute in native or abstract methods in class file %s", CHECK_(nullHandle)); } @@ -2125,7 +2135,9 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, runtime_visible_annotations_length = method_attribute_length; runtime_visible_annotations = cfs->get_u1_buffer(); assert(runtime_visible_annotations != NULL, "null visible annotations"); - parse_annotations(runtime_visible_annotations, runtime_visible_annotations_length, cp, &parsed_annotations, CHECK_(nullHandle)); + parse_annotations(runtime_visible_annotations, + runtime_visible_annotations_length, cp, &parsed_annotations, + CHECK_(nullHandle)); cfs->skip_u1(runtime_visible_annotations_length, CHECK_(nullHandle)); } else if (PreserveAllAnnotations && method_attribute_name == vmSymbols::tag_runtime_invisible_annotations()) { runtime_invisible_annotations_length = method_attribute_length; @@ -2169,12 +2181,10 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, } // All sizing information for a Method* is finally available, now create it - Method* m = Method::allocate(loader_data, code_length, access_flags, - linenumber_table_length, - total_lvt_length, - exception_table_length, - checked_exceptions_length, - CHECK_(nullHandle)); + Method* m = Method::allocate( + loader_data, code_length, access_flags, linenumber_table_length, + total_lvt_length, exception_table_length, checked_exceptions_length, + ConstMethod::NORMAL, CHECK_(nullHandle)); ClassLoadingService::add_class_method_size(m->size()*HeapWordSize); @@ -2204,7 +2214,6 @@ methodHandle ClassFileParser::parse_method(ClassLoaderData* loader_data, // Fill in code attribute information m->set_max_stack(max_stack); m->set_max_locals(max_locals); - m->constMethod()->set_stackmap_data(stackmap_data); // Copy byte codes @@ -2356,6 +2365,7 @@ Array* ClassFileParser::parse_methods(ClassLoaderData* loader_data, Array** methods_annotations, Array** methods_parameter_annotations, Array** methods_default_annotations, + bool* has_default_methods, TRAPS) { ClassFileStream* cfs = stream(); AnnotationArray* method_annotations = NULL; @@ -2382,6 +2392,10 @@ Array* ClassFileParser::parse_methods(ClassLoaderData* loader_data, if (method->is_final()) { *has_final_method = true; } + if (is_interface && !method->is_abstract() && !method->is_static()) { + // default method + *has_default_methods = true; + } methods->at_put(index, method()); if (*methods_annotations == NULL) { *methods_annotations = @@ -2907,6 +2921,34 @@ AnnotationArray* ClassFileParser::assemble_annotations(ClassLoaderData* loader_d } +#ifndef PRODUCT +static void parseAndPrintGenericSignatures( + instanceKlassHandle this_klass, TRAPS) { + assert(ParseAllGenericSignatures == true, "Shouldn't call otherwise"); + ResourceMark rm; + + if (this_klass->generic_signature() != NULL) { + using namespace generic; + ClassDescriptor* spec = ClassDescriptor::parse_generic_signature(this_klass(), CHECK); + + tty->print_cr("Parsing %s", this_klass->generic_signature()->as_C_string()); + spec->print_on(tty); + + for (int i = 0; i < this_klass->methods()->length(); ++i) { + Method* m = this_klass->methods()->at(i); + MethodDescriptor* method_spec = MethodDescriptor::parse_generic_signature(m, spec); + Symbol* sig = m->generic_signature(); + if (sig == NULL) { + sig = m->signature(); + } + tty->print_cr("Parsing %s", sig->as_C_string()); + method_spec->print_on(tty); + } + } +} +#endif // ndef PRODUCT + + instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, Handle class_loader, Handle protection_domain, @@ -2923,6 +2965,8 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, unsigned char *cached_class_file_bytes = NULL; jint cached_class_file_length; ClassLoaderData* loader_data = ClassLoaderData::class_loader_data(class_loader()); + bool has_default_methods = false; + ResourceMark rm(THREAD); ClassFileStream* cfs = stream(); // Timing @@ -3138,7 +3182,9 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, if (itfs_len == 0) { local_interfaces = Universe::the_empty_klass_array(); } else { - local_interfaces = parse_interfaces(cp, itfs_len, loader_data, protection_domain, _class_name, CHECK_(nullHandle)); + local_interfaces = parse_interfaces( + cp, itfs_len, loader_data, protection_domain, _class_name, + &has_default_methods, CHECK_(nullHandle)); } u2 java_fields_count = 0; @@ -3164,6 +3210,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, &methods_annotations, &methods_parameter_annotations, &methods_default_annotations, + &has_default_methods, CHECK_(nullHandle)); // Additional attributes @@ -3193,6 +3240,11 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, super_klass = instanceKlassHandle(THREAD, kh()); } if (super_klass.not_null()) { + + if (super_klass->has_default_methods()) { + has_default_methods = true; + } + if (super_klass->is_interface()) { ResourceMark rm(THREAD); Exceptions::fthrow( @@ -3229,14 +3281,11 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, int itable_size = 0; int num_miranda_methods = 0; - klassVtable::compute_vtable_size_and_num_mirandas(vtable_size, - num_miranda_methods, - super_klass(), - methods, - access_flags, - class_loader, - class_name, - local_interfaces, + GrowableArray all_mirandas(20); + + klassVtable::compute_vtable_size_and_num_mirandas( + &vtable_size, &num_miranda_methods, &all_mirandas, super_klass(), methods, + access_flags, class_loader, class_name, local_interfaces, CHECK_(nullHandle)); // Size of Java itable (in words) @@ -3656,6 +3705,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, this_klass->set_minor_version(minor_version); this_klass->set_major_version(major_version); + this_klass->set_has_default_methods(has_default_methods); // Set up Method*::intrinsic_id as soon as we know the names of methods. // (We used to do this lazily, but now we query it in Rewriter, @@ -3673,6 +3723,16 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, cached_class_file_length); } + // Fill in field values obtained by parse_classfile_attributes + if (parsed_annotations.has_any_annotations()) + parsed_annotations.apply_to(this_klass); + // Create annotations + if (_annotations != NULL && this_klass->annotations() == NULL) { + Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL); + this_klass->set_annotations(anno); + } + apply_parsed_class_attributes(this_klass); + // Miranda methods if ((num_miranda_methods > 0) || // if this class introduced new miranda methods or @@ -3682,18 +3742,6 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, this_klass->set_has_miranda_methods(); // then set a flag } - // Fill in field values obtained by parse_classfile_attributes - if (parsed_annotations.has_any_annotations()) { - parsed_annotations.apply_to(this_klass); - } - // Create annotations - if (_annotations != NULL && this_klass->annotations() == NULL) { - Annotations* anno = Annotations::allocate(loader_data, CHECK_NULL); - this_klass->set_annotations(anno); - } - apply_parsed_class_attributes(this_klass); - - // Compute transitive closure of interfaces this class implements this_klass->set_transitive_interfaces(transitive_interfaces); // Fill in information needed to compute superclasses. @@ -3702,6 +3750,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, // Initialize itable offset tables klassItable::setup_itable_offset_table(this_klass); + // Compute transitive closure of interfaces this class implements // Do final class setup fill_oop_maps(this_klass, nonstatic_oop_map_count, nonstatic_oop_offsets, nonstatic_oop_counts); @@ -3726,6 +3775,21 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, check_illegal_static_method(this_klass, CHECK_(nullHandle)); } + +#ifdef ASSERT + if (ParseAllGenericSignatures) { + parseAndPrintGenericSignatures(this_klass, CHECK_(nullHandle)); + } +#endif + + // Generate any default methods - default methods are interface methods + // that have a default implementation. This is new with Lambda project. + if (has_default_methods && !access_flags.is_interface() && + local_interfaces->length() > 0) { + DefaultMethods::generate_default_methods( + this_klass(), &all_mirandas, CHECK_(nullHandle)); + } + // Allocate mirror and initialize static fields java_lang_Class::create_mirror(this_klass, CHECK_(nullHandle)); @@ -3744,6 +3808,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, false /* not shared class */); if (TraceClassLoading) { + ResourceMark rm; // print in a single call to reduce interleaving of output if (cfs->source() != NULL) { tty->print("[Loaded %s from %s]\n", this_klass->external_name(), @@ -3758,13 +3823,13 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, tty->print("[Loaded %s]\n", this_klass->external_name()); } } else { - ResourceMark rm; tty->print("[Loaded %s from %s]\n", this_klass->external_name(), InstanceKlass::cast(class_loader->klass())->external_name()); } } if (TraceClassResolution) { + ResourceMark rm; // print out the superclass. const char * from = Klass::cast(this_klass())->external_name(); if (this_klass->java_super() != NULL) { @@ -3785,6 +3850,7 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, #ifndef PRODUCT if( PrintCompactFieldsSavings ) { + ResourceMark rm; if( nonstatic_field_size < orig_nonstatic_field_size ) { tty->print("[Saved %d of %d bytes in %s]\n", (orig_nonstatic_field_size - nonstatic_field_size)*heapOopSize, @@ -3811,7 +3877,6 @@ instanceKlassHandle ClassFileParser::parseClassFile(Symbol* name, return this_klass; } - unsigned int ClassFileParser::compute_oop_map_count(instanceKlassHandle super, unsigned int nonstatic_oop_map_count, @@ -4128,7 +4193,7 @@ void ClassFileParser::check_final_method_override(instanceKlassHandle this_klass } // continue to look from super_m's holder's super. - k = InstanceKlass::cast(super_m->method_holder())->super(); + k = super_m->method_holder()->super(); continue; } @@ -4263,13 +4328,16 @@ void ClassFileParser::verify_legal_method_modifiers( const bool is_strict = (flags & JVM_ACC_STRICT) != 0; const bool is_synchronized = (flags & JVM_ACC_SYNCHRONIZED) != 0; const bool major_gte_15 = _major_version >= JAVA_1_5_VERSION; + const bool major_gte_8 = _major_version >= JAVA_8_VERSION; const bool is_initializer = (name == vmSymbols::object_initializer_name()); bool is_illegal = false; if (is_interface) { - if (!is_abstract || !is_public || is_static || is_final || - is_native || (major_gte_15 && (is_synchronized || is_strict))) { + if (!is_public || is_static || is_final || is_native || + ((is_synchronized || is_strict) && major_gte_15 && + (!major_gte_8 || is_abstract)) || + (!major_gte_8 && !is_abstract)) { is_illegal = true; } } else { // not interface diff --git a/hotspot/src/share/vm/classfile/classFileParser.hpp b/hotspot/src/share/vm/classfile/classFileParser.hpp index c6c4a089c1b..8fa1404cf48 100644 --- a/hotspot/src/share/vm/classfile/classFileParser.hpp +++ b/hotspot/src/share/vm/classfile/classFileParser.hpp @@ -151,6 +151,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { ClassLoaderData* loader_data, Handle protection_domain, Symbol* class_name, + bool* has_default_methods, TRAPS); void record_defined_class_dependencies(instanceKlassHandle defined_klass, TRAPS); @@ -188,6 +189,7 @@ class ClassFileParser VALUE_OBJ_CLASS_SPEC { Array** methods_annotations, Array** methods_parameter_annotations, Array** methods_default_annotations, + bool* has_default_method, TRAPS); Array* sort_methods(ClassLoaderData* loader_data, Array* methods, diff --git a/hotspot/src/share/vm/classfile/defaultMethods.cpp b/hotspot/src/share/vm/classfile/defaultMethods.cpp new file mode 100644 index 00000000000..9ac1bef7a31 --- /dev/null +++ b/hotspot/src/share/vm/classfile/defaultMethods.cpp @@ -0,0 +1,1387 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "classfile/bytecodeAssembler.hpp" +#include "classfile/defaultMethods.hpp" +#include "classfile/genericSignatures.hpp" +#include "classfile/symbolTable.hpp" +#include "memory/allocation.hpp" +#include "memory/metadataFactory.hpp" +#include "memory/resourceArea.hpp" +#include "runtime/signature.hpp" +#include "runtime/thread.hpp" +#include "oops/instanceKlass.hpp" +#include "oops/klass.hpp" +#include "oops/method.hpp" +#include "utilities/accessFlags.hpp" +#include "utilities/exceptions.hpp" +#include "utilities/ostream.hpp" +#include "utilities/pair.hpp" +#include "utilities/resourceHash.hpp" + +typedef enum { QUALIFIED, DISQUALIFIED } QualifiedState; + +// Because we use an iterative algorithm when iterating over the type +// hierarchy, we can't use traditional scoped objects which automatically do +// cleanup in the destructor when the scope is exited. PseudoScope (and +// PseudoScopeMark) provides a similar functionality, but for when you want a +// scoped object in non-stack memory (such as in resource memory, as we do +// here). You've just got to remember to call 'destroy()' on the scope when +// leaving it (and marks have to be explicitly added). +class PseudoScopeMark : public ResourceObj { + public: + virtual void destroy() = 0; +}; + +class PseudoScope : public ResourceObj { + private: + GrowableArray _marks; + public: + + static PseudoScope* cast(void* data) { + return static_cast(data); + } + + void add_mark(PseudoScopeMark* psm) { + _marks.append(psm); + } + + void destroy() { + for (int i = 0; i < _marks.length(); ++i) { + _marks.at(i)->destroy(); + } + } +}; + +class ContextMark : public PseudoScopeMark { + private: + generic::Context::Mark _mark; + public: + ContextMark(const generic::Context::Mark& cm) : _mark(cm) {} + virtual void destroy() { _mark.destroy(); } +}; + +#ifndef PRODUCT +static void print_slot(outputStream* str, Symbol* name, Symbol* signature) { + ResourceMark rm; + str->print("%s%s", name->as_C_string(), signature->as_C_string()); +} + +static void print_method(outputStream* str, Method* mo, bool with_class=true) { + ResourceMark rm; + if (with_class) { + str->print("%s.", mo->klass_name()->as_C_string()); + } + print_slot(str, mo->name(), mo->signature()); +} +#endif // ndef PRODUCT + +/** + * Perform a depth-first iteration over the class hierarchy, applying + * algorithmic logic as it goes. + * + * This class is one half of the inheritance hierarchy analysis mechanism. + * It is meant to be used in conjunction with another class, the algorithm, + * which is indicated by the ALGO template parameter. This class can be + * paired with any algorithm class that provides the required methods. + * + * This class contains all the mechanics for iterating over the class hierarchy + * starting at a particular root, without recursing (thus limiting stack growth + * from this point). It visits each superclass (if present) and superinterface + * in a depth-first manner, with callbacks to the ALGO class as each class is + * encountered (visit()), The algorithm can cut-off further exploration of a + * particular branch by returning 'false' from a visit() call. + * + * The ALGO class, must provide a visit() method, which each of which will be + * called once for each node in the inheritance tree during the iteration. In + * addition, it can provide a memory block via new_node_data(InstanceKlass*), + * which it can use for node-specific storage (and access via the + * current_data() and data_at_depth(int) methods). + * + * Bare minimum needed to be an ALGO class: + * class Algo : public HierarchyVisitor { + * void* new_node_data(InstanceKlass* cls) { return NULL; } + * void free_node_data(void* data) { return; } + * bool visit() { return true; } + * }; + */ +template +class HierarchyVisitor : StackObj { + private: + + class Node : public ResourceObj { + public: + InstanceKlass* _class; + bool _super_was_visited; + int _interface_index; + void* _algorithm_data; + + Node(InstanceKlass* cls, void* data, bool visit_super) + : _class(cls), _super_was_visited(!visit_super), + _interface_index(0), _algorithm_data(data) {} + + int number_of_interfaces() { return _class->local_interfaces()->length(); } + int interface_index() { return _interface_index; } + void set_super_visited() { _super_was_visited = true; } + void increment_visited_interface() { ++_interface_index; } + void set_all_interfaces_visited() { + _interface_index = number_of_interfaces(); + } + bool has_visited_super() { return _super_was_visited; } + bool has_visited_all_interfaces() { + return interface_index() >= number_of_interfaces(); + } + InstanceKlass* interface_at(int index) { + return InstanceKlass::cast(_class->local_interfaces()->at(index)); + } + InstanceKlass* next_super() { return _class->java_super(); } + InstanceKlass* next_interface() { + return interface_at(interface_index()); + } + }; + + bool _cancelled; + GrowableArray _path; + + Node* current_top() const { return _path.top(); } + bool has_more_nodes() const { return !_path.is_empty(); } + void push(InstanceKlass* cls, void* data) { + assert(cls != NULL, "Requires a valid instance class"); + Node* node = new Node(cls, data, has_super(cls)); + _path.push(node); + } + void pop() { _path.pop(); } + + void reset_iteration() { + _cancelled = false; + _path.clear(); + } + bool is_cancelled() const { return _cancelled; } + + static bool has_super(InstanceKlass* cls) { + return cls->super() != NULL && !cls->is_interface(); + } + + Node* node_at_depth(int i) const { + return (i >= _path.length()) ? NULL : _path.at(_path.length() - i - 1); + } + + protected: + + // Accessors available to the algorithm + int current_depth() const { return _path.length() - 1; } + + InstanceKlass* class_at_depth(int i) { + Node* n = node_at_depth(i); + return n == NULL ? NULL : n->_class; + } + InstanceKlass* current_class() { return class_at_depth(0); } + + void* data_at_depth(int i) { + Node* n = node_at_depth(i); + return n == NULL ? NULL : n->_algorithm_data; + } + void* current_data() { return data_at_depth(0); } + + void cancel_iteration() { _cancelled = true; } + + public: + + void run(InstanceKlass* root) { + ALGO* algo = static_cast(this); + + reset_iteration(); + + void* algo_data = algo->new_node_data(root); + push(root, algo_data); + bool top_needs_visit = true; + + do { + Node* top = current_top(); + if (top_needs_visit) { + if (algo->visit() == false) { + // algorithm does not want to continue along this path. Arrange + // it so that this state is immediately popped off the stack + top->set_super_visited(); + top->set_all_interfaces_visited(); + } + top_needs_visit = false; + } + + if (top->has_visited_super() && top->has_visited_all_interfaces()) { + algo->free_node_data(top->_algorithm_data); + pop(); + } else { + InstanceKlass* next = NULL; + if (top->has_visited_super() == false) { + next = top->next_super(); + top->set_super_visited(); + } else { + next = top->next_interface(); + top->increment_visited_interface(); + } + assert(next != NULL, "Otherwise we shouldn't be here"); + algo_data = algo->new_node_data(next); + push(next, algo_data); + top_needs_visit = true; + } + } while (!is_cancelled() && has_more_nodes()); + } +}; + +#ifndef PRODUCT +class PrintHierarchy : public HierarchyVisitor { + public: + + bool visit() { + InstanceKlass* cls = current_class(); + streamIndentor si(tty, current_depth() * 2); + tty->indent().print_cr("%s", cls->name()->as_C_string()); + return true; + } + + void* new_node_data(InstanceKlass* cls) { return NULL; } + void free_node_data(void* data) { return; } +}; +#endif // ndef PRODUCT + +// Used to register InstanceKlass objects and all related metadata structures +// (Methods, ConstantPools) as "in-use" by the current thread so that they can't +// be deallocated by class redefinition while we're using them. The classes are +// de-registered when this goes out of scope. +// +// Once a class is registered, we need not bother with methodHandles or +// constantPoolHandles for it's associated metadata. +class KeepAliveRegistrar : public StackObj { + private: + Thread* _thread; + GrowableArray _keep_alive; + + public: + KeepAliveRegistrar(Thread* thread) : _thread(thread), _keep_alive(20) { + assert(thread == Thread::current(), "Must be current thread"); + } + + ~KeepAliveRegistrar() { + for (int i = _keep_alive.length() - 1; i >= 0; --i) { + ConstantPool* cp = _keep_alive.at(i); + int idx = _thread->metadata_handles()->find_from_end(cp); + assert(idx > 0, "Must be in the list"); + _thread->metadata_handles()->remove_at(idx); + } + } + + // Register a class as 'in-use' by the thread. It's fine to register a class + // multiple times (though perhaps inefficient) + void register_class(InstanceKlass* ik) { + ConstantPool* cp = ik->constants(); + _keep_alive.push(cp); + _thread->metadata_handles()->push(cp); + } +}; + +class KeepAliveVisitor : public HierarchyVisitor { + private: + KeepAliveRegistrar* _registrar; + + public: + KeepAliveVisitor(KeepAliveRegistrar* registrar) : _registrar(registrar) {} + + void* new_node_data(InstanceKlass* cls) { return NULL; } + void free_node_data(void* data) { return; } + + bool visit() { + _registrar->register_class(current_class()); + return true; + } +}; + +// A method family contains a set of all methods that implement a single +// language-level method. Because of erasure, these methods may have different +// signatures. As members of the set are collected while walking over the +// hierarchy, they are tagged with a qualification state. The qualification +// state for an erased method is set to disqualified if there exists a path +// from the root of hierarchy to the method that contains an interleaving +// language-equivalent method defined in an interface. +class MethodFamily : public ResourceObj { + private: + + generic::MethodDescriptor* _descriptor; // language-level description + GrowableArray > _members; + ResourceHashtable _member_index; + + Method* _selected_target; // Filled in later, if a unique target exists + Symbol* _exception_message; // If no unique target is found + + bool contains_method(Method* method) { + int* lookup = _member_index.get(method); + return lookup != NULL; + } + + void add_method(Method* method, QualifiedState state) { + Pair entry(method, state); + _member_index.put(method, _members.length()); + _members.append(entry); + } + + void disqualify_method(Method* method) { + int* index = _member_index.get(method); + assert(index != NULL && *index >= 0 && *index < _members.length(), "bad index"); + _members.at(*index).second = DISQUALIFIED; + } + + Symbol* generate_no_defaults_message(TRAPS) const; + Symbol* generate_abstract_method_message(Method* method, TRAPS) const; + Symbol* generate_conflicts_message(GrowableArray* methods, TRAPS) const; + + public: + + MethodFamily(generic::MethodDescriptor* canonical_desc) + : _descriptor(canonical_desc), _selected_target(NULL), + _exception_message(NULL) {} + + generic::MethodDescriptor* descriptor() const { return _descriptor; } + + bool descriptor_matches(generic::MethodDescriptor* md, generic::Context* ctx) { + return descriptor()->covariant_match(md, ctx); + } + + void set_target_if_empty(Method* m) { + if (_selected_target == NULL && !m->is_overpass()) { + _selected_target = m; + } + } + + void record_qualified_method(Method* m) { + // If the method already exists in the set as qualified, this operation is + // redundant. If it already exists as disqualified, then we leave it as + // disqualfied. Thus we only add to the set if it's not already in the + // set. + if (!contains_method(m)) { + add_method(m, QUALIFIED); + } + } + + void record_disqualified_method(Method* m) { + // If not in the set, add it as disqualified. If it's already in the set, + // then set the state to disqualified no matter what the previous state was. + if (!contains_method(m)) { + add_method(m, DISQUALIFIED); + } else { + disqualify_method(m); + } + } + + bool has_target() const { return _selected_target != NULL; } + bool throws_exception() { return _exception_message != NULL; } + + Method* get_selected_target() { return _selected_target; } + Symbol* get_exception_message() { return _exception_message; } + + // Either sets the target or the exception error message + void determine_target(InstanceKlass* root, TRAPS) { + if (has_target() || throws_exception()) { + return; + } + + GrowableArray qualified_methods; + for (int i = 0; i < _members.length(); ++i) { + Pair entry = _members.at(i); + if (entry.second == QUALIFIED) { + qualified_methods.append(entry.first); + } + } + + if (qualified_methods.length() == 0) { + _exception_message = generate_no_defaults_message(CHECK); + } else if (qualified_methods.length() == 1) { + Method* method = qualified_methods.at(0); + if (method->is_abstract()) { + _exception_message = generate_abstract_method_message(method, CHECK); + } else { + _selected_target = qualified_methods.at(0); + } + } else { + _exception_message = generate_conflicts_message(&qualified_methods,CHECK); + } + + assert((has_target() ^ throws_exception()) == 1, + "One and only one must be true"); + } + + bool contains_signature(Symbol* query) { + for (int i = 0; i < _members.length(); ++i) { + if (query == _members.at(i).first->signature()) { + return true; + } + } + return false; + } + +#ifndef PRODUCT + void print_on(outputStream* str) const { + print_on(str, 0); + } + + void print_on(outputStream* str, int indent) const { + streamIndentor si(str, indent * 2); + + generic::Context ctx(NULL); // empty, as _descriptor already canonicalized + TempNewSymbol family = descriptor()->reify_signature(&ctx, Thread::current()); + str->indent().print_cr("Logical Method %s:", family->as_C_string()); + + streamIndentor si2(str); + for (int i = 0; i < _members.length(); ++i) { + str->indent(); + print_method(str, _members.at(i).first); + if (_members.at(i).second == DISQUALIFIED) { + str->print(" (disqualified)"); + } + str->print_cr(""); + } + + if (_selected_target != NULL) { + print_selected(str, 1); + } + } + + void print_selected(outputStream* str, int indent) const { + assert(has_target(), "Should be called otherwise"); + streamIndentor si(str, indent * 2); + str->indent().print("Selected method: "); + print_method(str, _selected_target); + str->print_cr(""); + } + + void print_exception(outputStream* str, int indent) { + assert(throws_exception(), "Should be called otherwise"); + streamIndentor si(str, indent * 2); + str->indent().print_cr("%s", _exception_message->as_C_string()); + } +#endif // ndef PRODUCT +}; + +Symbol* MethodFamily::generate_no_defaults_message(TRAPS) const { + return SymbolTable::new_symbol("No qualifying defaults found", CHECK_NULL); +} + +Symbol* MethodFamily::generate_abstract_method_message(Method* method, TRAPS) const { + Symbol* klass = method->klass_name(); + Symbol* name = method->name(); + Symbol* sig = method->signature(); + stringStream ss; + ss.print("Method "); + ss.write((const char*)klass->bytes(), klass->utf8_length()); + ss.print("."); + ss.write((const char*)name->bytes(), name->utf8_length()); + ss.write((const char*)sig->bytes(), sig->utf8_length()); + ss.print(" is abstract"); + return SymbolTable::new_symbol(ss.base(), (int)ss.size(), CHECK_NULL); +} + +Symbol* MethodFamily::generate_conflicts_message(GrowableArray* methods, TRAPS) const { + stringStream ss; + ss.print("Conflicting default methods:"); + for (int i = 0; i < methods->length(); ++i) { + Method* method = methods->at(i); + Symbol* klass = method->klass_name(); + Symbol* name = method->name(); + ss.print(" "); + ss.write((const char*)klass->bytes(), klass->utf8_length()); + ss.print("."); + ss.write((const char*)name->bytes(), name->utf8_length()); + } + return SymbolTable::new_symbol(ss.base(), (int)ss.size(), CHECK_NULL); +} + +class StateRestorer; + +// StatefulMethodFamily is a wrapper around MethodFamily that maintains the +// qualification state during hierarchy visitation, and applies that state +// when adding members to the MethodFamily. +class StatefulMethodFamily : public ResourceObj { + friend class StateRestorer; + private: + MethodFamily* _method; + QualifiedState _qualification_state; + + void set_qualification_state(QualifiedState state) { + _qualification_state = state; + } + + public: + StatefulMethodFamily(generic::MethodDescriptor* md, generic::Context* ctx) { + _method = new MethodFamily(md->canonicalize(ctx)); + _qualification_state = QUALIFIED; + } + + void set_target_if_empty(Method* m) { _method->set_target_if_empty(m); } + + MethodFamily* get_method_family() { return _method; } + + bool descriptor_matches(generic::MethodDescriptor* md, generic::Context* ctx) { + return _method->descriptor_matches(md, ctx); + } + + StateRestorer* record_method_and_dq_further(Method* mo); +}; + +class StateRestorer : public PseudoScopeMark { + private: + StatefulMethodFamily* _method; + QualifiedState _state_to_restore; + public: + StateRestorer(StatefulMethodFamily* dm, QualifiedState state) + : _method(dm), _state_to_restore(state) {} + ~StateRestorer() { destroy(); } + void restore_state() { _method->set_qualification_state(_state_to_restore); } + virtual void destroy() { restore_state(); } +}; + +StateRestorer* StatefulMethodFamily::record_method_and_dq_further(Method* mo) { + StateRestorer* mark = new StateRestorer(this, _qualification_state); + if (_qualification_state == QUALIFIED) { + _method->record_qualified_method(mo); + } else { + _method->record_disqualified_method(mo); + } + // Everything found "above"??? this method in the hierarchy walk is set to + // disqualified + set_qualification_state(DISQUALIFIED); + return mark; +} + +class StatefulMethodFamilies : public ResourceObj { + private: + GrowableArray _methods; + + public: + StatefulMethodFamily* find_matching( + generic::MethodDescriptor* md, generic::Context* ctx) { + for (int i = 0; i < _methods.length(); ++i) { + StatefulMethodFamily* existing = _methods.at(i); + if (existing->descriptor_matches(md, ctx)) { + return existing; + } + } + return NULL; + } + + StatefulMethodFamily* find_matching_or_create( + generic::MethodDescriptor* md, generic::Context* ctx) { + StatefulMethodFamily* method = find_matching(md, ctx); + if (method == NULL) { + method = new StatefulMethodFamily(md, ctx); + _methods.append(method); + } + return method; + } + + void extract_families_into(GrowableArray* array) { + for (int i = 0; i < _methods.length(); ++i) { + array->append(_methods.at(i)->get_method_family()); + } + } +}; + +// Represents a location corresponding to a vtable slot for methods that +// neither the class nor any of it's ancestors provide an implementaion. +// Default methods may be present to fill this slot. +class EmptyVtableSlot : public ResourceObj { + private: + Symbol* _name; + Symbol* _signature; + int _size_of_parameters; + MethodFamily* _binding; + + public: + EmptyVtableSlot(Method* method) + : _name(method->name()), _signature(method->signature()), + _size_of_parameters(method->size_of_parameters()), _binding(NULL) {} + + Symbol* name() const { return _name; } + Symbol* signature() const { return _signature; } + int size_of_parameters() const { return _size_of_parameters; } + + void bind_family(MethodFamily* lm) { _binding = lm; } + bool is_bound() { return _binding != NULL; } + MethodFamily* get_binding() { return _binding; } + +#ifndef PRODUCT + void print_on(outputStream* str) const { + print_slot(str, name(), signature()); + } +#endif // ndef PRODUCT +}; + +static GrowableArray* find_empty_vtable_slots( + InstanceKlass* klass, GrowableArray* mirandas, TRAPS) { + + assert(klass != NULL, "Must be valid class"); + + GrowableArray* slots = new GrowableArray(); + + // All miranda methods are obvious candidates + for (int i = 0; i < mirandas->length(); ++i) { + EmptyVtableSlot* slot = new EmptyVtableSlot(mirandas->at(i)); + slots->append(slot); + } + + // Also any overpasses in our superclasses, that we haven't implemented. + // (can't use the vtable because it is not guaranteed to be initialized yet) + InstanceKlass* super = klass->java_super(); + while (super != NULL) { + for (int i = 0; i < super->methods()->length(); ++i) { + Method* m = super->methods()->at(i); + if (m->is_overpass()) { + // m is a method that would have been a miranda if not for the + // default method processing that occurred on behalf of our superclass, + // so it's a method we want to re-examine in this new context. That is, + // unless we have a real implementation of it in the current class. + Method* impl = klass->lookup_method(m->name(), m->signature()); + if (impl == NULL || impl->is_overpass()) { + slots->append(new EmptyVtableSlot(m)); + } + } + } + super = super->java_super(); + } + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Slots that need filling:"); + streamIndentor si(tty); + for (int i = 0; i < slots->length(); ++i) { + tty->indent(); + slots->at(i)->print_on(tty); + tty->print_cr(""); + } + } +#endif // ndef PRODUCT + return slots; +} + +// Iterates over the type hierarchy looking for all methods with a specific +// method name. The result of this is a set of method families each of +// which is populated with a set of methods that implement the same +// language-level signature. +class FindMethodsByName : public HierarchyVisitor { + private: + // Context data + Thread* THREAD; + generic::DescriptorCache* _cache; + Symbol* _method_name; + generic::Context* _ctx; + StatefulMethodFamilies _families; + + public: + + FindMethodsByName(generic::DescriptorCache* cache, Symbol* name, + generic::Context* ctx, Thread* thread) : + _cache(cache), _method_name(name), _ctx(ctx), THREAD(thread) {} + + void get_discovered_families(GrowableArray* methods) { + _families.extract_families_into(methods); + } + + void* new_node_data(InstanceKlass* cls) { return new PseudoScope(); } + void free_node_data(void* node_data) { + PseudoScope::cast(node_data)->destroy(); + } + + bool visit() { + PseudoScope* scope = PseudoScope::cast(current_data()); + InstanceKlass* klass = current_class(); + InstanceKlass* sub = current_depth() > 0 ? class_at_depth(1) : NULL; + + ContextMark* cm = new ContextMark(_ctx->mark()); + scope->add_mark(cm); // will restore context when scope is freed + + _ctx->apply_type_arguments(sub, klass, THREAD); + + int start, end = 0; + start = klass->find_method_by_name(_method_name, &end); + if (start != -1) { + for (int i = start; i < end; ++i) { + Method* m = klass->methods()->at(i); + // This gets the method's parameter list with its generic type + // parameters resolved + generic::MethodDescriptor* md = _cache->descriptor_for(m, THREAD); + + // Find all methods on this hierarchy that match this method + // (name, signature). This class collects other families of this + // method name. + StatefulMethodFamily* family = + _families.find_matching_or_create(md, _ctx); + + if (klass->is_interface()) { + // ??? + StateRestorer* restorer = family->record_method_and_dq_further(m); + scope->add_mark(restorer); + } else { + // This is the rule that methods in classes "win" (bad word) over + // methods in interfaces. This works because of single inheritance + family->set_target_if_empty(m); + } + } + } + return true; + } +}; + +#ifndef PRODUCT +static void print_families( + GrowableArray* methods, Symbol* match) { + streamIndentor si(tty, 4); + if (methods->length() == 0) { + tty->indent(); + tty->print_cr("No Logical Method found"); + } + for (int i = 0; i < methods->length(); ++i) { + tty->indent(); + MethodFamily* lm = methods->at(i); + if (lm->contains_signature(match)) { + tty->print_cr(""); + } else { + tty->print_cr(""); + } + lm->print_on(tty, 1); + } +} +#endif // ndef PRODUCT + +static void merge_in_new_methods(InstanceKlass* klass, + GrowableArray* new_methods, TRAPS); +static void create_overpasses( + GrowableArray* slots, InstanceKlass* klass, TRAPS); + +// This is the guts of the default methods implementation. This is called just +// after the classfile has been parsed if some ancestor has default methods. +// +// First if finds any name/signature slots that need any implementation (either +// because they are miranda or a superclass's implementation is an overpass +// itself). For each slot, iterate over the hierarchy, using generic signature +// information to partition any methods that match the name into method families +// where each family contains methods whose signatures are equivalent at the +// language level (i.e., their reified parameters match and return values are +// covariant). Check those sets to see if they contain a signature that matches +// the slot we're looking at (if we're lucky, there might be other empty slots +// that we can fill using the same analysis). +// +// For each slot filled, we generate an overpass method that either calls the +// unique default method candidate using invokespecial, or throws an exception +// (in the case of no default method candidates, or more than one valid +// candidate). These methods are then added to the class's method list. If +// the method set we're using contains methods (qualified or not) with a +// different runtime signature than the method we're creating, then we have to +// create bridges with those signatures too. +void DefaultMethods::generate_default_methods( + InstanceKlass* klass, GrowableArray* mirandas, TRAPS) { + + // This resource mark is the bound for all memory allocation that takes + // place during default method processing. After this goes out of scope, + // all (Resource) objects' memory will be reclaimed. Be careful if adding an + // embedded resource mark under here as that memory can't be used outside + // whatever scope it's in. + ResourceMark rm(THREAD); + + generic::DescriptorCache cache; + + // Keep entire hierarchy alive for the duration of the computation + KeepAliveRegistrar keepAlive(THREAD); + KeepAliveVisitor loadKeepAlive(&keepAlive); + loadKeepAlive.run(klass); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + ResourceMark rm; // be careful with these! + tty->print_cr("Class %s requires default method processing", + klass->name()->as_klass_external_name()); + PrintHierarchy printer; + printer.run(klass); + } +#endif // ndef PRODUCT + + GrowableArray* empty_slots = + find_empty_vtable_slots(klass, mirandas, CHECK); + + for (int i = 0; i < empty_slots->length(); ++i) { + EmptyVtableSlot* slot = empty_slots->at(i); +#ifndef PRODUCT + if (TraceDefaultMethods) { + streamIndentor si(tty, 2); + tty->indent().print("Looking for default methods for slot "); + slot->print_on(tty); + tty->print_cr(""); + } +#endif // ndef PRODUCT + if (slot->is_bound()) { +#ifndef PRODUCT + if (TraceDefaultMethods) { + streamIndentor si(tty, 4); + tty->indent().print_cr("Already bound to logical method:"); + slot->get_binding()->print_on(tty, 1); + } +#endif // ndef PRODUCT + continue; // covered by previous processing + } + + generic::Context ctx(&cache); + FindMethodsByName visitor(&cache, slot->name(), &ctx, CHECK); + visitor.run(klass); + + GrowableArray discovered_families; + visitor.get_discovered_families(&discovered_families); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + print_families(&discovered_families, slot->signature()); + } +#endif // ndef PRODUCT + + // Find and populate any other slots that match the discovered families + for (int j = i; j < empty_slots->length(); ++j) { + EmptyVtableSlot* open_slot = empty_slots->at(j); + + if (slot->name() == open_slot->name()) { + for (int k = 0; k < discovered_families.length(); ++k) { + MethodFamily* lm = discovered_families.at(k); + + if (lm->contains_signature(open_slot->signature())) { + lm->determine_target(klass, CHECK); + open_slot->bind_family(lm); + } + } + } + } + } + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Creating overpasses..."); + } +#endif // ndef PRODUCT + + create_overpasses(empty_slots, klass, CHECK); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Default method processing complete"); + } +#endif // ndef PRODUCT +} + + +/** + * Generic analysis was used upon interface '_target' and found a unique + * default method candidate with generic signature '_method_desc'. This + * method is only viable if it would also be in the set of default method + * candidates if we ran a full analysis on the current class. + * + * The only reason that the method would not be in the set of candidates for + * the current class is if that there's another covariantly matching method + * which is "more specific" than the found method -- i.e., one could find a + * path in the interface hierarchy in which the matching method appears + * before we get to '_target'. + * + * In order to determine this, we examine all of the implemented + * interfaces. If we find path that leads to the '_target' interface, then + * we examine that path to see if there are any methods that would shadow + * the selected method along that path. + */ +class ShadowChecker : public HierarchyVisitor { + private: + generic::DescriptorCache* _cache; + Thread* THREAD; + + InstanceKlass* _target; + + Symbol* _method_name; + InstanceKlass* _method_holder; + generic::MethodDescriptor* _method_desc; + bool _found_shadow; + + bool path_has_shadow() { + generic::Context ctx(_cache); + + for (int i = current_depth() - 1; i > 0; --i) { + InstanceKlass* ik = class_at_depth(i); + InstanceKlass* sub = class_at_depth(i + 1); + ctx.apply_type_arguments(sub, ik, THREAD); + + if (ik->is_interface()) { + int end; + int start = ik->find_method_by_name(_method_name, &end); + if (start != -1) { + for (int j = start; j < end; ++j) { + Method* mo = ik->methods()->at(j); + generic::MethodDescriptor* md = _cache->descriptor_for(mo, THREAD); + if (_method_desc->covariant_match(md, &ctx)) { + return true; + } + } + } + } + } + return false; + } + + public: + + ShadowChecker(generic::DescriptorCache* cache, Thread* thread, + Symbol* name, InstanceKlass* holder, generic::MethodDescriptor* desc, + InstanceKlass* target) + : _cache(cache), THREAD(thread), _method_name(name), _method_holder(holder), + _method_desc(desc), _target(target), _found_shadow(false) {} + + void* new_node_data(InstanceKlass* cls) { return NULL; } + void free_node_data(void* data) { return; } + + bool visit() { + InstanceKlass* ik = current_class(); + if (ik == _target && current_depth() == 1) { + return false; // This was the specified super -- no need to search it + } + if (ik == _method_holder || ik == _target) { + // We found a path that should be examined to see if it shadows _method + if (path_has_shadow()) { + _found_shadow = true; + cancel_iteration(); + } + return false; // no need to continue up hierarchy + } + return true; + } + + bool found_shadow() { return _found_shadow; } +}; + +// This is called during linktime when we find an invokespecial call that +// refers to a direct superinterface. It indicates that we should find the +// default method in the hierarchy of that superinterface, and if that method +// would have been a candidate from the point of view of 'this' class, then we +// return that method. +Method* DefaultMethods::find_super_default( + Klass* cls, Klass* super, Symbol* method_name, Symbol* sig, TRAPS) { + + ResourceMark rm(THREAD); + + assert(cls != NULL && super != NULL, "Need real classes"); + + InstanceKlass* current_class = InstanceKlass::cast(cls); + InstanceKlass* direction = InstanceKlass::cast(super); + + // Keep entire hierarchy alive for the duration of the computation + KeepAliveRegistrar keepAlive(THREAD); + KeepAliveVisitor loadKeepAlive(&keepAlive); + loadKeepAlive.run(current_class); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Finding super default method %s.%s%s from %s", + direction->name()->as_C_string(), + method_name->as_C_string(), sig->as_C_string(), + current_class->name()->as_C_string()); + } +#endif // ndef PRODUCT + + if (!direction->is_interface()) { + // We should not be here + return NULL; + } + + generic::DescriptorCache cache; + generic::Context ctx(&cache); + + // Prime the initial generic context for current -> direction + ctx.apply_type_arguments(current_class, direction, CHECK_NULL); + + FindMethodsByName visitor(&cache, method_name, &ctx, CHECK_NULL); + visitor.run(direction); + + GrowableArray families; + visitor.get_discovered_families(&families); + +#ifndef PRODUCT + if (TraceDefaultMethods) { + print_families(&families, sig); + } +#endif // ndef PRODUCT + + MethodFamily* selected_family = NULL; + + for (int i = 0; i < families.length(); ++i) { + MethodFamily* lm = families.at(i); + if (lm->contains_signature(sig)) { + lm->determine_target(current_class, CHECK_NULL); + selected_family = lm; + } + } + + if (selected_family->has_target()) { + Method* target = selected_family->get_selected_target(); + InstanceKlass* holder = InstanceKlass::cast(target->method_holder()); + + // Verify that the identified method is valid from the context of + // the current class + ShadowChecker checker(&cache, THREAD, target->name(), + holder, selected_family->descriptor(), direction); + checker.run(current_class); + + if (checker.found_shadow()) { +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr(" Only candidate found was shadowed."); + } +#endif // ndef PRODUCT + THROW_MSG_(vmSymbols::java_lang_AbstractMethodError(), + "Accessible default method not found", NULL); + } else { +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print(" Returning "); + print_method(tty, target, true); + tty->print_cr(""); + } +#endif // ndef PRODUCT + return target; + } + } else { + assert(selected_family->throws_exception(), "must have target or throw"); + THROW_MSG_(vmSymbols::java_lang_AbstractMethodError(), + selected_family->get_exception_message()->as_C_string(), NULL); + } +} + + +static int assemble_redirect( + BytecodeConstantPool* cp, BytecodeBuffer* buffer, + Symbol* incoming, Method* target, TRAPS) { + + BytecodeAssembler assem(buffer, cp); + + SignatureStream in(incoming, true); + SignatureStream out(target->signature(), true); + u2 parameter_count = 0; + + assem.aload(parameter_count++); // load 'this' + + while (!in.at_return_type()) { + assert(!out.at_return_type(), "Parameter counts do not match"); + BasicType bt = in.type(); + assert(out.type() == bt, "Parameter types are not compatible"); + assem.load(bt, parameter_count); + if (in.is_object() && in.as_symbol(THREAD) != out.as_symbol(THREAD)) { + assem.checkcast(out.as_symbol(THREAD)); + } else if (bt == T_LONG || bt == T_DOUBLE) { + ++parameter_count; // longs and doubles use two slots + } + ++parameter_count; + in.next(); + out.next(); + } + assert(out.at_return_type(), "Parameter counts do not match"); + assert(in.type() == out.type(), "Return types are not compatible"); + + if (parameter_count == 1 && (in.type() == T_LONG || in.type() == T_DOUBLE)) { + ++parameter_count; // need room for return value + } + if (target->method_holder()->is_interface()) { + assem.invokespecial(target); + } else { + assem.invokevirtual(target); + } + + if (in.is_object() && in.as_symbol(THREAD) != out.as_symbol(THREAD)) { + assem.checkcast(in.as_symbol(THREAD)); + } + assem._return(in.type()); + return parameter_count; +} + +static int assemble_abstract_method_error( + BytecodeConstantPool* cp, BytecodeBuffer* buffer, Symbol* message, TRAPS) { + + Symbol* errorName = vmSymbols::java_lang_AbstractMethodError(); + Symbol* init = vmSymbols::object_initializer_name(); + Symbol* sig = vmSymbols::string_void_signature(); + + BytecodeAssembler assem(buffer, cp); + + assem._new(errorName); + assem.dup(); + assem.load_string(message); + assem.invokespecial(errorName, init, sig); + assem.athrow(); + + return 3; // max stack size: [ exception, exception, string ] +} + +static Method* new_method( + BytecodeConstantPool* cp, BytecodeBuffer* bytecodes, Symbol* name, + Symbol* sig, AccessFlags flags, int max_stack, int params, + ConstMethod::MethodType mt, TRAPS) { + + address code_start = static_cast
(bytecodes->adr_at(0)); + int code_length = bytecodes->length(); + + Method* m = Method::allocate(cp->pool_holder()->class_loader_data(), + code_length, flags, 0, 0, 0, 0, mt, CHECK_NULL); + + m->set_constants(NULL); // This will get filled in later + m->set_name_index(cp->utf8(name)); + m->set_signature_index(cp->utf8(sig)); + m->set_generic_signature_index(0); +#ifdef CC_INTERP + ResultTypeFinder rtf(sig); + m->set_result_index(rtf.type()); +#endif + m->set_size_of_parameters(params); + m->set_max_stack(max_stack); + m->set_max_locals(params); + m->constMethod()->set_stackmap_data(NULL); + m->set_code(code_start); + m->set_force_inline(true); + + return m; +} + +static void switchover_constant_pool(BytecodeConstantPool* bpool, + InstanceKlass* klass, GrowableArray* new_methods, TRAPS) { + + if (new_methods->length() > 0) { + ConstantPool* cp = bpool->create_constant_pool(CHECK); + if (cp != klass->constants()) { + klass->class_loader_data()->add_to_deallocate_list(klass->constants()); + klass->set_constants(cp); + cp->set_pool_holder(klass); + + for (int i = 0; i < new_methods->length(); ++i) { + new_methods->at(i)->set_constants(cp); + } + for (int i = 0; i < klass->methods()->length(); ++i) { + Method* mo = klass->methods()->at(i); + mo->set_constants(cp); + } + } + } +} + +// A "bridge" is a method created by javac to bridge the gap between +// an implementation and a generically-compatible, but different, signature. +// Bridges have actual bytecode implementation in classfiles. +// An "overpass", on the other hand, performs the same function as a bridge +// but does not occur in a classfile; the VM creates overpass itself, +// when it needs a path to get from a call site to an default method, and +// a bridge doesn't exist. +static void create_overpasses( + GrowableArray* slots, + InstanceKlass* klass, TRAPS) { + + GrowableArray overpasses; + BytecodeConstantPool bpool(klass->constants()); + + for (int i = 0; i < slots->length(); ++i) { + EmptyVtableSlot* slot = slots->at(i); + + if (slot->is_bound()) { + MethodFamily* method = slot->get_binding(); + int max_stack = 0; + BytecodeBuffer buffer; + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print("for slot: "); + slot->print_on(tty); + tty->print_cr(""); + if (method->has_target()) { + method->print_selected(tty, 1); + } else { + method->print_exception(tty, 1); + } + } +#endif // ndef PRODUCT + if (method->has_target()) { + Method* selected = method->get_selected_target(); + max_stack = assemble_redirect( + &bpool, &buffer, slot->signature(), selected, CHECK); + } else if (method->throws_exception()) { + max_stack = assemble_abstract_method_error( + &bpool, &buffer, method->get_exception_message(), CHECK); + } + AccessFlags flags = accessFlags_from( + JVM_ACC_PUBLIC | JVM_ACC_SYNTHETIC | JVM_ACC_BRIDGE); + Method* m = new_method(&bpool, &buffer, slot->name(), slot->signature(), + flags, max_stack, slot->size_of_parameters(), + ConstMethod::OVERPASS, CHECK); + if (m != NULL) { + overpasses.push(m); + } + } + } + +#ifndef PRODUCT + if (TraceDefaultMethods) { + tty->print_cr("Created %d overpass methods", overpasses.length()); + } +#endif // ndef PRODUCT + + switchover_constant_pool(&bpool, klass, &overpasses, CHECK); + merge_in_new_methods(klass, &overpasses, CHECK); +} + +static void sort_methods(GrowableArray* methods) { + // Note that this must sort using the same key as is used for sorting + // methods in InstanceKlass. + bool sorted = true; + for (int i = methods->length() - 1; i > 0; --i) { + for (int j = 0; j < i; ++j) { + Method* m1 = methods->at(j); + Method* m2 = methods->at(j + 1); + if ((uintptr_t)m1->name() > (uintptr_t)m2->name()) { + methods->at_put(j, m2); + methods->at_put(j + 1, m1); + sorted = false; + } + } + if (sorted) break; + sorted = true; + } +#ifdef ASSERT + uintptr_t prev = 0; + for (int i = 0; i < methods->length(); ++i) { + Method* mh = methods->at(i); + uintptr_t nv = (uintptr_t)mh->name(); + assert(nv >= prev, "Incorrect overpass method ordering"); + prev = nv; + } +#endif +} + +static void merge_in_new_methods(InstanceKlass* klass, + GrowableArray* new_methods, TRAPS) { + + enum { ANNOTATIONS, PARAMETERS, DEFAULTS, NUM_ARRAYS }; + + Array* original_annots[NUM_ARRAYS]; + + Array* original_methods = klass->methods(); + Annotations* annots = klass->annotations(); + original_annots[ANNOTATIONS] = annots->methods_annotations(); + original_annots[PARAMETERS] = annots->methods_parameter_annotations(); + original_annots[DEFAULTS] = annots->methods_default_annotations(); + + Array* original_ordering = klass->method_ordering(); + Array* merged_ordering = Universe::the_empty_int_array(); + + int new_size = klass->methods()->length() + new_methods->length(); + + Array* merged_annots[NUM_ARRAYS]; + + Array* merged_methods = MetadataFactory::new_array( + klass->class_loader_data(), new_size, NULL, CHECK); + for (int i = 0; i < NUM_ARRAYS; ++i) { + if (original_annots[i] != NULL) { + merged_annots[i] = MetadataFactory::new_array( + klass->class_loader_data(), new_size, CHECK); + } else { + merged_annots[i] = NULL; + } + } + if (original_ordering != NULL && original_ordering->length() > 0) { + merged_ordering = MetadataFactory::new_array( + klass->class_loader_data(), new_size, CHECK); + } + int method_order_index = klass->methods()->length(); + + sort_methods(new_methods); + + // Perform grand merge of existing methods and new methods + int orig_idx = 0; + int new_idx = 0; + + for (int i = 0; i < new_size; ++i) { + Method* orig_method = NULL; + Method* new_method = NULL; + if (orig_idx < original_methods->length()) { + orig_method = original_methods->at(orig_idx); + } + if (new_idx < new_methods->length()) { + new_method = new_methods->at(new_idx); + } + + if (orig_method != NULL && + (new_method == NULL || orig_method->name() < new_method->name())) { + merged_methods->at_put(i, orig_method); + original_methods->at_put(orig_idx, NULL); + for (int j = 0; j < NUM_ARRAYS; ++j) { + if (merged_annots[j] != NULL) { + merged_annots[j]->at_put(i, original_annots[j]->at(orig_idx)); + original_annots[j]->at_put(orig_idx, NULL); + } + } + if (merged_ordering->length() > 0) { + merged_ordering->at_put(i, original_ordering->at(orig_idx)); + } + ++orig_idx; + } else { + merged_methods->at_put(i, new_method); + if (merged_ordering->length() > 0) { + merged_ordering->at_put(i, method_order_index++); + } + ++new_idx; + } + // update idnum for new location + merged_methods->at(i)->set_method_idnum(i); + } + + // Verify correct order +#ifdef ASSERT + uintptr_t prev = 0; + for (int i = 0; i < merged_methods->length(); ++i) { + Method* mo = merged_methods->at(i); + uintptr_t nv = (uintptr_t)mo->name(); + assert(nv >= prev, "Incorrect method ordering"); + prev = nv; + } +#endif + + // Replace klass methods with new merged lists + klass->set_methods(merged_methods); + annots->set_methods_annotations(merged_annots[ANNOTATIONS]); + annots->set_methods_parameter_annotations(merged_annots[PARAMETERS]); + annots->set_methods_default_annotations(merged_annots[DEFAULTS]); + + ClassLoaderData* cld = klass->class_loader_data(); + MetadataFactory::free_array(cld, original_methods); + for (int i = 0; i < NUM_ARRAYS; ++i) { + MetadataFactory::free_array(cld, original_annots[i]); + } + if (original_ordering->length() > 0) { + klass->set_method_ordering(merged_ordering); + MetadataFactory::free_array(cld, original_ordering); + } +} + diff --git a/hotspot/src/share/vm/classfile/defaultMethods.hpp b/hotspot/src/share/vm/classfile/defaultMethods.hpp new file mode 100644 index 00000000000..8a31eee6b45 --- /dev/null +++ b/hotspot/src/share/vm/classfile/defaultMethods.hpp @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CLASSFILE_DEFAULTMETHODS_HPP +#define SHARE_VM_CLASSFILE_DEFAULTMETHODS_HPP + +#include "runtime/handles.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/exceptions.hpp" + +class InstanceKlass; +class Symbol; +class Method; + +class DefaultMethods : AllStatic { + public: + + // Analyzes class and determines which default methods are inherited + // from interfaces (and has no other implementation). For each method + // (and each different signature the method could have), create an + // "overpass" method that is an instance method that redirects to the + // default method. Overpass methods are added to the methods lists for + // the class. + static void generate_default_methods( + InstanceKlass* klass, GrowableArray* mirandas, TRAPS); + + + // Called during linking when an invokespecial to an direct interface + // method is found. Selects and returns a method if there is a unique + // default method in the 'super_iface' part of the hierarchy which is + // also a candidate default for 'this_klass'. Otherwise throws an AME. + static Method* find_super_default( + Klass* this_klass, Klass* super_iface, + Symbol* method_name, Symbol* method_sig, TRAPS); +}; + +#endif // SHARE_VM_CLASSFILE_DEFAULTMETHODS_HPP diff --git a/hotspot/src/share/vm/classfile/genericSignatures.cpp b/hotspot/src/share/vm/classfile/genericSignatures.cpp new file mode 100644 index 00000000000..3b0ffbd3349 --- /dev/null +++ b/hotspot/src/share/vm/classfile/genericSignatures.cpp @@ -0,0 +1,1272 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" + +#include "classfile/genericSignatures.hpp" +#include "classfile/symbolTable.hpp" +#include "classfile/systemDictionary.hpp" +#include "memory/resourceArea.hpp" + +namespace generic { + +// Helper class for parsing the generic signature Symbol in klass and methods +class DescriptorStream : public ResourceObj { + private: + Symbol* _symbol; + int _offset; + int _mark; + const char* _parse_error; + + void set_parse_error(const char* error) { + assert(error != NULL, "Can't set NULL error string"); + _parse_error = error; + } + + public: + DescriptorStream(Symbol* sym) + : _symbol(sym), _offset(0), _mark(-1), _parse_error(NULL) {} + + const char* parse_error() const { + return _parse_error; + } + + bool at_end() { return _offset >= _symbol->utf8_length(); } + + char peek() { + if (at_end()) { + set_parse_error("Peeking past end of signature"); + return '\0'; + } else { + return _symbol->byte_at(_offset); + } + } + + char read() { + if (at_end()) { + set_parse_error("Reading past end of signature"); + return '\0'; + } else { + return _symbol->byte_at(_offset++); + } + } + + void read(char expected) { + char c = read(); + assert_char(c, expected, 0); + } + + void assert_char(char c, char expected, int pos = -1) { + if (c != expected) { + const char* fmt = "Parse error at %d: expected %c but got %c"; + size_t len = strlen(fmt) + 5; + char* buffer = NEW_RESOURCE_ARRAY(char, len); + jio_snprintf(buffer, len, fmt, _offset + pos, expected, c); + set_parse_error(buffer); + } + } + + void push(char c) { + assert(c == _symbol->byte_at(_offset - 1), "Pushing back wrong value"); + --_offset; + } + + void expect_end() { + if (!at_end()) { + set_parse_error("Unexpected data trailing signature"); + } + } + + bool has_mark() { return _mark != -1; } + + void set_mark() { + _mark = _offset; + } + + Identifier* identifier_from_mark() { + assert(has_mark(), "Mark should be set"); + if (!has_mark()) { + set_parse_error("Expected mark to be set"); + return NULL; + } else { + Identifier* id = new Identifier(_symbol, _mark, _offset - 1); + _mark = -1; + return id; + } + } +}; + + +#define CHECK_FOR_PARSE_ERROR() \ + if (STREAM->parse_error() != NULL) { \ + if (VerifyGenericSignatures) { \ + fatal(STREAM->parse_error()); \ + } \ + return NULL; \ + } 0 + +#define READ() STREAM->read(); CHECK_FOR_PARSE_ERROR() +#define PEEK() STREAM->peek(); CHECK_FOR_PARSE_ERROR() +#define PUSH(c) STREAM->push(c) +#define EXPECT(c) STREAM->read(c); CHECK_FOR_PARSE_ERROR() +#define EXPECTED(c, ch) STREAM->assert_char(c, ch); CHECK_FOR_PARSE_ERROR() +#define EXPECT_END() STREAM->expect_end(); CHECK_FOR_PARSE_ERROR() + +#define CHECK_STREAM STREAM); CHECK_FOR_PARSE_ERROR(); (0 + +#ifndef PRODUCT +void Identifier::print_on(outputStream* str) const { + for (int i = _begin; i < _end; ++i) { + str->print("%c", (char)_sym->byte_at(i)); + } +} +#endif // ndef PRODUCT + +bool Identifier::equals(Identifier* other) { + if (_sym == other->_sym && _begin == other->_begin && _end == other->_end) { + return true; + } else if (_end - _begin != other->_end - other->_begin) { + return false; + } else { + size_t len = _end - _begin; + char* addr = ((char*)_sym->bytes()) + _begin; + char* oaddr = ((char*)other->_sym->bytes()) + other->_begin; + return strncmp(addr, oaddr, len) == 0; + } +} + +bool Identifier::equals(Symbol* sym) { + Identifier id(sym, 0, sym->utf8_length()); + return equals(&id); +} + +/** + * A formal type parameter may be found in the the enclosing class, but it could + * also come from an enclosing method or outer class, in the case of inner-outer + * classes or anonymous classes. For example: + * + * class Outer { + * class Inner { + * void m(T t, V v, W w); + * } + * } + * + * In this case, the type variables in m()'s signature are not all found in the + * immediate enclosing class (Inner). class Inner has only type parameter W, + * but it's outer_class field will reference Outer's descriptor which contains + * T & V (no outer_method in this case). + * + * If you have an anonymous class, it has both an enclosing method *and* an + * enclosing class where type parameters can be declared: + * + * class MOuter { + * void bar(V v) { + * Runnable r = new Runnable() { + * public void run() {} + * public void foo(T t, V v) { ... } + * }; + * } + * } + * + * In this case, foo will be a member of some class, Runnable$1, which has no + * formal parameters itself, but has an outer_method (bar()) which provides + * type parameter V, and an outer class MOuter with type parameter T. + * + * It is also possible that the outer class is itself an inner class to some + * other class (or an anonymous class with an enclosing method), so we need to + * follow the outer_class/outer_method chain to it's end when looking for a + * type parameter. + */ +TypeParameter* Descriptor::find_type_parameter(Identifier* id, int* depth) { + + int current_depth = 0; + + MethodDescriptor* outer_method = as_method_signature(); + ClassDescriptor* outer_class = as_class_signature(); + + if (outer_class == NULL) { // 'this' is a method signature; use the holder + outer_class = outer_method->outer_class(); + } + + while (outer_method != NULL || outer_class != NULL) { + if (outer_method != NULL) { + for (int i = 0; i < outer_method->type_parameters().length(); ++i) { + TypeParameter* p = outer_method->type_parameters().at(i); + if (p->identifier()->equals(id)) { + *depth = -1; // indicates this this is a method parameter + return p; + } + } + } + if (outer_class != NULL) { + for (int i = 0; i < outer_class->type_parameters().length(); ++i) { + TypeParameter* p = outer_class->type_parameters().at(i); + if (p->identifier()->equals(id)) { + *depth = current_depth; + return p; + } + } + outer_method = outer_class->outer_method(); + outer_class = outer_class->outer_class(); + ++current_depth; + } + } + + if (VerifyGenericSignatures) { + fatal("Could not resolve identifier"); + } + + return NULL; +} + +ClassDescriptor* ClassDescriptor::parse_generic_signature(Klass* klass, TRAPS) { + return parse_generic_signature(klass, NULL, CHECK_NULL); +} + +ClassDescriptor* ClassDescriptor::parse_generic_signature( + Klass* klass, Symbol* original_name, TRAPS) { + + InstanceKlass* ik = InstanceKlass::cast(klass); + Symbol* sym = ik->generic_signature(); + + ClassDescriptor* spec; + + if (sym == NULL || (spec = ClassDescriptor::parse_generic_signature(sym)) == NULL) { + spec = ClassDescriptor::placeholder(ik); + } + + u2 outer_index = get_outer_class_index(ik, CHECK_NULL); + if (outer_index != 0) { + if (original_name == NULL) { + original_name = ik->name(); + } + Handle class_loader = Handle(THREAD, ik->class_loader()); + Handle protection_domain = Handle(THREAD, ik->protection_domain()); + + Symbol* outer_name = ik->constants()->klass_name_at(outer_index); + Klass* outer = SystemDictionary::find( + outer_name, class_loader, protection_domain, CHECK_NULL); + if (outer == NULL && !THREAD->is_Compiler_thread()) { + outer = SystemDictionary::resolve_super_or_fail(original_name, + outer_name, class_loader, protection_domain, false, CHECK_NULL); + } + + InstanceKlass* outer_ik; + ClassDescriptor* outer_spec = NULL; + if (outer == NULL) { + outer_spec = ClassDescriptor::placeholder(ik); + assert(false, "Outer class not loaded and not loadable from here"); + } else { + outer_ik = InstanceKlass::cast(outer); + outer_spec = parse_generic_signature(outer, original_name, CHECK_NULL); + } + spec->set_outer_class(outer_spec); + + u2 encl_method_idx = ik->enclosing_method_method_index(); + if (encl_method_idx != 0 && outer_ik != NULL) { + ConstantPool* cp = ik->constants(); + u2 name_index = cp->name_ref_index_at(encl_method_idx); + u2 sig_index = cp->signature_ref_index_at(encl_method_idx); + Symbol* name = cp->symbol_at(name_index); + Symbol* sig = cp->symbol_at(sig_index); + Method* m = outer_ik->find_method(name, sig); + if (m != NULL) { + Symbol* gsig = m->generic_signature(); + if (gsig != NULL) { + MethodDescriptor* gms = MethodDescriptor::parse_generic_signature(gsig, outer_spec); + spec->set_outer_method(gms); + } + } else if (VerifyGenericSignatures) { + ResourceMark rm; + stringStream ss; + ss.print("Could not find method %s %s in class %s", + name->as_C_string(), sig->as_C_string(), outer_name->as_C_string()); + fatal(ss.as_string()); + } + } + } + + spec->bind_variables_to_parameters(); + return spec; +} + +ClassDescriptor* ClassDescriptor::placeholder(InstanceKlass* klass) { + GrowableArray formals; + GrowableArray interfaces; + ClassType* super_type = NULL; + + Klass* super_klass = klass->super(); + if (super_klass != NULL) { + InstanceKlass* super = InstanceKlass::cast(super_klass); + super_type = ClassType::from_symbol(super->name()); + } + + for (int i = 0; i < klass->local_interfaces()->length(); ++i) { + InstanceKlass* iface = InstanceKlass::cast(klass->local_interfaces()->at(i)); + interfaces.append(ClassType::from_symbol(iface->name())); + } + return new ClassDescriptor(formals, super_type, interfaces); +} + +ClassDescriptor* ClassDescriptor::parse_generic_signature(Symbol* sym) { + + DescriptorStream ds(sym); + DescriptorStream* STREAM = &ds; + + GrowableArray parameters(8); + char c = READ(); + if (c == '<') { + c = READ(); + while (c != '>') { + PUSH(c); + TypeParameter* ftp = TypeParameter::parse_generic_signature(CHECK_STREAM); + parameters.append(ftp); + c = READ(); + } + } else { + PUSH(c); + } + + EXPECT('L'); + ClassType* super = ClassType::parse_generic_signature(CHECK_STREAM); + + GrowableArray signatures(2); + while (!STREAM->at_end()) { + EXPECT('L'); + ClassType* iface = ClassType::parse_generic_signature(CHECK_STREAM); + signatures.append(iface); + } + + EXPECT_END(); + + return new ClassDescriptor(parameters, super, signatures); +} + +#ifndef PRODUCT +void ClassDescriptor::print_on(outputStream* str) const { + str->indent().print_cr("ClassDescriptor {"); + { + streamIndentor si(str); + if (_type_parameters.length() > 0) { + str->indent().print_cr("Formals {"); + { + streamIndentor si(str); + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + if (_super != NULL) { + str->indent().print_cr("Superclass: "); + { + streamIndentor si(str); + _super->print_on(str); + } + } + if (_interfaces.length() > 0) { + str->indent().print_cr("SuperInterfaces: {"); + { + streamIndentor si(str); + for (int i = 0; i < _interfaces.length(); ++i) { + _interfaces.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + if (_outer_method != NULL) { + str->indent().print_cr("Outer Method: {"); + { + streamIndentor si(str); + _outer_method->print_on(str); + } + str->indent().print_cr("}"); + } + if (_outer_class != NULL) { + str->indent().print_cr("Outer Class: {"); + { + streamIndentor si(str); + _outer_class->print_on(str); + } + str->indent().print_cr("}"); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +ClassType* ClassDescriptor::interface_desc(Symbol* sym) { + for (int i = 0; i < _interfaces.length(); ++i) { + if (_interfaces.at(i)->identifier()->equals(sym)) { + return _interfaces.at(i); + } + } + if (VerifyGenericSignatures) { + fatal("Did not find expected interface"); + } + return NULL; +} + +void ClassDescriptor::bind_variables_to_parameters() { + if (_outer_class != NULL) { + _outer_class->bind_variables_to_parameters(); + } + if (_outer_method != NULL) { + _outer_method->bind_variables_to_parameters(); + } + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->bind_variables_to_parameters(this, i); + } + if (_super != NULL) { + _super->bind_variables_to_parameters(this); + } + for (int i = 0; i < _interfaces.length(); ++i) { + _interfaces.at(i)->bind_variables_to_parameters(this); + } +} + +ClassDescriptor* ClassDescriptor::canonicalize(Context* ctx) { + + GrowableArray type_params(_type_parameters.length()); + for (int i = 0; i < _type_parameters.length(); ++i) { + type_params.append(_type_parameters.at(i)->canonicalize(ctx, 0)); + } + + ClassDescriptor* outer = _outer_class == NULL ? NULL : + _outer_class->canonicalize(ctx); + + ClassType* super = _super == NULL ? NULL : _super->canonicalize(ctx, 0); + + GrowableArray interfaces(_interfaces.length()); + for (int i = 0; i < _interfaces.length(); ++i) { + interfaces.append(_interfaces.at(i)->canonicalize(ctx, 0)); + } + + MethodDescriptor* md = _outer_method == NULL ? NULL : + _outer_method->canonicalize(ctx); + + return new ClassDescriptor(type_params, super, interfaces, outer, md); +} + +u2 ClassDescriptor::get_outer_class_index(InstanceKlass* klass, TRAPS) { + int inner_index = InstanceKlass::inner_class_inner_class_info_offset; + int outer_index = InstanceKlass::inner_class_outer_class_info_offset; + int name_offset = InstanceKlass::inner_class_inner_name_offset; + int next_offset = InstanceKlass::inner_class_next_offset; + + if (klass->inner_classes() == NULL || klass->inner_classes()->length() == 0) { + // No inner class info => no declaring class + return 0; + } + + Array* i_icls = klass->inner_classes(); + ConstantPool* i_cp = klass->constants(); + int i_length = i_icls->length(); + + // Find inner_klass attribute + for (int i = 0; i + next_offset < i_length; i += next_offset) { + u2 ioff = i_icls->at(i + inner_index); + u2 ooff = i_icls->at(i + outer_index); + u2 noff = i_icls->at(i + name_offset); + if (ioff != 0) { + // Check to see if the name matches the class we're looking for + // before attempting to find the class. + if (i_cp->klass_name_at_matches(klass, ioff) && ooff != 0) { + return ooff; + } + } + } + + // It may be anonymous; try for that. + u2 encl_method_class_idx = klass->enclosing_method_class_index(); + if (encl_method_class_idx != 0) { + return encl_method_class_idx; + } + + return 0; +} + +MethodDescriptor* MethodDescriptor::parse_generic_signature(Method* m, ClassDescriptor* outer) { + Symbol* generic_sig = m->generic_signature(); + MethodDescriptor* md = NULL; + if (generic_sig == NULL || (md = parse_generic_signature(generic_sig, outer)) == NULL) { + md = parse_generic_signature(m->signature(), outer); + } + assert(md != NULL, "Could not parse method signature"); + md->bind_variables_to_parameters(); + return md; +} + +MethodDescriptor* MethodDescriptor::parse_generic_signature(Symbol* sym, ClassDescriptor* outer) { + + DescriptorStream ds(sym); + DescriptorStream* STREAM = &ds; + + GrowableArray params(8); + char c = READ(); + if (c == '<') { + c = READ(); + while (c != '>') { + PUSH(c); + TypeParameter* ftp = TypeParameter::parse_generic_signature(CHECK_STREAM); + params.append(ftp); + c = READ(); + } + } else { + PUSH(c); + } + + EXPECT('('); + + GrowableArray parameters(8); + c = READ(); + while (c != ')') { + PUSH(c); + Type* arg = Type::parse_generic_signature(CHECK_STREAM); + parameters.append(arg); + c = READ(); + } + + Type* rt = Type::parse_generic_signature(CHECK_STREAM); + + GrowableArray throws; + while (!STREAM->at_end()) { + EXPECT('^'); + Type* spec = Type::parse_generic_signature(CHECK_STREAM); + throws.append(spec); + } + + return new MethodDescriptor(params, outer, parameters, rt, throws); +} + +void MethodDescriptor::bind_variables_to_parameters() { + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->bind_variables_to_parameters(this, i); + } + for (int i = 0; i < _parameters.length(); ++i) { + _parameters.at(i)->bind_variables_to_parameters(this); + } + _return_type->bind_variables_to_parameters(this); + for (int i = 0; i < _throws.length(); ++i) { + _throws.at(i)->bind_variables_to_parameters(this); + } +} + +bool MethodDescriptor::covariant_match(MethodDescriptor* other, Context* ctx) { + + if (_parameters.length() == other->_parameters.length()) { + for (int i = 0; i < _parameters.length(); ++i) { + if (!_parameters.at(i)->covariant_match(other->_parameters.at(i), ctx)) { + return false; + } + } + + if (_return_type->as_primitive() != NULL) { + return _return_type->covariant_match(other->_return_type, ctx); + } else { + // return type is a reference + return other->_return_type->as_class() != NULL || + other->_return_type->as_variable() != NULL || + other->_return_type->as_array() != NULL; + } + } else { + return false; + } +} + +MethodDescriptor* MethodDescriptor::canonicalize(Context* ctx) { + + GrowableArray type_params(_type_parameters.length()); + for (int i = 0; i < _type_parameters.length(); ++i) { + type_params.append(_type_parameters.at(i)->canonicalize(ctx, 0)); + } + + ClassDescriptor* outer = _outer_class == NULL ? NULL : + _outer_class->canonicalize(ctx); + + GrowableArray params(_parameters.length()); + for (int i = 0; i < _parameters.length(); ++i) { + params.append(_parameters.at(i)->canonicalize(ctx, 0)); + } + + Type* rt = _return_type->canonicalize(ctx, 0); + + GrowableArray throws(_throws.length()); + for (int i = 0; i < _throws.length(); ++i) { + throws.append(_throws.at(i)->canonicalize(ctx, 0)); + } + + return new MethodDescriptor(type_params, outer, params, rt, throws); +} + +#ifndef PRODUCT +TempNewSymbol MethodDescriptor::reify_signature(Context* ctx, TRAPS) { + stringStream ss(256); + + ss.print("("); + for (int i = 0; i < _parameters.length(); ++i) { + _parameters.at(i)->reify_signature(&ss, ctx); + } + ss.print(")"); + _return_type->reify_signature(&ss, ctx); + return SymbolTable::new_symbol(ss.base(), (int)ss.size(), THREAD); +} + +void MethodDescriptor::print_on(outputStream* str) const { + str->indent().print_cr("MethodDescriptor {"); + { + streamIndentor si(str); + if (_type_parameters.length() > 0) { + str->indent().print_cr("Formals: {"); + { + streamIndentor si(str); + for (int i = 0; i < _type_parameters.length(); ++i) { + _type_parameters.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + str->indent().print_cr("Parameters: {"); + { + streamIndentor si(str); + for (int i = 0; i < _parameters.length(); ++i) { + _parameters.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + str->indent().print_cr("Return Type: "); + { + streamIndentor si(str); + _return_type->print_on(str); + } + + if (_throws.length() > 0) { + str->indent().print_cr("Throws: {"); + { + streamIndentor si(str); + for (int i = 0; i < _throws.length(); ++i) { + _throws.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +TypeParameter* TypeParameter::parse_generic_signature(DescriptorStream* STREAM) { + STREAM->set_mark(); + char c = READ(); + while (c != ':') { + c = READ(); + } + + Identifier* id = STREAM->identifier_from_mark(); + + ClassType* class_bound = NULL; + GrowableArray interface_bounds(8); + + c = READ(); + if (c != '>') { + if (c != ':') { + EXPECTED(c, 'L'); + class_bound = ClassType::parse_generic_signature(CHECK_STREAM); + c = READ(); + } + + while (c == ':') { + EXPECT('L'); + ClassType* fts = ClassType::parse_generic_signature(CHECK_STREAM); + interface_bounds.append(fts); + c = READ(); + } + } + PUSH(c); + + return new TypeParameter(id, class_bound, interface_bounds); +} + +void TypeParameter::bind_variables_to_parameters(Descriptor* sig, int position) { + if (_class_bound != NULL) { + _class_bound->bind_variables_to_parameters(sig); + } + for (int i = 0; i < _interface_bounds.length(); ++i) { + _interface_bounds.at(i)->bind_variables_to_parameters(sig); + } + _position = position; +} + +Type* TypeParameter::resolve( + Context* ctx, int inner_depth, int ctx_depth) { + + if (inner_depth == -1) { + // This indicates that the parameter is a method type parameter, which + // isn't resolveable using the class hierarchy context + return bound(); + } + + ClassType* provider = ctx->at_depth(ctx_depth); + if (provider != NULL) { + for (int i = 0; i < inner_depth && provider != NULL; ++i) { + provider = provider->outer_class(); + } + if (provider != NULL) { + TypeArgument* arg = provider->type_argument_at(_position); + if (arg != NULL) { + Type* value = arg->lower_bound(); + return value->canonicalize(ctx, ctx_depth + 1); + } + } + } + + return bound(); +} + +TypeParameter* TypeParameter::canonicalize(Context* ctx, int ctx_depth) { + ClassType* bound = _class_bound == NULL ? NULL : + _class_bound->canonicalize(ctx, ctx_depth); + + GrowableArray ifaces(_interface_bounds.length()); + for (int i = 0; i < _interface_bounds.length(); ++i) { + ifaces.append(_interface_bounds.at(i)->canonicalize(ctx, ctx_depth)); + } + + TypeParameter* ret = new TypeParameter(_identifier, bound, ifaces); + ret->_position = _position; + return ret; +} + +ClassType* TypeParameter::bound() { + if (_class_bound != NULL) { + return _class_bound; + } + + if (_interface_bounds.length() == 1) { + return _interface_bounds.at(0); + } + + return ClassType::java_lang_Object(); // TODO: investigate this case +} + +#ifndef PRODUCT +void TypeParameter::print_on(outputStream* str) const { + str->indent().print_cr("Formal: {"); + { + streamIndentor si(str); + + str->indent().print("Identifier: "); + _identifier->print_on(str); + str->print_cr(""); + if (_class_bound != NULL) { + str->indent().print_cr("Class Bound: "); + streamIndentor si(str); + _class_bound->print_on(str); + } + if (_interface_bounds.length() > 0) { + str->indent().print_cr("Interface Bounds: {"); + { + streamIndentor si(str); + for (int i = 0; i < _interface_bounds.length(); ++i) { + _interface_bounds.at(i)->print_on(str); + } + } + str->indent().print_cr("}"); + } + str->indent().print_cr("Ordinal Position: %d", _position); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +Type* Type::parse_generic_signature(DescriptorStream* STREAM) { + char c = READ(); + switch (c) { + case 'L': + return ClassType::parse_generic_signature(CHECK_STREAM); + case 'T': + return TypeVariable::parse_generic_signature(CHECK_STREAM); + case '[': + return ArrayType::parse_generic_signature(CHECK_STREAM); + default: + return new PrimitiveType(c); + } +} + +Identifier* ClassType::parse_generic_signature_simple(GrowableArray* args, + bool* has_inner, DescriptorStream* STREAM) { + STREAM->set_mark(); + + char c = READ(); + while (c != ';' && c != '.' && c != '<') { c = READ(); } + Identifier* id = STREAM->identifier_from_mark(); + + if (c == '<') { + c = READ(); + while (c != '>') { + PUSH(c); + TypeArgument* arg = TypeArgument::parse_generic_signature(CHECK_STREAM); + args->append(arg); + c = READ(); + } + c = READ(); + } + + *has_inner = (c == '.'); + if (!(*has_inner)) { + EXPECTED(c, ';'); + } + + return id; +} + +ClassType* ClassType::parse_generic_signature(DescriptorStream* STREAM) { + return parse_generic_signature(NULL, CHECK_STREAM); +} + +ClassType* ClassType::parse_generic_signature(ClassType* outer, DescriptorStream* STREAM) { + GrowableArray args; + ClassType* gct = NULL; + bool has_inner = false; + + Identifier* id = parse_generic_signature_simple(&args, &has_inner, STREAM); + if (id != NULL) { + gct = new ClassType(id, args, outer); + + if (has_inner) { + gct = parse_generic_signature(gct, CHECK_STREAM); + } + } + return gct; +} + +ClassType* ClassType::from_symbol(Symbol* sym) { + assert(sym != NULL, "Must not be null"); + GrowableArray args; + Identifier* id = new Identifier(sym, 0, sym->utf8_length()); + return new ClassType(id, args, NULL); +} + +ClassType* ClassType::java_lang_Object() { + return from_symbol(vmSymbols::java_lang_Object()); +} + +void ClassType::bind_variables_to_parameters(Descriptor* sig) { + for (int i = 0; i < _type_arguments.length(); ++i) { + _type_arguments.at(i)->bind_variables_to_parameters(sig); + } + if (_outer_class != NULL) { + _outer_class->bind_variables_to_parameters(sig); + } +} + +TypeArgument* ClassType::type_argument_at(int i) { + if (i >= 0 && i < _type_arguments.length()) { + return _type_arguments.at(i); + } else { + return NULL; + } +} + +#ifndef PRODUCT +void ClassType::reify_signature(stringStream* ss, Context* ctx) { + ss->print("L"); + _identifier->print_on(ss); + ss->print(";"); +} + +void ClassType::print_on(outputStream* str) const { + str->indent().print_cr("Class {"); + { + streamIndentor si(str); + str->indent().print("Name: "); + _identifier->print_on(str); + str->print_cr(""); + if (_type_arguments.length() != 0) { + str->indent().print_cr("Type Arguments: {"); + { + streamIndentor si(str); + for (int j = 0; j < _type_arguments.length(); ++j) { + _type_arguments.at(j)->print_on(str); + } + } + str->indent().print_cr("}"); + } + if (_outer_class != NULL) { + str->indent().print_cr("Outer Class: "); + streamIndentor sir(str); + _outer_class->print_on(str); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +bool ClassType::covariant_match(Type* other, Context* ctx) { + + if (other == this) { + return true; + } + + TypeVariable* variable = other->as_variable(); + if (variable != NULL) { + other = variable->resolve(ctx, 0); + } + + ClassType* outer = outer_class(); + ClassType* other_class = other->as_class(); + + if (other_class == NULL || + (outer == NULL) != (other_class->outer_class() == NULL)) { + return false; + } + + if (!_identifier->equals(other_class->_identifier)) { + return false; + } + + if (outer != NULL && !outer->covariant_match(other_class->outer_class(), ctx)) { + return false; + } + + return true; +} + +ClassType* ClassType::canonicalize(Context* ctx, int ctx_depth) { + + GrowableArray args(_type_arguments.length()); + for (int i = 0; i < _type_arguments.length(); ++i) { + args.append(_type_arguments.at(i)->canonicalize(ctx, ctx_depth)); + } + + ClassType* outer = _outer_class == NULL ? NULL : + _outer_class->canonicalize(ctx, ctx_depth); + + return new ClassType(_identifier, args, outer); +} + +TypeVariable* TypeVariable::parse_generic_signature(DescriptorStream* STREAM) { + STREAM->set_mark(); + char c = READ(); + while (c != ';') { + c = READ(); + } + Identifier* id = STREAM->identifier_from_mark(); + + return new TypeVariable(id); +} + +void TypeVariable::bind_variables_to_parameters(Descriptor* sig) { + _parameter = sig->find_type_parameter(_id, &_inner_depth); + if (VerifyGenericSignatures && _parameter == NULL) { + fatal("Could not find formal parameter"); + } +} + +Type* TypeVariable::resolve(Context* ctx, int ctx_depth) { + if (parameter() != NULL) { + return parameter()->resolve(ctx, inner_depth(), ctx_depth); + } else { + if (VerifyGenericSignatures) { + fatal("Type variable matches no parameter"); + } + return NULL; + } +} + +bool TypeVariable::covariant_match(Type* other, Context* ctx) { + + if (other == this) { + return true; + } + + Context my_context(NULL); // empty, results in erasure + Type* my_type = resolve(&my_context, 0); + if (my_type == NULL) { + return false; + } + + return my_type->covariant_match(other, ctx); +} + +Type* TypeVariable::canonicalize(Context* ctx, int ctx_depth) { + return resolve(ctx, ctx_depth); +} + +#ifndef PRODUCT +void TypeVariable::reify_signature(stringStream* ss, Context* ctx) { + Type* type = resolve(ctx, 0); + if (type != NULL) { + type->reify_signature(ss, ctx); + } +} + +void TypeVariable::print_on(outputStream* str) const { + str->indent().print_cr("Type Variable {"); + { + streamIndentor si(str); + str->indent().print("Name: "); + _id->print_on(str); + str->print_cr(""); + str->indent().print_cr("Inner depth: %d", _inner_depth); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +ArrayType* ArrayType::parse_generic_signature(DescriptorStream* STREAM) { + Type* base = Type::parse_generic_signature(CHECK_STREAM); + return new ArrayType(base); +} + +void ArrayType::bind_variables_to_parameters(Descriptor* sig) { + assert(_base != NULL, "Invalid base"); + _base->bind_variables_to_parameters(sig); +} + +bool ArrayType::covariant_match(Type* other, Context* ctx) { + assert(_base != NULL, "Invalid base"); + + if (other == this) { + return true; + } + + ArrayType* other_array = other->as_array(); + return (other_array != NULL && _base->covariant_match(other_array->_base, ctx)); +} + +ArrayType* ArrayType::canonicalize(Context* ctx, int ctx_depth) { + assert(_base != NULL, "Invalid base"); + return new ArrayType(_base->canonicalize(ctx, ctx_depth)); +} + +#ifndef PRODUCT +void ArrayType::reify_signature(stringStream* ss, Context* ctx) { + assert(_base != NULL, "Invalid base"); + ss->print("["); + _base->reify_signature(ss, ctx); +} + +void ArrayType::print_on(outputStream* str) const { + str->indent().print_cr("Array {"); + { + streamIndentor si(str); + _base->print_on(str); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +bool PrimitiveType::covariant_match(Type* other, Context* ctx) { + + PrimitiveType* other_prim = other->as_primitive(); + return (other_prim != NULL && _type == other_prim->_type); +} + +PrimitiveType* PrimitiveType::canonicalize(Context* ctx, int ctxd) { + return this; +} + +#ifndef PRODUCT +void PrimitiveType::reify_signature(stringStream* ss, Context* ctx) { + ss->print("%c", _type); +} + +void PrimitiveType::print_on(outputStream* str) const { + str->indent().print_cr("Primitive: '%c'", _type); +} +#endif // ndef PRODUCT + +void PrimitiveType::bind_variables_to_parameters(Descriptor* sig) { +} + +TypeArgument* TypeArgument::parse_generic_signature(DescriptorStream* STREAM) { + char c = READ(); + Type* type = NULL; + + switch (c) { + case '*': + return new TypeArgument(ClassType::java_lang_Object(), NULL); + break; + default: + PUSH(c); + // fall-through + case '+': + case '-': + type = Type::parse_generic_signature(CHECK_STREAM); + if (c == '+') { + return new TypeArgument(type, NULL); + } else if (c == '-') { + return new TypeArgument(ClassType::java_lang_Object(), type); + } else { + return new TypeArgument(type, type); + } + } +} + +void TypeArgument::bind_variables_to_parameters(Descriptor* sig) { + assert(_lower_bound != NULL, "Invalid lower bound"); + _lower_bound->bind_variables_to_parameters(sig); + if (_upper_bound != NULL && _upper_bound != _lower_bound) { + _upper_bound->bind_variables_to_parameters(sig); + } +} + +bool TypeArgument::covariant_match(TypeArgument* other, Context* ctx) { + assert(_lower_bound != NULL, "Invalid lower bound"); + + if (other == this) { + return true; + } + + if (!_lower_bound->covariant_match(other->lower_bound(), ctx)) { + return false; + } + return true; +} + +TypeArgument* TypeArgument::canonicalize(Context* ctx, int ctx_depth) { + assert(_lower_bound != NULL, "Invalid lower bound"); + Type* lower = _lower_bound->canonicalize(ctx, ctx_depth); + Type* upper = NULL; + + if (_upper_bound == _lower_bound) { + upper = lower; + } else if (_upper_bound != NULL) { + upper = _upper_bound->canonicalize(ctx, ctx_depth); + } + + return new TypeArgument(lower, upper); +} + +#ifndef PRODUCT +void TypeArgument::print_on(outputStream* str) const { + str->indent().print_cr("TypeArgument {"); + { + streamIndentor si(str); + if (_lower_bound != NULL) { + str->indent().print("Lower bound: "); + _lower_bound->print_on(str); + } + if (_upper_bound != NULL) { + str->indent().print("Upper bound: "); + _upper_bound->print_on(str); + } + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +void Context::Mark::destroy() { + if (is_active()) { + _context->reset_to_mark(_marked_size); + } + deactivate(); +} + +void Context::apply_type_arguments( + InstanceKlass* current, InstanceKlass* super, TRAPS) { + assert(_cache != NULL, "Cannot use an empty context"); + ClassType* spec = NULL; + if (current != NULL) { + ClassDescriptor* descriptor = _cache->descriptor_for(current, CHECK); + if (super == current->super()) { + spec = descriptor->super(); + } else { + spec = descriptor->interface_desc(super->name()); + } + if (spec != NULL) { + _type_arguments.push(spec); + } + } +} + +void Context::reset_to_mark(int size) { + _type_arguments.trunc_to(size); +} + +ClassType* Context::at_depth(int i) const { + if (i < _type_arguments.length()) { + return _type_arguments.at(_type_arguments.length() - 1 - i); + } + return NULL; +} + +#ifndef PRODUCT +void Context::print_on(outputStream* str) const { + str->indent().print_cr("Context {"); + for (int i = 0; i < _type_arguments.length(); ++i) { + streamIndentor si(str); + str->indent().print("leval %d: ", i); + ClassType* ct = at_depth(i); + if (ct == NULL) { + str->print_cr(""); + continue; + } else { + str->print_cr("{"); + } + + for (int j = 0; j < ct->type_arguments_length(); ++j) { + streamIndentor si(str); + TypeArgument* ta = ct->type_argument_at(j); + Type* bound = ta->lower_bound(); + bound->print_on(str); + } + str->indent().print_cr("}"); + } + str->indent().print_cr("}"); +} +#endif // ndef PRODUCT + +ClassDescriptor* DescriptorCache::descriptor_for(InstanceKlass* ik, TRAPS) { + + ClassDescriptor** existing = _class_descriptors.get(ik); + if (existing == NULL) { + ClassDescriptor* cd = ClassDescriptor::parse_generic_signature(ik, CHECK_NULL); + _class_descriptors.put(ik, cd); + return cd; + } else { + return *existing; + } +} + +MethodDescriptor* DescriptorCache::descriptor_for( + Method* mh, ClassDescriptor* cd, TRAPS) { + assert(mh != NULL && cd != NULL, "Should not be NULL"); + MethodDescriptor** existing = _method_descriptors.get(mh); + if (existing == NULL) { + MethodDescriptor* md = MethodDescriptor::parse_generic_signature(mh, cd); + _method_descriptors.put(mh, md); + return md; + } else { + return *existing; + } +} +MethodDescriptor* DescriptorCache::descriptor_for(Method* mh, TRAPS) { + ClassDescriptor* cd = descriptor_for( + InstanceKlass::cast(mh->method_holder()), CHECK_NULL); + return descriptor_for(mh, cd, THREAD); +} + +} // namespace generic diff --git a/hotspot/src/share/vm/classfile/genericSignatures.hpp b/hotspot/src/share/vm/classfile/genericSignatures.hpp new file mode 100644 index 00000000000..07eb4759357 --- /dev/null +++ b/hotspot/src/share/vm/classfile/genericSignatures.hpp @@ -0,0 +1,467 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_CLASSFILE_GENERICSIGNATURES_HPP +#define SHARE_VM_CLASSFILE_GENERICSIGNATURES_HPP + +#include "classfile/symbolTable.hpp" +#include "memory/allocation.hpp" +#include "runtime/signature.hpp" +#include "utilities/growableArray.hpp" +#include "utilities/resourceHash.hpp" + +class stringStream; + +namespace generic { + +class Identifier; +class ClassDescriptor; +class MethodDescriptor; + +class TypeParameter; // a formal type parameter declared in generic signatures +class TypeArgument; // The "type value" passed to fill parameters in supertypes +class TypeVariable; // A usage of a type parameter as a value +/** + * Example: + * + * class Foo extends Bar { int m(V v) {} } + * ^^^^^^ ^^^^^^ ^^ + * type parameters type argument type variable + * + * Note that a type variable could be passed as an argument too: + * class Foo extends Bar { int m(V v) {} } + * ^^^ + * type argument's value is a type variable + */ + + +class Type; +class ClassType; +class ArrayType; +class PrimitiveType; +class Context; +class DescriptorCache; + +class DescriptorStream; + +class Identifier : public ResourceObj { + private: + Symbol* _sym; + int _begin; + int _end; + + public: + Identifier(Symbol* sym, int begin, int end) : + _sym(sym), _begin(begin), _end(end) {} + + bool equals(Identifier* other); + bool equals(Symbol* sym); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif // ndef PRODUCT +}; + +class Descriptor : public ResourceObj { + protected: + GrowableArray _type_parameters; + ClassDescriptor* _outer_class; + + Descriptor(GrowableArray& params, + ClassDescriptor* outer) + : _type_parameters(params), _outer_class(outer) {} + + public: + + ClassDescriptor* outer_class() { return _outer_class; } + void set_outer_class(ClassDescriptor* sig) { _outer_class = sig; } + + virtual ClassDescriptor* as_class_signature() { return NULL; } + virtual MethodDescriptor* as_method_signature() { return NULL; } + + bool is_class_signature() { return as_class_signature() != NULL; } + bool is_method_signature() { return as_method_signature() != NULL; } + + GrowableArray& type_parameters() { + return _type_parameters; + } + + TypeParameter* find_type_parameter(Identifier* id, int* param_depth); + + virtual void bind_variables_to_parameters() = 0; + +#ifndef PRODUCT + virtual void print_on(outputStream* str) const = 0; +#endif +}; + +class ClassDescriptor : public Descriptor { + private: + ClassType* _super; + GrowableArray _interfaces; + MethodDescriptor* _outer_method; + + ClassDescriptor(GrowableArray& ftp, ClassType* scs, + GrowableArray& sis, ClassDescriptor* outer_class = NULL, + MethodDescriptor* outer_method = NULL) + : Descriptor(ftp, outer_class), _super(scs), _interfaces(sis), + _outer_method(outer_method) {} + + static u2 get_outer_class_index(InstanceKlass* k, TRAPS); + static ClassDescriptor* parse_generic_signature(Klass* k, Symbol* original_name, TRAPS); + + public: + + virtual ClassDescriptor* as_class_signature() { return this; } + + MethodDescriptor* outer_method() { return _outer_method; } + void set_outer_method(MethodDescriptor* m) { _outer_method = m; } + + ClassType* super() { return _super; } + ClassType* interface_desc(Symbol* sym); + + static ClassDescriptor* parse_generic_signature(Klass* k, TRAPS); + static ClassDescriptor* parse_generic_signature(Symbol* sym); + + // For use in superclass chains in positions where this is no generic info + static ClassDescriptor* placeholder(InstanceKlass* klass); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif + + ClassDescriptor* canonicalize(Context* ctx); + + // Linking sets the position index in any contained TypeVariable type + // to correspond to the location of that identifier in the formal type + // parameters. + void bind_variables_to_parameters(); +}; + +class MethodDescriptor : public Descriptor { + private: + GrowableArray _parameters; + Type* _return_type; + GrowableArray _throws; + + MethodDescriptor(GrowableArray& ftp, ClassDescriptor* outer, + GrowableArray& sigs, Type* rt, GrowableArray& throws) + : Descriptor(ftp, outer), _parameters(sigs), _return_type(rt), + _throws(throws) {} + + public: + + static MethodDescriptor* parse_generic_signature(Method* m, ClassDescriptor* outer); + static MethodDescriptor* parse_generic_signature(Symbol* sym, ClassDescriptor* outer); + + MethodDescriptor* as_method_signature() { return this; } + + // Performs generic analysis on the method parameters to determine + // if both methods refer to the same argument types. + bool covariant_match(MethodDescriptor* other, Context* ctx); + + // Returns a new method descriptor with all generic variables + // removed and replaced with whatever is indicated using the Context. + MethodDescriptor* canonicalize(Context* ctx); + + void bind_variables_to_parameters(); + +#ifndef PRODUCT + TempNewSymbol reify_signature(Context* ctx, TRAPS); + void print_on(outputStream* str) const; +#endif +}; + +class TypeParameter : public ResourceObj { + private: + Identifier* _identifier; + ClassType* _class_bound; + GrowableArray _interface_bounds; + + // The position is the ordinal location of the parameter within the + // formal parameter list (excluding outer classes). It is only set for + // formal type parameters that are associated with a class -- method + // type parameters are left as -1. When resolving a generic variable to + // find the actual type, this index is used to access the generic type + // argument in the provided context object. + int _position; // Assigned during variable linking + + TypeParameter(Identifier* id, ClassType* class_bound, + GrowableArray& interface_bounds) : + _identifier(id), _class_bound(class_bound), + _interface_bounds(interface_bounds), _position(-1) {} + + public: + static TypeParameter* parse_generic_signature(DescriptorStream* str); + + ClassType* bound(); + int position() { return _position; } + + void bind_variables_to_parameters(Descriptor* sig, int position); + Identifier* identifier() { return _identifier; } + + Type* resolve(Context* ctx, int inner_depth, int ctx_depth); + TypeParameter* canonicalize(Context* ctx, int ctx_depth); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif +}; + +class Type : public ResourceObj { + public: + static Type* parse_generic_signature(DescriptorStream* str); + + virtual ClassType* as_class() { return NULL; } + virtual TypeVariable* as_variable() { return NULL; } + virtual ArrayType* as_array() { return NULL; } + virtual PrimitiveType* as_primitive() { return NULL; } + + virtual bool covariant_match(Type* gt, Context* ctx) = 0; + virtual Type* canonicalize(Context* ctx, int ctx_depth) = 0; + + virtual void bind_variables_to_parameters(Descriptor* sig) = 0; + +#ifndef PRODUCT + virtual void reify_signature(stringStream* ss, Context* ctx) = 0; + virtual void print_on(outputStream* str) const = 0; +#endif +}; + +class ClassType : public Type { + friend class ClassDescriptor; + protected: + Identifier* _identifier; + GrowableArray _type_arguments; + ClassType* _outer_class; + + ClassType(Identifier* identifier, + GrowableArray& args, + ClassType* outer) + : _identifier(identifier), _type_arguments(args), _outer_class(outer) {} + + // Returns true if there are inner classes to read + static Identifier* parse_generic_signature_simple( + GrowableArray* args, + bool* has_inner, DescriptorStream* str); + + static ClassType* parse_generic_signature(ClassType* outer, + DescriptorStream* str); + static ClassType* from_symbol(Symbol* sym); + + public: + ClassType* as_class() { return this; } + + static ClassType* parse_generic_signature(DescriptorStream* str); + static ClassType* java_lang_Object(); + + Identifier* identifier() { return _identifier; } + int type_arguments_length() { return _type_arguments.length(); } + TypeArgument* type_argument_at(int i); + + virtual ClassType* outer_class() { return _outer_class; } + + bool covariant_match(Type* gt, Context* ctx); + ClassType* canonicalize(Context* ctx, int context_depth); + + void bind_variables_to_parameters(Descriptor* sig); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class TypeVariable : public Type { + private: + Identifier* _id; + TypeParameter* _parameter; // assigned during linking + + // how many steps "out" from inner classes, -1 if method + int _inner_depth; + + TypeVariable(Identifier* id) + : _id(id), _parameter(NULL), _inner_depth(0) {} + + public: + TypeVariable* as_variable() { return this; } + + static TypeVariable* parse_generic_signature(DescriptorStream* str); + + Identifier* identifier() { return _id; } + TypeParameter* parameter() { return _parameter; } + int inner_depth() { return _inner_depth; } + + void bind_variables_to_parameters(Descriptor* sig); + + Type* resolve(Context* ctx, int ctx_depth); + bool covariant_match(Type* gt, Context* ctx); + Type* canonicalize(Context* ctx, int ctx_depth); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class ArrayType : public Type { + private: + Type* _base; + + ArrayType(Type* base) : _base(base) {} + + public: + ArrayType* as_array() { return this; } + + static ArrayType* parse_generic_signature(DescriptorStream* str); + + bool covariant_match(Type* gt, Context* ctx); + ArrayType* canonicalize(Context* ctx, int ctx_depth); + + void bind_variables_to_parameters(Descriptor* sig); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class PrimitiveType : public Type { + friend class Type; + private: + char _type; // includes V for void + + PrimitiveType(char& type) : _type(type) {} + + public: + PrimitiveType* as_primitive() { return this; } + + bool covariant_match(Type* gt, Context* ctx); + PrimitiveType* canonicalize(Context* ctx, int ctx_depth); + + void bind_variables_to_parameters(Descriptor* sig); + +#ifndef PRODUCT + void reify_signature(stringStream* ss, Context* ctx); + void print_on(outputStream* str) const; +#endif +}; + +class TypeArgument : public ResourceObj { + private: + Type* _lower_bound; + Type* _upper_bound; // may be null or == _lower_bound + + TypeArgument(Type* lower_bound, Type* upper_bound) + : _lower_bound(lower_bound), _upper_bound(upper_bound) {} + + public: + + static TypeArgument* parse_generic_signature(DescriptorStream* str); + + Type* lower_bound() { return _lower_bound; } + Type* upper_bound() { return _upper_bound; } + + void bind_variables_to_parameters(Descriptor* sig); + TypeArgument* canonicalize(Context* ctx, int ctx_depth); + + bool covariant_match(TypeArgument* a, Context* ctx); + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif +}; + + +class Context : public ResourceObj { + private: + DescriptorCache* _cache; + GrowableArray _type_arguments; + + void reset_to_mark(int size); + + public: + // When this object goes out of scope or 'destroy' is + // called, then the application of the type to the + // context is wound-back (unless it's been deactivated). + class Mark : public StackObj { + private: + mutable Context* _context; + int _marked_size; + + bool is_active() const { return _context != NULL; } + void deactivate() const { _context = NULL; } + + public: + Mark() : _context(NULL), _marked_size(0) {} + Mark(Context* ctx, int sz) : _context(ctx), _marked_size(sz) {} + Mark(const Mark& m) : _context(m._context), _marked_size(m._marked_size) { + m.deactivate(); // Ownership is transferred + } + + Mark& operator=(const Mark& cm) { + destroy(); + _context = cm._context; + _marked_size = cm._marked_size; + cm.deactivate(); + return *this; + } + + void destroy(); + ~Mark() { destroy(); } + }; + + Context(DescriptorCache* cache) : _cache(cache) {} + + Mark mark() { return Mark(this, _type_arguments.length()); } + void apply_type_arguments(InstanceKlass* current, InstanceKlass* super,TRAPS); + + ClassType* at_depth(int i) const; + +#ifndef PRODUCT + void print_on(outputStream* str) const; +#endif +}; + +/** + * Contains a cache of descriptors for classes and methods so they can be + * looked-up instead of reparsing each time they are needed. + */ +class DescriptorCache : public ResourceObj { + private: + ResourceHashtable _class_descriptors; + ResourceHashtable _method_descriptors; + + public: + ClassDescriptor* descriptor_for(InstanceKlass* ikh, TRAPS); + + MethodDescriptor* descriptor_for(Method* mh, ClassDescriptor* cd, TRAPS); + // Class descriptor derived from method holder + MethodDescriptor* descriptor_for(Method* mh, TRAPS); +}; + +} // namespace generic + +#endif // SHARE_VM_CLASSFILE_GENERICSIGNATURES_HPP + diff --git a/hotspot/src/share/vm/classfile/javaClasses.cpp b/hotspot/src/share/vm/classfile/javaClasses.cpp index d74a6174a99..c414079e9ed 100644 --- a/hotspot/src/share/vm/classfile/javaClasses.cpp +++ b/hotspot/src/share/vm/classfile/javaClasses.cpp @@ -1156,7 +1156,7 @@ void java_lang_Throwable::print(Handle throwable, outputStream* st) { // Print stack trace element to resource allocated buffer char* java_lang_Throwable::print_stack_element_to_buffer(Method* method, int bci) { // Get strings and string lengths - InstanceKlass* klass = InstanceKlass::cast(method->method_holder()); + InstanceKlass* klass = method->method_holder(); const char* klass_name = klass->external_name(); int buf_len = (int)strlen(klass_name); char* source_file_name; @@ -1747,14 +1747,14 @@ oop java_lang_StackTraceElement::create(methodHandle method, int bci, TRAPS) { Handle element = ik->allocate_instance_handle(CHECK_0); // Fill in class name ResourceMark rm(THREAD); - const char* str = InstanceKlass::cast(method->method_holder())->external_name(); + const char* str = method->method_holder()->external_name(); oop classname = StringTable::intern((char*) str, CHECK_0); java_lang_StackTraceElement::set_declaringClass(element(), classname); // Fill in method name oop methodname = StringTable::intern(method->name(), CHECK_0); java_lang_StackTraceElement::set_methodName(element(), methodname); // Fill in source file name - Symbol* source = InstanceKlass::cast(method->method_holder())->source_file_name(); + Symbol* source = method->method_holder()->source_file_name(); if (ShowHiddenFrames && source == NULL) source = vmSymbols::unknown_class_name(); oop filename = StringTable::intern(source, CHECK_0); diff --git a/hotspot/src/share/vm/classfile/systemDictionary.hpp b/hotspot/src/share/vm/classfile/systemDictionary.hpp index 19ddbe9c9f8..21967f6d810 100644 --- a/hotspot/src/share/vm/classfile/systemDictionary.hpp +++ b/hotspot/src/share/vm/classfile/systemDictionary.hpp @@ -137,6 +137,7 @@ class SymbolPropertyTable; /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \ /* Universe::is_gte_jdk14x_version() is not set up by this point. */ \ /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ + do_klass(lambda_MagicLambdaImpl_klass, java_lang_invoke_MagicLambdaImpl, Opt ) \ do_klass(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt ) \ do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \ do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \ diff --git a/hotspot/src/share/vm/classfile/verifier.cpp b/hotspot/src/share/vm/classfile/verifier.cpp index 3cb08c50bb9..6181e037911 100644 --- a/hotspot/src/share/vm/classfile/verifier.cpp +++ b/hotspot/src/share/vm/classfile/verifier.cpp @@ -446,7 +446,7 @@ void ErrorContext::location_details(outputStream* ss, Method* method) const { bytecode_name = ""; } } - InstanceKlass* ik = InstanceKlass::cast(method->method_holder()); + InstanceKlass* ik = method->method_holder(); ss->indent().print_cr("Location:"); streamIndentor si2(ss); ss->indent().print_cr("%s.%s%s @%d: %s", @@ -555,9 +555,10 @@ void ClassVerifier::verify_class(TRAPS) { if (was_recursively_verified()) return; Method* m = methods->at(index); - if (m->is_native() || m->is_abstract()) { + if (m->is_native() || m->is_abstract() || m->is_overpass()) { // If m is native or abstract, skip it. It is checked in class file - // parser that methods do not override a final method. + // parser that methods do not override a final method. Overpass methods + // are trusted since the VM generates them. continue; } verify_method(methodHandle(THREAD, m), CHECK_VERIFY(this)); @@ -1849,7 +1850,7 @@ void ClassVerifier::verify_cp_index( if ((index <= 0) || (index >= nconstants)) { verify_error(ErrorContext::bad_cp_index(bci, index), "Illegal constant pool index %d in class %s", - index, InstanceKlass::cast(cp->pool_holder())->external_name()); + index, cp->pool_holder()->external_name()); return; } } @@ -1868,7 +1869,7 @@ void ClassVerifier::verify_cp_type( if ((types & (1 << tag)) == 0) { verify_error(ErrorContext::bad_cp_index(bci, index), "Illegal type at constant pool entry %d in class %s", - index, InstanceKlass::cast(cp->pool_holder())->external_name()); + index, cp->pool_holder()->external_name()); return; } } @@ -1880,7 +1881,7 @@ void ClassVerifier::verify_cp_class_type( if (!tag.is_klass() && !tag.is_unresolved_klass()) { verify_error(ErrorContext::bad_cp_index(bci, index), "Illegal type at constant pool entry %d in class %s", - index, InstanceKlass::cast(cp->pool_holder())->external_name()); + index, cp->pool_holder()->external_name()); return; } } @@ -2304,11 +2305,21 @@ void ClassVerifier::verify_invoke_instructions( // Make sure the constant pool item is the right type u2 index = bcs->get_index_u2(); Bytecodes::Code opcode = bcs->raw_code(); - unsigned int types = (opcode == Bytecodes::_invokeinterface - ? 1 << JVM_CONSTANT_InterfaceMethodref - : opcode == Bytecodes::_invokedynamic - ? 1 << JVM_CONSTANT_InvokeDynamic - : 1 << JVM_CONSTANT_Methodref); + unsigned int types; + switch (opcode) { + case Bytecodes::_invokeinterface: + types = 1 << JVM_CONSTANT_InterfaceMethodref; + break; + case Bytecodes::_invokedynamic: + types = 1 << JVM_CONSTANT_InvokeDynamic; + break; + case Bytecodes::_invokespecial: + types = (1 << JVM_CONSTANT_InterfaceMethodref) | + (1 << JVM_CONSTANT_Methodref); + break; + default: + types = 1 << JVM_CONSTANT_Methodref; + } verify_cp_type(bcs->bci(), index, cp, types, CHECK_VERIFY(this)); // Get method name and signature diff --git a/hotspot/src/share/vm/classfile/vmSymbols.cpp b/hotspot/src/share/vm/classfile/vmSymbols.cpp index 318d4178f81..92939ea2487 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.cpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.cpp @@ -507,7 +507,7 @@ static vmIntrinsics::ID match_method_with_klass(Method* m, Symbol* mk) { } void vmIntrinsics::verify_method(ID actual_id, Method* m) { - Symbol* mk = Klass::cast(m->method_holder())->name(); + Symbol* mk = m->method_holder()->name(); ID declared_id = match_method_with_klass(m, mk); if (declared_id == actual_id) return; // success diff --git a/hotspot/src/share/vm/classfile/vmSymbols.hpp b/hotspot/src/share/vm/classfile/vmSymbols.hpp index 06fdb35be19..940aac3c29b 100644 --- a/hotspot/src/share/vm/classfile/vmSymbols.hpp +++ b/hotspot/src/share/vm/classfile/vmSymbols.hpp @@ -110,10 +110,12 @@ template(sun_jkernel_DownloadManager, "sun/jkernel/DownloadManager") \ template(getBootClassPathEntryForClass_name, "getBootClassPathEntryForClass") \ template(sun_misc_PostVMInitHook, "sun/misc/PostVMInitHook") \ + template(sun_misc_Launcher_ExtClassLoader, "sun/misc/Launcher$ExtClassLoader") \ \ /* Java runtime version access */ \ template(sun_misc_Version, "sun/misc/Version") \ template(java_runtime_name_name, "java_runtime_name") \ + template(java_runtime_version_name, "java_runtime_version") \ \ /* class file format tags */ \ template(tag_source_file, "SourceFile") \ @@ -257,6 +259,7 @@ template(java_lang_invoke_DontInline_signature, "Ljava/lang/invoke/DontInline;") \ template(java_lang_invoke_LambdaForm_Compiled_signature, "Ljava/lang/invoke/LambdaForm$Compiled;") \ template(java_lang_invoke_LambdaForm_Hidden_signature, "Ljava/lang/invoke/LambdaForm$Hidden;") \ + template(java_lang_invoke_MagicLambdaImpl, "java/lang/invoke/MagicLambdaImpl") \ /* internal up-calls made only by the JVM, via class sun.invoke.MethodHandleNatives: */ \ template(findMethodHandleType_name, "findMethodHandleType") \ template(findMethodHandleType_signature, "(Ljava/lang/Class;[Ljava/lang/Class;)Ljava/lang/invoke/MethodType;") \ @@ -723,6 +726,21 @@ /* java/lang/ref/Reference */ \ do_intrinsic(_Reference_get, java_lang_ref_Reference, get_name, void_object_signature, F_R) \ \ + /* support for com.sum.crypto.provider.AESCrypt and some of its callers */ \ + do_class(com_sun_crypto_provider_aescrypt, "com/sun/crypto/provider/AESCrypt") \ + do_intrinsic(_aescrypt_encryptBlock, com_sun_crypto_provider_aescrypt, encryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ + do_intrinsic(_aescrypt_decryptBlock, com_sun_crypto_provider_aescrypt, decryptBlock_name, byteArray_int_byteArray_int_signature, F_R) \ + do_name( encryptBlock_name, "encryptBlock") \ + do_name( decryptBlock_name, "decryptBlock") \ + do_signature(byteArray_int_byteArray_int_signature, "([BI[BI)V") \ + \ + do_class(com_sun_crypto_provider_cipherBlockChaining, "com/sun/crypto/provider/CipherBlockChaining") \ + do_intrinsic(_cipherBlockChaining_encryptAESCrypt, com_sun_crypto_provider_cipherBlockChaining, encrypt_name, byteArray_int_int_byteArray_int_signature, F_R) \ + do_intrinsic(_cipherBlockChaining_decryptAESCrypt, com_sun_crypto_provider_cipherBlockChaining, decrypt_name, byteArray_int_int_byteArray_int_signature, F_R) \ + do_name( encrypt_name, "encrypt") \ + do_name( decrypt_name, "decrypt") \ + do_signature(byteArray_int_int_byteArray_int_signature, "([BII[BI)V") \ + \ /* support for sun.misc.Unsafe */ \ do_class(sun_misc_Unsafe, "sun/misc/Unsafe") \ \ diff --git a/hotspot/src/share/vm/code/compiledIC.cpp b/hotspot/src/share/vm/code/compiledIC.cpp index 3ddf784d68a..7677dae57c5 100644 --- a/hotspot/src/share/vm/code/compiledIC.cpp +++ b/hotspot/src/share/vm/code/compiledIC.cpp @@ -191,8 +191,8 @@ void CompiledIC::set_to_megamorphic(CallInfo* call_info, Bytecodes::Code bytecod int index = klassItable::compute_itable_index(call_info->resolved_method()()); entry = VtableStubs::create_stub(false, index, method()); assert(entry != NULL, "entry not computed"); - Klass* k = call_info->resolved_method()->method_holder(); - assert(Klass::cast(k)->is_interface(), "sanity check"); + InstanceKlass* k = call_info->resolved_method()->method_holder(); + assert(k->is_interface(), "sanity check"); InlineCacheBuffer::create_transition_stub(this, k, entry); } else { // Can be different than method->vtable_index(), due to package-private etc. diff --git a/hotspot/src/share/vm/code/dependencies.cpp b/hotspot/src/share/vm/code/dependencies.cpp index 4cdb499fe27..93db50afe07 100644 --- a/hotspot/src/share/vm/code/dependencies.cpp +++ b/hotspot/src/share/vm/code/dependencies.cpp @@ -829,7 +829,7 @@ class ClassHierarchyWalker { } if ( !Dependencies::is_concrete_method(lm) && !Dependencies::is_concrete_method(m) - && Klass::cast(lm->method_holder())->is_subtype_of(m->method_holder())) + && lm->method_holder()->is_subtype_of(m->method_holder())) // Method m is overridden by lm, but both are non-concrete. return true; } @@ -1160,7 +1160,11 @@ bool Dependencies::is_concrete_method(Method* m) { // We could also return false if m does not yet appear to be // executed, if the VM version supports this distinction also. - return !m->is_abstract(); + return !m->is_abstract() && + !InstanceKlass::cast(m->method_holder())->is_interface(); + // TODO: investigate whether default methods should be + // considered as "concrete" in this situation. For now they + // are not. } diff --git a/hotspot/src/share/vm/code/nmethod.cpp b/hotspot/src/share/vm/code/nmethod.cpp index d935845fd65..e7726908816 100644 --- a/hotspot/src/share/vm/code/nmethod.cpp +++ b/hotspot/src/share/vm/code/nmethod.cpp @@ -1263,7 +1263,7 @@ void nmethod::invalidate_osr_method() { assert(_entry_bci != InvocationEntryBci, "wrong kind of nmethod"); // Remove from list of active nmethods if (method() != NULL) - InstanceKlass::cast(method()->method_holder())->remove_osr_nmethod(this); + method()->method_holder()->remove_osr_nmethod(this); // Set entry as invalid _entry_bci = InvalidOSREntryBci; } diff --git a/hotspot/src/share/vm/compiler/compileBroker.cpp b/hotspot/src/share/vm/compiler/compileBroker.cpp index b1e10d652a4..d4d09e0c61e 100644 --- a/hotspot/src/share/vm/compiler/compileBroker.cpp +++ b/hotspot/src/share/vm/compiler/compileBroker.cpp @@ -1051,7 +1051,7 @@ void CompileBroker::compile_method_base(methodHandle method, guarantee(!method->is_abstract(), "cannot compile abstract methods"); assert(method->method_holder()->oop_is_instance(), "sanity check"); - assert(!InstanceKlass::cast(method->method_holder())->is_not_initialized(), + assert(!method->method_holder()->is_not_initialized(), "method holder must be initialized"); assert(!method->is_method_handle_intrinsic(), "do not enqueue these guys"); @@ -1206,7 +1206,7 @@ nmethod* CompileBroker::compile_method(methodHandle method, int osr_bci, assert(method->method_holder()->oop_is_instance(), "not an instance method"); assert(osr_bci == InvocationEntryBci || (0 <= osr_bci && osr_bci < method->code_size()), "bci out of range"); assert(!method->is_abstract() && (osr_bci == InvocationEntryBci || !method->is_native()), "cannot compile abstract/native methods"); - assert(!InstanceKlass::cast(method->method_holder())->is_not_initialized(), "method holder must be initialized"); + assert(!method->method_holder()->is_not_initialized(), "method holder must be initialized"); if (!TieredCompilation) { comp_level = CompLevel_highest_tier; diff --git a/hotspot/src/share/vm/compiler/compilerOracle.cpp b/hotspot/src/share/vm/compiler/compilerOracle.cpp index bdd34917f22..7e620cec9fd 100644 --- a/hotspot/src/share/vm/compiler/compilerOracle.cpp +++ b/hotspot/src/share/vm/compiler/compilerOracle.cpp @@ -67,7 +67,7 @@ class MethodMatcher : public CHeapObj { // utility method MethodMatcher* find(methodHandle method) { - Symbol* class_name = Klass::cast(method->method_holder())->name(); + Symbol* class_name = method->method_holder()->name(); Symbol* method_name = method->name(); for (MethodMatcher* current = this; current != NULL; current = current->_next) { if (match(class_name, current->class_name(), current->_class_mode) && @@ -574,7 +574,7 @@ void CompilerOracle::parse_from_file() { char token[1024]; int pos = 0; int c = getc(stream); - while(c != EOF) { + while(c != EOF && pos < (int)(sizeof(token)-1)) { if (c == '\n') { token[pos++] = '\0'; parse_from_line(token); @@ -595,7 +595,7 @@ void CompilerOracle::parse_from_string(const char* str, void (*parse_line)(char* int pos = 0; const char* sp = str; int c = *sp++; - while (c != '\0') { + while (c != '\0' && pos < (int)(sizeof(token)-1)) { if (c == '\n') { token[pos++] = '\0'; parse_line(token); @@ -624,7 +624,7 @@ void CompilerOracle::append_exclude_to_file(methodHandle method) { assert(has_command_file(), "command file must be specified"); fileStream stream(fopen(cc_file(), "at")); stream.print("exclude "); - Klass::cast(method->method_holder())->name()->print_symbol_on(&stream); + method->method_holder()->name()->print_symbol_on(&stream); stream.print("."); method->name()->print_symbol_on(&stream); method->signature()->print_symbol_on(&stream); diff --git a/hotspot/src/share/vm/compiler/disassembler.cpp b/hotspot/src/share/vm/compiler/disassembler.cpp index e1fed2e4d23..676440c14cc 100644 --- a/hotspot/src/share/vm/compiler/disassembler.cpp +++ b/hotspot/src/share/vm/compiler/disassembler.cpp @@ -55,16 +55,18 @@ void* Disassembler::_library = NULL; bool Disassembler::_tried_to_load_library = false; // This routine is in the shared library: +Disassembler::decode_func_virtual Disassembler::_decode_instructions_virtual = NULL; Disassembler::decode_func Disassembler::_decode_instructions = NULL; static const char hsdis_library_name[] = "hsdis-"HOTSPOT_LIB_ARCH; -static const char decode_instructions_name[] = "decode_instructions_virtual"; - +static const char decode_instructions_virtual_name[] = "decode_instructions_virtual"; +static const char decode_instructions_name[] = "decode_instructions"; +static bool use_new_version = true; #define COMMENT_COLUMN 40 LP64_ONLY(+8) /*could be an option*/ #define BYTES_COMMENT ";..." /* funky byte display comment */ bool Disassembler::load_library() { - if (_decode_instructions != NULL) { + if (_decode_instructions_virtual != NULL || _decode_instructions != NULL) { // Already succeeded. return true; } @@ -123,11 +125,19 @@ bool Disassembler::load_library() { _library = os::dll_load(buf, ebuf, sizeof ebuf); } if (_library != NULL) { + _decode_instructions_virtual = CAST_TO_FN_PTR(Disassembler::decode_func_virtual, + os::dll_lookup(_library, decode_instructions_virtual_name)); + } + if (_decode_instructions_virtual == NULL) { + // could not spot in new version, try old version _decode_instructions = CAST_TO_FN_PTR(Disassembler::decode_func, os::dll_lookup(_library, decode_instructions_name)); + use_new_version = false; + } else { + use_new_version = true; } _tried_to_load_library = true; - if (_decode_instructions == NULL) { + if (_decode_instructions_virtual == NULL && _decode_instructions == NULL) { tty->print_cr("Could not load %s; %s; %s", buf, ((_library != NULL) ? "entry point is missing" @@ -450,17 +460,31 @@ address decode_env::decode_instructions(address start, address end) { // This is mainly for debugging the library itself. FILE* out = stdout; FILE* xmlout = (_print_raw > 1 ? out : NULL); - return (address) - (*Disassembler::_decode_instructions)((uintptr_t)start, (uintptr_t)end, - start, end - start, + return use_new_version ? + (address) + (*Disassembler::_decode_instructions_virtual)((uintptr_t)start, (uintptr_t)end, + start, end - start, + NULL, (void*) xmlout, + NULL, (void*) out, + options(), 0/*nice new line*/) + : + (address) + (*Disassembler::_decode_instructions)(start, end, NULL, (void*) xmlout, NULL, (void*) out, options()); } - return (address) - (*Disassembler::_decode_instructions)((uintptr_t)start, (uintptr_t)end, - start, end - start, + return use_new_version ? + (address) + (*Disassembler::_decode_instructions_virtual)((uintptr_t)start, (uintptr_t)end, + start, end - start, + &event_to_env, (void*) this, + &printf_to_env, (void*) this, + options(), 0/*nice new line*/) + : + (address) + (*Disassembler::_decode_instructions)(start, end, &event_to_env, (void*) this, &printf_to_env, (void*) this, options()); diff --git a/hotspot/src/share/vm/compiler/disassembler.hpp b/hotspot/src/share/vm/compiler/disassembler.hpp index 053b4689fbb..fd1f52eee1b 100644 --- a/hotspot/src/share/vm/compiler/disassembler.hpp +++ b/hotspot/src/share/vm/compiler/disassembler.hpp @@ -49,8 +49,16 @@ class Disassembler { friend class decode_env; private: // this is the type of the dll entry point: - typedef void* (*decode_func)(uintptr_t start_va, uintptr_t end_va, + typedef void* (*decode_func_virtual)(uintptr_t start_va, uintptr_t end_va, unsigned char* buffer, uintptr_t length, + void* (*event_callback)(void*, const char*, void*), + void* event_stream, + int (*printf_callback)(void*, const char*, ...), + void* printf_stream, + const char* options, + int newline); + // this is the type of the dll entry point for old version: + typedef void* (*decode_func)(void* start_va, void* end_va, void* (*event_callback)(void*, const char*, void*), void* event_stream, int (*printf_callback)(void*, const char*, ...), @@ -61,6 +69,7 @@ class Disassembler { // bailout static bool _tried_to_load_library; // points to the decode function. + static decode_func_virtual _decode_instructions_virtual; static decode_func _decode_instructions; // tries to load library and return whether it succedded. static bool load_library(); @@ -85,7 +94,9 @@ class Disassembler { public: static bool can_decode() { - return (_decode_instructions != NULL) || load_library(); + return (_decode_instructions_virtual != NULL) || + (_decode_instructions != NULL) || + load_library(); } static void decode(CodeBlob *cb, outputStream* st = NULL); static void decode(nmethod* nm, outputStream* st = NULL); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp new file mode 100644 index 00000000000..01e0e8745a1 --- /dev/null +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.cpp @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#include "precompiled.hpp" +#include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp" +#include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" +#include "memory/freeBlockDictionary.hpp" +#include "memory/sharedHeap.hpp" +#include "runtime/globals.hpp" +#include "runtime/mutex.hpp" +#include "runtime/vmThread.hpp" + +template <> +void AdaptiveFreeList::print_on(outputStream* st, const char* c) const { + if (c != NULL) { + st->print("%16s", c); + } else { + st->print(SIZE_FORMAT_W(16), size()); + } + st->print("\t" + SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" + SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\n", + bfr_surp(), surplus(), desired(), prev_sweep(), before_sweep(), + count(), coal_births(), coal_deaths(), split_births(), split_deaths()); +} + +template +AdaptiveFreeList::AdaptiveFreeList() : FreeList(), _hint(0) { + init_statistics(); +} + +template +AdaptiveFreeList::AdaptiveFreeList(Chunk* fc) : FreeList(fc), _hint(0) { + init_statistics(); +#ifndef PRODUCT + _allocation_stats.set_returned_bytes(size() * HeapWordSize); +#endif +} + +template +void AdaptiveFreeList::initialize() { + FreeList::initialize(); + set_hint(0); + init_statistics(true /* split_birth */); +} + +template +void AdaptiveFreeList::reset(size_t hint) { + FreeList::reset(); + set_hint(hint); +} + +#ifndef PRODUCT +template +void AdaptiveFreeList::assert_proper_lock_protection_work() const { + assert(protecting_lock() != NULL, "Don't call this directly"); + assert(ParallelGCThreads > 0, "Don't call this directly"); + Thread* thr = Thread::current(); + if (thr->is_VM_thread() || thr->is_ConcurrentGC_thread()) { + // assert that we are holding the freelist lock + } else if (thr->is_GC_task_thread()) { + assert(protecting_lock()->owned_by_self(), "FreeList RACE DETECTED"); + } else if (thr->is_Java_thread()) { + assert(!SafepointSynchronize::is_at_safepoint(), "Should not be executing"); + } else { + ShouldNotReachHere(); // unaccounted thread type? + } +} +#endif +template +void AdaptiveFreeList::init_statistics(bool split_birth) { + _allocation_stats.initialize(split_birth); +} + +template +size_t AdaptiveFreeList::get_better_size() { + + // A candidate chunk has been found. If it is already under + // populated and there is a hinT, REturn the hint(). Else + // return the size of this chunk. + if (surplus() <= 0) { + if (hint() != 0) { + return hint(); + } else { + return size(); + } + } else { + // This list has a surplus so use it. + return size(); + } +} + + +template +void AdaptiveFreeList::return_chunk_at_head(Chunk* chunk) { + assert_proper_lock_protection(); + return_chunk_at_head(chunk, true); +} + +template +void AdaptiveFreeList::return_chunk_at_head(Chunk* chunk, bool record_return) { + FreeList::return_chunk_at_head(chunk, record_return); +#ifdef ASSERT + if (record_return) { + increment_returned_bytes_by(size()*HeapWordSize); + } +#endif +} + +template +void AdaptiveFreeList::return_chunk_at_tail(Chunk* chunk) { + return_chunk_at_tail(chunk, true); +} + +template +void AdaptiveFreeList::return_chunk_at_tail(Chunk* chunk, bool record_return) { + FreeList::return_chunk_at_tail(chunk, record_return); +#ifdef ASSERT + if (record_return) { + increment_returned_bytes_by(size()*HeapWordSize); + } +#endif +} + +#ifndef PRODUCT +template +void AdaptiveFreeList::verify_stats() const { + // The +1 of the LH comparand is to allow some "looseness" in + // checking: we usually call this interface when adding a block + // and we'll subsequently update the stats; we cannot update the + // stats beforehand because in the case of the large-block BT + // dictionary for example, this might be the first block and + // in that case there would be no place that we could record + // the stats (which are kept in the block itself). + assert((_allocation_stats.prev_sweep() + _allocation_stats.split_births() + + _allocation_stats.coal_births() + 1) // Total Production Stock + 1 + >= (_allocation_stats.split_deaths() + _allocation_stats.coal_deaths() + + (ssize_t)count()), // Total Current Stock + depletion + err_msg("FreeList " PTR_FORMAT " of size " SIZE_FORMAT + " violates Conservation Principle: " + "prev_sweep(" SIZE_FORMAT ")" + " + split_births(" SIZE_FORMAT ")" + " + coal_births(" SIZE_FORMAT ") + 1 >= " + " split_deaths(" SIZE_FORMAT ")" + " coal_deaths(" SIZE_FORMAT ")" + " + count(" SSIZE_FORMAT ")", + this, size(), _allocation_stats.prev_sweep(), _allocation_stats.split_births(), + _allocation_stats.split_births(), _allocation_stats.split_deaths(), + _allocation_stats.coal_deaths(), count())); +} +#endif + +// Needs to be after the definitions have been seen. +template class AdaptiveFreeList; diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp new file mode 100644 index 00000000000..8b56bb11d76 --- /dev/null +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp @@ -0,0 +1,232 @@ +/* + * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_MEMORY_ADAPTIVEFREELIST_HPP +#define SHARE_VM_MEMORY_ADAPTIVEFREELIST_HPP + +#include "memory/freeList.hpp" +#include "gc_implementation/shared/allocationStats.hpp" + +class CompactibleFreeListSpace; + +// A class for maintaining a free list of Chunk's. The FreeList +// maintains a the structure of the list (head, tail, etc.) plus +// statistics for allocations from the list. The links between items +// are not part of FreeList. The statistics are +// used to make decisions about coalescing Chunk's when they +// are swept during collection. +// +// See the corresponding .cpp file for a description of the specifics +// for that implementation. + +class Mutex; + +template +class AdaptiveFreeList : public FreeList { + friend class CompactibleFreeListSpace; + friend class VMStructs; + // friend class PrintTreeCensusClosure; + + size_t _hint; // next larger size list with a positive surplus + + AllocationStats _allocation_stats; // allocation-related statistics + + public: + + AdaptiveFreeList(); + AdaptiveFreeList(Chunk* fc); + + using FreeList::assert_proper_lock_protection; +#ifdef ASSERT + using FreeList::protecting_lock; +#endif + using FreeList::count; + using FreeList::size; + using FreeList::verify_chunk_in_free_list; + using FreeList::getFirstNChunksFromList; + using FreeList::print_on; + void return_chunk_at_head(Chunk* fc, bool record_return); + void return_chunk_at_head(Chunk* fc); + void return_chunk_at_tail(Chunk* fc, bool record_return); + void return_chunk_at_tail(Chunk* fc); + using FreeList::return_chunk_at_tail; + using FreeList::remove_chunk; + using FreeList::prepend; + using FreeList::print_labels_on; + using FreeList::get_chunk_at_head; + + // Initialize. + void initialize(); + + // Reset the head, tail, hint, and count of a free list. + void reset(size_t hint); + + void assert_proper_lock_protection_work() const PRODUCT_RETURN; + + void print_on(outputStream* st, const char* c = NULL) const; + + size_t hint() const { + return _hint; + } + void set_hint(size_t v) { + assert_proper_lock_protection(); + assert(v == 0 || size() < v, "Bad hint"); + _hint = v; + } + + size_t get_better_size(); + + // Accessors for statistics + void init_statistics(bool split_birth = false); + + AllocationStats* allocation_stats() { + assert_proper_lock_protection(); + return &_allocation_stats; + } + + ssize_t desired() const { + return _allocation_stats.desired(); + } + void set_desired(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_desired(v); + } + void compute_desired(float inter_sweep_current, + float inter_sweep_estimate, + float intra_sweep_estimate) { + assert_proper_lock_protection(); + _allocation_stats.compute_desired(count(), + inter_sweep_current, + inter_sweep_estimate, + intra_sweep_estimate); + } + ssize_t coal_desired() const { + return _allocation_stats.coal_desired(); + } + void set_coal_desired(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_coal_desired(v); + } + + ssize_t surplus() const { + return _allocation_stats.surplus(); + } + void set_surplus(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_surplus(v); + } + void increment_surplus() { + assert_proper_lock_protection(); + _allocation_stats.increment_surplus(); + } + void decrement_surplus() { + assert_proper_lock_protection(); + _allocation_stats.decrement_surplus(); + } + + ssize_t bfr_surp() const { + return _allocation_stats.bfr_surp(); + } + void set_bfr_surp(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_bfr_surp(v); + } + ssize_t prev_sweep() const { + return _allocation_stats.prev_sweep(); + } + void set_prev_sweep(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_prev_sweep(v); + } + ssize_t before_sweep() const { + return _allocation_stats.before_sweep(); + } + void set_before_sweep(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_before_sweep(v); + } + + ssize_t coal_births() const { + return _allocation_stats.coal_births(); + } + void set_coal_births(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_coal_births(v); + } + void increment_coal_births() { + assert_proper_lock_protection(); + _allocation_stats.increment_coal_births(); + } + + ssize_t coal_deaths() const { + return _allocation_stats.coal_deaths(); + } + void set_coal_deaths(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_coal_deaths(v); + } + void increment_coal_deaths() { + assert_proper_lock_protection(); + _allocation_stats.increment_coal_deaths(); + } + + ssize_t split_births() const { + return _allocation_stats.split_births(); + } + void set_split_births(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_split_births(v); + } + void increment_split_births() { + assert_proper_lock_protection(); + _allocation_stats.increment_split_births(); + } + + ssize_t split_deaths() const { + return _allocation_stats.split_deaths(); + } + void set_split_deaths(ssize_t v) { + assert_proper_lock_protection(); + _allocation_stats.set_split_deaths(v); + } + void increment_split_deaths() { + assert_proper_lock_protection(); + _allocation_stats.increment_split_deaths(); + } + +#ifndef PRODUCT + // For debugging. The "_returned_bytes" in all the lists are summed + // and compared with the total number of bytes swept during a + // collection. + size_t returned_bytes() const { return _allocation_stats.returned_bytes(); } + void set_returned_bytes(size_t v) { _allocation_stats.set_returned_bytes(v); } + void increment_returned_bytes_by(size_t v) { + _allocation_stats.set_returned_bytes(_allocation_stats.returned_bytes() + v); + } + // Stats verification + void verify_stats() const; +#endif // NOT PRODUCT +}; + +#endif // SHARE_VM_MEMORY_ADAPTIVEFREELIST_HPP diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp index eac32b1eaea..2f43c987669 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.cpp @@ -91,7 +91,7 @@ CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs, _collector(NULL) { assert(sizeof(FreeChunk) / BytesPerWord <= MinChunkSize, - "FreeChunk is larger than expected"); + "FreeChunk is larger than expected"); _bt.set_space(this); initialize(mr, SpaceDecorator::Clear, SpaceDecorator::Mangle); // We have all of "mr", all of which we place in the dictionary @@ -101,14 +101,14 @@ CompactibleFreeListSpace::CompactibleFreeListSpace(BlockOffsetSharedArray* bs, // implementation, namely, the simple binary tree (splaying // temporarily disabled). switch (dictionaryChoice) { + case FreeBlockDictionary::dictionaryBinaryTree: + _dictionary = new BinaryTreeDictionary(mr); + break; case FreeBlockDictionary::dictionarySplayTree: case FreeBlockDictionary::dictionarySkipList: default: warning("dictionaryChoice: selected option not understood; using" " default BinaryTreeDictionary implementation instead."); - case FreeBlockDictionary::dictionaryBinaryTree: - _dictionary = new BinaryTreeDictionary(mr, use_adaptive_freelists); - break; } assert(_dictionary != NULL, "CMS dictionary initialization"); // The indexed free lists are initially all empty and are lazily @@ -453,7 +453,7 @@ const { reportIndexedFreeListStatistics(); gclog_or_tty->print_cr("Layout of Indexed Freelists"); gclog_or_tty->print_cr("---------------------------"); - FreeList::print_labels_on(st, "size"); + AdaptiveFreeList::print_labels_on(st, "size"); for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { _indexedFreeList[i].print_on(gclog_or_tty); for (FreeChunk* fc = _indexedFreeList[i].head(); fc != NULL; @@ -1319,7 +1319,7 @@ FreeChunk* CompactibleFreeListSpace::getChunkFromGreater(size_t numWords) { size_t currSize = numWords + MinChunkSize; assert(currSize % MinObjAlignment == 0, "currSize should be aligned"); for (i = currSize; i < IndexSetSize; i += IndexSetStride) { - FreeList* fl = &_indexedFreeList[i]; + AdaptiveFreeList* fl = &_indexedFreeList[i]; if (fl->head()) { ret = getFromListGreater(fl, numWords); assert(ret == NULL || ret->is_free(), "Should be returning a free chunk"); @@ -1702,7 +1702,9 @@ CompactibleFreeListSpace::returnChunkToDictionary(FreeChunk* chunk) { _dictionary->return_chunk(chunk); #ifndef PRODUCT if (CMSCollector::abstract_state() != CMSCollector::Sweeping) { - TreeChunk::as_TreeChunk(chunk)->list()->verify_stats(); + TreeChunk* tc = TreeChunk::as_TreeChunk(chunk); + TreeList* tl = tc->list(); + tl->verify_stats(); } #endif // PRODUCT } @@ -1745,7 +1747,7 @@ CompactibleFreeListSpace::addChunkToFreeListsAtEndRecordingStats( { MutexLockerEx x(lock, Mutex::_no_safepoint_check_flag); ec = dictionary()->find_largest_dict(); // get largest block - if (ec != NULL && ec->end() == chunk) { + if (ec != NULL && ec->end() == (uintptr_t*) chunk) { // It's a coterminal block - we can coalesce. size_t old_size = ec->size(); coalDeath(old_size); @@ -1850,11 +1852,11 @@ FreeChunk* CompactibleFreeListSpace::bestFitSmall(size_t numWords) { the excess is >= MIN_CHUNK. */ size_t start = align_object_size(numWords + MinChunkSize); if (start < IndexSetSize) { - FreeList* it = _indexedFreeList; + AdaptiveFreeList* it = _indexedFreeList; size_t hint = _indexedFreeList[start].hint(); while (hint < IndexSetSize) { assert(hint % MinObjAlignment == 0, "hint should be aligned"); - FreeList *fl = &_indexedFreeList[hint]; + AdaptiveFreeList *fl = &_indexedFreeList[hint]; if (fl->surplus() > 0 && fl->head() != NULL) { // Found a list with surplus, reset original hint // and split out a free chunk which is returned. @@ -1873,7 +1875,7 @@ FreeChunk* CompactibleFreeListSpace::bestFitSmall(size_t numWords) { } /* Requires fl->size >= numWords + MinChunkSize */ -FreeChunk* CompactibleFreeListSpace::getFromListGreater(FreeList* fl, +FreeChunk* CompactibleFreeListSpace::getFromListGreater(AdaptiveFreeList* fl, size_t numWords) { FreeChunk *curr = fl->head(); size_t oldNumWords = curr->size(); @@ -2155,7 +2157,7 @@ void CompactibleFreeListSpace::beginSweepFLCensus( assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - FreeList* fl = &_indexedFreeList[i]; + AdaptiveFreeList* fl = &_indexedFreeList[i]; if (PrintFLSStatistics > 1) { gclog_or_tty->print("size[%d] : ", i); } @@ -2174,7 +2176,7 @@ void CompactibleFreeListSpace::setFLSurplus() { assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - FreeList *fl = &_indexedFreeList[i]; + AdaptiveFreeList *fl = &_indexedFreeList[i]; fl->set_surplus(fl->count() - (ssize_t)((double)fl->desired() * CMSSmallSplitSurplusPercent)); } @@ -2185,7 +2187,7 @@ void CompactibleFreeListSpace::setFLHints() { size_t i; size_t h = IndexSetSize; for (i = IndexSetSize - 1; i != 0; i -= IndexSetStride) { - FreeList *fl = &_indexedFreeList[i]; + AdaptiveFreeList *fl = &_indexedFreeList[i]; fl->set_hint(h); if (fl->surplus() > 0) { h = i; @@ -2197,7 +2199,7 @@ void CompactibleFreeListSpace::clearFLCensus() { assert_locked(); size_t i; for (i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - FreeList *fl = &_indexedFreeList[i]; + AdaptiveFreeList *fl = &_indexedFreeList[i]; fl->set_prev_sweep(fl->count()); fl->set_coal_births(0); fl->set_coal_deaths(0); @@ -2224,7 +2226,7 @@ void CompactibleFreeListSpace::endSweepFLCensus(size_t sweep_count) { bool CompactibleFreeListSpace::coalOverPopulated(size_t size) { if (size < SmallForDictionary) { - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; return (fl->coal_desired() < 0) || ((int)fl->count() > fl->coal_desired()); } else { @@ -2234,14 +2236,14 @@ bool CompactibleFreeListSpace::coalOverPopulated(size_t size) { void CompactibleFreeListSpace::smallCoalBirth(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_coal_births(); fl->increment_surplus(); } void CompactibleFreeListSpace::smallCoalDeath(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_coal_deaths(); fl->decrement_surplus(); } @@ -2250,7 +2252,7 @@ void CompactibleFreeListSpace::coalBirth(size_t size) { if (size < SmallForDictionary) { smallCoalBirth(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, false /* split */, true /* birth */); } @@ -2260,7 +2262,7 @@ void CompactibleFreeListSpace::coalDeath(size_t size) { if(size < SmallForDictionary) { smallCoalDeath(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, false /* split */, false /* birth */); } @@ -2268,14 +2270,14 @@ void CompactibleFreeListSpace::coalDeath(size_t size) { void CompactibleFreeListSpace::smallSplitBirth(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_split_births(); fl->increment_surplus(); } void CompactibleFreeListSpace::smallSplitDeath(size_t size) { assert(size < SmallForDictionary, "Size too large for indexed list"); - FreeList *fl = &_indexedFreeList[size]; + AdaptiveFreeList *fl = &_indexedFreeList[size]; fl->increment_split_deaths(); fl->decrement_surplus(); } @@ -2284,7 +2286,7 @@ void CompactibleFreeListSpace::split_birth(size_t size) { if (size < SmallForDictionary) { smallSplitBirth(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, true /* split */, true /* birth */); } @@ -2294,7 +2296,7 @@ void CompactibleFreeListSpace::splitDeath(size_t size) { if (size < SmallForDictionary) { smallSplitDeath(size); } else { - dictionary()->dict_census_udpate(size, + dictionary()->dict_census_update(size, true /* split */, false /* birth */); } @@ -2517,10 +2519,10 @@ void CompactibleFreeListSpace::verifyIndexedFreeList(size_t size) const { #ifndef PRODUCT void CompactibleFreeListSpace::check_free_list_consistency() const { - assert(_dictionary->min_size() <= IndexSetSize, + assert((TreeChunk::min_size() <= IndexSetSize), "Some sizes can't be allocated without recourse to" " linear allocation buffers"); - assert(BinaryTreeDictionary::min_tree_chunk_size*HeapWordSize == sizeof(TreeChunk), + assert((TreeChunk::min_size()*HeapWordSize == sizeof(TreeChunk)), "else MIN_TREE_CHUNK_SIZE is wrong"); assert(IndexSetStart != 0, "IndexSetStart not initialized"); assert(IndexSetStride != 0, "IndexSetStride not initialized"); @@ -2529,15 +2531,15 @@ void CompactibleFreeListSpace::check_free_list_consistency() const { void CompactibleFreeListSpace::printFLCensus(size_t sweep_count) const { assert_lock_strong(&_freelistLock); - FreeList total; + AdaptiveFreeList total; gclog_or_tty->print("end sweep# " SIZE_FORMAT "\n", sweep_count); - FreeList::print_labels_on(gclog_or_tty, "size"); + AdaptiveFreeList::print_labels_on(gclog_or_tty, "size"); size_t total_free = 0; for (size_t i = IndexSetStart; i < IndexSetSize; i += IndexSetStride) { - const FreeList *fl = &_indexedFreeList[i]; + const AdaptiveFreeList *fl = &_indexedFreeList[i]; total_free += fl->count() * fl->size(); if (i % (40*IndexSetStride) == 0) { - FreeList::print_labels_on(gclog_or_tty, "size"); + AdaptiveFreeList::print_labels_on(gclog_or_tty, "size"); } fl->print_on(gclog_or_tty); total.set_bfr_surp( total.bfr_surp() + fl->bfr_surp() ); @@ -2620,7 +2622,7 @@ HeapWord* CFLS_LAB::alloc(size_t word_sz) { res = _cfls->getChunkFromDictionaryExact(word_sz); if (res == NULL) return NULL; } else { - FreeList* fl = &_indexedFreeList[word_sz]; + AdaptiveFreeList* fl = &_indexedFreeList[word_sz]; if (fl->count() == 0) { // Attempt to refill this local free list. get_from_global_pool(word_sz, fl); @@ -2640,7 +2642,7 @@ HeapWord* CFLS_LAB::alloc(size_t word_sz) { // Get a chunk of blocks of the right size and update related // book-keeping stats -void CFLS_LAB::get_from_global_pool(size_t word_sz, FreeList* fl) { +void CFLS_LAB::get_from_global_pool(size_t word_sz, AdaptiveFreeList* fl) { // Get the #blocks we want to claim size_t n_blks = (size_t)_blocks_to_claim[word_sz].average(); assert(n_blks > 0, "Error"); @@ -2722,7 +2724,7 @@ void CFLS_LAB::retire(int tid) { if (num_retire > 0) { _cfls->_indexedFreeList[i].prepend(&_indexedFreeList[i]); // Reset this list. - _indexedFreeList[i] = FreeList(); + _indexedFreeList[i] = AdaptiveFreeList(); _indexedFreeList[i].set_size(i); } } @@ -2736,7 +2738,7 @@ void CFLS_LAB::retire(int tid) { } } -void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList* fl) { +void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList* fl) { assert(fl->count() == 0, "Precondition."); assert(word_sz < CompactibleFreeListSpace::IndexSetSize, "Precondition"); @@ -2752,12 +2754,12 @@ void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n (cur_sz < CompactibleFreeListSpace::IndexSetSize) && (CMSSplitIndexedFreeListBlocks || k <= 1); k++, cur_sz = k * word_sz) { - FreeList fl_for_cur_sz; // Empty. + AdaptiveFreeList fl_for_cur_sz; // Empty. fl_for_cur_sz.set_size(cur_sz); { MutexLockerEx x(_indexedFreeListParLocks[cur_sz], Mutex::_no_safepoint_check_flag); - FreeList* gfl = &_indexedFreeList[cur_sz]; + AdaptiveFreeList* gfl = &_indexedFreeList[cur_sz]; if (gfl->count() != 0) { // nn is the number of chunks of size cur_sz that // we'd need to split k-ways each, in order to create @@ -2832,12 +2834,11 @@ void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n MutexLockerEx x(parDictionaryAllocLock(), Mutex::_no_safepoint_check_flag); while (n > 0) { - fc = dictionary()->get_chunk(MAX2(n * word_sz, - _dictionary->min_size()), + fc = dictionary()->get_chunk(MAX2(n * word_sz, _dictionary->min_size()), FreeBlockDictionary::atLeast); if (fc != NULL) { _bt.allocated((HeapWord*)fc, fc->size(), true /* reducing */); // update _unallocated_blk - dictionary()->dict_census_udpate(fc->size(), + dictionary()->dict_census_update(fc->size(), true /*split*/, false /*birth*/); break; @@ -2890,7 +2891,7 @@ void CompactibleFreeListSpace:: par_get_chunk_of_blocks(size_t word_sz, size_t n fc->set_size(prefix_size); if (rem >= IndexSetSize) { returnChunkToDictionary(rem_fc); - dictionary()->dict_census_udpate(rem, true /*split*/, true /*birth*/); + dictionary()->dict_census_update(rem, true /*split*/, true /*birth*/); rem_fc = NULL; } // Otherwise, return it to the small list below. diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp index 4d247356d50..1b3d93ed248 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/compactibleFreeListSpace.hpp @@ -25,6 +25,7 @@ #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_COMPACTIBLEFREELISTSPACE_HPP +#include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp" #include "gc_implementation/concurrentMarkSweep/promotionInfo.hpp" #include "memory/binaryTreeDictionary.hpp" #include "memory/blockOffsetTable.inline.hpp" @@ -38,6 +39,7 @@ class CompactibleFreeListSpace; class BlkClosure; class BlkClosureCareful; +class FreeChunk; class UpwardsObjectClosure; class ObjectClosureCareful; class Klass; @@ -131,7 +133,7 @@ class CompactibleFreeListSpace: public CompactibleSpace { FreeBlockDictionary::DictionaryChoice _dictionaryChoice; FreeBlockDictionary* _dictionary; // ptr to dictionary for large size blocks - FreeList _indexedFreeList[IndexSetSize]; + AdaptiveFreeList _indexedFreeList[IndexSetSize]; // indexed array for small size blocks // allocation stategy bool _fitStrategy; // Use best fit strategy. @@ -168,7 +170,7 @@ class CompactibleFreeListSpace: public CompactibleSpace { // If the count of "fl" is negative, it's absolute value indicates a // number of free chunks that had been previously "borrowed" from global // list of size "word_sz", and must now be decremented. - void par_get_chunk_of_blocks(size_t word_sz, size_t n, FreeList* fl); + void par_get_chunk_of_blocks(size_t word_sz, size_t n, AdaptiveFreeList* fl); // Allocation helper functions // Allocate using a strategy that takes from the indexed free lists @@ -214,7 +216,7 @@ class CompactibleFreeListSpace: public CompactibleSpace { // and return it. The split off remainder is returned to // the free lists. The old name for getFromListGreater // was lookInListGreater. - FreeChunk* getFromListGreater(FreeList* fl, size_t numWords); + FreeChunk* getFromListGreater(AdaptiveFreeList* fl, size_t numWords); // Get a chunk in the indexed free list or dictionary, // by considering a larger chunk and splitting it. FreeChunk* getChunkFromGreater(size_t numWords); @@ -621,7 +623,7 @@ class CFLS_LAB : public CHeapObj { CompactibleFreeListSpace* _cfls; // Our local free lists. - FreeList _indexedFreeList[CompactibleFreeListSpace::IndexSetSize]; + AdaptiveFreeList _indexedFreeList[CompactibleFreeListSpace::IndexSetSize]; // Initialized from a command-line arg. @@ -634,7 +636,7 @@ class CFLS_LAB : public CHeapObj { size_t _num_blocks [CompactibleFreeListSpace::IndexSetSize]; // Internal work method - void get_from_global_pool(size_t word_sz, FreeList* fl); + void get_from_global_pool(size_t word_sz, AdaptiveFreeList* fl); public: CFLS_LAB(CompactibleFreeListSpace* cfls); diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp index ac8b70017e0..475f2b8fee1 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp @@ -9143,7 +9143,7 @@ void ASConcurrentMarkSweepGeneration::shrink_by(size_t desired_bytes) { size_t shrinkable_size_in_bytes = chunk_at_end->size(); size_t aligned_shrinkable_size_in_bytes = align_size_down(shrinkable_size_in_bytes, os::vm_page_size()); - assert(unallocated_start <= chunk_at_end->end(), + assert(unallocated_start <= (HeapWord*) chunk_at_end->end(), "Inconsistent chunk at end of space"); size_t bytes = MIN2(desired_bytes, aligned_shrinkable_size_in_bytes); size_t word_size_before = heap_word_size(_virtual_space.committed_size()); @@ -9210,7 +9210,7 @@ void ASConcurrentMarkSweepGeneration::shrink_by(size_t desired_bytes) { assert(_cmsSpace->unallocated_block() <= _cmsSpace->end(), "Inconsistency at end of space"); - assert(chunk_at_end->end() == _cmsSpace->end(), + assert(chunk_at_end->end() == (uintptr_t*) _cmsSpace->end(), "Shrinking is inconsistent"); return; } diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp index 21934bca81c..8376e8798d8 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/freeChunk.hpp @@ -133,7 +133,7 @@ class FreeChunk VALUE_OBJ_CLASS_SPEC { } // Return the address past the end of this chunk - HeapWord* end() const { return ((HeapWord*) this) + size(); } + uintptr_t* end() const { return ((uintptr_t*) this) + size(); } // debugging void verify() const PRODUCT_RETURN; diff --git a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp index c393a55285c..b722779b897 100644 --- a/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp +++ b/hotspot/src/share/vm/gc_implementation/concurrentMarkSweep/vmStructs_cms.hpp @@ -25,6 +25,8 @@ #ifndef SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_VMSTRUCTS_CMS_HPP #define SHARE_VM_GC_IMPLEMENTATION_CONCURRENTMARKSWEEP_VMSTRUCTS_CMS_HPP +typedef BinaryTreeDictionary AFLBinaryTreeDictionary; + #define VM_STRUCTS_CMS(nonstatic_field, \ volatile_nonstatic_field, \ static_field) \ @@ -38,14 +40,8 @@ nonstatic_field(CMSCollector, _markBitMap, CMSBitMap) \ nonstatic_field(ConcurrentMarkSweepGeneration, _cmsSpace, CompactibleFreeListSpace*) \ static_field(ConcurrentMarkSweepThread, _collector, CMSCollector*) \ - volatile_nonstatic_field(FreeChunk, _size, size_t) \ - nonstatic_field(FreeChunk, _next, FreeChunk*) \ - nonstatic_field(FreeChunk, _prev, FreeChunk*) \ nonstatic_field(LinearAllocBlock, _word_size, size_t) \ - nonstatic_field(FreeList, _size, size_t) \ - nonstatic_field(FreeList, _count, ssize_t) \ - nonstatic_field(BinaryTreeDictionary,_total_size, size_t) \ - nonstatic_field(CompactibleFreeListSpace, _dictionary, FreeBlockDictionary*) \ + nonstatic_field(AFLBinaryTreeDictionary, _total_size, size_t) \ nonstatic_field(CompactibleFreeListSpace, _indexedFreeList[0], FreeList) \ nonstatic_field(CompactibleFreeListSpace, _smallLinearAllocBlock, LinearAllocBlock) @@ -60,19 +56,17 @@ declare_toplevel_type(CMSCollector) \ declare_toplevel_type(CMSBitMap) \ declare_toplevel_type(FreeChunk) \ + declare_toplevel_type(Metablock) \ declare_toplevel_type(ConcurrentMarkSweepThread*) \ declare_toplevel_type(ConcurrentMarkSweepGeneration*) \ declare_toplevel_type(SurrogateLockerThread*) \ declare_toplevel_type(CompactibleFreeListSpace*) \ declare_toplevel_type(CMSCollector*) \ - declare_toplevel_type(FreeChunk*) \ - declare_toplevel_type(BinaryTreeDictionary*) \ - declare_toplevel_type(FreeBlockDictionary*) \ - declare_toplevel_type(FreeList*) \ - declare_toplevel_type(FreeList) \ + declare_toplevel_type(AFLBinaryTreeDictionary*) \ declare_toplevel_type(LinearAllocBlock) \ declare_toplevel_type(FreeBlockDictionary) \ - declare_type(BinaryTreeDictionary, FreeBlockDictionary) + declare_type(AFLBinaryTreeDictionary, FreeBlockDictionary) \ + declare_type(AFLBinaryTreeDictionary, FreeBlockDictionary) \ #define VM_INT_CONSTANTS_CMS(declare_constant) \ declare_constant(Generation::ConcurrentMarkSweep) \ diff --git a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp index 3966877e489..285ef97e378 100644 --- a/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp +++ b/hotspot/src/share/vm/gc_implementation/shared/vmGCOperations.hpp @@ -191,7 +191,7 @@ class VM_GenCollectFull: public VM_GC_Operation { class VM_CollectForMetadataAllocation: public VM_GC_Operation { private: MetaWord* _result; - size_t _size; // size of object to be allocated + size_t _size; // size of object to be allocated Metaspace::MetadataType _mdtype; ClassLoaderData* _loader_data; public: diff --git a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp index b0870c0f1e2..4dc2ef451c2 100644 --- a/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/abstractInterpreter.hpp @@ -320,6 +320,7 @@ class AbstractInterpreterGenerator: public StackObj { void bang_stack_shadow_pages(bool native_call); void generate_all(); + void initialize_method_handle_entries(); public: AbstractInterpreterGenerator(StubQueue* _code); diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp index 6c18761dba2..a9d6cc9a981 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.cpp @@ -235,10 +235,6 @@ #endif #endif -// JavaStack Implementation -#define MORE_STACK(count) \ - (topOfStack -= ((count) * Interpreter::stackElementWords)) - #define UPDATE_PC(opsize) {pc += opsize; } /* @@ -575,7 +571,7 @@ BytecodeInterpreter::run(interpreterState istate) { /* 0xE0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xE4 */ &&opc_default, &&opc_fast_aldc, &&opc_fast_aldc_w, &&opc_return_register_finalizer, -/* 0xE8 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, +/* 0xE8 */ &&opc_invokehandle,&&opc_default, &&opc_default, &&opc_default, /* 0xEC */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, /* 0xF0 */ &&opc_default, &&opc_default, &&opc_default, &&opc_default, @@ -1773,7 +1769,7 @@ run: oop obj; if ((Bytecodes::Code)opcode == Bytecodes::_getstatic) { - Klass* k = (Klass*) cache->f1(); + Klass* k = cache->f1_as_klass(); obj = k->java_mirror(); MORE_STACK(1); // Assume single slot push } else { @@ -1885,7 +1881,7 @@ run: --count; } if ((Bytecodes::Code)opcode == Bytecodes::_putstatic) { - Klass* k = (Klass*) cache->f1(); + Klass* k = cache->f1_as_klass(); obj = k->java_mirror(); } else { --count; @@ -2190,6 +2186,7 @@ run: } CASE(_invokedynamic): { + if (!EnableInvokeDynamic) { // We should not encounter this bytecode if !EnableInvokeDynamic. // The verifier will stop it. However, if we get past the verifier, @@ -2199,30 +2196,68 @@ run: ShouldNotReachHere(); } - int index = Bytes::get_native_u4(pc+1); + u4 index = Bytes::get_native_u4(pc+1); + ConstantPoolCacheEntry* cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index); // We are resolved if the resolved_references field contains a non-null object (CallSite, etc.) // This kind of CP cache entry does not need to match the flags byte, because // there is a 1-1 relation between bytecode type and CP entry type. - ConstantPool* constants = METHOD->constants(); - oop result = constants->resolved_references()->obj_at(index); - if (result == NULL) { + if (! cache->is_resolved((Bytecodes::Code) opcode)) { CALL_VM(InterpreterRuntime::resolve_invokedynamic(THREAD), handle_exception); - result = THREAD->vm_result(); + cache = cp->constant_pool()->invokedynamic_cp_cache_entry_at(index); } - VERIFY_OOP(result); - oop method_handle = java_lang_invoke_CallSite::target(result); - CHECK_NULL(method_handle); + Method* method = cache->f1_as_method(); + VERIFY_OOP(method); - istate->set_msg(call_method_handle); - istate->set_callee((Method*) method_handle); + if (cache->has_appendix()) { + ConstantPool* constants = METHOD->constants(); + SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0); + MORE_STACK(1); + } + + istate->set_msg(call_method); + istate->set_callee(method); + istate->set_callee_entry_point(method->from_interpreted_entry()); istate->set_bcp_advance(5); UPDATE_PC_AND_RETURN(0); // I'll be back... } + CASE(_invokehandle): { + + if (!EnableInvokeDynamic) { + ShouldNotReachHere(); + } + + u2 index = Bytes::get_native_u2(pc+1); + ConstantPoolCacheEntry* cache = cp->entry_at(index); + + if (! cache->is_resolved((Bytecodes::Code) opcode)) { + CALL_VM(InterpreterRuntime::resolve_invokehandle(THREAD), + handle_exception); + cache = cp->entry_at(index); + } + + Method* method = cache->f1_as_method(); + + VERIFY_OOP(method); + + if (cache->has_appendix()) { + ConstantPool* constants = METHOD->constants(); + SET_STACK_OBJECT(cache->appendix_if_resolved(constants), 0); + MORE_STACK(1); + } + + istate->set_msg(call_method); + istate->set_callee(method); + istate->set_callee_entry_point(method->from_interpreted_entry()); + istate->set_bcp_advance(3); + + UPDATE_PC_AND_RETURN(0); // I'll be back... + } + CASE(_invokeinterface): { u2 index = Bytes::get_native_u2(pc+1); diff --git a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp index c1614cdf8e5..d528034d3f0 100644 --- a/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp +++ b/hotspot/src/share/vm/interpreter/bytecodeInterpreter.hpp @@ -50,6 +50,10 @@ #ifdef CC_INTERP +// JavaStack Implementation +#define MORE_STACK(count) \ + (topOfStack -= ((count) * Interpreter::stackElementWords)) + // CVM definitions find hotspot equivalents... union VMJavaVal64 { @@ -107,7 +111,6 @@ public: rethrow_exception, // unwinding and throwing exception // requests to frame manager from C++ interpreter call_method, // request for new frame from interpreter, manager responds with method_entry - call_method_handle, // like the above, except the callee is a method handle return_from_method, // request from interpreter to unwind, manager responds with method_continue more_monitors, // need a new monitor throwing_exception, // unwind stack and rethrow diff --git a/hotspot/src/share/vm/interpreter/cppInterpreter.cpp b/hotspot/src/share/vm/interpreter/cppInterpreter.cpp index 9a6669519f6..0007aa8be25 100644 --- a/hotspot/src/share/vm/interpreter/cppInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/cppInterpreter.cpp @@ -117,7 +117,6 @@ void CppInterpreterGenerator::generate_all() { method_entry(empty); method_entry(accessor); method_entry(abstract); - method_entry(method_handle); method_entry(java_lang_math_sin ); method_entry(java_lang_math_cos ); method_entry(java_lang_math_tan ); @@ -125,7 +124,12 @@ void CppInterpreterGenerator::generate_all() { method_entry(java_lang_math_sqrt ); method_entry(java_lang_math_log ); method_entry(java_lang_math_log10 ); + method_entry(java_lang_math_pow ); + method_entry(java_lang_math_exp ); method_entry(java_lang_ref_reference_get); + + initialize_method_handle_entries(); + Interpreter::_native_entry_begin = Interpreter::code()->code_end(); method_entry(native); method_entry(native_synchronized); diff --git a/hotspot/src/share/vm/interpreter/interpreter.cpp b/hotspot/src/share/vm/interpreter/interpreter.cpp index dad8f9ec751..4513eebb79c 100644 --- a/hotspot/src/share/vm/interpreter/interpreter.cpp +++ b/hotspot/src/share/vm/interpreter/interpreter.cpp @@ -464,3 +464,11 @@ void AbstractInterpreterGenerator::bang_stack_shadow_pages(bool native_call) { } } } + +void AbstractInterpreterGenerator::initialize_method_handle_entries() { + // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate: + for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) { + Interpreter::MethodKind kind = (Interpreter::MethodKind) i; + Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract]; + } +} diff --git a/hotspot/src/share/vm/interpreter/linkResolver.cpp b/hotspot/src/share/vm/interpreter/linkResolver.cpp index c794f06e175..4a32b794110 100644 --- a/hotspot/src/share/vm/interpreter/linkResolver.cpp +++ b/hotspot/src/share/vm/interpreter/linkResolver.cpp @@ -23,6 +23,7 @@ */ #include "precompiled.hpp" +#include "classfile/defaultMethods.hpp" #include "classfile/systemDictionary.hpp" #include "classfile/vmSymbols.hpp" #include "compiler/compileBroker.hpp" @@ -132,7 +133,7 @@ void CallInfo::set_common(KlassHandle resolved_klass, KlassHandle selected_klass // don't force compilation, resolve was on behalf of compiler return; } - if (InstanceKlass::cast(selected_method->method_holder())->is_not_initialized()) { + if (selected_method->method_holder()->is_not_initialized()) { // 'is_not_initialized' means not only '!is_initialized', but also that // initialization has not been started yet ('!being_initialized') // Do not force compilation of methods in uninitialized classes. @@ -404,21 +405,13 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) { - // 1. check if klass is not interface - if (resolved_klass->is_interface()) { - ResourceMark rm(THREAD); - char buf[200]; - jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", Klass::cast(resolved_klass())->external_name()); - THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); - } - Handle nested_exception; - // 2. lookup method in resolved klass and its super klasses + // 1. lookup method in resolved klass and its super klasses lookup_method_in_klasses(resolved_method, resolved_klass, method_name, method_signature, CHECK); if (resolved_method.is_null()) { // not found in the class hierarchy - // 3. lookup method in all the interfaces implemented by the resolved klass + // 2. lookup method in all the interfaces implemented by the resolved klass lookup_method_in_interfaces(resolved_method, resolved_klass, method_name, method_signature, CHECK); if (resolved_method.is_null()) { @@ -432,7 +425,7 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res } if (resolved_method.is_null()) { - // 4. method lookup failed + // 3. method lookup failed ResourceMark rm(THREAD); THROW_MSG_CAUSE(vmSymbols::java_lang_NoSuchMethodError(), Method::name_and_sig_as_C_string(Klass::cast(resolved_klass()), @@ -442,6 +435,15 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res } } + // 4. check if klass is not interface + if (resolved_klass->is_interface() && resolved_method->is_abstract()) { + ResourceMark rm(THREAD); + char buf[200]; + jio_snprintf(buf, sizeof(buf), "Found interface %s, but class was expected", + resolved_klass()->external_name()); + THROW_MSG(vmSymbols::java_lang_IncompatibleClassChangeError(), buf); + } + // 5. check if method is concrete if (resolved_method->is_abstract() && !resolved_klass->is_abstract()) { ResourceMark rm(THREAD); @@ -464,7 +466,7 @@ void LinkResolver::resolve_method(methodHandle& resolved_method, KlassHandle res // check loader constraints Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader()); - Handle class_loader (THREAD, InstanceKlass::cast(resolved_method->method_holder())->class_loader()); + Handle class_loader (THREAD, resolved_method->method_holder()->class_loader()); { ResourceMark rm(THREAD); char* failed_type_name = @@ -526,7 +528,7 @@ void LinkResolver::resolve_interface_method(methodHandle& resolved_method, if (check_access) { HandleMark hm(THREAD); Handle loader (THREAD, InstanceKlass::cast(current_klass())->class_loader()); - Handle class_loader (THREAD, InstanceKlass::cast(resolved_method->method_holder())->class_loader()); + Handle class_loader (THREAD, resolved_method->method_holder()->class_loader()); { ResourceMark rm(THREAD); char* failed_type_name = @@ -743,6 +745,27 @@ void LinkResolver::linktime_resolve_special_method(methodHandle& resolved_method Symbol* method_name, Symbol* method_signature, KlassHandle current_klass, bool check_access, TRAPS) { + if (resolved_klass->is_interface() && current_klass() != NULL) { + // If the target class is a direct interface, treat this as a "super" + // default call. + // + // If the current method is an overpass that happens to call a direct + // super-interface's method, then we'll end up rerunning the default method + // analysis even though we don't need to, but that's ok since it will end + // up with the same answer. + InstanceKlass* ik = InstanceKlass::cast(current_klass()); + Array* interfaces = ik->local_interfaces(); + int num_interfaces = interfaces->length(); + for (int index = 0; index < num_interfaces; index++) { + if (interfaces->at(index) == resolved_klass()) { + Method* method = DefaultMethods::find_super_default(current_klass(), + resolved_klass(), method_name, method_signature, CHECK); + resolved_method = methodHandle(THREAD, method); + return; + } + } + } + resolve_method(resolved_method, resolved_klass, method_name, method_signature, current_klass, check_access, CHECK); // check if method name is , that it is found in same klass as static type @@ -784,11 +807,17 @@ void LinkResolver::runtime_resolve_special_method(CallInfo& result, methodHandle { KlassHandle method_klass = KlassHandle(THREAD, resolved_method->method_holder()); - if (check_access && + const bool direct_calling_default_method = + resolved_klass() != NULL && resolved_method() != NULL && + resolved_klass->is_interface() && !resolved_method->is_abstract(); + + if (!direct_calling_default_method && + check_access && // a) check if ACC_SUPER flag is set for the current class current_klass->is_super() && // b) check if the method class is a superclass of the current class (superclass relation is not reflexive!) - current_klass->is_subtype_of(method_klass()) && current_klass() != method_klass() && + current_klass->is_subtype_of(method_klass()) && + current_klass() != method_klass() && // c) check if the method is not resolved_method->name() != vmSymbols::object_initializer_name()) { // Lookup super method @@ -881,12 +910,12 @@ void LinkResolver::runtime_resolve_virtual_method(CallInfo& result, // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s // has not been rewritten, and the vtable initialized. - assert(InstanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked"); + assert(resolved_method->method_holder()->is_linked(), "must be linked"); // Virtual methods cannot be resolved before its klass has been linked, for otherwise the Method*'s // has not been rewritten, and the vtable initialized. Make sure to do this after the nullcheck, since // a missing receiver might result in a bogus lookup. - assert(InstanceKlass::cast(resolved_method->method_holder())->is_linked(), "must be linked"); + assert(resolved_method->method_holder()->is_linked(), "must be linked"); // do lookup based on receiver klass using the vtable index if (resolved_method->method_holder()->is_interface()) { // miranda method diff --git a/hotspot/src/share/vm/interpreter/templateInterpreter.cpp b/hotspot/src/share/vm/interpreter/templateInterpreter.cpp index beb99fa15e4..53e50b1c7fe 100644 --- a/hotspot/src/share/vm/interpreter/templateInterpreter.cpp +++ b/hotspot/src/share/vm/interpreter/templateInterpreter.cpp @@ -373,11 +373,7 @@ void TemplateInterpreterGenerator::generate_all() { method_entry(java_lang_math_pow ) method_entry(java_lang_ref_reference_get) - // method handle entry kinds are generated later in MethodHandlesAdapterGenerator::generate: - for (int i = Interpreter::method_handle_invoke_FIRST; i <= Interpreter::method_handle_invoke_LAST; i++) { - Interpreter::MethodKind kind = (Interpreter::MethodKind) i; - Interpreter::_entry_table[kind] = Interpreter::_entry_table[Interpreter::abstract]; - } + initialize_method_handle_entries(); // all native method kinds (must be one contiguous block) Interpreter::_native_entry_begin = Interpreter::code()->code_end(); diff --git a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp index 08a9b033432..f79d149f1e5 100644 --- a/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp +++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.cpp @@ -25,9 +25,15 @@ #include "precompiled.hpp" #include "gc_implementation/shared/allocationStats.hpp" #include "memory/binaryTreeDictionary.hpp" +#include "memory/freeList.hpp" +#include "memory/freeBlockDictionary.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #include "runtime/globals.hpp" #include "utilities/ostream.hpp" #ifndef SERIALGC +#include "gc_implementation/concurrentMarkSweep/adaptiveFreeList.hpp" +#include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" #include "gc_implementation/shared/spaceDecorator.hpp" #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" #endif // SERIALGC @@ -37,15 +43,18 @@ // This is currently used in the Concurrent Mark&Sweep implementation. //////////////////////////////////////////////////////////////////////////////// -template -TreeChunk* TreeChunk::as_TreeChunk(Chunk* fc) { +template class FreeList_t> +size_t TreeChunk::_min_tree_chunk_size = sizeof(TreeChunk)/HeapWordSize; + +template class FreeList_t> +TreeChunk* TreeChunk::as_TreeChunk(Chunk_t* fc) { // Do some assertion checking here. - return (TreeChunk*) fc; + return (TreeChunk*) fc; } -template -void TreeChunk::verify_tree_chunk_list() const { - TreeChunk* nextTC = (TreeChunk*)next(); +template class FreeList_t> +void TreeChunk::verify_tree_chunk_list() const { + TreeChunk* nextTC = (TreeChunk*)next(); if (prev() != NULL) { // interior list node shouldn'r have tree fields guarantee(embedded_list()->parent() == NULL && embedded_list()->left() == NULL && embedded_list()->right() == NULL, "should be clear"); @@ -57,53 +66,113 @@ void TreeChunk::verify_tree_chunk_list() const { } } +template class FreeList_t> +TreeList::TreeList() {} -template -TreeList* TreeList::as_TreeList(TreeChunk* tc) { +template class FreeList_t> +TreeList* +TreeList::as_TreeList(TreeChunk* tc) { // This first free chunk in the list will be the tree list. - assert(tc->size() >= BinaryTreeDictionary::min_tree_chunk_size, "Chunk is too small for a TreeChunk"); - TreeList* tl = tc->embedded_list(); + assert((tc->size() >= (TreeChunk::min_size())), + "Chunk is too small for a TreeChunk"); + TreeList* tl = tc->embedded_list(); + tl->initialize(); tc->set_list(tl); -#ifdef ASSERT - tl->set_protecting_lock(NULL); -#endif - tl->set_hint(0); tl->set_size(tc->size()); tl->link_head(tc); tl->link_tail(tc); tl->set_count(1); - tl->init_statistics(true /* split_birth */); - tl->set_parent(NULL); - tl->set_left(NULL); - tl->set_right(NULL); + return tl; } -template -TreeList* TreeList::as_TreeList(HeapWord* addr, size_t size) { - TreeChunk* tc = (TreeChunk*) addr; - assert(size >= BinaryTreeDictionary::min_tree_chunk_size, "Chunk is too small for a TreeChunk"); - // The space in the heap will have been mangled initially but - // is not remangled when a free chunk is returned to the free list + +template class FreeList_t> +TreeList* +get_chunk(size_t size, enum FreeBlockDictionary::Dither dither) { + FreeBlockDictionary::verify_par_locked(); + Chunk_t* res = get_chunk_from_tree(size, dither); + assert(res == NULL || res->is_free(), + "Should be returning a free chunk"); + assert(dither != FreeBlockDictionary::exactly || + res->size() == size, "Not correct size"); + return res; +} + +template class FreeList_t> +TreeList* +TreeList::as_TreeList(HeapWord* addr, size_t size) { + TreeChunk* tc = (TreeChunk*) addr; + assert((size >= TreeChunk::min_size()), + "Chunk is too small for a TreeChunk"); + // The space will have been mangled initially but + // is not remangled when a Chunk_t is returned to the free list // (since it is used to maintain the chunk on the free list). - assert((ZapUnusedHeapArea && - SpaceMangler::is_mangled((HeapWord*) tc->size_addr()) && - SpaceMangler::is_mangled((HeapWord*) tc->prev_addr()) && - SpaceMangler::is_mangled((HeapWord*) tc->next_addr())) || - (tc->size() == 0 && tc->prev() == NULL && tc->next() == NULL), - "Space should be clear or mangled"); + tc->assert_is_mangled(); tc->set_size(size); tc->link_prev(NULL); tc->link_next(NULL); - TreeList* tl = TreeList::as_TreeList(tc); + TreeList* tl = TreeList::as_TreeList(tc); return tl; } -template -TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk* tc) { - TreeList* retTL = this; - Chunk* list = head(); +#ifndef SERIALGC +// Specialize for AdaptiveFreeList which tries to avoid +// splitting a chunk of a size that is under populated in favor of +// an over populated size. The general get_better_list() just returns +// the current list. +template <> +TreeList* +TreeList::get_better_list( + BinaryTreeDictionary* dictionary) { + // A candidate chunk has been found. If it is already under + // populated, get a chunk associated with the hint for this + // chunk. + + TreeList* curTL = this; + if (surplus() <= 0) { + /* Use the hint to find a size with a surplus, and reset the hint. */ + TreeList* hintTL = this; + while (hintTL->hint() != 0) { + assert(hintTL->hint() > hintTL->size(), + "hint points in the wrong direction"); + hintTL = dictionary->find_list(hintTL->hint()); + assert(curTL != hintTL, "Infinite loop"); + if (hintTL == NULL || + hintTL == curTL /* Should not happen but protect against it */ ) { + // No useful hint. Set the hint to NULL and go on. + curTL->set_hint(0); + break; + } + assert(hintTL->size() > curTL->size(), "hint is inconsistent"); + if (hintTL->surplus() > 0) { + // The hint led to a list that has a surplus. Use it. + // Set the hint for the candidate to an overpopulated + // size. + curTL->set_hint(hintTL->size()); + // Change the candidate. + curTL = hintTL; + break; + } + } + } + return curTL; +} +#endif // SERIALGC + +template class FreeList_t> +TreeList* +TreeList::get_better_list( + BinaryTreeDictionary* dictionary) { + return this; +} + +template class FreeList_t> +TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk* tc) { + + TreeList* retTL = this; + Chunk_t* list = head(); assert(!list || list != list->next(), "Chunk on list twice"); assert(tc != NULL, "Chunk being removed is NULL"); assert(parent() == NULL || this == parent()->left() || @@ -112,13 +181,13 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunkprev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* prevFC = tc->prev(); - TreeChunk* nextTC = TreeChunk::as_TreeChunk(tc->next()); + Chunk_t* prevFC = tc->prev(); + TreeChunk* nextTC = TreeChunk::as_TreeChunk(tc->next()); assert(list != NULL, "should have at least the target chunk"); // Is this the first item on the list? if (tc == list) { - // The "getChunk..." functions for a TreeList will not return the + // The "getChunk..." functions for a TreeList will not return the // first chunk in the list unless it is the last chunk in the list // because the first chunk is also acting as the tree node. // When coalescing happens, however, the first chunk in the a tree @@ -127,8 +196,8 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk from the first chunk to the next chunk and update all - // the TreeList pointers in the chunks in the list. + // TreeList from the first chunk to the next chunk and update all + // the TreeList pointers in the chunks in the list. if (nextTC == NULL) { assert(prevFC == NULL, "Not last chunk in the list"); set_tail(NULL); @@ -141,11 +210,11 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk* curTC = nextTC; curTC != NULL; - curTC = TreeChunk::as_TreeChunk(curTC->next())) { + for (TreeChunk* curTC = nextTC; curTC != NULL; + curTC = TreeChunk::as_TreeChunk(curTC->next())) { curTC->set_list(retTL); } - // Fix the parent to point to the new TreeList. + // Fix the parent to point to the new TreeList. if (retTL->parent() != NULL) { if (this == retTL->parent()->left()) { retTL->parent()->set_left(retTL); @@ -176,9 +245,9 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunklink_after(nextTC); } - // Below this point the embeded TreeList being used for the + // Below this point the embeded TreeList being used for the // tree node may have changed. Don't use "this" - // TreeList*. + // TreeList*. // chunk should still be a free chunk (bit set in _prev) assert(!retTL->head() || retTL->size() == retTL->head()->size(), "Wrong sized chunk in list"); @@ -188,7 +257,7 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunkset_list(NULL); bool prev_found = false; bool next_found = false; - for (Chunk* curFC = retTL->head(); + for (Chunk_t* curFC = retTL->head(); curFC != NULL; curFC = curFC->next()) { assert(curFC != tc, "Chunk is still in list"); if (curFC == prevFC) { @@ -215,8 +284,8 @@ TreeList* TreeList::remove_chunk_replace_if_needed(TreeChunk -void TreeList::return_chunk_at_tail(TreeChunk* chunk) { +template class FreeList_t> +void TreeList::return_chunk_at_tail(TreeChunk* chunk) { assert(chunk != NULL, "returning NULL chunk"); assert(chunk->list() == this, "list should be set for chunk"); assert(tail() != NULL, "The tree list is embedded in the first chunk"); @@ -225,12 +294,12 @@ void TreeList::return_chunk_at_tail(TreeChunk* chunk) { assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* fc = tail(); + Chunk_t* fc = tail(); fc->link_after(chunk); link_tail(chunk); assert(!tail() || size() == tail()->size(), "Wrong sized chunk in list"); - increment_count(); + FreeList_t::increment_count(); debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); @@ -238,10 +307,10 @@ void TreeList::return_chunk_at_tail(TreeChunk* chunk) { // Add this chunk at the head of the list. "At the head of the list" // is defined to be after the chunk pointer to by head(). This is -// because the TreeList is embedded in the first TreeChunk in the -// list. See the definition of TreeChunk. -template -void TreeList::return_chunk_at_head(TreeChunk* chunk) { +// because the TreeList is embedded in the first TreeChunk in the +// list. See the definition of TreeChunk. +template class FreeList_t> +void TreeList::return_chunk_at_head(TreeChunk* chunk) { assert(chunk->list() == this, "list should be set for chunk"); assert(head() != NULL, "The tree list is embedded in the first chunk"); assert(chunk != NULL, "returning NULL chunk"); @@ -249,7 +318,7 @@ void TreeList::return_chunk_at_head(TreeChunk* chunk) { assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* fc = head()->next(); + Chunk_t* fc = head()->next(); if (fc != NULL) { chunk->link_after(fc); } else { @@ -258,28 +327,38 @@ void TreeList::return_chunk_at_head(TreeChunk* chunk) { } head()->link_after(chunk); assert(!head() || size() == head()->size(), "Wrong sized chunk in list"); - increment_count(); + FreeList_t::increment_count(); debug_only(increment_returned_bytes_by(chunk->size()*sizeof(HeapWord));) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); } -template -TreeChunk* TreeList::head_as_TreeChunk() { - assert(head() == NULL || TreeChunk::as_TreeChunk(head())->list() == this, - "Wrong type of chunk?"); - return TreeChunk::as_TreeChunk(head()); +template class FreeList_t> +void TreeChunk::assert_is_mangled() const { + assert((ZapUnusedHeapArea && + SpaceMangler::is_mangled((HeapWord*) Chunk_t::size_addr()) && + SpaceMangler::is_mangled((HeapWord*) Chunk_t::prev_addr()) && + SpaceMangler::is_mangled((HeapWord*) Chunk_t::next_addr())) || + (size() == 0 && prev() == NULL && next() == NULL), + "Space should be clear or mangled"); } -template -TreeChunk* TreeList::first_available() { +template class FreeList_t> +TreeChunk* TreeList::head_as_TreeChunk() { + assert(head() == NULL || (TreeChunk::as_TreeChunk(head())->list() == this), + "Wrong type of chunk?"); + return TreeChunk::as_TreeChunk(head()); +} + +template class FreeList_t> +TreeChunk* TreeList::first_available() { assert(head() != NULL, "The head of the list cannot be NULL"); - Chunk* fc = head()->next(); - TreeChunk* retTC; + Chunk_t* fc = head()->next(); + TreeChunk* retTC; if (fc == NULL) { retTC = head_as_TreeChunk(); } else { - retTC = TreeChunk::as_TreeChunk(fc); + retTC = TreeChunk::as_TreeChunk(fc); } assert(retTC->list() == this, "Wrong type of chunk."); return retTC; @@ -288,41 +367,32 @@ TreeChunk* TreeList::first_available() { // Returns the block with the largest heap address amongst // those in the list for this size; potentially slow and expensive, // use with caution! -template -TreeChunk* TreeList::largest_address() { +template class FreeList_t> +TreeChunk* TreeList::largest_address() { assert(head() != NULL, "The head of the list cannot be NULL"); - Chunk* fc = head()->next(); - TreeChunk* retTC; + Chunk_t* fc = head()->next(); + TreeChunk* retTC; if (fc == NULL) { retTC = head_as_TreeChunk(); } else { // walk down the list and return the one with the highest // heap address among chunks of this size. - Chunk* last = fc; + Chunk_t* last = fc; while (fc->next() != NULL) { if ((HeapWord*)last < (HeapWord*)fc) { last = fc; } fc = fc->next(); } - retTC = TreeChunk::as_TreeChunk(last); + retTC = TreeChunk::as_TreeChunk(last); } assert(retTC->list() == this, "Wrong type of chunk."); return retTC; } -template -BinaryTreeDictionary::BinaryTreeDictionary(bool adaptive_freelists, bool splay) : - _splay(splay), _adaptive_freelists(adaptive_freelists), - _total_size(0), _total_free_blocks(0), _root(0) {} - -template -BinaryTreeDictionary::BinaryTreeDictionary(MemRegion mr, - bool adaptive_freelists, - bool splay): - _adaptive_freelists(adaptive_freelists), _splay(splay) -{ - assert(mr.word_size() >= BinaryTreeDictionary::min_tree_chunk_size, "minimum chunk size"); +template class FreeList_t> +BinaryTreeDictionary::BinaryTreeDictionary(MemRegion mr) { + assert((mr.byte_size() > min_size()), "minimum chunk size"); reset(mr); assert(root()->left() == NULL, "reset check failed"); @@ -333,52 +403,48 @@ BinaryTreeDictionary::BinaryTreeDictionary(MemRegion mr, assert(total_free_blocks() == 1, "reset check failed"); } -template -void BinaryTreeDictionary::inc_total_size(size_t inc) { +template class FreeList_t> +void BinaryTreeDictionary::inc_total_size(size_t inc) { _total_size = _total_size + inc; } -template -void BinaryTreeDictionary::dec_total_size(size_t dec) { +template class FreeList_t> +void BinaryTreeDictionary::dec_total_size(size_t dec) { _total_size = _total_size - dec; } -template -void BinaryTreeDictionary::reset(MemRegion mr) { - assert(mr.word_size() >= BinaryTreeDictionary::min_tree_chunk_size, "minimum chunk size"); - set_root(TreeList::as_TreeList(mr.start(), mr.word_size())); +template class FreeList_t> +void BinaryTreeDictionary::reset(MemRegion mr) { + assert((mr.byte_size() > min_size()), "minimum chunk size"); + set_root(TreeList::as_TreeList(mr.start(), mr.word_size())); set_total_size(mr.word_size()); set_total_free_blocks(1); } -template -void BinaryTreeDictionary::reset(HeapWord* addr, size_t byte_size) { +template class FreeList_t> +void BinaryTreeDictionary::reset(HeapWord* addr, size_t byte_size) { MemRegion mr(addr, heap_word_size(byte_size)); reset(mr); } -template -void BinaryTreeDictionary::reset() { +template class FreeList_t> +void BinaryTreeDictionary::reset() { set_root(NULL); set_total_size(0); set_total_free_blocks(0); } // Get a free block of size at least size from tree, or NULL. -// If a splay step is requested, the removal algorithm (only) incorporates -// a splay step as follows: -// . the search proceeds down the tree looking for a possible -// match. At the (closest) matching location, an appropriate splay step is applied -// (zig, zig-zig or zig-zag). A chunk of the appropriate size is then returned -// if available, and if it's the last chunk, the node is deleted. A deteleted -// node is replaced in place by its tree successor. -template -TreeChunk* -BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDictionary::Dither dither, bool splay) +template class FreeList_t> +TreeChunk* +BinaryTreeDictionary::get_chunk_from_tree( + size_t size, + enum FreeBlockDictionary::Dither dither) { - TreeList *curTL, *prevTL; - TreeChunk* retTC = NULL; - assert(size >= BinaryTreeDictionary::min_tree_chunk_size, "minimum chunk size"); + TreeList *curTL, *prevTL; + TreeChunk* retTC = NULL; + + assert((size >= min_size()), "minimum chunk size"); if (FLSVerifyDictionary) { verify_tree(); } @@ -398,7 +464,7 @@ BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDict } if (curTL == NULL) { // couldn't find exact match - if (dither == FreeBlockDictionary::exactly) return NULL; + if (dither == FreeBlockDictionary::exactly) return NULL; // try and find the next larger size by walking back up the search path for (curTL = prevTL; curTL != NULL;) { @@ -410,46 +476,9 @@ BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDict } if (curTL != NULL) { assert(curTL->size() >= size, "size inconsistency"); - if (adaptive_freelists()) { - // A candidate chunk has been found. If it is already under - // populated, get a chunk associated with the hint for this - // chunk. - if (curTL->surplus() <= 0) { - /* Use the hint to find a size with a surplus, and reset the hint. */ - TreeList* hintTL = curTL; - while (hintTL->hint() != 0) { - assert(hintTL->hint() == 0 || hintTL->hint() > hintTL->size(), - "hint points in the wrong direction"); - hintTL = find_list(hintTL->hint()); - assert(curTL != hintTL, "Infinite loop"); - if (hintTL == NULL || - hintTL == curTL /* Should not happen but protect against it */ ) { - // No useful hint. Set the hint to NULL and go on. - curTL->set_hint(0); - break; - } - assert(hintTL->size() > size, "hint is inconsistent"); - if (hintTL->surplus() > 0) { - // The hint led to a list that has a surplus. Use it. - // Set the hint for the candidate to an overpopulated - // size. - curTL->set_hint(hintTL->size()); - // Change the candidate. - curTL = hintTL; - break; - } - // The evm code reset the hint of the candidate as - // at an interim point. Why? Seems like this leaves - // the hint pointing to a list that didn't work. - // curTL->set_hint(hintTL->size()); - } - } - } - // don't waste time splaying if chunk's singleton - if (splay && curTL->head()->next() != NULL) { - semi_splay_step(curTL); - } + curTL = curTL->get_better_list(this); + retTC = curTL->first_available(); assert((retTC != NULL) && (curTL->count() > 0), "A list in the binary tree should not be NULL"); @@ -465,9 +494,9 @@ BinaryTreeDictionary::get_chunk_from_tree(size_t size, enum FreeBlockDict return retTC; } -template -TreeList* BinaryTreeDictionary::find_list(size_t size) const { - TreeList* curTL; +template class FreeList_t> +TreeList* BinaryTreeDictionary::find_list(size_t size) const { + TreeList* curTL; for (curTL = root(); curTL != NULL;) { if (curTL->size() == size) { // exact match break; @@ -484,10 +513,10 @@ TreeList* BinaryTreeDictionary::find_list(size_t size) const { } -template -bool BinaryTreeDictionary::verify_chunk_in_free_list(Chunk* tc) const { +template class FreeList_t> +bool BinaryTreeDictionary::verify_chunk_in_free_list(Chunk_t* tc) const { size_t size = tc->size(); - TreeList* tl = find_list(size); + TreeList* tl = find_list(size); if (tl == NULL) { return false; } else { @@ -495,9 +524,9 @@ bool BinaryTreeDictionary::verify_chunk_in_free_list(Chunk* tc) const { } } -template -Chunk* BinaryTreeDictionary::find_largest_dict() const { - TreeList *curTL = root(); +template class FreeList_t> +Chunk_t* BinaryTreeDictionary::find_largest_dict() const { + TreeList *curTL = root(); if (curTL != NULL) { while(curTL->right() != NULL) curTL = curTL->right(); return curTL->largest_address(); @@ -510,15 +539,15 @@ Chunk* BinaryTreeDictionary::find_largest_dict() const { // chunk in a list on a tree node, just unlink it. // If it is the last chunk in the list (the next link is NULL), // remove the node and repair the tree. -template -TreeChunk* -BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { +template class FreeList_t> +TreeChunk* +BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { assert(tc != NULL, "Should not call with a NULL chunk"); assert(tc->is_free(), "Header is not marked correctly"); - TreeList *newTL, *parentTL; - TreeChunk* retTC; - TreeList* tl = tc->list(); + TreeList *newTL, *parentTL; + TreeChunk* retTC; + TreeList* tl = tc->list(); debug_only( bool removing_only_chunk = false; if (tl == _root) { @@ -538,8 +567,8 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { retTC = tc; // Removing this chunk can have the side effect of changing the node - // (TreeList*) in the tree. If the node is the root, update it. - TreeList* replacementTL = tl->remove_chunk_replace_if_needed(tc); + // (TreeList*) in the tree. If the node is the root, update it. + TreeList* replacementTL = tl->remove_chunk_replace_if_needed(tc); assert(tc->is_free(), "Chunk should still be free"); assert(replacementTL->parent() == NULL || replacementTL == replacementTL->parent()->left() || @@ -549,17 +578,18 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { assert(replacementTL->parent() == NULL, "Incorrectly replacing root"); set_root(replacementTL); } - debug_only( +#ifdef ASSERT if (tl != replacementTL) { assert(replacementTL->head() != NULL, "If the tree list was replaced, it should not be a NULL list"); - TreeList* rhl = replacementTL->head_as_TreeChunk()->list(); - TreeList* rtl = TreeChunk::as_TreeChunk(replacementTL->tail())->list(); + TreeList* rhl = replacementTL->head_as_TreeChunk()->list(); + TreeList* rtl = + TreeChunk::as_TreeChunk(replacementTL->tail())->list(); assert(rhl == replacementTL, "Broken head"); assert(rtl == replacementTL, "Broken tail"); assert(replacementTL->size() == tc->size(), "Broken size"); } - ) +#endif // Does the tree need to be repaired? if (replacementTL->count() == 0) { @@ -574,7 +604,7 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { } else if (replacementTL->right() == NULL) { // right is NULL newTL = replacementTL->left(); - debug_only(replacementTL->clearLeft();) + debug_only(replacementTL->clear_left();) } else { // we have both children, so, by patriarchal convention, // my replacement is least node in right sub-tree complicated_splice = true; @@ -623,7 +653,7 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { newTL->set_right(replacementTL->right()); debug_only( replacementTL->clear_right(); - replacementTL->clearLeft(); + replacementTL->clear_left(); ) } assert(replacementTL->right() == NULL && @@ -644,21 +674,21 @@ BinaryTreeDictionary::remove_chunk_from_tree(TreeChunk* tc) { verify_tree(); } assert(!removing_only_chunk || _root == NULL, "root should be NULL"); - return TreeChunk::as_TreeChunk(retTC); + return TreeChunk::as_TreeChunk(retTC); } // Remove the leftmost node (lm) in the tree and return it. // If lm has a right child, link it to the left node of // the parent of lm. -template -TreeList* BinaryTreeDictionary::remove_tree_minimum(TreeList* tl) { +template class FreeList_t> +TreeList* BinaryTreeDictionary::remove_tree_minimum(TreeList* tl) { assert(tl != NULL && tl->parent() != NULL, "really need a proper sub-tree"); // locate the subtree minimum by walking down left branches - TreeList* curTL = tl; + TreeList* curTL = tl; for (; curTL->left() != NULL; curTL = curTL->left()); // obviously curTL now has at most one child, a right child if (curTL != root()) { // Should this test just be removed? - TreeList* parentTL = curTL->parent(); + TreeList* parentTL = curTL->parent(); if (parentTL->left() == curTL) { // curTL is a left child parentTL->set_left(curTL->right()); } else { @@ -685,31 +715,14 @@ TreeList* BinaryTreeDictionary::remove_tree_minimum(TreeList -void BinaryTreeDictionary::semi_splay_step(TreeList* tc) { - // apply a semi-splay step at the given node: - // . if root, norting needs to be done - // . if child of root, splay once - // . else zig-zig or sig-zag depending on path from grandparent - if (root() == tc) return; - warning("*** Splaying not yet implemented; " - "tree operations may be inefficient ***"); -} - -template -void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { - TreeList *curTL, *prevTL; +template class FreeList_t> +void BinaryTreeDictionary::insert_chunk_in_tree(Chunk_t* fc) { + TreeList *curTL, *prevTL; size_t size = fc->size(); - assert(size >= BinaryTreeDictionary::min_tree_chunk_size, "too small to be a TreeList"); + assert((size >= min_size()), + err_msg(SIZE_FORMAT " is too small to be a TreeChunk " SIZE_FORMAT, + size, min_size())); if (FLSVerifyDictionary) { verify_tree(); } @@ -729,9 +742,9 @@ void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { curTL = curTL->right(); } } - TreeChunk* tc = TreeChunk::as_TreeChunk(fc); + TreeChunk* tc = TreeChunk::as_TreeChunk(fc); // This chunk is being returned to the binary tree. Its embedded - // TreeList should be unused at this point. + // TreeList should be unused at this point. tc->initialize(); if (curTL != NULL) { // exact match tc->set_list(curTL); @@ -739,8 +752,8 @@ void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { } else { // need a new node in tree tc->clear_next(); tc->link_prev(NULL); - TreeList* newTL = TreeList::as_TreeList(tc); - assert(((TreeChunk*)tc)->list() == newTL, + TreeList* newTL = TreeList::as_TreeList(tc); + assert(((TreeChunk*)tc)->list() == newTL, "List was not initialized correctly"); if (prevTL == NULL) { // we are the only tree node assert(root() == NULL, "control point invariant"); @@ -768,30 +781,30 @@ void BinaryTreeDictionary::insert_chunk_in_tree(Chunk* fc) { } } -template -size_t BinaryTreeDictionary::max_chunk_size() const { - FreeBlockDictionary::verify_par_locked(); - TreeList* tc = root(); +template class FreeList_t> +size_t BinaryTreeDictionary::max_chunk_size() const { + FreeBlockDictionary::verify_par_locked(); + TreeList* tc = root(); if (tc == NULL) return 0; for (; tc->right() != NULL; tc = tc->right()); return tc->size(); } -template -size_t BinaryTreeDictionary::total_list_length(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_list_length(TreeList* tl) const { size_t res; res = tl->count(); #ifdef ASSERT size_t cnt; - Chunk* tc = tl->head(); + Chunk_t* tc = tl->head(); for (cnt = 0; tc != NULL; tc = tc->next(), cnt++); assert(res == cnt, "The count is not being maintained correctly"); #endif return res; } -template -size_t BinaryTreeDictionary::total_size_in_tree(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_size_in_tree(TreeList* tl) const { if (tl == NULL) return 0; return (tl->size() * total_list_length(tl)) + @@ -799,8 +812,8 @@ size_t BinaryTreeDictionary::total_size_in_tree(TreeList* tl) cons total_size_in_tree(tl->right()); } -template -double BinaryTreeDictionary::sum_of_squared_block_sizes(TreeList* const tl) const { +template class FreeList_t> +double BinaryTreeDictionary::sum_of_squared_block_sizes(TreeList* const tl) const { if (tl == NULL) { return 0.0; } @@ -811,8 +824,8 @@ double BinaryTreeDictionary::sum_of_squared_block_sizes(TreeList* return curr; } -template -size_t BinaryTreeDictionary::total_free_blocks_in_tree(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_free_blocks_in_tree(TreeList* tl) const { if (tl == NULL) return 0; return total_list_length(tl) + @@ -820,28 +833,28 @@ size_t BinaryTreeDictionary::total_free_blocks_in_tree(TreeList* t total_free_blocks_in_tree(tl->right()); } -template -size_t BinaryTreeDictionary::num_free_blocks() const { +template class FreeList_t> +size_t BinaryTreeDictionary::num_free_blocks() const { assert(total_free_blocks_in_tree(root()) == total_free_blocks(), "_total_free_blocks inconsistency"); return total_free_blocks(); } -template -size_t BinaryTreeDictionary::tree_height_helper(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::tree_height_helper(TreeList* tl) const { if (tl == NULL) return 0; return 1 + MAX2(tree_height_helper(tl->left()), tree_height_helper(tl->right())); } -template -size_t BinaryTreeDictionary::treeHeight() const { +template class FreeList_t> +size_t BinaryTreeDictionary::tree_height() const { return tree_height_helper(root()); } -template -size_t BinaryTreeDictionary::total_nodes_helper(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_nodes_helper(TreeList* tl) const { if (tl == NULL) { return 0; } @@ -849,14 +862,18 @@ size_t BinaryTreeDictionary::total_nodes_helper(TreeList* tl) cons total_nodes_helper(tl->right()); } -template -size_t BinaryTreeDictionary::total_nodes_in_tree(TreeList* tl) const { +template class FreeList_t> +size_t BinaryTreeDictionary::total_nodes_in_tree(TreeList* tl) const { return total_nodes_helper(root()); } -template -void BinaryTreeDictionary::dict_census_udpate(size_t size, bool split, bool birth){ - TreeList* nd = find_list(size); +template class FreeList_t> +void BinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth){} + +#ifndef SERIALGC +template <> +void BinaryTreeDictionary::dict_census_update(size_t size, bool split, bool birth){ + TreeList* nd = find_list(size); if (nd) { if (split) { if (birth) { @@ -882,16 +899,26 @@ void BinaryTreeDictionary::dict_census_udpate(size_t size, bool split, bo // This is a birth associated with a LinAB. The chunk // for the LinAB is not in the dictionary. } +#endif // SERIALGC -template -bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { +template class FreeList_t> +bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { + // For the general type of freelists, encourage coalescing by + // returning true. + return true; +} + +#ifndef SERIALGC +template <> +bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { if (FLSAlwaysCoalesceLarge) return true; - TreeList* list_of_size = find_list(size); + TreeList* list_of_size = find_list(size); // None of requested size implies overpopulated. return list_of_size == NULL || list_of_size->coal_desired() <= 0 || list_of_size->count() > list_of_size->coal_desired(); } +#endif // SERIALGC // Closures for walking the binary tree. // do_list() walks the free list in a node applying the closure @@ -899,19 +926,18 @@ bool BinaryTreeDictionary::coal_dict_over_populated(size_t size) { // do_tree() walks the nodes in the binary tree applying do_list() // to each list at each node. -template +template class FreeList_t> class TreeCensusClosure : public StackObj { protected: - virtual void do_list(FreeList* fl) = 0; + virtual void do_list(FreeList_t* fl) = 0; public: - virtual void do_tree(TreeList* tl) = 0; + virtual void do_tree(TreeList* tl) = 0; }; -template -class AscendTreeCensusClosure : public TreeCensusClosure { - using TreeCensusClosure::do_list; +template class FreeList_t> +class AscendTreeCensusClosure : public TreeCensusClosure { public: - void do_tree(TreeList* tl) { + void do_tree(TreeList* tl) { if (tl != NULL) { do_tree(tl->left()); do_list(tl); @@ -920,11 +946,10 @@ class AscendTreeCensusClosure : public TreeCensusClosure { } }; -template -class DescendTreeCensusClosure : public TreeCensusClosure { - using TreeCensusClosure::do_list; +template class FreeList_t> +class DescendTreeCensusClosure : public TreeCensusClosure { public: - void do_tree(TreeList* tl) { + void do_tree(TreeList* tl) { if (tl != NULL) { do_tree(tl->right()); do_list(tl); @@ -935,8 +960,8 @@ class DescendTreeCensusClosure : public TreeCensusClosure { // For each list in the tree, calculate the desired, desired // coalesce, count before sweep, and surplus before sweep. -template -class BeginSweepClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class BeginSweepClosure : public AscendTreeCensusClosure { double _percentage; float _inter_sweep_current; float _inter_sweep_estimate; @@ -951,32 +976,36 @@ class BeginSweepClosure : public AscendTreeCensusClosure { _inter_sweep_estimate(inter_sweep_estimate), _intra_sweep_estimate(intra_sweep_estimate) { } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { double coalSurplusPercent = _percentage; fl->compute_desired(_inter_sweep_current, _inter_sweep_estimate, _intra_sweep_estimate); fl->set_coal_desired((ssize_t)((double)fl->desired() * coalSurplusPercent)); fl->set_before_sweep(fl->count()); fl->set_bfr_surp(fl->surplus()); } +#endif // SERIALGC }; // Used to search the tree until a condition is met. // Similar to TreeCensusClosure but searches the // tree and returns promptly when found. -template +template class FreeList_t> class TreeSearchClosure : public StackObj { protected: - virtual bool do_list(FreeList* fl) = 0; + virtual bool do_list(FreeList_t* fl) = 0; public: - virtual bool do_tree(TreeList* tl) = 0; + virtual bool do_tree(TreeList* tl) = 0; }; #if 0 // Don't need this yet but here for symmetry. -template -class AscendTreeSearchClosure : public TreeSearchClosure { +template class FreeList_t> +class AscendTreeSearchClosure : public TreeSearchClosure { public: - bool do_tree(TreeList* tl) { + bool do_tree(TreeList* tl) { if (tl != NULL) { if (do_tree(tl->left())) return true; if (do_list(tl)) return true; @@ -987,11 +1016,10 @@ class AscendTreeSearchClosure : public TreeSearchClosure { }; #endif -template -class DescendTreeSearchClosure : public TreeSearchClosure { - using TreeSearchClosure::do_list; +template class FreeList_t> +class DescendTreeSearchClosure : public TreeSearchClosure { public: - bool do_tree(TreeList* tl) { + bool do_tree(TreeList* tl) { if (tl != NULL) { if (do_tree(tl->right())) return true; if (do_list(tl)) return true; @@ -1003,17 +1031,17 @@ class DescendTreeSearchClosure : public TreeSearchClosure { // Searches the tree for a chunk that ends at the // specified address. -template -class EndTreeSearchClosure : public DescendTreeSearchClosure { +template class FreeList_t> +class EndTreeSearchClosure : public DescendTreeSearchClosure { HeapWord* _target; - Chunk* _found; + Chunk_t* _found; public: EndTreeSearchClosure(HeapWord* target) : _target(target), _found(NULL) {} - bool do_list(FreeList* fl) { - Chunk* item = fl->head(); + bool do_list(FreeList_t* fl) { + Chunk_t* item = fl->head(); while (item != NULL) { - if (item->end() == _target) { + if (item->end() == (uintptr_t*) _target) { _found = item; return true; } @@ -1021,22 +1049,22 @@ class EndTreeSearchClosure : public DescendTreeSearchClosure { } return false; } - Chunk* found() { return _found; } + Chunk_t* found() { return _found; } }; -template -Chunk* BinaryTreeDictionary::find_chunk_ends_at(HeapWord* target) const { - EndTreeSearchClosure etsc(target); +template class FreeList_t> +Chunk_t* BinaryTreeDictionary::find_chunk_ends_at(HeapWord* target) const { + EndTreeSearchClosure etsc(target); bool found_target = etsc.do_tree(root()); assert(found_target || etsc.found() == NULL, "Consistency check"); assert(!found_target || etsc.found() != NULL, "Consistency check"); return etsc.found(); } -template -void BinaryTreeDictionary::begin_sweep_dict_census(double coalSurplusPercent, +template class FreeList_t> +void BinaryTreeDictionary::begin_sweep_dict_census(double coalSurplusPercent, float inter_sweep_current, float inter_sweep_estimate, float intra_sweep_estimate) { - BeginSweepClosure bsc(coalSurplusPercent, inter_sweep_current, + BeginSweepClosure bsc(coalSurplusPercent, inter_sweep_current, inter_sweep_estimate, intra_sweep_estimate); bsc.do_tree(root()); @@ -1045,84 +1073,91 @@ void BinaryTreeDictionary::begin_sweep_dict_census(double coalSurplusPerc // Closures and methods for calculating total bytes returned to the // free lists in the tree. #ifndef PRODUCT -template -class InitializeDictReturnedBytesClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class InitializeDictReturnedBytesClosure : public AscendTreeCensusClosure { public: - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { fl->set_returned_bytes(0); } }; -template -void BinaryTreeDictionary::initialize_dict_returned_bytes() { - InitializeDictReturnedBytesClosure idrb; +template class FreeList_t> +void BinaryTreeDictionary::initialize_dict_returned_bytes() { + InitializeDictReturnedBytesClosure idrb; idrb.do_tree(root()); } -template -class ReturnedBytesClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class ReturnedBytesClosure : public AscendTreeCensusClosure { size_t _dict_returned_bytes; public: ReturnedBytesClosure() { _dict_returned_bytes = 0; } - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { _dict_returned_bytes += fl->returned_bytes(); } size_t dict_returned_bytes() { return _dict_returned_bytes; } }; -template -size_t BinaryTreeDictionary::sum_dict_returned_bytes() { - ReturnedBytesClosure rbc; +template class FreeList_t> +size_t BinaryTreeDictionary::sum_dict_returned_bytes() { + ReturnedBytesClosure rbc; rbc.do_tree(root()); return rbc.dict_returned_bytes(); } // Count the number of entries in the tree. -template -class treeCountClosure : public DescendTreeCensusClosure { +template class FreeList_t> +class treeCountClosure : public DescendTreeCensusClosure { public: uint count; treeCountClosure(uint c) { count = c; } - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { count++; } }; -template -size_t BinaryTreeDictionary::total_count() { - treeCountClosure ctc(0); +template class FreeList_t> +size_t BinaryTreeDictionary::total_count() { + treeCountClosure ctc(0); ctc.do_tree(root()); return ctc.count; } #endif // PRODUCT // Calculate surpluses for the lists in the tree. -template -class setTreeSurplusClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class setTreeSurplusClosure : public AscendTreeCensusClosure { double percentage; public: setTreeSurplusClosure(double v) { percentage = v; } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { double splitSurplusPercent = percentage; fl->set_surplus(fl->count() - (ssize_t)((double)fl->desired() * splitSurplusPercent)); } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::set_tree_surplus(double splitSurplusPercent) { - setTreeSurplusClosure sts(splitSurplusPercent); +template class FreeList_t> +void BinaryTreeDictionary::set_tree_surplus(double splitSurplusPercent) { + setTreeSurplusClosure sts(splitSurplusPercent); sts.do_tree(root()); } // Set hints for the lists in the tree. -template -class setTreeHintsClosure : public DescendTreeCensusClosure { +template class FreeList_t> +class setTreeHintsClosure : public DescendTreeCensusClosure { size_t hint; public: setTreeHintsClosure(size_t v) { hint = v; } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { fl->set_hint(hint); assert(fl->hint() == 0 || fl->hint() > fl->size(), "Current hint is inconsistent"); @@ -1130,35 +1165,40 @@ class setTreeHintsClosure : public DescendTreeCensusClosure { hint = fl->size(); } } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::set_tree_hints(void) { - setTreeHintsClosure sth(0); +template class FreeList_t> +void BinaryTreeDictionary::set_tree_hints(void) { + setTreeHintsClosure sth(0); sth.do_tree(root()); } // Save count before previous sweep and splits and coalesces. -template -class clearTreeCensusClosure : public AscendTreeCensusClosure { - void do_list(FreeList* fl) { +template class FreeList_t> +class clearTreeCensusClosure : public AscendTreeCensusClosure { + void do_list(FreeList* fl) {} + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { fl->set_prev_sweep(fl->count()); fl->set_coal_births(0); fl->set_coal_deaths(0); fl->set_split_births(0); fl->set_split_deaths(0); } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::clear_tree_census(void) { - clearTreeCensusClosure ctc; +template class FreeList_t> +void BinaryTreeDictionary::clear_tree_census(void) { + clearTreeCensusClosure ctc; ctc.do_tree(root()); } // Do reporting and post sweep clean up. -template -void BinaryTreeDictionary::end_sweep_dict_census(double splitSurplusPercent) { +template class FreeList_t> +void BinaryTreeDictionary::end_sweep_dict_census(double splitSurplusPercent) { // Does walking the tree 3 times hurt? set_tree_surplus(splitSurplusPercent); set_tree_hints(); @@ -1169,9 +1209,9 @@ void BinaryTreeDictionary::end_sweep_dict_census(double splitSurplusPerce } // Print summary statistics -template -void BinaryTreeDictionary::report_statistics() const { - FreeBlockDictionary::verify_par_locked(); +template class FreeList_t> +void BinaryTreeDictionary::report_statistics() const { + FreeBlockDictionary::verify_par_locked(); gclog_or_tty->print("Statistics for BinaryTreeDictionary:\n" "------------------------------------\n"); size_t total_size = total_chunk_size(debug_only(NULL)); @@ -1182,36 +1222,47 @@ void BinaryTreeDictionary::report_statistics() const { if (free_blocks > 0) { gclog_or_tty->print("Av. Block Size: %d\n", total_size/free_blocks); } - gclog_or_tty->print("Tree Height: %d\n", treeHeight()); + gclog_or_tty->print("Tree Height: %d\n", tree_height()); } // Print census information - counts, births, deaths, etc. // for each list in the tree. Also print some summary // information. -template -class PrintTreeCensusClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class PrintTreeCensusClosure : public AscendTreeCensusClosure { int _print_line; size_t _total_free; - FreeList _total; + FreeList_t _total; public: PrintTreeCensusClosure() { _print_line = 0; _total_free = 0; } - FreeList* total() { return &_total; } + FreeList_t* total() { return &_total; } size_t total_free() { return _total_free; } - void do_list(FreeList* fl) { + void do_list(FreeList* fl) { if (++_print_line >= 40) { - FreeList::print_labels_on(gclog_or_tty, "size"); + FreeList_t::print_labels_on(gclog_or_tty, "size"); _print_line = 0; } fl->print_on(gclog_or_tty); _total_free += fl->count() * fl->size() ; total()->set_count( total()->count() + fl->count() ); - total()->set_bfr_surp( total()->bfr_surp() + fl->bfr_surp() ); + } + +#ifndef SERIALGC + void do_list(AdaptiveFreeList* fl) { + if (++_print_line >= 40) { + FreeList_t::print_labels_on(gclog_or_tty, "size"); + _print_line = 0; + } + fl->print_on(gclog_or_tty); + _total_free += fl->count() * fl->size() ; + total()->set_count( total()->count() + fl->count() ); + total()->set_bfr_surp( total()->bfr_surp() + fl->bfr_surp() ); total()->set_surplus( total()->split_deaths() + fl->surplus() ); - total()->set_desired( total()->desired() + fl->desired() ); + total()->set_desired( total()->desired() + fl->desired() ); total()->set_prev_sweep( total()->prev_sweep() + fl->prev_sweep() ); total()->set_before_sweep(total()->before_sweep() + fl->before_sweep()); total()->set_coal_births( total()->coal_births() + fl->coal_births() ); @@ -1219,18 +1270,32 @@ class PrintTreeCensusClosure : public AscendTreeCensusClosure { total()->set_split_births(total()->split_births() + fl->split_births()); total()->set_split_deaths(total()->split_deaths() + fl->split_deaths()); } +#endif // SERIALGC }; -template -void BinaryTreeDictionary::print_dict_census(void) const { +template class FreeList_t> +void BinaryTreeDictionary::print_dict_census(void) const { gclog_or_tty->print("\nBinaryTree\n"); - FreeList::print_labels_on(gclog_or_tty, "size"); - PrintTreeCensusClosure ptc; + FreeList_t::print_labels_on(gclog_or_tty, "size"); + PrintTreeCensusClosure ptc; ptc.do_tree(root()); - FreeList* total = ptc.total(); - FreeList::print_labels_on(gclog_or_tty, " "); + FreeList_t* total = ptc.total(); + FreeList_t::print_labels_on(gclog_or_tty, " "); +} + +#ifndef SERIALGC +template <> +void BinaryTreeDictionary::print_dict_census(void) const { + + gclog_or_tty->print("\nBinaryTree\n"); + AdaptiveFreeList::print_labels_on(gclog_or_tty, "size"); + PrintTreeCensusClosure ptc; + ptc.do_tree(root()); + + AdaptiveFreeList* total = ptc.total(); + AdaptiveFreeList::print_labels_on(gclog_or_tty, " "); total->print_on(gclog_or_tty, "TOTAL\t"); gclog_or_tty->print( "total_free(words): " SIZE_FORMAT_W(16) @@ -1242,9 +1307,10 @@ void BinaryTreeDictionary::print_dict_census(void) const { (double)(total->desired() - total->count()) /(total->desired() != 0 ? (double)total->desired() : 1.0)); } +#endif // SERIALGC -template -class PrintFreeListsClosure : public AscendTreeCensusClosure { +template class FreeList_t> +class PrintFreeListsClosure : public AscendTreeCensusClosure { outputStream* _st; int _print_line; @@ -1253,14 +1319,14 @@ class PrintFreeListsClosure : public AscendTreeCensusClosure { _st = st; _print_line = 0; } - void do_list(FreeList* fl) { + void do_list(FreeList_t* fl) { if (++_print_line >= 40) { - FreeList::print_labels_on(_st, "size"); + FreeList_t::print_labels_on(_st, "size"); _print_line = 0; } fl->print_on(gclog_or_tty); size_t sz = fl->size(); - for (Chunk* fc = fl->head(); fc != NULL; + for (Chunk_t* fc = fl->head(); fc != NULL; fc = fc->next()) { _st->print_cr("\t[" PTR_FORMAT "," PTR_FORMAT ") %s", fc, (HeapWord*)fc + sz, @@ -1269,11 +1335,11 @@ class PrintFreeListsClosure : public AscendTreeCensusClosure { } }; -template -void BinaryTreeDictionary::print_free_lists(outputStream* st) const { +template class FreeList_t> +void BinaryTreeDictionary::print_free_lists(outputStream* st) const { - FreeList::print_labels_on(st, "size"); - PrintFreeListsClosure pflc(st); + FreeList_t::print_labels_on(st, "size"); + PrintFreeListsClosure pflc(st); pflc.do_tree(root()); } @@ -1281,18 +1347,18 @@ void BinaryTreeDictionary::print_free_lists(outputStream* st) const { // . _root has no parent // . parent and child point to each other // . each node's key correctly related to that of its child(ren) -template -void BinaryTreeDictionary::verify_tree() const { +template class FreeList_t> +void BinaryTreeDictionary::verify_tree() const { guarantee(root() == NULL || total_free_blocks() == 0 || total_size() != 0, "_total_size should't be 0?"); guarantee(root() == NULL || root()->parent() == NULL, "_root shouldn't have parent"); verify_tree_helper(root()); } -template -size_t BinaryTreeDictionary::verify_prev_free_ptrs(TreeList* tl) { +template class FreeList_t> +size_t BinaryTreeDictionary::verify_prev_free_ptrs(TreeList* tl) { size_t ct = 0; - for (Chunk* curFC = tl->head(); curFC != NULL; curFC = curFC->next()) { + for (Chunk_t* curFC = tl->head(); curFC != NULL; curFC = curFC->next()) { ct++; assert(curFC->prev() == NULL || curFC->prev()->is_free(), "Chunk should be free"); @@ -1303,8 +1369,8 @@ size_t BinaryTreeDictionary::verify_prev_free_ptrs(TreeList* tl) { // Note: this helper is recursive rather than iterative, so use with // caution on very deep trees; and watch out for stack overflow errors; // In general, to be used only for debugging. -template -void BinaryTreeDictionary::verify_tree_helper(TreeList* tl) const { +template class FreeList_t> +void BinaryTreeDictionary::verify_tree_helper(TreeList* tl) const { if (tl == NULL) return; guarantee(tl->size() != 0, "A list must has a size"); @@ -1332,15 +1398,25 @@ void BinaryTreeDictionary::verify_tree_helper(TreeList* tl) const verify_tree_helper(tl->right()); } -template -void BinaryTreeDictionary::verify() const { +template class FreeList_t> +void BinaryTreeDictionary::verify() const { verify_tree(); guarantee(total_size() == total_size_in_tree(root()), "Total Size inconsistency"); } +template class TreeList; +template class BinaryTreeDictionary; +template class TreeChunk; + +template class TreeList; +template class BinaryTreeDictionary; +template class TreeChunk; + + #ifndef SERIALGC // Explicitly instantiate these types for FreeChunk. -template class BinaryTreeDictionary; -template class TreeChunk; -template class TreeList; +template class TreeList; +template class BinaryTreeDictionary; +template class TreeChunk; + #endif // SERIALGC diff --git a/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp b/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp index 4ab60c2dcc1..757eb4fdac9 100644 --- a/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp +++ b/hotspot/src/share/vm/memory/binaryTreeDictionary.hpp @@ -37,77 +37,78 @@ // A TreeList is a FreeList which can be used to maintain a // binary tree of free lists. -template class TreeChunk; -template class BinaryTreeDictionary; -template class AscendTreeCensusClosure; -template class DescendTreeCensusClosure; -template class DescendTreeSearchClosure; +template class FreeList_t> class TreeChunk; +template class FreeList_t> class BinaryTreeDictionary; +template class FreeList_t> class AscendTreeCensusClosure; +template class FreeList_t> class DescendTreeCensusClosure; +template class FreeList_t> class DescendTreeSearchClosure; -template -class TreeList: public FreeList { - friend class TreeChunk; - friend class BinaryTreeDictionary; - friend class AscendTreeCensusClosure; - friend class DescendTreeCensusClosure; - friend class DescendTreeSearchClosure; +template class FreeList_t> +class TreeList : public FreeList_t { + friend class TreeChunk; + friend class BinaryTreeDictionary; + friend class AscendTreeCensusClosure; + friend class DescendTreeCensusClosure; + friend class DescendTreeSearchClosure; - TreeList* _parent; - TreeList* _left; - TreeList* _right; + TreeList* _parent; + TreeList* _left; + TreeList* _right; protected: - TreeList* parent() const { return _parent; } - TreeList* left() const { return _left; } - TreeList* right() const { return _right; } - // Explicitly import these names into our namespace to fix name lookup with templates - using FreeList::head; - using FreeList::set_head; + TreeList* parent() const { return _parent; } + TreeList* left() const { return _left; } + TreeList* right() const { return _right; } - using FreeList::tail; - using FreeList::set_tail; - using FreeList::link_tail; + // Wrapper on call to base class, to get the template to compile. + Chunk_t* head() const { return FreeList_t::head(); } + Chunk_t* tail() const { return FreeList_t::tail(); } + void set_head(Chunk_t* head) { FreeList_t::set_head(head); } + void set_tail(Chunk_t* tail) { FreeList_t::set_tail(tail); } - using FreeList::increment_count; - NOT_PRODUCT(using FreeList::increment_returned_bytes_by;) - using FreeList::verify_chunk_in_free_list; - using FreeList::size; + size_t size() const { return FreeList_t::size(); } // Accessors for links in tree. - void set_left(TreeList* tl) { + void set_left(TreeList* tl) { _left = tl; if (tl != NULL) tl->set_parent(this); } - void set_right(TreeList* tl) { + void set_right(TreeList* tl) { _right = tl; if (tl != NULL) tl->set_parent(this); } - void set_parent(TreeList* tl) { _parent = tl; } + void set_parent(TreeList* tl) { _parent = tl; } - void clearLeft() { _left = NULL; } + void clear_left() { _left = NULL; } void clear_right() { _right = NULL; } void clear_parent() { _parent = NULL; } - void initialize() { clearLeft(); clear_right(), clear_parent(); } + void initialize() { clear_left(); clear_right(), clear_parent(); FreeList_t::initialize(); } // For constructing a TreeList from a Tree chunk or // address and size. - static TreeList* as_TreeList(TreeChunk* tc); - static TreeList* as_TreeList(HeapWord* addr, size_t size); + TreeList(); + static TreeList* + as_TreeList(TreeChunk* tc); + static TreeList* as_TreeList(HeapWord* addr, size_t size); // Returns the head of the free list as a pointer to a TreeChunk. - TreeChunk* head_as_TreeChunk(); + TreeChunk* head_as_TreeChunk(); // Returns the first available chunk in the free list as a pointer // to a TreeChunk. - TreeChunk* first_available(); + TreeChunk* first_available(); // Returns the block with the largest heap address amongst // those in the list for this size; potentially slow and expensive, // use with caution! - TreeChunk* largest_address(); + TreeChunk* largest_address(); + + TreeList* get_better_list( + BinaryTreeDictionary* dictionary); // remove_chunk_replace_if_needed() removes the given "tc" from the TreeList. // If "tc" is the first chunk in the list, it is also the @@ -115,10 +116,10 @@ class TreeList: public FreeList { // returns the possibly replaced TreeList* for the node in // the tree. It also updates the parent of the original // node to point to the new node. - TreeList* remove_chunk_replace_if_needed(TreeChunk* tc); + TreeList* remove_chunk_replace_if_needed(TreeChunk* tc); // See FreeList. - void return_chunk_at_head(TreeChunk* tc); - void return_chunk_at_tail(TreeChunk* tc); + void return_chunk_at_head(TreeChunk* tc); + void return_chunk_at_tail(TreeChunk* tc); }; // A TreeChunk is a subclass of a Chunk that additionally @@ -134,52 +135,54 @@ class TreeList: public FreeList { // on the free list for a node in the tree and is only removed if // it is the last chunk on the free list. -template -class TreeChunk : public Chunk { - friend class TreeList; - TreeList* _list; - TreeList _embedded_list; // if non-null, this chunk is on _list +template class FreeList_t> +class TreeChunk : public Chunk_t { + friend class TreeList; + TreeList* _list; + TreeList _embedded_list; // if non-null, this chunk is on _list + + static size_t _min_tree_chunk_size; + protected: - TreeList* embedded_list() const { return (TreeList*) &_embedded_list; } - void set_embedded_list(TreeList* v) { _embedded_list = *v; } + TreeList* embedded_list() const { return (TreeList*) &_embedded_list; } + void set_embedded_list(TreeList* v) { _embedded_list = *v; } public: - TreeList* list() { return _list; } - void set_list(TreeList* v) { _list = v; } - static TreeChunk* as_TreeChunk(Chunk* fc); + TreeList* list() { return _list; } + void set_list(TreeList* v) { _list = v; } + static TreeChunk* as_TreeChunk(Chunk_t* fc); // Initialize fields in a TreeChunk that should be // initialized when the TreeChunk is being added to // a free list in the tree. void initialize() { embedded_list()->initialize(); } - Chunk* next() const { return Chunk::next(); } - Chunk* prev() const { return Chunk::prev(); } - size_t size() const volatile { return Chunk::size(); } + Chunk_t* next() const { return Chunk_t::next(); } + Chunk_t* prev() const { return Chunk_t::prev(); } + size_t size() const volatile { return Chunk_t::size(); } + + static size_t min_size() { + return _min_tree_chunk_size; + } // debugging void verify_tree_chunk_list() const; + void assert_is_mangled() const; }; -template -class BinaryTreeDictionary: public FreeBlockDictionary { +template class FreeList_t> +class BinaryTreeDictionary: public FreeBlockDictionary { friend class VMStructs; - bool _splay; - bool _adaptive_freelists; size_t _total_size; size_t _total_free_blocks; - TreeList* _root; + TreeList* _root; // private accessors - bool splay() const { return _splay; } - void set_splay(bool v) { _splay = v; } void set_total_size(size_t v) { _total_size = v; } virtual void inc_total_size(size_t v); virtual void dec_total_size(size_t v); - size_t total_free_blocks() const { return _total_free_blocks; } void set_total_free_blocks(size_t v) { _total_free_blocks = v; } - TreeList* root() const { return _root; } - void set_root(TreeList* v) { _root = v; } - bool adaptive_freelists() { return _adaptive_freelists; } + TreeList* root() const { return _root; } + void set_root(TreeList* v) { _root = v; } // This field is added and can be set to point to the // the Mutex used to synchronize access to the @@ -191,54 +194,55 @@ class BinaryTreeDictionary: public FreeBlockDictionary { // return it. If the chunk // is the last chunk of that size, remove the node for that size // from the tree. - TreeChunk* get_chunk_from_tree(size_t size, enum FreeBlockDictionary::Dither dither, bool splay); - // Return a list of the specified size or NULL from the tree. - // The list is not removed from the tree. - TreeList* find_list (size_t size) const; + TreeChunk* get_chunk_from_tree(size_t size, enum FreeBlockDictionary::Dither dither); // Remove this chunk from the tree. If the removal results // in an empty list in the tree, remove the empty list. - TreeChunk* remove_chunk_from_tree(TreeChunk* tc); + TreeChunk* remove_chunk_from_tree(TreeChunk* tc); // Remove the node in the trees starting at tl that has the // minimum value and return it. Repair the tree as needed. - TreeList* remove_tree_minimum(TreeList* tl); - void semi_splay_step(TreeList* tl); + TreeList* remove_tree_minimum(TreeList* tl); // Add this free chunk to the tree. - void insert_chunk_in_tree(Chunk* freeChunk); + void insert_chunk_in_tree(Chunk_t* freeChunk); public: - static const size_t min_tree_chunk_size = sizeof(TreeChunk)/HeapWordSize; + // Return a list of the specified size or NULL from the tree. + // The list is not removed from the tree. + TreeList* find_list (size_t size) const; void verify_tree() const; // verify that the given chunk is in the tree. - bool verify_chunk_in_free_list(Chunk* tc) const; + bool verify_chunk_in_free_list(Chunk_t* tc) const; private: - void verify_tree_helper(TreeList* tl) const; - static size_t verify_prev_free_ptrs(TreeList* tl); + void verify_tree_helper(TreeList* tl) const; + static size_t verify_prev_free_ptrs(TreeList* tl); // Returns the total number of chunks in the list. - size_t total_list_length(TreeList* tl) const; + size_t total_list_length(TreeList* tl) const; // Returns the total number of words in the chunks in the tree // starting at "tl". - size_t total_size_in_tree(TreeList* tl) const; + size_t total_size_in_tree(TreeList* tl) const; // Returns the sum of the square of the size of each block // in the tree starting at "tl". - double sum_of_squared_block_sizes(TreeList* const tl) const; + double sum_of_squared_block_sizes(TreeList* const tl) const; // Returns the total number of free blocks in the tree starting // at "tl". - size_t total_free_blocks_in_tree(TreeList* tl) const; - size_t num_free_blocks() const; - size_t treeHeight() const; - size_t tree_height_helper(TreeList* tl) const; - size_t total_nodes_in_tree(TreeList* tl) const; - size_t total_nodes_helper(TreeList* tl) const; + size_t total_free_blocks_in_tree(TreeList* tl) const; + size_t num_free_blocks() const; + size_t tree_height() const; + size_t tree_height_helper(TreeList* tl) const; + size_t total_nodes_in_tree(TreeList* tl) const; + size_t total_nodes_helper(TreeList* tl) const; public: // Constructor - BinaryTreeDictionary(bool adaptive_freelists, bool splay = false); - BinaryTreeDictionary(MemRegion mr, bool adaptive_freelists, bool splay = false); + BinaryTreeDictionary() : + _total_size(0), _total_free_blocks(0), _root(0) {} + + BinaryTreeDictionary(MemRegion mr); // Public accessors size_t total_size() const { return _total_size; } + size_t total_free_blocks() const { return _total_free_blocks; } // Reset the dictionary to the initial conditions with // a single free chunk. @@ -249,23 +253,24 @@ class BinaryTreeDictionary: public FreeBlockDictionary { // Return a chunk of size "size" or greater from // the tree. - // want a better dynamic splay strategy for the future. - Chunk* get_chunk(size_t size, enum FreeBlockDictionary::Dither dither) { - FreeBlockDictionary::verify_par_locked(); - Chunk* res = get_chunk_from_tree(size, dither, splay()); + Chunk_t* get_chunk(size_t size, enum FreeBlockDictionary::Dither dither) { + FreeBlockDictionary::verify_par_locked(); + Chunk_t* res = get_chunk_from_tree(size, dither); assert(res == NULL || res->is_free(), "Should be returning a free chunk"); + assert(dither != FreeBlockDictionary::exactly || + res == NULL || res->size() == size, "Not correct size"); return res; } - void return_chunk(Chunk* chunk) { - FreeBlockDictionary::verify_par_locked(); + void return_chunk(Chunk_t* chunk) { + FreeBlockDictionary::verify_par_locked(); insert_chunk_in_tree(chunk); } - void remove_chunk(Chunk* chunk) { - FreeBlockDictionary::verify_par_locked(); - remove_chunk_from_tree((TreeChunk*)chunk); + void remove_chunk(Chunk_t* chunk) { + FreeBlockDictionary::verify_par_locked(); + remove_chunk_from_tree((TreeChunk*)chunk); assert(chunk->is_free(), "Should still be a free chunk"); } @@ -281,19 +286,19 @@ class BinaryTreeDictionary: public FreeBlockDictionary { } size_t min_size() const { - return min_tree_chunk_size; + return TreeChunk::min_size(); } double sum_of_squared_block_sizes() const { return sum_of_squared_block_sizes(root()); } - Chunk* find_chunk_ends_at(HeapWord* target) const; + Chunk_t* find_chunk_ends_at(HeapWord* target) const; // Find the list with size "size" in the binary tree and update // the statistics in the list according to "split" (chunk was // split or coalesce) and "birth" (chunk was added or removed). - void dict_census_udpate(size_t size, bool split, bool birth); + void dict_census_update(size_t size, bool split, bool birth); // Return true if the dictionary is overpopulated (more chunks of // this size than desired) for size "size". bool coal_dict_over_populated(size_t size); @@ -307,7 +312,7 @@ class BinaryTreeDictionary: public FreeBlockDictionary { // statistics for the sweep. void end_sweep_dict_census(double splitSurplusPercent); // Return the largest free chunk in the tree. - Chunk* find_largest_dict() const; + Chunk_t* find_largest_dict() const; // Accessors for statistics void set_tree_surplus(double splitSurplusPercent); void set_tree_hints(void); diff --git a/hotspot/src/share/vm/memory/collectorPolicy.cpp b/hotspot/src/share/vm/memory/collectorPolicy.cpp index 4d427230206..6c0b1bd82c4 100644 --- a/hotspot/src/share/vm/memory/collectorPolicy.cpp +++ b/hotspot/src/share/vm/memory/collectorPolicy.cpp @@ -742,6 +742,8 @@ MetaWord* CollectorPolicy::satisfy_failed_metadata_allocation( uint gc_count = 0; uint full_gc_count = 0; + assert(!Heap_lock->owned_by_self(), "Should not be holding the Heap_lock"); + do { MetaWord* result = NULL; if (GC_locker::is_active_and_needs_gc()) { @@ -756,7 +758,6 @@ MetaWord* CollectorPolicy::satisfy_failed_metadata_allocation( } JavaThread* jthr = JavaThread::current(); if (!jthr->in_critical()) { - MutexUnlocker mul(Heap_lock); // Wait for JNI critical section to be exited GC_locker::stall_until_clear(); // The GC invoked by the last thread leaving the critical diff --git a/hotspot/src/share/vm/memory/freeBlockDictionary.cpp b/hotspot/src/share/vm/memory/freeBlockDictionary.cpp index 13b4daa89ad..9b22212817b 100644 --- a/hotspot/src/share/vm/memory/freeBlockDictionary.cpp +++ b/hotspot/src/share/vm/memory/freeBlockDictionary.cpp @@ -27,6 +27,8 @@ #include "gc_implementation/concurrentMarkSweep/freeChunk.hpp" #endif // SERIALGC #include "memory/freeBlockDictionary.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #ifdef TARGET_OS_FAMILY_linux # include "thread_linux.inline.hpp" #endif @@ -62,6 +64,9 @@ template void FreeBlockDictionary::verify_par_locked() cons } #endif +template class FreeBlockDictionary; +template class FreeBlockDictionary; + #ifndef SERIALGC // Explicitly instantiate for FreeChunk template class FreeBlockDictionary; diff --git a/hotspot/src/share/vm/memory/freeBlockDictionary.hpp b/hotspot/src/share/vm/memory/freeBlockDictionary.hpp index 573cfed3a4b..2502e362d9c 100644 --- a/hotspot/src/share/vm/memory/freeBlockDictionary.hpp +++ b/hotspot/src/share/vm/memory/freeBlockDictionary.hpp @@ -66,7 +66,7 @@ class FreeBlockDictionary: public CHeapObj { virtual void reset(HeapWord* addr, size_t size) = 0; virtual void reset() = 0; - virtual void dict_census_udpate(size_t size, bool split, bool birth) = 0; + virtual void dict_census_update(size_t size, bool split, bool birth) = 0; virtual bool coal_dict_over_populated(size_t size) = 0; virtual void begin_sweep_dict_census(double coalSurplusPercent, float inter_sweep_current, float inter_sweep_estimate, diff --git a/hotspot/src/share/vm/memory/freeList.cpp b/hotspot/src/share/vm/memory/freeList.cpp index a5fbc06ee0a..f5cd80545c0 100644 --- a/hotspot/src/share/vm/memory/freeList.cpp +++ b/hotspot/src/share/vm/memory/freeList.cpp @@ -25,6 +25,8 @@ #include "precompiled.hpp" #include "memory/freeBlockDictionary.hpp" #include "memory/freeList.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #include "memory/sharedHeap.hpp" #include "runtime/globals.hpp" #include "runtime/mutex.hpp" @@ -49,8 +51,6 @@ FreeList::FreeList() : { _size = 0; _count = 0; - _hint = 0; - init_statistics(); } template @@ -62,34 +62,50 @@ FreeList::FreeList(Chunk* fc) : { _size = fc->size(); _count = 1; - _hint = 0; - init_statistics(); -#ifndef PRODUCT - _allocation_stats.set_returned_bytes(size() * HeapWordSize); -#endif } template -void FreeList::reset(size_t hint) { +void FreeList::link_head(Chunk* v) { + assert_proper_lock_protection(); + set_head(v); + // If this method is not used (just set the head instead), + // this check can be avoided. + if (v != NULL) { + v->link_prev(NULL); + } +} + + + +template +void FreeList::reset() { + // Don't set the _size to 0 because this method is + // used with a existing list that has a size but which has + // been emptied. + // Don't clear the _protecting_lock of an existing list. set_count(0); set_head(NULL); set_tail(NULL); - set_hint(hint); } template -void FreeList::init_statistics(bool split_birth) { - _allocation_stats.initialize(split_birth); +void FreeList::initialize() { +#ifdef ASSERT + // Needed early because it might be checked in other initializing code. + set_protecting_lock(NULL); +#endif + reset(); + set_size(0); } -template -Chunk* FreeList::get_chunk_at_head() { +template +Chunk_t* FreeList::get_chunk_at_head() { assert_proper_lock_protection(); assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); - Chunk* fc = head(); + Chunk_t* fc = head(); if (fc != NULL) { - Chunk* nextFC = fc->next(); + Chunk_t* nextFC = fc->next(); if (nextFC != NULL) { // The chunk fc being removed has a "next". Set the "next" to the // "prev" of fc. @@ -197,11 +213,6 @@ void FreeList::return_chunk_at_head(Chunk* chunk, bool record_return) { link_tail(chunk); } increment_count(); // of # of chunks in list - DEBUG_ONLY( - if (record_return) { - increment_returned_bytes_by(size()*HeapWordSize); - } - ) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); assert(head() == NULL || head()->size() == size(), "wrong item on list"); @@ -233,11 +244,6 @@ void FreeList::return_chunk_at_tail(Chunk* chunk, bool record_return) { } link_tail(chunk); increment_count(); // of # of chunks in list - DEBUG_ONLY( - if (record_return) { - increment_returned_bytes_by(size()*HeapWordSize); - } - ) assert(head() == NULL || head()->prev() == NULL, "list invariant"); assert(tail() == NULL || tail()->next() == NULL, "list invariant"); assert(head() == NULL || head()->size() == size(), "wrong item on list"); @@ -273,7 +279,7 @@ void FreeList::prepend(FreeList* fl) { } } -// verify_chunk_in_free_list() is used to verify that an item is in this free list. +// verify_chunk_in_free_lists() is used to verify that an item is in this free list. // It is used as a debugging aid. template bool FreeList::verify_chunk_in_free_list(Chunk* fc) const { @@ -293,41 +299,15 @@ bool FreeList::verify_chunk_in_free_list(Chunk* fc) const { } #ifndef PRODUCT -template -void FreeList::verify_stats() const { - // The +1 of the LH comparand is to allow some "looseness" in - // checking: we usually call this interface when adding a block - // and we'll subsequently update the stats; we cannot update the - // stats beforehand because in the case of the large-block BT - // dictionary for example, this might be the first block and - // in that case there would be no place that we could record - // the stats (which are kept in the block itself). - assert((_allocation_stats.prev_sweep() + _allocation_stats.split_births() - + _allocation_stats.coal_births() + 1) // Total Production Stock + 1 - >= (_allocation_stats.split_deaths() + _allocation_stats.coal_deaths() - + (ssize_t)count()), // Total Current Stock + depletion - err_msg("FreeList " PTR_FORMAT " of size " SIZE_FORMAT - " violates Conservation Principle: " - "prev_sweep(" SIZE_FORMAT ")" - " + split_births(" SIZE_FORMAT ")" - " + coal_births(" SIZE_FORMAT ") + 1 >= " - " split_deaths(" SIZE_FORMAT ")" - " coal_deaths(" SIZE_FORMAT ")" - " + count(" SSIZE_FORMAT ")", - this, _size, _allocation_stats.prev_sweep(), _allocation_stats.split_births(), - _allocation_stats.split_births(), _allocation_stats.split_deaths(), - _allocation_stats.coal_deaths(), count())); -} - template void FreeList::assert_proper_lock_protection_work() const { - assert(_protecting_lock != NULL, "Don't call this directly"); + assert(protecting_lock() != NULL, "Don't call this directly"); assert(ParallelGCThreads > 0, "Don't call this directly"); Thread* thr = Thread::current(); if (thr->is_VM_thread() || thr->is_ConcurrentGC_thread()) { // assert that we are holding the freelist lock } else if (thr->is_GC_task_thread()) { - assert(_protecting_lock->owned_by_self(), "FreeList RACE DETECTED"); + assert(protecting_lock()->owned_by_self(), "FreeList RACE DETECTED"); } else if (thr->is_Java_thread()) { assert(!SafepointSynchronize::is_at_safepoint(), "Should not be executing"); } else { @@ -350,21 +330,17 @@ void FreeList::print_labels_on(outputStream* st, const char* c) { // to the call is a non-null string, it is printed in the first column; // otherwise, if the argument is null (the default), then the size of the // (free list) block is printed in the first column. -template -void FreeList::print_on(outputStream* st, const char* c) const { +template +void FreeList::print_on(outputStream* st, const char* c) const { if (c != NULL) { st->print("%16s", c); } else { st->print(SIZE_FORMAT_W(16), size()); } - st->print("\t" - SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" - SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\t" SSIZE_FORMAT_W(14) "\n", - bfr_surp(), surplus(), desired(), prev_sweep(), before_sweep(), - count(), coal_births(), coal_deaths(), split_births(), split_deaths()); } +template class FreeList; +template class FreeList; #ifndef SERIALGC -// Needs to be after the definitions have been seen. template class FreeList; #endif // SERIALGC diff --git a/hotspot/src/share/vm/memory/freeList.hpp b/hotspot/src/share/vm/memory/freeList.hpp index a982cfbda97..37438cc3888 100644 --- a/hotspot/src/share/vm/memory/freeList.hpp +++ b/hotspot/src/share/vm/memory/freeList.hpp @@ -40,23 +40,19 @@ class CompactibleFreeListSpace; // for that implementation. class Mutex; -template class TreeList; -template class PrintTreeCensusClosure; -template +template class FreeList VALUE_OBJ_CLASS_SPEC { friend class CompactibleFreeListSpace; friend class VMStructs; - friend class PrintTreeCensusClosure; private: - Chunk* _head; // Head of list of free chunks - Chunk* _tail; // Tail of list of free chunks + Chunk_t* _head; // Head of list of free chunks + Chunk_t* _tail; // Tail of list of free chunks size_t _size; // Size in Heap words of each chunk ssize_t _count; // Number of entries in list - size_t _hint; // next larger size list with a positive surplus - AllocationStats _allocation_stats; // allocation-related statistics + protected: #ifdef ASSERT Mutex* _protecting_lock; @@ -71,10 +67,6 @@ class FreeList VALUE_OBJ_CLASS_SPEC { #endif } - // Initialize the allocation statistics. - protected: - void init_statistics(bool split_birth = false); - void set_count(ssize_t v) { _count = v;} void increment_count() { _count++; } @@ -89,52 +81,48 @@ class FreeList VALUE_OBJ_CLASS_SPEC { // Construct a list without any entries. FreeList(); // Construct a list with "fc" as the first (and lone) entry in the list. - FreeList(Chunk* fc); + FreeList(Chunk_t* fc); - // Reset the head, tail, hint, and count of a free list. - void reset(size_t hint); + // Do initialization + void initialize(); + + // Reset the head, tail, and count of a free list. + void reset(); // Declare the current free list to be protected by the given lock. #ifdef ASSERT - void set_protecting_lock(Mutex* protecting_lock) { - _protecting_lock = protecting_lock; + Mutex* protecting_lock() const { return _protecting_lock; } + void set_protecting_lock(Mutex* v) { + _protecting_lock = v; } #endif // Accessors. - Chunk* head() const { + Chunk_t* head() const { assert_proper_lock_protection(); return _head; } - void set_head(Chunk* v) { + void set_head(Chunk_t* v) { assert_proper_lock_protection(); _head = v; assert(!_head || _head->size() == _size, "bad chunk size"); } // Set the head of the list and set the prev field of non-null // values to NULL. - void link_head(Chunk* v) { - assert_proper_lock_protection(); - set_head(v); - // If this method is not used (just set the head instead), - // this check can be avoided. - if (v != NULL) { - v->link_prev(NULL); - } - } + void link_head(Chunk_t* v); - Chunk* tail() const { + Chunk_t* tail() const { assert_proper_lock_protection(); return _tail; } - void set_tail(Chunk* v) { + void set_tail(Chunk_t* v) { assert_proper_lock_protection(); _tail = v; assert(!_tail || _tail->size() == _size, "bad chunk size"); } // Set the tail of the list and set the next field of non-null // values to NULL. - void link_tail(Chunk* v) { + void link_tail(Chunk_t* v) { assert_proper_lock_protection(); set_tail(v); if (v != NULL) { @@ -152,174 +140,45 @@ class FreeList VALUE_OBJ_CLASS_SPEC { assert_proper_lock_protection(); _size = v; } - ssize_t count() const { - return _count; - } - size_t hint() const { - return _hint; - } - void set_hint(size_t v) { - assert_proper_lock_protection(); - assert(v == 0 || _size < v, "Bad hint"); _hint = v; - } + ssize_t count() const { return _count; } + void set_count(ssize_t v) { _count = v;} - // Accessors for statistics - AllocationStats* allocation_stats() { - assert_proper_lock_protection(); - return &_allocation_stats; - } + size_t get_better_size() { return size(); } - ssize_t desired() const { - return _allocation_stats.desired(); - } - void set_desired(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_desired(v); - } - void compute_desired(float inter_sweep_current, - float inter_sweep_estimate, - float intra_sweep_estimate) { - assert_proper_lock_protection(); - _allocation_stats.compute_desired(_count, - inter_sweep_current, - inter_sweep_estimate, - intra_sweep_estimate); - } - ssize_t coal_desired() const { - return _allocation_stats.coal_desired(); - } - void set_coal_desired(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_coal_desired(v); - } - - ssize_t surplus() const { - return _allocation_stats.surplus(); - } - void set_surplus(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_surplus(v); - } - void increment_surplus() { - assert_proper_lock_protection(); - _allocation_stats.increment_surplus(); - } - void decrement_surplus() { - assert_proper_lock_protection(); - _allocation_stats.decrement_surplus(); - } - - ssize_t bfr_surp() const { - return _allocation_stats.bfr_surp(); - } - void set_bfr_surp(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_bfr_surp(v); - } - ssize_t prev_sweep() const { - return _allocation_stats.prev_sweep(); - } - void set_prev_sweep(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_prev_sweep(v); - } - ssize_t before_sweep() const { - return _allocation_stats.before_sweep(); - } - void set_before_sweep(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_before_sweep(v); - } - - ssize_t coal_births() const { - return _allocation_stats.coal_births(); - } - void set_coal_births(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_coal_births(v); - } - void increment_coal_births() { - assert_proper_lock_protection(); - _allocation_stats.increment_coal_births(); - } - - ssize_t coal_deaths() const { - return _allocation_stats.coal_deaths(); - } - void set_coal_deaths(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_coal_deaths(v); - } - void increment_coal_deaths() { - assert_proper_lock_protection(); - _allocation_stats.increment_coal_deaths(); - } - - ssize_t split_births() const { - return _allocation_stats.split_births(); - } - void set_split_births(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_split_births(v); - } - void increment_split_births() { - assert_proper_lock_protection(); - _allocation_stats.increment_split_births(); - } - - ssize_t split_deaths() const { - return _allocation_stats.split_deaths(); - } - void set_split_deaths(ssize_t v) { - assert_proper_lock_protection(); - _allocation_stats.set_split_deaths(v); - } - void increment_split_deaths() { - assert_proper_lock_protection(); - _allocation_stats.increment_split_deaths(); - } - - NOT_PRODUCT( - // For debugging. The "_returned_bytes" in all the lists are summed - // and compared with the total number of bytes swept during a - // collection. - size_t returned_bytes() const { return _allocation_stats.returned_bytes(); } - void set_returned_bytes(size_t v) { _allocation_stats.set_returned_bytes(v); } - void increment_returned_bytes_by(size_t v) { - _allocation_stats.set_returned_bytes(_allocation_stats.returned_bytes() + v); - } - ) + size_t returned_bytes() const { ShouldNotReachHere(); return 0; } + void set_returned_bytes(size_t v) {} + void increment_returned_bytes_by(size_t v) {} // Unlink head of list and return it. Returns NULL if // the list is empty. - Chunk* get_chunk_at_head(); + Chunk_t* get_chunk_at_head(); // Remove the first "n" or "count", whichever is smaller, chunks from the // list, setting "fl", which is required to be empty, to point to them. - void getFirstNChunksFromList(size_t n, FreeList* fl); + void getFirstNChunksFromList(size_t n, FreeList* fl); // Unlink this chunk from it's free list - void remove_chunk(Chunk* fc); + void remove_chunk(Chunk_t* fc); // Add this chunk to this free list. - void return_chunk_at_head(Chunk* fc); - void return_chunk_at_tail(Chunk* fc); + void return_chunk_at_head(Chunk_t* fc); + void return_chunk_at_tail(Chunk_t* fc); // Similar to returnChunk* but also records some diagnostic // information. - void return_chunk_at_head(Chunk* fc, bool record_return); - void return_chunk_at_tail(Chunk* fc, bool record_return); + void return_chunk_at_head(Chunk_t* fc, bool record_return); + void return_chunk_at_tail(Chunk_t* fc, bool record_return); // Prepend "fl" (whose size is required to be the same as that of "this") // to the front of "this" list. - void prepend(FreeList* fl); + void prepend(FreeList* fl); // Verify that the chunk is in the list. // found. Return NULL if "fc" is not found. - bool verify_chunk_in_free_list(Chunk* fc) const; + bool verify_chunk_in_free_list(Chunk_t* fc) const; // Stats verification - void verify_stats() const PRODUCT_RETURN; +// void verify_stats() const { ShouldNotReachHere(); }; // Printing support static void print_labels_on(outputStream* st, const char* c); diff --git a/hotspot/src/share/vm/memory/metablock.hpp b/hotspot/src/share/vm/memory/metablock.hpp new file mode 100644 index 00000000000..220d3614818 --- /dev/null +++ b/hotspot/src/share/vm/memory/metablock.hpp @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#ifndef SHARE_VM_MEMORY_METABLOCK_HPP +#define SHARE_VM_MEMORY_METABLOCK_HPP + +// Metablock are the unit of allocation from a Chunk. It is initialized +// with the size of the requested allocation. That size is overwritten +// once the allocation returns. +// +// A Metablock may be reused by its SpaceManager but are never moved between +// SpaceManagers. There is no explicit link to the Metachunk +// from which it was allocated. Metablock may be deallocated and +// put on a freelist but the space is never freed, rather +// the Metachunk it is a part of will be deallocated when it's +// associated class loader is collected. + +class Metablock VALUE_OBJ_CLASS_SPEC { + friend class VMStructs; + private: + // Used to align the allocation (see below). + union block_t { + void* _data[3]; + struct header_t { + size_t _word_size; + Metablock* _next; + Metablock* _prev; + } _header; + } _block; + static size_t _min_block_byte_size; + static size_t _overhead; + + typedef union block_t Block; + typedef struct header_t Header; + const Block* block() const { return &_block; } + const Block::header_t* header() const { return &(block()->_header); } + public: + + static Metablock* initialize(MetaWord* p, size_t word_size); + + // This places the body of the block at a 2 word boundary + // because every block starts on a 2 word boundary. Work out + // how to make the body on a 2 word boundary if the block + // starts on a arbitrary boundary. JJJ + + size_t word_size() const { return header()->_word_size; } + void set_word_size(size_t v) { _block._header._word_size = v; } + size_t size() const volatile { return _block._header._word_size; } + void set_size(size_t v) { _block._header._word_size = v; } + Metablock* next() const { return header()->_next; } + void set_next(Metablock* v) { _block._header._next = v; } + Metablock* prev() const { return header()->_prev; } + void set_prev(Metablock* v) { _block._header._prev = v; } + + static size_t min_block_byte_size() { return _min_block_byte_size; } + static size_t overhead() { return _overhead; } + + bool is_free() { return header()->_word_size != 0; } + void clear_next() { set_next(NULL); } + void link_prev(Metablock* ptr) { set_prev(ptr); } + uintptr_t* end() { return ((uintptr_t*) this) + size(); } + bool cantCoalesce() const { return false; } + void link_next(Metablock* ptr) { set_next(ptr); } + void link_after(Metablock* ptr){ + link_next(ptr); + if (ptr != NULL) ptr->link_prev(this); + } + + // Should not be needed in a free list of Metablocks + void markNotFree() { ShouldNotReachHere(); } + + // Debug support +#ifdef ASSERT + void* prev_addr() const { return (void*)&_block._header._prev; } + void* next_addr() const { return (void*)&_block._header._next; } + void* size_addr() const { return (void*)&_block._header._word_size; } +#endif + bool verify_chunk_in_free_list(Metablock* tc) const { return true; } + bool verify_par_locked() { return true; } + + void assert_is_mangled() const {/* Don't check "\*/} +}; +#endif // SHARE_VM_MEMORY_METABLOCK_HPP diff --git a/hotspot/src/share/vm/memory/metachunk.hpp b/hotspot/src/share/vm/memory/metachunk.hpp new file mode 100644 index 00000000000..dd461972a14 --- /dev/null +++ b/hotspot/src/share/vm/memory/metachunk.hpp @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ +#ifndef SHARE_VM_MEMORY_METACHUNK_HPP +#define SHARE_VM_MEMORY_METACHUNK_HPP + +// Metachunk - Quantum of allocation from a Virtualspace +// Metachunks are reused (when freed are put on a global freelist) and +// have no permanent association to a SpaceManager. + +// +--------------+ <- end +// | | --+ ---+ +// | | | free | +// | | | | +// | | | | capacity +// | | | | +// | | <- top --+ | +// | | ---+ | +// | | | used | +// | | | | +// | | | | +// +--------------+ <- bottom ---+ ---+ + +class Metachunk VALUE_OBJ_CLASS_SPEC { + // link to support lists of chunks + Metachunk* _next; + Metachunk* _prev; + + MetaWord* _bottom; + MetaWord* _end; + MetaWord* _top; + size_t _word_size; + // Used in a guarantee() so included in the Product builds + // even through it is only for debugging. + bool _is_free; + + // Metachunks are allocated out of a MetadataVirtualSpace and + // and use some of its space to describe itself (plus alignment + // considerations). Metadata is allocated in the rest of the chunk. + // This size is the overhead of maintaining the Metachunk within + // the space. + static size_t _overhead; + + void set_bottom(MetaWord* v) { _bottom = v; } + void set_end(MetaWord* v) { _end = v; } + void set_top(MetaWord* v) { _top = v; } + void set_word_size(size_t v) { _word_size = v; } + public: +#ifdef ASSERT + Metachunk() : _bottom(NULL), _end(NULL), _top(NULL), _is_free(false) {} +#else + Metachunk() : _bottom(NULL), _end(NULL), _top(NULL) {} +#endif + + // Used to add a Metachunk to a list of Metachunks + void set_next(Metachunk* v) { _next = v; assert(v != this, "Boom");} + void set_prev(Metachunk* v) { _prev = v; assert(v != this, "Boom");} + + MetaWord* allocate(size_t word_size); + static Metachunk* initialize(MetaWord* ptr, size_t word_size); + + // Accessors + Metachunk* next() const { return _next; } + Metachunk* prev() const { return _prev; } + MetaWord* bottom() const { return _bottom; } + MetaWord* end() const { return _end; } + MetaWord* top() const { return _top; } + size_t word_size() const { return _word_size; } + size_t size() const volatile { return _word_size; } + void set_size(size_t v) { _word_size = v; } + bool is_free() { return _is_free; } + void set_is_free(bool v) { _is_free = v; } + static size_t overhead() { return _overhead; } + void clear_next() { set_next(NULL); } + void link_prev(Metachunk* ptr) { set_prev(ptr); } + uintptr_t* end() { return ((uintptr_t*) this) + size(); } + bool cantCoalesce() const { return false; } + void link_next(Metachunk* ptr) { set_next(ptr); } + void link_after(Metachunk* ptr){ + link_next(ptr); + if (ptr != NULL) ptr->link_prev(this); + } + + // Reset top to bottom so chunk can be reused. + void reset_empty() { _top = (_bottom + _overhead); } + bool is_empty() { return _top == (_bottom + _overhead); } + + // used (has been allocated) + // free (available for future allocations) + // capacity (total size of chunk) + size_t used_word_size(); + size_t free_word_size(); + size_t capacity_word_size(); + + // Debug support +#ifdef ASSERT + void* prev_addr() const { return (void*)&_prev; } + void* next_addr() const { return (void*)&_next; } + void* size_addr() const { return (void*)&_word_size; } +#endif + bool verify_chunk_in_free_list(Metachunk* tc) const { return true; } + bool verify_par_locked() { return true; } + + void assert_is_mangled() const {/* Don't check "\*/} + +#ifdef ASSERT + void mangle(); +#endif // ASSERT + + void print_on(outputStream* st) const; + void verify(); +}; +#endif // SHARE_VM_MEMORY_METACHUNK_HPP diff --git a/hotspot/src/share/vm/memory/metaspace.cpp b/hotspot/src/share/vm/memory/metaspace.cpp index 0396eef2def..fc2609f2a99 100644 --- a/hotspot/src/share/vm/memory/metaspace.cpp +++ b/hotspot/src/share/vm/memory/metaspace.cpp @@ -24,9 +24,12 @@ #include "precompiled.hpp" #include "gc_interface/collectedHeap.hpp" #include "memory/binaryTreeDictionary.hpp" +#include "memory/freeList.hpp" #include "memory/collectorPolicy.hpp" #include "memory/filemap.hpp" #include "memory/freeList.hpp" +#include "memory/metablock.hpp" +#include "memory/metachunk.hpp" #include "memory/metaspace.hpp" #include "memory/metaspaceShared.hpp" #include "memory/resourceArea.hpp" @@ -37,15 +40,8 @@ #include "utilities/copy.hpp" #include "utilities/debug.hpp" -// Define this macro to deallocate Metablock. If not defined, -// blocks are not yet deallocated and are only mangled. -#undef DEALLOCATE_BLOCKS - -// Easily recognizable patterns -// These patterns can be the same in 32bit or 64bit since -// they only have to be easily recognizable. -const void* metaspace_allocation_leader = (void*) 0X11111111; -const void* metaspace_allocation_trailer = (void*) 0X77777777; +typedef BinaryTreeDictionary BlockTreeDictionary; +typedef BinaryTreeDictionary ChunkTreeDictionary; // Parameters for stress mode testing const uint metadata_deallocate_a_lot_block = 10; @@ -53,7 +49,6 @@ const uint metadata_deallocate_a_lock_chunk = 3; size_t const allocation_from_dictionary_limit = 64 * K; const size_t metadata_chunk_initialize = 0xf7f7f7f7; const size_t metadata_deallocate = 0xf5f5f5f5; -const size_t metadata_space_manager_allocate = 0xf3f3f3f3; MetaWord* last_allocated = 0; @@ -62,11 +57,12 @@ enum ChunkIndex { SmallIndex = 0, MediumIndex = 1, HumongousIndex = 2, - NumberOfFreeLists = 3 + NumberOfFreeLists = 2, + NumberOfInUseLists = 3 }; static ChunkIndex next_chunk_index(ChunkIndex i) { - assert(i < NumberOfFreeLists, "Out of bound"); + assert(i < NumberOfInUseLists, "Out of bound"); return (ChunkIndex) (i+1); } @@ -100,164 +96,13 @@ bool MetaspaceGC::_should_concurrent_collect = false; // the Chunk after the header for the Chunk) where as Metachunks // point to space in a VirtualSpace. To replace Metachunks with // Chunks, change Chunks so that they can be allocated out of a VirtualSpace. -// - -// Metablock are the unit of allocation from a Chunk. It contains -// the size of the requested allocation in a debug build. -// Also in a debug build it has a marker before and after the -// body of the block. The address of the body is the address returned -// by the allocation. -// -// Layout in a debug build. In a product build only the body is present. -// -// +-----------+-----------+------------+ +-----------+ -// | word size | leader | body | ... | trailer | -// +-----------+-----------+------------+ +-----------+ -// -// A Metablock may be reused by its SpaceManager but are never moved between -// SpaceManagers. There is no explicit link to the Metachunk -// from which it was allocated. Metablock are not deallocated, rather -// the Metachunk it is a part of will be deallocated when it's -// associated class loader is collected. -// -// When the word size of a block is passed in to the deallocation -// call the word size no longer needs to be part of a Metablock. - -class Metablock { - friend class VMStructs; - private: - // Used to align the allocation (see below) and for debugging. +size_t Metablock::_min_block_byte_size = sizeof(Metablock); #ifdef ASSERT - struct { - size_t _word_size; - void* _leader; - } _header; - void* _data[1]; -#endif - static size_t _overhead; - -#ifdef ASSERT - void set_word_size(size_t v) { _header._word_size = v; } - void* leader() { return _header._leader; } - void* trailer() { - jlong index = (jlong) _header._word_size - sizeof(_header)/BytesPerWord - 1; - assert(index > 0, err_msg("Bad indexling of trailer %d", index)); - void** ptr = &_data[index]; - return *ptr; - } - void set_leader(void* v) { _header._leader = v; } - void set_trailer(void* v) { - void** ptr = &_data[_header._word_size - sizeof(_header)/BytesPerWord - 1]; - *ptr = v; - } - public: - size_t word_size() { return _header._word_size; } -#endif - public: - - static Metablock* initialize(MetaWord* p, size_t word_size); - - // This places the body of the block at a 2 word boundary - // because every block starts on a 2 word boundary. Work out - // how to make the body on a 2 word boundary if the block - // starts on a arbitrary boundary. JJJ - -#ifdef ASSERT - MetaWord* data() { return (MetaWord*) &_data[0]; } + size_t Metablock::_overhead = + Chunk::aligned_overhead_size(sizeof(Metablock)) / BytesPerWord; #else - MetaWord* data() { return (MetaWord*) this; } + size_t Metablock::_overhead = 0; #endif - static Metablock* metablock_from_data(MetaWord* p) { -#ifdef ASSERT - size_t word_offset = offset_of(Metablock, _data)/BytesPerWord; - Metablock* result = (Metablock*) (p - word_offset); - return result; -#else - return (Metablock*) p; -#endif - } - - static size_t overhead() { return _overhead; } - void verify(); -}; - -// Metachunk - Quantum of allocation from a Virtualspace -// Metachunks are reused (when freed are put on a global freelist) and -// have no permanent association to a SpaceManager. - -// +--------------+ <- end -// | | --+ ---+ -// | | | free | -// | | | | -// | | | | capacity -// | | | | -// | | <- top --+ | -// | | ---+ | -// | | | used | -// | | | | -// | | | | -// +--------------+ <- bottom ---+ ---+ - -class Metachunk VALUE_OBJ_CLASS_SPEC { - // link to support lists of chunks - Metachunk* _next; - - MetaWord* _bottom; - MetaWord* _end; - MetaWord* _top; - size_t _word_size; - - // Metachunks are allocated out of a MetadataVirtualSpace and - // and use some of its space to describe itself (plus alignment - // considerations). Metadata is allocated in the rest of the chunk. - // This size is the overhead of maintaining the Metachunk within - // the space. - static size_t _overhead; - - void set_bottom(MetaWord* v) { _bottom = v; } - void set_end(MetaWord* v) { _end = v; } - void set_top(MetaWord* v) { _top = v; } - void set_word_size(size_t v) { _word_size = v; } - public: - - // Used to add a Metachunk to a list of Metachunks - void set_next(Metachunk* v) { _next = v; assert(v != this, "Boom");} - - Metablock* allocate(size_t word_size); - static Metachunk* initialize(MetaWord* ptr, size_t word_size); - - // Accessors - Metachunk* next() const { return _next; } - MetaWord* bottom() const { return _bottom; } - MetaWord* end() const { return _end; } - MetaWord* top() const { return _top; } - size_t word_size() const { return _word_size; } - static size_t overhead() { return _overhead; } - - // Reset top to bottom so chunk can be reused. - void reset_empty() { _top = (_bottom + _overhead); } - bool is_empty() { return _top == (_bottom + _overhead); } - - // used (has been allocated) - // free (available for future allocations) - // capacity (total size of chunk) - size_t used_word_size(); - size_t free_word_size(); - size_t capacity_word_size(); - -#ifdef ASSERT - void mangle() { - // Mangle the payload of the chunk and not the links that - // maintain list of chunks. - HeapWord* start = (HeapWord*)(bottom() + overhead()); - size_t word_size = capacity_word_size() - overhead(); - Copy::fill_to_words(start, word_size, metadata_chunk_initialize); - } -#endif // ASSERT - - void print_on(outputStream* st) const; - void verify(); -}; // Pointer to list of Metachunks. @@ -292,7 +137,10 @@ class ChunkManager VALUE_OBJ_CLASS_SPEC { // SmallChunk // MediumChunk // HumongousChunk - ChunkList _free_chunks[3]; + ChunkList _free_chunks[NumberOfFreeLists]; + + // HumongousChunk + ChunkTreeDictionary _humongous_dictionary; // ChunkManager in all lists of this type size_t _free_chunks_total; @@ -337,7 +185,9 @@ class ChunkManager VALUE_OBJ_CLASS_SPEC { } ChunkList* free_medium_chunks() { return &_free_chunks[1]; } ChunkList* free_small_chunks() { return &_free_chunks[0]; } - ChunkList* free_humongous_chunks() { return &_free_chunks[2]; } + ChunkTreeDictionary* humongous_dictionary() { + return &_humongous_dictionary; + } ChunkList* free_chunks(ChunkIndex index); @@ -356,41 +206,35 @@ class ChunkManager VALUE_OBJ_CLASS_SPEC { void locked_print_free_chunks(outputStream* st); void locked_print_sum_free_chunks(outputStream* st); + + void print_on(outputStream* st); }; // Used to manage the free list of Metablocks (a block corresponds // to the allocation of a quantum of metadata). class BlockFreelist VALUE_OBJ_CLASS_SPEC { -#ifdef DEALLOCATE_BLOCKS - BinaryTreeDictionary* _dictionary; -#endif - static Metablock* initialize_free_chunk(Metablock* block, size_t word_size); + BlockTreeDictionary* _dictionary; + static Metablock* initialize_free_chunk(MetaWord* p, size_t word_size); -#ifdef DEALLOCATE_BLOCKS // Accessors - BinaryTreeDictionary* dictionary() const { return _dictionary; } -#endif + BlockTreeDictionary* dictionary() const { return _dictionary; } public: BlockFreelist(); ~BlockFreelist(); // Get and return a block to the free list - Metablock* get_block(size_t word_size); - void return_block(Metablock* block, size_t word_size); + MetaWord* get_block(size_t word_size); + void return_block(MetaWord* p, size_t word_size); - size_t totalSize() { -#ifdef DEALLOCATE_BLOCKS - if (dictionary() == NULL) { - return 0; - } else { - return dictionary()->totalSize(); - } -#else + size_t total_size() { + if (dictionary() == NULL) { return 0; -#endif + } else { + return dictionary()->total_size(); } +} void print_on(outputStream* st) const; }; @@ -600,7 +444,6 @@ class VirtualSpaceList : public CHeapObj { }; }; - class Metadebug : AllStatic { // Debugging support for Metaspaces static int _deallocate_block_a_lot_count; @@ -655,7 +498,7 @@ class SpaceManager : public CHeapObj { // List of chunks in use by this SpaceManager. Allocations // are done from the current chunk. The list is used for deallocating // chunks when the SpaceManager is freed. - Metachunk* _chunks_in_use[NumberOfFreeLists]; + Metachunk* _chunks_in_use[NumberOfInUseLists]; Metachunk* _current_chunk; // Virtual space where allocation comes from. @@ -700,24 +543,6 @@ class SpaceManager : public CHeapObj { // Add chunk to the list of chunks in use void add_chunk(Metachunk* v, bool make_current); - // Debugging support - void verify_chunks_in_use_index(ChunkIndex index, Metachunk* v) { - switch (index) { - case 0: - assert(v->word_size() == SmallChunk, "Not a SmallChunk"); - break; - case 1: - assert(v->word_size() == MediumChunk, "Not a MediumChunk"); - break; - case 2: - assert(v->word_size() > MediumChunk, "Not a HumongousChunk"); - break; - default: - assert(false, "Wrong list."); - } - } - - protected: Mutex* lock() const { return _lock; } public: @@ -751,10 +576,10 @@ class SpaceManager : public CHeapObj { MetaWord* allocate(size_t word_size); // Helper for allocations - Metablock* allocate_work(size_t word_size); + MetaWord* allocate_work(size_t word_size); // Returns a block to the per manager freelist - void deallocate(MetaWord* p); + void deallocate(MetaWord* p, size_t word_size); // Based on the allocation size and a minimum chunk size, // returned chunk size (for expanding space for chunk allocation). @@ -763,7 +588,7 @@ class SpaceManager : public CHeapObj { // Called when an allocation from the current chunk fails. // Gets a new chunk (may require getting a new virtual space), // and allocates from that chunk. - Metablock* grow_and_allocate(size_t word_size); + MetaWord* grow_and_allocate(size_t word_size); // debugging support. @@ -780,6 +605,8 @@ class SpaceManager : public CHeapObj { uint const SpaceManager::_small_chunk_limit = 4; + + const char* SpaceManager::_expand_lock_name = "SpaceManager chunk allocation lock"; const int SpaceManager::_expand_lock_rank = Monitor::leaf - 1; @@ -788,39 +615,26 @@ Mutex* const SpaceManager::_expand_lock = SpaceManager::_expand_lock_name, Mutex::_allow_vm_block_flag); -#ifdef ASSERT -size_t Metablock::_overhead = - Chunk::aligned_overhead_size(sizeof(Metablock)) / BytesPerWord; -#else -size_t Metablock::_overhead = 0; -#endif size_t Metachunk::_overhead = Chunk::aligned_overhead_size(sizeof(Metachunk)) / BytesPerWord; // New blocks returned by the Metaspace are zero initialized. // We should fix the constructors to not assume this instead. Metablock* Metablock::initialize(MetaWord* p, size_t word_size) { + if (p == NULL) { + return NULL; + } + Metablock* result = (Metablock*) p; // Clear the memory Copy::fill_to_aligned_words((HeapWord*)result, word_size); #ifdef ASSERT result->set_word_size(word_size); - // Check after work size is set. - result->set_leader((void*) metaspace_allocation_leader); - result->set_trailer((void*) metaspace_allocation_trailer); #endif return result; } -void Metablock::verify() { -#ifdef ASSERT - assert(leader() == metaspace_allocation_leader && - trailer() == metaspace_allocation_trailer, - "block has been corrupted"); -#endif -} - // Metachunk methods Metachunk* Metachunk::initialize(MetaWord* ptr, size_t word_size) { @@ -843,18 +657,13 @@ Metachunk* Metachunk::initialize(MetaWord* ptr, size_t word_size) { } -Metablock* Metachunk::allocate(size_t word_size) { - Metablock* result = NULL; +MetaWord* Metachunk::allocate(size_t word_size) { + MetaWord* result = NULL; // If available, bump the pointer to allocate. if (free_word_size() >= word_size) { - result = Metablock::initialize(_top, word_size); + result = _top; _top = _top + word_size; } -#ifdef ASSERT - assert(result == NULL || - result->word_size() == word_size, - "Block size is not set correctly"); -#endif return result; } @@ -878,103 +687,85 @@ void Metachunk::print_on(outputStream* st) const { bottom(), top(), end(), word_size()); } +#ifdef ASSERT +void Metachunk::mangle() { + // Mangle the payload of the chunk and not the links that + // maintain list of chunks. + HeapWord* start = (HeapWord*)(bottom() + overhead()); + size_t word_size = capacity_word_size() - overhead(); + Copy::fill_to_words(start, word_size, metadata_chunk_initialize); +} +#endif // ASSERT void Metachunk::verify() { #ifdef ASSERT // Cannot walk through the blocks unless the blocks have // headers with sizes. - MetaWord* curr = bottom() + overhead(); - while (curr < top()) { - Metablock* block = (Metablock*) curr; - size_t word_size = block->word_size(); - block->verify(); - curr = curr + word_size; - } + assert(_bottom <= _top && + _top <= _end, + "Chunk has been smashed"); + assert(SpaceManager::is_humongous(_word_size) || + _word_size == SpaceManager::MediumChunk || + _word_size == SpaceManager::SmallChunk, + "Chunk size is wrong"); #endif return; } // BlockFreelist methods -#ifdef DEALLOCATE_BLOCKS BlockFreelist::BlockFreelist() : _dictionary(NULL) {} -#else -BlockFreelist::BlockFreelist() {} -#endif BlockFreelist::~BlockFreelist() { -#ifdef DEALLOCATE_BLOCKS if (_dictionary != NULL) { if (Verbose && TraceMetadataChunkAllocation) { _dictionary->print_free_lists(gclog_or_tty); } delete _dictionary; } -#endif } -Metablock* BlockFreelist::initialize_free_chunk(Metablock* block, size_t word_size) { -#ifdef DEALLOCATE_BLOCKS -#ifdef ASSERT - assert(word_size = block->word_size(), "Wrong chunk size"); -#endif - Metablock* result = block; - result->setSize(word_size); - result->linkPrev(NULL); - result->linkNext(NULL); +Metablock* BlockFreelist::initialize_free_chunk(MetaWord* p, size_t word_size) { + Metablock* block = (Metablock*) p; + block->set_word_size(word_size); + block->set_prev(NULL); + block->set_next(NULL); - return result; -#else - ShouldNotReachHere(); return block; -#endif } -void BlockFreelist::return_block(Metablock* block, size_t word_size) { -#ifdef ASSERT - assert(word_size = block->word_size(), "Block size is wrong");; -#endif - Metablock* free_chunk = initialize_free_chunk(block, word_size); -#ifdef DEALLOCATE_BLOCKS +void BlockFreelist::return_block(MetaWord* p, size_t word_size) { + Metablock* free_chunk = initialize_free_chunk(p, word_size); if (dictionary() == NULL) { - _dictionary = new BinaryTreeDictionary(false /* adaptive_freelists */); + _dictionary = new BlockTreeDictionary(); } - dictionary()->returnChunk(free_chunk); -#endif + dictionary()->return_chunk(free_chunk); } -Metablock* BlockFreelist::get_block(size_t word_size) { -#ifdef DEALLOCATE_BLOCKS +MetaWord* BlockFreelist::get_block(size_t word_size) { if (dictionary() == NULL) { return NULL; } - Metablock* free_chunk = - dictionary()->getChunk(word_size, FreeBlockDictionary::exactly); -#else - Metablock* free_chunk = NULL; -#endif - if (free_chunk == NULL) { + if (word_size < TreeChunk::min_size()) { + // Dark matter. Too small for dictionary. return NULL; } - assert(free_chunk->word_size() == word_size, "Size of chunk is incorrect"); - Metablock* block = Metablock::initialize((MetaWord*) free_chunk, word_size); -#ifdef ASSERT - assert(block->word_size() == word_size, "Block size is not set correctly"); -#endif - return block; + Metablock* free_block = + dictionary()->get_chunk(word_size, FreeBlockDictionary::exactly); + if (free_block == NULL) { + return NULL; + } + + return (MetaWord*) free_block; } void BlockFreelist::print_on(outputStream* st) const { -#ifdef DEALLOCATE_BLOCKS if (dictionary() == NULL) { return; } dictionary()->print_free_lists(st); -#else - return; -#endif } // VirtualSpaceNode methods @@ -1597,14 +1388,11 @@ void Metadebug::deallocate_block_a_lot(SpaceManager* sm, Metadebug::deallocate_block_a_lot_count() % MetaDataDeallocateALotInterval == 0 ) { Metadebug::set_deallocate_block_a_lot_count(0); for (uint i = 0; i < metadata_deallocate_a_lot_block; i++) { - Metablock* dummy_block = sm->allocate_work(raw_word_size); + MetaWord* dummy_block = sm->allocate_work(raw_word_size); if (dummy_block == 0) { break; } -#ifdef ASSERT - assert(dummy_block->word_size() == raw_word_size, "Block size is not set correctly"); -#endif - sm->deallocate(dummy_block->data()); + sm->deallocate(dummy_block, raw_word_size); } } else { Metadebug::inc_deallocate_block_a_lot_count(); @@ -1784,8 +1572,8 @@ void ChunkManager::verify() { } void ChunkManager::locked_verify() { - locked_verify_free_chunks_total(); locked_verify_free_chunks_count(); + locked_verify_free_chunks_total(); } void ChunkManager::locked_print_free_chunks(outputStream* st) { @@ -1803,7 +1591,6 @@ ChunkList* ChunkManager::free_chunks(ChunkIndex index) { return &_free_chunks[index]; } - // These methods that sum the free chunk lists are used in printing // methods that are used in product builds. size_t ChunkManager::sum_free_chunks() { @@ -1818,6 +1605,7 @@ size_t ChunkManager::sum_free_chunks() { result = result + list->sum_list_capacity(); } + result = result + humongous_dictionary()->total_size(); return result; } @@ -1831,6 +1619,7 @@ size_t ChunkManager::sum_free_chunks_count() { } count = count + list->sum_list_count(); } + count = count + humongous_dictionary()->total_free_blocks(); return count; } @@ -1875,23 +1664,24 @@ Metachunk* ChunkManager::free_chunks_get(size_t word_size) { assert_lock_strong(SpaceManager::expand_lock()); locked_verify(); - ChunkList* free_list = find_free_chunks_list(word_size); - assert(free_list != NULL, "Sanity check"); - Metachunk* chunk = free_list->head(); - debug_only(Metachunk* debug_head = chunk;) + Metachunk* chunk = NULL; + if (!SpaceManager::is_humongous(word_size)) { + ChunkList* free_list = find_free_chunks_list(word_size); + assert(free_list != NULL, "Sanity check"); - if (chunk == NULL) { - return NULL; - } + chunk = free_list->head(); + debug_only(Metachunk* debug_head = chunk;) + + if (chunk == NULL) { + return NULL; + } - Metachunk* prev_chunk = chunk; - if (chunk->word_size() == word_size) { - // Chunk is being removed from the chunks free list. - dec_free_chunks_total(chunk->capacity_word_size()); // Remove the chunk as the head of the list. free_list->set_head(chunk->next()); chunk->set_next(NULL); + // Chunk has been removed from the chunks free list. + dec_free_chunks_total(chunk->capacity_word_size()); if (TraceMetadataChunkAllocation && Verbose) { tty->print_cr("ChunkManager::free_chunks_get: free_list " @@ -1899,79 +1689,24 @@ Metachunk* ChunkManager::free_chunks_get(size_t word_size) { free_list, chunk, chunk->word_size()); } } else { - assert(SpaceManager::is_humongous(word_size), - "Should only need to check humongous"); - // This code to find the best fit is just for purposes of - // investigating the loss due to fragmentation on a humongous - // chunk. It will be replace by a binaryTreeDictionary for - // the humongous chunks. - uint count = 0; - Metachunk* best_fit = NULL; - Metachunk* best_fit_prev = NULL; - while (chunk != NULL) { - count++; - if (chunk->word_size() < word_size) { - prev_chunk = chunk; - chunk = chunk->next(); - } else if (chunk->word_size() == word_size) { - break; - } else { - if (best_fit == NULL || - best_fit->word_size() > chunk->word_size()) { - best_fit_prev = prev_chunk; - best_fit = chunk; - } - prev_chunk = chunk; - chunk = chunk->next(); + chunk = humongous_dictionary()->get_chunk( + word_size, + FreeBlockDictionary::atLeast); + + if (chunk != NULL) { + if (TraceMetadataHumongousAllocation) { + size_t waste = chunk->word_size() - word_size; + tty->print_cr("Free list allocate humongous chunk size " SIZE_FORMAT + " for requested size " SIZE_FORMAT + " waste " SIZE_FORMAT, + chunk->word_size(), word_size, waste); } + // Chunk is being removed from the chunks free list. + dec_free_chunks_total(chunk->capacity_word_size()); +#ifdef ASSERT + chunk->set_is_free(false); +#endif } - if (chunk == NULL) { - prev_chunk = best_fit_prev; - chunk = best_fit; - } - if (chunk != NULL) { - if (TraceMetadataHumongousAllocation) { - size_t waste = chunk->word_size() - word_size; - tty->print_cr("Free list allocate humongous chunk size " SIZE_FORMAT - " for requested size " SIZE_FORMAT - " waste " SIZE_FORMAT - " found at " SIZE_FORMAT " of " SIZE_FORMAT, - chunk->word_size(), word_size, waste, - count, free_list->sum_list_count()); - } - // Chunk is being removed from the chunks free list. - dec_free_chunks_total(chunk->capacity_word_size()); - // Remove the chunk if it is at the head of the list. - if (chunk == free_list->head()) { - free_list->set_head(chunk->next()); - - if (TraceMetadataHumongousAllocation) { - tty->print_cr("ChunkManager::free_chunks_get: humongous free_list " - PTR_FORMAT " chunk " PTR_FORMAT " size " SIZE_FORMAT - " new head " PTR_FORMAT, - free_list, chunk, chunk->word_size(), - free_list->head()); - } - } else { - // Remove a chunk in the interior of the list - prev_chunk->set_next(chunk->next()); - - if (TraceMetadataHumongousAllocation) { - tty->print_cr("ChunkManager::free_chunks_get: humongous free_list " - PTR_FORMAT " chunk " PTR_FORMAT " size " SIZE_FORMAT - PTR_FORMAT " prev " PTR_FORMAT " next " PTR_FORMAT, - free_list, chunk, chunk->word_size(), - prev_chunk, chunk->next()); - } - } - chunk->set_next(NULL); - } else { - if (TraceMetadataHumongousAllocation) { - tty->print_cr("ChunkManager::free_chunks_get: New humongous chunk of size " - SIZE_FORMAT, - word_size); - } - } } locked_verify(); return chunk; @@ -2000,12 +1735,18 @@ Metachunk* ChunkManager::chunk_freelist_allocate(size_t word_size) { return chunk; } +void ChunkManager::print_on(outputStream* out) { + if (PrintFLSStatistics != 0) { + humongous_dictionary()->report_statistics(); + } +} + // SpaceManager methods size_t SpaceManager::sum_free_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t free = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* chunk = chunks_in_use(i); while (chunk != NULL) { free += chunk->free_word_size(); @@ -2018,11 +1759,12 @@ size_t SpaceManager::sum_free_in_chunks_in_use() const { size_t SpaceManager::sum_waste_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t result = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { - // Count the free space in all the chunk but not the - // current chunk from which allocations are still being done. + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { + + result += sum_waste_in_chunks_in_use(i); } + return result; } @@ -2033,10 +1775,10 @@ size_t SpaceManager::sum_waste_in_chunks_in_use(ChunkIndex index) const { // Count the free space in all the chunk but not the // current chunk from which allocations are still being done. if (chunk != NULL) { - while (chunk != NULL) { - if (chunk != current_chunk()) { - result += chunk->free_word_size(); - } + Metachunk* prev = chunk; + while (chunk != NULL && chunk != current_chunk()) { + result += chunk->free_word_size(); + prev = chunk; chunk = chunk->next(); count++; } @@ -2047,7 +1789,7 @@ size_t SpaceManager::sum_waste_in_chunks_in_use(ChunkIndex index) const { size_t SpaceManager::sum_capacity_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t sum = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* chunk = chunks_in_use(i); while (chunk != NULL) { // Just changed this sum += chunk->capacity_word_size(); @@ -2061,9 +1803,10 @@ size_t SpaceManager::sum_capacity_in_chunks_in_use() const { size_t SpaceManager::sum_count_in_chunks_in_use() { size_t count = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { count = count + sum_count_in_chunks_in_use(i); } + return count; } @@ -2081,7 +1824,7 @@ size_t SpaceManager::sum_count_in_chunks_in_use(ChunkIndex i) { size_t SpaceManager::sum_used_in_chunks_in_use() const { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); size_t used = 0; - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* chunk = chunks_in_use(i); while (chunk != NULL) { used += chunk->used_word_size(); @@ -2139,15 +1882,13 @@ size_t SpaceManager::calc_chunk_size(size_t word_size) { gclog_or_tty->print_cr(" word_size " PTR_FORMAT, word_size); gclog_or_tty->print_cr(" chunk_word_size " PTR_FORMAT, chunk_word_size); - gclog_or_tty->print_cr(" block overhead " PTR_FORMAT - " chunk overhead " PTR_FORMAT, - Metablock::overhead(), + gclog_or_tty->print_cr(" chunk overhead " PTR_FORMAT, Metachunk::overhead()); } return chunk_word_size; } -Metablock* SpaceManager::grow_and_allocate(size_t word_size) { +MetaWord* SpaceManager::grow_and_allocate(size_t word_size) { assert(vs_list()->current_virtual_space() != NULL, "Should have been set"); assert(current_chunk() == NULL || @@ -2180,7 +1921,7 @@ Metablock* SpaceManager::grow_and_allocate(size_t word_size) { void SpaceManager::print_on(outputStream* st) const { for (ChunkIndex i = SmallIndex; - i < NumberOfFreeLists ; + i < NumberOfInUseLists ; i = next_chunk_index(i) ) { st->print_cr(" chunks_in_use " PTR_FORMAT " chunk size " PTR_FORMAT, chunks_in_use(i), @@ -2191,8 +1932,11 @@ void SpaceManager::print_on(outputStream* st) const { sum_waste_in_chunks_in_use(SmallIndex), sum_waste_in_chunks_in_use(MediumIndex), sum_waste_in_chunks_in_use(HumongousIndex)); - // Nothing in them yet - // block_freelists()->print_on(st); + // block free lists + if (block_freelists() != NULL) { + st->print_cr("total in block free lists " SIZE_FORMAT, + block_freelists()->total_size()); + } } SpaceManager::SpaceManager(Mutex* lock, VirtualSpaceList* vs_list) : @@ -2200,7 +1944,7 @@ SpaceManager::SpaceManager(Mutex* lock, VirtualSpaceList* vs_list) : _allocation_total(0), _lock(lock) { Metadebug::init_allocation_fail_alot_count(); - for (ChunkIndex i = SmallIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = SmallIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { _chunks_in_use[i] = NULL; } _current_chunk = NULL; @@ -2262,22 +2006,24 @@ SpaceManager::~SpaceManager() { // Humongous chunks are never the current chunk. Metachunk* humongous_chunks = chunks_in_use(HumongousIndex); - if (humongous_chunks != NULL) { - chunk_manager->free_humongous_chunks()->add_at_head(humongous_chunks); - set_chunks_in_use(HumongousIndex, NULL); + while (humongous_chunks != NULL) { +#ifdef ASSERT + humongous_chunks->set_is_free(true); +#endif + Metachunk* next_humongous_chunks = humongous_chunks->next(); + chunk_manager->humongous_dictionary()->return_chunk(humongous_chunks); + humongous_chunks = next_humongous_chunks; } + set_chunks_in_use(HumongousIndex, NULL); chunk_manager->locked_verify(); } -void SpaceManager::deallocate(MetaWord* p) { +void SpaceManager::deallocate(MetaWord* p, size_t word_size) { assert_lock_strong(_lock); - ShouldNotReachHere(); // Where is this needed. -#ifdef DEALLOCATE_BLOCKS - Metablock* block = Metablock::metablock_from_data(p); - // This is expense but kept it until integration JJJ - assert(contains((address)block), "Block does not belong to this metaspace"); - block_freelists()->return_block(block, word_size); -#endif + size_t min_size = TreeChunk::min_size(); + assert(word_size >= min_size, + err_msg("Should not deallocate dark matter " SIZE_FORMAT, word_size)); + block_freelists()->return_block(p, word_size); } // Adds a chunk to the list of chunks in use. @@ -2366,50 +2112,40 @@ void SpaceManager::add_chunk(Metachunk* new_chunk, bool make_current) { MetaWord* SpaceManager::allocate(size_t word_size) { MutexLockerEx cl(lock(), Mutex::_no_safepoint_check_flag); - size_t block_overhead = Metablock::overhead(); // If only the dictionary is going to be used (i.e., no // indexed free list), then there is a minimum size requirement. // MinChunkSize is a placeholder for the real minimum size JJJ - size_t byte_size_with_overhead = (word_size + block_overhead) * BytesPerWord; -#ifdef DEALLOCATE_BLOCKS - size_t raw_bytes_size = MAX2(ARENA_ALIGN(byte_size_with_overhead), - MinChunkSize * BytesPerWord); -#else - size_t raw_bytes_size = ARENA_ALIGN(byte_size_with_overhead); -#endif + size_t byte_size = word_size * BytesPerWord; + + size_t byte_size_with_overhead = byte_size + Metablock::overhead(); + + size_t raw_bytes_size = MAX2(byte_size_with_overhead, + Metablock::min_block_byte_size()); + raw_bytes_size = ARENA_ALIGN(raw_bytes_size); size_t raw_word_size = raw_bytes_size / BytesPerWord; assert(raw_word_size * BytesPerWord == raw_bytes_size, "Size problem"); BlockFreelist* fl = block_freelists(); - Metablock* block = NULL; + MetaWord* p = NULL; // Allocation from the dictionary is expensive in the sense that // the dictionary has to be searched for a size. Don't allocate // from the dictionary until it starts to get fat. Is this // a reasonable policy? Maybe an skinny dictionary is fast enough // for allocations. Do some profiling. JJJ - if (fl->totalSize() > allocation_from_dictionary_limit) { - block = fl->get_block(raw_word_size); + if (fl->total_size() > allocation_from_dictionary_limit) { + p = fl->get_block(raw_word_size); } - if (block == NULL) { - block = allocate_work(raw_word_size); - if (block == NULL) { - return NULL; - } + if (p == NULL) { + p = allocate_work(raw_word_size); } Metadebug::deallocate_block_a_lot(this, raw_word_size); - // Push the allocation past the word containing the size and leader. -#ifdef ASSERT - MetaWord* result = block->data(); - return result; -#else - return (MetaWord*) block; -#endif + return p; } // Returns the address of spaced allocated for "word_size". // This methods does not know about blocks (Metablocks) -Metablock* SpaceManager::allocate_work(size_t word_size) { +MetaWord* SpaceManager::allocate_work(size_t word_size) { assert_lock_strong(_lock); #ifdef ASSERT if (Metadebug::test_metadata_failure()) { @@ -2417,7 +2153,7 @@ Metablock* SpaceManager::allocate_work(size_t word_size) { } #endif // Is there space in the current chunk? - Metablock* result = NULL; + MetaWord* result = NULL; // For DumpSharedSpaces, only allocate out of the current chunk which is // never null because we gave it the size we wanted. Caller reports out @@ -2436,8 +2172,8 @@ Metablock* SpaceManager::allocate_work(size_t word_size) { } if (result > 0) { inc_allocation_total(word_size); - assert(result != (Metablock*) chunks_in_use(MediumIndex), "Head of the list is being allocated"); - assert(result->word_size() == word_size, "Size not set correctly"); + assert(result != (MetaWord*) chunks_in_use(MediumIndex), + "Head of the list is being allocated"); } return result; @@ -2447,13 +2183,13 @@ void SpaceManager::verify() { // If there are blocks in the dictionary, then // verfication of chunks does not work since // being in the dictionary alters a chunk. - if (block_freelists()->totalSize() == 0) { + if (block_freelists()->total_size() == 0) { // Skip the small chunks because their next link points to // medium chunks. This is because the small chunk is the // current chunk (for allocations) until it is full and the // the addition of the next chunk does not NULL the next // like of the small chunk. - for (ChunkIndex i = MediumIndex; i < NumberOfFreeLists; i = next_chunk_index(i)) { + for (ChunkIndex i = MediumIndex; i < NumberOfInUseLists; i = next_chunk_index(i)) { Metachunk* curr = chunks_in_use(i); while (curr != NULL) { curr->verify(); @@ -2492,7 +2228,7 @@ void SpaceManager::dump(outputStream* const out) const { // Add up statistics for all chunks in this SpaceManager. for (ChunkIndex index = SmallIndex; - index < NumberOfFreeLists; + index < NumberOfInUseLists; index = next_chunk_index(index)) { for (Metachunk* curr = chunks_in_use(index); curr != NULL; @@ -2521,7 +2257,7 @@ void SpaceManager::dump(outputStream* const out) const { #ifdef ASSERT void SpaceManager::mangle_freed_chunks() { for (ChunkIndex index = SmallIndex; - index < NumberOfFreeLists; + index < NumberOfInUseLists; index = next_chunk_index(index)) { for (Metachunk* curr = chunks_in_use(index); curr != NULL; @@ -2833,13 +2569,12 @@ void Metaspace::initialize(Mutex* lock, size_t initial_size) { } } - MetaWord* Metaspace::allocate(size_t word_size, MetadataType mdtype) { // DumpSharedSpaces doesn't use class metadata area (yet) if (mdtype == ClassType && !DumpSharedSpaces) { - return class_vsm()->allocate(word_size); + return class_vsm()->allocate(word_size); } else { - return vsm()->allocate(word_size); + return vsm()->allocate(word_size); } } @@ -2853,6 +2588,7 @@ MetaWord* Metaspace::expand_and_allocate(size_t word_size, MetadataType mdtype) gclog_or_tty->print_cr("Increase capacity to GC from " SIZE_FORMAT " to " SIZE_FORMAT, before_inc, MetaspaceGC::capacity_until_GC()); } + result = allocate(word_size, mdtype); return result; @@ -2889,37 +2625,39 @@ size_t Metaspace::capacity_words(MetadataType mdtype) const { void Metaspace::deallocate(MetaWord* ptr, size_t word_size, bool is_class) { if (SafepointSynchronize::is_at_safepoint()) { assert(Thread::current()->is_VM_thread(), "should be the VM thread"); - // Don't take lock -#ifdef DEALLOCATE_BLOCKS - if (is_class) { - class_vsm()->deallocate(ptr); - } else { - vsm()->deallocate(ptr); - } -#else + // Don't take Heap_lock + MutexLocker ml(vsm()->lock()); + if (word_size < TreeChunk::min_size()) { + // Dark matter. Too small for dictionary. #ifdef ASSERT - Copy::fill_to_words((HeapWord*)ptr, word_size, metadata_deallocate); + Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); #endif -#endif - + return; + } + if (is_class) { + class_vsm()->deallocate(ptr, word_size); + } else { + vsm()->deallocate(ptr, word_size); + } } else { MutexLocker ml(vsm()->lock()); -#ifdef DEALLOCATE_BLOCKS - if (is_class) { - class_vsm()->deallocate(ptr); - } else { - vsm()->deallocate(ptr); - } -#else + if (word_size < TreeChunk::min_size()) { + // Dark matter. Too small for dictionary. #ifdef ASSERT - Copy::fill_to_words((HeapWord*)ptr, word_size, metadata_deallocate); -#endif + Copy::fill_to_words((HeapWord*)ptr, word_size, 0xf5f5f5f5); #endif + return; + } + if (is_class) { + class_vsm()->deallocate(ptr, word_size); + } else { + vsm()->deallocate(ptr, word_size); + } } } -MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, +Metablock* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, bool read_only, MetadataType mdtype, TRAPS) { if (HAS_PENDING_EXCEPTION) { assert(false, "Should not allocate with exception pending"); @@ -2943,7 +2681,7 @@ MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, if (result == NULL) { report_out_of_shared_space(read_only ? SharedReadOnly : SharedReadWrite); } - return result; + return Metablock::initialize(result, word_size); } result = loader_data->metaspace_non_null()->allocate(word_size, mdtype); @@ -2951,7 +2689,7 @@ MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, if (result == NULL) { // Try to clean out some memory and retry. result = - Universe::heap()->collector_policy()->satisfy_failed_metadata_allocation( + Universe::heap()->collector_policy()->satisfy_failed_metadata_allocation( loader_data, word_size, mdtype); // If result is still null, we are out of memory. @@ -2967,7 +2705,7 @@ MetaWord* Metaspace::allocate(ClassLoaderData* loader_data, size_t word_size, THROW_OOP_0(Universe::out_of_memory_error_perm_gen()); } } - return result; + return Metablock::initialize(result, word_size); } void Metaspace::print_on(outputStream* out) const { diff --git a/hotspot/src/share/vm/memory/metaspace.hpp b/hotspot/src/share/vm/memory/metaspace.hpp index 169a3b71d29..c42a979cb1d 100644 --- a/hotspot/src/share/vm/memory/metaspace.hpp +++ b/hotspot/src/share/vm/memory/metaspace.hpp @@ -57,12 +57,10 @@ // class ClassLoaderData; +class Metablock; class MetaWord; class Mutex; class outputStream; -class FreeChunk; -template class FreeList; -template class BinaryTreeDictionary; class SpaceManager; // Metaspaces each have a SpaceManager and allocations @@ -128,7 +126,7 @@ class Metaspace : public CHeapObj { size_t capacity_words(MetadataType mdtype) const; size_t waste_words(MetadataType mdtype) const; - static MetaWord* allocate(ClassLoaderData* loader_data, size_t size, + static Metablock* allocate(ClassLoaderData* loader_data, size_t size, bool read_only, MetadataType mdtype, TRAPS); void deallocate(MetaWord* ptr, size_t byte_size, bool is_class); diff --git a/hotspot/src/share/vm/oops/constMethod.cpp b/hotspot/src/share/vm/oops/constMethod.cpp index bccb3e6f180..7f89d61eee0 100644 --- a/hotspot/src/share/vm/oops/constMethod.cpp +++ b/hotspot/src/share/vm/oops/constMethod.cpp @@ -34,29 +34,30 @@ const u2 ConstMethod::MAX_IDNUM = 0xFFFE; const u2 ConstMethod::UNSET_IDNUM = 0xFFFF; ConstMethod* ConstMethod::allocate(ClassLoaderData* loader_data, - int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS) { + int byte_code_size, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType method_type, + TRAPS) { int size = ConstMethod::size(byte_code_size, compressed_line_number_size, localvariable_table_length, exception_table_length, checked_exceptions_length); return new (loader_data, size, true, THREAD) ConstMethod( - byte_code_size, compressed_line_number_size, - localvariable_table_length, exception_table_length, - checked_exceptions_length, size); + byte_code_size, compressed_line_number_size, localvariable_table_length, + exception_table_length, checked_exceptions_length, method_type, size); } ConstMethod::ConstMethod(int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - int size) { + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType method_type, + int size) { No_Safepoint_Verifier no_safepoint; set_interpreter_kind(Interpreter::invalid); @@ -69,6 +70,7 @@ ConstMethod::ConstMethod(int byte_code_size, compressed_line_number_size, localvariable_table_length, exception_table_length); + set_method_type(method_type); assert(this->size() == size, "wrong size for object"); } @@ -111,8 +113,7 @@ int ConstMethod::size(int code_size, } Method* ConstMethod::method() const { - return InstanceKlass::cast(_constants->pool_holder())->method_with_idnum( - _method_idnum); + return _constants->pool_holder()->method_with_idnum(_method_idnum); } // linenumber table - note that length is unknown until decompression, diff --git a/hotspot/src/share/vm/oops/constMethod.hpp b/hotspot/src/share/vm/oops/constMethod.hpp index 026b4e53588..9712eee57eb 100644 --- a/hotspot/src/share/vm/oops/constMethod.hpp +++ b/hotspot/src/share/vm/oops/constMethod.hpp @@ -108,12 +108,17 @@ class ExceptionTableElement VALUE_OBJ_CLASS_SPEC { class ConstMethod : public MetaspaceObj { friend class VMStructs; + +public: + typedef enum { NORMAL, OVERPASS } MethodType; + private: enum { _has_linenumber_table = 1, _has_checked_exceptions = 2, _has_localvariable_table = 4, - _has_exception_table = 8 + _has_exception_table = 8, + _is_overpass = 16 }; // Bit vector of signature @@ -145,19 +150,22 @@ private: // Constructor ConstMethod(int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - int size); + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType is_overpass, + int size); public: + static ConstMethod* allocate(ClassLoaderData* loader_data, - int byte_code_size, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS); + int byte_code_size, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + MethodType mt, + TRAPS); bool is_constMethod() const { return true; } @@ -179,6 +187,19 @@ public: bool has_exception_handler() const { return (_flags & _has_exception_table) != 0; } + MethodType method_type() const { + return ((_flags & _is_overpass) == 0) ? NORMAL : OVERPASS; + } + + void set_method_type(MethodType mt) { + if (mt == NORMAL) { + _flags &= ~(_is_overpass); + } else { + _flags |= _is_overpass; + } + } + + void set_interpreter_kind(int kind) { _interpreter_kind = kind; } int interpreter_kind(void) const { return _interpreter_kind; } diff --git a/hotspot/src/share/vm/oops/constantPool.cpp b/hotspot/src/share/vm/oops/constantPool.cpp index 7f81ca696af..09730aeeb22 100644 --- a/hotspot/src/share/vm/oops/constantPool.cpp +++ b/hotspot/src/share/vm/oops/constantPool.cpp @@ -228,7 +228,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS } else { do_resolve = true; name = this_oop->unresolved_klass_at(which); - loader = Handle(THREAD, InstanceKlass::cast(this_oop->pool_holder())->class_loader()); + loader = Handle(THREAD, this_oop->pool_holder()->class_loader()); } } } // unlocking constantPool @@ -247,7 +247,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS if (do_resolve) { // this_oop must be unlocked during resolve_or_fail - oop protection_domain = Klass::cast(this_oop->pool_holder())->protection_domain(); + oop protection_domain = this_oop->pool_holder()->protection_domain(); Handle h_prot (THREAD, protection_domain); Klass* k_oop = SystemDictionary::resolve_or_fail(name, loader, h_prot, true, THREAD); KlassHandle k; @@ -315,7 +315,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS vframeStream vfst(JavaThread::current()); if (!vfst.at_end()) { line_number = vfst.method()->line_number_from_bci(vfst.bci()); - Symbol* s = InstanceKlass::cast(vfst.method()->method_holder())->source_file_name(); + Symbol* s = vfst.method()->method_holder()->source_file_name(); if (s != NULL) { source_file = s->as_C_string(); } @@ -325,11 +325,11 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS // only print something if the classes are different if (source_file != NULL) { tty->print("RESOLVE %s %s %s:%d\n", - InstanceKlass::cast(this_oop->pool_holder())->external_name(), + this_oop->pool_holder()->external_name(), InstanceKlass::cast(k())->external_name(), source_file, line_number); } else { tty->print("RESOLVE %s %s\n", - InstanceKlass::cast(this_oop->pool_holder())->external_name(), + this_oop->pool_holder()->external_name(), InstanceKlass::cast(k())->external_name()); } } @@ -339,7 +339,7 @@ Klass* ConstantPool::klass_at_impl(constantPoolHandle this_oop, int which, TRAPS // Only updated constant pool - if it is resolved. do_resolve = this_oop->tag_at(which).is_unresolved_klass(); if (do_resolve) { - ClassLoaderData* this_key = InstanceKlass::cast(this_oop->pool_holder())->class_loader_data(); + ClassLoaderData* this_key = this_oop->pool_holder()->class_loader_data(); if (!this_key->is_the_null_class_loader_data()) { this_key->record_dependency(k(), CHECK_NULL); // Can throw OOM } @@ -367,8 +367,8 @@ Klass* ConstantPool::klass_at_if_loaded(constantPoolHandle this_oop, int which) assert(entry.is_unresolved(), "must be either symbol or klass"); Thread *thread = Thread::current(); Symbol* name = entry.get_symbol(); - oop loader = InstanceKlass::cast(this_oop->pool_holder())->class_loader(); - oop protection_domain = Klass::cast(this_oop->pool_holder())->protection_domain(); + oop loader = this_oop->pool_holder()->class_loader(); + oop protection_domain = this_oop->pool_holder()->protection_domain(); Handle h_prot (thread, protection_domain); Handle h_loader (thread, loader); Klass* k = SystemDictionary::find(name, h_loader, h_prot, thread); @@ -409,8 +409,8 @@ Klass* ConstantPool::klass_ref_at_if_loaded_check(constantPoolHandle this_oop, i } else { assert(entry.is_unresolved(), "must be either symbol or klass"); Symbol* name = entry.get_symbol(); - oop loader = InstanceKlass::cast(this_oop->pool_holder())->class_loader(); - oop protection_domain = Klass::cast(this_oop->pool_holder())->protection_domain(); + oop loader = this_oop->pool_holder()->class_loader(); + oop protection_domain = this_oop->pool_holder()->protection_domain(); Handle h_loader(THREAD, loader); Handle h_prot (THREAD, protection_domain); KlassHandle k(THREAD, SystemDictionary::find(name, h_loader, h_prot, THREAD)); @@ -1143,16 +1143,21 @@ void ConstantPool::copy_cp_to_impl(constantPoolHandle from_cp, int start_i, int int from_oplen = operand_array_length(from_cp->operands()); int old_oplen = operand_array_length(to_cp->operands()); if (from_oplen != 0) { + ClassLoaderData* loader_data = to_cp->pool_holder()->class_loader_data(); // append my operands to the target's operands array if (old_oplen == 0) { - to_cp->set_operands(from_cp->operands()); // reuse; do not merge + // Can't just reuse from_cp's operand list because of deallocation issues + int len = from_cp->operands()->length(); + Array* new_ops = MetadataFactory::new_array(loader_data, len, CHECK); + Copy::conjoint_memory_atomic( + from_cp->operands()->adr_at(0), new_ops->adr_at(0), len * sizeof(u2)); + to_cp->set_operands(new_ops); } else { int old_len = to_cp->operands()->length(); int from_len = from_cp->operands()->length(); int old_off = old_oplen * sizeof(u2); int from_off = from_oplen * sizeof(u2); // Use the metaspace for the destination constant pool - ClassLoaderData* loader_data = to_cp->pool_holder()->class_loader_data(); Array* new_operands = MetadataFactory::new_array(loader_data, old_len + from_len, CHECK); int fillp = 0, len = 0; // first part of dest @@ -1785,7 +1790,7 @@ void ConstantPool::patch_resolved_references( assert(cp_patches->at(index).is_null(), err_msg("Unused constant pool patch at %d in class file %s", index, - InstanceKlass::cast(pool_holder())->external_name())); + pool_holder()->external_name())); } #endif // ASSERT } @@ -1943,7 +1948,7 @@ void ConstantPool::print_value_on(outputStream* st) const { st->print(" for "); pool_holder()->print_value_on(st); if (pool_holder() != NULL) { - bool extra = (InstanceKlass::cast(pool_holder())->constants() != this); + bool extra = (pool_holder()->constants() != this); if (extra) st->print(" (extra)"); } if (cache() != NULL) { diff --git a/hotspot/src/share/vm/oops/constantPool.hpp b/hotspot/src/share/vm/oops/constantPool.hpp index 5348ae8cb97..768cd39a65c 100644 --- a/hotspot/src/share/vm/oops/constantPool.hpp +++ b/hotspot/src/share/vm/oops/constantPool.hpp @@ -86,8 +86,8 @@ class ConstantPool : public Metadata { friend class Universe; // For null constructor private: Array* _tags; // the tag array describing the constant pool's contents - ConstantPoolCache* _cache; // the cache holding interpreter runtime information - Klass* _pool_holder; // the corresponding class + ConstantPoolCache* _cache; // the cache holding interpreter runtime information + InstanceKlass* _pool_holder; // the corresponding class Array* _operands; // for variable-sized (InvokeDynamic) nodes, usually empty // Array of resolved objects from the constant pool and map from resolved @@ -193,9 +193,9 @@ class ConstantPool : public Metadata { void set_on_stack(const bool value); // Klass holding pool - Klass* pool_holder() const { return _pool_holder; } - void set_pool_holder(Klass* k) { _pool_holder = k; } - Klass** pool_holder_addr() { return &_pool_holder; } + InstanceKlass* pool_holder() const { return _pool_holder; } + void set_pool_holder(InstanceKlass* k) { _pool_holder = k; } + InstanceKlass** pool_holder_addr() { return &_pool_holder; } // Interpreter runtime support ConstantPoolCache* cache() const { return _cache; } diff --git a/hotspot/src/share/vm/oops/cpCache.cpp b/hotspot/src/share/vm/oops/cpCache.cpp index b246cbad316..3aded474350 100644 --- a/hotspot/src/share/vm/oops/cpCache.cpp +++ b/hotspot/src/share/vm/oops/cpCache.cpp @@ -231,8 +231,8 @@ void ConstantPoolCacheEntry::set_method(Bytecodes::Code invoke_code, void ConstantPoolCacheEntry::set_interface_call(methodHandle method, int index) { - Klass* interf = method->method_holder(); - assert(InstanceKlass::cast(interf)->is_interface(), "must be an interface"); + InstanceKlass* interf = method->method_holder(); + assert(interf->is_interface(), "must be an interface"); assert(!method->is_final_method(), "interfaces do not have final methods; cannot link to one here"); set_f1(interf); set_f2(index); @@ -421,7 +421,7 @@ bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method, if (!(*trace_name_printed)) { // RC_TRACE_MESG macro has an embedded ResourceMark RC_TRACE_MESG(("adjust: name=%s", - Klass::cast(old_method->method_holder())->external_name())); + old_method->method_holder()->external_name())); *trace_name_printed = true; } // RC_TRACE macro has an embedded ResourceMark @@ -449,7 +449,7 @@ bool ConstantPoolCacheEntry::adjust_method_entry(Method* old_method, if (!(*trace_name_printed)) { // RC_TRACE_MESG macro has an embedded ResourceMark RC_TRACE_MESG(("adjust: name=%s", - Klass::cast(old_method->method_holder())->external_name())); + old_method->method_holder()->external_name())); *trace_name_printed = true; } // RC_TRACE macro has an embedded ResourceMark diff --git a/hotspot/src/share/vm/oops/instanceKlass.cpp b/hotspot/src/share/vm/oops/instanceKlass.cpp index 89452acdcaa..c5b20d8ffd0 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.cpp +++ b/hotspot/src/share/vm/oops/instanceKlass.cpp @@ -743,6 +743,35 @@ void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) { } } + if (this_oop->has_default_methods()) { + // Step 7.5: initialize any interfaces which have default methods + for (int i = 0; i < this_oop->local_interfaces()->length(); ++i) { + Klass* iface = this_oop->local_interfaces()->at(i); + InstanceKlass* ik = InstanceKlass::cast(iface); + if (ik->has_default_methods() && ik->should_be_initialized()) { + ik->initialize(THREAD); + + if (HAS_PENDING_EXCEPTION) { + Handle e(THREAD, PENDING_EXCEPTION); + CLEAR_PENDING_EXCEPTION; + { + EXCEPTION_MARK; + // Locks object, set state, and notify all waiting threads + this_oop->set_initialization_state_and_notify( + initialization_error, THREAD); + + // ignore any exception thrown, superclass initialization error is + // thrown below + CLEAR_PENDING_EXCEPTION; + } + DTRACE_CLASSINIT_PROBE_WAIT( + super__failed, InstanceKlass::cast(this_oop()), -1, wait); + THROW_OOP(e()); + } + } + } + } + // Step 8 { assert(THREAD->is_Java_thread(), "non-JavaThread in initialize_impl"); @@ -1252,11 +1281,7 @@ static int linear_search(Array* methods, Symbol* name, Symbol* signatur } #endif -Method* InstanceKlass::find_method(Symbol* name, Symbol* signature) const { - return InstanceKlass::find_method(methods(), name, signature); -} - -Method* InstanceKlass::find_method(Array* methods, Symbol* name, Symbol* signature) { +static int binary_search(Array* methods, Symbol* name) { int len = methods->length(); // methods are sorted, so do binary search int l = 0; @@ -1267,43 +1292,70 @@ Method* InstanceKlass::find_method(Array* methods, Symbol* name, Symbol assert(m->is_method(), "must be method"); int res = m->name()->fast_compare(name); if (res == 0) { - // found matching name; do linear search to find matching signature - // first, quick check for common case - if (m->signature() == signature) return m; - // search downwards through overloaded methods - int i; - for (i = mid - 1; i >= l; i--) { - Method* m = methods->at(i); - assert(m->is_method(), "must be method"); - if (m->name() != name) break; - if (m->signature() == signature) return m; - } - // search upwards - for (i = mid + 1; i <= h; i++) { - Method* m = methods->at(i); - assert(m->is_method(), "must be method"); - if (m->name() != name) break; - if (m->signature() == signature) return m; - } - // not found -#ifdef ASSERT - int index = linear_search(methods, name, signature); - assert(index == -1, err_msg("binary search should have found entry %d", index)); -#endif - return NULL; + return mid; } else if (res < 0) { l = mid + 1; } else { h = mid - 1; } } + return -1; +} + +Method* InstanceKlass::find_method(Symbol* name, Symbol* signature) const { + return InstanceKlass::find_method(methods(), name, signature); +} + +Method* InstanceKlass::find_method( + Array* methods, Symbol* name, Symbol* signature) { + int hit = binary_search(methods, name); + if (hit != -1) { + Method* m = methods->at(hit); + // Do linear search to find matching signature. First, quick check + // for common case + if (m->signature() == signature) return m; + // search downwards through overloaded methods + int i; + for (i = hit - 1; i >= 0; --i) { + Method* m = methods->at(i); + assert(m->is_method(), "must be method"); + if (m->name() != name) break; + if (m->signature() == signature) return m; + } + // search upwards + for (i = hit + 1; i < methods->length(); ++i) { + Method* m = methods->at(i); + assert(m->is_method(), "must be method"); + if (m->name() != name) break; + if (m->signature() == signature) return m; + } + // not found #ifdef ASSERT - int index = linear_search(methods, name, signature); - assert(index == -1, err_msg("binary search should have found entry %d", index)); + int index = linear_search(methods, name, signature); + assert(index == -1, err_msg("binary search should have found entry %d", index)); #endif + } return NULL; } +int InstanceKlass::find_method_by_name(Symbol* name, int* end) { + return find_method_by_name(methods(), name, end); +} + +int InstanceKlass::find_method_by_name( + Array* methods, Symbol* name, int* end_ptr) { + assert(end_ptr != NULL, "just checking"); + int start = binary_search(methods, name); + int end = start + 1; + if (start != -1) { + while (start - 1 >= 0 && (methods->at(start - 1))->name() == name) --start; + while (end < methods->length() && (methods->at(end))->name() == name) ++end; + *end_ptr = end; + return start; + } + return -1; +} + Method* InstanceKlass::uncached_lookup_method(Symbol* name, Symbol* signature) const { Klass* klass = const_cast(this); while (klass != NULL) { diff --git a/hotspot/src/share/vm/oops/instanceKlass.hpp b/hotspot/src/share/vm/oops/instanceKlass.hpp index 937cd6cc092..f427f338c02 100644 --- a/hotspot/src/share/vm/oops/instanceKlass.hpp +++ b/hotspot/src/share/vm/oops/instanceKlass.hpp @@ -245,6 +245,10 @@ class InstanceKlass: public Klass { unsigned char * _cached_class_file_bytes; // JVMTI: cached class file, before retransformable agent modified it in CFLH jint _cached_class_file_len; // JVMTI: length of above JvmtiCachedClassFieldMap* _jvmti_cached_class_field_map; // JVMTI: used during heap iteration + + // true if class, superclass, or implemented interfaces have default methods + bool _has_default_methods; + volatile u2 _idnum_allocated_count; // JNI/JVMTI: increments with the addition of methods, old ids don't change // Method array. Array* _methods; @@ -492,6 +496,13 @@ class InstanceKlass: public Klass { // (returns NULL if not found) Method* lookup_method_in_all_interfaces(Symbol* name, Symbol* signature) const; + // Find method indices by name. If a method with the specified name is + // found the index to the first method is returned, and 'end' is filled in + // with the index of first non-name-matching method. If no method is found + // -1 is returned. + int find_method_by_name(Symbol* name, int* end); + static int find_method_by_name(Array* methods, Symbol* name, int* end); + // constant pool ConstantPool* constants() const { return _constants; } void set_constants(ConstantPool* c) { _constants = c; } @@ -592,6 +603,9 @@ class InstanceKlass: public Klass { return _jvmti_cached_class_field_map; } + bool has_default_methods() const { return _has_default_methods; } + void set_has_default_methods(bool b) { _has_default_methods = b; } + // for adding methods, ConstMethod::UNSET_IDNUM means no more ids available inline u2 next_method_idnum(); void set_initial_method_idnum(u2 value) { _idnum_allocated_count = value; } @@ -728,7 +742,6 @@ class InstanceKlass: public Klass { GrowableArray* compute_secondary_supers(int num_extra_slots); bool compute_is_subtype_of(Klass* k); bool can_be_primary_super_slow() const; - Klass* java_super() const { return super(); } int oop_size(oop obj) const { return size_helper(); } bool oop_is_instance_slow() const { return true; } @@ -750,6 +763,10 @@ class InstanceKlass: public Klass { return (InstanceKlass*) k; } + InstanceKlass* java_super() const { + return (super() == NULL) ? NULL : cast(super()); + } + // Sizing (in words) static int header_size() { return align_object_offset(sizeof(InstanceKlass)/HeapWordSize); } static int size(int vtable_length, int itable_length, diff --git a/hotspot/src/share/vm/oops/klassVtable.cpp b/hotspot/src/share/vm/oops/klassVtable.cpp index a522ab5152a..83e002cb341 100644 --- a/hotspot/src/share/vm/oops/klassVtable.cpp +++ b/hotspot/src/share/vm/oops/klassVtable.cpp @@ -54,22 +54,16 @@ inline InstanceKlass* klassVtable::ik() const { // the same name and signature as m), then m is a Miranda method which is // entered as a public abstract method in C's vtable. From then on it should // treated as any other public method in C for method over-ride purposes. -void klassVtable::compute_vtable_size_and_num_mirandas(int &vtable_length, - int &num_miranda_methods, - Klass* super, - Array* methods, - AccessFlags class_flags, - Handle classloader, - Symbol* classname, - Array* local_interfaces, - TRAPS - ) { - +void klassVtable::compute_vtable_size_and_num_mirandas( + int* vtable_length_ret, int* num_new_mirandas, + GrowableArray* all_mirandas, Klass* super, + Array* methods, AccessFlags class_flags, + Handle classloader, Symbol* classname, Array* local_interfaces, + TRAPS) { No_Safepoint_Verifier nsv; // set up default result values - vtable_length = 0; - num_miranda_methods = 0; + int vtable_length = 0; // start off with super's vtable length InstanceKlass* sk = (InstanceKlass*)super; @@ -86,9 +80,12 @@ void klassVtable::compute_vtable_size_and_num_mirandas(int &vtable_length, } } + GrowableArray new_mirandas(20); // compute the number of mirandas methods that must be added to the end - num_miranda_methods = get_num_mirandas(super, methods, local_interfaces); - vtable_length += (num_miranda_methods * vtableEntry::size()); + get_mirandas(&new_mirandas, all_mirandas, super, methods, local_interfaces); + *num_new_mirandas = new_mirandas.length(); + + vtable_length += *num_new_mirandas * vtableEntry::size(); if (Universe::is_bootstrapping() && vtable_length == 0) { // array classes don't have their superclass set correctly during @@ -109,6 +106,8 @@ void klassVtable::compute_vtable_size_and_num_mirandas(int &vtable_length, "bad vtable size for class Object"); assert(vtable_length % vtableEntry::size() == 0, "bad vtable length"); assert(vtable_length >= Universe::base_vtable_size(), "vtable too small"); + + *vtable_length_ret = vtable_length; } int klassVtable::index_of(Method* m, int len) const { @@ -191,7 +190,7 @@ void klassVtable::initialize_vtable(bool checkconstraints, TRAPS) { } // add miranda methods; it will also update the value of initialized - fill_in_mirandas(initialized); + fill_in_mirandas(&initialized); // In class hierarchies where the accessibility is not increasing (i.e., going from private -> // package_private -> publicprotected), the vtable might actually be smaller than our initial @@ -249,6 +248,11 @@ InstanceKlass* klassVtable::find_transitive_override(InstanceKlass* initialsuper return superk; } +// Methods that are "effectively" final don't need vtable entries. +bool method_is_effectively_final( + AccessFlags klass_flags, methodHandle target) { + return target->is_final() || klass_flags.is_final() && !target->is_overpass(); +} // Update child's copy of super vtable for overrides // OR return true if a new vtable entry is required @@ -269,7 +273,7 @@ bool klassVtable::update_inherited_vtable(InstanceKlass* klass, methodHandle tar return false; } - if (klass->is_final() || target_method()->is_final()) { + if (method_is_effectively_final(klass->access_flags(), target_method)) { // a final method never needs a new entry; final methods can be statically // resolved and they have to be present in the vtable only if they override // a super's method, in which case they re-use its entry @@ -303,7 +307,7 @@ bool klassVtable::update_inherited_vtable(InstanceKlass* klass, methodHandle tar if (super_method->name() == name && super_method->signature() == signature) { // get super_klass for method_holder for the found method - InstanceKlass* super_klass = InstanceKlass::cast(super_method->method_holder()); + InstanceKlass* super_klass = super_method->method_holder(); if ((super_klass->is_override(super_method, target_loader, target_classname, THREAD)) || ((klass->major_version() >= VTABLE_TRANSITIVE_OVERRIDE_VERSION) @@ -406,7 +410,8 @@ bool klassVtable::needs_new_vtable_entry(methodHandle target_method, Symbol* classname, AccessFlags class_flags, TRAPS) { - if ((class_flags.is_final() || target_method()->is_final()) || + + if (method_is_effectively_final(class_flags, target_method) || // a final method never needs a new entry; final methods can be statically // resolved and they have to be present in the vtable only if they override // a super's method, in which case they re-use its entry @@ -447,7 +452,7 @@ bool klassVtable::needs_new_vtable_entry(methodHandle target_method, } // get the class holding the matching method // make sure you use that class for is_override - InstanceKlass* superk = InstanceKlass::cast(super_method->method_holder()); + InstanceKlass* superk = super_method->method_holder(); // we want only instance method matches // pretend private methods are not in the super vtable // since we do override around them: e.g. a.m pub/b.m private/c.m pub, @@ -502,7 +507,7 @@ bool klassVtable::is_miranda_entry_at(int i) { // miranda methods are interface methods in a class's vtable if (mhk->is_interface()) { - assert(m->is_public() && m->is_abstract(), "should be public and abstract"); + assert(m->is_public(), "should be public"); assert(ik()->implements_interface(method_holder) , "this class should implement the interface"); assert(is_miranda(m, ik()->methods(), ik()->super()), "should be a miranda_method"); return true; @@ -532,19 +537,19 @@ bool klassVtable::is_miranda(Method* m, Array* class_methods, Klass* su return false; } -void klassVtable::add_new_mirandas_to_list(GrowableArray* list_of_current_mirandas, - Array* current_interface_methods, - Array* class_methods, - Klass* super) { +void klassVtable::add_new_mirandas_to_lists( + GrowableArray* new_mirandas, GrowableArray* all_mirandas, + Array* current_interface_methods, Array* class_methods, + Klass* super) { // iterate thru the current interface's method to see if it a miranda int num_methods = current_interface_methods->length(); for (int i = 0; i < num_methods; i++) { Method* im = current_interface_methods->at(i); bool is_duplicate = false; - int num_of_current_mirandas = list_of_current_mirandas->length(); + int num_of_current_mirandas = new_mirandas->length(); // check for duplicate mirandas in different interfaces we implement for (int j = 0; j < num_of_current_mirandas; j++) { - Method* miranda = list_of_current_mirandas->at(j); + Method* miranda = new_mirandas->at(j); if ((im->name() == miranda->name()) && (im->signature() == miranda->signature())) { is_duplicate = true; @@ -557,51 +562,47 @@ void klassVtable::add_new_mirandas_to_list(GrowableArray* list_of_curre InstanceKlass *sk = InstanceKlass::cast(super); // check if it is a duplicate of a super's miranda if (sk->lookup_method_in_all_interfaces(im->name(), im->signature()) == NULL) { - list_of_current_mirandas->append(im); + new_mirandas->append(im); + } + if (all_mirandas != NULL) { + all_mirandas->append(im); } } } } } -void klassVtable::get_mirandas(GrowableArray* mirandas, +void klassVtable::get_mirandas(GrowableArray* new_mirandas, + GrowableArray* all_mirandas, Klass* super, Array* class_methods, Array* local_interfaces) { - assert((mirandas->length() == 0) , "current mirandas must be 0"); + assert((new_mirandas->length() == 0) , "current mirandas must be 0"); // iterate thru the local interfaces looking for a miranda int num_local_ifs = local_interfaces->length(); for (int i = 0; i < num_local_ifs; i++) { InstanceKlass *ik = InstanceKlass::cast(local_interfaces->at(i)); - add_new_mirandas_to_list(mirandas, ik->methods(), class_methods, super); + add_new_mirandas_to_lists(new_mirandas, all_mirandas, + ik->methods(), class_methods, super); // iterate thru each local's super interfaces Array* super_ifs = ik->transitive_interfaces(); int num_super_ifs = super_ifs->length(); for (int j = 0; j < num_super_ifs; j++) { InstanceKlass *sik = InstanceKlass::cast(super_ifs->at(j)); - add_new_mirandas_to_list(mirandas, sik->methods(), class_methods, super); + add_new_mirandas_to_lists(new_mirandas, all_mirandas, + sik->methods(), class_methods, super); } } } -// get number of mirandas -int klassVtable::get_num_mirandas(Klass* super, Array* class_methods, Array* local_interfaces) { - ResourceMark rm; - GrowableArray* mirandas = new GrowableArray(20); - get_mirandas(mirandas, super, class_methods, local_interfaces); - return mirandas->length(); -} - // fill in mirandas -void klassVtable::fill_in_mirandas(int& initialized) { - ResourceMark rm; - GrowableArray* mirandas = new GrowableArray(20); - InstanceKlass *this_ik = ik(); - get_mirandas(mirandas, this_ik->super(), this_ik->methods(), this_ik->local_interfaces()); - int num_mirandas = mirandas->length(); - for (int i = 0; i < num_mirandas; i++) { - put_method_at(mirandas->at(i), initialized); - initialized++; +void klassVtable::fill_in_mirandas(int* initialized) { + GrowableArray mirandas(20); + get_mirandas(&mirandas, NULL, ik()->super(), ik()->methods(), + ik()->local_interfaces()); + for (int i = 0; i < mirandas.length(); i++) { + put_method_at(mirandas.at(i), *initialized); + ++(*initialized); } } @@ -629,7 +630,7 @@ void klassVtable::adjust_method_entries(Method** old_methods, Method** new_metho if (!(*trace_name_printed)) { // RC_TRACE_MESG macro has an embedded ResourceMark RC_TRACE_MESG(("adjust: name=%s", - Klass::cast(old_method->method_holder())->external_name())); + old_method->method_holder()->external_name())); *trace_name_printed = true; } // RC_TRACE macro has an embedded ResourceMark @@ -744,7 +745,7 @@ void klassItable::initialize_itable_for_interface(int method_table_offset, Klass Method* target = klass->uncached_lookup_method(method_name, method_signature); while (target != NULL && target->is_static()) { // continue with recursive lookup through the superclass - Klass* super = Klass::cast(target->method_holder())->super(); + Klass* super = target->method_holder()->super(); target = (super == NULL) ? (Method*)NULL : Klass::cast(super)->uncached_lookup_method(method_name, method_signature); } if (target == NULL || !target->is_public() || target->is_abstract()) { @@ -754,7 +755,7 @@ void klassItable::initialize_itable_for_interface(int method_table_offset, Klass // if checkconstraints requested methodHandle target_h (THREAD, target); // preserve across gc if (checkconstraints) { - Handle method_holder_loader (THREAD, InstanceKlass::cast(target->method_holder())->class_loader()); + Handle method_holder_loader (THREAD, target->method_holder()->class_loader()); if (method_holder_loader() != interface_loader()) { ResourceMark rm(THREAD); char* failed_type_name = @@ -824,7 +825,7 @@ void klassItable::adjust_method_entries(Method** old_methods, Method** new_metho if (!(*trace_name_printed)) { // RC_TRACE_MESG macro has an embedded ResourceMark RC_TRACE_MESG(("adjust: name=%s", - Klass::cast(old_method->method_holder())->external_name())); + old_method->method_holder()->external_name())); *trace_name_printed = true; } // RC_TRACE macro has an embedded ResourceMark @@ -959,9 +960,9 @@ void klassItable::setup_itable_offset_table(instanceKlassHandle klass) { // m must be a method in an interface int klassItable::compute_itable_index(Method* m) { - Klass* intf = m->method_holder(); - assert(InstanceKlass::cast(intf)->is_interface(), "sanity check"); - Array* methods = InstanceKlass::cast(intf)->methods(); + InstanceKlass* intf = m->method_holder(); + assert(intf->is_interface(), "sanity check"); + Array* methods = intf->methods(); int index = 0; while(methods->at(index) != m) { index++; diff --git a/hotspot/src/share/vm/oops/klassVtable.hpp b/hotspot/src/share/vm/oops/klassVtable.hpp index ca0ba34bdd6..c2c0c5cf177 100644 --- a/hotspot/src/share/vm/oops/klassVtable.hpp +++ b/hotspot/src/share/vm/oops/klassVtable.hpp @@ -84,11 +84,11 @@ class klassVtable : public ResourceObj { bool is_initialized(); // computes vtable length (in words) and the number of miranda methods - static void compute_vtable_size_and_num_mirandas(int &vtable_length, int &num_miranda_methods, - Klass* super, Array* methods, - AccessFlags class_flags, Handle classloader, - Symbol* classname, Array* local_interfaces, - TRAPS); + static void compute_vtable_size_and_num_mirandas( + int* vtable_length, int* num_new_mirandas, + GrowableArray* all_mirandas, Klass* super, + Array* methods, AccessFlags class_flags, Handle classloader, + Symbol* classname, Array* local_interfaces, TRAPS); // RedefineClasses() API support: // If any entry of this vtable points to any of old_methods, @@ -125,12 +125,17 @@ class klassVtable : public ResourceObj { // support for miranda methods bool is_miranda_entry_at(int i); - void fill_in_mirandas(int& initialized); + void fill_in_mirandas(int* initialized); static bool is_miranda(Method* m, Array* class_methods, Klass* super); - static void add_new_mirandas_to_list(GrowableArray* list_of_current_mirandas, Array* current_interface_methods, Array* class_methods, Klass* super); - static void get_mirandas(GrowableArray* mirandas, Klass* super, Array* class_methods, Array* local_interfaces); - static int get_num_mirandas(Klass* super, Array* class_methods, Array* local_interfaces); - + static void add_new_mirandas_to_lists( + GrowableArray* new_mirandas, + GrowableArray* all_mirandas, + Array* current_interface_methods, Array* class_methods, + Klass* super); + static void get_mirandas( + GrowableArray* new_mirandas, + GrowableArray* all_mirandas, Klass* super, + Array* class_methods, Array* local_interfaces); void verify_against(outputStream* st, klassVtable* vt, int index); inline InstanceKlass* ik() const; diff --git a/hotspot/src/share/vm/oops/method.cpp b/hotspot/src/share/vm/oops/method.cpp index 5a1032f771e..f64a7b27ea3 100644 --- a/hotspot/src/share/vm/oops/method.cpp +++ b/hotspot/src/share/vm/oops/method.cpp @@ -35,6 +35,7 @@ #include "memory/generation.hpp" #include "memory/metadataFactory.hpp" #include "memory/oopFactory.hpp" +#include "oops/constMethod.hpp" #include "oops/methodData.hpp" #include "oops/method.hpp" #include "oops/oop.inline.hpp" @@ -57,22 +58,24 @@ // Implementation of Method Method* Method::allocate(ClassLoaderData* loader_data, - int byte_code_size, - AccessFlags access_flags, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS) { + int byte_code_size, + AccessFlags access_flags, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + ConstMethod::MethodType method_type, + TRAPS) { assert(!access_flags.is_native() || byte_code_size == 0, "native methods should not contain byte codes"); ConstMethod* cm = ConstMethod::allocate(loader_data, - byte_code_size, - compressed_line_number_size, - localvariable_table_length, - exception_table_length, - checked_exceptions_length, - CHECK_NULL); + byte_code_size, + compressed_line_number_size, + localvariable_table_length, + exception_table_length, + checked_exceptions_length, + method_type, + CHECK_NULL); int size = Method::size(access_flags.is_native()); @@ -240,12 +243,12 @@ void Method::mask_for(int bci, InterpreterOopMap* mask) { warning("oopmap should only be accessed by the " "VM, GC task or CMS threads (or during debugging)"); InterpreterOopMap local_mask; - InstanceKlass::cast(method_holder())->mask_for(h_this, bci, &local_mask); + method_holder()->mask_for(h_this, bci, &local_mask); local_mask.print(); } } #endif - InstanceKlass::cast(method_holder())->mask_for(h_this, bci, mask); + method_holder()->mask_for(h_this, bci, mask); return; } @@ -520,7 +523,7 @@ bool Method::compute_has_loops_flag() { bool Method::is_final_method() const { // %%% Should return true for private methods also, // since there is no way to override them. - return is_final() || Klass::cast(method_holder())->is_final(); + return is_final() || method_holder()->is_final(); } @@ -552,7 +555,7 @@ bool Method::is_initializer() const { bool Method::has_valid_initializer_flags() const { return (is_static() || - InstanceKlass::cast(method_holder())->major_version() < 51); + method_holder()->major_version() < 51); } bool Method::is_static_initializer() const { @@ -614,7 +617,7 @@ bool Method::is_klass_loaded_by_klass_index(int klass_index) const { if( constants()->tag_at(klass_index).is_unresolved_klass() ) { Thread *thread = Thread::current(); Symbol* klass_name = constants()->klass_name_at(klass_index); - Handle loader(thread, InstanceKlass::cast(method_holder())->class_loader()); + Handle loader(thread, method_holder()->class_loader()); Handle prot (thread, Klass::cast(method_holder())->protection_domain()); return SystemDictionary::find(klass_name, loader, prot, thread) != NULL; } else { @@ -932,7 +935,7 @@ bool Method::is_overridden_in(Klass* k) const { // If method is an interface, we skip it - except if it // is a miranda method - if (InstanceKlass::cast(method_holder())->is_interface()) { + if (method_holder()->is_interface()) { // Check that method is not a miranda method if (ik->lookup_method(name(), signature()) == NULL) { // No implementation exist - so miranda method @@ -1017,7 +1020,7 @@ methodHandle Method::make_method_handle_intrinsic(vmIntrinsics::ID iid, ConstantPool* cp_oop = ConstantPool::allocate(loader_data, cp_length, CHECK_(empty)); cp = constantPoolHandle(THREAD, cp_oop); } - cp->set_pool_holder(holder()); + cp->set_pool_holder(InstanceKlass::cast(holder())); cp->symbol_at_put(_imcp_invoke_name, name); cp->symbol_at_put(_imcp_invoke_signature, signature); cp->set_preresolution(); @@ -1031,7 +1034,7 @@ methodHandle Method::make_method_handle_intrinsic(vmIntrinsics::ID iid, methodHandle m; { Method* m_oop = Method::allocate(loader_data, 0, accessFlags_from(flags_bits), - 0, 0, 0, 0, CHECK_(empty)); + 0, 0, 0, 0, ConstMethod::NORMAL, CHECK_(empty)); m = methodHandle(THREAD, m_oop); } m->set_constants(cp()); @@ -1083,15 +1086,16 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n int localvariable_len = m->localvariable_table_length(); int exception_table_len = m->exception_table_length(); - ClassLoaderData* loader_data = m()->method_holder()->class_loader_data(); + ClassLoaderData* loader_data = m->method_holder()->class_loader_data(); Method* newm_oop = Method::allocate(loader_data, - new_code_length, - flags, - new_compressed_linenumber_size, - localvariable_len, - exception_table_len, - checked_exceptions_len, - CHECK_(methodHandle())); + new_code_length, + flags, + new_compressed_linenumber_size, + localvariable_len, + exception_table_len, + checked_exceptions_len, + m->method_type(), + CHECK_(methodHandle())); methodHandle newm (THREAD, newm_oop); int new_method_size = newm->method_size(); @@ -1155,8 +1159,12 @@ methodHandle Method::clone_with_new_data(methodHandle m, u_char* new_code, int n vmSymbols::SID Method::klass_id_for_intrinsics(Klass* holder) { // if loader is not the default loader (i.e., != NULL), we can't know the intrinsics // because we are not loading from core libraries - if (InstanceKlass::cast(holder)->class_loader() != NULL) + // exception: the AES intrinsics come from lib/ext/sunjce_provider.jar + // which does not use the class default class loader so we check for its loader here + if ((InstanceKlass::cast(holder)->class_loader() != NULL) && + InstanceKlass::cast(holder)->class_loader()->klass()->name() != vmSymbols::sun_misc_Launcher_ExtClassLoader()) { return vmSymbols::NO_SID; // regardless of name, no intrinsics here + } // see if the klass name is well-known: Symbol* klass_name = InstanceKlass::cast(holder)->name(); @@ -1229,8 +1237,8 @@ bool Method::load_signature_classes(methodHandle m, TRAPS) { return false; } bool sig_is_loaded = true; - Handle class_loader(THREAD, InstanceKlass::cast(m->method_holder())->class_loader()); - Handle protection_domain(THREAD, Klass::cast(m->method_holder())->protection_domain()); + Handle class_loader(THREAD, m->method_holder()->class_loader()); + Handle protection_domain(THREAD, m->method_holder()->protection_domain()); ResourceMark rm(THREAD); Symbol* signature = m->signature(); for(SignatureStream ss(signature); !ss.is_done(); ss.next()) { @@ -1256,8 +1264,8 @@ bool Method::load_signature_classes(methodHandle m, TRAPS) { } bool Method::has_unloaded_classes_in_signature(methodHandle m, TRAPS) { - Handle class_loader(THREAD, InstanceKlass::cast(m->method_holder())->class_loader()); - Handle protection_domain(THREAD, Klass::cast(m->method_holder())->protection_domain()); + Handle class_loader(THREAD, m->method_holder()->class_loader()); + Handle protection_domain(THREAD, m->method_holder()->protection_domain()); ResourceMark rm(THREAD); Symbol* signature = m->signature(); for(SignatureStream ss(signature); !ss.is_done(); ss.next()) { @@ -1464,7 +1472,7 @@ bool CompressedLineNumberReadStream::read_pair() { Bytecodes::Code Method::orig_bytecode_at(int bci) const { - BreakpointInfo* bp = InstanceKlass::cast(method_holder())->breakpoints(); + BreakpointInfo* bp = method_holder()->breakpoints(); for (; bp != NULL; bp = bp->next()) { if (bp->match(this, bci)) { return bp->orig_bytecode(); @@ -1476,7 +1484,7 @@ Bytecodes::Code Method::orig_bytecode_at(int bci) const { void Method::set_orig_bytecode_at(int bci, Bytecodes::Code code) { assert(code != Bytecodes::_breakpoint, "cannot patch breakpoints this way"); - BreakpointInfo* bp = InstanceKlass::cast(method_holder())->breakpoints(); + BreakpointInfo* bp = method_holder()->breakpoints(); for (; bp != NULL; bp = bp->next()) { if (bp->match(this, bci)) { bp->set_orig_bytecode(code); @@ -1486,7 +1494,7 @@ void Method::set_orig_bytecode_at(int bci, Bytecodes::Code code) { } void Method::set_breakpoint(int bci) { - InstanceKlass* ik = InstanceKlass::cast(method_holder()); + InstanceKlass* ik = method_holder(); BreakpointInfo *bp = new BreakpointInfo(this, bci); bp->set_next(ik->breakpoints()); ik->set_breakpoints(bp); @@ -1495,7 +1503,7 @@ void Method::set_breakpoint(int bci) { } static void clear_matches(Method* m, int bci) { - InstanceKlass* ik = InstanceKlass::cast(m->method_holder()); + InstanceKlass* ik = m->method_holder(); BreakpointInfo* prev_bp = NULL; BreakpointInfo* next_bp; for (BreakpointInfo* bp = ik->breakpoints(); bp != NULL; bp = next_bp) { @@ -1778,7 +1786,7 @@ void Method::change_method_associated_with_jmethod_id(jmethodID jmid, Method* ne bool Method::is_method_id(jmethodID mid) { Method* m = resolve_jmethod_id(mid); assert(m != NULL, "should be called with non-null method"); - InstanceKlass* ik = InstanceKlass::cast(m->method_holder()); + InstanceKlass* ik = m->method_holder(); ClassLoaderData* cld = ik->class_loader_data(); if (cld->jmethod_ids() == NULL) return false; return (cld->jmethod_ids()->contains((Method**)mid)); diff --git a/hotspot/src/share/vm/oops/method.hpp b/hotspot/src/share/vm/oops/method.hpp index 5e779a57cc1..0b6b6b67635 100644 --- a/hotspot/src/share/vm/oops/method.hpp +++ b/hotspot/src/share/vm/oops/method.hpp @@ -30,7 +30,6 @@ #include "compiler/oopMap.hpp" #include "interpreter/invocationCounter.hpp" #include "oops/annotations.hpp" -#include "oops/constMethod.hpp" #include "oops/constantPool.hpp" #include "oops/instanceKlass.hpp" #include "oops/oop.hpp" @@ -104,6 +103,7 @@ class CheckedExceptionElement; class LocalVariableTableElement; class AdapterHandlerEntry; class MethodData; +class ConstMethod; class Method : public Metadata { friend class VMStructs; @@ -158,14 +158,16 @@ class Method : public Metadata { // Constructor Method(ConstMethod* xconst, AccessFlags access_flags, int size); public: + static Method* allocate(ClassLoaderData* loader_data, - int byte_code_size, - AccessFlags access_flags, - int compressed_line_number_size, - int localvariable_table_length, - int exception_table_length, - int checked_exceptions_length, - TRAPS); + int byte_code_size, + AccessFlags access_flags, + int compressed_line_number_size, + int localvariable_table_length, + int exception_table_length, + int checked_exceptions_length, + ConstMethod::MethodType method_type, + TRAPS); Method() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); } @@ -207,21 +209,21 @@ class Method : public Metadata { // annotations support AnnotationArray* annotations() const { - InstanceKlass* ik = InstanceKlass::cast(method_holder()); + InstanceKlass* ik = method_holder(); if (ik->annotations() == NULL) { return NULL; } return ik->annotations()->get_method_annotations_of(method_idnum()); } AnnotationArray* parameter_annotations() const { - InstanceKlass* ik = InstanceKlass::cast(method_holder()); + InstanceKlass* ik = method_holder(); if (ik->annotations() == NULL) { return NULL; } return ik->annotations()->get_method_parameter_annotations_of(method_idnum()); } AnnotationArray* annotation_default() const { - InstanceKlass* ik = InstanceKlass::cast(method_holder()); + InstanceKlass* ik = method_holder(); if (ik->annotations() == NULL) { return NULL; } @@ -494,7 +496,7 @@ class Method : public Metadata { { return constMethod()->compressed_linenumber_table(); } // method holder (the Klass* holding this method) - Klass* method_holder() const { return constants()->pool_holder(); } + InstanceKlass* method_holder() const { return constants()->pool_holder(); } void compute_size_of_parameters(Thread *thread); // word size of parameters (receiver if any + arguments) Symbol* klass_name() const; // returns the name of the method holder @@ -695,18 +697,18 @@ class Method : public Metadata { // Get this method's jmethodID -- allocate if it doesn't exist jmethodID jmethod_id() { methodHandle this_h(this); - return InstanceKlass::get_jmethod_id(InstanceKlass::cast(method_holder()), this_h); } + return InstanceKlass::get_jmethod_id(method_holder(), this_h); } // Lookup the jmethodID for this method. Return NULL if not found. // NOTE that this function can be called from a signal handler // (see AsyncGetCallTrace support for Forte Analyzer) and this // needs to be async-safe. No allocation should be done and // so handles are not used to avoid deadlock. - jmethodID find_jmethod_id_or_null() { return InstanceKlass::cast(method_holder())->jmethod_id_or_null(this); } + jmethodID find_jmethod_id_or_null() { return method_holder()->jmethod_id_or_null(this); } // JNI static invoke cached itable index accessors - int cached_itable_index() { return InstanceKlass::cast(method_holder())->cached_itable_index(method_idnum()); } - void set_cached_itable_index(int index) { InstanceKlass::cast(method_holder())->set_cached_itable_index(method_idnum(), index); } + int cached_itable_index() { return method_holder()->cached_itable_index(method_idnum()); } + void set_cached_itable_index(int index) { method_holder()->set_cached_itable_index(method_idnum(), index); } // Support for inlining of intrinsic methods vmIntrinsics::ID intrinsic_id() const { return (vmIntrinsics::ID) _intrinsic_id; } @@ -725,14 +727,18 @@ class Method : public Metadata { void set_dont_inline(bool x) { _dont_inline = x; } bool is_hidden() { return _hidden; } void set_hidden(bool x) { _hidden = x; } + ConstMethod::MethodType method_type() const { + return _constMethod->method_type(); + } + bool is_overpass() const { return method_type() == ConstMethod::OVERPASS; } // On-stack replacement support bool has_osr_nmethod(int level, bool match_level) { - return InstanceKlass::cast(method_holder())->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL; + return method_holder()->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL; } nmethod* lookup_osr_nmethod_for(int bci, int level, bool match_level) { - return InstanceKlass::cast(method_holder())->lookup_osr_nmethod(this, bci, level, match_level); + return method_holder()->lookup_osr_nmethod(this, bci, level, match_level); } // Inline cache support diff --git a/hotspot/src/share/vm/opto/c2_globals.hpp b/hotspot/src/share/vm/opto/c2_globals.hpp index 80996a5d713..4fdebf526cb 100644 --- a/hotspot/src/share/vm/opto/c2_globals.hpp +++ b/hotspot/src/share/vm/opto/c2_globals.hpp @@ -439,6 +439,9 @@ product(bool, DoEscapeAnalysis, true, \ "Perform escape analysis") \ \ + develop(bool, ExitEscapeAnalysisOnTimeout, true, \ + "Exit or throw assert in EA when it reaches time limit") \ + \ notproduct(bool, PrintEscapeAnalysis, false, \ "Print the results of escape analysis") \ \ diff --git a/hotspot/src/share/vm/opto/callGenerator.cpp b/hotspot/src/share/vm/opto/callGenerator.cpp index 547096b3dfc..93f2b859ba0 100644 --- a/hotspot/src/share/vm/opto/callGenerator.cpp +++ b/hotspot/src/share/vm/opto/callGenerator.cpp @@ -670,6 +670,129 @@ CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod* } +//------------------------PredictedIntrinsicGenerator------------------------------ +// Internal class which handles all predicted Intrinsic calls. +class PredictedIntrinsicGenerator : public CallGenerator { + CallGenerator* _intrinsic; + CallGenerator* _cg; + +public: + PredictedIntrinsicGenerator(CallGenerator* intrinsic, + CallGenerator* cg) + : CallGenerator(cg->method()) + { + _intrinsic = intrinsic; + _cg = cg; + } + + virtual bool is_virtual() const { return true; } + virtual bool is_inlined() const { return true; } + virtual bool is_intrinsic() const { return true; } + + virtual JVMState* generate(JVMState* jvms); +}; + + +CallGenerator* CallGenerator::for_predicted_intrinsic(CallGenerator* intrinsic, + CallGenerator* cg) { + return new PredictedIntrinsicGenerator(intrinsic, cg); +} + + +JVMState* PredictedIntrinsicGenerator::generate(JVMState* jvms) { + GraphKit kit(jvms); + PhaseGVN& gvn = kit.gvn(); + + CompileLog* log = kit.C->log(); + if (log != NULL) { + log->elem("predicted_intrinsic bci='%d' method='%d'", + jvms->bci(), log->identify(method())); + } + + Node* slow_ctl = _intrinsic->generate_predicate(kit.sync_jvms()); + if (kit.failing()) + return NULL; // might happen because of NodeCountInliningCutoff + + SafePointNode* slow_map = NULL; + JVMState* slow_jvms; + if (slow_ctl != NULL) { + PreserveJVMState pjvms(&kit); + kit.set_control(slow_ctl); + if (!kit.stopped()) { + slow_jvms = _cg->generate(kit.sync_jvms()); + if (kit.failing()) + return NULL; // might happen because of NodeCountInliningCutoff + assert(slow_jvms != NULL, "must be"); + kit.add_exception_states_from(slow_jvms); + kit.set_map(slow_jvms->map()); + if (!kit.stopped()) + slow_map = kit.stop(); + } + } + + if (kit.stopped()) { + // Predicate is always false. + kit.set_jvms(slow_jvms); + return kit.transfer_exceptions_into_jvms(); + } + + // Generate intrinsic code: + JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms()); + if (new_jvms == NULL) { + // Intrinsic failed, so use slow code or make a direct call. + if (slow_map == NULL) { + CallGenerator* cg = CallGenerator::for_direct_call(method()); + new_jvms = cg->generate(kit.sync_jvms()); + } else { + kit.set_jvms(slow_jvms); + return kit.transfer_exceptions_into_jvms(); + } + } + kit.add_exception_states_from(new_jvms); + kit.set_jvms(new_jvms); + + // Need to merge slow and fast? + if (slow_map == NULL) { + // The fast path is the only path remaining. + return kit.transfer_exceptions_into_jvms(); + } + + if (kit.stopped()) { + // Intrinsic method threw an exception, so it's just the slow path after all. + kit.set_jvms(slow_jvms); + return kit.transfer_exceptions_into_jvms(); + } + + // Finish the diamond. + kit.C->set_has_split_ifs(true); // Has chance for split-if optimization + RegionNode* region = new (kit.C) RegionNode(3); + region->init_req(1, kit.control()); + region->init_req(2, slow_map->control()); + kit.set_control(gvn.transform(region)); + Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO); + iophi->set_req(2, slow_map->i_o()); + kit.set_i_o(gvn.transform(iophi)); + kit.merge_memory(slow_map->merged_memory(), region, 2); + uint tos = kit.jvms()->stkoff() + kit.sp(); + uint limit = slow_map->req(); + for (uint i = TypeFunc::Parms; i < limit; i++) { + // Skip unused stack slots; fast forward to monoff(); + if (i == tos) { + i = kit.jvms()->monoff(); + if( i >= limit ) break; + } + Node* m = kit.map()->in(i); + Node* n = slow_map->in(i); + if (m != n) { + const Type* t = gvn.type(m)->meet(gvn.type(n)); + Node* phi = PhiNode::make(region, m, t); + phi->set_req(2, n); + kit.map()->set_req(i, gvn.transform(phi)); + } + } + return kit.transfer_exceptions_into_jvms(); +} + //-------------------------UncommonTrapCallGenerator----------------------------- // Internal class which handles all out-of-line calls checking receiver type. class UncommonTrapCallGenerator : public CallGenerator { diff --git a/hotspot/src/share/vm/opto/callGenerator.hpp b/hotspot/src/share/vm/opto/callGenerator.hpp index 3cfd39df63e..ae59173bf7d 100644 --- a/hotspot/src/share/vm/opto/callGenerator.hpp +++ b/hotspot/src/share/vm/opto/callGenerator.hpp @@ -143,6 +143,9 @@ class CallGenerator : public ResourceObj { // Registry for intrinsics: static CallGenerator* for_intrinsic(ciMethod* m); static void register_intrinsic(ciMethod* m, CallGenerator* cg); + static CallGenerator* for_predicted_intrinsic(CallGenerator* intrinsic, + CallGenerator* cg); + virtual Node* generate_predicate(JVMState* jvms) { return NULL; }; static void print_inlining(ciMethod* callee, int inline_level, int bci, const char* msg) { if (PrintInlining) diff --git a/hotspot/src/share/vm/opto/compile.cpp b/hotspot/src/share/vm/opto/compile.cpp index d870872a9d4..c4da70ee32c 100644 --- a/hotspot/src/share/vm/opto/compile.cpp +++ b/hotspot/src/share/vm/opto/compile.cpp @@ -3047,9 +3047,9 @@ bool Compile::Constant::operator==(const Constant& other) { case T_LONG: case T_DOUBLE: return (_v._value.j == other._v._value.j); case T_OBJECT: - case T_METADATA: return (_v._metadata == other._v._metadata); case T_ADDRESS: return (_v._value.l == other._v._value.l); case T_VOID: return (_v._value.l == other._v._value.l); // jump-table entries + case T_METADATA: return (_v._metadata == other._v._metadata); default: ShouldNotReachHere(); } return false; diff --git a/hotspot/src/share/vm/opto/compile.hpp b/hotspot/src/share/vm/opto/compile.hpp index 6bcf3d3da20..44bf277689c 100644 --- a/hotspot/src/share/vm/opto/compile.hpp +++ b/hotspot/src/share/vm/opto/compile.hpp @@ -149,7 +149,7 @@ class Compile : public Phase { private: BasicType _type; union { - jvalue _value; + jvalue _value; Metadata* _metadata; } _v; int _offset; // offset of this constant (in bytes) relative to the constant table base. diff --git a/hotspot/src/share/vm/opto/doCall.cpp b/hotspot/src/share/vm/opto/doCall.cpp index 30a01f34b3a..95d14884163 100644 --- a/hotspot/src/share/vm/opto/doCall.cpp +++ b/hotspot/src/share/vm/opto/doCall.cpp @@ -107,7 +107,17 @@ CallGenerator* Compile::call_generator(ciMethod* callee, int vtable_index, bool // intrinsics handle strict f.p. correctly. if (allow_inline && allow_intrinsics) { CallGenerator* cg = find_intrinsic(callee, call_is_virtual); - if (cg != NULL) return cg; + if (cg != NULL) { + if (cg->is_predicted()) { + // Code without intrinsic but, hopefully, inlined. + CallGenerator* inline_cg = this->call_generator(callee, + vtable_index, call_is_virtual, jvms, allow_inline, prof_factor, false); + if (inline_cg != NULL) { + cg = CallGenerator::for_predicted_intrinsic(cg, inline_cg); + } + } + return cg; + } } // Do method handle calls. diff --git a/hotspot/src/share/vm/opto/escape.cpp b/hotspot/src/share/vm/opto/escape.cpp index 9fd3180505d..a5aa47119da 100644 --- a/hotspot/src/share/vm/opto/escape.cpp +++ b/hotspot/src/share/vm/opto/escape.cpp @@ -893,12 +893,16 @@ void ConnectionGraph::process_call_arguments(CallNode *call) { arg_has_oops && (i > TypeFunc::Parms); #ifdef ASSERT if (!(is_arraycopy || - call->as_CallLeaf()->_name != NULL && - (strcmp(call->as_CallLeaf()->_name, "g1_wb_pre") == 0 || - strcmp(call->as_CallLeaf()->_name, "g1_wb_post") == 0 )) - ) { + (call->as_CallLeaf()->_name != NULL && + (strcmp(call->as_CallLeaf()->_name, "g1_wb_pre") == 0 || + strcmp(call->as_CallLeaf()->_name, "g1_wb_post") == 0 || + strcmp(call->as_CallLeaf()->_name, "aescrypt_encryptBlock") == 0 || + strcmp(call->as_CallLeaf()->_name, "aescrypt_decryptBlock") == 0 || + strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_encryptAESCrypt") == 0 || + strcmp(call->as_CallLeaf()->_name, "cipherBlockChaining_decryptAESCrypt") == 0) + ))) { call->dump(); - assert(false, "EA: unexpected CallLeaf"); + fatal(err_msg_res("EA unexpected CallLeaf %s", call->as_CallLeaf()->_name)); } #endif // Always process arraycopy's destination object since @@ -1080,7 +1084,7 @@ bool ConnectionGraph::complete_connection_graph( C->log()->text("%s", (iterations >= CG_BUILD_ITER_LIMIT) ? "iterations" : "time"); C->log()->end_elem(" limit'"); } - assert(false, err_msg_res("infinite EA connection graph build (%f sec, %d iterations) with %d nodes and worklist size %d", + assert(ExitEscapeAnalysisOnTimeout, err_msg_res("infinite EA connection graph build (%f sec, %d iterations) with %d nodes and worklist size %d", time.seconds(), iterations, nodes_size(), ptnodes_worklist.length())); // Possible infinite build_connection_graph loop, // bailout (no changes to ideal graph were made). diff --git a/hotspot/src/share/vm/opto/library_call.cpp b/hotspot/src/share/vm/opto/library_call.cpp index f34df79b476..6b90061ff4f 100644 --- a/hotspot/src/share/vm/opto/library_call.cpp +++ b/hotspot/src/share/vm/opto/library_call.cpp @@ -44,18 +44,22 @@ class LibraryIntrinsic : public InlineCallGenerator { public: private: bool _is_virtual; + bool _is_predicted; vmIntrinsics::ID _intrinsic_id; public: - LibraryIntrinsic(ciMethod* m, bool is_virtual, vmIntrinsics::ID id) + LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, vmIntrinsics::ID id) : InlineCallGenerator(m), _is_virtual(is_virtual), + _is_predicted(is_predicted), _intrinsic_id(id) { } virtual bool is_intrinsic() const { return true; } virtual bool is_virtual() const { return _is_virtual; } + virtual bool is_predicted() const { return _is_predicted; } virtual JVMState* generate(JVMState* jvms); + virtual Node* generate_predicate(JVMState* jvms); vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; } }; @@ -83,6 +87,7 @@ class LibraryCallKit : public GraphKit { int arg_size() const { return callee()->arg_size(); } bool try_to_inline(); + Node* try_to_predicate(); // Helper functions to inline natives void push_result(RegionNode* region, PhiNode* value); @@ -148,6 +153,7 @@ class LibraryCallKit : public GraphKit { CallJavaNode* generate_method_call_virtual(vmIntrinsics::ID method_id) { return generate_method_call(method_id, true, false); } + Node * load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, bool is_exact, bool is_static); Node* make_string_method_node(int opcode, Node* str1_start, Node* cnt1, Node* str2_start, Node* cnt2); Node* make_string_method_node(int opcode, Node* str1, Node* str2); @@ -253,6 +259,10 @@ class LibraryCallKit : public GraphKit { bool inline_reverseBytes(vmIntrinsics::ID id); bool inline_reference_get(); + bool inline_aescrypt_Block(vmIntrinsics::ID id); + bool inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id); + Node* inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting); + Node* get_key_start_from_aescrypt_object(Node* aescrypt_object); }; @@ -306,6 +316,8 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { } } + bool is_predicted = false; + switch (id) { case vmIntrinsics::_compareTo: if (!SpecialStringCompareTo) return NULL; @@ -413,6 +425,18 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { break; #endif + case vmIntrinsics::_aescrypt_encryptBlock: + case vmIntrinsics::_aescrypt_decryptBlock: + if (!UseAESIntrinsics) return NULL; + break; + + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + if (!UseAESIntrinsics) return NULL; + // these two require the predicated logic + is_predicted = true; + break; + default: assert(id <= vmIntrinsics::LAST_COMPILER_INLINE, "caller responsibility"); assert(id != vmIntrinsics::_Object_init && id != vmIntrinsics::_invoke, "enum out of order?"); @@ -444,7 +468,7 @@ CallGenerator* Compile::make_vm_intrinsic(ciMethod* m, bool is_virtual) { if (!InlineUnsafeOps) return NULL; } - return new LibraryIntrinsic(m, is_virtual, (vmIntrinsics::ID) id); + return new LibraryIntrinsic(m, is_virtual, is_predicted, (vmIntrinsics::ID) id); } //----------------------register_library_intrinsics----------------------- @@ -496,6 +520,47 @@ JVMState* LibraryIntrinsic::generate(JVMState* jvms) { return NULL; } +Node* LibraryIntrinsic::generate_predicate(JVMState* jvms) { + LibraryCallKit kit(jvms, this); + Compile* C = kit.C; + int nodes = C->unique(); +#ifndef PRODUCT + assert(is_predicted(), "sanity"); + if ((PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) && Verbose) { + char buf[1000]; + const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); + tty->print_cr("Predicate for intrinsic %s", str); + } +#endif + + Node* slow_ctl = kit.try_to_predicate(); + if (!kit.failing()) { + if (C->log()) { + C->log()->elem("predicate_intrinsic id='%s'%s nodes='%d'", + vmIntrinsics::name_at(intrinsic_id()), + (is_virtual() ? " virtual='1'" : ""), + C->unique() - nodes); + } + return slow_ctl; // Could be NULL if the check folds. + } + + // The intrinsic bailed out + if (PrintIntrinsics || PrintInlining NOT_PRODUCT( || PrintOptoInlining) ) { + if (jvms->has_method()) { + // Not a root compile. + const char* msg = "failed to generate predicate for intrinsic"; + CompileTask::print_inlining(kit.callee(), jvms->depth() - 1, kit.bci(), msg); + } else { + // Root compile + tty->print("Did not generate predicate for intrinsic %s%s at bci:%d in", + vmIntrinsics::name_at(intrinsic_id()), + (is_virtual() ? " (virtual)" : ""), kit.bci()); + } + } + C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); + return NULL; +} + bool LibraryCallKit::try_to_inline() { // Handle symbolic names for otherwise undistinguished boolean switches: const bool is_store = true; @@ -767,6 +832,14 @@ bool LibraryCallKit::try_to_inline() { case vmIntrinsics::_Reference_get: return inline_reference_get(); + case vmIntrinsics::_aescrypt_encryptBlock: + case vmIntrinsics::_aescrypt_decryptBlock: + return inline_aescrypt_Block(intrinsic_id()); + + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + return inline_cipherBlockChaining_AESCrypt(intrinsic_id()); + default: // If you get here, it may be that someone has added a new intrinsic // to the list in vmSymbols.hpp without implementing it here. @@ -780,6 +853,36 @@ bool LibraryCallKit::try_to_inline() { } } +Node* LibraryCallKit::try_to_predicate() { + if (!jvms()->has_method()) { + // Root JVMState has a null method. + assert(map()->memory()->Opcode() == Op_Parm, ""); + // Insert the memory aliasing node + set_all_memory(reset_memory()); + } + assert(merged_memory(), ""); + + switch (intrinsic_id()) { + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + return inline_cipherBlockChaining_AESCrypt_predicate(false); + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + return inline_cipherBlockChaining_AESCrypt_predicate(true); + + default: + // If you get here, it may be that someone has added a new intrinsic + // to the list in vmSymbols.hpp without implementing it here. +#ifndef PRODUCT + if ((PrintMiscellaneous && (Verbose || WizardMode)) || PrintOpto) { + tty->print_cr("*** Warning: Unimplemented predicate for intrinsic %s(%d)", + vmIntrinsics::name_at(intrinsic_id()), intrinsic_id()); + } +#endif + Node* slow_ctl = control(); + set_control(top()); // No fast path instrinsic + return slow_ctl; + } +} + //------------------------------push_result------------------------------ // Helper function for finishing intrinsics. void LibraryCallKit::push_result(RegionNode* region, PhiNode* value) { @@ -3830,7 +3933,7 @@ Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass, vtable_index*vtableEntry::size()) * wordSize + vtableEntry::method_offset_in_bytes(); Node* entry_addr = basic_plus_adr(obj_klass, entry_offset); - Node* target_call = make_load(NULL, entry_addr, TypeInstPtr::NOTNULL, T_OBJECT); + Node* target_call = make_load(NULL, entry_addr, TypePtr::NOTNULL, T_ADDRESS); // Compare the target method with the expected method (e.g., Object.hashCode). const TypePtr* native_call_addr = TypeMetadataPtr::make(method); @@ -5613,3 +5716,265 @@ bool LibraryCallKit::inline_reference_get() { push(result); return true; } + + +Node * LibraryCallKit::load_field_from_object(Node * fromObj, const char * fieldName, const char * fieldTypeString, + bool is_exact=true, bool is_static=false) { + + const TypeInstPtr* tinst = _gvn.type(fromObj)->isa_instptr(); + assert(tinst != NULL, "obj is null"); + assert(tinst->klass()->is_loaded(), "obj is not loaded"); + assert(!is_exact || tinst->klass_is_exact(), "klass not exact"); + + ciField* field = tinst->klass()->as_instance_klass()->get_field_by_name(ciSymbol::make(fieldName), + ciSymbol::make(fieldTypeString), + is_static); + if (field == NULL) return (Node *) NULL; + assert (field != NULL, "undefined field"); + + // Next code copied from Parse::do_get_xxx(): + + // Compute address and memory type. + int offset = field->offset_in_bytes(); + bool is_vol = field->is_volatile(); + ciType* field_klass = field->type(); + assert(field_klass->is_loaded(), "should be loaded"); + const TypePtr* adr_type = C->alias_type(field)->adr_type(); + Node *adr = basic_plus_adr(fromObj, fromObj, offset); + BasicType bt = field->layout_type(); + + // Build the resultant type of the load + const Type *type = TypeOopPtr::make_from_klass(field_klass->as_klass()); + + // Build the load. + Node* loadedField = make_load(NULL, adr, type, bt, adr_type, is_vol); + return loadedField; +} + + +//------------------------------inline_aescrypt_Block----------------------- +bool LibraryCallKit::inline_aescrypt_Block(vmIntrinsics::ID id) { + address stubAddr; + const char *stubName; + assert(UseAES, "need AES instruction support"); + + switch(id) { + case vmIntrinsics::_aescrypt_encryptBlock: + stubAddr = StubRoutines::aescrypt_encryptBlock(); + stubName = "aescrypt_encryptBlock"; + break; + case vmIntrinsics::_aescrypt_decryptBlock: + stubAddr = StubRoutines::aescrypt_decryptBlock(); + stubName = "aescrypt_decryptBlock"; + break; + } + if (stubAddr == NULL) return false; + + // Restore the stack and pop off the arguments. + int nargs = 5; // this + 2 oop/offset combos + assert(callee()->signature()->size() == nargs-1, "encryptBlock has 4 arguments"); + + Node *aescrypt_object = argument(0); + Node *src = argument(1); + Node *src_offset = argument(2); + Node *dest = argument(3); + Node *dest_offset = argument(4); + + // (1) src and dest are arrays. + const Type* src_type = src->Value(&_gvn); + const Type* dest_type = dest->Value(&_gvn); + const TypeAryPtr* top_src = src_type->isa_aryptr(); + const TypeAryPtr* top_dest = dest_type->isa_aryptr(); + assert (top_src != NULL && top_src->klass() != NULL && top_dest != NULL && top_dest->klass() != NULL, "args are strange"); + + // for the quick and dirty code we will skip all the checks. + // we are just trying to get the call to be generated. + Node* src_start = src; + Node* dest_start = dest; + if (src_offset != NULL || dest_offset != NULL) { + assert(src_offset != NULL && dest_offset != NULL, ""); + src_start = array_element_address(src, src_offset, T_BYTE); + dest_start = array_element_address(dest, dest_offset, T_BYTE); + } + + // now need to get the start of its expanded key array + // this requires a newer class file that has this array as littleEndian ints, otherwise we revert to java + Node* k_start = get_key_start_from_aescrypt_object(aescrypt_object); + if (k_start == NULL) return false; + + // Call the stub. + make_runtime_call(RC_LEAF|RC_NO_FP, OptoRuntime::aescrypt_block_Type(), + stubAddr, stubName, TypePtr::BOTTOM, + src_start, dest_start, k_start); + + return true; +} + +//------------------------------inline_cipherBlockChaining_AESCrypt----------------------- +bool LibraryCallKit::inline_cipherBlockChaining_AESCrypt(vmIntrinsics::ID id) { + address stubAddr; + const char *stubName; + + assert(UseAES, "need AES instruction support"); + + switch(id) { + case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt: + stubAddr = StubRoutines::cipherBlockChaining_encryptAESCrypt(); + stubName = "cipherBlockChaining_encryptAESCrypt"; + break; + case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt: + stubAddr = StubRoutines::cipherBlockChaining_decryptAESCrypt(); + stubName = "cipherBlockChaining_decryptAESCrypt"; + break; + } + if (stubAddr == NULL) return false; + + + // Restore the stack and pop off the arguments. + int nargs = 6; // this + oop/offset + len + oop/offset + assert(callee()->signature()->size() == nargs-1, "wrong number of arguments"); + Node *cipherBlockChaining_object = argument(0); + Node *src = argument(1); + Node *src_offset = argument(2); + Node *len = argument(3); + Node *dest = argument(4); + Node *dest_offset = argument(5); + + // (1) src and dest are arrays. + const Type* src_type = src->Value(&_gvn); + const Type* dest_type = dest->Value(&_gvn); + const TypeAryPtr* top_src = src_type->isa_aryptr(); + const TypeAryPtr* top_dest = dest_type->isa_aryptr(); + assert (top_src != NULL && top_src->klass() != NULL + && top_dest != NULL && top_dest->klass() != NULL, "args are strange"); + + // checks are the responsibility of the caller + Node* src_start = src; + Node* dest_start = dest; + if (src_offset != NULL || dest_offset != NULL) { + assert(src_offset != NULL && dest_offset != NULL, ""); + src_start = array_element_address(src, src_offset, T_BYTE); + dest_start = array_element_address(dest, dest_offset, T_BYTE); + } + + // if we are in this set of code, we "know" the embeddedCipher is an AESCrypt object + // (because of the predicated logic executed earlier). + // so we cast it here safely. + // this requires a newer class file that has this array as littleEndian ints, otherwise we revert to java + + Node* embeddedCipherObj = load_field_from_object(cipherBlockChaining_object, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false); + if (embeddedCipherObj == NULL) return false; + + // cast it to what we know it will be at runtime + const TypeInstPtr* tinst = _gvn.type(cipherBlockChaining_object)->isa_instptr(); + assert(tinst != NULL, "CBC obj is null"); + assert(tinst->klass()->is_loaded(), "CBC obj is not loaded"); + ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + if (!klass_AESCrypt->is_loaded()) return false; + + ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); + const TypeKlassPtr* aklass = TypeKlassPtr::make(instklass_AESCrypt); + const TypeOopPtr* xtype = aklass->as_instance_type(); + Node* aescrypt_object = new(C) CheckCastPPNode(control(), embeddedCipherObj, xtype); + aescrypt_object = _gvn.transform(aescrypt_object); + + // we need to get the start of the aescrypt_object's expanded key array + Node* k_start = get_key_start_from_aescrypt_object(aescrypt_object); + if (k_start == NULL) return false; + + // similarly, get the start address of the r vector + Node* objRvec = load_field_from_object(cipherBlockChaining_object, "r", "[B", /*is_exact*/ false); + if (objRvec == NULL) return false; + Node* r_start = array_element_address(objRvec, intcon(0), T_BYTE); + + // Call the stub, passing src_start, dest_start, k_start, r_start and src_len + make_runtime_call(RC_LEAF|RC_NO_FP, + OptoRuntime::cipherBlockChaining_aescrypt_Type(), + stubAddr, stubName, TypePtr::BOTTOM, + src_start, dest_start, k_start, r_start, len); + + // return is void so no result needs to be pushed + + return true; +} + +//------------------------------get_key_start_from_aescrypt_object----------------------- +Node * LibraryCallKit::get_key_start_from_aescrypt_object(Node *aescrypt_object) { + Node* objAESCryptKey = load_field_from_object(aescrypt_object, "K", "[I", /*is_exact*/ false); + assert (objAESCryptKey != NULL, "wrong version of com.sun.crypto.provider.AESCrypt"); + if (objAESCryptKey == NULL) return (Node *) NULL; + + // now have the array, need to get the start address of the K array + Node* k_start = array_element_address(objAESCryptKey, intcon(0), T_INT); + return k_start; +} + +//----------------------------inline_cipherBlockChaining_AESCrypt_predicate---------------------------- +// Return node representing slow path of predicate check. +// the pseudo code we want to emulate with this predicate is: +// for encryption: +// if (embeddedCipherObj instanceof AESCrypt) do_intrinsic, else do_javapath +// for decryption: +// if ((embeddedCipherObj instanceof AESCrypt) && (cipher!=plain)) do_intrinsic, else do_javapath +// note cipher==plain is more conservative than the original java code but that's OK +// +Node* LibraryCallKit::inline_cipherBlockChaining_AESCrypt_predicate(bool decrypting) { + // First, check receiver for NULL since it is virtual method. + int nargs = arg_size(); + Node* objCBC = argument(0); + _sp += nargs; + objCBC = do_null_check(objCBC, T_OBJECT); + _sp -= nargs; + + if (stopped()) return NULL; // Always NULL + + // Load embeddedCipher field of CipherBlockChaining object. + Node* embeddedCipherObj = load_field_from_object(objCBC, "embeddedCipher", "Lcom/sun/crypto/provider/SymmetricCipher;", /*is_exact*/ false); + + // get AESCrypt klass for instanceOf check + // AESCrypt might not be loaded yet if some other SymmetricCipher got us to this compile point + // will have same classloader as CipherBlockChaining object + const TypeInstPtr* tinst = _gvn.type(objCBC)->isa_instptr(); + assert(tinst != NULL, "CBCobj is null"); + assert(tinst->klass()->is_loaded(), "CBCobj is not loaded"); + + // we want to do an instanceof comparison against the AESCrypt class + ciKlass* klass_AESCrypt = tinst->klass()->as_instance_klass()->find_klass(ciSymbol::make("com/sun/crypto/provider/AESCrypt")); + if (!klass_AESCrypt->is_loaded()) { + // if AESCrypt is not even loaded, we never take the intrinsic fast path + Node* ctrl = control(); + set_control(top()); // no regular fast path + return ctrl; + } + ciInstanceKlass* instklass_AESCrypt = klass_AESCrypt->as_instance_klass(); + + _sp += nargs; // gen_instanceof might do an uncommon trap + Node* instof = gen_instanceof(embeddedCipherObj, makecon(TypeKlassPtr::make(instklass_AESCrypt))); + _sp -= nargs; + Node* cmp_instof = _gvn.transform(new (C) CmpINode(instof, intcon(1))); + Node* bool_instof = _gvn.transform(new (C) BoolNode(cmp_instof, BoolTest::ne)); + + Node* instof_false = generate_guard(bool_instof, NULL, PROB_MIN); + + // for encryption, we are done + if (!decrypting) + return instof_false; // even if it is NULL + + // for decryption, we need to add a further check to avoid + // taking the intrinsic path when cipher and plain are the same + // see the original java code for why. + RegionNode* region = new(C) RegionNode(3); + region->init_req(1, instof_false); + Node* src = argument(1); + Node *dest = argument(4); + Node* cmp_src_dest = _gvn.transform(new (C) CmpPNode(src, dest)); + Node* bool_src_dest = _gvn.transform(new (C) BoolNode(cmp_src_dest, BoolTest::eq)); + Node* src_dest_conjoint = generate_guard(bool_src_dest, NULL, PROB_MIN); + region->init_req(2, src_dest_conjoint); + + record_for_igvn(region); + return _gvn.transform(region); + +} + + diff --git a/hotspot/src/share/vm/opto/loopTransform.cpp b/hotspot/src/share/vm/opto/loopTransform.cpp index b8b1a57a9fc..53d0fffdc31 100644 --- a/hotspot/src/share/vm/opto/loopTransform.cpp +++ b/hotspot/src/share/vm/opto/loopTransform.cpp @@ -2715,6 +2715,8 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) { result_mem = new (C) ProjNode(call,TypeFunc::Memory); _igvn.register_new_node_with_optimizer(result_mem); +/* Disable following optimization until proper fix (add missing checks). + // If this fill is tightly coupled to an allocation and overwrites // the whole body, allow it to take over the zeroing. AllocateNode* alloc = AllocateNode::Ideal_allocation(base, this); @@ -2738,6 +2740,7 @@ bool PhaseIdealLoop::intrinsify_fill(IdealLoopTree* lpt) { #endif } } +*/ // Redirect the old control and memory edges that are outside the loop. Node* exit = head->loopexit()->proj_out(0); diff --git a/hotspot/src/share/vm/opto/mulnode.cpp b/hotspot/src/share/vm/opto/mulnode.cpp index 4572a265e57..4047b933fbd 100644 --- a/hotspot/src/share/vm/opto/mulnode.cpp +++ b/hotspot/src/share/vm/opto/mulnode.cpp @@ -479,24 +479,27 @@ Node *AndINode::Ideal(PhaseGVN *phase, bool can_reshape) { return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF)); // Masking bits off of a Short? Loading a Character does some masking - if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { - Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), - load->in(MemNode::Memory), - load->in(MemNode::Address), - load->adr_type()); - ldus = phase->transform(ldus); - return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); - } + if (can_reshape && + load->outcnt() == 1 && load->unique_out() == this) { + if (lop == Op_LoadS && (mask & 0xFFFF0000) == 0 ) { + Node *ldus = new (phase->C) LoadUSNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type()); + ldus = phase->transform(ldus); + return new (phase->C) AndINode(ldus, phase->intcon(mask & 0xFFFF)); + } - // Masking sign bits off of a Byte? Do an unsigned byte load plus - // an and. - if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { - Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), - load->in(MemNode::Memory), - load->in(MemNode::Address), - load->adr_type()); - ldub = phase->transform(ldub); - return new (phase->C) AndINode(ldub, phase->intcon(mask)); + // Masking sign bits off of a Byte? Do an unsigned byte load plus + // an and. + if (lop == Op_LoadB && (mask & 0xFFFFFF00) == 0) { + Node* ldub = new (phase->C) LoadUBNode(load->in(MemNode::Control), + load->in(MemNode::Memory), + load->in(MemNode::Address), + load->adr_type()); + ldub = phase->transform(ldub); + return new (phase->C) AndINode(ldub, phase->intcon(mask)); + } } // Masking off sign bits? Dont make them! @@ -923,7 +926,9 @@ Node *RShiftINode::Ideal(PhaseGVN *phase, bool can_reshape) { set_req(2, phase->intcon(0)); return this; } - else if( ld->Opcode() == Op_LoadUS ) + else if( can_reshape && + ld->Opcode() == Op_LoadUS && + ld->outcnt() == 1 && ld->unique_out() == shl) // Replace zero-extension-load with sign-extension-load return new (phase->C) LoadSNode( ld->in(MemNode::Control), ld->in(MemNode::Memory), diff --git a/hotspot/src/share/vm/opto/runtime.cpp b/hotspot/src/share/vm/opto/runtime.cpp index bb050533d22..51987e25e32 100644 --- a/hotspot/src/share/vm/opto/runtime.cpp +++ b/hotspot/src/share/vm/opto/runtime.cpp @@ -811,6 +811,48 @@ const TypeFunc* OptoRuntime::array_fill_Type() { return TypeFunc::make(domain, range); } +// for aescrypt encrypt/decrypt operations, just three pointers returning void (length is constant) +const TypeFunc* OptoRuntime::aescrypt_block_Type() { + // create input type (domain) + int num_args = 3; + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; + fields[argp++] = TypePtr::NOTNULL; // src + fields[argp++] = TypePtr::NOTNULL; // dest + fields[argp++] = TypePtr::NOTNULL; // k array + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + + // no result type needed + fields = TypeTuple::fields(1); + fields[TypeFunc::Parms+0] = NULL; // void + const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); + return TypeFunc::make(domain, range); +} + +// for cipherBlockChaining calls of aescrypt encrypt/decrypt, four pointers and a length, returning void +const TypeFunc* OptoRuntime::cipherBlockChaining_aescrypt_Type() { + // create input type (domain) + int num_args = 5; + int argcnt = num_args; + const Type** fields = TypeTuple::fields(argcnt); + int argp = TypeFunc::Parms; + fields[argp++] = TypePtr::NOTNULL; // src + fields[argp++] = TypePtr::NOTNULL; // dest + fields[argp++] = TypePtr::NOTNULL; // k array + fields[argp++] = TypePtr::NOTNULL; // r array + fields[argp++] = TypeInt::INT; // src len + assert(argp == TypeFunc::Parms+argcnt, "correct decoding"); + const TypeTuple* domain = TypeTuple::make(TypeFunc::Parms+argcnt, fields); + + // no result type needed + fields = TypeTuple::fields(1); + fields[TypeFunc::Parms+0] = NULL; // void + const TypeTuple* range = TypeTuple::make(TypeFunc::Parms, fields); + return TypeFunc::make(domain, range); +} + //------------- Interpreter state access for on stack replacement const TypeFunc* OptoRuntime::osr_end_Type() { // create input type (domain) diff --git a/hotspot/src/share/vm/opto/runtime.hpp b/hotspot/src/share/vm/opto/runtime.hpp index c7077726761..13da255b742 100644 --- a/hotspot/src/share/vm/opto/runtime.hpp +++ b/hotspot/src/share/vm/opto/runtime.hpp @@ -280,6 +280,9 @@ private: static const TypeFunc* array_fill_Type(); + static const TypeFunc* aescrypt_block_Type(); + static const TypeFunc* cipherBlockChaining_aescrypt_Type(); + // leaf on stack replacement interpreter accessor types static const TypeFunc* osr_end_Type(); diff --git a/hotspot/src/share/vm/opto/superword.cpp b/hotspot/src/share/vm/opto/superword.cpp index ffc5394bb09..f53c6483750 100644 --- a/hotspot/src/share/vm/opto/superword.cpp +++ b/hotspot/src/share/vm/opto/superword.cpp @@ -1776,16 +1776,15 @@ void SuperWord::compute_vector_element_type() { set_velt_type(n, container_type(n)); } - // Propagate narrowed type backwards through operations + // Propagate integer narrowed type backwards through operations // that don't depend on higher order bits for (int i = _block.length() - 1; i >= 0; i--) { Node* n = _block.at(i); // Only integer types need be examined - const Type* vt = velt_type(n); - if (vt->basic_type() == T_INT) { + const Type* vtn = velt_type(n); + if (vtn->basic_type() == T_INT) { uint start, end; VectorNode::vector_operands(n, &start, &end); - const Type* vt = velt_type(n); for (uint j = start; j < end; j++) { Node* in = n->in(j); @@ -1801,6 +1800,24 @@ void SuperWord::compute_vector_element_type() { } } if (same_type) { + // For right shifts of small integer types (bool, byte, char, short) + // we need precise information about sign-ness. Only Load nodes have + // this information because Store nodes are the same for signed and + // unsigned values. And any arithmetic operation after a load may + // expand a value to signed Int so such right shifts can't be used + // because vector elements do not have upper bits of Int. + const Type* vt = vtn; + if (VectorNode::is_shift(in)) { + Node* load = in->in(1); + if (load->is_Load() && in_bb(load) && (velt_type(load)->basic_type() == T_INT)) { + vt = velt_type(load); + } else if (in->Opcode() != Op_LShiftI) { + // Widen type to Int to avoid creation of right shift vector + // (align + data_size(s1) check in stmts_can_pack() will fail). + // Note, left shifts work regardless type. + vt = TypeInt::INT; + } + } set_velt_type(in, vt); } } @@ -1841,7 +1858,20 @@ int SuperWord::memory_alignment(MemNode* s, int iv_adjust) { // Smallest type containing range of values const Type* SuperWord::container_type(Node* n) { if (n->is_Mem()) { - return Type::get_const_basic_type(n->as_Mem()->memory_type()); + BasicType bt = n->as_Mem()->memory_type(); + if (n->is_Store() && (bt == T_CHAR)) { + // Use T_SHORT type instead of T_CHAR for stored values because any + // preceding arithmetic operation extends values to signed Int. + bt = T_SHORT; + } + if (n->Opcode() == Op_LoadUB) { + // Adjust type for unsigned byte loads, it is important for right shifts. + // T_BOOLEAN is used because there is no basic type representing type + // TypeInt::UBYTE. Use of T_BOOLEAN for vectors is fine because only + // size (one byte) and sign is important. + bt = T_BOOLEAN; + } + return Type::get_const_basic_type(bt); } const Type* t = _igvn.type(n); if (t->basic_type() == T_INT) { diff --git a/hotspot/src/share/vm/opto/type.cpp b/hotspot/src/share/vm/opto/type.cpp index f982799f634..1a8ee2597dd 100644 --- a/hotspot/src/share/vm/opto/type.cpp +++ b/hotspot/src/share/vm/opto/type.cpp @@ -61,7 +61,7 @@ Type::TypeInfo Type::_type_info[Type::lastype] = { { Bad, T_ILLEGAL, "tuple:", false, Node::NotAMachineReg, relocInfo::none }, // Tuple { Bad, T_ARRAY, "array:", false, Node::NotAMachineReg, relocInfo::none }, // Array -#if defined(IA32) || defined(AMD64) +#ifndef SPARC { Bad, T_ILLEGAL, "vectors:", false, Op_VecS, relocInfo::none }, // VectorS { Bad, T_ILLEGAL, "vectord:", false, Op_VecD, relocInfo::none }, // VectorD { Bad, T_ILLEGAL, "vectorx:", false, Op_VecX, relocInfo::none }, // VectorX diff --git a/hotspot/src/share/vm/opto/vectornode.cpp b/hotspot/src/share/vm/opto/vectornode.cpp index d0955a819e1..9660d4ed818 100644 --- a/hotspot/src/share/vm/opto/vectornode.cpp +++ b/hotspot/src/share/vm/opto/vectornode.cpp @@ -29,8 +29,7 @@ //------------------------------VectorNode-------------------------------------- // Return the vector operator for the specified scalar operation -// and vector length. Also used to check if the code generator -// supports the vector operation. +// and vector length. int VectorNode::opcode(int sopc, BasicType bt) { switch (sopc) { case Op_AddI: @@ -75,7 +74,7 @@ int VectorNode::opcode(int sopc, BasicType bt) { case T_BYTE: return 0; // Unimplemented case T_CHAR: case T_SHORT: return Op_MulVS; - case T_INT: return Matcher::match_rule_supported(Op_MulVI) ? Op_MulVI : 0; // SSE4_1 + case T_INT: return Op_MulVI; } ShouldNotReachHere(); case Op_MulF: @@ -104,9 +103,9 @@ int VectorNode::opcode(int sopc, BasicType bt) { return Op_LShiftVL; case Op_RShiftI: switch (bt) { - case T_BOOLEAN: + case T_BOOLEAN:return Op_URShiftVB; // boolean is unsigned value + case T_CHAR: return Op_URShiftVS; // char is unsigned value case T_BYTE: return Op_RShiftVB; - case T_CHAR: case T_SHORT: return Op_RShiftVS; case T_INT: return Op_RShiftVI; } @@ -116,10 +115,14 @@ int VectorNode::opcode(int sopc, BasicType bt) { return Op_RShiftVL; case Op_URShiftI: switch (bt) { - case T_BOOLEAN: - case T_BYTE: return Op_URShiftVB; - case T_CHAR: - case T_SHORT: return Op_URShiftVS; + case T_BOOLEAN:return Op_URShiftVB; + case T_CHAR: return Op_URShiftVS; + case T_BYTE: + case T_SHORT: return 0; // Vector logical right shift for signed short + // values produces incorrect Java result for + // negative data because java code should convert + // a short value into int value with sign + // extension before a shift. case T_INT: return Op_URShiftVI; } ShouldNotReachHere(); @@ -157,12 +160,14 @@ int VectorNode::opcode(int sopc, BasicType bt) { return 0; // Unimplemented } +// Also used to check if the code generator +// supports the vector operation. bool VectorNode::implemented(int opc, uint vlen, BasicType bt) { if (is_java_primitive(bt) && (vlen > 1) && is_power_of_2(vlen) && Matcher::vector_size_supported(bt, vlen)) { int vopc = VectorNode::opcode(opc, bt); - return vopc > 0 && Matcher::has_match_rule(vopc); + return vopc > 0 && Matcher::match_rule_supported(vopc); } return false; } diff --git a/hotspot/src/share/vm/prims/jni.cpp b/hotspot/src/share/vm/prims/jni.cpp index 3f7bc7011f8..aeb62798ba1 100644 --- a/hotspot/src/share/vm/prims/jni.cpp +++ b/hotspot/src/share/vm/prims/jni.cpp @@ -2985,7 +2985,7 @@ JNI_ENTRY(jfieldID, jni_GetStaticFieldID(JNIEnv *env, jclass clazz, } // A jfieldID for a static field is a JNIid specifying the field holder and the offset within the Klass* - JNIid* id = InstanceKlass::cast(fd.field_holder())->jni_id_for(fd.offset()); + JNIid* id = fd.field_holder()->jni_id_for(fd.offset()); debug_only(id->set_is_static_field_id();) debug_only(id->verify(fd.field_holder())); @@ -4016,7 +4016,7 @@ static bool register_native(KlassHandle k, Symbol* name, Symbol* signature, addr if (PrintJNIResolving) { ResourceMark rm(THREAD); tty->print_cr("[Registering JNI native method %s.%s]", - Klass::cast(method->method_holder())->external_name(), + method->method_holder()->external_name(), method->name()->as_C_string()); } return true; diff --git a/hotspot/src/share/vm/prims/jvm.cpp b/hotspot/src/share/vm/prims/jvm.cpp index 34e1683ab27..9b6f05f35d5 100644 --- a/hotspot/src/share/vm/prims/jvm.cpp +++ b/hotspot/src/share/vm/prims/jvm.cpp @@ -125,7 +125,7 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) { int line_number = -1; const char * source_file = NULL; const char * trace = "explicit"; - Klass* caller = NULL; + InstanceKlass* caller = NULL; JavaThread* jthread = JavaThread::current(); if (jthread->has_last_Java_frame()) { vframeStream vfst(jthread); @@ -153,17 +153,17 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) { // that caller, otherwise keep quiet since this should be picked up elsewhere. bool found_it = false; if (!vfst.at_end() && - InstanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() && + vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() && vfst.method()->name() == vmSymbols::forName0_name()) { vfst.next(); if (!vfst.at_end() && - InstanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class() && + vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class() && vfst.method()->name() == vmSymbols::forName_name()) { vfst.next(); found_it = true; } } else if (last_caller != NULL && - InstanceKlass::cast(last_caller->method_holder())->name() == + last_caller->method_holder()->name() == vmSymbols::java_lang_ClassLoader() && (last_caller->name() == vmSymbols::loadClassInternal_name() || last_caller->name() == vmSymbols::loadClass_name())) { @@ -182,7 +182,7 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) { // show method name if it's a native method trace = vfst.method()->name_and_sig_as_C_string(); } - Symbol* s = InstanceKlass::cast(caller)->source_file_name(); + Symbol* s = caller->source_file_name(); if (s != NULL) { source_file = s->as_C_string(); } @@ -190,8 +190,8 @@ static void trace_class_resolution_impl(Klass* to_class, TRAPS) { } if (caller != NULL) { if (to_class != caller) { - const char * from = Klass::cast(caller)->external_name(); - const char * to = Klass::cast(to_class)->external_name(); + const char * from = caller->external_name(); + const char * to = to_class->external_name(); // print in a single call to reduce interleaving between threads if (source_file != NULL) { tty->print("RESOLVE %s %s %s:%d (%s)\n", from, to, source_file, line_number, trace); @@ -1228,7 +1228,7 @@ JVM_ENTRY(jobject, JVM_GetStackAccessControlContext(JNIEnv *env, jclass cls)) privileged_context = Handle(thread, thread->privileged_stack_top()->privileged_context()); protection_domain = thread->privileged_stack_top()->protection_domain(); } else { - protection_domain = InstanceKlass::cast(method->method_holder())->protection_domain(); + protection_domain = method->method_holder()->protection_domain(); } if ((previous_protection_domain != protection_domain) && (protection_domain != NULL)) { @@ -3048,10 +3048,10 @@ JVM_ENTRY(jclass, JVM_CurrentLoadedClass(JNIEnv *env)) Method* m = vfst.method(); if (!m->is_native()) { - Klass* holder = m->method_holder(); - oop loader = InstanceKlass::cast(holder)->class_loader(); + InstanceKlass* holder = m->method_holder(); + oop loader = holder->class_loader(); if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) { - return (jclass) JNIHandles::make_local(env, Klass::cast(holder)->java_mirror()); + return (jclass) JNIHandles::make_local(env, holder->java_mirror()); } } } @@ -3071,9 +3071,9 @@ JVM_ENTRY(jobject, JVM_CurrentClassLoader(JNIEnv *env)) Method* m = vfst.method(); if (!m->is_native()) { - Klass* holder = m->method_holder(); + InstanceKlass* holder = m->method_holder(); assert(holder->is_klass(), "just checking"); - oop loader = InstanceKlass::cast(holder)->class_loader(); + oop loader = holder->class_loader(); if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) { return JNIHandles::make_local(env, loader); } @@ -3148,9 +3148,9 @@ JVM_ENTRY(jint, JVM_ClassDepth(JNIEnv *env, jstring name)) for(vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { if (!vfst.method()->is_native()) { - Klass* holder = vfst.method()->method_holder(); + InstanceKlass* holder = vfst.method()->method_holder(); assert(holder->is_klass(), "just checking"); - if (InstanceKlass::cast(holder)->name() == class_name_sym) { + if (holder->name() == class_name_sym) { return depth; } depth++; @@ -3171,9 +3171,9 @@ JVM_ENTRY(jint, JVM_ClassLoaderDepth(JNIEnv *env)) Method* m = vfst.method(); if (!m->is_native()) { - Klass* holder = m->method_holder(); + InstanceKlass* holder = m->method_holder(); assert(holder->is_klass(), "just checking"); - oop loader = InstanceKlass::cast(holder)->class_loader(); + oop loader = holder->class_loader(); if (loader != NULL && !java_lang_ClassLoader::is_trusted_loader(loader)) { return depth; } @@ -3322,8 +3322,7 @@ JVM_ENTRY(jobject, JVM_LatestUserDefinedLoader(JNIEnv *env)) for (vframeStream vfst(thread); !vfst.at_end(); vfst.next()) { // UseNewReflection vfst.skip_reflection_related_frames(); // Only needed for 1.4 reflection - Klass* holder = vfst.method()->method_holder(); - oop loader = InstanceKlass::cast(holder)->class_loader(); + oop loader = vfst.method()->method_holder()->class_loader(); if (loader != NULL) { return JNIHandles::make_local(env, loader); } @@ -3365,9 +3364,9 @@ JVM_ENTRY(jclass, JVM_LoadClass0(JNIEnv *env, jobject receiver, !vfst.at_end() && loader == NULL; vfst.next()) { if (!vfst.method()->is_native()) { - Klass* holder = vfst.method()->method_holder(); - loader = InstanceKlass::cast(holder)->class_loader(); - protection_domain = InstanceKlass::cast(holder)->protection_domain(); + InstanceKlass* holder = vfst.method()->method_holder(); + loader = holder->class_loader(); + protection_domain = holder->protection_domain(); } } } else { diff --git a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp index 11281c61946..aec2b410412 100644 --- a/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp +++ b/hotspot/src/share/vm/prims/jvmtiClassFileReconstituter.cpp @@ -753,7 +753,7 @@ void JvmtiClassFileReconstituter::copy_bytecodes(methodHandle mh, unsigned char* p = bytecodes; Bytecodes::Code code; - bool is_rewritten = InstanceKlass::cast(mh->method_holder())->is_rewritten(); + bool is_rewritten = mh->method_holder()->is_rewritten(); while ((code = bs.next()) >= 0) { assert(Bytecodes::is_java_code(code), "sanity check"); diff --git a/hotspot/src/share/vm/prims/jvmtiEnv.cpp b/hotspot/src/share/vm/prims/jvmtiEnv.cpp index b0fe73ed84b..5cdac08eb81 100644 --- a/hotspot/src/share/vm/prims/jvmtiEnv.cpp +++ b/hotspot/src/share/vm/prims/jvmtiEnv.cpp @@ -2822,7 +2822,7 @@ JvmtiEnv::GetLocalVariableTable(Method* method_oop, jint* entry_count_ptr, jvmti JavaThread* current_thread = JavaThread::current(); // does the klass have any local variable information? - InstanceKlass* ik = InstanceKlass::cast(method_oop->method_holder()); + InstanceKlass* ik = method_oop->method_holder(); if (!ik->access_flags().has_localvariable_table()) { return (JVMTI_ERROR_ABSENT_INFORMATION); } diff --git a/hotspot/src/share/vm/prims/methodHandles.cpp b/hotspot/src/share/vm/prims/methodHandles.cpp index bd587439b1a..69139aeae3c 100644 --- a/hotspot/src/share/vm/prims/methodHandles.cpp +++ b/hotspot/src/share/vm/prims/methodHandles.cpp @@ -233,7 +233,7 @@ Handle MethodHandles::init_method_MemberName(oop mname_oop, CallInfo& info, TRAP methodHandle m = info.resolved_method(); KlassHandle defc = info.resolved_klass(); int vmindex = -1; - if (defc->is_interface() && Klass::cast(m->method_holder())->is_interface()) { + if (defc->is_interface() && m->method_holder()->is_interface()) { // LinkResolver does not report itable indexes! (fix this?) vmindex = klassItable::compute_itable_index(m()); } else if (m->can_be_statically_bound()) { @@ -749,8 +749,8 @@ void MethodHandles::expand_MemberName(Handle mname, int suppress, TRAPS) { DEBUG_ONLY(vmtarget = NULL); // safety if (m.is_null()) break; if (!have_defc) { - Klass* defc = m->method_holder(); - java_lang_invoke_MemberName::set_clazz(mname(), Klass::cast(defc)->java_mirror()); + InstanceKlass* defc = m->method_holder(); + java_lang_invoke_MemberName::set_clazz(mname(), defc->java_mirror()); } if (!have_name) { //not java_lang_String::create_from_symbol; let's intern member names diff --git a/hotspot/src/share/vm/prims/nativeLookup.cpp b/hotspot/src/share/vm/prims/nativeLookup.cpp index 54b6ce5eaf4..690a1d24e0d 100644 --- a/hotspot/src/share/vm/prims/nativeLookup.cpp +++ b/hotspot/src/share/vm/prims/nativeLookup.cpp @@ -165,8 +165,7 @@ address NativeLookup::lookup_style(methodHandle method, char* pure_name, const c // Note: It is critical for bootstrapping that Java_java_lang_ClassLoader_00024NativeLibrary_find // gets found the first time around - otherwise an infinite loop can occure. This is // another VM/library dependency - Handle loader(THREAD, - InstanceKlass::cast(method->method_holder())->class_loader()); + Handle loader(THREAD, method->method_holder()->class_loader()); if (loader.is_null()) { entry = lookup_special_native(jni_name); if (entry == NULL) { @@ -393,7 +392,7 @@ address NativeLookup::lookup(methodHandle method, bool& in_base_library, TRAPS) if (PrintJNIResolving) { ResourceMark rm(THREAD); tty->print_cr("[Dynamic-linking native method %s.%s ... JNI]", - Klass::cast(method->method_holder())->external_name(), + method->method_holder()->external_name(), method->name()->as_C_string()); } } diff --git a/hotspot/src/share/vm/prims/unsafe.cpp b/hotspot/src/share/vm/prims/unsafe.cpp index 051c85975e1..e3750e66f1c 100644 --- a/hotspot/src/share/vm/prims/unsafe.cpp +++ b/hotspot/src/share/vm/prims/unsafe.cpp @@ -124,6 +124,8 @@ inline void* index_oop_from_field_offset_long(oop p, jlong field_offset) { assert((void*)p->obj_field_addr((jint)byte_offset) == ptr_plus_disp, "raw [ptr+disp] must be consistent with oop::field_base"); } + jlong p_size = HeapWordSize * (jlong)(p->size()); + assert(byte_offset < p_size, err_msg("Unsafe access: offset " INT64_FORMAT " > object's size " INT64_FORMAT, byte_offset, p_size)); } #endif if (sizeof(char*) == sizeof(jint)) // (this constant folds!) diff --git a/hotspot/src/share/vm/runtime/arguments.cpp b/hotspot/src/share/vm/runtime/arguments.cpp index d27bf0ef47d..5d0fe7adae2 100644 --- a/hotspot/src/share/vm/runtime/arguments.cpp +++ b/hotspot/src/share/vm/runtime/arguments.cpp @@ -878,7 +878,7 @@ bool Arguments::process_settings_file(const char* file_name, bool should_exist, bool result = true; int c = getc(stream); - while(c != EOF) { + while(c != EOF && pos < (int)(sizeof(token)-1)) { if (in_white_space) { if (in_comment) { if (c == '\n') in_comment = false; diff --git a/hotspot/src/share/vm/runtime/compilationPolicy.cpp b/hotspot/src/share/vm/runtime/compilationPolicy.cpp index 940978cf7d9..73b8f8393f7 100644 --- a/hotspot/src/share/vm/runtime/compilationPolicy.cpp +++ b/hotspot/src/share/vm/runtime/compilationPolicy.cpp @@ -627,7 +627,7 @@ const char* StackWalkCompPolicy::shouldNotInline(methodHandle m) { // negative filter: should send NOT be inlined? returns NULL (--> inline) or rejection msg if (m->is_abstract()) return (_msg = "abstract method"); // note: we allow ik->is_abstract() - if (!InstanceKlass::cast(m->method_holder())->is_initialized()) return (_msg = "method holder not initialized"); + if (!m->method_holder()->is_initialized()) return (_msg = "method holder not initialized"); if (m->is_native()) return (_msg = "native method"); nmethod* m_code = m->code(); if (m_code != NULL && m_code->code_size() > InlineSmallCode) diff --git a/hotspot/src/share/vm/runtime/deoptimization.cpp b/hotspot/src/share/vm/runtime/deoptimization.cpp index 962b9882762..01f4dc75fe1 100644 --- a/hotspot/src/share/vm/runtime/deoptimization.cpp +++ b/hotspot/src/share/vm/runtime/deoptimization.cpp @@ -1191,12 +1191,12 @@ void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int i if (!constant_pool->tag_at(index).is_symbol()) return; - Handle class_loader (THREAD, InstanceKlass::cast(constant_pool->pool_holder())->class_loader()); + Handle class_loader (THREAD, constant_pool->pool_holder()->class_loader()); Symbol* symbol = constant_pool->symbol_at(index); // class name? if (symbol->byte_at(0) != '(') { - Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); + Handle protection_domain (THREAD, constant_pool->pool_holder()->protection_domain()); SystemDictionary::resolve_or_null(symbol, class_loader, protection_domain, CHECK); return; } @@ -1206,7 +1206,7 @@ void Deoptimization::load_class_by_index(constantPoolHandle constant_pool, int i for (SignatureStream ss(symbol); !ss.is_done(); ss.next()) { if (ss.is_object()) { Symbol* class_name = ss.as_symbol(CHECK); - Handle protection_domain (THREAD, Klass::cast(constant_pool->pool_holder())->protection_domain()); + Handle protection_domain (THREAD, constant_pool->pool_holder()->protection_domain()); SystemDictionary::resolve_or_null(class_name, class_loader, protection_domain, CHECK); } } diff --git a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp index 23011684d92..001d5d23e11 100644 --- a/hotspot/src/share/vm/runtime/fieldDescriptor.cpp +++ b/hotspot/src/share/vm/runtime/fieldDescriptor.cpp @@ -36,7 +36,7 @@ oop fieldDescriptor::loader() const { - return InstanceKlass::cast(_cp->pool_holder())->class_loader(); + return _cp->pool_holder()->class_loader(); } Symbol* fieldDescriptor::generic_signature() const { @@ -45,7 +45,7 @@ Symbol* fieldDescriptor::generic_signature() const { } int idx = 0; - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); for (AllFieldStream fs(ik); !fs.done(); fs.next()) { if (idx == _index) { return fs.generic_signature(); @@ -58,7 +58,7 @@ Symbol* fieldDescriptor::generic_signature() const { } AnnotationArray* fieldDescriptor::annotations() const { - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); Array* md = ik->fields_annotations(); if (md == NULL) return NULL; diff --git a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp index 496b160cd8d..00caf89844f 100644 --- a/hotspot/src/share/vm/runtime/fieldDescriptor.hpp +++ b/hotspot/src/share/vm/runtime/fieldDescriptor.hpp @@ -43,12 +43,12 @@ class fieldDescriptor VALUE_OBJ_CLASS_SPEC { // update the access_flags for the field in the klass void update_klass_field_access_flag() { - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); ik->field(index())->set_access_flags(_access_flags.as_short()); } FieldInfo* field() const { - InstanceKlass* ik = InstanceKlass::cast(field_holder()); + InstanceKlass* ik = field_holder(); return ik->field(_index); } @@ -59,46 +59,46 @@ class fieldDescriptor VALUE_OBJ_CLASS_SPEC { Symbol* signature() const { return field()->signature(_cp); } - Klass* field_holder() const { return _cp->pool_holder(); } - ConstantPool* constants() const { return _cp(); } - AccessFlags access_flags() const { return _access_flags; } - oop loader() const; + InstanceKlass* field_holder() const { return _cp->pool_holder(); } + ConstantPool* constants() const { return _cp(); } + AccessFlags access_flags() const { return _access_flags; } + oop loader() const; // Offset (in words) of field from start of instanceOop / Klass* - int offset() const { return field()->offset(); } - Symbol* generic_signature() const; - int index() const { return _index; } - AnnotationArray* annotations() const; + int offset() const { return field()->offset(); } + Symbol* generic_signature() const; + int index() const { return _index; } + AnnotationArray* annotations() const; // Initial field value - bool has_initial_value() const { return field()->initval_index() != 0; } - int initial_value_index() const { return field()->initval_index(); } + bool has_initial_value() const { return field()->initval_index() != 0; } + int initial_value_index() const { return field()->initval_index(); } constantTag initial_value_tag() const; // The tag will return true on one of is_int(), is_long(), is_single(), is_double() - jint int_initial_value() const; - jlong long_initial_value() const; - jfloat float_initial_value() const; - jdouble double_initial_value() const; - oop string_initial_value(TRAPS) const; + jint int_initial_value() const; + jlong long_initial_value() const; + jfloat float_initial_value() const; + jdouble double_initial_value() const; + oop string_initial_value(TRAPS) const; // Field signature type - BasicType field_type() const { return FieldType::basic_type(signature()); } + BasicType field_type() const { return FieldType::basic_type(signature()); } // Access flags - bool is_public() const { return access_flags().is_public(); } - bool is_private() const { return access_flags().is_private(); } - bool is_protected() const { return access_flags().is_protected(); } - bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); } + bool is_public() const { return access_flags().is_public(); } + bool is_private() const { return access_flags().is_private(); } + bool is_protected() const { return access_flags().is_protected(); } + bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); } - bool is_static() const { return access_flags().is_static(); } - bool is_final() const { return access_flags().is_final(); } - bool is_volatile() const { return access_flags().is_volatile(); } - bool is_transient() const { return access_flags().is_transient(); } + bool is_static() const { return access_flags().is_static(); } + bool is_final() const { return access_flags().is_final(); } + bool is_volatile() const { return access_flags().is_volatile(); } + bool is_transient() const { return access_flags().is_transient(); } - bool is_synthetic() const { return access_flags().is_synthetic(); } + bool is_synthetic() const { return access_flags().is_synthetic(); } - bool is_field_access_watched() const { return access_flags().is_field_access_watched(); } + bool is_field_access_watched() const { return access_flags().is_field_access_watched(); } bool is_field_modification_watched() const - { return access_flags().is_field_modification_watched(); } - bool has_generic_signature() const { return access_flags().field_has_generic_signature(); } + { return access_flags().is_field_modification_watched(); } + bool has_generic_signature() const { return access_flags().field_has_generic_signature(); } void set_is_field_access_watched(const bool value) { _access_flags.set_is_field_access_watched(value); diff --git a/hotspot/src/share/vm/runtime/globals.hpp b/hotspot/src/share/vm/runtime/globals.hpp index ad48aa1ae24..62ad97f8958 100644 --- a/hotspot/src/share/vm/runtime/globals.hpp +++ b/hotspot/src/share/vm/runtime/globals.hpp @@ -533,6 +533,9 @@ class CommandLineFlags { product(intx, UseSSE, 99, \ "Highest supported SSE instructions set on x86/x64") \ \ + product(bool, UseAES, false, \ + "Control whether AES instructions can be used on x86/x64") \ + \ product(uintx, LargePageSizeInBytes, 0, \ "Large page size (0 to let VM choose the page size") \ \ @@ -635,6 +638,9 @@ class CommandLineFlags { product(bool, UseSSE42Intrinsics, false, \ "SSE4.2 versions of intrinsics") \ \ + product(bool, UseAESIntrinsics, false, \ + "use intrinsics for AES versions of crypto") \ + \ develop(bool, TraceCallFixup, false, \ "traces all call fixups") \ \ @@ -3590,6 +3596,15 @@ class CommandLineFlags { product(uintx, StringTableSize, 1009, \ "Number of buckets in the interned String table") \ \ + develop(bool, TraceDefaultMethods, false, \ + "Trace the default method processing steps") \ + \ + develop(bool, ParseAllGenericSignatures, false, \ + "Parse all generic signatures while classloading") \ + \ + develop(bool, VerifyGenericSignatures, false, \ + "Abort VM on erroneous or inconsistent generic signatures") \ + \ product(bool, UseVMInterruptibleIO, false, \ "(Unstable, Solaris-specific) Thread interrupt before or with " \ "EINTR for I/O operations results in OS_INTRPT. The default value"\ diff --git a/hotspot/src/share/vm/runtime/java.cpp b/hotspot/src/share/vm/runtime/java.cpp index d40794529d6..c4d0b1b6682 100644 --- a/hotspot/src/share/vm/runtime/java.cpp +++ b/hotspot/src/share/vm/runtime/java.cpp @@ -688,6 +688,7 @@ void vm_shutdown_during_initialization(const char* error, const char* message) { JDK_Version JDK_Version::_current; const char* JDK_Version::_runtime_name; +const char* JDK_Version::_runtime_version; void JDK_Version::initialize() { jdk_version_info info; diff --git a/hotspot/src/share/vm/runtime/java.hpp b/hotspot/src/share/vm/runtime/java.hpp index 7d88062ccc8..e5bae38c171 100644 --- a/hotspot/src/share/vm/runtime/java.hpp +++ b/hotspot/src/share/vm/runtime/java.hpp @@ -75,6 +75,7 @@ class JDK_Version VALUE_OBJ_CLASS_SPEC { static JDK_Version _current; static const char* _runtime_name; + static const char* _runtime_version; // In this class, we promote the minor version of release to be the // major version for releases >= 5 in anticipation of the JDK doing the @@ -189,6 +190,13 @@ class JDK_Version VALUE_OBJ_CLASS_SPEC { _runtime_name = name; } + static const char* runtime_version() { + return _runtime_version; + } + static void set_runtime_version(const char* version) { + _runtime_version = version; + } + // Convenience methods for queries on the current major/minor version static bool is_jdk12x_version() { return current().compare_major(2) == 0; diff --git a/hotspot/src/share/vm/runtime/javaCalls.cpp b/hotspot/src/share/vm/runtime/javaCalls.cpp index 0eb14c46212..fe965acb9a2 100644 --- a/hotspot/src/share/vm/runtime/javaCalls.cpp +++ b/hotspot/src/share/vm/runtime/javaCalls.cpp @@ -189,7 +189,7 @@ void JavaCalls::call_default_constructor(JavaThread* thread, methodHandle method assert(method->name() == vmSymbols::object_initializer_name(), "Should only be called for default constructor"); assert(method->signature() == vmSymbols::void_method_signature(), "Should only be called for default constructor"); - InstanceKlass* ik = InstanceKlass::cast(method->method_holder()); + InstanceKlass* ik = method->method_holder(); if (ik->is_initialized() && ik->has_vanilla_constructor()) { // safe to skip constructor call } else { @@ -344,11 +344,11 @@ void JavaCalls::call_helper(JavaValue* result, methodHandle* m, JavaCallArgument #ifdef ASSERT - { Klass* holder = method->method_holder(); + { InstanceKlass* holder = method->method_holder(); // A klass might not be initialized since JavaCall's might be used during the executing of // the . For example, a Thread.start might start executing on an object that is // not fully initialized! (bad Java programming style) - assert(InstanceKlass::cast(holder)->is_linked(), "rewritting must have taken place"); + assert(holder->is_linked(), "rewritting must have taken place"); } #endif diff --git a/hotspot/src/share/vm/runtime/mutexLocker.cpp b/hotspot/src/share/vm/runtime/mutexLocker.cpp index b1d92def249..0be262268bb 100644 --- a/hotspot/src/share/vm/runtime/mutexLocker.cpp +++ b/hotspot/src/share/vm/runtime/mutexLocker.cpp @@ -140,6 +140,7 @@ Monitor* JfrQuery_lock = NULL; Monitor* JfrMsg_lock = NULL; Mutex* JfrBuffer_lock = NULL; Mutex* JfrStream_lock = NULL; +Monitor* PeriodicTask_lock = NULL; #define MAX_NUM_MUTEX 128 static Monitor * _mutex_array[MAX_NUM_MUTEX]; @@ -285,6 +286,7 @@ void mutex_init() { def(JfrMsg_lock , Monitor, nonleaf+2, true); def(JfrBuffer_lock , Mutex, nonleaf+3, true); def(JfrStream_lock , Mutex, nonleaf+4, true); + def(PeriodicTask_lock , Monitor, nonleaf+5, true); } GCMutexLocker::GCMutexLocker(Monitor * mutex) { diff --git a/hotspot/src/share/vm/runtime/mutexLocker.hpp b/hotspot/src/share/vm/runtime/mutexLocker.hpp index 846b2d42738..7fae11b6467 100644 --- a/hotspot/src/share/vm/runtime/mutexLocker.hpp +++ b/hotspot/src/share/vm/runtime/mutexLocker.hpp @@ -142,6 +142,7 @@ extern Monitor* JfrQuery_lock; // protects JFR use extern Monitor* JfrMsg_lock; // protects JFR messaging extern Mutex* JfrBuffer_lock; // protects JFR buffer operations extern Mutex* JfrStream_lock; // protects JFR stream access +extern Monitor* PeriodicTask_lock; // protects the periodic task structure // A MutexLocker provides mutual exclusion with respect to a given mutex // for the scope which contains the locker. The lock is an OS lock, not diff --git a/hotspot/src/share/vm/runtime/reflection.cpp b/hotspot/src/share/vm/runtime/reflection.cpp index a999eadb254..d4756bcf924 100644 --- a/hotspot/src/share/vm/runtime/reflection.cpp +++ b/hotspot/src/share/vm/runtime/reflection.cpp @@ -56,14 +56,14 @@ static void trace_class_resolution(Klass* to_class) { vframeStream vfst(jthread); // skip over any frames belonging to java.lang.Class while (!vfst.at_end() && - InstanceKlass::cast(vfst.method()->method_holder())->name() == vmSymbols::java_lang_Class()) { + vfst.method()->method_holder()->name() == vmSymbols::java_lang_Class()) { vfst.next(); } if (!vfst.at_end()) { // this frame is a likely suspect caller = vfst.method()->method_holder(); line_number = vfst.method()->line_number_from_bci(vfst.bci()); - Symbol* s = InstanceKlass::cast(vfst.method()->method_holder())->source_file_name(); + Symbol* s = vfst.method()->method_holder()->source_file_name(); if (s != NULL) { source_file = s->as_C_string(); } @@ -472,6 +472,12 @@ bool Reflection::verify_class_access(Klass* current_class, Klass* new_class, boo return true; } + // Also allow all accesses from + // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. + if (current_class->is_subclass_of(SystemDictionary::lambda_MagicLambdaImpl_klass())) { + return true; + } + return can_relax_access_check_for(current_class, new_class, classloader_only); } @@ -564,6 +570,12 @@ bool Reflection::verify_field_access(Klass* current_class, return true; } + // Also allow all accesses from + // java/lang/invoke/MagicLambdaImpl subclasses to succeed trivially. + if (current_class->is_subclass_of(SystemDictionary::lambda_MagicLambdaImpl_klass())) { + return true; + } + return can_relax_access_check_for( current_class, field_class, classloader_only); } @@ -630,8 +642,8 @@ oop get_mirror_from_signature(methodHandle method, SignatureStream* ss, TRAPS) { case T_OBJECT: case T_ARRAY: Symbol* name = ss->as_symbol(CHECK_NULL); - oop loader = InstanceKlass::cast(method->method_holder())->class_loader(); - oop protection_domain = InstanceKlass::cast(method->method_holder())->protection_domain(); + oop loader = method->method_holder()->class_loader(); + oop protection_domain = method->method_holder()->protection_domain(); Klass* k = SystemDictionary::resolve_or_fail( name, Handle(THREAD, loader), @@ -702,7 +714,7 @@ oop Reflection::new_method(methodHandle method, bool intern_name, bool for_const assert(!method()->is_initializer() || (for_constant_pool_access && method()->is_static()) || (method()->name() == vmSymbols::class_initializer_name() - && Klass::cast(method()->method_holder())->is_interface() && JDK_Version::is_jdk12x_version()), "should call new_constructor instead"); + && method()->method_holder()->is_interface() && JDK_Version::is_jdk12x_version()), "should call new_constructor instead"); instanceKlassHandle holder (THREAD, method->method_holder()); int slot = method->method_idnum(); @@ -820,7 +832,7 @@ oop Reflection::new_field(fieldDescriptor* fd, bool intern_name, TRAPS) { Handle type = new_type(signature, holder, CHECK_NULL); Handle rh = java_lang_reflect_Field::create(CHECK_NULL); - java_lang_reflect_Field::set_clazz(rh(), Klass::cast(fd->field_holder())->java_mirror()); + java_lang_reflect_Field::set_clazz(rh(), fd->field_holder()->java_mirror()); java_lang_reflect_Field::set_slot(rh(), fd->index()); java_lang_reflect_Field::set_name(rh(), name()); java_lang_reflect_Field::set_type(rh(), type()); @@ -888,7 +900,7 @@ oop Reflection::invoke(instanceKlassHandle klass, methodHandle reflected_method, method = reflected_method; } else { // resolve based on the receiver - if (InstanceKlass::cast(reflected_method->method_holder())->is_interface()) { + if (reflected_method->method_holder()->is_interface()) { // resolve interface call if (ReflectionWrapResolutionErrors) { // new default: 6531596 diff --git a/hotspot/src/share/vm/runtime/stubRoutines.cpp b/hotspot/src/share/vm/runtime/stubRoutines.cpp index 5ca4ba59916..98d428abdab 100644 --- a/hotspot/src/share/vm/runtime/stubRoutines.cpp +++ b/hotspot/src/share/vm/runtime/stubRoutines.cpp @@ -120,6 +120,10 @@ address StubRoutines::_arrayof_jbyte_fill; address StubRoutines::_arrayof_jshort_fill; address StubRoutines::_arrayof_jint_fill; +address StubRoutines::_aescrypt_encryptBlock = NULL; +address StubRoutines::_aescrypt_decryptBlock = NULL; +address StubRoutines::_cipherBlockChaining_encryptAESCrypt = NULL; +address StubRoutines::_cipherBlockChaining_decryptAESCrypt = NULL; double (* StubRoutines::_intrinsic_log )(double) = NULL; double (* StubRoutines::_intrinsic_log10 )(double) = NULL; diff --git a/hotspot/src/share/vm/runtime/stubRoutines.hpp b/hotspot/src/share/vm/runtime/stubRoutines.hpp index 0e583aea0b1..91f273e6515 100644 --- a/hotspot/src/share/vm/runtime/stubRoutines.hpp +++ b/hotspot/src/share/vm/runtime/stubRoutines.hpp @@ -199,6 +199,11 @@ class StubRoutines: AllStatic { // zero heap space aligned to jlong (8 bytes) static address _zero_aligned_words; + static address _aescrypt_encryptBlock; + static address _aescrypt_decryptBlock; + static address _cipherBlockChaining_encryptAESCrypt; + static address _cipherBlockChaining_decryptAESCrypt; + // These are versions of the java.lang.Math methods which perform // the same operations as the intrinsic version. They are used for // constant folding in the compiler to ensure equivalence. If the @@ -330,6 +335,11 @@ class StubRoutines: AllStatic { static address arrayof_jshort_fill() { return _arrayof_jshort_fill; } static address arrayof_jint_fill() { return _arrayof_jint_fill; } + static address aescrypt_encryptBlock() { return _aescrypt_encryptBlock; } + static address aescrypt_decryptBlock() { return _aescrypt_decryptBlock; } + static address cipherBlockChaining_encryptAESCrypt() { return _cipherBlockChaining_encryptAESCrypt; } + static address cipherBlockChaining_decryptAESCrypt() { return _cipherBlockChaining_decryptAESCrypt; } + static address select_fill_function(BasicType t, bool aligned, const char* &name); static address zero_aligned_words() { return _zero_aligned_words; } diff --git a/hotspot/src/share/vm/runtime/task.cpp b/hotspot/src/share/vm/runtime/task.cpp index bd45d65fec0..689f3857c97 100644 --- a/hotspot/src/share/vm/runtime/task.cpp +++ b/hotspot/src/share/vm/runtime/task.cpp @@ -61,7 +61,7 @@ void PeriodicTask::print_intervals() { } #endif -void PeriodicTask::real_time_tick(size_t delay_time) { +void PeriodicTask::real_time_tick(int delay_time) { #ifndef PRODUCT if (ProfilerCheckIntervals) { _ticks++; @@ -73,19 +73,39 @@ void PeriodicTask::real_time_tick(size_t delay_time) { _intervalHistogram[ms]++; } #endif - int orig_num_tasks = _num_tasks; - for(int index = 0; index < _num_tasks; index++) { - _tasks[index]->execute_if_pending(delay_time); - if (_num_tasks < orig_num_tasks) { // task dis-enrolled itself - index--; // re-do current slot as it has changed - orig_num_tasks = _num_tasks; + + { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + int orig_num_tasks = _num_tasks; + + for(int index = 0; index < _num_tasks; index++) { + _tasks[index]->execute_if_pending(delay_time); + if (_num_tasks < orig_num_tasks) { // task dis-enrolled itself + index--; // re-do current slot as it has changed + orig_num_tasks = _num_tasks; + } } } } +int PeriodicTask::time_to_wait() { + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? + NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + + if (_num_tasks == 0) { + return 0; // sleep until shutdown or a task is enrolled + } + + int delay = _tasks[0]->time_to_next_interval(); + for (int index = 1; index < _num_tasks; index++) { + delay = MIN2(delay, _tasks[index]->time_to_next_interval()); + } + return delay; +} + PeriodicTask::PeriodicTask(size_t interval_time) : - _counter(0), _interval(interval_time) { + _counter(0), _interval((int) interval_time) { // Sanity check the interval time assert(_interval >= PeriodicTask::min_interval && _interval <= PeriodicTask::max_interval && @@ -94,33 +114,40 @@ PeriodicTask::PeriodicTask(size_t interval_time) : } PeriodicTask::~PeriodicTask() { - if (is_enrolled()) - disenroll(); -} - -bool PeriodicTask::is_enrolled() const { - for(int index = 0; index < _num_tasks; index++) - if (_tasks[index] == this) return true; - return false; + disenroll(); } void PeriodicTask::enroll() { - assert(WatcherThread::watcher_thread() == NULL, "dynamic enrollment of tasks not yet supported"); + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? + NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); - if (_num_tasks == PeriodicTask::max_tasks) + if (_num_tasks == PeriodicTask::max_tasks) { fatal("Overflow in PeriodicTask table"); + } _tasks[_num_tasks++] = this; + + WatcherThread* thread = WatcherThread::watcher_thread(); + if (thread) { + thread->unpark(); + } else { + WatcherThread::start(); + } } void PeriodicTask::disenroll() { - assert(WatcherThread::watcher_thread() == NULL || - Thread::current() == WatcherThread::watcher_thread(), - "dynamic disenrollment currently only handled from WatcherThread from within task() method"); + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? + NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); int index; - for(index = 0; index < _num_tasks && _tasks[index] != this; index++); - if (index == _num_tasks) return; + for(index = 0; index < _num_tasks && _tasks[index] != this; index++) + ; + + if (index == _num_tasks) { + return; + } + _num_tasks--; + for (; index < _num_tasks; index++) { _tasks[index] = _tasks[index+1]; } diff --git a/hotspot/src/share/vm/runtime/task.hpp b/hotspot/src/share/vm/runtime/task.hpp index 4bdcad54c3e..5fc8c16e2a4 100644 --- a/hotspot/src/share/vm/runtime/task.hpp +++ b/hotspot/src/share/vm/runtime/task.hpp @@ -49,12 +49,12 @@ class PeriodicTask: public CHeapObj { static int num_tasks() { return _num_tasks; } private: - size_t _counter; - const size_t _interval; + int _counter; + const int _interval; static int _num_tasks; static PeriodicTask* _tasks[PeriodicTask::max_tasks]; - static void real_time_tick(size_t delay_time); + static void real_time_tick(int delay_time); #ifndef PRODUCT static elapsedTimer _timer; // measures time between ticks @@ -69,51 +69,36 @@ class PeriodicTask: public CHeapObj { PeriodicTask(size_t interval_time); // interval is in milliseconds of elapsed time ~PeriodicTask(); - // Tells whether is enrolled - bool is_enrolled() const; - // Make the task active - // NOTE: this may only be called before the WatcherThread has been started + // For dynamic enrollment at the time T, the task will execute somewhere + // between T and T + interval_time. void enroll(); // Make the task deactive - // NOTE: this may only be called either while the WatcherThread is - // inactive or by a task from within its task() method. One-shot or - // several-shot tasks may be implemented this way. void disenroll(); - void execute_if_pending(size_t delay_time) { - _counter += delay_time; - if (_counter >= _interval) { + void execute_if_pending(int delay_time) { + // make sure we don't overflow + jlong tmp = (jlong) _counter + (jlong) delay_time; + + if (tmp >= (jlong) _interval) { _counter = 0; task(); + } else { + _counter += delay_time; } } // Returns how long (time in milliseconds) before the next time we should // execute this task. - size_t time_to_next_interval() const { + int time_to_next_interval() const { assert(_interval > _counter, "task counter greater than interval?"); return _interval - _counter; } // Calculate when the next periodic task will fire. // Called by the WatcherThread's run method. - // This assumes that periodic tasks aren't entering the system - // dynamically, except for during startup. - static size_t time_to_wait() { - if (_num_tasks == 0) { - // Don't wait any more; shut down the thread since we don't - // currently support dynamic enrollment. - return 0; - } - - size_t delay = _tasks[0]->time_to_next_interval(); - for (int index = 1; index < _num_tasks; index++) { - delay = MIN2(delay, _tasks[index]->time_to_next_interval()); - } - return delay; - } + static int time_to_wait(); // The task to perform at each period virtual void task() = 0; diff --git a/hotspot/src/share/vm/runtime/thread.cpp b/hotspot/src/share/vm/runtime/thread.cpp index 5c96224a422..a3656dcda4f 100644 --- a/hotspot/src/share/vm/runtime/thread.cpp +++ b/hotspot/src/share/vm/runtime/thread.cpp @@ -1042,6 +1042,7 @@ static void call_initializeSystemClass(TRAPS) { } char java_runtime_name[128] = ""; +char java_runtime_version[128] = ""; // extract the JRE name from sun.misc.Version.java_runtime_name static const char* get_java_runtime_name(TRAPS) { @@ -1064,6 +1065,27 @@ static const char* get_java_runtime_name(TRAPS) { } } +// extract the JRE version from sun.misc.Version.java_runtime_version +static const char* get_java_runtime_version(TRAPS) { + Klass* k = SystemDictionary::find(vmSymbols::sun_misc_Version(), + Handle(), Handle(), CHECK_AND_CLEAR_NULL); + fieldDescriptor fd; + bool found = k != NULL && + InstanceKlass::cast(k)->find_local_field(vmSymbols::java_runtime_version_name(), + vmSymbols::string_signature(), &fd); + if (found) { + oop name_oop = k->java_mirror()->obj_field(fd.offset()); + if (name_oop == NULL) + return NULL; + const char* name = java_lang_String::as_utf8_string(name_oop, + java_runtime_version, + sizeof(java_runtime_version)); + return name; + } else { + return NULL; + } +} + // General purpose hook into Java code, run once when the VM is initialized. // The Java library method itself may be changed independently from the VM. static void call_postVMInitHook(TRAPS) { @@ -1195,6 +1217,7 @@ void NamedThread::set_name(const char* format, ...) { // timer interrupts exists on the platform. WatcherThread* WatcherThread::_watcher_thread = NULL; +bool WatcherThread::_startable = false; volatile bool WatcherThread::_should_terminate = false; WatcherThread::WatcherThread() : Thread() { @@ -1215,6 +1238,55 @@ WatcherThread::WatcherThread() : Thread() { } } +int WatcherThread::sleep() const { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + + // remaining will be zero if there are no tasks, + // causing the WatcherThread to sleep until a task is + // enrolled + int remaining = PeriodicTask::time_to_wait(); + int time_slept = 0; + + // we expect this to timeout - we only ever get unparked when + // we should terminate or when a new task has been enrolled + OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */); + + jlong time_before_loop = os::javaTimeNanos(); + + for (;;) { + bool timedout = PeriodicTask_lock->wait(Mutex::_no_safepoint_check_flag, remaining); + jlong now = os::javaTimeNanos(); + + if (remaining == 0) { + // if we didn't have any tasks we could have waited for a long time + // consider the time_slept zero and reset time_before_loop + time_slept = 0; + time_before_loop = now; + } else { + // need to recalulate since we might have new tasks in _tasks + time_slept = (int) ((now - time_before_loop) / 1000000); + } + + // Change to task list or spurious wakeup of some kind + if (timedout || _should_terminate) { + break; + } + + remaining = PeriodicTask::time_to_wait(); + if (remaining == 0) { + // Last task was just disenrolled so loop around and wait until + // another task gets enrolled + continue; + } + + remaining -= time_slept; + if (remaining <= 0) + break; + } + + return time_slept; +} + void WatcherThread::run() { assert(this == watcher_thread(), "just checking"); @@ -1227,26 +1299,7 @@ void WatcherThread::run() { // Calculate how long it'll be until the next PeriodicTask work // should be done, and sleep that amount of time. - size_t time_to_wait = PeriodicTask::time_to_wait(); - - // we expect this to timeout - we only ever get unparked when - // we should terminate - { - OSThreadWaitState osts(this->osthread(), false /* not Object.wait() */); - - jlong prev_time = os::javaTimeNanos(); - for (;;) { - int res= _SleepEvent->park(time_to_wait); - if (res == OS_TIMEOUT || _should_terminate) - break; - // spurious wakeup of some kind - jlong now = os::javaTimeNanos(); - time_to_wait -= (now - prev_time) / 1000000; - if (time_to_wait <= 0) - break; - prev_time = now; - } - } + int time_waited = sleep(); if (is_error_reported()) { // A fatal error has happened, the error handler(VMError::report_and_die) @@ -1276,13 +1329,7 @@ void WatcherThread::run() { } } - PeriodicTask::real_time_tick(time_to_wait); - - // If we have no more tasks left due to dynamic disenrollment, - // shut down the thread since we don't currently support dynamic enrollment - if (PeriodicTask::num_tasks() == 0) { - _should_terminate = true; - } + PeriodicTask::real_time_tick(time_waited); } // Signal that it is terminated @@ -1297,22 +1344,33 @@ void WatcherThread::run() { } void WatcherThread::start() { - if (watcher_thread() == NULL) { + assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required"); + + if (watcher_thread() == NULL && _startable) { _should_terminate = false; // Create the single instance of WatcherThread new WatcherThread(); } } +void WatcherThread::make_startable() { + assert(PeriodicTask_lock->owned_by_self(), "PeriodicTask_lock required"); + _startable = true; +} + void WatcherThread::stop() { + { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + _should_terminate = true; + OrderAccess::fence(); // ensure WatcherThread sees update in main loop + + WatcherThread* watcher = watcher_thread(); + if (watcher != NULL) + watcher->unpark(); + } + // it is ok to take late safepoints here, if needed MutexLocker mu(Terminator_lock); - _should_terminate = true; - OrderAccess::fence(); // ensure WatcherThread sees update in main loop - - Thread* watcher = watcher_thread(); - if (watcher != NULL) - watcher->_SleepEvent->unpark(); while(watcher_thread() != NULL) { // This wait should make safepoint checks, wait without a timeout, @@ -1330,6 +1388,11 @@ void WatcherThread::stop() { } } +void WatcherThread::unpark() { + MutexLockerEx ml(PeriodicTask_lock->owned_by_self() ? NULL : PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + PeriodicTask_lock->notify(); +} + void WatcherThread::print_on(outputStream* st) const { st->print("\"%s\" ", name()); Thread::print_on(st); @@ -3473,6 +3536,7 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { // get the Java runtime name after java.lang.System is initialized JDK_Version::set_runtime_name(get_java_runtime_name(THREAD)); + JDK_Version::set_runtime_version(get_java_runtime_version(THREAD)); } else { warning("java.lang.System not initialized"); } @@ -3635,12 +3699,18 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { } } - // Start up the WatcherThread if there are any periodic tasks - // NOTE: All PeriodicTasks should be registered by now. If they - // aren't, late joiners might appear to start slowly (we might - // take a while to process their first tick). - if (PeriodicTask::num_tasks() > 0) { - WatcherThread::start(); + { + MutexLockerEx ml(PeriodicTask_lock, Mutex::_no_safepoint_check_flag); + // Make sure the watcher thread can be started by WatcherThread::start() + // or by dynamic enrollment. + WatcherThread::make_startable(); + // Start up the WatcherThread if there are any periodic tasks + // NOTE: All PeriodicTasks should be registered by now. If they + // aren't, late joiners might appear to start slowly (we might + // take a while to process their first tick). + if (PeriodicTask::num_tasks() > 0) { + WatcherThread::start(); + } } // Give os specific code one last chance to start diff --git a/hotspot/src/share/vm/runtime/thread.hpp b/hotspot/src/share/vm/runtime/thread.hpp index ed747fb6cdd..3ccbf487e99 100644 --- a/hotspot/src/share/vm/runtime/thread.hpp +++ b/hotspot/src/share/vm/runtime/thread.hpp @@ -722,6 +722,7 @@ class WatcherThread: public Thread { private: static WatcherThread* _watcher_thread; + static bool _startable; volatile static bool _should_terminate; // updated without holding lock public: enum SomeConstants { @@ -738,6 +739,7 @@ class WatcherThread: public Thread { char* name() const { return (char*)"VM Periodic Task Thread"; } void print_on(outputStream* st) const; void print() const { print_on(tty); } + void unpark(); // Returns the single instance of WatcherThread static WatcherThread* watcher_thread() { return _watcher_thread; } @@ -745,6 +747,12 @@ class WatcherThread: public Thread { // Create and start the single instance of WatcherThread, or stop it on shutdown static void start(); static void stop(); + // Only allow start once the VM is sufficiently initialized + // Otherwise the first task to enroll will trigger the start + static void make_startable(); + + private: + int sleep() const; }; diff --git a/hotspot/src/share/vm/runtime/vframe.cpp b/hotspot/src/share/vm/runtime/vframe.cpp index b1c2db81859..382ac4b0961 100644 --- a/hotspot/src/share/vm/runtime/vframe.cpp +++ b/hotspot/src/share/vm/runtime/vframe.cpp @@ -161,7 +161,7 @@ void javaVFrame::print_lock_info_on(outputStream* st, int frame_count) { // If this is the first frame, and java.lang.Object.wait(...) then print out the receiver. if (frame_count == 0) { if (method()->name() == vmSymbols::wait_name() && - InstanceKlass::cast(method()->method_holder())->name() == vmSymbols::java_lang_Object()) { + method()->method_holder()->name() == vmSymbols::java_lang_Object()) { StackValueCollection* locs = locals(); if (!locs->is_empty()) { StackValue* sv = locs->at(0); @@ -407,7 +407,7 @@ void vframeStreamCommon::security_get_caller_frame(int depth) { if (Universe::reflect_invoke_cache()->is_same_method(method())) { // This is Method.invoke() -- skip it } else if (use_new_reflection && - Klass::cast(method()->method_holder()) + method()->method_holder() ->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass())) { // This is an auxilary frame -- skip it } else if (method()->is_method_handle_intrinsic() || @@ -471,8 +471,8 @@ void vframeStreamCommon::skip_prefixed_method_and_wrappers() { void vframeStreamCommon::skip_reflection_related_frames() { while (!at_end() && (JDK_Version::is_gte_jdk14x_version() && UseNewReflection && - (Klass::cast(method()->method_holder())->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) || - Klass::cast(method()->method_holder())->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass())))) { + (method()->method_holder()->is_subclass_of(SystemDictionary::reflect_MethodAccessorImpl_klass()) || + method()->method_holder()->is_subclass_of(SystemDictionary::reflect_ConstructorAccessorImpl_klass())))) { next(); } } @@ -547,13 +547,13 @@ void javaVFrame::print() { void javaVFrame::print_value() const { Method* m = method(); - Klass* k = m->method_holder(); + InstanceKlass* k = m->method_holder(); tty->print_cr("frame( sp=" INTPTR_FORMAT ", unextended_sp=" INTPTR_FORMAT ", fp=" INTPTR_FORMAT ", pc=" INTPTR_FORMAT ")", _fr.sp(), _fr.unextended_sp(), _fr.fp(), _fr.pc()); tty->print("%s.%s", Klass::cast(k)->internal_name(), m->name()->as_C_string()); if (!m->is_native()) { - Symbol* source_name = InstanceKlass::cast(k)->source_file_name(); + Symbol* source_name = k->source_file_name(); int line_number = m->line_number_from_bci(bci()); if (source_name != NULL && (line_number != -1)) { tty->print("(%s:%d)", source_name->as_C_string(), line_number); diff --git a/hotspot/src/share/vm/runtime/vmStructs.cpp b/hotspot/src/share/vm/runtime/vmStructs.cpp index 51e3ab5f753..eb6d3cd78a8 100644 --- a/hotspot/src/share/vm/runtime/vmStructs.cpp +++ b/hotspot/src/share/vm/runtime/vmStructs.cpp @@ -59,6 +59,7 @@ #include "memory/generation.hpp" #include "memory/generationSpec.hpp" #include "memory/heap.hpp" +#include "memory/metablock.hpp" #include "memory/space.hpp" #include "memory/tenuredGeneration.hpp" #include "memory/universe.hpp" @@ -249,6 +250,7 @@ typedef TwoOopHashtable KlassTwoOopHashtable; typedef Hashtable KlassHashtable; typedef HashtableEntry KlassHashtableEntry; typedef TwoOopHashtable SymbolTwoOopHashtable; +typedef BinaryTreeDictionary MetablockTreeDictionary; //-------------------------------------------------------------------------------- // VM_STRUCTS @@ -287,7 +289,7 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; nonstatic_field(CompiledICHolder, _holder_klass, Klass*) \ nonstatic_field(ConstantPool, _tags, Array*) \ nonstatic_field(ConstantPool, _cache, ConstantPoolCache*) \ - nonstatic_field(ConstantPool, _pool_holder, Klass*) \ + nonstatic_field(ConstantPool, _pool_holder, InstanceKlass*) \ nonstatic_field(ConstantPool, _operands, Array*) \ nonstatic_field(ConstantPool, _length, int) \ nonstatic_field(ConstantPool, _resolved_references, jobject) \ @@ -1237,7 +1239,15 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; nonstatic_field(AccessFlags, _flags, jint) \ nonstatic_field(elapsedTimer, _counter, jlong) \ nonstatic_field(elapsedTimer, _active, bool) \ - nonstatic_field(InvocationCounter, _counter, unsigned int) + nonstatic_field(InvocationCounter, _counter, unsigned int) \ + volatile_nonstatic_field(FreeChunk, _size, size_t) \ + nonstatic_field(FreeChunk, _next, FreeChunk*) \ + nonstatic_field(FreeChunk, _prev, FreeChunk*) \ + nonstatic_field(FreeList, _size, size_t) \ + nonstatic_field(FreeList, _size, size_t) \ + nonstatic_field(FreeList, _count, ssize_t) \ + nonstatic_field(FreeList, _count, ssize_t) \ + nonstatic_field(MetablockTreeDictionary, _total_size, size_t) /* NOTE that we do not use the last_entry() macro here; it is used */ /* in vmStructs__.hpp's VM_STRUCTS_OS_CPU macro (and must */ @@ -2080,7 +2090,24 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; declare_toplevel_type(Universe) \ declare_toplevel_type(vframeArray) \ declare_toplevel_type(vframeArrayElement) \ - declare_toplevel_type(Annotations*) + declare_toplevel_type(Annotations*) \ + \ + /***************/ \ + /* Miscellaneous types */ \ + /***************/ \ + \ + /* freelist */ \ + declare_toplevel_type(FreeChunk*) \ + declare_toplevel_type(Metablock*) \ + declare_toplevel_type(FreeBlockDictionary*) \ + declare_toplevel_type(FreeList*) \ + declare_toplevel_type(FreeList) \ + declare_toplevel_type(FreeBlockDictionary*) \ + declare_toplevel_type(FreeList*) \ + declare_toplevel_type(FreeList) \ + declare_toplevel_type(MetablockTreeDictionary*) \ + declare_type(MetablockTreeDictionary, FreeBlockDictionary) \ + declare_type(MetablockTreeDictionary, FreeBlockDictionary) /* NOTE that we do not use the last_entry() macro here; it is used */ @@ -2447,7 +2474,7 @@ typedef TwoOopHashtable SymbolTwoOopHashtable; /* frame */ \ /**********************/ \ \ - X86_ONLY(declare_constant(frame::entry_frame_call_wrapper_offset)) \ + NOT_ZERO(X86_ONLY(declare_constant(frame::entry_frame_call_wrapper_offset))) \ declare_constant(frame::pc_return_offset) \ \ /*************/ \ diff --git a/hotspot/src/share/vm/services/heapDumper.cpp b/hotspot/src/share/vm/services/heapDumper.cpp index fe3f50df64a..46d1fad6d7c 100644 --- a/hotspot/src/share/vm/services/heapDumper.cpp +++ b/hotspot/src/share/vm/services/heapDumper.cpp @@ -1117,8 +1117,8 @@ void DumperSupport::dump_stack_frame(DumpWriter* writer, writer->write_symbolID(m->name()); // method's name writer->write_symbolID(m->signature()); // method's signature - assert(Klass::cast(m->method_holder())->oop_is_instance(), "not InstanceKlass"); - writer->write_symbolID(InstanceKlass::cast(m->method_holder())->source_file_name()); // source file name + assert(m->method_holder()->oop_is_instance(), "not InstanceKlass"); + writer->write_symbolID(m->method_holder()->source_file_name()); // source file name writer->write_u4(class_serial_num); // class serial number writer->write_u4((u4) line_number); // line number } diff --git a/hotspot/src/share/vm/services/memPtr.hpp b/hotspot/src/share/vm/services/memPtr.hpp index 0618a3c806a..3f888d968a6 100644 --- a/hotspot/src/share/vm/services/memPtr.hpp +++ b/hotspot/src/share/vm/services/memPtr.hpp @@ -311,6 +311,17 @@ public: inline bool contains_address(address add) const { return (addr() <= add && addr() + size() > add); } + + // if this memory region overlaps another region + inline bool overlaps_region(const MemPointerRecord* other) const { + assert(other != NULL, "Just check"); + assert(size() > 0 && other->size() > 0, "empty range"); + return contains_address(other->addr()) || + contains_address(other->addr() + other->size() - 1) || // exclude end address + other->contains_address(addr()) || + other->contains_address(addr() + size() - 1); // exclude end address + } + }; // MemPointerRecordEx also records callsite pc, from where diff --git a/hotspot/src/share/vm/services/memSnapshot.cpp b/hotspot/src/share/vm/services/memSnapshot.cpp index 20e1ce61fa4..936df1985ac 100644 --- a/hotspot/src/share/vm/services/memSnapshot.cpp +++ b/hotspot/src/share/vm/services/memSnapshot.cpp @@ -31,6 +31,69 @@ #include "services/memSnapshot.hpp" #include "services/memTracker.hpp" +#ifdef ASSERT + +void decode_pointer_record(MemPointerRecord* rec) { + tty->print("Pointer: [" PTR_FORMAT " - " PTR_FORMAT "] size = %d bytes", rec->addr(), + rec->addr() + rec->size(), (int)rec->size()); + tty->print(" type = %s", MemBaseline::type2name(FLAGS_TO_MEMORY_TYPE(rec->flags()))); + if (rec->is_vm_pointer()) { + if (rec->is_allocation_record()) { + tty->print_cr(" (reserve)"); + } else if (rec->is_commit_record()) { + tty->print_cr(" (commit)"); + } else if (rec->is_uncommit_record()) { + tty->print_cr(" (uncommit)"); + } else if (rec->is_deallocation_record()) { + tty->print_cr(" (release)"); + } else { + tty->print_cr(" (tag)"); + } + } else { + if (rec->is_arena_size_record()) { + tty->print_cr(" (arena size)"); + } else if (rec->is_allocation_record()) { + tty->print_cr(" (malloc)"); + } else { + tty->print_cr(" (free)"); + } + } + if (MemTracker::track_callsite()) { + char buf[1024]; + address pc = ((MemPointerRecordEx*)rec)->pc(); + if (pc != NULL && os::dll_address_to_function_name(pc, buf, sizeof(buf), NULL)) { + tty->print_cr("\tfrom %s", buf); + } else { + tty->print_cr("\tcould not decode pc = " PTR_FORMAT "", pc); + } + } +} + +void decode_vm_region_record(VMMemRegion* rec) { + tty->print("VM Region [" PTR_FORMAT " - " PTR_FORMAT "]", rec->addr(), + rec->addr() + rec->size()); + tty->print(" type = %s", MemBaseline::type2name(FLAGS_TO_MEMORY_TYPE(rec->flags()))); + if (rec->is_allocation_record()) { + tty->print_cr(" (reserved)"); + } else if (rec->is_commit_record()) { + tty->print_cr(" (committed)"); + } else { + ShouldNotReachHere(); + } + if (MemTracker::track_callsite()) { + char buf[1024]; + address pc = ((VMMemRegionEx*)rec)->pc(); + if (pc != NULL && os::dll_address_to_function_name(pc, buf, sizeof(buf), NULL)) { + tty->print_cr("\tfrom %s", buf); + } else { + tty->print_cr("\tcould not decode pc = " PTR_FORMAT "", pc); + } + + } +} + +#endif + bool VMMemPointerIterator::insert_record(MemPointerRecord* rec) { VMMemRegionEx new_rec; @@ -73,52 +136,61 @@ bool VMMemPointerIterator::add_reserved_region(MemPointerRecord* rec) { return true; } assert(cur->base() > rec->addr(), "Just check: locate()"); - assert(rec->addr() + rec->size() <= cur->base(), "Can not overlap"); + assert(!cur->overlaps_region(rec), "overlapping reserved regions"); return insert_record(rec); } // we do consolidate committed regions bool VMMemPointerIterator::add_committed_region(MemPointerRecord* rec) { assert(rec->is_commit_record(), "Sanity check"); - VMMemRegion* cur; - cur = (VMMemRegion*)current(); - assert(cur->is_reserved_region() && cur->contains_region(rec), + VMMemRegion* reserved_rgn = (VMMemRegion*)current(); + assert(reserved_rgn->is_reserved_region() && reserved_rgn->contains_region(rec), "Sanity check"); // thread's native stack is always marked as "committed", ignore // the "commit" operation for creating stack guard pages - if (FLAGS_TO_MEMORY_TYPE(cur->flags()) == mtThreadStack && + if (FLAGS_TO_MEMORY_TYPE(reserved_rgn->flags()) == mtThreadStack && FLAGS_TO_MEMORY_TYPE(rec->flags()) != mtThreadStack) { return true; } - cur = (VMMemRegion*)next(); - while (cur != NULL && cur->is_committed_region()) { + // if the reserved region has any committed regions + VMMemRegion* committed_rgn = (VMMemRegion*)next(); + while (committed_rgn != NULL && committed_rgn->is_committed_region()) { // duplicated commit records - if(cur->contains_region(rec)) { + if(committed_rgn->contains_region(rec)) { return true; - } - if (cur->base() > rec->addr()) { - // committed regions can not overlap - assert(rec->addr() + rec->size() <= cur->base(), "Can not overlap"); - if (rec->addr() + rec->size() == cur->base()) { - cur->expand_region(rec->addr(), rec->size()); - return true; + } else if (committed_rgn->overlaps_region(rec)) { + // overlaps front part + if (rec->addr() < committed_rgn->addr()) { + committed_rgn->expand_region(rec->addr(), + committed_rgn->addr() - rec->addr()); } else { - return insert_record(rec); + // overlaps tail part + address committed_rgn_end = committed_rgn->addr() + + committed_rgn->size(); + assert(committed_rgn_end < rec->addr() + rec->size(), + "overlap tail part"); + committed_rgn->expand_region(committed_rgn_end, + (rec->addr() + rec->size()) - committed_rgn_end); } - } else if (cur->base() + cur->size() == rec->addr()) { - cur->expand_region(rec->addr(), rec->size()); + } else if (committed_rgn->base() + committed_rgn->size() == rec->addr()) { + // adjunct each other + committed_rgn->expand_region(rec->addr(), rec->size()); VMMemRegion* next_reg = (VMMemRegion*)next(); // see if we can consolidate next committed region if (next_reg != NULL && next_reg->is_committed_region() && - next_reg->base() == cur->base() + cur->size()) { - cur->expand_region(next_reg->base(), next_reg->size()); + next_reg->base() == committed_rgn->base() + committed_rgn->size()) { + committed_rgn->expand_region(next_reg->base(), next_reg->size()); + // delete merged region remove(); } return true; + } else if (committed_rgn->base() > rec->addr()) { + // found the location, insert this committed region + return insert_record(rec); } - cur = (VMMemRegion*)next(); + committed_rgn = (VMMemRegion*)next(); } return insert_record(rec); } diff --git a/hotspot/src/share/vm/utilities/growableArray.hpp b/hotspot/src/share/vm/utilities/growableArray.hpp index 5ecb3e4a270..932d0a20260 100644 --- a/hotspot/src/share/vm/utilities/growableArray.hpp +++ b/hotspot/src/share/vm/utilities/growableArray.hpp @@ -217,7 +217,12 @@ template class GrowableArray : public GenericGrowableArray { return missed; } - E at(int i) const { + E& at(int i) { + assert(0 <= i && i < _len, "illegal index"); + return _data[i]; + } + + E const& at(int i) const { assert(0 <= i && i < _len, "illegal index"); return _data[i]; } diff --git a/hotspot/src/share/vm/utilities/macros.hpp b/hotspot/src/share/vm/utilities/macros.hpp index e0e853c3c13..64e331d90b0 100644 --- a/hotspot/src/share/vm/utilities/macros.hpp +++ b/hotspot/src/share/vm/utilities/macros.hpp @@ -282,6 +282,22 @@ #define NOT_WIN64(code) code #endif +#if defined(ZERO) +#define ZERO_ONLY(code) code +#define NOT_ZERO(code) +#else +#define ZERO_ONLY(code) +#define NOT_ZERO(code) code +#endif + +#if defined(SHARK) +#define SHARK_ONLY(code) code +#define NOT_SHARK(code) +#else +#define SHARK_ONLY(code) +#define NOT_SHARK(code) code +#endif + #if defined(IA32) || defined(AMD64) #define X86 #define X86_ONLY(code) code diff --git a/hotspot/src/share/vm/utilities/pair.hpp b/hotspot/src/share/vm/utilities/pair.hpp new file mode 100644 index 00000000000..d0bb5d65c4b --- /dev/null +++ b/hotspot/src/share/vm/utilities/pair.hpp @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_UTILITIES_PAIR_HPP +#define SHARE_VM_UTILITIES_PAIR_HPP + +#include "memory/allocation.hpp" +#include "utilities/top.hpp" + +template +class Pair : public ALLOC_BASE { + public: + T first; + V second; + + Pair() {} + Pair(T t, V v) : first(t), second(v) {} +}; + + +#endif // SHARE_VM_UTILITIES_PAIR_HPP diff --git a/hotspot/src/share/vm/utilities/resourceHash.hpp b/hotspot/src/share/vm/utilities/resourceHash.hpp new file mode 100644 index 00000000000..87cc8ffdb34 --- /dev/null +++ b/hotspot/src/share/vm/utilities/resourceHash.hpp @@ -0,0 +1,134 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +#ifndef SHARE_VM_UTILITIES_RESOURCEHASH_HPP +#define SHARE_VM_UTILITIES_RESOURCEHASH_HPP + +#include "memory/allocation.hpp" +#include "utilities/top.hpp" + +template struct ResourceHashtableFns { + typedef unsigned (*hash_fn)(K const&); + typedef bool (*equals_fn)(K const&, K const&); +}; + +template unsigned primitive_hash(const K& k) { + unsigned hash = (unsigned)((uintptr_t)k); + return hash ^ (hash > 3); // just in case we're dealing with aligned ptrs +} + +template bool primitive_equals(const K& k0, const K& k1) { + return k0 == k1; +} + +template< + typename K, typename V, + typename ResourceHashtableFns::hash_fn HASH = primitive_hash, + typename ResourceHashtableFns::equals_fn EQUALS = primitive_equals, + unsigned SIZE = 256 + > +class ResourceHashtable : public ResourceObj { + private: + + class Node : public ResourceObj { + public: + unsigned _hash; + K _key; + V _value; + Node* _next; + + Node(unsigned hash, K const& key, V const& value) : + _hash(hash), _key(key), _value(value), _next(NULL) {} + }; + + Node* _table[SIZE]; + + // Returns a pointer to where the node where the value would reside if + // it's in the table. + Node** lookup_node(unsigned hash, K const& key) { + unsigned index = hash % SIZE; + Node** ptr = &_table[index]; + while (*ptr != NULL) { + Node* node = *ptr; + if (node->_hash == hash && EQUALS(key, node->_key)) { + break; + } + ptr = &(node->_next); + } + return ptr; + } + + Node const** lookup_node(unsigned hash, K const& key) const { + return const_cast( + const_cast(this)->lookup_node(hash, key)); + } + + public: + ResourceHashtable() { memset(_table, 0, SIZE * sizeof(Node*)); } + + bool contains(K const& key) const { + return get(key) != NULL; + } + + V* get(K const& key) const { + unsigned hv = HASH(key); + Node const** ptr = lookup_node(hv, key); + if (*ptr != NULL) { + return const_cast(&(*ptr)->_value); + } else { + return NULL; + } + } + + // Inserts or replaces a value in the table + void put(K const& key, V const& value) { + unsigned hv = HASH(key); + Node** ptr = lookup_node(hv, key); + if (*ptr != NULL) { + (*ptr)->_value = value; + } else { + *ptr = new Node(hv, key, value); + } + } + + // ITER contains bool do_entry(K const&, V const&), which will be + // called for each entry in the table. If do_entry() returns false, + // the iteration is cancelled. + template + void iterate(ITER* iter) const { + Node* const* bucket = _table; + while (bucket < &_table[SIZE]) { + Node* node = *bucket; + while (node != NULL) { + bool cont = iter->do_entry(node->_key, node->_value); + if (!cont) { return; } + node = node->_next; + } + ++bucket; + } + } +}; + + +#endif // SHARE_VM_UTILITIES_RESOURCEHASH_HPP diff --git a/hotspot/src/share/vm/utilities/taskqueue.hpp b/hotspot/src/share/vm/utilities/taskqueue.hpp index 4dde2c4bcde..dd98186bb36 100644 --- a/hotspot/src/share/vm/utilities/taskqueue.hpp +++ b/hotspot/src/share/vm/utilities/taskqueue.hpp @@ -496,9 +496,7 @@ public: } } - bool steal_1_random(uint queue_num, int* seed, E& t); bool steal_best_of_2(uint queue_num, int* seed, E& t); - bool steal_best_of_all(uint queue_num, int* seed, E& t); void register_queue(uint i, T* q); @@ -537,46 +535,6 @@ GenericTaskQueueSet::steal(uint queue_num, int* seed, E& t) { return false; } -template bool -GenericTaskQueueSet::steal_best_of_all(uint queue_num, int* seed, E& t) { - if (_n > 2) { - int best_k; - uint best_sz = 0; - for (uint k = 0; k < _n; k++) { - if (k == queue_num) continue; - uint sz = _queues[k]->size(); - if (sz > best_sz) { - best_sz = sz; - best_k = k; - } - } - return best_sz > 0 && _queues[best_k]->pop_global(t); - } else if (_n == 2) { - // Just try the other one. - int k = (queue_num + 1) % 2; - return _queues[k]->pop_global(t); - } else { - assert(_n == 1, "can't be zero."); - return false; - } -} - -template bool -GenericTaskQueueSet::steal_1_random(uint queue_num, int* seed, E& t) { - if (_n > 2) { - uint k = queue_num; - while (k == queue_num) k = TaskQueueSetSuper::randomParkAndMiller(seed) % _n; - return _queues[2]->pop_global(t); - } else if (_n == 2) { - // Just try the other one. - int k = (queue_num + 1) % 2; - return _queues[k]->pop_global(t); - } else { - assert(_n == 1, "can't be zero."); - return false; - } -} - template bool GenericTaskQueueSet::steal_best_of_2(uint queue_num, int* seed, E& t) { if (_n > 2) { diff --git a/hotspot/src/share/vm/utilities/vmError.cpp b/hotspot/src/share/vm/utilities/vmError.cpp index 175848b79de..175fe382fd7 100644 --- a/hotspot/src/share/vm/utilities/vmError.cpp +++ b/hotspot/src/share/vm/utilities/vmError.cpp @@ -453,7 +453,9 @@ void VMError::report(outputStream* st) { JDK_Version::current().to_string(buf, sizeof(buf)); const char* runtime_name = JDK_Version::runtime_name() != NULL ? JDK_Version::runtime_name() : ""; - st->print_cr("# JRE version: %s (%s)", runtime_name, buf); + const char* runtime_version = JDK_Version::runtime_version() != NULL ? + JDK_Version::runtime_version() : ""; + st->print_cr("# JRE version: %s (%s) (build %s)", runtime_name, buf, runtime_version); st->print_cr("# Java VM: %s (%s %s %s %s)", Abstract_VM_Version::vm_name(), Abstract_VM_Version::vm_release(), diff --git a/hotspot/test/compiler/6340864/TestByteVect.java b/hotspot/test/compiler/6340864/TestByteVect.java index ec4ba9fcd0f..5db3687e67c 100644 --- a/hotspot/test/compiler/6340864/TestByteVect.java +++ b/hotspot/test/compiler/6340864/TestByteVect.java @@ -33,7 +33,7 @@ public class TestByteVect { private static final int ARRLEN = 997; private static final int ITERS = 11000; - private static final int ADD_INIT = 0; + private static final int ADD_INIT = 63; private static final int BIT_MASK = 0xB7; private static final int VALUE = 3; private static final int SHIFT = 8; @@ -76,6 +76,7 @@ public class TestByteVect { test_subc(a0, a1); test_subv(a0, a1, (byte)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (byte)VALUE); test_mula(a0, a1, a2); @@ -88,6 +89,7 @@ public class TestByteVect { test_divc_n(a0, a1); test_divv(a0, a1, (byte)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (byte)BIT_MASK); test_anda(a0, a1, a4); @@ -97,30 +99,49 @@ public class TestByteVect { test_xorc(a0, a1); test_xorv(a0, a1, (byte)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); + test_pack2(p2, a1); test_unpack2(a0, p2); test_pack2_swap(p2, a1); @@ -369,6 +390,60 @@ public class TestByteVect { errn += verify("test_srav_on: ", i, a0[i], (byte)((byte)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + test_pack2(p2, a1); for (int i=0; i>>b); } } + static void test_srlc_add(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & b)>>>VALUE); + } + } static void test_srac(byte[] a0, byte[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -1088,6 +1281,26 @@ public class TestByteVect { a0[i] = (byte)(a1[i]>>b); } } + static void test_srac_add(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(byte[] a0, byte[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(byte[] a0, byte[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (byte)((a1[i] & b)>>VALUE); + } + } static void test_pack2(short[] p2, byte[] a1) { if (p2.length*2 > a1.length) return; diff --git a/hotspot/test/compiler/6340864/TestIntVect.java b/hotspot/test/compiler/6340864/TestIntVect.java index 36e277f731b..5866b34a5af 100644 --- a/hotspot/test/compiler/6340864/TestIntVect.java +++ b/hotspot/test/compiler/6340864/TestIntVect.java @@ -74,6 +74,7 @@ public class TestIntVect { test_subc(a0, a1); test_subv(a0, a1, (int)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (int)VALUE); test_mula(a0, a1, a2); @@ -86,6 +87,7 @@ public class TestIntVect { test_divc_n(a0, a1); test_divv(a0, a1, (int)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (int)BIT_MASK); test_anda(a0, a1, a4); @@ -95,30 +97,49 @@ public class TestIntVect { test_xorc(a0, a1); test_xorv(a0, a1, (int)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); + test_pack2(p2, a1); test_unpack2(a0, p2); test_pack2_swap(p2, a1); @@ -359,6 +380,60 @@ public class TestIntVect { errn += verify("test_srav_on: ", i, a0[i], (int)((int)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + test_pack2(p2, a1); for (int i=0; i>>b); } } + static void test_srlc_add(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & b)>>>VALUE); + } + } static void test_srac(int[] a0, int[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -960,6 +1153,26 @@ public class TestIntVect { a0[i] = (int)(a1[i]>>b); } } + static void test_srac_add(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(int[] a0, int[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(int[] a0, int[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (int)((a1[i] & b)>>VALUE); + } + } static void test_pack2(long[] p2, int[] a1) { if (p2.length*2 > a1.length) return; diff --git a/hotspot/test/compiler/6340864/TestLongVect.java b/hotspot/test/compiler/6340864/TestLongVect.java index 70b41f4b4cb..436a8472df8 100644 --- a/hotspot/test/compiler/6340864/TestLongVect.java +++ b/hotspot/test/compiler/6340864/TestLongVect.java @@ -73,6 +73,7 @@ public class TestLongVect { test_subc(a0, a1); test_subv(a0, a1, (long)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (long)VALUE); test_mula(a0, a1, a2); @@ -85,6 +86,7 @@ public class TestLongVect { test_divc_n(a0, a1); test_divv(a0, a1, (long)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (long)BIT_MASK); test_anda(a0, a1, a4); @@ -94,30 +96,48 @@ public class TestLongVect { test_xorc(a0, a1); test_xorv(a0, a1, (long)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); } // Test and verify results System.out.println("Verification"); @@ -354,6 +374,60 @@ public class TestLongVect { errn += verify("test_srav_on: ", i, a0[i], (long)((long)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + } if (errn > 0) @@ -696,6 +770,84 @@ public class TestLongVect { end = System.currentTimeMillis(); System.out.println("test_srav_on: " + (end - start)); + start = System.currentTimeMillis(); + for (int i=0; i>>b); } } + static void test_srlc_add(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & b)>>>VALUE); + } + } static void test_srac(long[] a0, long[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -906,6 +1098,26 @@ public class TestLongVect { a0[i] = (long)(a1[i]>>b); } } + static void test_srac_add(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(long[] a0, long[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(long[] a0, long[] a1, long b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (long)((a1[i] & b)>>VALUE); + } + } static int verify(String text, int i, long elem, long val) { if (elem != val) { diff --git a/hotspot/test/compiler/6340864/TestShortVect.java b/hotspot/test/compiler/6340864/TestShortVect.java index a688e0de0e0..9f59c8f22cd 100644 --- a/hotspot/test/compiler/6340864/TestShortVect.java +++ b/hotspot/test/compiler/6340864/TestShortVect.java @@ -75,6 +75,7 @@ public class TestShortVect { test_subc(a0, a1); test_subv(a0, a1, (short)VALUE); test_suba(a0, a1, a2); + test_mulc(a0, a1); test_mulv(a0, a1, (short)VALUE); test_mula(a0, a1, a2); @@ -87,6 +88,7 @@ public class TestShortVect { test_divc_n(a0, a1); test_divv(a0, a1, (short)-VALUE); test_diva(a0, a1, a3); + test_andc(a0, a1); test_andv(a0, a1, (short)BIT_MASK); test_anda(a0, a1, a4); @@ -96,30 +98,49 @@ public class TestShortVect { test_xorc(a0, a1); test_xorv(a0, a1, (short)BIT_MASK); test_xora(a0, a1, a4); + test_sllc(a0, a1); test_sllv(a0, a1, VALUE); test_srlc(a0, a1); test_srlv(a0, a1, VALUE); test_srac(a0, a1); test_srav(a0, a1, VALUE); + test_sllc_n(a0, a1); test_sllv(a0, a1, -VALUE); test_srlc_n(a0, a1); test_srlv(a0, a1, -VALUE); test_srac_n(a0, a1); test_srav(a0, a1, -VALUE); + test_sllc_o(a0, a1); test_sllv(a0, a1, SHIFT); test_srlc_o(a0, a1); test_srlv(a0, a1, SHIFT); test_srac_o(a0, a1); test_srav(a0, a1, SHIFT); + test_sllc_on(a0, a1); test_sllv(a0, a1, -SHIFT); test_srlc_on(a0, a1); test_srlv(a0, a1, -SHIFT); test_srac_on(a0, a1); test_srav(a0, a1, -SHIFT); + + test_sllc_add(a0, a1); + test_sllv_add(a0, a1, ADD_INIT); + test_srlc_add(a0, a1); + test_srlv_add(a0, a1, ADD_INIT); + test_srac_add(a0, a1); + test_srav_add(a0, a1, ADD_INIT); + + test_sllc_and(a0, a1); + test_sllv_and(a0, a1, BIT_MASK); + test_srlc_and(a0, a1); + test_srlv_and(a0, a1, BIT_MASK); + test_srac_and(a0, a1); + test_srav_and(a0, a1, BIT_MASK); + test_pack2(p2, a1); test_unpack2(a0, p2); test_pack2_swap(p2, a1); @@ -364,6 +385,60 @@ public class TestShortVect { errn += verify("test_srav_on: ", i, a0[i], (short)((short)(ADD_INIT+i)>>(-SHIFT))); } + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + test_pack2(p2, a1); for (int i=0; i>>b); } } + static void test_srlc_add(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & b)>>>VALUE); + } + } static void test_srac(short[] a0, short[] a1) { for (int i = 0; i < a0.length; i+=1) { @@ -1020,6 +1213,26 @@ public class TestShortVect { a0[i] = (short)(a1[i]>>b); } } + static void test_srac_add(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(short[] a0, short[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(short[] a0, short[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (short)((a1[i] & b)>>VALUE); + } + } static void test_pack2(int[] p2, short[] a1) { if (p2.length*2 > a1.length) return; diff --git a/hotspot/test/compiler/7184394/TestAESBase.java b/hotspot/test/compiler/7184394/TestAESBase.java new file mode 100644 index 00000000000..ad6c835cc84 --- /dev/null +++ b/hotspot/test/compiler/7184394/TestAESBase.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @author Tom Deneau + */ + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.security.AlgorithmParameters; + +import java.util.Random; +import java.util.Arrays; + +abstract public class TestAESBase { + int msgSize = Integer.getInteger("msgSize", 646); + boolean checkOutput = Boolean.getBoolean("checkOutput"); + boolean noReinit = Boolean.getBoolean("noReinit"); + int keySize = Integer.getInteger("keySize", 128); + String algorithm = System.getProperty("algorithm", "AES"); + String mode = System.getProperty("mode", "CBC"); + byte[] input; + byte[] encode; + byte[] expectedEncode; + byte[] decode; + byte[] expectedDecode; + Random random = new Random(0); + Cipher cipher; + Cipher dCipher; + String paddingStr = "PKCS5Padding"; + AlgorithmParameters algParams; + SecretKey key; + int ivLen; + + static int numThreads = 0; + int threadId; + static synchronized int getThreadId() { + int id = numThreads; + numThreads++; + return id; + } + + abstract public void run(); + + public void prepare() { + try { + System.out.println("\nmsgSize=" + msgSize + ", key size=" + keySize + ", reInit=" + !noReinit + ", checkOutput=" + checkOutput); + + int keyLenBytes = (keySize == 0 ? 16 : keySize/8); + byte keyBytes[] = new byte[keyLenBytes]; + if (keySize == 128) + keyBytes = new byte[] {-8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7}; + else + random.nextBytes(keyBytes); + + key = new SecretKeySpec(keyBytes, algorithm); + if (threadId == 0) { + System.out.println("Algorithm: " + key.getAlgorithm() + "(" + + key.getEncoded().length * 8 + "bit)"); + } + input = new byte[msgSize]; + for (int i=0; i 0 ? Integer.valueOf(args[0]) : 1000000); + System.out.println(iters + " iterations"); + TestAESEncode etest = new TestAESEncode(); + etest.prepare(); + long start = System.nanoTime(); + for (int i=0; i> 16; } + static int loadUS_signExt_1 (char[] ca) { return (ca[0] << 16) >> 16; } + + static long loadB2L_mask8 (byte[] ba) { return ba[0] & 0x55; } + static long loadB2L_mask8_1 (byte[] ba) { return ba[0] & 0x55; } + + public static void main(String[] args) { + for (int i = Byte.MIN_VALUE; i < Byte.MAX_VALUE; i++) { + byte[] ba = new byte[] { (byte) i}; + + { long v1 = loadB2L_mask8(ba); + long v2 = loadB2L_mask8_1(ba); + if (v1 != v2) + throw new InternalError(String.format("loadB2L_mask8 failed: %x != %x", v1, v2)); } + } + + for (int i = Short.MIN_VALUE; i < Short.MAX_VALUE; i++) { + short[] sa = new short[] { (short)i }; + char[] ca = new char[] { (char)i }; + + { long v1 = loadS2LmaskFF(sa); + long v2 = loadS2LmaskFF_1(sa); + if (v1 != v2) + throw new InternalError(String.format("loadS2LmaskFF failed: %x != %x", v1, v2)); } + + { long v1 = loadS2Lmask16(sa); + long v2 = loadS2Lmask16_1(sa); + if (v1 != v2) + throw new InternalError(String.format("loadS2Lmask16 failed: %x != %x", v1, v2)); } + + { long v1 = loadS2Lmask13(sa); + long v2 = loadS2Lmask13_1(sa); + if (v1 != v2) + throw new InternalError(String.format("loadS2Lmask13 failed: %x != %x", v1, v2)); } + + { int v1 = loadUS_signExt(ca); + int v2 = loadUS_signExt_1(ca); + if (v1 != v2) + throw new InternalError(String.format("loadUS_signExt failed: %x != %x", v1, v2)); } + } + + System.out.println("TEST PASSED."); + } +} diff --git a/hotspot/test/compiler/8001183/TestCharVect.java b/hotspot/test/compiler/8001183/TestCharVect.java new file mode 100644 index 00000000000..a6ff1e2b961 --- /dev/null +++ b/hotspot/test/compiler/8001183/TestCharVect.java @@ -0,0 +1,1332 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 8001183 + * @summary incorrect results of char vectors right shift operaiton + * + * @run main/othervm/timeout=400 -Xbatch -Xmx64m TestCharVect + */ + +public class TestCharVect { + private static final int ARRLEN = 997; + private static final int ITERS = 11000; + private static final int ADD_INIT = Character.MAX_VALUE-500; + private static final int BIT_MASK = 0xB731; + private static final int VALUE = 7; + private static final int SHIFT = 16; + + public static void main(String args[]) { + System.out.println("Testing Char vectors"); + int errn = test(); + if (errn > 0) { + System.err.println("FAILED: " + errn + " errors"); + System.exit(97); + } + System.out.println("PASSED"); + } + + static int test() { + char[] a0 = new char[ARRLEN]; + char[] a1 = new char[ARRLEN]; + short[] a2 = new short[ARRLEN]; + short[] a3 = new short[ARRLEN]; + short[] a4 = new short[ARRLEN]; + int[] p2 = new int[ARRLEN/2]; + long[] p4 = new long[ARRLEN/4]; + // Initialize + int gold_sum = 0; + for (int i=0; i>>VALUE)); + } + test_srlv(a0, a1, VALUE); + for (int i=0; i>>VALUE)); + } + + test_srac(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav(a0, a1, VALUE); + for (int i=0; i>VALUE)); + } + + test_sllc_n(a0, a1); + for (int i=0; i>>(-VALUE))); + } + test_srlv(a0, a1, -VALUE); + for (int i=0; i>>(-VALUE))); + } + + test_srac_n(a0, a1); + for (int i=0; i>(-VALUE))); + } + test_srav(a0, a1, -VALUE); + for (int i=0; i>(-VALUE))); + } + + test_sllc_o(a0, a1); + for (int i=0; i>>SHIFT)); + } + test_srlv(a0, a1, SHIFT); + for (int i=0; i>>SHIFT)); + } + + test_srac_o(a0, a1); + for (int i=0; i>SHIFT)); + } + test_srav(a0, a1, SHIFT); + for (int i=0; i>SHIFT)); + } + + test_sllc_on(a0, a1); + for (int i=0; i>>(-SHIFT))); + } + test_srlv(a0, a1, -SHIFT); + for (int i=0; i>>(-SHIFT))); + } + + test_srac_on(a0, a1); + for (int i=0; i>(-SHIFT))); + } + test_srav(a0, a1, -SHIFT); + for (int i=0; i>(-SHIFT))); + } + + test_sllc_add(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_add(a0, a1, ADD_INIT); + for (int i=0; i>>VALUE)); + } + + test_srac_add(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_add(a0, a1, ADD_INIT); + for (int i=0; i>VALUE)); + } + + test_sllc_and(a0, a1); + for (int i=0; i>>VALUE)); + } + test_srlv_and(a0, a1, BIT_MASK); + for (int i=0; i>>VALUE)); + } + + test_srac_and(a0, a1); + for (int i=0; i>VALUE)); + } + test_srav_and(a0, a1, BIT_MASK); + for (int i=0; i>VALUE)); + } + + test_pack2(p2, a1); + for (int i=0; i 0) + return errn; + + System.out.println("Time"); + long start, end; + + start = System.currentTimeMillis(); + for (int i=0; i>>VALUE); + } + } + static void test_srlc_n(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>(-VALUE)); + } + } + static void test_srlc_o(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>SHIFT); + } + } + static void test_srlc_on(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>(-SHIFT)); + } + } + static void test_srlv(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>>b); + } + } + static void test_srlc_add(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + ADD_INIT)>>>VALUE); + } + } + static void test_srlv_add(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + b)>>>VALUE); + } + } + static void test_srlc_and(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & BIT_MASK)>>>VALUE); + } + } + static void test_srlv_and(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & b)>>>VALUE); + } + } + + static void test_srac(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>VALUE); + } + } + static void test_srac_n(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>(-VALUE)); + } + } + static void test_srac_o(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>SHIFT); + } + } + static void test_srac_on(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>(-SHIFT)); + } + } + static void test_srav(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)(a1[i]>>b); + } + } + static void test_srac_add(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + ADD_INIT)>>VALUE); + } + } + static void test_srav_add(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] + b)>>VALUE); + } + } + static void test_srac_and(char[] a0, char[] a1) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & BIT_MASK)>>VALUE); + } + } + static void test_srav_and(char[] a0, char[] a1, int b) { + for (int i = 0; i < a0.length; i+=1) { + a0[i] = (char)((a1[i] & b)>>VALUE); + } + } + + static void test_pack2(int[] p2, char[] a1) { + if (p2.length*2 > a1.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l0 = (int)a1[i*2+0]; + int l1 = (int)a1[i*2+1]; + p2[i] = (l1 << 16) | (l0 & 0xFFFF); + } + } + static void test_unpack2(char[] a0, int[] p2) { + if (p2.length*2 > a0.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l = p2[i]; + a0[i*2+0] = (char)(l & 0xFFFF); + a0[i*2+1] = (char)(l >> 16); + } + } + static void test_pack2_swap(int[] p2, char[] a1) { + if (p2.length*2 > a1.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l0 = (int)a1[i*2+0]; + int l1 = (int)a1[i*2+1]; + p2[i] = (l0 << 16) | (l1 & 0xFFFF); + } + } + static void test_unpack2_swap(char[] a0, int[] p2) { + if (p2.length*2 > a0.length) return; + for (int i = 0; i < p2.length; i+=1) { + int l = p2[i]; + a0[i*2+0] = (char)(l >> 16); + a0[i*2+1] = (char)(l & 0xFFFF); + } + } + + static void test_pack4(long[] p4, char[] a1) { + if (p4.length*4 > a1.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l0 = (long)a1[i*4+0]; + long l1 = (long)a1[i*4+1]; + long l2 = (long)a1[i*4+2]; + long l3 = (long)a1[i*4+3]; + p4[i] = (l0 & 0xFFFFl) | + ((l1 & 0xFFFFl) << 16) | + ((l2 & 0xFFFFl) << 32) | + ((l3 & 0xFFFFl) << 48); + } + } + static void test_unpack4(char[] a0, long[] p4) { + if (p4.length*4 > a0.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l = p4[i]; + a0[i*4+0] = (char)(l & 0xFFFFl); + a0[i*4+1] = (char)(l >> 16); + a0[i*4+2] = (char)(l >> 32); + a0[i*4+3] = (char)(l >> 48); + } + } + static void test_pack4_swap(long[] p4, char[] a1) { + if (p4.length*4 > a1.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l0 = (long)a1[i*4+0]; + long l1 = (long)a1[i*4+1]; + long l2 = (long)a1[i*4+2]; + long l3 = (long)a1[i*4+3]; + p4[i] = (l3 & 0xFFFFl) | + ((l2 & 0xFFFFl) << 16) | + ((l1 & 0xFFFFl) << 32) | + ((l0 & 0xFFFFl) << 48); + } + } + static void test_unpack4_swap(char[] a0, long[] p4) { + if (p4.length*4 > a0.length) return; + for (int i = 0; i < p4.length; i+=1) { + long l = p4[i]; + a0[i*4+0] = (char)(l >> 48); + a0[i*4+1] = (char)(l >> 32); + a0[i*4+2] = (char)(l >> 16); + a0[i*4+3] = (char)(l & 0xFFFFl); + } + } + + static int verify(String text, int i, int elem, int val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + elem + " != " + val); + return 1; + } + return 0; + } + + static int verify(String text, int i, long elem, long val) { + if (elem != val) { + System.err.println(text + "[" + i + "] = " + Long.toHexString(elem) + " != " + Long.toHexString(val)); + return 1; + } + return 0; + } +} diff --git a/hotspot/test/runtime/7158800/BadUtf8.java b/hotspot/test/runtime/7158800/BadUtf8.java deleted file mode 100644 index 8b79762a365..00000000000 --- a/hotspot/test/runtime/7158800/BadUtf8.java +++ /dev/null @@ -1,1254 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7158800 - * @summary Test that 1200 symbols that hash to the same value triggers - * the symbol table alternate hashing mechanism. There isn't actually a - * way to verify this. - */ -// -// Generate large number of strings that hash to the same value -// to slow down symbol table lookup. - -import java.io.BufferedOutputStream; -import java.io.FileOutputStream; - -public class BadUtf8 { -static String[] strings = { - "EOcLKvbddZyPxYpb", - "DncLKvbdPxmAGrqj", - "DoCjjvbdpxoIHQdY", - "EPCkKvbdqYoHfqEY", - "DnbkKvbdezvYdiUX", - "DnbjjvbdeEoRbXCj", - "EObkKvbdbsCkUEKB", - "EOcLKvbdnUtyjiqf", - "DncLKvbdRWnDcMHc", - "DoCkKvbdrSUkOLAm", - "DncLKvbdfNFwGmJk", - "EPDLKvbdvAdYroFI", - "DoDLKvbdiGibyViu", - "DncLKvbdYqNEhmFR", - "DoCkKvbdEARhlzXX", - "DncLKvbdSZjHsCvA", - "DncKjvbdqTsgRqkU", - "DnbjjvbdqAiFAXHd", - "EPDKjvbdGcjvJaij", - "DnbkKvbdwtldpxkn", - "DoDKjvbdYkrETnMN", - "EPCjjvbdbBWEfQQX", - "EPCjjvbduMXwAtBX", - "DncLKvbdbsCkTcia", - "DoCjjvbdczYpYZRC", - "EOcKjvbdFeiqmhsq", - "DoCkKvbdKCicQibx", - "EOcKjvbdZLrEUOLm", - "DoCjjvbdaNKbStmH", - "DoDKjvbdJbjDQjDY", - "EPCkKvbdemFwGmKL", - "EPDKjvbdZQleImEq", - "DncKjvbdZjShPfbG", - "DnbjjvbdqYnhHREY", - "DoCkKvbdaRfDIUGL", - "DoDKjvbdLrWlyuQz", - "DnbjjvbdZisHofaf", - "EObjjvbdhtydvrUb", - "DnbjjvbdRotHKGEX", - "EObjjvbdNeEThhkE", - "EPCjjvbdZtJJZESn", - "DoDKjvbdnPyxvLYb", - "EPDKjvbdeEoRbWbj", - "EOcLKvbdFxttaEXb", - "EObjjvbddwystRez", - "EPCjjvbdJpzEnenF", - "DnbkKvbdTppntuIN", - "EPCkKvbdTukpKUBR", - "DnbkKvbdhlFEOUcZ", - "EObkKvbdlhdUQuRa", - "DnbjjvbdkClKqHUg", - "EOcKjvbdqTtGqqkU", - "DncKjvbdtkwvaUBX", - "DoDKjvbdsQWOjCuf", - "DncLKvbdEKIJuwjA", - "DncKjvbdGLErcIMu", - "EOcLKvbdNPwpumfs", - "EObkKvbdnVUzLJrG", - "DoCkKvbdcTDKsdKB", - "DncKjvbdKRZdoFme", - "EOcLKvbdemFvgNKL", - "EPCkKvbdznopdblY", - "EPDLKvbdOYPVzdOU", - "DnbjjvbdsZlPsAhO", - "DoDLKvbdKCjDRKDY", - "DoCkKvbdhuZeXSVC", - "EPDKjvbdOStVgEtp", - "DncLKvbdvwMAvBWV", - "EPDKjvbdBcoaWJlf", - "EOcKjvbdZxdKODMS", - "DoCjjvbdbsCkTcjB", - "EOcLKvbdwWlAuaWV", - "DnbjjvbdFejRnJUR", - "DnbjjvbdmIdTqVSB", - "DnbkKvbdqBIeAWhE", - "DncKjvbdrMzJyMIJ", - "DoCkKvbdZGvdAOsJ", - "DncLKvbdjggLfFnL", - "DoCjjvbdYqNFJMdq", - "DoCkKvbdqZPHfqDx", - "DncLKvbdOEdThiLE", - "DoCkKvbdZirgpGaf", - "EPDLKvbdziuQPdSt", - "EObkKvbdKQyeOenF", - "DoDLKvbduaDySndh", - "DoCjjvbdVUNUGLvK", - "DncKjvbdAMhYrvzY", - "DnbkKvbdnQZxvKxb", - "EPCjjvbdBhjakJFj", - "DncLKvbdmfeYNNfy", - "DoDLKvbdjlbLydfo", - "DoDLKvbdpyPIGpcx", - "EOcLKvbdnVUzLJqf", - "DoCjjvbdmJETqVSB", - "DoDLKvbdJTZAsMxM", - "DoCkKvbdnQZxvLZC", - "DoDKjvbdACqwizJQ", - "DncKjvbdvBEZSoFI", - "DncKjvbdGckVjCJj", - "DncLKvbdiMFENtcZ", - "Dnbjjvbdjuvmcaww", - "DnbkKvbdZyEKNblS", - "DoCjjvbduMYXBUBX", - "DnbjjvbdFWYopNJe", - "DoDKjvbdelfXGljL", - "DnbjjvbdakLenmcA", - "EPDKjvbdfILWRmpg", - "EObjjvbdSLYeuHLT", - "DoCjjvbdMfbolotk", - "EPDLKvbdrRuKnKaN", - "EOcKjvbdyzdnRhIh", - "DoDLKvbdGAoRZJzm", - "DoCjjvbdhlFDnUcZ", - "EPDLKvbdmpZyVkYb", - "DncKjvbdTpqPUuIN", - "DncLKvbdHDjvJaij", - "EPDLKvbdYlRcsmkm", - "EPDLKvbdvlvAMdFN", - "DncKjvbdIsZArmYM", - "EOcLKvbdegjuqnQg", - "EOcLKvbdZQmFJNFR", - "DoCjjvbdZxdJmcMS", - "EPCkKvbdlZTSTYgU", - "DoDKjvbdqceJPnWB", - "DncLKvbdVgwuxGxz", - "DncKjvbdDnbkLXDE", - "EPDLKvbdatbHYKsh", - "DncKjvbdEzsqFLbi", - "EPDLKvbdnVVZkKRf", - "EOcKjvbdKeegbBQu", - "EPCkKvbdKfGHaaRV", - "EPDKjvbdmIctRVRa", - "EPCjjvbdRMxBxnUz", - "DnbjjvbdJYTbILpp", - "EPCkKvbdTAEiHbPE", - "EOcLKvbdfelZnGgA", - "DoCjjvbdOStWGeUp", - "EOcLKvbdemGXHNJk", - "DoDKjvbdYTMAmUOx", - "EPCkKvbdpyOhGpcx", - "EPCkKvbdAMgxsWzY", - "DnbjjvbdYkrETnMN", - "EPDLKvbdUQqPUtgm", - "DncKjvbdehKurNqH", - "DoCjjvbdZMSETnLm", - "DoDKjvbdIHGyyXwg", - "EObjjvbdXGYzUAPT", - "DoCjjvbdhbPCeWqR", - "DoCkKvbdKNADzGuB", - "DnbjjvbdFeirOJTq", - "DncLKvbdaRecHtFk", - "DnbkKvbdzoPpeClY", - "EObkKvbdZRMeJMeR", - "DnbjjvbdYfvdAPSi", - "DncLKvbdJcKCqJcY", - "EOcLKvbdqvokbhyR", - "DoDLKvbdrRuLNjaN", - "DoCjjvbdTlWPBWOi", - "DoCkKvbdjvWnEBxX", - "DoDLKvbdTkunaVoJ", - "DoCkKvbdQZNAHTSK", - "EObjjvbdqwPkbhyR", - "EOcLKvbdNHDPlpUk", - "DncLKvbdIHHZxxYH", - "DncLKvbdtkxXAtAw", - "DncLKvbdSCEFMJZL", - "DnbjjvbdZQmEhldq", - "DoCjjvbdNGbolotk", - "DnbjjvbdnCKWwnmu", - "DncLKvbdzHZMANEw", - "DoDKjvbdmttykJrG", - "DnbkKvbdlrZUzSci", - "EPDKjvbdSKyGVHKs", - "DoCjjvbdKVuGEFGi", - "EPCjjvbdCIkBkIej", - "DncLKvbdzHZMAMeX", - "DnbkKvbdaSFbgsek", - "DncLKvbdHDjujBij", - "DoDKjvbdGZVUaDwb", - "DnbjjvbdZnnJFEzK", - "DoCkKvbdtcDUwWOo", - "DoCkKvbdlBMoNALA", - "EOcKjvbdNsUWHFUp", - "DoDLKvbdVUNUFlVj", - "DnbkKvbdhkdcnUcZ", - "DncLKvbdLiBkqYAS", - "EOcKjvbdzoPpdcLx", - "EPDKjvbdijGIJmXr", - "EOcKjvbdZisHofaf", - "DoDLKvbdeOdrkUUS", - "DoDLKvbdnPyxvKxb", - "EPDKjvbdIxUBhMRQ", - "DncLKvbdlhctRUqa", - "DoDLKvbdmgFXlnGy", - "DncKjvbdCJKbKiGK", - "EOcLKvbddndrjtUS", - "DnbjjvbdkDLjqGuH", - "DncKjvbdmIcsptqa", - "DoCkKvbdvvlAvBWV", - "EObjjvbdjblLQftg", - "DnbjjvbdCEQBWKMf", - "DnbjjvbdBdPaVilf", - "DoCkKvbdZxcjODLr", - "DoCkKvbdEObjjwCd", - "EPDKjvbdyTNhlqbH", - "EPCkKvbdUMVoAvPJ", - "DncKjvbdUxhUZjoO", - "DncKjvbdqqtjmkAm", - "DncKjvbdKfGICBRV", - "EPCjjvbdVrOXaeLc", - "EPDLKvbdwXLaWBWV", - "EPCkKvbdjblKqHUg", - "DnbjjvbduDCuWuoP", - "EPDKjvbdNGbpMouL", - "EObjjvbdBcoaVjNG", - "DncLKvbdrWpMDIxq", - "DncLKvbdhaoCdwRR", - "DnbkKvbdFxtuBDwb", - "DncKjvbdIjEAKPgE", - "EOcLKvbduCbuXVoP", - "DoDKjvbdZtIiZDsO", - "DnbjjvbdEztRElCi", - "DncLKvbdxmsHwsJD", - "DnbjjvbdRbEElIxk", - "DoDKjvbdWHwvXgYz", - "EOcKjvbdQlwbYnUz", - "EOcLKvbdVTltFkuj", - "DncKjvbdliETptqa", - "DnbkKvbddoErjtTr", - "DoCkKvbdgPazvdXh", - "DncKjvbdySmhlqag", - "DoCjjvbdbPgHDkzd", - "DoCkKvbdFWZPomKF", - "EObjjvbdssSSxydc", - "EObjjvbdzQnliJwA", - "EObkKvbdKCjCpibx", - "EPCjjvbdpyOhHREY", - "DncLKvbddjJqutzn", - "EObkKvbdBdQAujMf", - "EPCkKvbdLAjflbXq", - "DncLKvbdLBLGlaxR", - "DoDLKvbdrpWPJbuf", - "DoCjjvbdEKHiuxKA", - "DoCjjvbdXsMAlsnx", - "EObkKvbdptTgSSLU", - "DoDKjvbdnHFXmNfy", - "DncKjvbdCJKbKhej", - "EPCjjvbdhlEdOUby", - "EOcKjvbdKWUfEFGi", - "DoDKjvbdZQmFJMdq", - "EPCjjvbdiGjDZWKV", - "EObkKvbdVAbQrprZ", - "DoDKjvbdfekzNgHA", - "DoDLKvbdnHEwlmgZ", - "DncKjvbdwzHeexEr", - "DoCjjvbdmpZxujyC", - "EPDKjvbdwMvAMcdm", - "DoCjjvbdfHkVrNqH", - "EPCkKvbdYzbfRiuy", - "EPCkKvbdZtIiZDrn", - "DnbjjvbdjvWnDbYX", - "DoCjjvbdOStVgEtp", - "EPDLKvbdZMSETmlN", - "EPDKjvbdBhjajhej", - "EPCjjvbddoFTLUUS", - "DnbkKvbdsQVoJcWG", - "EPCjjvbdrEFJQNvB", - "DoCjjvbdMpYRWOGs", - "EOcLKvbdZirgpHBf", - "EPDLKvbdyOTIXsJD", - "DoCkKvbdKRZdnfNe", - "DnbjjvbdbBWFFoow", - "EPCjjvbdgFlZnHHA", - "DnbkKvbdGGJrOIsq", - "DoDLKvbduDCtwWPP", - "EObjjvbdNddUIhjd", - "DnbjjvbdxsNiMqag", - "EObjjvbddeOrCWbj", - "EObjjvbdPxmAGsRj", - "EOcLKvbddeOrCXDK", - "DoDLKvbddeOrBwCj", - "DoCjjvbdVqnYCElD", - "DnbkKvbdUyIUZjoO", - "EObjjvbdeFOrCXDK", - "EObkKvbdVrNxCFLc", - "EObjjvbdTfzmkwWF", - "EOcKjvbdIHGzZYYH", - "EPDKjvbdtbbuXWPP", - "DoCjjvbdZisIQHBf", - "EObjjvbdbsCkUDjB", - "EPCkKvbdVwJXudFH", - "EPDKjvbdrouoKDVf", - "EPCkKvbdFyVVBEYC", - "DncLKvbdZnnIeEzK", - "EPDLKvbdxVNFQxkn", - "DoDKjvbdpxnggRDx", - "DoDLKvbdqZOgfpcx", - "DncKjvbdCIjakJGK", - "EPCkKvbdCJLBjhej", - "DoDLKvbdnPzYvKxb", - "EOcKjvbdqTsgSRkU", - "EOcLKvbdLBLGlaxR", - "DoDLKvbdcbTMrAUN", - "DncLKvbdzitoodSt", - "DoDKjvbdJvUfDdfi", - "EOcLKvbdHDjvKCJj", - "EPCkKvbdeOeTKssr", - "DnbkKvbdlYrqsYft", - "DncLKvbdiiehKMxS", - "DncKjvbdURQoVUhN", - "DnbkKvbduMYXBUAw", - "DoDLKvbdSPtHJfEX", - "EObkKvbdqBJFAWgd", - "EOcKjvbdFpATWgFy", - "DoDLKvbdBsBDTfXS", - "DncKjvbdjhHLfFmk", - "DoCjjvbdCJKakIfK", - "DnbkKvbddoFSjtTr", - "EObkKvbdANIYsWzY", - "EObjjvbdCTAbtFvr", - "EObjjvbdrRtkOLAm", - "DnbkKvbdkxsSTYgU", - "DoCjjvbdnBiwXnmu", - "EObjjvbdwtmEqYlO", - "EPDKjvbdrylQTAhO", - "DoDLKvbdtbbtvvOo", - "EPCjjvbdZLrETmlN", - "EPDLKvbdWXJYWDdg", - "DoCkKvbdKQzFOfOF", - "EPCjjvbdwzIFfXeS", - "DncKjvbdRjyFuHLT", - "EPDLKvbdULunaWPJ", - "DncKjvbdUxhTykOn", - "DnbkKvbdJcKCqKDY", - "EPDLKvbdcbSmSATm", - "DnbkKvbdegjurNqH", - "EPDKjvbdZjTIQGbG", - "EPCjjvbdiLddNuCy", - "DoCjjvbdZQldiNEq", - "EOcLKvbdakMGPODA", - "EObjjvbdnHEwlmgZ", - "EOcLKvbdBsAcUGXS", - "EPCkKvbdiVZdwSUb", - "EOcLKvbddCTNSAUN", - "DnbkKvbdEXxMUUUM", - "DncKjvbdYpldiMeR", - "DoDKjvbdNddTiIjd", - "DoDLKvbdZLqdUNlN", - "EPCkKvbdiBncFWpq", - "DncLKvbdiCPDEvqR", - "EOcKjvbdUyHszKoO", - "DncKjvbdhtydvqtb", - "EPCjjvbdpxoHgQcx", - "EObkKvbdkWWnDaxX", - "DnbjjvbdBhkBkJFj", - "DoCkKvbdRacdkhyL", - "EOcLKvbdZjTHpHCG", - "EPCkKvbdMowqWOGs", - "DncLKvbdegjurNpg", - "EObjjvbdfMfWfmKL", - "EPDLKvbdZirgpGaf", - "DoDLKvbdiZuFlQnG", - "DncLKvbdFxuVAcxC", - "EObkKvbdZisHofaf", - "EOcKjvbdJSyBSmYM", - "EPDLKvbdVYgtZkPO", - "EOcKjvbdRbEFMJYk", - "DncLKvbdrEFIonWB", - "DncKjvbdKDJbqJcY", - "EOcLKvbdhfjCxuiu", - "EObjjvbdLLAhWAKZ", - "DoCkKvbdRXNcblID", - "DoDLKvbdcbSmSATm", - "EOcLKvbdwWlAvAuu", - "EObkKvbdiBnbdvpq", - "DoCkKvbdNQXpumgT", - "DncLKvbdkVwOECYX", - "DnbkKvbdfoazwDxI", - "DoDLKvbdbBWFFpPw", - "DoDLKvbdvBDxsPEh", - "EPDKjvbdJqZdoFme", - "DoDLKvbdIryArmXl", - "EPCjjvbdANIZSwZx", - "EPCkKvbdVhYVxGxz", - "DncKjvbdLAjgNCYR", - "DncKjvbdxxIjCQZk", - "DncKjvbdbiNKKewY", - "EPCjjvbdlrZVZsEJ", - "EPDKjvbdIryAsMwl", - "DoCkKvbdtAHRIAAr", - "EPDKjvbdJmAEZfuB", - "EPCkKvbdZjSgogBf", - "DoDLKvbdOXnuzcnU", - "DnbkKvbdehKvRnQg", - "EObjjvbdZyDimbkr", - "DoDKjvbdmajWwoOV", - "EOcKjvbdkMalZeHP", - "EOcKjvbdIjEAJpHE", - "EPCkKvbdDihKVxKA", - "DncKjvbdNddUIiKd", - "EObjjvbdqdFIpOWB", - "DoCkKvbdxnShXsJD", - "DoDLKvbdjmBkzEfo", - "EOcLKvbdatagYLTh", - "DoCjjvbdVhYVxHYz", - "DnbjjvbdJbjDRKDY", - "EPCjjvbdLBLHNCYR", - "DnbjjvbdnGeYNOGy", - "EOcLKvbdUsmTekvK", - "EPCjjvbdtkxXBTaX", - "EPCjjvbdzoPqFCkx", - "DncKjvbdCIjbKhej", - "DncKjvbdZLqdTmkm", - "DoDKjvbdsPunicVf", - "EOcKjvbdmgFXmNgZ", - "EObkKvbdiMFENuCy", - "DoDKjvbdhanbeXRR", - "EObkKvbdACqwiyhp", - "DncKjvbdZisIQHBf", - "EPCjjvbdgQBzwDwh", - "DnbjjvbdyYJJaoyk", - "DoDKjvbdxUldqZMO", - "EObkKvbdkClLQgVH", - "EPCjjvbdZQldiMeR", - "EPDLKvbdZyEKOClS", - "EPDLKvbdcIlikFvx", - "DoDKjvbdrzMQTBHn", - "DnbjjvbdVYgtZkPO", - "DoDLKvbdHEKuiajK", - "EPCkKvbdczZQXxqC", - "DoDKjvbdrDdiQNua", - "DncLKvbdcImKLGWx", - "DoCjjvbdVYgtZkPO", - "EPDLKvbdZnnIeFZj", - "EPDKjvbdMIakqYAS", - "DoCkKvbdSLYfUgLT", - "EPDLKvbdiCObdvpq", - "DnbjjvbdRpUHKFcw", - "DoDLKvbdIHHZyYXg", - "EPCjjvbdypoMhiwA", - "DnbkKvbdCEPaVjMf", - "DnbkKvbderAvzlDP", - "DnbkKvbdZQleImFR", - "EOcKjvbdKRZdneme", - "DoDLKvbdiBnbeXQq", - "DncLKvbdEPDKjvcE", - "EOcLKvbdauCGwkTh", - "DncLKvbdEvZQPmJe", - "EPCkKvbdURQnuVIN", - "DncLKvbdegjvSOQg", - "EPCjjvbdKaKgMawq", - "DnbkKvbdRzKISbvA", - "DncLKvbdiLdcnUcZ", - "EPDLKvbdkDMKpfuH", - "DoDLKvbdRbDdkhyL", - "DnbjjvbdDwxMUUTl", - "DnbkKvbdrpWPKCuf", - "DnbkKvbdNVSqjmAX", - "DoDKjvbdRbDeMIxk", - "EOcLKvbdcyxpXyRC", - "DncLKvbdRMwbYnUz", - "EObjjvbdqlzJxlHi", - "DoCkKvbdJYUCIMQp", - "DncLKvbdLZQjSzuG", - "EOcKjvbdxVNEqYkn", - "DnbkKvbdZoOIeFZj", - "DoCjjvbdBraCtFwS", - "EOcLKvbdliDsqVSB", - "EPCkKvbdeATqNXif", - "DncLKvbdkMbLydgP", - "EObjjvbdZxdJmbkr", - "DoCjjvbdraellHLZ", - "EObkKvbduDCuWvPP", - "DoCkKvbdpstGrSLU", - "DoCjjvbdLGFgbBQu", - "DnbkKvbdhtzFWquC", - "EObjjvbdoAKztHdO", - "EPDLKvbdatafxKtI", - "EPDKjvbdkWXNcaww", - "DoCkKvbdwkXEHzzG", - "EObkKvbdmgEwmNgZ", - "DncKjvbdBiLCLJFj", - "DoCjjvbdeOdsKssr", - "EOcLKvbdfILWSORH", - "EObkKvbdCDpAujMf", - "EPDKjvbdKDKDQibx", - "DoDKjvbdVUMtGLuj", - "EObkKvbdrXQMCiYq", - "DncKjvbdePEsLTtS", - "DncLKvbdDxYLtUTl", - "EPCkKvbdGYuVBEYC", - "DncLKvbdNeEUIiKd", - "EPCkKvbdpxoIHRDx", - "EObjjvbdFkEsDHlu", - "EObjjvbdssSSxzFD", - "DoCkKvbdUtNTfMVj", - "DnbjjvbdJcKDRKDY", - "DncKjvbdqiAKEmOe", - "DoDKjvbdtlXwAtBX", - "DnbkKvbdxmsIYTIc", - "EObkKvbdLrXMzUpz", - "DoCjjvbdkxsSSxft", - "DncKjvbdQlwaxnUz", - "EObkKvbdjhGlFfNk", - "EPCkKvbdxsNhmRag", - "DoDLKvbdMfcPmQUk", - "DoDKjvbdQvnEDLhD", - "EObjjvbdVgxVxHYz", - "DoDLKvbdlrYtyrdJ", - "DoCjjvbdezvYeIsw", - "DncLKvbdNddTiIjd", - "EPDLKvbdGGJrNiUR", - "EPDLKvbdRzJhTDWA", - "EPCjjvbdvvkaWBVu", - "EOcKjvbdRXNdCkgc", - "EOcKjvbdQZNAHTSK", - "EPCkKvbdsCGNLfkZ", - "EOcLKvbdDwwktTsl", - "EOcLKvbdqlzJyLgi", - "EOcLKvbdxsNiMqag", - "EOcLKvbdhzVFlROG", - "EOcKjvbdEztRFMCi", - "DnbkKvbdqiAJdmPF", - "EPDLKvbdjcMKqGtg", - "EObkKvbdTlWOaWOi", - "EPDLKvbdURRPUuHm", - "DoDKjvbdelfWgNKL", - "EOcLKvbdGAnqZJzm", - "EObjjvbdGZUuAdXb", - "DoDLKvbduLwwAtAw", - "DoCjjvbdZjTIQGbG", - "EPCjjvbdRNXbYnUz", - "EPDLKvbdiLeENtby", - "EObjjvbdMowpunGs", - "EOcKjvbdbiNJjevx", - "DoDKjvbdEYYLstTl", - "DoDLKvbdqUTfrRjt", - "DoDKjvbdbsCkUEJa", - "DoDKjvbdXsMBNUPY", - "EPCjjvbdRNXaxnUz", - "DoDLKvbdNGcQNQUk", - "DnbjjvbdEARiMywX", - "EPDKjvbdSKxfUfkT", - "DncKjvbdhtyeXRtb", - "DncKjvbdZLqcsnLm", - "EObkKvbdZnmheEzK", - "EObjjvbdtbcUvuno", - "DnbjjvbdrzMQTBHn", - "DnbjjvbdDwwktTsl", - "EPDKjvbdkxsSTYgU", - "DoDKjvbdIryArlxM", - "DoDKjvbdnBivxOnV", - "DoDKjvbdeATplwif", - "EOcLKvbdKeegbApu", - "EPCjjvbdMgDQMotk", - "DoCjjvbduCbtwWOo", - "DnbkKvbdyNsHwrhc", - "DnbkKvbdtvNxJpsA", - "EOcLKvbdqAheAWgd", - "DoCkKvbdURQoUtgm", - "EOcKjvbdqceIpOWB", - "DoCkKvbdVwIwudFH", - "DnbkKvbdbLMFnmcA", - "EOcLKvbdZjTHpHBf", - "EOcKjvbdRXNdCkhD", - "EPDLKvbdiHJcZViu", - "DoCjjvbdxxIjCPzL", - "DnbkKvbdBcpBWJmG", - "EPCkKvbdZyEKOCkr", - "EPDKjvbdOTUWHFVQ", - "DoCjjvbdIGgZxwwg", - "EPDLKvbdFjeSbhMu", - "EPDLKvbdhgKCxvJu", - "EOcLKvbdNsUWGdtp", - "EPDKjvbduVnXipsA", - "DncLKvbdGYuVBEXb", - "EPDLKvbdZtIhyESn", - "DoDKjvbdZxdJmcLr", - "DoCjjvbdUsltGLuj", - "DoDKjvbdDoDLKvbd", - "DncLKvbdrDdhpNvB", - "EPDLKvbdKCjDRJbx", - "DoDLKvbdxLWdHzyf", - "EObkKvbdrzMQTAhO", - "EOcLKvbdOFDtJJKd", - "EPCkKvbdrSVKmjaN", - "EOcKjvbdWWiYVdEg", - "EOcKjvbdWWhwvDdg", - "DncKjvbdpstHRqjt", - "EPCkKvbdKWVFceGi", - "DoCkKvbdZjShPfbG", - "DoCkKvbdSxKlNzkY", - "EPDLKvbdIwtCHkqQ", - "EOcKjvbdsCGNLgLZ", - "DncKjvbdzaAOfgCM", - "DoDLKvbdxmrhYSiD", - "DncLKvbdfMfWgMjL", - "EPDKjvbdqFdEsuaI", - "EOcLKvbdiLeDnUcZ", - "DoCjjvbdKVuFceHJ", - "DoCjjvbdfekzNgHA", - "EOcKjvbdOFEThiLE", - "EPDLKvbdqceJPnWB", - "DoDLKvbduCbtwWOo", - "DncKjvbdTqROtuIN", - "DncKjvbdpedFUWBI", - "DoDLKvbdrEFJQNua", - "DoDLKvbdyXhjCPyk", - "EPCkKvbdJYUBhLqQ", - "EPCkKvbdtcCuXVno", - "DoDLKvbdZLrEUOLm", - "EPCkKvbdpstGrRjt", - "DncLKvbddePSCXCj", - "EObkKvbdauCHXjsh", - "DoDLKvbdkHfkefNk", - "EObjjvbdMRwMzUpz", - "EObjjvbdaMkCTVNH", - "DoCkKvbdGGJrNhtR", - "EPDLKvbdvBDxrneI", - "EPDLKvbdIHHZxwxH", - "EOcLKvbdrJAJdmPF", - "EOcKjvbdGZUuAdXb", - "EOcLKvbdbUbHYLUI", - "DnbjjvbdJzofYEAN", - "EPDKjvbdFxtuBDxC", - "DnbkKvbdQvnDbkgc", - "EPDKjvbdJmADzGta", - "DoDKjvbdZRMdhleR", - "DnbkKvbdsrqsZZeD", - "EObkKvbdrovPJbuf", - "EPCjjvbddeOqbXCj", - "EObjjvbdtcDVXVoP", - "DncKjvbdMfbpNQVL", - "DoCkKvbdhbPCeXQq", - "DoCkKvbdNHComQVL", - "EObjjvbdvBDxroFI", - "EPCjjvbdnBivwoNu", - "EObjjvbdbhljKewY", - "EPDKjvbdZyDimcMS", - "EObkKvbdWSOXbElD", - "EOcKjvbdTfznMXVe", - "EPCjjvbdZtJJYcsO", - "DoCjjvbdRjxfVHLT", - "DoCkKvbdVTltGMVj", - "DncKjvbdYfwEAOri", - "DncKjvbdYkrEUOMN", - "EObkKvbdqGEEsuaI", - "DncLKvbdjJfHimXr", - "EPDLKvbddndsLUTr", - "DnbkKvbdqBJFAWhE", - "EPDLKvbdEOcKjwDE", - "EPCkKvbdtvOYJqTA", - "DncLKvbdkyTRsZHU", - "DoCjjvbdTppnuVIN", - "DncLKvbdwyhFeweS", - "DncKjvbdsBelkgKy", - "DoCjjvbdKDKCqJcY", - "DoCjjvbdkClKqHVH", - "DoCjjvbdcTCjtDia", - "EPDLKvbdUVkpJtAq", - "EPDLKvbdRyjITCvA", - "DnbjjvbdJuuFcdgJ", - "DoDKjvbdrJAJdmOe", - "DncKjvbdJcJbqKCx", - "DoDLKvbdJcJbqJcY", - "DoDKjvbdeEoSCXDK", - "DoDLKvbdSwjlNzkY", - "EObjjvbdzitopDrt", - "DoCkKvbdKWVGEEgJ", - "DncKjvbdpssfqrKt", - "EOcLKvbdUMWPBVoJ", - "DncKjvbdyzdmrIIh", - "EPCjjvbdxUldqZLn", - "DoDLKvbdySnImRbH", - "DoCjjvbdGdKvJaij", - "DoCkKvbdxZgeewdr", - "EObkKvbdiLddNuDZ", - "DnbjjvbdSCDdkiZL", - "DncKjvbdznpREcMY", - "EOcLKvbdaRebhTfL", - "DnbjjvbdZQldiMdq", - "EPCjjvbdbrbjtEKB", - "EOcKjvbdEARiMzXX", - "DoDLKvbdXrkaNTnx", - "EPCkKvbdQZNAHTRj", - "DoDLKvbdEzspeLcJ", - "EPCjjvbduVnYKRTA", - "EObjjvbdJXtBhMQp", - "EPDKjvbdeOdrjssr", - "EPCjjvbdLqwMytpz", - "EPDKjvbdUMVoBVoJ", - "DncKjvbdRpUGifDw", - "EPDLKvbdZyDinDLr", - "DnbkKvbdNrsufeVQ", - "EPCkKvbdZMSDtNlN", - "EPCkKvbdySnJNSCH", - "EPCjjvbdfMevfljL", - "DncLKvbdXsMBNTnx", - "DnbkKvbdpxoHfqDx", - "DncLKvbdUQpntthN", - "DncKjvbdIsZArlwl", - "DoDLKvbdZGwEAOsJ", - "EOcKjvbdVvhwvDdg", - "EOcLKvbduWNxJqTA", - "EPCjjvbdHEKvJaij", - "DoDKjvbdrpWOjCuf", - "DncLKvbdrpWOjDVf", - "DoCjjvbdIHGzYwwg", - "DoDLKvbdpxoIGqEY", - "DoDLKvbdJcJbqKDY", - "DoCjjvbdRWmdClHc", - "EPCjjvbdFWYopNJe", - "DncKjvbdmfdwlmfy", - "DoCkKvbdxUleQxlO", - "EObjjvbdnGdxMnGy", - "EPCjjvbdvvlAvBVu", - "DncLKvbddndsKssr", - "EObjjvbdZMRcsnLm", - "EOcKjvbdFxttaEXb", - "DncKjvbdVUNTfMVj", - "EOcLKvbdNrtWHFUp", - "DoDKjvbdwuMdqYlO", - "EPDLKvbdrXPkbhxq", - "EObjjvbdrEFIpNua", - "EObjjvbdziuQQDrt", - "EOcLKvbdqYoIGpcx", - "DnbjjvbdsQVoJcVf", - "EObkKvbdkDMKpgUg", - "EObjjvbdvBDyTPFI", - "DncKjvbduCbuWvOo", - "EPCjjvbdkVvnECYX", - "DncLKvbdZGvdAOri", - "DoCkKvbdrXPlDJZR", - "EOcLKvbduCcVWvOo", - "DoDKjvbdCEPaWJlf", - "EPDKjvbddoErjssr", - "DncKjvbdACqxKZiQ", - "EPCjjvbdUVlPitAq", - "EPDKjvbdjJfHjMxS", - "EObkKvbdAMhYsWzY", - "DoDKjvbdnBivxOmu", - "EOcLKvbdbiNKKfXY", - "EPDKjvbdYqMeIleR", - "EObkKvbdJmADygUa", - "EObjjvbdEPDLLWcE", - "EPCjjvbdrXPkcIxq", - "EOcLKvbdliDtQtqa", - "DoCjjvbdmoyxujyC", - "EPDLKvbddoFTLTsr", - "EOcLKvbdCWzdJEpW", - "DnbjjvbdrEEhpOWB", - "DoDKjvbdZLrDtNkm", - "EOcLKvbdLFfHbAqV", - "EOcKjvbdmttzLKSG", - "EOcLKvbdmbJvwoOV", - "EOcKjvbdUaCQrqSZ", - "DnbjjvbdmgExMnGy", - "EPDKjvbddndrkUUS", - "EObkKvbdDwwkstTl", - "DoCkKvbdcJMjLFwY", - "DnbjjvbdaNLBruMg", - "DoDLKvbdQYmAHTRj", - "DnbkKvbdsQWOicWG", - "EObkKvbdMRwMzUpz", - "DoDLKvbdZshiZDrn", - "EPDLKvbdnPzYujxb", - "EOcKjvbdCEQAujMf", - "EPDLKvbdKefHbApu", - "DoDLKvbdYpldiNFR", - "DoCkKvbdFWZQQNJe", - "DncLKvbdznpQeCkx", - "EOcKjvbdnQZxvKxb", - "DoCkKvbdVBBprpqy", - "DnbkKvbdZirhPfaf", - "DnbkKvbdegjvSNqH", - "EOcLKvbdqdEiPnWB", - "EObjjvbdBhkCKiGK", - "EObjjvbdxZgfGYFS", - "DnbjjvbdNQYQumgT", - "EPCjjvbdxsNhlrBg", - "DoCkKvbdQdDApRDr", - "DoCkKvbdxxIiaoyk", - "EPDKjvbdFeirNhtR", - "DoCjjvbdegjvSOQg", - "EObkKvbdqcdiQNvB", - "DncLKvbdiMEdNtcZ", - "DncLKvbdTqRPUthN", - "EPCkKvbdwygeexFS", - "DoDKjvbdyTOJMrBg", - "DncLKvbdeEoRavbj", - "EPCjjvbdtbcUvvOo", - "EObjjvbdKCicRJcY", - "EObjjvbdZyEKODMS", - "DnbjjvbdmJDtQtrB", - "DncLKvbdEARhlyvw", - "DnbjjvbdIxTbILqQ", - "EOcLKvbdwygefYFS", - "DoCjjvbdznoqFCkx", - "DoCjjvbdRpUGjGDw", - "DncKjvbdhzVGMQnG", - "EPCjjvbdhkeDnVCy", - "EObkKvbdOEdUIiKd", - "DncKjvbdrDeIomua", - "DncLKvbdiHJbxuiu", - "EPDKjvbddxZstRez", - "EPDLKvbdmSYuZrdJ", - "EObkKvbdVUNUFkvK", - "EPDLKvbdNeEUJIjd", - "DoCkKvbdiMEdNuCy", - "DoDLKvbdRDcApQcr", - "EPCjjvbdTlVoBVoJ", - "EObjjvbdLBKgNBwq", - "EPCkKvbdsCFllHKy", - "EObjjvbdnVUzLJqf", - "DoDKjvbdqrVLNkBN", - "DoCkKvbdqFcdtWBI", - "DncLKvbdbVCGxLTh", - "EOcLKvbdeFPSCXCj", - "EOcLKvbdRpTgKFdX", - "EObjjvbdznpQeDLx", - "EOcKjvbdjvXNcaxX", - "DnbjjvbdHDkWJbJj", - "DncKjvbdhkeENuDZ", - "DnbkKvbdnUtyjjSG", - "DoDKjvbdSQUHJfDw", - "DncKjvbdbUbHYLUI", - "EOcLKvbdNsTvGduQ", - "EPDLKvbdSZigsCvA", - "DncKjvbdMfcPlpUk", - "DoDLKvbdxrnIlrBg", - "DncKjvbdiLdcnVCy", - "EPCjjvbdmfeYNOHZ", - "DoCkKvbdjvWmcaxX", - "DoDKjvbdbUbHXkUI", - "DncKjvbdBhkBjiFj", - "DoDLKvbdNHColpVL", - "EOcKjvbdrykosAhO", - "DncLKvbdqGDeUVaI", - "DnbkKvbdhgJcZViu", - "DnbjjvbduLxXAtBX", - "EPCjjvbdYpleJNFR", - "EPDLKvbdQvmdClHc", - "DnbjjvbdJYTbIMRQ", - "DncLKvbdznpRFDMY", - "EOcLKvbdZnmiFEyj", - "DnbkKvbdrRuLOLAm", - "EObkKvbdhkeEOUby", - "DncLKvbdYlSEUOLm", - "DoCjjvbdhkdcmtby", - "DncLKvbdddnrCXDK", - "DoDLKvbdKaLHNCYR", - "EOcKjvbdcyxpYZQb", - "EPDLKvbdACqwjZhp", - "DoCkKvbdBsBDTevr", - "EObkKvbdeKJqvUzn", - "EObkKvbdcImJkGWx", - "DncLKvbdYSlAltOx", - "DncLKvbdlrYtyrdJ", - "EObkKvbdKxqJrztf", - "EOcKjvbdsQWPJcVf", - "DoDKjvbdkySqrxgU", - "EObjjvbdeEoRbXCj", - "EOcKjvbdHDkVjBij", - "DoDLKvbdCTBCsfXS", - "DoCjjvbdKCjDQibx", - "DoCjjvbdlhdTqUrB", - "DoDKjvbdTulQKTaR", - "DoCkKvbdRjxetfkT", - "EPCjjvbdEuyQQNKF", - "EPCjjvbdDoDKkXDE", - "DoCjjvbdsQWPJbuf", - "DoDKjvbdhuZdvqtb", - "EPDLKvbdiHKCyWJu", - "EPDLKvbdLFegaaQu", - "DoCjjvbdqZPHgRDx", - "DncKjvbdUWMPjUAq", - "DoDLKvbdTYKkmzjx", - "DoDKjvbdegjvSOQg", - "DnbkKvbdUtNTekvK", - "EObkKvbdNsTvGeVQ", - "DoDLKvbdfNFvgMjL", - "EOcLKvbdZQmEiNEq", - "EPDKjvbdBraDTfWr", - "EPDKjvbdNGcQNQVL", - "EPDLKvbdZyEKODMS", - "EOcKjvbdBvzdIdpW", - "EPCjjvbdACqwiyiQ", - "DoCjjvbddePRawCj", - "EPDKjvbdWWiXucdg", - "DoDKjvbdWexzUAPT", - "DnbjjvbdwXMBWBWV", - "EOcLKvbdUyHszLOn", - "EPCkKvbdOYOuzcnU", - "EPCkKvbdhancEwQq", - "DnbkKvbdjggLefOL", - "EPCkKvbdFjdsDIMu", - "DoDKjvbdrSUjmkBN", - "DoDLKvbdZjTIQGaf", - "DoDKjvbdMgDPmPtk", - "EPDLKvbdWRmwbFMD", - "DoCkKvbdzROmJKXA", - "DnbkKvbdrDdiQNvB", - "DnbjjvbduDCtwVoP", - "EOcLKvbdCIjbLJFj", - "EPDKjvbdXrkaMsnx", - "EPDKjvbdVhXvXfxz", - "DncKjvbdhbPDEwRR", - "DoCkKvbdpxoHgQcx", - "DoCkKvbduMXwBUBX", - "EObjjvbdNeEThhjd", - "DoCjjvbdirzhrkJz", - "DoDLKvbdaMkCTUlg", - "DncLKvbdWRnYBeLc", - "DnbjjvbdGBPRZJzm", - "EOcLKvbdeOeSjstS", - "DoDLKvbdmIctRVSB", - "DoCjjvbdZxdJnDMS", - "DoCkKvbdRpTgKFcw", - "DncLKvbdTukojTaR", - "DnbjjvbdKRZdoFme", - "DnbkKvbdURQoVUhN", - "DoDLKvbdyYJKBozL", - "EObkKvbdfNFwHMjL", - "DoDLKvbdZisIQHBf", - "EObkKvbdqFcdsuaI", - "DncLKvbdzoPqFDLx", - "DoDKjvbdSKxeuHLT", - "EPDKjvbdsBemLfjy", - "DoCjjvbdJbjCqJcY", - "DoCjjvbdNPxRVnGs", - "DncLKvbdGcjvJbKK", - "EOcKjvbdrWpMDIxq", - "EOcLKvbdQdDApQcr", - "DoDKjvbdZMRdTnLm", - "EOcLKvbddxZssrFz", - "EObjjvbdUtNTfLuj", - "EPCjjvbdLLBIWAKZ", - "DoCkKvbdgFlZmfgA", - "EPCjjvbdUVkoitAq", - "DoDKjvbdDncKjvcE", - "DoDLKvbdRpUHJfEX", - "EPDKjvbdLqvlzVQz", - "EPDKjvbdZMRdUOLm", - "EOcLKvbdCJLBkIfK", - "DncKjvbdaSFbhUFk", - "EPDLKvbdZoNheEzK", - "DncKjvbdUVlPjUAq", - "DnbkKvbdKNADyfuB", - "EObkKvbdZdwfzghb", - "EPDLKvbdZtIhxcrn", - "EObkKvbdGckViajK", - "DncLKvbdFfJqmiUR", - "DncKjvbdKWUfDdgJ", - "DoDKjvbdMtrqjmAX", - "EOcLKvbdsQWPKDVf", - "DoCjjvbdwtleRZMO", - "EObjjvbduaDxsPEh", - "EPDLKvbdKxqJrzuG", - "EOcKjvbdVAaprprZ", - "EObjjvbdEuxopMjF", - "DnbjjvbdyOTHwriD", - "EPDLKvbdrpVnibvG", - "EPDKjvbdkWWnDaww", - "DncLKvbdrXPkbiYq", - "DoDLKvbddxZssqez", - "EOcLKvbdHDkWJbJj", - "DncLKvbdEPCkLWcE", - "DnbkKvbdEXwkstTl", - "EObjjvbdqiAKEmOe", - "DncLKvbdjAQGaQGj", - "EPCjjvbdNeDtJJKd", - "EPCjjvbdvwMBWBVu", - "EPDKjvbdFejSOItR", - "EOcLKvbdNPwqWOHT", - "EPDKjvbdbsCjscia", - "EObkKvbdyYIiaoyk", - "DoDKjvbdLZQirzuG", - "EObjjvbdSLZGVGjs", - "DoCjjvbdAMgxsWzY", - "DoDLKvbdEObjjwCd", - "DnbkKvbdsPvOicWG", - "EPCkKvbdrJAKElne", - "EPCkKvbdauCGwjsh", - "DncLKvbdegkWRnQg", - "EPCkKvbdYpmEiNFR", - "DoDKjvbduaDxsPFI", - "DoCjjvbdcyxoxYqC", - "DoCkKvbdkMakzFHP", - "DnbjjvbdJbibqJbx", - "DnbkKvbdWWhxWDeH", - "DoCjjvbdssRsYzFD", - "DoDKjvbdpyPIHRDx", - "DncLKvbdwNWANDeN", - "DoDKjvbdJYUBglRQ", - "EObkKvbdXnRAYVVt", - "DoCjjvbdUWLpKTaR", - "DoDKjvbdTqROttgm", - "EPCkKvbdVqnXaeMD", - "EObjjvbdADRwiyiQ", - "DoDKjvbdlrZUyrci", - "EPDKjvbdvAdZSndh", - "DoCkKvbdzoQQeDLx", - "DnbkKvbdSQUGjFdX", - "EOcLKvbdqBJFAXIE", - "EObkKvbdSCEFLiZL", - "DnbjjvbdzoQQdcMY", - "DnbkKvbdpxngfqEY", - "DncLKvbdbsDLUEKB", - "DoCjjvbdXrlBMtOx", - "EObjjvbdKCjDQicY", - "DncLKvbdLrWlzUpz", - "EObjjvbdaaWEfQQX", - "EObjjvbdtlYWaTaX", - "DnbkKvbdMowpunGs", - "EObkKvbdSLYeuHKs", - "EObkKvbdTAEhhCOd", - "EPCkKvbdmSYtyrci", - "DncLKvbdYkqcsnLm", - "DoDLKvbdrylQTAgn", - "DncLKvbdJXtCIMRQ", - "EObkKvbdSBdElIyL", - "DoDLKvbdwygefYFS", - "DncKjvbdyXhibPzL", - "EPCjjvbduaDxsPFI", - "EObjjvbdZoNiFEzK", - "EPCjjvbdkNBkyeHP", - "EPCkKvbdWRnXadlD", - "DncLKvbdRWmdDLhD", - "DnbkKvbdmSYtzTDi", - "EOcKjvbdkVwODbXw", - "DncLKvbdQlxCZOUz", - "EObjjvbdbhlijfXY", - "EOcLKvbdXmqAXtut", - "EOcLKvbdmbKXXnnV", - "DoDKjvbdkHgMFfOL", - "EPCkKvbdfekymgHA", - "DoCjjvbdeKKRvUzn", - "DoDKjvbdkHfkefNk", - "DoCjjvbdyqPMiKXA", - "DnbjjvbdUQqOtuIN", - "EOcKjvbdEPCkKwDE", - "DoDLKvbdZRNFIleR", - "DnbjjvbdRacdlJZL", - "EOcLKvbdTukoitAq", - "EOcLKvbdZLrDtOMN", - "EOcLKvbdgKfzcGAE", - "EObjjvbdzjVQQESt", - "EOcLKvbdcIlijevx", - "EOcKjvbdGKdsDHmV", - "DncLKvbdKkBHvAJy", - "EOcKjvbdZMRctOLm", - "EPCkKvbdADRxKZiQ", - "EObjjvbdDwxLsssl", - "EPDLKvbdUxgszLPO", - "EPCkKvbdSQTfiedX", - "EPCjjvbdNeEUJIkE", - "DoDLKvbdpyPHfqDx", - "DnbkKvbdyOShXsJD", - "DncLKvbdLiBkpxAS", - "DoDKjvbdaaWEepQX", - "DoCjjvbdWSOYBeLc", - "EOcKjvbdLFegbAqV", - "EPDKjvbdffLzOGgA", - "EObkKvbdFkErbglu", - "DncLKvbdiZuFlROG", - "DncKjvbdegkWRnQg", - "DoDLKvbdQdDApRDr", - "EOcLKvbdeYZtURez", - "EObjjvbdrXQLcIxq", - "DoDLKvbdxZhGGXeS", - "DoDLKvbdGGKSOItR", - "EObjjvbdjhHLfFnL", - "EOcLKvbdUQpoUuHm", - "DoCkKvbdXrlBNUPY", - "DoDKjvbdJXtCIMRQ", - "DnbkKvbdZMSDsnLm", - "DncKjvbdCTBDUGWr", - "DncKjvbdbhlikGXY", - "DoDKjvbdXmqAYVWU", - "DnbjjvbdliDsqVRa", - "DnbkKvbdmajXYOnV", - "EObjjvbdJpyePGNe", - "DnbkKvbdCTAcUGXS", - "DoDLKvbdCDpBVjNG", - "EOcLKvbdxwhiaoyk", - "DoDKjvbdxVNFQyMO", - "EPCkKvbdVvhwvEEg", - "DnbkKvbdFWYoomJe", - "EOcKjvbdlrZUysEJ", - "EPDKjvbdqquKnKaN", - "DoCkKvbdTkunaVoJ", - "EOcLKvbdfHkVrOQg", - "EPDLKvbdiUzFWrUb", - "DoDLKvbdtAGqIABS", - "DoCkKvbdZRMdhmEq", - "DnbkKvbdNsUVfeVQ", - "EPDLKvbdqwPkbiZR", - "DoCkKvbdNUsSLNAX", - "DncKjvbdmpZxvKyC", - "EPCkKvbdLYqKSztf", - "EPDKjvbdZyEKODMS", - "EPDKjvbdNGbomPuL", - "DncKjvbdZMSDtNlN", - "EPCjjvbdTXjkmzjx", - "EObkKvbdBdQAvKMf", - "EOcLKvbdkySrTYgU", - "DnbkKvbdZoOIddzK", - "DoCkKvbdZMSDsmkm", - "EPCkKvbdCWzdIdpW", - "DncLKvbdBvzdIdov", - "DoCjjvbdaRfDHtFk", - "DnbkKvbdWeyZtAOs", - "DoDLKvbdnCJwYPOV", - "DoCjjvbdEYYLstUM", - "EOcLKvbdwtldqZMO", - "EPCjjvbdFVxoomKF", - "EObkKvbdyqPMhiwA", - "DoDLKvbdkxrrSxgU", - "DoCjjvbdeATqNYKG", - "DncLKvbdJKEAJpHE", - "DoCkKvbddndsLUTr", - "DnbjjvbdqFceUWBI", - "DoDLKvbdhkddOUby", - "DncKjvbdGKdrcIMu", - "EPCkKvbdelevflik", - "DoDKjvbdhaoDFWqR", - "DoCjjvbdYlSDsmlN", - "EPCjjvbdiZuGLpmf", - "EObkKvbdnCJvxPNu", - "DnbkKvbdhzUelRNf", - "DnbkKvbdZeYGzgiC", - "DoCkKvbdDnbkLWbd", - "DnbkKvbdnHFYMmfy", - "DoCjjvbdePEsKtTr", - "DnbjjvbdZQmEhleR", - "DnbkKvbdTkunaVoJ", - "DnbkKvbdFWZPpMjF", - "DoDKjvbdSwkMNzkY", - "EOcLKvbdwtldpyMO", - "EOcKjvbdhkdcmtby", - "DoCjjvbdNQXqWNfs", - "EPDKjvbdzjUpPdTU", - "DnbjjvbdqceJPnWB", - "EPDKjvbdUyHsyjoO", - "EPCkKvbdZshhxcsO", - "DncKjvbdqAiFAWgd", - "EObkKvbdgFkzOGgA", - "DncKjvbdmgFYNNgZ", - "DoDLKvbdDjHjWYKA", - "DnbjjvbdJbicRKCx", - "DnbkKvbdfNFwHMjL", - "EPCkKvbdWSNxBdlD", - "EPDLKvbdCJKbLJFj", - "EPDKjvbdEOcKkXDE", - "EPCkKvbdVrOYCElD", - "DnbjjvbdCIkBjhej", - "DoDLKvbddoFTKstS", - "DnbjjvbduDDVXVoP", - "EObkKvbdxwiKCPzL", - "DnbkKvbdZGvdAPTJ", - "DoDLKvbdBdPaVjNG", - "EOcKjvbdIHGzYwxH", - "DoCjjvbdGFjSNhsq", - "DnbjjvbdlYsSSxgU", - "EPCjjvbdqrUjnKaN", - "EOcLKvbdtvOXipsA", - "DoDLKvbdrounjCuf", - "DoCkKvbdFVyPomKF", - "EOcKjvbdNHCpNPtk", - "EPDLKvbdWeyZtAPT", - "EPDKjvbdjcLkQfuH", - "EOcLKvbdzHZMAMeX", - "DoCjjvbdUMWPBVni", - "EOcKjvbdHELWKBjK", - "DoDKjvbdMgComQUk", - "DnbkKvbdiGjDZWJu", - "DncKjvbdyqOmJKXA", - "DoDKjvbdVZITyjoO", - "DoCjjvbdzQoNJJwA", - "EOcLKvbdGAoQxizm", - "DoDKjvbdatagYKsh", - "EPDKjvbdSBceMJYk", - "DoDLKvbdMpYQvOHT", - "DncKjvbdiCOcFWpq", - "DoCjjvbdUGznLvvF", - "EPDLKvbdANIYrvyx", - "EPCjjvbdIwtCHkpp", - "EObkKvbdJSyBSmYM", - "EObkKvbdwuMdqYlO", - "EObjjvbdmuVZkKSG", - "DncLKvbdSPsfjFdX", - "DoDLKvbdSQUHJedX", - "DoDKjvbdiVZdwSUb", - "EPDLKvbdRjxfVGkT", - "EObjjvbdmpZyVkZC", - "DncLKvbdhzUelROG", - "EPCkKvbdxVMeRZMO", - "EOcKjvbdxxIiapZk", - "EOcKjvbdJSyBTNYM", - "EPDKjvbdMSXMzUpz", - "EObkKvbdJmADzHVB" }; - - public static void main(java.lang.String[] unused) { - try { - BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("bad.out")); - for (int i = 0; i < strings.length; i++) { - out.write(strings[i].getBytes()); - out.write("\n".getBytes()); - } - out.close(); - } catch (Exception e) { - System.out.println("Some exception occurred"); - } - } -} diff --git a/hotspot/test/runtime/7158800/InternTest.java b/hotspot/test/runtime/7158800/InternTest.java deleted file mode 100644 index d0cd1c024f2..00000000000 --- a/hotspot/test/runtime/7158800/InternTest.java +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7158800 - * @run shell/timeout=400 Test7158800.sh - * @summary This test performs poorly if alternate hashing isn't used for - * string table. - * The timeout is handled by the shell file (which kills the process) - */ -import java.util.*; -import java.io.*; - -public class InternTest { - public static void main (String args[]) throws Exception { - final String badStringsFilename = "badstrings.txt"; - - if (args.length == 0 || (!args[0].equals("bad") && !args[0].equals("normal"))) { - System.out.println("Usage: java InternTest [normal|bad]"); - System.exit(1); - } - - FileInputStream fstream = new FileInputStream(badStringsFilename); - DataInputStream in = new DataInputStream(fstream); - BufferedReader br = new BufferedReader(new InputStreamReader(in)); - String toIntern, toDiscard; - int count = 0; - long current = 0L; - long last = System.currentTimeMillis(); - - if (args[0].equals("bad")) { - while ((toIntern = br.readLine()) != null) { - toDiscard = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString()); - toIntern.intern(); - count++; - if (count % 10000 == 0 && count != 0) { - current = System.currentTimeMillis(); - System.out.println(new Date(current) + ": interned " + count + " 0-hash strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)"); - last = current; - } - } - } - if (args[0].equals("normal")) { - while ((toDiscard = br.readLine()) != null) { // do the same read from the file to try and make the test fair - toIntern = new String((new Integer((int)(Math.random() * Integer.MAX_VALUE))).toString()); - toIntern.intern(); - count++; - if (count % 10000 == 0 && count != 0) { - current = System.currentTimeMillis(); - System.out.println(new Date(current) + ": interned " + count + " normal strings - last 10000 took " + ((float)(current - last))/1000 + "s (" + ((float)(current - last))/10000000 + "s per String)"); - last = current; - } - } - } - in.close(); - } -} - - diff --git a/hotspot/test/runtime/7158800/Test7158800.sh b/hotspot/test/runtime/7158800/Test7158800.sh deleted file mode 100644 index 81fa7aca8a8..00000000000 --- a/hotspot/test/runtime/7158800/Test7158800.sh +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/sh -# -# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# -# -# Run test for InternTest.java -# - -if [ "${TESTSRC}" = "" ] -then TESTSRC=. -fi - -if [ "${TESTJAVA}" = "" ] -then - PARENT=`dirname \`which java\`` - TESTJAVA=`dirname ${PARENT}` - echo "TESTJAVA not set, selecting " ${TESTJAVA} - echo "If this is incorrect, try setting the variable manually." -fi - -if [ "${TESTCLASSES}" = "" ] -then - echo "TESTCLASSES not set. Test cannot execute. Failed." - exit 1 -fi - -# set platform-dependent variables -OS=`uname -s` -case "$OS" in - SunOS | Linux | Darwin ) - NULL=/dev/null - PS=":" - FS="/" - ;; - Windows_* ) - NULL=NUL - PS=";" - FS="\\" - ;; - CYGWIN_* ) - NULL=/dev/null - PS=";" - FS="/" - ;; - * ) - echo "Unrecognized system!" - exit 1; - ;; -esac - -JEMMYPATH=${CPAPPEND} -CLASSPATH=.${PS}${TESTCLASSES}${PS}${JEMMYPATH} ; export CLASSPATH - -THIS_DIR=`pwd` - -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -fullversion - -${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}InternTest.java - -cp ${TESTSRC}${FS}badstrings.txt . - -${TESTJAVA}${FS}bin${FS}java ${TESTVMOPTS} -XX:+PrintStringTableStatistics -XX:+TraceSafepointCleanupTime InternTest bad > test.out 2>&1 & -C_PID=$! - -sleep 60 - -ps | grep ${C_PID} | grep -v grep - -if [ $? = 0 ] -then - kill -9 ${C_PID} - echo "Test Failed" - exit 1 -else - echo "Test Passed" - exit 0 -fi diff --git a/hotspot/test/runtime/7158800/badstrings.txt b/hotspot/test/runtime/7158800/badstrings.txt deleted file mode 100644 index d7f76fb838e..00000000000 --- a/hotspot/test/runtime/7158800/badstrings.txt +++ /dev/null @@ -1,30001 +0,0 @@ -EOcLKvbddZyPxYpb -DncLKvbdPxmAGrqj -DoCjjvbdpxoIHQdY -EPCkKvbdqYoHfqEY -DnbkKvbdezvYdiUX -DnbjjvbdeEoRbXCj -EObkKvbdbsCkUEKB -EOcLKvbdnUtyjiqf -DncLKvbdRWnDcMHc -DoCkKvbdrSUkOLAm -DncLKvbdfNFwGmJk -EPDLKvbdvAdYroFI -DoDLKvbdiGibyViu -DncLKvbdYqNEhmFR -DoCkKvbdEARhlzXX -DncLKvbdSZjHsCvA -DncKjvbdqTsgRqkU -DnbjjvbdqAiFAXHd -EPDKjvbdGcjvJaij -DnbkKvbdwtldpxkn -DoDKjvbdYkrETnMN -EPCjjvbdbBWEfQQX -EPCjjvbduMXwAtBX -DncLKvbdbsCkTcia -DoCjjvbdczYpYZRC -EOcKjvbdFeiqmhsq -DoCkKvbdKCicQibx -EOcKjvbdZLrEUOLm -DoCjjvbdaNKbStmH -DoDKjvbdJbjDQjDY -EPCkKvbdemFwGmKL -EPDKjvbdZQleImEq -DncKjvbdZjShPfbG -DnbjjvbdqYnhHREY -DoCkKvbdaRfDIUGL -DoDKjvbdLrWlyuQz -DnbjjvbdZisHofaf -EObjjvbdhtydvrUb -DnbjjvbdRotHKGEX -EObjjvbdNeEThhkE -EPCjjvbdZtJJZESn -DoDKjvbdnPyxvLYb -EPDKjvbdeEoRbWbj -EOcLKvbdFxttaEXb -EObjjvbddwystRez -EPCjjvbdJpzEnenF -DnbkKvbdTppntuIN -EPCkKvbdTukpKUBR -DnbkKvbdhlFEOUcZ -EObkKvbdlhdUQuRa -DnbjjvbdkClKqHUg -EOcKjvbdqTtGqqkU -DncKjvbdtkwvaUBX -DoDKjvbdsQWOjCuf -DncLKvbdEKIJuwjA -DncKjvbdGLErcIMu -EOcLKvbdNPwpumfs -EObkKvbdnVUzLJrG -DoCkKvbdcTDKsdKB -DncKjvbdKRZdoFme -EOcLKvbdemFvgNKL -EPCkKvbdznopdblY -EPDLKvbdOYPVzdOU -DnbjjvbdsZlPsAhO -DoDLKvbdKCjDRKDY -DoCkKvbdhuZeXSVC -EPDKjvbdOStVgEtp -DncLKvbdvwMAvBWV -EPDKjvbdBcoaWJlf -EOcKjvbdZxdKODMS -DoCjjvbdbsCkTcjB -EOcLKvbdwWlAuaWV -DnbjjvbdFejRnJUR -DnbjjvbdmIdTqVSB -DnbkKvbdqBIeAWhE -DncKjvbdrMzJyMIJ -DoCkKvbdZGvdAOsJ -DncLKvbdjggLfFnL -DoCjjvbdYqNFJMdq -DoCkKvbdqZPHfqDx -DncLKvbdOEdThiLE -DoCkKvbdZirgpGaf -EPDLKvbdziuQPdSt -EObkKvbdKQyeOenF -DoDLKvbduaDySndh -DoCjjvbdVUNUGLvK -DncKjvbdAMhYrvzY -DnbkKvbdnQZxvKxb -EPCjjvbdBhjakJFj -DncLKvbdmfeYNNfy -DoDLKvbdjlbLydfo -DoDLKvbdpyPIGpcx -EOcLKvbdnVUzLJqf -DoCjjvbdmJETqVSB -DoDLKvbdJTZAsMxM -DoCkKvbdnQZxvLZC -DoDKjvbdACqwizJQ -DncKjvbdvBEZSoFI -DncKjvbdGckVjCJj -DncLKvbdiMFENtcZ -Dnbjjvbdjuvmcaww -DnbkKvbdZyEKNblS -DoCjjvbduMYXBUBX -DnbjjvbdFWYopNJe -DoDKjvbdelfXGljL -DnbjjvbdakLenmcA -EPDKjvbdfILWRmpg -EObjjvbdSLYeuHLT -DoCjjvbdMfbolotk -EPDLKvbdrRuKnKaN -EOcKjvbdyzdnRhIh -DoDLKvbdGAoRZJzm -DoCjjvbdhlFDnUcZ -EPDLKvbdmpZyVkYb -DncKjvbdTpqPUuIN -DncLKvbdHDjvJaij -EPDLKvbdYlRcsmkm -EPDLKvbdvlvAMdFN -DncKjvbdIsZArmYM -EOcLKvbdegjuqnQg -EOcLKvbdZQmFJNFR -DoCjjvbdZxdJmcMS -EPCkKvbdlZTSTYgU -DoDKjvbdqceJPnWB -DncLKvbdVgwuxGxz -DncKjvbdDnbkLXDE -EPDLKvbdatbHYKsh -DncKjvbdEzsqFLbi -EPDLKvbdnVVZkKRf -EOcKjvbdKeegbBQu -EPCkKvbdKfGHaaRV -EPDKjvbdmIctRVRa -EPCjjvbdRMxBxnUz -DnbjjvbdJYTbILpp -EPCkKvbdTAEiHbPE -EOcLKvbdfelZnGgA -DoCjjvbdOStWGeUp -EOcLKvbdemGXHNJk -DoDKjvbdYTMAmUOx -EPCkKvbdpyOhGpcx -EPCkKvbdAMgxsWzY -DnbjjvbdYkrETnMN -EPDLKvbdUQqPUtgm -DncKjvbdehKurNqH -DoCjjvbdZMSETnLm -DoDKjvbdIHGyyXwg -EObjjvbdXGYzUAPT -DoCjjvbdhbPCeWqR -DoCkKvbdKNADzGuB -DnbjjvbdFeirOJTq -DncLKvbdaRecHtFk -DnbkKvbdzoPpeClY -EObkKvbdZRMeJMeR -DnbjjvbdYfvdAPSi -DncLKvbdJcKCqJcY -EOcLKvbdqvokbhyR -DoDLKvbdrRuLNjaN -DoCjjvbdTlWPBWOi -DoCkKvbdjvWnEBxX -DoDLKvbdTkunaVoJ -DoCkKvbdQZNAHTSK -EObjjvbdqwPkbhyR -EOcLKvbdNHDPlpUk -DncLKvbdIHHZxxYH -DncLKvbdtkxXAtAw -DncLKvbdSCEFMJZL -DnbjjvbdZQmEhldq -DoCjjvbdNGbolotk -DnbjjvbdnCKWwnmu -DncLKvbdzHZMANEw -DoDKjvbdmttykJrG -DnbkKvbdlrZUzSci -EPDKjvbdSKyGVHKs -DoCjjvbdKVuGEFGi -EPCjjvbdCIkBkIej -DncLKvbdzHZMAMeX -DnbkKvbdaSFbgsek -DncLKvbdHDjujBij -DoDKjvbdGZVUaDwb -DnbjjvbdZnnJFEzK -DoCkKvbdtcDUwWOo -DoCkKvbdlBMoNALA -EOcKjvbdNsUWHFUp -DoDLKvbdVUNUFlVj -DnbkKvbdhkdcnUcZ -DncLKvbdLiBkqYAS -EOcKjvbdzoPpdcLx -EPDKjvbdijGIJmXr -EOcKjvbdZisHofaf -DoDLKvbdeOdrkUUS -DoDLKvbdnPyxvKxb -EPDKjvbdIxUBhMRQ -DncLKvbdlhctRUqa -DoDLKvbdmgFXlnGy -DncKjvbdCJKbKiGK -EOcLKvbddndrjtUS -DnbjjvbdkDLjqGuH -DncKjvbdmIcsptqa -DoCkKvbdvvlAvBWV -EObjjvbdjblLQftg -DnbjjvbdCEQBWKMf -DnbjjvbdBdPaVilf -DoCkKvbdZxcjODLr -DoCkKvbdEObjjwCd -EPDKjvbdyTNhlqbH -EPCkKvbdUMVoAvPJ -DncKjvbdUxhUZjoO -DncKjvbdqqtjmkAm -DncKjvbdKfGICBRV -EPCjjvbdVrOXaeLc -EPDLKvbdwXLaWBWV -EPCkKvbdjblKqHUg -DnbjjvbduDCuWuoP -EPDKjvbdNGbpMouL -EObjjvbdBcoaVjNG -DncLKvbdrWpMDIxq -DncLKvbdhaoCdwRR -DnbkKvbdFxtuBDwb -DncKjvbdIjEAKPgE -EOcLKvbduCbuXVoP -DoDKjvbdZtIiZDsO -DnbjjvbdEztRElCi -DncLKvbdxmsHwsJD -DnbjjvbdRbEElIxk -DoDKjvbdWHwvXgYz -EOcKjvbdQlwbYnUz -EOcLKvbdVTltFkuj -DncKjvbdliETptqa -DnbkKvbddoErjtTr -DoCkKvbdgPazvdXh -DncKjvbdySmhlqag -DoCjjvbdbPgHDkzd -DoCkKvbdFWZPomKF -EObjjvbdssSSxydc -EObjjvbdzQnliJwA -EObkKvbdKCjCpibx -EPCjjvbdpyOhHREY -DncLKvbddjJqutzn -EObkKvbdBdQAujMf -EPCkKvbdLAjflbXq -DncLKvbdLBLGlaxR -DoDLKvbdrpWPJbuf -DoCjjvbdEKHiuxKA -DoCjjvbdXsMAlsnx -EObkKvbdptTgSSLU -DoDKjvbdnHFXmNfy -DncKjvbdCJKbKhej -EPCjjvbdhlEdOUby -EOcKjvbdKWUfEFGi -DoDKjvbdZQmFJMdq -EPCjjvbdiGjDZWKV -EObkKvbdVAbQrprZ -DoDKjvbdfekzNgHA -DoDLKvbdnHEwlmgZ -DncKjvbdwzHeexEr -DoCjjvbdmpZxujyC -EPDKjvbdwMvAMcdm -DoCjjvbdfHkVrNqH -EPCkKvbdYzbfRiuy -EPCkKvbdZtIiZDrn -DnbjjvbdjvWnDbYX -DoCjjvbdOStVgEtp -EPDLKvbdZMSETmlN -EPDKjvbdBhjajhej -EPCjjvbddoFTLUUS -DnbkKvbdsQVoJcWG -EPCjjvbdrEFJQNvB -DoCjjvbdMpYRWOGs -EOcLKvbdZirgpHBf -EPDLKvbdyOTIXsJD -DoCkKvbdKRZdnfNe -DnbjjvbdbBWFFoow -EPCjjvbdgFlZnHHA -DnbkKvbdGGJrOIsq -DoDLKvbduDCtwWPP -EObjjvbdNddUIhjd -DnbjjvbdxsNiMqag -EObjjvbddeOrCWbj -EObjjvbdPxmAGsRj -EOcLKvbddeOrCXDK -DoDLKvbddeOrBwCj -DoCjjvbdVqnYCElD -DnbkKvbdUyIUZjoO -EObjjvbdeFOrCXDK -EObkKvbdVrNxCFLc -EObjjvbdTfzmkwWF -EOcKjvbdIHGzZYYH -EPDKjvbdtbbuXWPP -DoCjjvbdZisIQHBf -EObjjvbdbsCkUDjB -EPCkKvbdVwJXudFH -EPDKjvbdrouoKDVf -EPCkKvbdFyVVBEYC -DncLKvbdZnnIeEzK -EPDLKvbdxVNFQxkn -DoDKjvbdpxnggRDx -DoDLKvbdqZOgfpcx -DncKjvbdCIjakJGK -EPCkKvbdCJLBjhej -DoDLKvbdnPzYvKxb -EOcKjvbdqTsgSRkU -EOcLKvbdLBLGlaxR -DoDLKvbdcbTMrAUN -DncLKvbdzitoodSt -DoDKjvbdJvUfDdfi -EOcLKvbdHDjvKCJj -EPCkKvbdeOeTKssr -DnbkKvbdlYrqsYft -DncLKvbdiiehKMxS -DncKjvbdURQoVUhN -DnbkKvbduMYXBUAw -DoDLKvbdSPtHJfEX -EObkKvbdqBJFAWgd -EOcKjvbdFpATWgFy -DoDLKvbdBsBDTfXS -DncKjvbdjhHLfFmk -DoCjjvbdCJKakIfK -DnbkKvbddoFSjtTr -EObkKvbdANIYsWzY -EObjjvbdCTAbtFvr -EObjjvbdrRtkOLAm -DnbkKvbdkxsSTYgU -DoCjjvbdnBiwXnmu -EObjjvbdwtmEqYlO -EPDKjvbdrylQTAhO -DoDLKvbdtbbtvvOo -EPCjjvbdZLrETmlN -EPDLKvbdWXJYWDdg -DoCkKvbdKQzFOfOF -EPCjjvbdwzIFfXeS -DncKjvbdRjyFuHLT -EPDLKvbdULunaWPJ -DncKjvbdUxhTykOn -DnbkKvbdJcKCqKDY -EPDLKvbdcbSmSATm -DnbkKvbdegjurNqH -EPDKjvbdZjTIQGbG -EPCjjvbdiLddNuCy -DoCjjvbdZQldiNEq -EOcLKvbdakMGPODA -EObjjvbdnHEwlmgZ -EOcLKvbdBsAcUGXS -EPCkKvbdiVZdwSUb -EOcLKvbddCTNSAUN -DnbkKvbdEXxMUUUM -DncKjvbdYpldiMeR -DoDKjvbdNddTiIjd -DoDLKvbdZLqdUNlN -EPCkKvbdiBncFWpq -DncLKvbdiCPDEvqR -EOcKjvbdUyHszKoO -DncKjvbdhtydvqtb -EPCjjvbdpxoHgQcx -EObkKvbdkWWnDaxX -DnbjjvbdBhkBkJFj -DoCkKvbdRacdkhyL -EOcLKvbdZjTHpHCG -EPCkKvbdMowqWOGs -DncLKvbdegjurNpg -EObjjvbdfMfWfmKL -EPDLKvbdZirgpGaf -DoDLKvbdiZuFlQnG -DncLKvbdFxuVAcxC -EObkKvbdZisHofaf -EOcKjvbdJSyBSmYM -EPDLKvbdVYgtZkPO -EOcKjvbdRbEFMJYk -DncLKvbdrEFIonWB -DncKjvbdKDJbqJcY -EOcLKvbdhfjCxuiu -EObjjvbdLLAhWAKZ -DoCkKvbdRXNcblID -DoDLKvbdcbSmSATm -EOcLKvbdwWlAvAuu -EObkKvbdiBnbdvpq -DoCkKvbdNQXpumgT -DncLKvbdkVwOECYX -DnbkKvbdfoazwDxI -DoDLKvbdbBWFFpPw -DoDLKvbdvBDxsPEh -EPDKjvbdJqZdoFme -DoDLKvbdIryArmXl -EPCjjvbdANIZSwZx -EPCkKvbdVhYVxGxz -DncKjvbdLAjgNCYR -DncKjvbdxxIjCQZk -DncKjvbdbiNKKewY -EPCjjvbdlrZVZsEJ -EPDKjvbdIryAsMwl -DoCkKvbdtAHRIAAr -EPDKjvbdJmAEZfuB -EPCkKvbdZjSgogBf -DoDLKvbdOXnuzcnU -DnbkKvbdehKvRnQg -EObjjvbdZyDimbkr -DoDKjvbdmajWwoOV -EOcKjvbdkMalZeHP -EOcKjvbdIjEAJpHE -EPCkKvbdDihKVxKA -DncKjvbdNddUIiKd -EObjjvbdqdFIpOWB -DoCkKvbdxnShXsJD -DoDLKvbdjmBkzEfo -EOcLKvbdatagYLTh -DoCjjvbdVhYVxHYz -DnbjjvbdJbjDRKDY -EPCjjvbdLBLHNCYR -DnbjjvbdnGeYNOGy -EOcLKvbdUsmTekvK -EPCjjvbdtkxXBTaX -EPCjjvbdzoPqFCkx -DncKjvbdCIjbKhej -DncKjvbdZLqdTmkm -DoDKjvbdsPunicVf -EOcKjvbdmgFXmNgZ -EObkKvbdiMFENuCy -DoDKjvbdhanbeXRR -EObkKvbdACqwiyhp -DncKjvbdZisIQHBf -EPCjjvbdgQBzwDwh -DnbjjvbdyYJJaoyk -DoDKjvbdxUldqZMO -EObkKvbdkClLQgVH -EPCjjvbdZQldiMeR -EPDLKvbdZyEKOClS -EPDLKvbdcIlikFvx -DoDKjvbdrzMQTBHn -DnbjjvbdVYgtZkPO -DoDLKvbdHEKuiajK -EPCkKvbdczZQXxqC -DoDKjvbdrDdiQNua -DncLKvbdcImKLGWx -DoCjjvbdVYgtZkPO -EPDLKvbdZnnIeFZj -EPDKjvbdMIakqYAS -DoCkKvbdSLYfUgLT -EPDLKvbdiCObdvpq -DnbjjvbdRpUHKFcw -DoDLKvbdIHHZyYXg -EPCjjvbdypoMhiwA -DnbkKvbdCEPaVjMf -DnbkKvbderAvzlDP -DnbkKvbdZQleImFR -EOcKjvbdKRZdneme -DoDLKvbdiBnbeXQq -DncLKvbdEPDKjvcE -EOcLKvbdauCGwkTh -DncLKvbdEvZQPmJe -EPCkKvbdURQnuVIN -DncLKvbdegjvSOQg -EPCjjvbdKaKgMawq -DnbkKvbdRzKISbvA -DncLKvbdiLdcnUcZ -EPDLKvbdkDMKpfuH -DoDLKvbdRbDdkhyL -DnbjjvbdDwxMUUTl -DnbkKvbdrpWPKCuf -DnbkKvbdNVSqjmAX -DoDKjvbdRbDeMIxk -EOcLKvbdcyxpXyRC -DncLKvbdRMwbYnUz -EObjjvbdqlzJxlHi -DoCkKvbdJYUCIMQp -DncLKvbdLZQjSzuG -EOcKjvbdxVNEqYkn -DnbkKvbdZoOIeFZj -DoCjjvbdBraCtFwS -EOcLKvbdliDsqVSB -EPCkKvbdeATqNXif -DncLKvbdkMbLydgP -EObjjvbdZxdJmbkr -DoCjjvbdraellHLZ -EObkKvbduDCuWvPP -DoCkKvbdpstGrSLU -DoCjjvbdLGFgbBQu -DnbkKvbdhtzFWquC -EObjjvbdoAKztHdO -EPDLKvbdatafxKtI -EPDKjvbdkWXNcaww -DoCkKvbdwkXEHzzG -EObkKvbdmgEwmNgZ -DncKjvbdBiLCLJFj -DoCjjvbdeOdsKssr -EOcLKvbdfILWSORH -EObkKvbdCDpAujMf -EPDKjvbdKDKDQibx -DoDKjvbdVUMtGLuj -EObkKvbdrXQMCiYq -DncKjvbdePEsLTtS -DncLKvbdDxYLtUTl -EPCkKvbdGYuVBEYC -DncLKvbdNeEUIiKd -EPCkKvbdpxoIHRDx -EObjjvbdFkEsDHlu -EObjjvbdssSSxzFD -DoCkKvbdUtNTfMVj -DnbjjvbdJcKDRKDY -DncKjvbdqiAKEmOe -DoDKjvbdtlXwAtBX -DnbkKvbdxmsIYTIc -EObkKvbdLrXMzUpz -DoCjjvbdkxsSSxft -DncKjvbdQlwaxnUz -EObkKvbdjhGlFfNk -EPCkKvbdxsNhmRag -DoDLKvbdMfcPmQUk -DoDKjvbdQvnEDLhD -EObjjvbdVgxVxHYz -DoDLKvbdlrYtyrdJ -DoCjjvbdezvYeIsw -DncLKvbdNddTiIjd -EPDLKvbdGGJrNiUR -EPDLKvbdRzJhTDWA -EPCjjvbdvvkaWBVu -EOcKjvbdRXNdCkgc -EOcKjvbdQZNAHTSK -EPCkKvbdsCGNLfkZ -EOcLKvbdDwwktTsl -EOcLKvbdqlzJyLgi -EOcLKvbdxsNiMqag -EOcLKvbdhzVFlROG -EOcKjvbdEztRFMCi -DnbkKvbdqiAJdmPF -EPDLKvbdjcMKqGtg -EObkKvbdTlWOaWOi -EPDLKvbdURRPUuHm -DoDKjvbdelfWgNKL -EOcLKvbdGAnqZJzm -EObjjvbdGZUuAdXb -DoDLKvbduLwwAtAw -DoCjjvbdZjTIQGbG -EPCjjvbdRNXbYnUz -EPDLKvbdiLeENtby -EObjjvbdMowpunGs -EOcKjvbdbiNJjevx -DoDKjvbdEYYLstTl -DoDLKvbdqUTfrRjt -DoDKjvbdbsCkUEJa -DoDKjvbdXsMBNUPY -EPCjjvbdRNXaxnUz -DoDLKvbdNGcQNQUk -DnbjjvbdEARiMywX -EPDKjvbdSKxfUfkT -DncKjvbdhtyeXRtb -DncKjvbdZLqcsnLm -EObkKvbdZnmheEzK -EObjjvbdtbcUvuno -DnbjjvbdrzMQTBHn -DnbjjvbdDwwktTsl -EPDKjvbdkxsSTYgU -DoDKjvbdIryArlxM -DoDKjvbdnBivxOnV -DoDKjvbdeATplwif -EOcLKvbdKeegbApu -EPCjjvbdMgDQMotk -DoCjjvbduCbtwWOo -DnbkKvbdyNsHwrhc -DnbkKvbdtvNxJpsA -EOcLKvbdqAheAWgd -DoCkKvbdURQoUtgm -EOcKjvbdqceIpOWB -DoCkKvbdVwIwudFH -DnbkKvbdbLMFnmcA -EOcLKvbdZjTHpHBf -EOcKjvbdRXNdCkhD -EPDLKvbdiHJcZViu -DoCjjvbdxxIjCPzL -DnbkKvbdBcpBWJmG -EPCkKvbdZyEKOCkr -EPDKjvbdOTUWHFVQ -DoCjjvbdIGgZxwwg -EPDLKvbdFjeSbhMu -EPDLKvbdhgKCxvJu -EOcLKvbdNsUWGdtp -EPDKjvbduVnXipsA -DncLKvbdGYuVBEXb -EPDLKvbdZtIhyESn -DoDKjvbdZxdJmcLr -DoCjjvbdUsltGLuj -DoDKjvbdDoDLKvbd -DncLKvbdrDdhpNvB -EPDLKvbdKCjDRJbx -DoDLKvbdxLWdHzyf -EObkKvbdrzMQTAhO -EOcLKvbdOFDtJJKd -EPCkKvbdrSVKmjaN -EOcKjvbdWWiYVdEg -EOcKjvbdWWhwvDdg -DncKjvbdpstHRqjt -EPCkKvbdKWVFceGi -DoCkKvbdZjShPfbG -DoCkKvbdSxKlNzkY -EPDLKvbdIwtCHkqQ -EOcKjvbdsCGNLgLZ -DncKjvbdzaAOfgCM -DoDLKvbdxmrhYSiD -DncLKvbdfMfWgMjL -EPDKjvbdqFdEsuaI -EOcLKvbdiLeDnUcZ -DoCjjvbdKVuFceHJ -DoCjjvbdfekzNgHA -EOcKjvbdOFEThiLE -EPDLKvbdqceJPnWB -DoDLKvbduCbtwWOo -DncKjvbdTqROtuIN -DncKjvbdpedFUWBI -DoDLKvbdrEFJQNua -DoDLKvbdyXhjCPyk -EPCkKvbdJYUBhLqQ -EPCkKvbdtcCuXVno -DoDLKvbdZLrEUOLm -EPCkKvbdpstGrRjt -DncLKvbddePSCXCj -EObkKvbdauCHXjsh -DoDLKvbdkHfkefNk -EObjjvbdMRwMzUpz -EObjjvbdaMkCTVNH -DoCkKvbdGGJrNhtR -EPDLKvbdvBDxrneI -EPDLKvbdIHHZxwxH -EOcLKvbdrJAJdmPF -EOcKjvbdGZUuAdXb -EOcLKvbdbUbHYLUI -DnbjjvbdJzofYEAN -EPDKjvbdFxtuBDxC -DnbkKvbdQvnDbkgc -EPDKjvbdJmADzGta -DoDKjvbdZRMdhleR -DnbkKvbdsrqsZZeD -EObkKvbdrovPJbuf -EPCjjvbddeOqbXCj -EObjjvbdtcDVXVoP -DncKjvbdMfbpNQVL -DoCkKvbdhbPCeXQq -DoCkKvbdNHComQVL -EObjjvbdvBDxroFI -EPCjjvbdnBivwoNu -EObjjvbdbhljKewY -EPDKjvbdZyDimcMS -EObkKvbdWSOXbElD -EOcKjvbdTfznMXVe -EPCjjvbdZtJJYcsO -DoCjjvbdRjxfVHLT -DoCkKvbdVTltGMVj -DncKjvbdYfwEAOri -DncKjvbdYkrEUOMN -EObkKvbdqGEEsuaI -DncLKvbdjJfHimXr -EPDLKvbddndsLUTr -DnbkKvbdqBJFAWhE -EPDLKvbdEOcKjwDE -EPCkKvbdtvOYJqTA -DncLKvbdkyTRsZHU -DoCjjvbdTppnuVIN -DncLKvbdwyhFeweS -DncKjvbdsBelkgKy -DoCjjvbdKDKCqJcY -DoCjjvbdkClKqHVH -DoCjjvbdcTCjtDia -EPDLKvbdUVkpJtAq -EPDLKvbdRyjITCvA -DnbjjvbdJuuFcdgJ -DoDKjvbdrJAJdmOe -DncKjvbdJcJbqKCx -DoDLKvbdJcJbqJcY -DoDKjvbdeEoSCXDK -DoDLKvbdSwjlNzkY -EObjjvbdzitopDrt -DoCkKvbdKWVGEEgJ -DncKjvbdpssfqrKt -EOcLKvbdUMWPBVoJ -DncKjvbdyzdmrIIh -EPCjjvbdxUldqZLn -DoDLKvbdySnImRbH -DoCjjvbdGdKvJaij -DoCkKvbdxZgeewdr -EObkKvbdiLddNuDZ -DnbjjvbdSCDdkiZL -DncKjvbdznpREcMY -EOcLKvbdaRebhTfL -DnbjjvbdZQldiMdq -EPCjjvbdbrbjtEKB -EOcKjvbdEARiMzXX -DoDLKvbdXrkaNTnx -EPCkKvbdQZNAHTRj -DoDLKvbdEzspeLcJ -EPCjjvbduVnYKRTA -EObjjvbdJXtBhMQp -EPDKjvbdeOdrjssr -EPCjjvbdLqwMytpz -EPDKjvbdUMVoBVoJ -DncKjvbdRpUGifDw -EPDLKvbdZyDinDLr -DnbkKvbdNrsufeVQ -EPCkKvbdZMSDtNlN -EPCkKvbdySnJNSCH -EPCjjvbdfMevfljL -DncLKvbdXsMBNTnx -DnbkKvbdpxoHfqDx -DncLKvbdUQpntthN -DncKjvbdIsZArlwl -DoDLKvbdZGwEAOsJ -EOcKjvbdVvhwvDdg -EOcLKvbduWNxJqTA -EPCjjvbdHEKvJaij -DoDKjvbdrpWOjCuf -DncLKvbdrpWOjDVf -DoCjjvbdIHGzYwwg -DoDLKvbdpxoIGqEY -DoDLKvbdJcJbqKDY -DoCjjvbdRWmdClHc -EPCjjvbdFWYopNJe -DncKjvbdmfdwlmfy -DoCkKvbdxUleQxlO -EObjjvbdnGdxMnGy -EPCjjvbdvvlAvBVu -DncLKvbddndsKssr -EObjjvbdZMRcsnLm -EOcKjvbdFxttaEXb -DncKjvbdVUNTfMVj -EOcLKvbdNrtWHFUp -DoDKjvbdwuMdqYlO -EPDLKvbdrXPkbhxq -EObjjvbdrEFIpNua -EObjjvbdziuQQDrt -EOcLKvbdqYoIGpcx -DnbjjvbdsQVoJcVf -EObkKvbdkDMKpgUg -EObjjvbdvBDyTPFI -DncKjvbduCbuWvOo -EPCjjvbdkVvnECYX -DncLKvbdZGvdAOri -DoCkKvbdrXPlDJZR -EOcLKvbduCcVWvOo -DoDKjvbdCEPaWJlf -EPDKjvbddoErjssr -DncKjvbdACqxKZiQ -EPCjjvbdUVlPitAq -EPDKjvbdjJfHjMxS -EObkKvbdAMhYsWzY -DoDKjvbdnBivxOmu -EOcLKvbdbiNKKfXY -EPDKjvbdYqMeIleR -EObkKvbdJmADygUa -EObjjvbdEPDLLWcE -EPCjjvbdrXPkcIxq -EOcLKvbdliDtQtqa -DoCjjvbdmoyxujyC -EPDLKvbddoFTLTsr -EOcLKvbdCWzdJEpW -DnbjjvbdrEEhpOWB -DoDKjvbdZLrDtNkm -EOcLKvbdLFfHbAqV -EOcKjvbdmttzLKSG -EOcLKvbdmbJvwoOV -EOcKjvbdUaCQrqSZ -DnbjjvbdmgExMnGy -EPDKjvbddndrkUUS -EObkKvbdDwwkstTl -DoCkKvbdcJMjLFwY -DnbjjvbdaNLBruMg -DoDLKvbdQYmAHTRj -DnbkKvbdsQWOicWG -EObkKvbdMRwMzUpz -DoDLKvbdZshiZDrn -EPDLKvbdnPzYujxb -EOcKjvbdCEQAujMf -EPDLKvbdKefHbApu -DoDLKvbdYpldiNFR -DoCkKvbdFWZQQNJe -DncLKvbdznpQeCkx -EOcKjvbdnQZxvKxb -DoCkKvbdVBBprpqy -DnbkKvbdZirhPfaf -DnbkKvbdegjvSNqH -EOcLKvbdqdEiPnWB -EObjjvbdBhkCKiGK -EObjjvbdxZgfGYFS -DnbjjvbdNQYQumgT -EPCjjvbdxsNhlrBg -DoCkKvbdQdDApRDr -DoCkKvbdxxIiaoyk -EPDKjvbdFeirNhtR -DoCjjvbdegjvSOQg -EObkKvbdqcdiQNvB -DncLKvbdiMEdNtcZ -DncLKvbdTqRPUthN -EPCkKvbdwygeexFS -DoDKjvbdyTOJMrBg -DncLKvbdeEoRavbj -EPCjjvbdtbcUvvOo -EObjjvbdKCicRJcY -EObjjvbdZyEKODMS -DnbjjvbdmJDtQtrB -DncLKvbdEARhlyvw -DnbjjvbdIxTbILqQ -EOcLKvbdwygefYFS -DoCjjvbdznoqFCkx -DoCjjvbdRpUGjGDw -DncKjvbdhzVGMQnG -EPCjjvbdhkeDnVCy -EObkKvbdOEdUIiKd -DncKjvbdrDeIomua -DncLKvbdiHJbxuiu -EPDKjvbddxZstRez -EPDLKvbdmSYuZrdJ -EObkKvbdVUNUFkvK -EPDLKvbdNeEUJIjd -DoCkKvbdiMEdNuCy -DoDLKvbdRDcApQcr -EPCjjvbdTlVoBVoJ -EObjjvbdLBKgNBwq -EPCkKvbdsCFllHKy -EObjjvbdnVUzLJqf -DoDKjvbdqrVLNkBN -DoCkKvbdqFcdtWBI -DncLKvbdbVCGxLTh -EOcLKvbdeFPSCXCj -EOcLKvbdRpTgKFdX -EObjjvbdznpQeDLx -EOcKjvbdjvXNcaxX -DnbjjvbdHDkWJbJj -DncKjvbdhkeENuDZ -DnbkKvbdnUtyjjSG -DoDKjvbdSQUHJfDw -DncKjvbdbUbHYLUI -EOcLKvbdNsTvGduQ -EPDLKvbdSZigsCvA -DncKjvbdMfcPlpUk -DoDLKvbdxrnIlrBg -DncKjvbdiLdcnVCy -EPCjjvbdmfeYNOHZ -DoCkKvbdjvWmcaxX -DoDKjvbdbUbHXkUI -DncKjvbdBhkBjiFj -DoDLKvbdNHColpVL -EOcKjvbdrykosAhO -DncLKvbdqGDeUVaI -DnbkKvbdhgJcZViu -DnbjjvbduLxXAtBX -EPCjjvbdYpleJNFR -EPDLKvbdQvmdClHc -DnbjjvbdJYTbIMRQ -DncLKvbdznpRFDMY -EOcLKvbdZnmiFEyj -DnbkKvbdrRuLOLAm -EObkKvbdhkeEOUby -DncLKvbdYlSEUOLm -DoCjjvbdhkdcmtby -DncLKvbdddnrCXDK -DoDLKvbdKaLHNCYR -EOcKjvbdcyxpYZQb -EPDLKvbdACqwjZhp -DoCkKvbdBsBDTevr -EObkKvbdeKJqvUzn -EObkKvbdcImJkGWx -DncLKvbdYSlAltOx -DncLKvbdlrYtyrdJ -EObkKvbdKxqJrztf -EOcKjvbdsQWPJcVf -DoDKjvbdkySqrxgU -EObjjvbdeEoRbXCj -EOcKjvbdHDkVjBij -DoDLKvbdCTBCsfXS -DoCjjvbdKCjDQibx -DoCjjvbdlhdTqUrB -DoDKjvbdTulQKTaR -DoCkKvbdRjxetfkT -EPCjjvbdEuyQQNKF -EPCjjvbdDoDKkXDE -DoCjjvbdsQWPJbuf -DoDKjvbdhuZdvqtb -EPDLKvbdiHKCyWJu -EPDLKvbdLFegaaQu -DoCjjvbdqZPHgRDx -DncKjvbdUWMPjUAq -DoDLKvbdTYKkmzjx -DoDKjvbdegjvSOQg -DnbkKvbdUtNTekvK -EObkKvbdNsTvGeVQ -DoDLKvbdfNFvgMjL -EOcLKvbdZQmEiNEq -EPDKjvbdBraDTfWr -EPDKjvbdNGcQNQVL -EPDLKvbdZyEKODMS -EOcKjvbdBvzdIdpW -EPCjjvbdACqwiyiQ -DoCjjvbddePRawCj -EPDKjvbdWWiXucdg -DoDKjvbdWexzUAPT -DnbjjvbdwXMBWBWV -EOcLKvbdUyHszLOn -EPCkKvbdOYOuzcnU -EPCkKvbdhancEwQq -DnbkKvbdjggLefOL -EPCkKvbdFjdsDIMu -DoDKjvbdrSUjmkBN -DoDLKvbdZjTIQGaf -DoDKjvbdMgDPmPtk -EPDLKvbdWRmwbFMD -DoCkKvbdzROmJKXA -DnbkKvbdrDdiQNvB -DnbjjvbduDCtwVoP -EOcLKvbdCIjbLJFj -EPDKjvbdXrkaMsnx -EPDKjvbdVhXvXfxz -DncKjvbdhbPDEwRR -DoCkKvbdpxoHgQcx -DoCkKvbduMXwBUBX -EObjjvbdNeEThhjd -DoCjjvbdirzhrkJz -DoDLKvbdaMkCTUlg -DncLKvbdWRnYBeLc -DnbjjvbdGBPRZJzm -EOcLKvbdeOeSjstS -DoDLKvbdmIctRVSB -DoCjjvbdZxdJnDMS -DoCkKvbdRpTgKFcw -DncLKvbdTukojTaR -DnbjjvbdKRZdoFme -DnbkKvbdURQoVUhN -DoDLKvbdyYJKBozL -EObkKvbdfNFwHMjL -DoDLKvbdZisIQHBf -EObkKvbdqFcdsuaI -DncLKvbdzoPqFDLx -DoDKjvbdSKxeuHLT -EPDKjvbdsBemLfjy -DoCjjvbdJbjCqJcY -DoCjjvbdNPxRVnGs -DncLKvbdGcjvJbKK -EOcKjvbdrWpMDIxq -EOcLKvbdQdDApQcr -DoDKjvbdZMRdTnLm -EOcLKvbddxZssrFz -EObjjvbdUtNTfLuj -EPCjjvbdLLBIWAKZ -DoCkKvbdgFlZmfgA -EPCjjvbdUVkoitAq -DoDKjvbdDncKjvcE -DoDLKvbdRpUHJfEX -EPDKjvbdLqvlzVQz -EPDKjvbdZMRdUOLm -EOcLKvbdCJLBkIfK -DncKjvbdaSFbhUFk -EPDLKvbdZoNheEzK -DncKjvbdUVlPjUAq -DnbkKvbdKNADyfuB -EObkKvbdZdwfzghb -EPDLKvbdZtIhxcrn -EObkKvbdGckViajK -DncLKvbdFfJqmiUR -DncKjvbdKWUfDdgJ -DoDKjvbdMtrqjmAX -EOcLKvbdsQWPKDVf -DoCjjvbdwtleRZMO -EObjjvbduaDxsPEh -EPDLKvbdKxqJrzuG -EOcKjvbdVAaprprZ -EObjjvbdEuxopMjF -DnbjjvbdyOTHwriD -EPDLKvbdrpVnibvG -EPDKjvbdkWWnDaww -DncLKvbdrXPkbiYq -DoDLKvbddxZssqez -EOcLKvbdHDkWJbJj -DncLKvbdEPCkLWcE -DnbkKvbdEXwkstTl -EObjjvbdqiAKEmOe -DncLKvbdjAQGaQGj -EPCjjvbdNeDtJJKd -EPCjjvbdvwMBWBVu -EPDKjvbdFejSOItR -EOcLKvbdNPwqWOHT -EPDKjvbdbsCjscia -EObkKvbdyYIiaoyk -DoDKjvbdLZQirzuG -EObjjvbdSLZGVGjs -DoCjjvbdAMgxsWzY -DoDLKvbdEObjjwCd -DnbkKvbdsPvOicWG -EPCkKvbdrJAKElne -EPCkKvbdauCGwjsh -DncLKvbdegkWRnQg -EPCkKvbdYpmEiNFR -DoDKjvbduaDxsPFI -DoCjjvbdcyxoxYqC -DoCkKvbdkMakzFHP -DnbjjvbdJbibqJbx -DnbkKvbdWWhxWDeH -DoCjjvbdssRsYzFD -DoDKjvbdpyPIHRDx -DncLKvbdwNWANDeN -DoDKjvbdJYUBglRQ -EObkKvbdXnRAYVVt -DoCjjvbdUWLpKTaR -DoDKjvbdTqROttgm -EPCkKvbdVqnXaeMD -EObjjvbdADRwiyiQ -DoDKjvbdlrZUyrci -EPDKjvbdvAdZSndh -DoCkKvbdzoQQeDLx -DnbkKvbdSQUGjFdX -EOcLKvbdqBJFAXIE -EObkKvbdSCEFLiZL -DnbjjvbdzoQQdcMY -DnbkKvbdpxngfqEY -DncLKvbdbsDLUEKB -DoCjjvbdXrlBMtOx -EObjjvbdKCjDQicY -DncLKvbdLrWlzUpz -EObjjvbdaaWEfQQX -EObjjvbdtlYWaTaX -DnbkKvbdMowpunGs -EObkKvbdSLYeuHKs -EObkKvbdTAEhhCOd -EPCkKvbdmSYtyrci -DncLKvbdYkqcsnLm -DoDLKvbdrylQTAgn -DncLKvbdJXtCIMRQ -EObkKvbdSBdElIyL -DoDLKvbdwygefYFS -DncKjvbdyXhibPzL -EPCjjvbduaDxsPFI -EObjjvbdZoNiFEzK -EPCjjvbdkNBkyeHP -EPCkKvbdWRnXadlD -DncLKvbdRWmdDLhD -DnbkKvbdmSYtzTDi -EOcKjvbdkVwODbXw -DncLKvbdQlxCZOUz -EObjjvbdbhlijfXY -EOcLKvbdXmqAXtut -EOcLKvbdmbKXXnnV -DoDKjvbdkHgMFfOL -EPCkKvbdfekymgHA -DoCjjvbdeKKRvUzn -DoDKjvbdkHfkefNk -DoCjjvbdyqPMiKXA -DnbjjvbdUQqOtuIN -EOcKjvbdEPCkKwDE -DoDLKvbdZRNFIleR -DnbjjvbdRacdlJZL -EOcLKvbdTukoitAq -EOcLKvbdZLrDtOMN -EOcLKvbdgKfzcGAE -EObjjvbdzjVQQESt -EOcLKvbdcIlijevx -EOcKjvbdGKdsDHmV -DncLKvbdKkBHvAJy -EOcKjvbdZMRctOLm -EPCkKvbdADRxKZiQ -EObjjvbdDwxLsssl -EPDLKvbdUxgszLPO -EPCkKvbdSQTfiedX -EPCjjvbdNeEUJIkE -DoDLKvbdpyPHfqDx -DnbkKvbdyOShXsJD -DncLKvbdLiBkpxAS -DoDKjvbdaaWEepQX -DoCjjvbdWSOYBeLc -EOcKjvbdLFegbAqV -EPDKjvbdffLzOGgA -EObkKvbdFkErbglu -DncLKvbdiZuFlROG -DncKjvbdegkWRnQg -DoDLKvbdQdDApRDr -EOcLKvbdeYZtURez -EObjjvbdrXQLcIxq -DoDLKvbdxZhGGXeS -DoDLKvbdGGKSOItR -EObjjvbdjhHLfFnL -EOcLKvbdUQpoUuHm -DoCkKvbdXrlBNUPY -DoDKjvbdJXtCIMRQ -DnbkKvbdZMSDsnLm -DncKjvbdCTBDUGWr -DncKjvbdbhlikGXY -DoDKjvbdXmqAYVWU -DnbjjvbdliDsqVRa -DnbkKvbdmajXYOnV -EObjjvbdJpyePGNe -DnbkKvbdCTAcUGXS -DoDLKvbdCDpBVjNG -EOcLKvbdxwhiaoyk -DoDKjvbdxVNFQyMO -EPCkKvbdVvhwvEEg -DnbkKvbdFWYoomJe -EOcKjvbdlrZUysEJ -EPDKjvbdqquKnKaN -DoCkKvbdTkunaVoJ -EOcLKvbdfHkVrOQg -EPDLKvbdiUzFWrUb -DoDLKvbdtAGqIABS -DoCkKvbdZRMdhmEq -DnbkKvbdNsUVfeVQ -EPDLKvbdqwPkbiZR -DoCkKvbdNUsSLNAX -DncKjvbdmpZxvKyC -EPCkKvbdLYqKSztf -EPDKjvbdZyEKODMS -EPDKjvbdNGbomPuL -DncKjvbdZMSDtNlN -EPCjjvbdTXjkmzjx -EObkKvbdBdQAvKMf -EOcLKvbdkySrTYgU -DnbkKvbdZoOIddzK -DoCkKvbdZMSDsmkm -EPCkKvbdCWzdIdpW -DncLKvbdBvzdIdov -DoCjjvbdaRfDHtFk -DnbkKvbdWeyZtAOs -DoDLKvbdnCJwYPOV -DoCjjvbdEYYLstUM -EOcLKvbdwtldqZMO -EPCjjvbdFVxoomKF -EObkKvbdyqPMhiwA -DoDLKvbdkxrrSxgU -DoCjjvbdeATqNYKG -DncLKvbdJKEAJpHE -DoCkKvbddndsLUTr -DnbjjvbdqFceUWBI -DoDLKvbdhkddOUby -DncKjvbdGKdrcIMu -EPCkKvbdelevflik -DoDKjvbdhaoDFWqR -DoCjjvbdYlSDsmlN -EPCjjvbdiZuGLpmf -EObkKvbdnCJvxPNu -DnbkKvbdhzUelRNf -DnbkKvbdZeYGzgiC -DoCkKvbdDnbkLWbd -DnbkKvbdnHFYMmfy -DoCjjvbdePEsKtTr -DnbjjvbdZQmEhleR -DnbkKvbdTkunaVoJ -DnbkKvbdFWZPpMjF -DoDKjvbdSwkMNzkY -EOcLKvbdwtldpyMO -EOcKjvbdhkdcmtby -DoCjjvbdNQXqWNfs -EPDKjvbdzjUpPdTU -DnbjjvbdqceJPnWB -EPDKjvbdUyHsyjoO -EPCkKvbdZshhxcsO -DncKjvbdqAiFAWgd -EObkKvbdgFkzOGgA -DncKjvbdmgFYNNgZ -DoDLKvbdDjHjWYKA -DnbjjvbdJbicRKCx -DnbkKvbdfNFwHMjL -EPCkKvbdWSNxBdlD -EPDLKvbdCJKbLJFj -EPDKjvbdEOcKkXDE -EPCkKvbdVrOYCElD -DnbjjvbdCIkBjhej -DoDLKvbddoFTKstS -DnbjjvbduDDVXVoP -EObkKvbdxwiKCPzL -DnbkKvbdZGvdAPTJ -DoDLKvbdBdPaVjNG -EOcKjvbdIHGzYwxH -DoCjjvbdGFjSNhsq -DnbjjvbdlYsSSxgU -EPCjjvbdqrUjnKaN -EOcLKvbdtvOXipsA -DoDLKvbdrounjCuf -DoCkKvbdFVyPomKF -EOcKjvbdNHCpNPtk -EPDLKvbdWeyZtAPT -EPDKjvbdjcLkQfuH -EOcLKvbdzHZMAMeX -DoCjjvbdUMWPBVni -EOcKjvbdHELWKBjK -DoDKjvbdMgComQUk -DnbkKvbdiGjDZWJu -DncKjvbdyqOmJKXA -DoDKjvbdVZITyjoO -DoCjjvbdzQoNJJwA -EOcLKvbdGAoQxizm -DoDKjvbdatagYKsh -EPDKjvbdSBceMJYk -DoDLKvbdMpYQvOHT -DncKjvbdiCOcFWpq -DoCjjvbdUGznLvvF -EPDLKvbdANIYrvyx -EPCjjvbdIwtCHkpp -EObkKvbdJSyBSmYM -EObkKvbdwuMdqYlO -EObjjvbdmuVZkKSG -DncLKvbdSPsfjFdX -DoDLKvbdSQUHJedX -DoDKjvbdiVZdwSUb -EPDLKvbdRjxfVGkT -EObjjvbdmpZyVkZC -DncLKvbdhzUelROG -EPCkKvbdxVMeRZMO -EOcKjvbdxxIiapZk -EOcKjvbdJSyBTNYM -EPDKjvbdMSXMzUpz -EPCkKvbdNddThhjd -DoDKjvbdznpREcLx -DncLKvbdqYoHgREY -DnbjjvbdiCPCdvqR -DoCjjvbdsQVoKDVf -DoCjjvbdqFcdtWBI -EPCkKvbdFkFTDIMu -DnbkKvbdQvmdCkgc -DnbjjvbduCbtwWOo -DoCjjvbdaNKaruNH -EOcLKvbdrpWPKCvG -DoCjjvbdEKHiuwjA -DoDLKvbdsBfMlHKy -EObjjvbduCcVWuno -DoCkKvbdNddUIiLE -DoDLKvbdVrNwbElD -EPCkKvbdTqQoUuHm -DoCjjvbdcJMikFvx -EOcKjvbdijGIJmYS -DncKjvbdtvNwipsA -EPDKjvbdGQASwGey -DoCkKvbdmJEUQtqa -DncKjvbdpxnggQcx -EOcLKvbdDnbjjwDE -DnbjjvbdxVMdqZLn -EPCkKvbdTkvPAvOi -DnbkKvbddijRvUzn -DnbjjvbdJuuFceGi -DoDLKvbdeATplxJf -EObjjvbdiLeDmuDZ -EObkKvbdzHYlANFX -EObkKvbdSBdFLiYk -DncLKvbdMgCpNPuL -DncLKvbdNsTufeVQ -EPCjjvbdUQqOtuIN -EPCkKvbdKDJcQicY -DnbkKvbdsCFmLfjy -DnbjjvbdNdctJIjd -DoDLKvbdzjUpPdSt -EPDLKvbdMoxRVmgT -EOcKjvbdbsCjscia -DoCjjvbdrDeIpOWB -EPDKjvbdOTUVgFVQ -EOcLKvbduWNwipsA -DoDKjvbdJcJcRKCx -DncKjvbdGZUtaDwb -EPCjjvbdZtJJYdSn -DoDLKvbdtcDVWuoP -EObjjvbdKaLGmCXq -DoCjjvbddZxoxYpb -DnbkKvbdWRmxCEkc -EOcLKvbdNrsufduQ -DoDLKvbdqlzJxlIJ -DoCkKvbdFVyPoljF -DnbkKvbdjggMGGOL -DoDLKvbdLAkHMawq -DncLKvbdwuMdpxlO -DoDKjvbdtSqrxydc -DoCjjvbdSLZGVHKs -DnbjjvbdrMzKYlIJ -DnbjjvbdTAFIhBnd -EPDLKvbdIxTbIMRQ -DoDLKvbdbBVeGQPw -DnbkKvbdvlvANEEm -EPDLKvbdEOcKkXCd -DoCkKvbdYqMdhmFR -EObjjvbdnUtzKiqf -EPCkKvbdtunXjQsA -DnbkKvbdddoSBwDK -DnbjjvbdTqROttgm -EPCkKvbdzQnmJJwA -EObjjvbdfpBzwDwh -DncKjvbdRotHJecw -EPCjjvbdhtzFWrVC -DncLKvbdqdEhpNvB -DnbjjvbdkWWmcbYX -EOcLKvbdYSkaMsoY -EObjjvbdDjIKVxKA -DnbkKvbdrounjDVf -EObkKvbdJzpFwdAN -DoDLKvbdsBelkgLZ -DoDLKvbdwtmEqZMO -DncKjvbdxmrgwriD -EOcKjvbdDoDLLWbd -EPDKjvbdIwtBhLpp -EPDLKvbdUaBqTRRy -DoCjjvbdjKFhJlwr -DoCkKvbdGLFTDIMu -EPCjjvbdrbFmMHKy -DoDLKvbdehKurOQg -DncKjvbdijFhJlwr -DoCjjvbdjvXOEBww -EPCjjvbdTXjkmzkY -EOcKjvbdaSFcHtGL -EPDLKvbdpyPIHQcx -EOcKjvbdmaiwXoNu -DoDKjvbdSBdFMJZL -DoDKjvbdjKGIKMwr -DncLKvbdyXiKBozL -DoCkKvbdqlzJxkhJ -EObkKvbdrNZiyLhJ -DoCkKvbdrpWPKCvG -DncLKvbdVrOXbEkc -DnbkKvbdOAIrtJrA -DnbkKvbdrXQMChyR -EOcLKvbdDnbjjwCd -EPCjjvbdjvXOECXw -EPCkKvbdMgDPmPtk -DoDLKvbdYfwEAPSi -EPCjjvbdzGxlANEw -DoDKjvbdmbKWwoNu -EOcLKvbddZxpXxqC -DoDLKvbdLGGHbApu -DoCjjvbdVTltGLuj -EPCjjvbdOEdThiKd -DoCjjvbdUyHtZkPO -DncLKvbdHELWJajK -EOcKjvbdcarmSAUN -EObjjvbdqiAJdmOe -EObkKvbdZQleImFR -EObkKvbdQccBQRDr -DoCkKvbdLAjfmBwq -DncKjvbdSKxeuHKs -DncLKvbdmJDsqUrB -EOcLKvbdGFirNhtR -DncLKvbdEARiMywX -DnbjjvbdZxcjNblS -DncLKvbdWXIwudEg -DoDLKvbdhkeDmuCy -EObkKvbdUslselWK -DoCkKvbdLhakqYAS -DoCjjvbdIMBzmvpk -EPCjjvbdKaKgMbXq -EPCjjvbdiLeDmtcZ -DnbjjvbdsPvPKCvG -DncLKvbdnVUzLKRf -DoDLKvbdiUyeWrVC -EOcLKvbdjblLRGuH -DnbkKvbdhtydvqtb -EOcKjvbdTqQnuVIN -DoCjjvbdMtsRkNAX -EPCjjvbdGKdrbglu -DncKjvbdMoxQvOGs -DoDKjvbdiHKDZWKV -DoDKjvbdULvPAvPJ -DnbkKvbdEvZQPmKF -EObjjvbdkxrrTZGt -EObjjvbdKCicQibx -DoCjjvbdKkAgvAKZ -EOcKjvbdNxOuzcmt -EPDLKvbdbsCjsdJa -EObjjvbdHDkVjBjK -EPCjjvbdYqMdiMeR -EPCkKvbdczYoxZRC -DncKjvbdnPzYujxb -DnbjjvbdMpYRWOHT -DncLKvbdLFegbBRV -DncKjvbdxVMdqYlO -DoDKjvbdFkErbhNV -DncKjvbdLLBHvAJy -DoDKjvbdTfzmkwWF -EPCjjvbdyXiKCQZk -DoDKjvbdqUUGrSLU -EObjjvbdGcjuiaij -EOcLKvbdZRMdhmFR -DoCjjvbdZoNiEdzK -DoCjjvbdEARiNZwX -DoCkKvbdwXMBVaWV -EPCjjvbdVZHsyjoO -DoDKjvbdyXhjBpZk -EObkKvbdtkxWaUAw -DnbkKvbdLrWmZuQz -DncLKvbdySnJNRbH -EPCjjvbdezvYdhsw -DoDLKvbdhancFWqR -EObjjvbdyzeORgiI -EPCjjvbdyXiJbPyk -EObjjvbduVnXiqTA -DnbjjvbdZjTHofaf -EPDLKvbdLrXMyuQz -DnbjjvbdHffyxxXg -DoDLKvbdOStWGdtp -DnbjjvbddijRvUzn -DoCjjvbdYNqAXtut -EPCjjvbdUQpntuHm -DoDKjvbduWOXjQsA -DoDLKvbdtTRsYydc -DncKjvbdpfDeUVaI -DoDLKvbdULuoAvOi -DnbjjvbdqmZjYkhJ -EPDKjvbdZMSETmkm -DoDLKvbdZshhyETO -DncLKvbdQdCaQQcr -DncKjvbdQccBQRES -EOcKjvbdrNZjYlIJ -EPDKjvbdjAQHBPgK -DoCjjvbdnUuZkJqf -DoDKjvbdLAjfmBxR -EObjjvbdUsltFkuj -DoDLKvbdZQleJMeR -DnbjjvbdBraCtGXS -DoDLKvbdaSFbhUGL -EObjjvbdrbGMkgLZ -EPCkKvbdJYUCHlRQ -EOcKjvbdgFkzNfgA -DoCjjvbdaRecHtFk -EPDKjvbdnUuZkKSG -EPDLKvbdkWWmdBww -EObkKvbdypoNJKXA -EOcKjvbdZxdJmblS -DncLKvbdZirhPgCG -DoDLKvbddeOrCXCj -DoCjjvbdOXoVzcnU -DncLKvbdSBdFMJZL -DncKjvbdrzMPraHn -DncLKvbdqZPHfpcx -DncKjvbdVAbQsQqy -DoDKjvbdySnJNSCH -EPDLKvbdtSqsZZeD -DncLKvbdtvOYKRTA -DncLKvbdLGGICBQu -DoDLKvbdDncLKwDE -EObjjvbdNrtVgEtp -EOcKjvbdUQqOtthN -EObjjvbdZtIiYcrn -EOcKjvbdmuVZjjRf -DnbjjvbdcJNKKevx -DoCkKvbdDxXlTtUM -DncLKvbdqZOhHQcx -EPDKjvbdIsZBSlwl -EOcKjvbdNUsRkNAX -DoDLKvbdRbEFMJYk -DnbjjvbdiBncFWqR -EOcLKvbdRzKIScWA -EOcKjvbdRbEFMIyL -EPDKjvbdsPunjDVf -DoCjjvbdhzVFkpmf -EOcKjvbddxZtUSFz -DncKjvbdnVUykJrG -EOcLKvbdEPCkKvbd -EPCjjvbdnUuZkKSG -DnbjjvbdnCKWxOmu -DnbkKvbdYzcFrKVy -DoDKjvbdvmWAMcdm -EObkKvbdhkdcmuDZ -DncKjvbdNsUVgFVQ -EPDLKvbdYzbeqiuy -EOcLKvbdUxgszLOn -DnbjjvbdZQmEiMeR -DoCjjvbdkHflFemk -EPDLKvbdhbPCdwRR -DoDLKvbdWXIwucdg -DoCjjvbdOYOuzcnU -DoDLKvbdcSbkTdJa -EOcKjvbdEvYpQMjF -EPDLKvbdrykosAhO -EObkKvbdrovPJbvG -DoDLKvbdkHflGGNk -DoCjjvbdZtIiYcsO -DoDLKvbdZnmiEdzK -EObjjvbdZMSDsnLm -EPCjjvbdLAjfmBxR -DncLKvbdptUGrRjt -EOcLKvbdNQXqVmgT -DoDLKvbdCIkCLIfK -EPDLKvbduVmxKRTA -EPDKjvbdHbLzEzAD -EPCjjvbdbUbGxKsh -DoCkKvbdjlbLzEgP -EPCkKvbdXGYzUAPT -DnbkKvbduLxXAsaX -EObkKvbdJvUfEFHJ -EOcKjvbdmbKXXoNu -EPDKjvbdQvnDbkgc -DoDLKvbdiUzFWrVC -EObkKvbdZyEKNcLr -DoDKjvbdrEEhpNua -DnbkKvbdzitoocsU -EPCjjvbdmbJvxOnV -EOcLKvbdNddTiIjd -DncKjvbdfpBzvdYI -EObkKvbdBhjbLIfK -DoCjjvbdFjeTDHmV -EOcKjvbdRjyGVGkT -DoCkKvbdZQldhmFR -EPDKjvbdqlzKZLhJ -DnbkKvbdZoOIeEyj -DncKjvbdBdPaVjNG -EPCkKvbdTulPjUBR -EPDLKvbdGGJqmiTq -DoDLKvbdGGJqmhsq -EOcKjvbdIryBTNXl -EPDLKvbdIsYaSmXl -DoCjjvbdVwJXudEg -EPCkKvbduDCtvuoP -EOcLKvbddBsMrAUN -DncLKvbdrouoJcWG -DoDKjvbdCgLfHAzc -DncLKvbdhtzEvqtb -DoDKjvbdZtIiYcsO -DncKjvbdMfbomPtk -DncKjvbdYqNEiMdq -DnbkKvbdCTBCtFvr -DncLKvbdhtzEvquC -DoCjjvbdAMhZSvyx -DoDKjvbdjlbLzEfo -EOcKjvbdZLrETmkm -DncKjvbdULvPAuni -DoCjjvbdtcCtvuoP -EPCkKvbdOTTugEtp -EObjjvbdhtzEvquC -DoCjjvbdkHgLfFmk -DncKjvbdmoyyVkZC -DnbkKvbdsBemLgKy -DoDKjvbddCTMrAUN -DoCjjvbdmuUykJqf -DnbjjvbdbQHGckzd -DoDLKvbdyOShXriD -EPDLKvbdZRNFImFR -EOcLKvbdDoDKkWcE -EPCkKvbdwMvAMcdm -DnbjjvbdbKlFoNcA -DoCkKvbdMfbpMpVL -DncLKvbdhkeDnUby -DoDKjvbdMSWmZtpz -EPCjjvbdmfeYMmgZ -DnbjjvbdqiAKFMoF -DoCkKvbdSBdElIxk -EOcLKvbduoTzpkPU -DncLKvbdDoCjjwCd -EObjjvbdLGGHbBQu -DnbkKvbdQcbaQRDr -EPDLKvbdyNrgxTJD -EObjjvbdtSqryZdc -DoDLKvbdegkWSNpg -EOcKjvbdZLrDsnLm -EObjjvbdFkEsCgmV -DoDKjvbdatagXjtI -DncLKvbdGZUuBDwb -DoDLKvbduDDUvuno -EObjjvbdURROtuIN -DnbkKvbdyXhjBpZk -DoDLKvbdKaLGlaxR -DoCkKvbdlZTRrxgU -EPDLKvbdUsltFlWK -DncLKvbdGGKRnIsq -DnbkKvbdijFhKNXr -DoDKjvbdrWokbiYq -EObjjvbdUaCRSqRy -EObjjvbdRkYfVHKs -DnbkKvbdQvnDcMID -EObjjvbdvBEYrneI -DnbkKvbdySmiNRbH -EPDKjvbdjuvmcaxX -DoCjjvbdVTmUGLuj -EPDLKvbdxVMeRYlO -DnbjjvbdNPwpvNgT -DoDKjvbdJTZArlxM -EPDLKvbdjbkkRHUg -DnbkKvbdSBdFMIyL -EPDKjvbdMgColpUk -DncLKvbdVAbQsQrZ -DncLKvbdyTOJNRag -DnbjjvbdmgFYMmgZ -EPDKjvbdTAFIgbOd -EObkKvbdFWYoomJe -DoDKjvbdIxUBhMRQ -DoCjjvbdFWYopNKF -DoDKjvbdNdcshiLE -EOcLKvbdwWlBWAuu -EPCkKvbdYpldiNFR -EPDLKvbdQwODbkgc -EPCkKvbdqZOhHQcx -EObjjvbdHDjujCKK -DoDLKvbdnBjWwnmu -EPDLKvbdUQqPUuHm -DnbkKvbdIryBSlxM -DnbkKvbdjhGlFfNk -DnbkKvbdqlyiyMHi -EPDLKvbdxmsIYTIc -EPCjjvbdNrsufduQ -DncLKvbdaaWEepPw -DnbjjvbdkVvnDaxX -EOcKjvbdUQpntuIN -EOcKjvbdQdDAopcr -DoCkKvbduMXvaUAw -DnbkKvbdMRwNZuQz -DoCkKvbdNGcQMotk -EPDLKvbduWOYJpsA -DncKjvbdZtJIxcrn -DnbjjvbdwyhFfXeS -EOcLKvbdIryAsNYM -EObjjvbdyTNiNRag -EPCkKvbdiZuGLqOG -DncKjvbdHELWJbKK -DoDKjvbdIGfyxwxH -EPCkKvbdeOdrkTsr -DoDKjvbdpstGrRjt -EOcKjvbdZtJIxdSn -EObjjvbdZtIiZDrn -DnbjjvbdOEctIhkE -DncLKvbdKDJbqJbx -DncKjvbdEOcLKvcE -EOcLKvbdgLGzcGAE -DoCjjvbdGBPQxizm -EPCjjvbdeFOqbXDK -EObkKvbdehKuqnQg -DncKjvbdRosgKFcw -EOcLKvbdUsmUGLuj -EOcLKvbdrXQMCiZR -DoDKjvbdjcMLQftg -EPDLKvbdHEKvKBjK -EPDKjvbdbVCHYLUI -DncKjvbdFfKSOItR -DncKjvbdYSkaNToY -DncLKvbdQvmccLhD -EOcKjvbdnVUykKSG -DoCkKvbdbsDKsdJa -EObkKvbdGLFTChMu -DoCkKvbdqGEFTuaI -EPCkKvbdddoRbXCj -EPCjjvbdMfbpNQVL -DoDKjvbdFjdrbgmV -EPCkKvbdmRxuZsDi -DncKjvbdaRfChUGL -DncLKvbdMJBkqYAS -EObkKvbdxUmEqYlO -EPDLKvbdtbbtvuoP -DoDKjvbdxsOJNSBg -EPDKjvbdZtIhyDrn -DncLKvbdKCicRKDY -EPDLKvbdUtNUFlVj -EPCjjvbdeATqMxJf -EOcLKvbdaNLBsUmH -DoDKjvbdJcJcQjDY -EPCkKvbdiMEdNtby -DoCjjvbdiGibyWJu -DncKjvbdeEnrCXDK -EPCjjvbdUVlPisaR -DncLKvbdXGZZtAPT -DoDKjvbdddoRbXDK -DoDLKvbdSBdElIyL -DoCjjvbdRNXbZOUz -DnbjjvbdTAEhhCPE -EObjjvbdUMVoBWOi -DnbkKvbdFjdrcHmV -DoCjjvbdfIKurORH -DoDLKvbdVBCRTQrZ -EOcLKvbdZoNhddzK -DoCkKvbdULvOaVoJ -DnbjjvbdZirhPgCG -EOcKjvbdVBBprqSZ -DoDLKvbdaSFcIUGL -DoDLKvbdfIKuqnRH -DncKjvbdijGIKNXr -EPDLKvbdrzMPsAgn -EPDKjvbdNUsSKmAX -EPCkKvbdLLAhWAKZ -DncKjvbdkWWnDaww -DnbkKvbdJYUCHlQp -EPDLKvbdNwoVzdNt -DoCjjvbdSLYetfjs -DoDLKvbdptTgSSLU -DncKjvbdxVMdqZLn -DncKjvbdZyDinDMS -DnbkKvbdnPyxujxb -EPCkKvbdSiZjRABM -EPDKjvbdPyNAHSqj -DncLKvbdqwPlChyR -EPDKjvbdGckWJbKK -DoDLKvbdbBWFFoow -DoCkKvbdkCkkRGuH -DncLKvbdmJDtQuSB -EObkKvbdQdCaQQdS -DncKjvbdKfFhBaQu -DncKjvbdaNKaruMg -EOcKjvbdnPzZWLYb -EObjjvbdxUldqZMO -DnbkKvbdGckWJaij -DncKjvbdkVwODaww -EObjjvbdGKdsDHlu -EObkKvbdKQyeOfOF -EPCkKvbdGdKvKCJj -DnbkKvbdGdKuibKK -DoDKjvbdOFDtJJKd -DoCkKvbdwuMdpxkn -EObjjvbdZjShPgBf -DoDKjvbdcyxpYZQb -DnbjjvbdrbGMkgLZ -DnbjjvbdxsNiMqbH -DoDKjvbdWSOXbFLc -EPCjjvbdrDeIomvB -EOcKjvbdEuxopNJe -DoDKjvbdKDKCqKCx -DoCkKvbdkIHLfGNk -EOcKjvbdnUuZjirG -DncKjvbdIryArmXl -DoDKjvbdraemMGkZ -DncKjvbdEJgivYKA -DoDLKvbdbhmJkGWx -DnbjjvbdZyDimcMS -EOcKjvbdhuZeWrVC -DnbkKvbdRbEFMJZL -EPCkKvbdeOdrkUTr -DoCkKvbdlhdUQuRa -DnbjjvbdZtIiZDsO -EPCjjvbdZyEJmcMS -DnbjjvbdFpATWgGZ -EOcLKvbduaDxroEh -DnbkKvbdpeceUWBI -EOcKjvbdjcMLQftg -DncLKvbdnPzZWLZC -DnbjjvbdZyEKNcMS -DoDKjvbdZMSDsnLm -DnbjjvbdOAIsTjSA -DoCjjvbdWSNxCFLc -DoDKjvbdkClLRHVH -DncKjvbdZxdJmcLr -EPCjjvbdOYOuzdOU -DncKjvbdWHxVxHYz -DoDLKvbdwXMBWBVu -EObjjvbdZxdJmcMS -EOcKjvbdrEFJPmvB -EOcKjvbdQcbaQQcr -EPCkKvbdfHkWRnRH -EOcKjvbdrEEiQNvB -EObkKvbdcTCjtDia -DoCkKvbdnCJvwoOV -DoDLKvbdxnTIYSiD -EOcKjvbdGQASvfey -DoDKjvbdUtNTekvK -DoDLKvbdbUbHXkTh -DncKjvbdaNLBsVNH -EPCkKvbdmtuZjirG -EPDKjvbdvlvANEEm -DnbkKvbdcIljLGWx -EOcKjvbdJSyArmYM -EObjjvbdVTltFlVj -DncKjvbdTAFIgbOd -EOcLKvbdUsltGLuj -EObjjvbdZRNEhmFR -EOcKjvbdUGznMXVe -DnbjjvbdTqQoUthN -DncLKvbdZRNEhmEq -EObkKvbdKxpirzuG -EOcKjvbdiVZdvqtb -EOcLKvbdatbGxKtI -DnbkKvbdpfDdsvBI -DnbjjvbdpyPIGqDx -DoCkKvbdqUUGrRjt -DoCjjvbdfHjuqmqH -EPDKjvbdqlzJyLgi -DoCjjvbdznpREcMY -EObjjvbdjuvnEBww -DoCkKvbdQwNdCkgc -DoCjjvbdxsNhlqag -EOcKjvbdbsDKtEJa -EPDLKvbdfIKuqnQg -DncLKvbdJXsbILqQ -DoDLKvbdiUydwRuC -EOcLKvbdUtMsfMVj -DnbkKvbdfNGWflik -DoDLKvbdqwQLcJZR -DncLKvbdYqMeIleR -DoCjjvbdzaAPGgBl -EPCkKvbdauBgYLUI -EPDLKvbdiUydvqtb -DnbjjvbdRyjITCvA -DncLKvbdIwsahLqQ -EPCjjvbdRacdkiYk -EOcKjvbdRbEFMJZL -DoCjjvbdrzLoraHn -EObkKvbdxxIiaozL -EOcLKvbdJcJbqJbx -EPCjjvbdZisHogBf -EOcKjvbdVTmUGMWK -EPDKjvbdrylQSaIO -DncLKvbdSCEEkiYk -DoDLKvbdhtyeXRuC -EObjjvbdQvmcblID -DoDKjvbdauCGwjtI -DnbkKvbdGYtuBEYC -DoCkKvbdkyTSSxft -EPDLKvbdIGfyyYYH -EObjjvbdjlbLzEgP -EPCjjvbdIwsbHkpp -EPDKjvbdmuUyjjSG -DoCkKvbdUQpoUtgm -EObkKvbdUQqPVVIN -DncLKvbdXrkaMsnx -DncLKvbdaMjbTUlg -DncLKvbdhgJbyVjV -DnbkKvbdURQoUuIN -DnbjjvbdFWZQQMie -EPCjjvbdnCJwYPNu -EOcLKvbdBcpBVimG -DoCkKvbdyqPMiKXA -EObkKvbdnVUzKjRf -DnbkKvbdVgwvXgYz -EObkKvbdZsiJZDsO -EPDKjvbdiCPCdwRR -EObkKvbdGYuUaEYC -DnbkKvbdpyPIHREY -DnbjjvbdiZtfLpnG -EPCkKvbdVUNTelWK -DnbkKvbdTppoVUhN -DnbjjvbdxrnIlrBg -EPDKjvbdmIdUQtrB -EObjjvbdkNBkzFGo -DncKjvbdhbOcFXQq -DoDLKvbdNGcPmQVL -EPDKjvbdZoNheEyj -DnbkKvbdjlbLzEfo -DoCjjvbdZRMdiNEq -EObjjvbdczYoxYqC -EPDKjvbdLAkHMaxR -DoDLKvbdsPunibuf -DoDLKvbdNdcshhkE -EPDKjvbdhkdcnVCy -EPCkKvbdVZHtZkOn -DnbjjvbdsrrTYzFD -DoCjjvbdatbGxKtI -EOcLKvbdnGdxMnHZ -EPDLKvbdmaivwoOV -EObkKvbdjJegjMwr -EPDKjvbdYfwEAOri -EOcKjvbdpxngfpcx -DnbjjvbdEPCjkXCd -EPDKjvbdxsOImRag -EObjjvbdEPDKjwDE -DnbjjvbdYlSETnLm -DncLKvbdBiLBjhej -DoDKjvbdrpWPJcVf -DncKjvbdRpTfiedX -DoDKjvbdakMGOnDA -DnbjjvbduVmxKQsA -DncKjvbdKfFhCBRV -DnbkKvbdpfEFTvBI -DncLKvbdqwQLcIyR -EOcKjvbdlhdTpuSB -DncKjvbdqwQLbhxq -DnbkKvbdnHEwlmgZ -EPDKjvbdDoCjkWbd -EObkKvbdANIYsWyx -EObjjvbdpfEEsvBI -EPDKjvbdCJLCKiFj -DoDKjvbdqcdhonVa -EPCjjvbdzjUpQESt -DncLKvbdZQleImEq -EPCjjvbdEPCkLXCd -EPDKjvbdYlRdUNlN -EObkKvbdxwiKBozL -DnbjjvbdFjdsChNV -EObjjvbdwtleRYlO -DoDLKvbdeOdsLUUS -EPDKjvbdZLqctOLm -DoDLKvbdjlbLyeHP -DoCkKvbdaNLCTVMg -DnbkKvbdEKHjWXjA -DnbkKvbdZshhyDsO -DnbjjvbdsPunibuf -EPCkKvbdwWkaWBVu -EPDLKvbdFpATWfey -EObjjvbdzoQQdcMY -EPDLKvbdpxngfpcx -DnbjjvbdgPazwDwh -EPDKjvbdKVtfEEfi -EOcLKvbdhkeENuDZ -EObkKvbdIwtCILqQ -EPCjjvbdyNrhXsJD -DnbkKvbdMSWmZuQz -EOcLKvbdsPunicWG -DncLKvbdULvPBWPJ -DoCkKvbdKfFhCApu -EOcLKvbdTAEhhCOd -DnbkKvbdSKxetfjs -DoCjjvbdUtNTfLuj -EObjjvbdhzVGMROG -DoCkKvbdxsNhmRag -DnbjjvbddZyPwxpb -EObjjvbdEuxooljF -DncLKvbdVTlsfLuj -DoCkKvbdZjShQGaf -EPDKjvbdrSVKnKaN -DnbkKvbdFxuVBDwb -DoCkKvbdJXtBhLpp -EPCjjvbdHffzZXxH -DoCjjvbdqZOgfqDx -DncLKvbdqwQMChyR -EObjjvbdaSGDIUFk -EPDLKvbdZxdKNcMS -EObjjvbdhuZdwSUb -EPDLKvbdfMfWgMik -DncLKvbdZRNFJMdq -EOcKjvbdJKEAKPfd -EPCkKvbdcyxoxYqC -EOcKjvbdCSaCsevr -DoDLKvbdKQzEoGNe -DoDLKvbdjhHLefOL -DoCjjvbdRjxeuGjs -DncKjvbdyOTIXsIc -DnbkKvbdBdQBWKMf -EOcKjvbduLxXBUBX -EObkKvbdrSUkNkAm -DoDKjvbdKfFhBaRV -EPCjjvbdddoSBvcK -DncKjvbdyOTHxTJD -EOcLKvbdiLeENuDZ -DoCjjvbdJbjDRKCx -EPDKjvbddoErkUUS -DoCkKvbdBiKakJGK -DnbkKvbdCIjbKiFj -DoCjjvbdIsZBSmXl -EOcLKvbdBhjajiFj -DnbjjvbdrzMQTBIO -EObjjvbdrWolChyR -EPCkKvbdEARiMzXX -DoDLKvbdrWpMDJYq -EOcLKvbdKRZdoGOF -DoCjjvbdBsAcUFvr -DoCjjvbdBraDUGXS -DoCkKvbdIwtBhMQp -EObjjvbdeATqMxKG -EPDKjvbdYzbfRjWZ -EOcLKvbdsCGNLgKy -DoDKjvbdhficZWKV -EObjjvbdZQldhldq -EPDKjvbdsQVoJbvG -EPDKjvbdsQVnicWG -DoDLKvbdVZITyjoO -EPCjjvbdILazmvpk -EPCkKvbdZMSDsmlN -DoCjjvbdZGvdAOri -DoDKjvbdwuMeRYkn -DnbjjvbdZyEJmblS -EPDKjvbdhkeENuDZ -EPDLKvbdGdKvKCKK -EPCjjvbdjuwOECXw -EObkKvbdZeXfzghb -EObjjvbdJmAEZgUa -EOcLKvbdtcCuWvOo -EPCkKvbdiiehJlwr -DoDLKvbdwtldpyMO -DoCjjvbdjblLQfuH -DncKjvbdNPwpunGs -DnbjjvbdSLZFtgLT -EPDKjvbdyXhjCPyk -EObjjvbdliETpuSB -Dnbjjvbdqlyixkgi -DoDLKvbdmbJvxOnV -DoCjjvbdZjSgpGaf -DoCjjvbdqdEhpNua -DoDLKvbdelfXGmKL -EPDKjvbdIGgZyYYH -DncLKvbdfMfXHMik -DoCjjvbdZoNheEyj -EPCkKvbdsZlPsBIO -EOcKjvbdLAjgMbXq -DncKjvbdVZITykOn -DnbjjvbdpyOgfqEY -EPDKjvbdbUagYKtI -EObkKvbdrSUjnLBN -DncKjvbdQwNdDLhD -EOcLKvbdrykosBIO -EPDKjvbdsPunicWG -EPCjjvbdliDtQuRa -EOcKjvbdcSbkTdKB -EOcLKvbdKaKgNCXq -DnbjjvbdZshhxcrn -DnbkKvbdcbTMrAUN -EPCkKvbdsQWPKDVf -DncKjvbdijGHjMwr -EOcLKvbdULvPBVni -EPCjjvbdffLynHHA -DoCjjvbdTqQntuHm -DoDLKvbdjuwNdCXw -DoCkKvbdVZITzLOn -EPDLKvbdqrUkOLAm -EPDLKvbdZQmEhmFR -DoDKjvbdwjvdHzyf -EPDKjvbdePErjtTr -EObjjvbdmozYvLZC -DnbjjvbdACrXizIp -EOcLKvbdTvMQJtAq -DncLKvbdssSTZZeD -DnbjjvbdmozZVjxb -EOcLKvbdtSrSxzFD -EPDLKvbdZyDjOCkr -DnbkKvbdbBWEeopX -EOcLKvbdkWWmcbXw -DoCkKvbdkVwNdBww -DncKjvbdEzsqFMCi -DncLKvbdACqxJyhp -DoDKjvbdYpmFIleR -DncKjvbdGKdsCglu -DoCkKvbdZnnJFEzK -DoDKjvbdBsBCtGWr -EPDKjvbdBcpAuimG -DnbjjvbdIGfzYxXg -DnbkKvbdGLEsCgmV -EPCkKvbdySnJNSBg -DoCkKvbdPyNAGrqj -EPDKjvbdmaivxPNu -DnbjjvbddoFSkUUS -DoCkKvbdySmiNRag -DoDLKvbdEYXlUUUM -EObkKvbdCTBCtFwS -DoDLKvbdoznDkXoA -EOcLKvbdBvzciEov -DoCjjvbdSPtHJfEX -EPDLKvbdtvOYJqTA -EPDKjvbdZisHpHBf -EPDKjvbdILazmvqL -EOcKjvbdRpUHKGDw -DncKjvbdWXJYWDdg -EPDLKvbdIwtCHlQp -EPDKjvbdUtNTfLvK -DncLKvbddZxpXxqC -EOcLKvbdkNBlZdgP -EObkKvbdqYnhGqEY -EPDLKvbdfpBzwDwh -DncLKvbdTkuoBVoJ -DnbkKvbdvvlBWAvV -DoCjjvbdrXQMCiYq -EPCjjvbdFeiqmiUR -DncLKvbdzjUopDsU -DncKjvbdhkeDmuCy -EPCjjvbdVqnYBdlD -EOcLKvbdSCDeLiYk -DoCjjvbdJvUeceHJ -EPCjjvbdjgfkfFnL -DnbjjvbdkVwNdBww -EObkKvbdczYowyRC -EPCjjvbdZoNhddyj -EPCjjvbdOSsugEuQ -EObkKvbdZMRcsnLm -EObjjvbdrMzJyLgi -EPDKjvbdrSUjnKaN -EPDKjvbdSLYfUfkT -EPDKjvbdUVlQKUAq -DoDLKvbdJcKCqJbx -DnbjjvbdeFPRbWcK -DoCkKvbdVAbQsQqy -DncLKvbdpeceTvBI -DoDLKvbdcIlikFwY -DoDLKvbdbsDLTdJa -EPCkKvbdRXOEClHc -DnbjjvbdbKkennDA -DncLKvbdEzsqEkcJ -EPCjjvbdJvUedEgJ -EOcLKvbdzitpQDsU -DncLKvbdQvnDblHc -EOcKjvbdbQGgDkzd -DnbkKvbddZyPxYpb -EPDLKvbdLrXNZuQz -DoDKjvbdDjIJvYKA -EPCjjvbdbVCHXjsh -EOcLKvbdsPunicVf -EOcLKvbdEzspdlCi -DoDLKvbdmRxtzSdJ -DnbjjvbdsBfNLfjy -DoCjjvbdcTDLUDia -EPDLKvbdidjgVPAO -DoCkKvbduVmxKQsA -EObjjvbdxLXDgzzG -EPCkKvbduaEZSoFI -EOcLKvbddneSjssr -DoCkKvbdWXJYVdFH -DncLKvbdHkaznWqL -DncKjvbdbVCGxKsh -DnbjjvbdiMEcmtcZ -DoDKjvbdqAheAXHd -EPCkKvbdMIalQxAS -DnbjjvbdVviXucdg -DnbjjvbdMpXpumgT -EObkKvbdMJCLqYAS -EObjjvbdczZQYYqC -DncLKvbdUxgtZjoO -EOcLKvbdjuwNdCYX -DncKjvbdSwjlNzkY -EPDLKvbdrWpLbhxq -DoDKjvbdnBjWwoOV -EPCjjvbdmSYtyrdJ -DoDLKvbdzeZnzdzQ -DncLKvbdMowqWOGs -EPCkKvbdqTsfqrLU -EObkKvbdraemMHKy -EOcLKvbdJcJbpjCx -DnbjjvbdmuUzKjRf -DncKjvbdNeEThhkE -DoDKjvbdHakydzAD -EOcKjvbdXsLaNUPY -EObjjvbdLFfHbBQu -DncLKvbdbKlFoODA -DoCjjvbdRpTfiecw -DnbkKvbdRkYetgLT -DoCjjvbdegkVrOQg -DoDLKvbdhlFEOUby -DoCkKvbdFyUtaEXb -DnbjjvbdAMgxsXZx -EOcLKvbdUQqOtuHm -EPDKjvbdxrmiMrCH -EOcLKvbdREDApQdS -DoDLKvbdWRmxBdlD -DnbjjvbdiHKCyVjV -EPCkKvbdxwhjCPyk -EObjjvbdLKaHvAJy -EPDLKvbdZtJJYcsO -DoCjjvbdbPfgDkzd -EObkKvbdUaBqTRRy -EPDKjvbdGYtuAcwb -DnbjjvbdQcbaQRDr -EPCjjvbdsBfNMHKy -EPDKjvbdZyDimblS -DoDKjvbdJXtBglRQ -EObkKvbdpssfrSLU -EOcLKvbdMRwMytpz -DoCjjvbdEYYMUTtM -DoCkKvbdeAUQmXif -DncLKvbdUaBqSpqy -EObkKvbdVAbQrqRy -EObkKvbdwXMAuaWV -DncLKvbdCIjakIfK -DncLKvbdjmBkzEfo -EOcLKvbdKVtfDeGi -EObkKvbdnQZyVjxb -DncLKvbdzRPMhiwA -DncKjvbdJpydnfOF -EPDKjvbdqTsfrRkU -EPDLKvbdEuyQPlie -DnbjjvbdfSBWzlCo -DnbkKvbdqiAKFMne -EPCjjvbdatbHYLUI -EOcKjvbdNsTugEtp -EPCkKvbdmgFXmNgZ -EPDLKvbdMSXNZtpz -DoDKjvbdUaBprqRy -DnbjjvbdXmqAXtvU -EOcKjvbdHlBznWpk -EOcKjvbdVqmwbElD -DoCkKvbdqrVLOLAm -DnbkKvbdZshiYcrn -DoCkKvbdZoNhddyj -EOcLKvbdEuxooljF -DnbkKvbduCcVXVoP -EPCkKvbdmuVZjirG -DncKjvbdRzKHrbvA -EObkKvbdeKJqutzn -EObkKvbdyOShXsIc -EPCjjvbdRbDdlJZL -DoDKjvbdSBdFMIxk -DncLKvbdKaKgMawq -EObkKvbdCDpAuilf -DnbkKvbdRWnDcLgc -DncLKvbdqlzJxkhJ -EPCjjvbdNHDQMpUk -EOcLKvbdRMwbZNtz -EPDKjvbdOEdThiLE -DoDLKvbdUyHszKoO -DnbkKvbdZisIPgCG -DncKjvbdwzHeeweS -DncKjvbdQwODcLhD -DoDLKvbdqdFJPmua -EOcLKvbdvwMAvBVu -EPDLKvbdbVBfwjsh -DoCkKvbdRyjHrcWA -DoDLKvbdWIYVxGxz -DnbkKvbdbiMjLGXY -EOcLKvbdBhjbKiFj -EObjjvbdCDpAvJmG -EPDKjvbdLBKfmCYR -DoCkKvbdbiMijevx -DnbkKvbdyOSgwriD -EPDLKvbdlYrqsZHU -EOcLKvbdwyhGFxFS -EPDLKvbdRyjHsCvA -EPCkKvbdHgGzYxYH -DoDLKvbdGFjRmhtR -EPDKjvbdFyUtaEYC -DncLKvbdeFOrCWbj -DoDLKvbdJSyArlwl -EOcKjvbdZyEKODLr -EOcLKvbdemGXGmJk -DnbjjvbdSCDeLhyL -DoDLKvbdYTLaMsnx -DoCjjvbdxKwEHzyf -EOcLKvbdiVZdvquC -DnbkKvbdUaBqTQqy -EPCjjvbdGZVVBEXb -DoDLKvbdCEQAvKMf -DoDLKvbdRWmdCkhD -EPDKjvbdRotHJecw -DoCjjvbdZxcimblS -EOcLKvbdtbcUvvOo -DnbjjvbdZsiJZDsO -EOcKjvbdRyjHsCvA -EOcKjvbdxLWdHzzG -DoCjjvbdFjdrbhMu -EPCkKvbdxVNFRYlO -DoCkKvbdmIcsqUqa -EPDLKvbdfMfWgMjL -EPDKjvbdTqQoUthN -EOcKjvbdtkwvaUAw -DoDKjvbdBdPaVilf -DoDLKvbdZMRdTmkm -EPDLKvbdelewGlik -DoCkKvbdwzHfFxEr -EPCkKvbdvAcyTPFI -EObjjvbdQdDBPqES -DoDKjvbdZtIiYcrn -EOcKjvbdypnlhiwA -DoCkKvbdNrtWGduQ -DncKjvbdxsOIlqbH -EPCjjvbdANIYrvyx -DnbjjvbdNwnuzdOU -EPCkKvbdFyUuBEXb -EOcLKvbdaaWFGQQX -DncLKvbdraelkfkZ -EPCjjvbdTpqPVUhN -DncKjvbdySmiNSBg -EPDKjvbdrpWPJbvG -EObjjvbdwNWANEFN -EObjjvbdZeYGzhJC -DoCjjvbddndsKstS -EPDLKvbdegkWSORH -EPCjjvbdvwMAvBVu -EPCjjvbdkySqrxgU -EPCkKvbdHkaznWqL -EPCjjvbdqlzKYkhJ -DncLKvbdZxdJmcMS -EPCjjvbdqGEFTvAh -EObjjvbdTYKkmzkY -EPCkKvbdZisHofbG -EOcLKvbdzoPpdcLx -EPDKjvbdZjTHpHCG -EOcKjvbdKWVGEFHJ -EPCjjvbdhyuFlROG -EPCkKvbdFjeTDIMu -DncLKvbdOYPVzcnU -DoCjjvbdSZjISbvA -DoCkKvbdZoNiEdyj -EPCjjvbdrWpMDJZR -EObkKvbdkVvnDaxX -EObjjvbdcSbjtDia -DnbjjvbdLGGICBRV -EPDLKvbdkWWmcbXw -EObjjvbdnHExNOHZ -DncKjvbdUtNUFlVj -EObkKvbdEvZPomKF -DoCkKvbduoTzpjnt -EOcLKvbdURQoVVHm -DnbkKvbdTAEiIBnd -DncKjvbdQwOECkgc -DnbjjvbdRbDdkiZL -DoCjjvbdEPCkLWcE -EPDKjvbdzjUpPdSt -EPDKjvbdZMSDsmkm -DoDLKvbdBdPaWJmG -EPCkKvbdwjwEHzyf -DnbjjvbdhuZeXSUb -DoCkKvbdlYrqsYft -DoCjjvbdEXxMTssl -DoDKjvbdzoPpdbkx -DncKjvbdWRnXbFMD -DoDLKvbddijRutzn -DncKjvbdnCKWwnmu -EOcLKvbdZMSDsmkm -EOcLKvbdUaCRTRSZ -EObkKvbdkCkjpgVH -DnbkKvbdirziTKiz -DoDLKvbdJpyeOenF -EObkKvbdGKdsDHmV -EObjjvbdoAKzshDn -EPDLKvbdlrZVZrci -DncLKvbdRzKHsDWA -EObkKvbdKkAhWAKZ -EPDLKvbdVAaqSqRy -DoCkKvbdjAPgApHK -EPCkKvbdBcpBWJmG -DncKjvbduCbuXWOo -EOcLKvbdqiAKEmOe -EPDKjvbdYpldhleR -DnbjjvbdEPCjjwCd -DnbjjvbdbsDKtEJa -EObjjvbdKfGICBRV -DoDLKvbdRadFMIxk -DoDKjvbdGGJqmhsq -EPCjjvbdJbicQjDY -DncKjvbdbiNKKfWx -EOcLKvbduLxXAsaX -EPCjjvbdEKIJuwjA -EPCjjvbdWRmwadlD -DnbjjvbdfMewGmJk -EOcLKvbdNxOuzdOU -DnbkKvbdfIKvSOQg -DncLKvbdQZNAHSqj -DnbjjvbdZLqdUNlN -EPCjjvbdSLYetgLT -DncKjvbdeEoSCWbj -EPDLKvbdsCFmMGjy -EPDLKvbdLGGHaaRV -DncLKvbdEuxpQMjF -EObjjvbdVYhTzLPO -EPCkKvbdaSFbhTek -DnbkKvbdDihJuwjA -EObjjvbdFjeTDIMu -EObjjvbdhkeDnUby -DoDKjvbdxUmEpyLn -DncLKvbdiVZdvqtb -DoCkKvbdunszqLPU -DnbkKvbdSBcdkiYk -EObjjvbdbhmKKevx -DnbjjvbdVZHtZkOn -DoDLKvbdZirgogCG -DoDLKvbdqBIeAWhE -EPCjjvbdwtmEqYkn -DncKjvbdKCjDRJbx -EOcKjvbdTvLpJsaR -DoDKjvbdyXhjBozL -DnbjjvbduDDUwVoP -DoDKjvbdzaAOfgBl -DoCjjvbdWSOYCElD -EOcLKvbdqwQMDJYq -DoCkKvbdNHColpUk -EPCkKvbdCEPaVimG -EOcKjvbdjKFhJlxS -EOcLKvbdxUleRYkn -DnbkKvbdrNZjZMHi -DoDKjvbdmuUzLKSG -EObjjvbdfIKurOQg -EPDKjvbdQlwbZNtz -DncKjvbdhkeDnUby -EObjjvbdwuMdqZMO -DncKjvbdliDtQtrB -EPCjjvbdNPwqWNgT -DncKjvbdjAPgApGj -EObkKvbdMpYRVmfs -DnbkKvbdGKeTChNV -DoDLKvbdHbMZdzAD -EObjjvbdQlwayOUz -EPDKjvbdVqnYCFLc -DoCkKvbdmpZyVjyC -EObkKvbdUslsfLuj -DoDLKvbdlhdURVSB -EOcLKvbdmSZVZrci -DoCjjvbdYzberJuy -EPDLKvbdhzVGLpnG -EPCjjvbdsPvOicVf -EObkKvbdeOeTLUUS -DncLKvbdmfdxMnHZ -EPDKjvbdHffzYwxH -EPDLKvbdrylPsAgn -EOcKjvbdwWlBWAvV -EPDKjvbdVAbQsQqy -DnbkKvbdsZlPsBIO -DncLKvbdEzspdkbi -DncLKvbdhyuGMROG -DoCkKvbdFaOpxizm -DoCkKvbdZsiIxcrn -DoCkKvbdijGHjMwr -DnbkKvbdcyxpYZQb -DnbjjvbdEzspdkbi -DncLKvbdNQYRVnGs -EObkKvbdkClKpgVH -EOcLKvbdkClKqHVH -EOcKjvbdhanbdvqR -EPCkKvbdmfdwmNfy -EObkKvbdYTMAmUPY -DoCkKvbdIGgZxxXg -EOcKjvbdnHEwlnHZ -DncLKvbdCDpAuilf -EPCjjvbdmbKXXoOV -EObkKvbdapGfdLzd -EPCkKvbdRjyGVHLT -DoCkKvbddoFTLTtS -EPCjjvbdGLFTCglu -DoCjjvbdiLeENtcZ -DoCkKvbdKCicQjCx -EPCkKvbduoTzqLPU -EPCjjvbduVmwiqTA -EPCjjvbdWIXuxGxz -EPCjjvbdpxngfqDx -EOcKjvbdeOdrkTsr -DoDLKvbdNrsufduQ -EOcKjvbdIHHZyXwg -DoCjjvbdpfEEsvBI -EOcKjvbdhgKDYvKV -DnbjjvbdmbJvxOmu -EPDKjvbdGdKujCKK -DoDLKvbdfkGzcGAE -EPCkKvbdZoNiEeZj -EPDLKvbdaMjbTUlg -EPCkKvbdSPsgJfEX -EPDKjvbdDxYLstUM -EPCjjvbdKVtfDeGi -EOcLKvbdpeceTvAh -EObjjvbdHffzYwxH -DnbjjvbdffMZnHHA -EOcLKvbdsQVnibvG -EOcKjvbdZirgpGbG -EObjjvbdJSxaTMxM -EOcLKvbdbrcLUEKB -EPCjjvbdGZUuAcwb -DnbkKvbdpssgRrLU -DnbkKvbdKVteceHJ -EPDKjvbdmajXYOmu -EPDKjvbdNwoVzdOU -DnbjjvbdrpVnicWG -DoDKjvbdjhGlFfNk -EObjjvbdEXwlTtTl -DoDLKvbdkCkkQftg -DncKjvbdDxYLtUTl -DncKjvbdNQYQunGs -DoDLKvbdZQleImFR -DoDKjvbduVmxKRTA -DoDLKvbdsrqsZZdc -DoDLKvbdZLqctNlN -EPDLKvbdNsUVfeVQ -DncLKvbdhuZeXRuC -EPCkKvbdiCObdwRR -DoDKjvbdIwsbIMQp -EObjjvbdtcCtvvPP -EOcLKvbdpyOhHRDx -EObjjvbdmgEwmOHZ -DoCkKvbdelevgNJk -DoCjjvbduLwwBTaX -DoCkKvbdXrlBNTnx -EPDLKvbduCcUvuoP -EPDKjvbdURRPVUgm -EObkKvbdBsBCsfXS -DoDLKvbdZjSgogCG -EObkKvbdhgKDZViu -EPCkKvbdEYXkstUM -DncLKvbdrMzJyLgi -DnbjjvbdaSFcIUFk -EPDLKvbdnBjWxOnV -EPDLKvbdssRryZeD -EOcKjvbderAvzkbo -DoCjjvbdZirhQHCG -DnbkKvbdBraCtFvr -EOcLKvbdxZgfFxFS -DoDKjvbdJuuFdFGi -EPDKjvbdUQqPUtgm -EPDLKvbdNHCpMpUk -EPDKjvbdnCKXYOnV -DoCkKvbddZyQXyQb -DnbjjvbdpxoHgREY -EPCkKvbdfNFwHNJk -DncLKvbdVBCQsQqy -EPCkKvbdUxhTzLOn -EObjjvbdSQTgJfEX -DoCkKvbdrWpLbiZR -DoDLKvbdtcDUwWOo -DoCkKvbdwzHfGXeS -EPDLKvbdrzMPraHn -EPCkKvbdDoCjjvcE -DoDLKvbdbhlijewY -EObkKvbdUxgsyjoO -DoDLKvbdbUafxKsh -DoCjjvbdULuoBWOi -EPCkKvbdVBBqSqRy -DoCjjvbdhkeENtcZ -EPCjjvbdqYnggRDx -DncLKvbdjhHMFfOL -EOcKjvbdZxcinDMS -DoDLKvbdvBDySndh -DncKjvbdirziTKiz -DncKjvbdJXsaglRQ -DncKjvbdhfjDYvJu -DncLKvbdjuvnDbYX -EOcKjvbdKaLHMaxR -DoCjjvbdiGjDZWKV -DnbjjvbdEObjkWbd -DnbkKvbdJmADygVB -EPDKjvbdJvVFdEfi -EPDLKvbdnGeXmOGy -DoCjjvbdpssgSSKt -EPDKjvbdwtldqYlO -EPDKjvbdmfeXmNgZ -DoCjjvbdqvokbiZR -DoDLKvbdqUUHSRjt -EObkKvbdmbKXYOnV -EOcKjvbdaSGChTfL -EPCkKvbdWWiYWDdg -DoCjjvbduoTzqKnt -DnbjjvbdHDkVjBjK -EOcKjvbdbVBfwjtI -EOcKjvbdjvXOEBxX -DncKjvbdZLrETnMN -EObkKvbdfNGXHMjL -EPCkKvbdkDLkRHUg -EObjjvbdZjTIQGbG -DoDKjvbdZsiIyDsO -DnbkKvbdbrbjscjB -EPCjjvbdmbJwYPOV -DoCkKvbdKDJcQicY -DoDLKvbdZxcinCkr -DoDKjvbduoTzqLPU -EOcKjvbddndsKstS -DnbjjvbdNQXqWNfs -EOcKjvbdIidAKQGd -DoDLKvbdTkvOaVni -DoCjjvbdsPvPJcVf -DoDKjvbdVqnXbElD -EOcKjvbdIHGyyXxH -DnbkKvbdUxgszLOn -EPDLKvbdwuMdpxkn -DnbkKvbdqrVLNkBN -DncKjvbdijFgjMwr -EPCkKvbdSQUGjFcw -EObjjvbdRWmdCkgc -DnbkKvbdVTltFkvK -EOcLKvbdJbjCqKDY -EObkKvbdfMfXGmKL -EObjjvbdzRPNJKXA -EPCjjvbdBsAbtGWr -DoDKjvbdJXsahLqQ -DnbkKvbdlBNOmALA -DoDLKvbdlrYtzTDi -EPDLKvbdZtJIxdTO -DncKjvbdmbJvxPOV -EPDLKvbdaMkBsUmH -EPCkKvbdNsUVgFUp -DoCjjvbdWfYytAPT -EObjjvbdNHCpMpVL -EPCjjvbdMgComPtk -EOcLKvbdeqaWzlDP -DoCkKvbdFVxopNKF -EOcKjvbdYkrDsmlN -DncKjvbdWWiYWEFH -DoDKjvbdSLYfUfkT -DnbjjvbdhkeEOVCy -DoDKjvbdJXsagkpp -DoDLKvbdZoOIdeZj -DncLKvbdLiCMRYAS -DncKjvbdyOTHwsJD -DncKjvbdvmWANDeN -DoDLKvbdtTSTYydc -DoCkKvbddneSjtTr -EObkKvbdkDMKpftg -DnbjjvbdbhljKewY -EPCkKvbdIsZBSlwl -EPCjjvbdlqxuZsDi -DnbjjvbdNrtWGeVQ -EOcLKvbdvBEZSndh -EOcKjvbdrJAJdmOe -DoCjjvbdyOTHxTIc -DoCjjvbdmfdwlnGy -EOcLKvbdkDMKpgVH -DoCkKvbdRECaQQdS -DncKjvbdaMjartlg -EPCjjvbdVviXuceH -DnbkKvbdNsUVgFVQ -DoDKjvbdFkEsDIMu -EOcKjvbddZyPwyQb -DoDKjvbdqmZixlIJ -DoDKjvbdrEEhomvB -EOcLKvbdlZSqsZHU -EPCkKvbdehKuqmqH -DoDLKvbdFxtuBDwb -EPCjjvbdKjaHvAJy -DncLKvbdBcpAujMf -DoCjjvbdNQYRWOHT -DoCjjvbdHakzEzAD -EPCkKvbdJTYaSlwl -DoCjjvbdzitpQETU -DoDKjvbdvBEZSoFI -DncLKvbdnBjXXoOV -DoDLKvbdiZuGMROG -DoDKjvbdKVtecdfi -DnbjjvbddjJqvUzn -EPCkKvbdaMjbStlg -EOcKjvbdSZjHsDWA -DnbkKvbdUaCRSqSZ -DoDLKvbdxZgefXeS -DncKjvbdjhGkfFnL -DncKjvbdIjEAJogE -EPCkKvbdNGcPlpVL -DncKjvbdUMWPAvOi -DnbkKvbdatafxKsh -EObkKvbdjcMLQgUg -DoDKjvbddeOqavcK -EOcLKvbdoznELXoA -EPDLKvbdeOdrjtUS -DnbkKvbdjKFhJmXr -EPCkKvbdpxoHfpdY -DoCjjvbdZLrDsnMN -EPCkKvbdwyhFexFS -EOcKjvbdkClKpftg -DoDKjvbdxnTIYSiD -DncKjvbdxnShYSiD -DoCkKvbdFxtuBDwb -EObjjvbdYkrEUNkm -DnbjjvbdNQYQvNfs -EPCkKvbdhlFDnUby -EOcLKvbdiCObdwRR -DoCjjvbdVwJXvEFH -DnbkKvbdBvzchePv -EObkKvbdZHWdAPSi -DncKjvbdHgGzYxXg -DoCkKvbdMJCMQxAS -EPCkKvbdZLqdTmkm -DoDLKvbdnCJwYPNu -EPCjjvbdOSsvGdtp -DncKjvbdlYrqsZGt -EOcLKvbdJYUBhLqQ -DoCjjvbdZisHpGaf -DnbjjvbdVgxWXfxz -EPDKjvbdkWXNdBxX -DoCkKvbdlZTSSyHU -DncKjvbdjggLeenL -DnbjjvbdKNAEZfuB -DoCjjvbdLAkHMaxR -EOcLKvbdZRNFJNFR -DoDLKvbdjAQGaPfj -EObjjvbdjggMGFmk -DoDLKvbdyfyMAMeX -DncLKvbdjbkkRHVH -EOcLKvbdOTTugFVQ -EOcKjvbdWHxWXfxz -EPCkKvbdvwMBWBVu -EPCjjvbdnHEwlnHZ -DoDKjvbdHEKuiaij -DoCjjvbdVwIwvEEg -EPDLKvbdehKvRnRH -DncLKvbdnVUyjirG -EObjjvbdfMevgNJk -EPDKjvbdjbkjqHVH -DncLKvbdrJAKEloF -DoCkKvbdGckWJaij -DnbjjvbdTvMQJtAq -EPCkKvbdhkddNtcZ -DnbkKvbdrzMQTBIO -DncKjvbdsZlQTAgn -EPDLKvbdOFDtJIjd -EOcLKvbdnBivwoOV -DncKjvbdJXtBhLpp -EPCkKvbdJTYaSmXl -EOcLKvbdLGFgbBQu -DncKjvbdnHEwlmgZ -DoCjjvbdACrYJzJQ -EPCkKvbdiZuGLqNf -DnbjjvbdnGdxMmfy -DnbkKvbdRkZGUgKs -DoDLKvbdZisHofaf -EPDLKvbdJKEAJpGd -DnbkKvbdBsBDUFwS -EObjjvbdtcDVWuno -EOcKjvbdBsAbsfWr -EPDKjvbdrWpMChyR -DoDLKvbdVTltFkuj -EPDKjvbdGFjSOJUR -EOcKjvbdBsAcUGXS -EPCkKvbdcJNKKfWx -EPDLKvbdnQZyWKxb -EPCkKvbdqTtGrSKt -EObkKvbdjJfIKNXr -EOcLKvbdVqmxBdkc -EOcKjvbdFWYopMjF -DnbjjvbdqdFJPnWB -DoCjjvbdehKvRnRH -EPDKjvbdkyTRsZGt -EObjjvbdozmckYPA -DnbjjvbdbrcLUDjB -DoDLKvbdrMyixkhJ -DoDLKvbdrpWOjCvG -DoDKjvbdLFehCAqV -DncKjvbdrWpMCiYq -EOcKjvbdVTmUFkvK -EObkKvbdhficZVjV -EPCkKvbdIsZAsNXl -DoCjjvbdmfdxNOHZ -EPDKjvbdznopdblY -DnbjjvbdLiCMRYAS -DncLKvbdePEsKstS -DoDLKvbdUMVoBVni -DncKjvbdWRnXaeLc -EObjjvbdrDdiPmvB -DoDKjvbdDoDKkXDE -DncKjvbdOAIrtJrA -EPCkKvbdwzIGGXdr -EOcLKvbdUQqPUtgm -EPDLKvbdhlFEOUby -DncKjvbdZirhPfbG -EOcLKvbdKVuGEEgJ -DoDKjvbddePSBvbj -EPDLKvbdfHjuqmqH -EPDKjvbdZjSgpHBf -DncLKvbdunszpjoU -EPCkKvbdqTtHRrKt -EObjjvbdfNGXGljL -EObjjvbdUGznMWue -DnbkKvbdsPuoJbvG -EObjjvbdnQZxujxb -EPDLKvbdczZPwyQb -DoCkKvbdWXIwvDdg -EOcKjvbdQvmdDLhD -DncLKvbdCIkBjiFj -EObjjvbdjJegjNXr -DncLKvbdcIlikFvx -EPDLKvbdRkZFtfjs -DoCjjvbdczYoxZRC -EOcLKvbdatagXjsh -DncLKvbdjcLjqGuH -DoCjjvbdMSWlyuQz -DoCkKvbdjuvnDbYX -DnbjjvbdiMEdOUcZ -EPCjjvbdcTDKtEKB -DnbjjvbdwzHeexEr -EPDLKvbdemGWgNJk -EObjjvbdakLfOnDA -EPDLKvbdTfznLvvF -DoDKjvbdaNLBsUmH -EOcLKvbdhzVFkqNf -DoDKjvbdZRNFIldq -DoDKjvbdlrZVZsEJ -EObkKvbdbUagXjtI -DoDLKvbdUyHsykPO -EObjjvbdkVwNdCYX -EPDLKvbdUVkpJtBR -EPDKjvbdrMzJxkgi -EOcKjvbdSLYfUgLT -DoCjjvbdMRwNZtpz -EPDLKvbdIxTaglRQ -EPDLKvbdJqZdnenF -DoDLKvbdZMRdTmkm -DnbkKvbdANHxrvyx -EPCjjvbdFkErbhNV -EOcLKvbdWSNxCEkc -EPCjjvbdiCPCdwQq -DnbkKvbdbAvEeoow -EOcKjvbdeFOrBvcK -DnbkKvbdaRecHtGL -DnbkKvbdZshhxcrn -EOcKjvbdqTtHRrKt -EObjjvbdauBgXjtI -EOcKjvbdQdCaQRDr -DoCjjvbdFVxopMjF -EPDLKvbdIGgZyXwg -DoDLKvbdRpTfjFdX -DnbkKvbdSQUGifEX -DnbjjvbdpxoIHREY -DoDLKvbdqiAJeMne -EOcLKvbdCIkBkJFj -DncLKvbdFfKSNhsq -DoDKjvbdwWkaVaVu -EPDLKvbdNeETiJKd -DnbjjvbdhbOcEvpq -DoCkKvbdrbGMlHLZ -DnbjjvbdLAjgMawq -DncLKvbdlqyUzSdJ -DncLKvbdYkqdTnLm -EOcKjvbdYkrDsnMN -EOcLKvbdnCKXXnnV -DoCjjvbdDncLLWbd -DoDKjvbdYpmFJMdq -EPDLKvbdFpATXHFy -DoDKjvbdJvUfEEfi -EPDLKvbdmJEURVSB -DncLKvbdtbcVWuno -EOcLKvbdbUagYKtI -EObkKvbdcJMjKevx -DnbjjvbdKVuGEFGi -DoCkKvbdZMRctNkm -EOcLKvbdYpmEiMdq -DoDKjvbdYpmEhmEq -DncKjvbdzjVQQDrt -EPCjjvbdzHYlAMdw -EPDLKvbdYkqcsnMN -EObkKvbdiiehJmYS -DnbjjvbdDwwktUUM -EObkKvbdrounjCuf -DnbjjvbdGGKRmiUR -EOcLKvbdwzIGFxEr -EPDKjvbdOEdUJJLE -DoCkKvbdfNFvgMjL -DoDLKvbdOEdThhjd -DnbkKvbdyTOImSCH -EOcLKvbdzitpQESt -DoDKjvbduDCuWvPP -DoCjjvbdTppnuUhN -DoCkKvbdIBlZdzAD -DoCjjvbdZQmFJMeR -DnbkKvbdJXsaglQp -DoCkKvbdSZigrcWA -EObjjvbdZsiIyETO -EPDKjvbdZLqctOLm -DncKjvbdwyhGFxFS -DncLKvbdqwPkcIyR -EPDKjvbdRkYfUgLT -DoCkKvbdxxIjBpZk -DncLKvbdqlyjYlIJ -EPCjjvbdRaceLiYk -EPDKjvbdjlbLyeHP -EPDKjvbdrbFmLfkZ -EPCkKvbdvBEYsPFI -DncKjvbdSBdElJYk -EPDKjvbdpxoIHREY -EPCkKvbdjhHMFfNk -EPCkKvbdANIYsXZx -EObjjvbdnGdxNOHZ -EObjjvbdKQzFPGOF -DoCjjvbdtunYKRTA -DnbjjvbdLFfHbBRV -EOcKjvbdpedEsuaI -DnbjjvbdYkqcsmkm -EPCkKvbdbrcLUEKB -DnbkKvbdNQYQunGs -DoDLKvbdJcJbqKCx -EPDLKvbdIxTbHlRQ -DnbkKvbdvwMAvBWV -EOcKjvbdfHkVqnQg -EOcLKvbdbKkfPNcA -EPDLKvbdVAbQrpqy -DncLKvbdWRnXaeLc -EPCkKvbdFpATXGey -DoDLKvbdyfxlANFX -DoCkKvbdFVyQQMjF -EOcLKvbdxnShXrhc -DoCjjvbdmaivwoOV -DnbkKvbdbsDLTdJa -DoCkKvbdUtMtGMVj -DnbjjvbdNVSqkNAX -EPDLKvbdWfYytAOs -EPCkKvbdZyEJnDLr -EObkKvbdyXhjCQZk -EObkKvbddoFSkUTr -EOcKjvbdeATqMxKG -DnbkKvbdnPyyWKyC -DncKjvbdkySrTZHU -DnbjjvbdmfdxNNfy -EPCkKvbdHlBznXQk -EPDKjvbdZisIPgCG -DncLKvbdrEEhonVa -DoDLKvbdrykosBHn -EObkKvbdqvpLbiZR -DoCjjvbdhkeDnUcZ -DoCkKvbdVwIwudEg -DncLKvbdyXiJaozL -DoCkKvbdyzeOSIIh -EPCjjvbdkVwNcbYX -DncLKvbdTkuoAuoJ -EPCjjvbdijFgimYS -DncLKvbdliEURUrB -DoDKjvbdURQoUuIN -DoDKjvbdrMzJxkhJ -EPCkKvbdqYngfqEY -EPDLKvbddwzUTrFz -DoCkKvbdyYIjBpZk -EPCjjvbdssSSxzEc -EObkKvbdFejSNiUR -EPCkKvbdrEFJPmua -DnbkKvbdiifIJmXr -EPDLKvbdZLrEUOLm -EObjjvbdGFiqnItR -DoCkKvbdjuwNcaww -DncKjvbdmpZxukYb -DoDLKvbdqdFJQNua -EPDKjvbdNQYRWOGs -DoCjjvbdZeYGzhIb -EObjjvbdZjSgpHCG -EObjjvbdhfjDYvKV -EPCkKvbdJpzFOeme -DnbkKvbdlhcsptrB -DncLKvbdFeiqnJTq -EObjjvbdZxcinCkr -EPDLKvbdFVyQPmKF -EObkKvbdelfWfljL -EOcKjvbdJpydnenF -DnbkKvbdbVCGwkUI -EObkKvbdemFwGmJk -DoCkKvbdBsAbsfWr -EPDLKvbdJYTbHkqQ -DncKjvbdyNrgxTIc -DoDKjvbdGQASvfey -EOcLKvbdRNYCZOUz -EOcKjvbdyzeORgiI -EOcLKvbdZQmEhleR -EPCjjvbdmttyjjRf -DnbjjvbdLBLGmBwq -EOcLKvbdKVuFdFGi -EPCkKvbdxmsHwsJD -DoDLKvbdyOTIXriD -EPDLKvbdZsiJYcsO -EPCjjvbdjvXOEBxX -DoCkKvbdlZSqsZGt -DoDKjvbdADRxKZiQ -EOcKjvbdzoQREcMY -EObkKvbdGGKRmhsq -EObjjvbdJutfDdgJ -DoDLKvbdUsltFkvK -EObkKvbdHDkWKBjK -DncKjvbdLqwMzVQz -EObjjvbdaRecITfL -DoDKjvbdakMGPNcA -DnbjjvbdwXMBWAvV -EOcKjvbdQwOEDLhD -EOcKjvbdAMgxrwZx -DnbjjvbdqqtkNkAm -DoDLKvbdbhmKKewY -DoCjjvbdQmYBxnUz -DnbkKvbdvPTzqKnt -EPCkKvbdJqZePGOF -DoDLKvbdTfznMXVe -DoCkKvbdFyVUaDwb -DncLKvbdFxuUaDwb -EObkKvbdhlEcnUby -DnbjjvbdCJLCKhfK -DoCkKvbdPyNAGrrK -EOcKjvbdVgxVxGxz -EObkKvbdSxKkmzjx -EOcLKvbdemFwHMjL -EObjjvbdrEEiPnVa -DoCkKvbdDjIJvXjA -EPCjjvbdYTMAmToY -DoCjjvbdbLMFnmcA -DoCkKvbdrounjCuf -EPDKjvbdrJAJeNOe -DncLKvbdJbicQjDY -EPCjjvbdmpZxvLZC -DncLKvbdVrNxCElD -DnbkKvbdDoDLKwCd -DoDKjvbdsZkpSaIO -EPCjjvbdNQYRVnGs -DoCkKvbdVrOXbFMD -DoCjjvbdlYrqryHU -DoDLKvbdVTltGMVj -DncLKvbdwzHfGXeS -EPCkKvbdmajXYOnV -EOcLKvbdZLqdTmlN -DoDLKvbdqdFJQOWB -EObkKvbdVgwvXgYz -EPDKjvbdkMakzFHP -DoDKjvbdakLfPNcA -EObjjvbdyYJJbQZk -DoDLKvbdDigivXjA -DoDLKvbdHELWJajK -EObjjvbdZGvdAPTJ -EOcKjvbdUGzmkvue -DncLKvbdSZigsCvA -DoDLKvbddBsMrATm -EObkKvbdmSZUzSdJ -DncKjvbdjAPfaQGj -DoDKjvbdlBMoNALA -DnbkKvbdJTZArlxM -EObjjvbdHgHZyXwg -EPDLKvbdhzUekpnG -EPDKjvbdEOcKjvbd -DoCkKvbdjcLkRHUg -EObjjvbdBiLBkIej -DnbjjvbdZMSEUNkm -DoCkKvbdzRPNJJwA -EPCjjvbdGdKuiajK -EPDLKvbdrEFIpOVa -EPCkKvbdKfGHbApu -EPDKjvbdUtMsfMVj -DoDLKvbdbVCHYKsh -EPDLKvbdEztRFMCi -EOcLKvbdJmADzGta -DnbjjvbdtSrSxydc -DoCjjvbdACrYKZiQ -EPDKjvbdsrqsYzEc -DoCjjvbduLxXAtAw -DoCjjvbdEztQdkbi -DoDLKvbdkClKpgVH -DoDLKvbdSCDeMJYk -DoDLKvbdpxoIGqDx -DoCkKvbdDigjVxKA -EPDKjvbdGGKSOJUR -EOcLKvbdiLeDnVDZ -DnbjjvbdyOSgxShc -EPDLKvbdNsUWHEuQ -EOcLKvbdYpmFImEq -DoDKjvbdZLrDtOLm -DncKjvbdJvVGEFHJ -EOcKjvbdZirgogCG -EPCkKvbdKCjCqJbx -EObjjvbdgKfzcGAE -DncKjvbdZjTIQHBf -DoDKjvbdRDcBQQcr -DnbkKvbdZQmEiNFR -EObkKvbdSiZjRABM -EObkKvbdURROttgm -EObjjvbdlZSrSxft -DoCjjvbdNxPVzdOU -EPCjjvbdqAheAWhE -EPCkKvbdwXLaWBWV -DoCkKvbdKDKDQjCx -EOcKjvbdehLVqnQg -DoCkKvbdZxdJmcMS -DncLKvbdDjHjVxKA -EObkKvbdXrlAmToY -EOcLKvbdwtleRYlO -EPCjjvbdtlYWaUBX -EPCkKvbdiUzFXSVC -DoCjjvbdcJNJkFwY -EObkKvbdaRebhUGL -EOcKjvbdNHDQMotk -DoDLKvbdyTNhlqbH -EOcLKvbdKfGIBaRV -EObkKvbdKaLHMawq -DoCkKvbdnCKWwoNu -EPDLKvbdHffzYwxH -DncKjvbdnGdxMmgZ -EPCjjvbdNPwpvNgT -DoDLKvbdYkrEUOMN -DoDKjvbdTqROuUgm -DoDKjvbdvBDyTPEh -DnbkKvbdJKEAKQHE -EObjjvbdiBoCeWqR -DnbkKvbdmRyUyrci -DnbkKvbdJuuGEFGi -EOcLKvbdFyVVBEXb -EObkKvbdwyhGFwdr -EObkKvbdCTBDTevr -DoDKjvbdjbkkQftg -EOcKjvbdVAbQrqRy -EObjjvbdLAkHMawq -EObjjvbdEztQeLcJ -EPCjjvbdcIlikFvx -DncKjvbdZyEJmcLr -EObjjvbdqceJPmua -DncKjvbdZnmiEdyj -EOcLKvbdiGicYujV -DoCkKvbdFeirNhtR -DoCkKvbdDjHjVxKA -DnbkKvbdqFdEsvBI -EOcKjvbdcImKKevx -EPDLKvbdQmXbZOUz -DncKjvbdqcdhpNvB -EObkKvbdsPvOjCvG -DoDKjvbdFVyQPmKF -EOcKjvbdqYnhGpcx -EPDKjvbdKfGIBaRV -EPCkKvbdnGeXmNgZ -DncKjvbdKVtedEgJ -EObjjvbdCTAbsewS -DnbjjvbdeEoRavcK -EPCkKvbdNsUVfeVQ -EPDLKvbdGdLWKCKK -DnbjjvbdKfFhCBRV -DoCjjvbdZLrDtOLm -EPDLKvbdhtydvrVC -DoDLKvbdZjTIPfaf -DoCjjvbdbrcLTdKB -DncKjvbdzoQRFClY -DnbjjvbdSKyFuHKs -EOcKjvbdZQldiMeR -DncLKvbdkySrTYft -DnbkKvbdSLZGUgKs -EPCkKvbduCbuWvOo -DoDKjvbdsCFlkgLZ -DoCjjvbdrDdiPmvB -EPDLKvbdySnJNRbH -EPDLKvbdDoDKkXDE -EPCjjvbdijGHjMwr -EOcLKvbdeJjSWUzn -EPCkKvbdKWVFdEgJ -DoDLKvbdVYhTykPO -EObkKvbdeJiqutzn -DoCjjvbdRjyFuGkT -DoDKjvbdHDkWJajK -EPCkKvbdbKlFnnDA -EPDKjvbdQwOEDMHc -DoDLKvbdZshiZESn -EObjjvbdkyTSSyGt -DoCkKvbdxUmEpyLn -EObjjvbdMuSqkNAX -DncLKvbdbiNJkGWx -DoCjjvbdWIYVwfxz -DncLKvbdkVwNcaww -DoDLKvbdOFEThhjd -DoDLKvbddndrkUTr -DnbkKvbdyzeNrHiI -EPCjjvbdZRNEhldq -DncKjvbdhlEdNuDZ -DoCjjvbdqquKmkAm -DoDKjvbdFyVVBDxC -EPCkKvbdJuteceHJ -DnbkKvbdiBoDEvqR -DoDLKvbdLqvlzUpz -EPCjjvbdrRuKnLBN -DnbkKvbdZjShQHCG -DnbkKvbdcScLTcjB -EOcKjvbdyNrgxSiD -EOcKjvbdZirhPfbG -DoDLKvbdkIGkefOL -EPDLKvbdkCkkRGtg -EPDKjvbdbUafxLTh -EObkKvbdhfjDYvKV -DoCjjvbdpecdsvAh -EOcKjvbdpfDeUWAh -DnbkKvbdPxmAGsRj -DnbjjvbdZMSEUNlN -EOcLKvbdqFdFTvAh -DoCjjvbdWXJXvDeH -DoCjjvbdqUTfqrLU -EPCjjvbdvOszqLPU -EObkKvbdmtuZkJqf -EOcLKvbdjgfkefNk -DoCjjvbdhaoCeWqR -EObjjvbdKaLHMbXq -DoCjjvbdSLZFtfjs -DoCjjvbdFfKSOItR -DnbkKvbdqUUHSSKt -EPCkKvbdHEKujBjK -EObkKvbdIsZBSmXl -EOcKjvbdRDcApQcr -DoDKjvbduDDVWvPP -EOcKjvbdLBLGlaxR -DoDLKvbdIxTbHlQp -EPDLKvbdrRtkOKaN -DoCjjvbdRjyFtfkT -EPDKjvbdGQASwHGZ -EPDKjvbdMgDPlouL -EObkKvbdJXtCILqQ -EObkKvbdrEFJQNvB -DoCkKvbdeOeTKtUS -EObkKvbdSQTgJfDw -EPCjjvbdSQUGiedX -DoCjjvbdqUUGrRjt -EPDKjvbdTqRPVUgm -EPCkKvbdIMBznWqL -EObkKvbdhancEwRR -EOcKjvbdrMzJxkgi -EPCjjvbdhbPDEvqR -EPDKjvbdZHXEAOsJ -EPDLKvbdxnShXriD -DoCkKvbdLLAgvAKZ -DoCkKvbdhficYvJu -EObjjvbdZRMeIleR -DncLKvbdYfwEAOri -DoDLKvbdDwxMTtUM -DoCkKvbdWRmwbFLc -DnbkKvbdNQYRVnHT -DnbjjvbdjmCMZeHP -EPDKjvbdaNKbTUlg -EPCkKvbdidkHVPAO -DoCjjvbdHfgZxwxH -EObjjvbdxwhibPyk -EPDKjvbdFjeTDHmV -DoDKjvbdiCOcFWqR -DoCkKvbdJmADyfuB -EOcLKvbdhficYujV -DncLKvbdYzbfSJuy -DoCjjvbdbUagXjtI -DoDKjvbdjKFhKNYS -EOcLKvbdCIkCLJGK -DoDKjvbdZshiZESn -EPCkKvbdSQTfjFcw -EObkKvbdiMEcnUcZ -EPDLKvbdyOTHxSiD -EPCjjvbdFjeTDHmV -DnbjjvbdJuuGEFGi -EPDKjvbdhkeDnVCy -EPCkKvbdVAaqSprZ -DncLKvbdVUNTelVj -DoCkKvbdfILVrNpg -DncKjvbdNHDQNPuL -EOcLKvbdLZQirztf -EObjjvbdGckWKCJj -EObkKvbdIHGyyXwg -DncLKvbdiUydwSVC -DoDLKvbdpecdtWBI -EOcLKvbdLGFgaaRV -EOcLKvbdezuxeJUX -EObkKvbdgGLymgHA -DnbjjvbdEvZQQNJe -DncKjvbdJcJbpjDY -DoDKjvbdIxTahLqQ -DncKjvbdBcpAvJlf -EObjjvbdnPyyVkYb -EObjjvbdfNGWfljL -DnbjjvbdieLHVPAO -EOcKjvbdRNYCYmtz -EPDKjvbdiHJcYuiu -EObkKvbdMowqVnHT -DoCjjvbdiUydvrUb -EObjjvbdZMRcsnLm -DnbkKvbdaSFcIUFk -DnbjjvbdZyEKNcLr -DnbkKvbdZnnJFEzK -DncLKvbdJSyBSlxM -DoCkKvbdXsMAmUOx -EPCjjvbddneSkTtS -EOcLKvbdVwIxWEEg -EPCjjvbdxsOJMrBg -DncKjvbdkIHMGGOL -DncLKvbdGFjRmhsq -DnbkKvbdySmiNRag -EPDKjvbdpyPHgREY -DnbjjvbdGZUuAcxC -DnbjjvbdiHKDYvJu -DoCjjvbdtlXwBUBX -EObkKvbdTkvPAvPJ -EOcKjvbdSxLLmzkY -DncKjvbdhgJcZVjV -EOcLKvbdZirgogBf -EOcKjvbdTukpKUBR -EPDLKvbdQlwaxmtz -DoCkKvbdNxOuzdNt -EPDLKvbduCbuXWPP -EPCkKvbdmbJvwoNu -EObkKvbdKDKCqJbx -EPCjjvbdyNsIXrhc -EPCkKvbdSCEEkiYk -EObkKvbdOFDshiLE -DoDKjvbdZnmiFEzK -EObkKvbdJbjDRKDY -EObkKvbdYfvdAOri -DncKjvbdkDLjpfuH -DoCkKvbdsrqsZZdc -DoDKjvbdLBLHNBwq -DncLKvbdDjHjWYKA -DoDKjvbdZQleIldq -DoDKjvbdatbGxKtI -EObjjvbdUWMQKUAq -EOcLKvbdlhdUQtrB -EPCjjvbdAMhZTWyx -DoCjjvbdjhGlGFmk -DoDLKvbdHgGzZXxH -EOcKjvbdrykoraIO -DoDKjvbdjJehJlwr -EObkKvbdrEEhonWB -EPCjjvbdiUyeWrUb -DnbkKvbdNQYRVmgT -EPCjjvbdVUNUFkuj -DnbjjvbdEYYMTtUM -DoDKjvbdYpldhldq -EPCjjvbdtlYWaTaX -DoCjjvbdozmdLXoA -DnbjjvbdZnnJFFZj -EObjjvbdZshiZDrn -EPDLKvbdZjShPfaf -DoCkKvbdrpVnibvG -DoCkKvbdQwNcblHc -EObkKvbdxZgefXdr -DoDKjvbdNddUIhkE -DncKjvbdcImJkFwY -DoDKjvbdZirhQGaf -DoDKjvbdqwPkcJZR -EPDLKvbdkHgLfFnL -DncKjvbdlqxuZrci -DncKjvbdRadFLiYk -EPDKjvbdIHGyxxXg -EObkKvbdmpZyVjyC -EPCkKvbdUaBqSpqy -EOcKjvbdqZOgfqDx -EObkKvbdkNBlZeGo -EObjjvbdOAIrsjSA -EPDLKvbdEvZPpNKF -DnbjjvbdczYoxZRC -DoDKjvbdvAdZTPEh -DncKjvbdqUTfqrKt -EPCkKvbdZGwEAPTJ -EPDLKvbdZMSEUNkm -EPCjjvbdYkqctNlN -DnbkKvbdeEnqawDK -DoCjjvbdKVuGEFHJ -EOcKjvbdzitopDsU -DnbjjvbdsBfNLgLZ -DnbjjvbdcImJkFvx -EPCkKvbdMgCpNQUk -EOcLKvbdZQmEhleR -EPDLKvbdtTRrxzEc -DncLKvbdKVuFceHJ -EPCkKvbdyfxlAMdw -DnbkKvbdsZkosBHn -EPDLKvbdwWlAvBVu -DoDLKvbdlqxuZrdJ -EPDLKvbdMRwMzUpz -EObjjvbdFkFTCgmV -EObkKvbdHEKvJbKK -DncLKvbdkNCMZdfo -DoCjjvbddoFSkTtS -EPCkKvbdRpTfjFdX -DoDKjvbdIGgZyYXg -EPCkKvbdBiLCLIfK -DoCjjvbdKQydnfNe -EPCjjvbdHgGzZYYH -DnbjjvbdYNqAYUvU -DncKjvbdGckVjBjK -DoCjjvbdjhHMFemk -DnbkKvbdkIGkeenL -DncLKvbdmaivwnmu -EPDLKvbdmuVZkJqf -EPDKjvbdNddUIhjd -DoCkKvbdRDbaQRES -DncLKvbdTvLojUBR -DncLKvbdtSrSxyeD -DncKjvbdjgflGFmk -DoCkKvbdQwNdDLgc -DoCkKvbdEXwksssl -DoDKjvbdtAHRIAAr -DoDLKvbdSPsgJecw -EObkKvbdjggLfGOL -DoCjjvbdSBdFLhxk -DoCkKvbdiMEdNuDZ -DoCjjvbdhtzFWrUb -EPCjjvbdSKxetgKs -DoDLKvbddndsLTtS -DncKjvbdtcCtwVno -DoDLKvbdACrYJzJQ -EOcLKvbdyOShXrhc -EObjjvbdqquKnKaN -DoCkKvbdnCJvxOnV -EPDLKvbdFWYpQMjF -DnbjjvbdnCJvwoNu -EObkKvbdhfjCyWKV -DoDKjvbdrNZjZLhJ -DnbkKvbdyNrgwsIc -EPCkKvbdSZjITDWA -DncLKvbdqiAJeNOe -DoCkKvbdhaoDEvpq -EOcLKvbdtkwwAtAw -DncKjvbdsPvOicWG -DoCjjvbdWXJYVcdg -DoDLKvbdmIdUQuSB -DnbkKvbdauBgYKtI -EOcLKvbdJbicRKCx -DoDLKvbdsPuoJcVf -EPCkKvbdfILWRnRH -EPCkKvbdAMhYrvzY -DoCjjvbdKWUedEfi -EPCkKvbdhaoDEvqR -EObjjvbdxVMeRZMO -DncKjvbdFaOqZJzm -DncKjvbdIryArlwl -EObkKvbdRWmccLgc -EPCkKvbdsPunibvG -EOcKjvbdQccBPpcr -EPDKjvbdssRsYzFD -DncLKvbdySmiMqbH -EObkKvbdZLqdTmlN -EPDLKvbdVAaqTQqy -DncLKvbdFWZPomJe -DoDKjvbdUVkojTaR -DncKjvbdULvPBWPJ -EObjjvbdUslsfLuj -DoDKjvbdsBfMlHKy -DoCjjvbdkySrTYgU -EPDKjvbdYgXEAPTJ -EOcLKvbdrzMPsAhO -DoCkKvbdcyxpXyRC -DncLKvbdkIGkeemk -EObkKvbdVqnXbElD -EObkKvbdMuSqkNAX -DncLKvbdkNCLydfo -EOcLKvbdUVlQJsaR -EOcKjvbdczZPxYqC -EObkKvbdWIXvXfxz -DoCkKvbddndsLTtS -DnbkKvbdFfJqmiUR -DncKjvbdURROuVIN -EObkKvbdddnrCXDK -DncLKvbdZyEJmcLr -EPCkKvbdVgxVxHYz -DoDKjvbdFfKRmiTq -EPDKjvbddCTNSAUN -DoDLKvbdUxgsykOn -DoDLKvbdBhjbLIfK -DoCkKvbdFejRmiTq -EPDLKvbdmuUykJqf -DoCkKvbdVTmTfLuj -DoCjjvbdkNCLydgP -DnbjjvbdHffzYxYH -EObkKvbdpxngfpcx -EPCjjvbdKQzFOfOF -DncLKvbdOEdThiKd -EOcKjvbdJSyBTNXl -DncLKvbdyNsIXriD -EOcLKvbdJYTagkpp -DoCjjvbdkMakzEfo -DoDLKvbdZjSgpGbG -DnbjjvbdSQUHJfDw -DncKjvbdRpTgJedX -DncKjvbdrykosBIO -EObkKvbdGYttaEYC -DoCkKvbdZxcjNcMS -DoCjjvbdRadElIyL -DoDKjvbdkySqryGt -EPDKjvbdiHJbyWJu -EPCjjvbdwzHeewdr -EPDKjvbdQwNccLhD -DoCjjvbdbBVeGPow -EOcKjvbdddnrCWcK -EPCjjvbdJXtCHkqQ -EObkKvbdrbFllHLZ -DncKjvbdACqxKZhp -DoCkKvbdJXtCILpp -DncKjvbdEYYMTssl -EOcKjvbdwjvdHzzG -EPDLKvbdemGWgMik -EPCjjvbdqvokcIyR -DnbkKvbdUaCQrprZ -DoCjjvbdKCjCqKDY -EPDKjvbdYSlBMtOx -EPDLKvbdyXiKBozL -EObkKvbdZxdKNcMS -EObkKvbdCDpBVjNG -DncKjvbdmgExMmgZ -EObjjvbdHkaznWqL -EObjjvbdkNCLzEfo -EPDLKvbdyNrgwsIc -DncKjvbdnHFYNNfy -DoCkKvbdDwwktTsl -EPDLKvbdTlWOaWPJ -DoDKjvbdmIctRVRa -EPCkKvbdeEnqbWbj -EPDKjvbdTYLMNzkY -DncKjvbdkHgLfGNk -DncLKvbdnPyxvLZC -EOcLKvbdjKGHjMxS -DoCjjvbdiZtfMROG -EPDKjvbdFeiqmhsq -EPDKjvbdDoDKjvbd -EOcLKvbdKRZeOfOF -DoDKjvbdzoQQeCkx -EObjjvbdEOcLKwDE -DoCkKvbdrafNLgLZ -EObjjvbdMfbomPuL -DncKjvbdUQqPUthN -EOcLKvbddjJrWUzn -DoDLKvbdvBDySoEh -DnbjjvbdVUMselVj -DoCkKvbddndrkUUS -EObkKvbdmpZxvKxb -EPCkKvbdmbJvxPNu -EPCkKvbdmfdwlnHZ -DnbkKvbdZRMdhmFR -DnbjjvbdYSlBNToY -DncLKvbdzoQRFClY -EPCkKvbdVZITzLOn -DncKjvbdZtIiZDrn -DncKjvbdFVxopNKF -EOcKjvbdtTSSxydc -EObjjvbdUVlQKTaR -EPDLKvbdkMbLzEgP -DoDLKvbdKDJcQicY -DoDLKvbdJmAEZgVB -EOcKjvbdCWzdJFPv -DncLKvbddneTLUUS -EObjjvbdBcoaWJlf -EPDKjvbdGcjvJbJj -DoCjjvbdddoRavcK -EOcLKvbdAMhZSvyx -DnbjjvbdajlGOmcA -DoCkKvbdCIkCLJFj -DnbjjvbdMSWmZtpz -EOcKjvbdNGcQMpUk -EOcKjvbdTqROuUhN -DoCkKvbdFVxoolie -DoDKjvbdUQpnuUgm -EPDKjvbdnBiwXnmu -DnbjjvbdJuuGDdgJ -EPCjjvbdZLqcsnLm -EObkKvbdZnmheEzK -DoDKjvbdXsMAltOx -EObkKvbdiMEdOUcZ -DoDKjvbdZRNEhleR -DoDLKvbdMIbLpxAS -DoDLKvbdVwIwucdg -DoCjjvbdRbDeLiZL -DncLKvbdZMRctNlN -DoCkKvbdGcjvJbJj -DnbjjvbdSZihScWA -EPDLKvbdkDLjqHUg -DnbjjvbdZisIPfaf -EObjjvbdmpZyWLZC -EOcLKvbdrbGNLgLZ -DnbkKvbdkVvmdBww -EObjjvbddoFSjstS -EObjjvbdxwiJbPyk -EPDKjvbdTvLoitAq -DoCkKvbdZLrDsnMN -DoDKjvbdOAJTUJrA -EObkKvbdURQntuHm -EObkKvbdkIGkefOL -DncLKvbdsCFllHKy -EPCkKvbdatafxKtI -DoCjjvbdiifHjMxS -DnbkKvbdZsiIyDsO -DncKjvbdieKgUoAO -EPCjjvbdBhkCLIej -DnbjjvbdDxXktTsl -EObkKvbdKCjCqKCx -EOcLKvbdIwsahLqQ -EPDLKvbdhzUfLpnG -EObjjvbdbAvEepPw -EOcLKvbdSLZFuHKs -DnbkKvbdIidAJogE -DnbjjvbdJbjDQicY -EPDLKvbdQwODblID -EObkKvbdqZOgfqEY -EObjjvbdkWWnDbXw -DncLKvbdEvZPpMjF -EPDLKvbdKQydnfNe -EObjjvbdUWMQJtAq -EOcLKvbdqrUjmkBN -DoDLKvbdJmAEZfuB -DoCkKvbdhtydvqtb -DoCkKvbdtAHQhABS -EPDLKvbdxZhGGXdr -EPDKjvbdmSZVZrci -DnbkKvbdZjTHogCG -EObkKvbdYqMdiMeR -DoDKjvbddwzUURez -DoDLKvbdbKlFnnDA -EPCkKvbdGGKSOJTq -EObkKvbdLGFgbBRV -DoCkKvbdKyQjSzuG -DncKjvbdJcJcRJcY -EOcLKvbdnBiwYPOV -EOcLKvbdLGGHaaRV -EObjjvbddneSkTtS -DoDKjvbdiLddOUcZ -EObkKvbdsPvOjCuf -DnbkKvbdZyEKOClS -DoCjjvbdyzeORhIh -DnbkKvbdhkeDmuCy -EObkKvbdvvkaWAvV -EOcKjvbdzeZnzdzQ -DoCjjvbdVAaprqSZ -EObjjvbdjhGkefNk -DncLKvbdSKxfVHLT -EPCjjvbdZRMeImFR -DncLKvbdFeirOJTq -DncLKvbdFfJrOItR -DoDLKvbdmoyyVkYb -DncLKvbdddoRavcK -DoDLKvbdauBfxKtI -EObjjvbdSPtHJfDw -EPCjjvbdCEQBWJmG -DoCjjvbdDnbkLWcE -EPDLKvbdVUNUGMVj -DnbkKvbdnQZyVjyC -DnbkKvbdgFkymfgA -DoDKjvbdRDcBQQdS -EOcKjvbdtcCuWvOo -EObkKvbdlrYuZrdJ -DoCjjvbdZirgogBf -DoDLKvbdMfcPmPuL -EOcKjvbdDwwlTtTl -DncLKvbdwXLaWAuu -EPDKjvbdUaBqSpqy -EObkKvbdHlBznXRL -EPCkKvbdkMakzFHP -DnbkKvbdqZOgfpcx -DnbkKvbdUMWOaWPJ -DncLKvbdMfbolpVL -EObjjvbdfekynGgA -EPCkKvbdWWiXvEFH -DoCjjvbdpxnhGqDx -DoDKjvbdsQVnjDWG -EObkKvbdYNqAXtut -DncLKvbdDnbkLXCd -EObkKvbdKaLGmBwq -DoCkKvbdBvzciFPv -DoDLKvbdjKFgilwr -EPCkKvbdUaBqTQqy -DoDLKvbdVgwvYHYz -EPDKjvbdIHGyyXwg -EPDKjvbdEXxMTstM -DnbkKvbdQccBPpcr -DnbkKvbdMgCpNPuL -EPDKjvbdSPtHKFcw -DoDKjvbdkIHMGFnL -DncLKvbdnGeXmNgZ -DoDLKvbdhtyeWquC -EObjjvbdqGEFUVaI -EOcLKvbdNPwpumgT -DnbkKvbdZshiYdTO -DoDKjvbdZMSETmkm -DncLKvbdRbDdkhyL -EPCjjvbdTvMQJtBR -EObkKvbdjvXOEBww -DncLKvbdrXPkbiZR -EOcLKvbdFejSOJTq -EOcKjvbdegjvRnRH -EPDLKvbdJvVGDeHJ -EObjjvbdXrlBMtOx -DncKjvbdFejSNhsq -EPDKjvbdBiLBjiGK -EOcKjvbddiirVtzn -EPDLKvbdVBBqTRRy -DoCkKvbdeqaWzkcP -EObjjvbdqYnggREY -EPDKjvbdEARiNZwX -EObjjvbdSQTfifEX -EObjjvbdLBLHNBxR -EPCkKvbdNHCpMpUk -EPCkKvbdKVuGDdfi -EPCkKvbdxrnImRbH -EOcLKvbdZRNEiNFR -EOcLKvbdtbcUvuno -EPCjjvbdJTZAsNXl -EPDLKvbdFVyQPljF -DoCkKvbdieKftoAO -EObkKvbdZMSETnMN -DoCjjvbddePSBvcK -DncLKvbdqUUHSSLU -DoDLKvbdZQldhmEq -DoDKjvbdOTTugFUp -DncLKvbdZsiJZESn -DnbjjvbdtbcUwWPP -EPDLKvbddwzTtRez -DnbjjvbdZoNheFZj -EPCkKvbdKfFgbApu -DoDLKvbdhytfMQmf -DnbkKvbdnGeXlnGy -EPCjjvbdSBcdlIyL -DncKjvbdbAvFFpPw -EObjjvbdzoPpeClY -EOcLKvbdqwQMDIyR -EPCjjvbdmaivxOmu -EPCjjvbdIwsahLqQ -DncLKvbdddoSBwCj -EOcLKvbdrEEhpNvB -DoCjjvbdEPCkKvcE -DncKjvbdePEsLTsr -DncKjvbdmRyVZsEJ -DnbjjvbdZLqdTnMN -EPDKjvbdRbEFMIxk -EObjjvbdJXsbHlRQ -DncKjvbdkDMLQftg -EOcKjvbdOEctJIjd -DnbkKvbdqTsfrRkU -EPDKjvbdkIGkeenL -DoDLKvbdUxhUZjnn -DncLKvbdwyhFexFS -EPDKjvbdbLLfOmcA -DnbkKvbdtbbuXWPP -EOcLKvbdYpmEhmFR -DnbkKvbdxmsHxTIc -DoDKjvbdznoqFDLx -EObjjvbdmfdxMnHZ -EObjjvbdYTMBNUOx -EObjjvbdADRwizJQ -EOcLKvbdMoxQvOGs -EOcLKvbdrWolDJYq -EPCjjvbdeFPRbXDK -DoDKjvbdrDdhpNvB -EPDKjvbdZxdKODLr -EOcLKvbdWSNwadlD -EOcKjvbdxrmhlqbH -DoDLKvbdzoPqEblY -DncKjvbdTkuoBWPJ -DnbjjvbdrykpSaHn -EOcKjvbdKWUfDdgJ -DnbkKvbdZMSEUOMN -EObkKvbdSBcdkhxk -DnbjjvbdIGfyyYXg -EPCkKvbdnBjWwoOV -EOcKjvbdzaAPGgBl -DnbjjvbdkVvmdCXw -DoDLKvbdkDLkQfuH -DoCkKvbdVqnXbFMD -DncKjvbdWWiXuceH -DoCjjvbdBvzdIePv -DncKjvbdLFfICBQu -DncLKvbdeFPRawDK -DncKjvbdjmBkydgP -EObjjvbdVUMtFkuj -EPDLKvbdrSUjmkBN -DoDLKvbdSPsgKFdX -DoDKjvbduDDVXVno -DoCjjvbdMuSqjmAX -EPCkKvbdZyEJmcLr -DnbkKvbdMfcQMouL -DoDLKvbdUMWPAuni -DnbjjvbddZxpYZRC -EPDKjvbdbAvEeopX -DnbkKvbddoErkUUS -DoCjjvbdePErjstS -EOcKjvbdGKeTDHlu -EObjjvbdfIKvSORH -EPCjjvbdUsmTelWK -EObkKvbdaMkBsVMg -DoCkKvbdRjxfVHKs -DnbkKvbdMpYQumgT -DncLKvbdVwIxWEFH -DncKjvbdaMkCTUmH -DoDLKvbdhlFENuDZ -EPCjjvbdZisIPgCG -EPCjjvbdZnnJEdzK -EPDKjvbdGLEsDINV -EObjjvbdYzcFrKVy -EPDKjvbdZirhPgBf -EPDLKvbdKaLGmCXq -EObkKvbddoErkTsr -DoCkKvbdRXNdCkgc -DoDLKvbdEvZQQNKF -DoCkKvbdZoNhdeZj -EPCkKvbdhkddNtby -EPDLKvbdZLrDtNlN -DncKjvbdRbDdlIxk -EPCkKvbdEOcKjwCd -DncKjvbdlqyUyrdJ -DoDLKvbdNddThhkE -EOcKjvbdwyhFewdr -EPDLKvbdiUydwSVC -DnbkKvbdYzcFqjWZ -DnbkKvbdiBoCdwRR -EOcLKvbdpecdsuaI -EPCkKvbdQlxCYnUz -EPDLKvbdVvhxWEEg -EOcLKvbdlZSqryGt -EPCkKvbdUaCQsQqy -DoCkKvbdvAdZSndh -DnbjjvbdmttykKRf -EPCkKvbdYgWdAPTJ -DoCkKvbdlYrqsZGt -DnbkKvbdZsiIxcrn -DoCjjvbddeOqavbj -EObkKvbdbVBfwjsh -EObjjvbdMoxQvOHT -EPCkKvbdRbEFLiYk -DoCkKvbdlhdTqUqa -EOcLKvbdMIbMRYAS -EObkKvbdDncKkWbd -DncLKvbdfSAvzkcP -DnbkKvbdxsOIlqbH -DoCkKvbdADSYKZhp -EPCjjvbdZshiZESn -DoCjjvbdieLGuPAO -EPCjjvbdkHgMFenL -EPDKjvbddBrlrAUN -DncKjvbdddoSCXCj -EPCjjvbdsQWOibvG -EObkKvbdKkBHvAKZ -EObjjvbdkWWmdBww -EObjjvbdnGeXmNgZ -EOcLKvbdyNrgwrhc -DnbkKvbdNddThiLE -DncKjvbdDjHivYKA -EObjjvbdWXIxWDdg -EObjjvbdrMyixlIJ -EOcKjvbdcyyPxYpb -DncKjvbdcyxowxpb -EOcLKvbdhbOcFXQq -EOcKjvbdHDjuibKK -DoDKjvbdiVZeXRuC -EOcKjvbdnBjXYOnV -DnbkKvbdOTTufdtp -DoDKjvbdVAbRTRSZ -DnbjjvbdRXOEDLgc -EOcLKvbdznopdcLx -DncLKvbdRNXayOUz -DncLKvbdSPtHKFdX -EPDKjvbdxUldqYkn -DoCkKvbdZRNEiNEq -EPDKjvbdrbFllGjy -EPCjjvbdUyHszLPO -DncLKvbdxwhibQZk -EOcKjvbdFWYopMie -EOcKjvbdaNKbTVMg -DnbjjvbdliETqUrB -EObjjvbdRXODbkgc -DnbkKvbdTlWPBWPJ -EOcKjvbdOFEThiKd -EObjjvbdMSXMzVQz -EObjjvbdHDkVjCKK -EPDLKvbdqFceTuaI -EOcKjvbdFyUtaDxC -EOcLKvbdmgExMnGy -DncKjvbdtlYWaUBX -DoDKjvbdCDoaWJlf -EPDKjvbdkyTSTYgU -DoCjjvbdqqtjnLAm -DnbjjvbdGYtuAdXb -DoCkKvbdBhjbLIfK -EPDKjvbdNPwqVmfs -DoCjjvbdsrqsYzFD -EPDKjvbdSPsfjFdX -EPCjjvbdZyDjNbkr -EPDKjvbdqZOgfpcx -EPCkKvbdqGDeUVaI -DoDKjvbdUVkpKUAq -DoCjjvbdRpUGjGEX -DoDLKvbdmgFYMmfy -EPDLKvbdRpUHKFcw -DoDLKvbdEvZQPmKF -DoDKjvbdZshhxdTO -DoCjjvbdiZuGMROG -DoDKjvbdfpBzvdYI -EPCjjvbdmgFYNOGy -EOcKjvbdNrtWGdtp -DnbjjvbdWHxVwgYz -EPCkKvbdJbjDRKDY -EPCjjvbduWOYJpsA -DncKjvbdehLVrORH -DoCjjvbdGFjSOItR -DoCkKvbdjuwODbYX -EObjjvbdJTZBSmXl -DnbkKvbdzQoNIiwA -EObjjvbdjJfHilwr -EOcKjvbdJpyeOfOF -DnbjjvbdqFdEsuaI -EPDLKvbdUxhTzKoO -EPDKjvbdBraCsfXS -DoCjjvbdLAjgNBxR -EObkKvbdlhdTqUrB -EPCjjvbdZoOIeFZj -DnbjjvbdrDdhpNua -EPCjjvbdIHHZxxYH -EPCkKvbdiMEdOVCy -DoDKjvbdhgJbxvKV -DoDLKvbdUyHsyjoO -DoDKjvbdGQATXGfZ -DnbjjvbdvAdYroEh -EPCkKvbdhtydvrUb -DoCjjvbdsQWOicWG -DncLKvbdcJMjLGWx -DoCkKvbdIwsaglQp -DoCkKvbdYkrEUOLm -EObkKvbdVvhxWDeH -EPDLKvbdZMRdTnLm -DoCjjvbdADRwizJQ -DoDKjvbdSwjkmzjx -DnbkKvbdBiKbLIfK -EPCjjvbdRyigsDWA -EPDKjvbdRXOECkhD -EObjjvbddxZtTqez -EObjjvbdbBVdfPow -DncLKvbdMfcQNQVL -EPDKjvbdVBBqTQrZ -DncKjvbdZMRctOLm -DncKjvbdGGJrOIsq -EPCjjvbdZMSETmlN -DoDLKvbdhlEdOVDZ -EOcLKvbdOhAXyAZB -DoCkKvbdyOTIYSiD -DoCjjvbdUtNUGMVj -EObkKvbdWXJYWDdg -EOcLKvbdBhjbKhej -EObkKvbdVwIwvDdg -EPDLKvbdzjUpQDsU -EOcKjvbdqAiFAXHd -DoDLKvbdqrUkNjaN -EOcKjvbdYORAYUvU -EOcLKvbdcIljLFwY -DnbkKvbdVwJXvDdg -DoDKjvbdVBCQsRSZ -DoDLKvbdmuUzKiqf -EObkKvbdJYUCILpp -EPDKjvbdsQVoKCvG -EPDLKvbdmoyyVkZC -EPDLKvbdsCGNLfjy -EOcKjvbdbiNKLGWx -DoCjjvbdrpVnjDWG -EObkKvbdfVzxPizs -DnbkKvbdRXODcLgc -EPCjjvbdjJfIJlxS -DoCjjvbdZLqcsnLm -DncKjvbdjuvnECXw -DoDLKvbdEPDKkXCd -DnbjjvbdOSsvGduQ -DoDKjvbdIMBzmvpk -EPCjjvbdqrUkOLAm -EPCjjvbdTkvOaVoJ -EObjjvbdozmdKwoA -DncLKvbdDxXkstTl -EOcKjvbdfMewHMik -DoDLKvbdGKeTCgmV -EObjjvbdxnSgwsIc -EPCkKvbdaaVdepPw -EObkKvbdqGEFUVaI -DncLKvbdjblKpgUg -DoDLKvbdRWnEDLhD -DnbjjvbdFxuVAcxC -DncKjvbdqZOhGpcx -DoCkKvbdfHjvRnQg -DnbkKvbdwMvANDeN -EObkKvbdFfKSOIsq -DoCjjvbdmajXYPNu -EObkKvbdANHyTXZx -EPCjjvbdLFfHbAqV -DoCjjvbdVgwuxHYz -EPCjjvbdQvmcblHc -DoDKjvbdaSFbhUGL -DncLKvbdzHZMANFX -DncKjvbdySnJNRbH -DoCjjvbdMpYRVnHT -EObkKvbddePSBwDK -EPCkKvbdMfcPmQUk -EObjjvbdMgCpNQVL -DoDKjvbdrEFIonWB -DoDLKvbdFjdsCgmV -EObjjvbdwtmFRYlO -DnbjjvbdIwtBgkqQ -EPCjjvbduaDxrndh -EPDLKvbdShzKRABM -DnbjjvbdfHjvRnRH -EOcKjvbdBiLBjiGK -EPCjjvbdCEPaWKNG -DoDKjvbdtbbuWuoP -DoDKjvbdegkWRmqH -DnbjjvbdNeETiJLE -EPCkKvbdjcLkRHUg -DnbjjvbdjvXOEBww -EOcLKvbdTlWPAvOi -DoCjjvbdrMyixkhJ -EObkKvbdqGEEtWAh -DncKjvbdbBVeGQPw -DoDLKvbdpssfqqjt -DnbkKvbdFWZPomJe -DoDKjvbdSBcdkiYk -DoCkKvbdvBEZSoFI -EOcKjvbdRaceLhxk -EOcKjvbdJKEAKQHE -DoDLKvbddZyQYYpb -EObjjvbdeXzTsqez -DncLKvbdCSaCtGXS -EPCkKvbdlZSrSyHU -EOcLKvbdTJZiqABM -DncLKvbdvAdYsOdh -DnbkKvbdcyxoxZQb -DnbkKvbdhanbdwRR -EPCjjvbdbBVeFopX -DncKjvbdGLFTDHmV -DoCjjvbdiZuGLpmf -EOcLKvbdJbjCqJbx -EObkKvbdGdLWJbKK -DoCjjvbdRkZGVHKs -DoCjjvbdGckWJajK -DncKjvbdAMgxrvyx -EPCjjvbdEPDKjvbd -EOcLKvbdkDLjqGtg -DoDLKvbdNPxRVnGs -DoDKjvbdySmhmRag -EPCjjvbdVqnXadkc -EPDKjvbdTulPitAq -EObjjvbdGLErcHlu -DoDLKvbdHELWKCJj -EObjjvbdbVCHYLUI -DncKjvbdqvpLbiZR -EPCjjvbdvAdZSoFI -EOcLKvbdfjfzcGAE -DnbjjvbdaNKartmH -EOcLKvbdcTDKsdJa -DncLKvbdOSsufduQ -DnbkKvbdyYIiapZk -DoCjjvbdunszqKoU -DoCkKvbddndsLTsr -DoDKjvbdxxJKBoyk -DoDLKvbdrovOibvG -EPCkKvbdiLddOVDZ -EPCkKvbdiBncFWqR -EOcLKvbdZQldiNFR -DoCkKvbdOEctJJKd -DoCkKvbdrMzKZMIJ -DnbkKvbdVhYVwgYz -EOcLKvbdQvnDblHc -DoDLKvbdmJEURVRa -DoDLKvbdCTBDUFwS -EPCkKvbdNrsvHEuQ -DnbkKvbdegkVqnRH -DoCjjvbddBrlrATm -DoCkKvbdCJLCLJFj -EOcKjvbdxZgefXeS -EPDKjvbdZtJJZDsO -DoCkKvbdQvmdDMID -DoDLKvbdRaceLhxk -DnbkKvbdSBdFLhxk -DoDKjvbdOTTufdtp -DoDLKvbdnQZxujyC -DnbjjvbdZshhyETO -DoCjjvbdtvOYJqTA -DncLKvbdRMxBxmtz -DnbjjvbdEzsqElCi -EObjjvbdKefHbAqV -DnbkKvbdmpZyWKyC -DncLKvbdNQXqWOGs -EPDLKvbdVTlsekuj -EPCkKvbdGcjvJajK -EPDLKvbdIryArlxM -DoDLKvbdwyhGFwdr -EPCkKvbdzaAOgGal -DncLKvbdiHKCxvJu -EOcKjvbdLBKgMbXq -DoCjjvbdTppoVVIN -EPDKjvbdNPxQvOHT -DnbjjvbdTvLpJsaR -DncKjvbdnVUyjiqf -EPCjjvbdVUNTfLvK -EOcLKvbdDxYLtTtM -DnbkKvbddePSCXCj -EPDLKvbdgGLzOHHA -DoCkKvbdTukpKTaR -DncLKvbdVUMtGMWK -EObkKvbdXnRAYVWU -DncLKvbdyqOmJJwA -DoDKjvbdFVyQQNKF -DncKjvbdvOszqLOt -EPCkKvbdZRMdhmFR -EPDLKvbdhlFDmuCy -EOcKjvbdkIHLeenL -DnbjjvbdqceJQOWB -DoCkKvbdzitpPdSt -EPCjjvbdFeiqmhtR -DoDLKvbdsQVoJcVf -EPDLKvbdUQpnuVIN -DoDLKvbdWSNxBdlD -EPCjjvbdpyPHgQcx -EOcKjvbdUyHsyjoO -DoCjjvbdxrnJNSCH -DoCjjvbdKDKCpjCx -EPDLKvbdxsOIlrBg -DoCkKvbdnGdxMnHZ -EPDLKvbdfHkWSNpg -DnbjjvbdkHgMGFnL -EOcLKvbdxmsIYSiD -DoDLKvbdEXxLsssl -DoDKjvbdjFLGuPAO -EOcLKvbdeEoRawCj -DoDKjvbdyOTIYSiD -DnbjjvbdIHGyyXxH -DncKjvbdTqQoUuHm -EOcKjvbdMfcQNPuL -DnbkKvbdatbGxKsh -DoDKjvbdOTUWHEtp -EPCkKvbdGLFTCgmV -DoDKjvbdkHfkfGNk -EObjjvbdJXtBhMRQ -EObkKvbdRpUHKGEX -DnbjjvbdiUzFWrVC -EPCkKvbdliETqUrB -DnbkKvbdZjTIQHBf -DoCjjvbdZMSETnLm -EPDLKvbdFWYoomKF -EPDLKvbdRaceLhxk -DoDLKvbdEASJNZwX -EPDLKvbdGZUtaEXb -DncLKvbdyNrgxSiD -EOcKjvbdbVBgXkTh -EPCkKvbdvOszpkOt -EObkKvbdKfGHbBRV -DncLKvbdjvXOEBxX -EPDLKvbdvAcyTPFI -EObjjvbdNsUWGeUp -EPCjjvbdZtIiZDrn -DoDLKvbdrRtkOLBN -DncKjvbdptUHSSLU -DncLKvbdWSOXaeLc -EPCkKvbdiLeDmuCy -DoCjjvbdhyuFkqNf -DnbkKvbdzoPqFDMY -DoCkKvbdGFirOItR -DoCjjvbdEObjkXCd -DnbkKvbdjKFgilwr -EPDLKvbdVwIwvEFH -DoDKjvbdfIKvRmpg -EPDLKvbdOFDsiIkE -EPDLKvbdGKdrcIMu -EPDKjvbdZnmiEeZj -DoDKjvbdKWVFceHJ -DncKjvbdvBDySneI -DncKjvbddeOqawCj -DoCkKvbdEztRFLbi -EPDKjvbdMpXpumgT -EPDKjvbdtunYJqTA -EPCjjvbdegkVqmpg -EObjjvbdlYsRsZHU -EOcKjvbdbUagXkUI -EPDLKvbdANHySvyx -DnbkKvbdmJEUQtqa -EPDKjvbdVUNUFlVj -EPCkKvbdvvlBVaVu -DoCjjvbdmozZWLYb -DoDKjvbdwzIFfXeS -DoDLKvbdNQXpvOGs -DncLKvbdEYXlTstM -EPCkKvbdbUbGwkUI -EOcLKvbdLBLHNBxR -DnbkKvbdePErkUUS -EObjjvbdyXiJaoyk -DncLKvbdVrNxBeLc -DoCjjvbdaRebhUGL -EOcKjvbdxsNhmSBg -EOcKjvbdXrkaMsoY -EObjjvbdhuZdwSVC -DoCkKvbdqGEFUWAh -DoDKjvbdegkVrNpg -DoCkKvbdtcCtvuoP -EOcKjvbdmJEUQtrB -EOcKjvbdWXIwucdg -DoDLKvbdhgKCyWJu -EPCjjvbdcSbkUDjB -EPDKjvbdLrWmZuQz -EPDLKvbdXrlAlsnx -DnbkKvbdKNADygUa -EPDKjvbdyNrhXsJD -EOcLKvbdIsZBSlxM -EPCkKvbddndrkTsr -DnbjjvbdFyUuBEYC -EPCkKvbdJcKCpjCx -EObkKvbdbBWFGQPw -EOcLKvbdFjdrbhNV -EPDLKvbdrDdiQNvB -EObkKvbdkHgMGGOL -EPCkKvbdkySrSyHU -DncLKvbdaaWEfQQX -EObkKvbdehKvRmpg -DnbkKvbdmIdURVRa -DoDLKvbdvBEZSneI -DoCkKvbdNdcshhjd -DncLKvbdZyEKOCkr -DoCkKvbdVrNwbFMD -DnbkKvbdnCKXXoNu -EPDKjvbdSQTgKGDw -EObkKvbdaRfCgtFk -EObjjvbdkWXNcaww -EObkKvbdDihJuxKA -DncLKvbdnVVZkKSG -EPCkKvbdVBBqSpqy -DncLKvbdqGEFUWAh -DoCkKvbdsPvOjDWG -DncKjvbdySmiNRbH -DoDKjvbdraemLfjy -DoDLKvbdnPzZWKxb -DnbjjvbdRjxfVGkT -DoDKjvbdGLEsDHlu -DnbjjvbdRotHKFdX -DoCkKvbdRpUGiecw -DnbjjvbdZjTHogBf -EPDKjvbdcTCjtDia -EOcKjvbdrounibuf -EOcKjvbdVBCRSqRy -EPDKjvbdEvZPolie -DnbkKvbdzRPNJKXA -DncLKvbdBhjbKiGK -DnbkKvbdqrVKmkBN -DnbjjvbdBraDTewS -DnbkKvbdJcKDRJbx -DoCjjvbdbUbHYLUI -DoDKjvbdUyITykOn -DoCkKvbdYlSEUOMN -EPCkKvbdRpUHKGEX -EObkKvbdTAFJICPE -EPDKjvbdrpWPJcVf -DoCkKvbdZnnJFFZj -EPCkKvbdkVvmcaxX -EOcKjvbdyzdnRgiI -EObjjvbdqAiFAXIE -DncLKvbdWWiYWDeH -EPCjjvbdqlzKZLgi -EObjjvbdauCGwkUI -DoDLKvbdtTSSxydc -EObkKvbdbVCGxLTh -EObkKvbdkWWmdBxX -EObjjvbdRNXaxnUz -EOcKjvbdwXLaVaVu -DncKjvbdqTtGqrKt -DncKjvbdIjEAJpGd -EPDKjvbdHffyyXwg -EObkKvbdSCEFLiYk -DncKjvbdiVZeXRuC -DoDLKvbdWWhwudFH -EPDLKvbdrRuKmkAm -EObjjvbdxsNhlqag -EPDKjvbdcJMikFwY -DoDKjvbdpyPHfpdY -DncKjvbdwyhGGXdr -DoCkKvbdkVwODbXw -DncLKvbdJcJbpibx -EPCkKvbdsQWPJcVf -EOcKjvbdZRNEiMdq -EObkKvbdjvXOECXw -EObjjvbdZxcjODLr -DncKjvbdRWmdDMID -DncKjvbdjvWmcbYX -DoCjjvbdnBjXXoOV -DncKjvbdiBnbdwQq -EPDKjvbdDoDKjwCd -EPCkKvbdFxuVBEYC -DncKjvbdFVxopMie -EOcLKvbdKWUfEEfi -EPCkKvbdNrtVgEtp -DoDLKvbdfoazwDxI -DoDKjvbdqquKmkAm -EPDKjvbdhbPCeXRR -DncKjvbdZtIhyETO -EPCkKvbdQwNdCkhD -EPDKjvbdhzUfMROG -DnbjjvbdrpVoKCuf -EPDLKvbdtlYWaUAw -EOcLKvbddoErjstS -DnbkKvbdyzeORghh -EPDLKvbdZnmhdeZj -DoCjjvbdcIlikGXY -EOcLKvbdLAkHNBxR -DoCjjvbdtkwwBUAw -DoCjjvbdgGMZnHHA -DnbkKvbdUsmTfLuj -EOcLKvbdqZPHgQcx -EPDLKvbdLqvlytpz -DoDLKvbdqdFIomvB -EObjjvbdBhjbKhfK -EOcLKvbdrMyjYlIJ -DncKjvbdDncKkXCd -DnbkKvbdNQXpunHT -EPDKjvbdZjSgofbG -DnbjjvbdBiKbLIej -DoCjjvbdGAoQxizm -EOcLKvbdwtldqZLn -DoDLKvbdIrxaSmXl -DoCjjvbdNHDQMpUk -EOcLKvbdTkunaWOi -DncLKvbdNHCpMpVL -DoDKjvbdelfXHNKL -EObjjvbdcyxpYYqC -DoDLKvbdZGwEAOri -DoDLKvbdIxUCHkqQ -DoCjjvbdoznEKxPA -EOcKjvbdbLMGPNcA -EObjjvbdiiegilxS -DoDKjvbdZRNFImFR -DncLKvbdRbDeLhxk -EPCkKvbdqlzJxlHi -EOcLKvbdhkeDnUby -EPCjjvbdhaoDEwQq -EPCkKvbdFkFScHlu -EPCjjvbdJKEAKQGd -DoCkKvbdpxngfqDx -EObjjvbdUGznLwWF -EObjjvbdVZHsykPO -DncLKvbdYlRdUNlN -EPCkKvbdHDkWKBjK -DncLKvbdjKFhKMxS -DnbjjvbdnBjWxPOV -EObkKvbdtcCtvvOo -DnbjjvbdTpqPUthN -DncLKvbdMoxQvOGs -DnbjjvbdfNGXHMjL -EPDKjvbdhgJcZVjV -DoDLKvbdNGbolpVL -EPDKjvbdatbHYLUI -DncLKvbdczZPwxqC -DnbjjvbdZxcimblS -EPDLKvbdKaKgMbXq -EOcLKvbdtbcUwWOo -DnbkKvbdJutfEEfi -DoCjjvbdmIdURUqa -EPCjjvbddBrmSATm -EPCkKvbdXsLaNUPY -DnbkKvbdNPwpvOGs -EOcKjvbdIwsaglQp -DoCkKvbdlhdUQtrB -DoDLKvbdGdLWJaij -DoCjjvbdwXMAvAvV -DnbkKvbdbrbkTdJa -EPDKjvbdFVxpQNJe -DoCjjvbdHDkWJbKK -DnbkKvbdjvXODbYX -DoCjjvbdemFwGmJk -DoCjjvbdQdCaPpcr -EOcKjvbdqcdiQNvB -DncLKvbdbBWFFoow -EOcKjvbdKaKgMawq -EObkKvbdLBKgMawq -DncKjvbdcbSmSAUN -DoCjjvbdyOTHwsJD -EOcLKvbdOStVfeUp -EObkKvbdHffyyYXg -EPCjjvbdmuUykJrG -DoDLKvbdJYTbILpp -DncKjvbdnGdwlmgZ -EPDKjvbdZQldhldq -EObjjvbdUaBpsRSZ -EOcKjvbdrzLpSaIO -DnbjjvbdLGFgbAqV -EPDKjvbdXrlAmUOx -EPDLKvbdtSqryZeD -DoDKjvbdtlXwAtAw -DoDKjvbdaRebgsfL -EObjjvbdUWLpKUAq -EObjjvbdQvmccLgc -EOcLKvbdznopeDMY -EOcLKvbdIwsbHkpp -EPDLKvbdziuQPcsU -EPDLKvbdelevgMik -DoDKjvbdTAFIgbOd -DoDLKvbdbBWFGPow -DoDKjvbdYqNEiMeR -EOcLKvbdhficYuiu -EOcKjvbdyTOImRbH -DncKjvbdiLeDmtby -EPDLKvbdUsmTekvK -DoCkKvbdkCkkQftg -DoCkKvbdVTmUFlVj -DoCkKvbdTIyjRAAl -EOcKjvbdbUafxKtI -EOcKjvbdZsiIxdSn -DoDKjvbdSCEElIyL -DnbjjvbdBsAbsfXS -DoCkKvbdBcpAuimG -DoCkKvbdVwIwvEEg -DnbjjvbdajlFoNcA -EPCkKvbdtSrTYzFD -DnbkKvbdGFirNhsq -EOcKjvbdapHHELzd -DoDLKvbdiUyeXSUb -DnbjjvbdtAGqIABS -DnbkKvbdXsLaMsnx -DoCkKvbdeEnqawDK -EOcKjvbdDxXkstUM -DnbjjvbdcyxoxZQb -DoDLKvbdlrZVZrci -DoCkKvbdTAEiICPE -EOcLKvbdpyPHfpcx -EPDLKvbdVBCRTQqy -DnbjjvbdmJEUQtqa -DnbjjvbdkClKqHVH -EObkKvbdCJKajiGK -EObkKvbdeAURMxJf -EPDLKvbdcSbkUDjB -DncLKvbdsCFmLfjy -EPCkKvbdIwsahLqQ -DoCkKvbdrJAJeMne -DoDLKvbdIHGzYwxH -DoCjjvbdGckVjBjK -EObjjvbdegkVqmqH -DoDLKvbdLKaIWAKZ -EPDLKvbdaRfChUGL -DoDLKvbdyYJJaozL -DoCkKvbdrWpLbhyR -DoCkKvbdLGGIBaRV -DoDKjvbdKyRJrztf -DoCkKvbdjuvnEBxX -EObkKvbdNeEThhkE -EPCjjvbdQwNcbkhD -DoCkKvbdJqZePGOF -EObjjvbdNGbomQUk -EObkKvbdkxrqsZHU -EOcLKvbdrounjDVf -DoDLKvbdkClLRGtg -EOcLKvbdbKkfOnDA -EPCkKvbdRDbaPpcr -EPDLKvbdkHgLefNk -EOcLKvbdFVxpPmKF -EObkKvbdsrrSxzEc -DnbkKvbdFeirOIsq -DncLKvbdzitopDrt -DoCjjvbduWOXjQsA -EPCkKvbdyXhjCPyk -DoDKjvbdaaWEfPow -DncLKvbdvAcySneI -EObjjvbdADRwjZhp -EObkKvbdnPyxvLYb -DncKjvbdijGIJlwr -EPCjjvbdJcJbqJcY -DnbkKvbdkMbLydgP -DoCkKvbdRDbaQQcr -DoCjjvbdxsOIlrCH -DnbjjvbdKQydnfOF -EPDKjvbdcImKKfWx -DnbjjvbdcImKKewY -EObkKvbdqdFJPmua -EObjjvbdajkennDA -DnbjjvbdZyEKNcLr -DoCjjvbdKWVFdEgJ -EPDKjvbdWXIwuceH -DnbjjvbdqiAJdlne -EOcLKvbdkyTRryGt -EPCjjvbdpaJFAWgd -EPCjjvbdmJDsqVSB -EPCjjvbdREDAopdS -DoCjjvbdRpUHKFdX -DncKjvbdptUHSSKt -EPCjjvbdiCObdvpq -DncLKvbdNwnuzcmt -DncKjvbdqdFIpOWB -DoDKjvbdjggLefNk -EObkKvbdrNZiyLgi -EPCkKvbdaSFcITfL -DnbjjvbdGLFTDINV -EPCkKvbdiLeENuDZ -DncLKvbdZyEJmcLr -EObjjvbduDCuWvOo -DoDKjvbdNQXqWNgT -DncKjvbdVBCRTRRy -EPCjjvbdSQUGifEX -EOcLKvbdANIZSvyx -DoDKjvbdvBDyTPFI -DnbkKvbdEPCkLWbd -DoCkKvbdyYIjCPyk -DnbkKvbdelewGmKL -EPDLKvbdatbGxLUI -EPDLKvbdTvLojTaR -DoCjjvbdhtyeWrVC -DoDKjvbdzeZnzdzQ -DnbjjvbdyzdnRhJI -EPCjjvbduLxWaUBX -EOcLKvbdkyTRsYgU -DnbjjvbdCTBCsewS -EObjjvbdjAPgApHK -EPDLKvbdwkWdHzyf -EObjjvbdsPvOicWG -DoCkKvbdTulPisaR -DnbkKvbduCcUvuoP -EObkKvbdZRMdiMeR -DoCkKvbdSPtHJfDw -DncLKvbdKaLGlaxR -DnbkKvbdRpTgKGDw -DoCjjvbdWXJYWEEg -EObjjvbdWXJYWDdg -EOcKjvbdKCjCqKCx -DnbkKvbdakMGPNcA -DoDKjvbdwkXDgzzG -EObkKvbdNHDPlotk -DncLKvbdyzdmrIJI -EObkKvbdFkErbhMu -EPCkKvbdNeDsiIjd -DoDKjvbdIGfyyXxH -DoCjjvbdZyDinDLr -EPCjjvbdemFvfmJk -EObjjvbdJYTbILqQ -DnbjjvbdWXIwucdg -DoCjjvbdiHKCxvJu -EPDKjvbdfpBzwDxI -DoCjjvbdaNLCStlg -EPCkKvbdnVUykJqf -DoCjjvbdyYIjBozL -EPCjjvbdzjUpQDsU -DoDLKvbdZxcjOCkr -EPCkKvbdeFOrBvcK -EPDKjvbdKaKflaxR -EOcLKvbdfMevgMjL -EPDKjvbdGckWKCKK -DoCjjvbdKVuFdEgJ -EObjjvbdfMfWfmJk -DoDLKvbdMfbomQVL -EPDLKvbdRkYeuGjs -EOcLKvbdKfGHaaQu -EObkKvbdoznDjwoA -EOcKjvbdUMWPBVoJ -DoCkKvbdFjeSbgmV -EPCjjvbdrEFJQOWB -EOcLKvbdvAcyTOdh -DnbjjvbdWfYzUAOs -EObkKvbdTkuoBWPJ -DnbkKvbdFpASvgFy -DoCjjvbdczZQXyRC -DoCjjvbdRDcBQQdS -DoDKjvbdqYngfqDx -EObkKvbdWRmwbElD -EPCjjvbdFyVVBDwb -EObjjvbdBhjbKhej -DncLKvbdzaAPGgBl -EObkKvbdTppoVUgm -DoCjjvbdbrcLTcjB -EPCkKvbdGLFTCglu -DoDLKvbdDwxMUUUM -EPCjjvbdNQYQumgT -DncKjvbdmfeXmOGy -EPCjjvbdwtmFRYkn -DoCkKvbdsBfMlGjy -DncLKvbdRpUHKGDw -EObjjvbdjblLQfuH -EObjjvbdJYTbHlRQ -DoCkKvbdmttyjiqf -DoCkKvbdZQldiMdq -EPDKjvbdFejSNiUR -EOcLKvbdjgfkfFnL -DnbjjvbdMpYQvNgT -DnbkKvbdUyIUZjnn -DnbkKvbdJbjDRKDY -EPCjjvbdeEnrBvcK -EOcKjvbdyzdnSIIh -DoDKjvbdDoDKjwCd -DoDLKvbdCSaDUFwS -DoDLKvbdIrxaTMwl -DnbkKvbdRNXayNtz -DoCkKvbdxxJKBoyk -DncLKvbdnGdxNOGy -DnbjjvbdySmhlqbH -DoCkKvbdxwhjBoyk -EPCjjvbdZQleIleR -EPCjjvbdaRfChTek -EOcKjvbdYTMBNUPY -DoCjjvbdegkWSNpg -EObkKvbdziuQPdTU -EOcKjvbdnCKXYOmu -DoCkKvbdZnmhddzK -EObjjvbdzaAPGgBl -DoDLKvbdePFSjtTr -EPCkKvbdNrtWGeVQ -EPCjjvbdelfWfmKL -DoDKjvbdKxpjSztf -EPDKjvbdxmsIXsIc -EPCjjvbddZyPxYqC -DoDKjvbdvOszqLOt -DncKjvbdatbGxLTh -EObjjvbdzoQQdbkx -DoCjjvbdZRMeImEq -EOcKjvbdqTtGqqjt -EOcKjvbdqAheAWgd -DnbjjvbdySmhmRag -DncKjvbdjKFhJlwr -EPDKjvbdqFceUWBI -DoDKjvbdsBemLgLZ -EPDLKvbdKQzEoFnF -EOcKjvbdFjdsCgmV -EObjjvbdpfEEtWBI -EPDKjvbdZxcjOClS -EPDKjvbdnBivwoOV -EPCjjvbdrylQTAhO -EPDKjvbdKaLGmBxR -EPDKjvbdHgGzYwxH -EObjjvbdkHflGFmk -DnbjjvbdqGDeUVaI -EPDKjvbdMgDQNQUk -DncLKvbdSKyGVHKs -EOcKjvbdqFdEsvAh -EOcKjvbdYkrETnLm -DnbkKvbdqBIeAXHd -DncLKvbdZQldhmFR -DncLKvbdFjeSbhMu -EPCkKvbddePRavcK -EPCkKvbdssRsYzEc -EPCkKvbdRadFLhxk -DnbkKvbdVvhxWEEg -EOcLKvbdIryArmYM -EPCkKvbdKfGHbAqV -DncKjvbdEKIJuxKA -EPDKjvbdIwsbIMRQ -EObkKvbdzaAOfgBl -DncLKvbdeUAUASlv -DnbjjvbdlqxuZsDi -DnbjjvbdUWMQKTaR -EOcLKvbdNGbpNPtk -EPDKjvbdWSOYCEkc -DoCkKvbdjggMGGOL -DoCjjvbdSQUHJecw -DncLKvbdZyDjODMS -EObjjvbdfpBzvcxI -EOcLKvbdTlVoAvPJ -DnbjjvbdVviYWEFH -EPCkKvbdZnmiFFZj -EObjjvbdNGbpNQUk -DoDLKvbdrbGMkfjy -DoDLKvbdxnShYSiD -EObkKvbdJYTahMRQ -DoDLKvbdoAKzshEO -DoCkKvbdZxcjOCkr -EPDLKvbdRWmdCkgc -EPCkKvbdGFiqnJUR -DoDKjvbdRzJgsDWA -DncLKvbdptTfqqjt -EPDKjvbdmIctRUqa -EObkKvbdnBiwXoOV -DnbjjvbdfMevfljL -EObkKvbdBraDUGWr -DncKjvbdUxhTzKnn -DoCjjvbdmfdxMmfy -DnbjjvbdhuZeWrVC -DnbkKvbdLiCLpxAS -DnbjjvbdKfFgbApu -DnbjjvbdziuPpETU -DoCjjvbdwuNEqZLn -EPCkKvbdEXwksssl -EPCjjvbdhgKCxujV -DoDKjvbdhlEdOVDZ -DncKjvbdLAjgMbXq -DncKjvbdOFEThhkE -DoCkKvbdANHxrvzY -EPCjjvbdZtIiZDrn -DoCjjvbdYpldhmEq -DncLKvbdqwPlDIyR -DncLKvbdUtNUFlWK -EObkKvbdkWXODbYX -DnbjjvbdRzJhSbvA -DoCkKvbdEJgjVxKA -DncKjvbdxnSgxShc -EObjjvbdbUbHYKsh -DncLKvbdZoNiFEzK -EPDKjvbdbiMjKevx -DnbkKvbdIwsbHlRQ -EObjjvbdhWyAzzAJ -EObkKvbdqvpLcIyR -EObjjvbdGGKSOIsq -EObkKvbdTpqPUthN -DncKjvbduaEZTOdh -EObkKvbdJJdAJofd -DoCkKvbdEKIJuwjA -DncLKvbdDnbjkXDE -DnbjjvbdhbObdwQq -EObjjvbdunszpkPU -EPCjjvbdwNWANDdm -EPDLKvbdozmcjxPA -EObjjvbdZnmiFFZj -DnbjjvbduDDUwVno -EOcKjvbdZjShPfbG -DncLKvbdADSXiyhp -DoCjjvbduCcVXWPP -DnbkKvbdffLzOHHA -DncLKvbdBdPaWJlf -EPDLKvbdJvVGEFGi -EPCkKvbdvwMBWBWV -EObjjvbdijGHjMxS -EPCkKvbdaNLCTVNH -EPCjjvbdbAudeopX -DoDKjvbdozmcjwoA -EPCjjvbdYlRctOMN -DoCjjvbdDoDLKvcE -EObkKvbdVqmwaeMD -DnbjjvbdqvolChyR -EPCkKvbdRkZGVGjs -DoDKjvbdjvXOEBxX -DoCjjvbdIHHZyXwg -DnbkKvbdLBKgNCYR -EPDKjvbdyNsHxShc -EOcKjvbdyzdmqhJI -DnbjjvbdqFcdtVaI -EObjjvbdrJAKElne -DncKjvbdTvLpJtAq -EObkKvbdDoDKjvbd -EPCjjvbdYlRcsnLm -DoDKjvbdegkVqmqH -EPDLKvbdZHXEAPSi -DoDKjvbdakLennDA -DncLKvbdrDdiPmua -DoCjjvbdhbPDEwRR -EPDLKvbdtcDUvuno -DnbjjvbdEKHjVxKA -EOcLKvbdYqMdhmFR -EPDLKvbdmttzKiqf -EPDLKvbdTkvPAuoJ -DncLKvbdVAbRTQqy -DncLKvbdLBKflbYR -DoCjjvbdZyDimcMS -EOcKjvbdFpATXHFy -EObkKvbdnCJwYOmu -EPCkKvbdVZHszLPO -EPCkKvbdCSaDTfXS -DncKjvbdNVSqjmAX -EPCkKvbdFjdrbhMu -EPCkKvbdbsCkUDjB -EObjjvbdMowpumfs -DoDLKvbdRotHJecw -DnbjjvbdTfzmkwWF -EObjjvbdBcpAvKNG -DoDLKvbdWHxWXfxz -EPCjjvbdqUUGrSKt -DncLKvbdliDsqVSB -DnbkKvbdBdQAujMf -DnbkKvbdWXIxVcdg -DoCkKvbddePSCXCj -DnbjjvbdZirhPfbG -DnbjjvbdyXiKBozL -DnbjjvbdznpREcMY -DncKjvbdJcKCqKCx -EPCkKvbdJbibpjDY -EPDLKvbdkClLRHVH -EPDKjvbdTvLoisaR -EOcKjvbdZGwEAPSi -EPCkKvbdKRZdnenF -DncKjvbdfMfXGmJk -EPCkKvbdhfibyWJu -EOcKjvbdMIbLqYAS -EPDLKvbdbUbHXjtI -EObkKvbdCSaDUFwS -EPDLKvbdGGJqnJUR -EOcLKvbdDoDKjvbd -DnbjjvbdFkFTDIMu -DnbjjvbdgFlZnGgA -DoCkKvbdakLfPODA -EPDLKvbdDwwlTstM -DoCjjvbdMJBkqYAS -DnbjjvbdiGjCxujV -EPDLKvbdVwIwuceH -EPDLKvbdZyEKOCkr -EPDKjvbddoFTLTtS -DoCkKvbdXrlAlsnx -EOcLKvbdZoOIeEzK -DnbjjvbdaMjbTVMg -EPDKjvbdeOeTKssr -DncKjvbdSKxetfjs -DoCjjvbdpxnhGpcx -EPDLKvbdmtuZkJrG -DoCjjvbdYkqdTmlN -EOcLKvbdJuuGEEfi -DoCjjvbdhzUfMROG -DncLKvbdddnrBvbj -EOcLKvbdWSNwbFMD -DoDLKvbdtSrTYydc -EPCjjvbdRjxetgKs -DncKjvbdFxttaEYC -EPDLKvbdiBncFWpq -DnbjjvbdyTOImSCH -DoDKjvbdcyyQXyRC -EOcLKvbdZLrEUOLm -DoCjjvbdXmqAYVWU -EPCjjvbdUsltFkvK -DncKjvbdLqvmZuQz -DnbjjvbdZjTIQGaf -DoDKjvbdzoPpeCkx -EPDKjvbdGGKSNhsq -DncKjvbdtSrSxzFD -EPCkKvbdyOTHxShc -DnbkKvbdehKvSORH -DoDLKvbdWIXvYHYz -EObkKvbdDoCkLXCd -DoDLKvbdLBKflaxR -EPDLKvbdKQzFOenF -EObjjvbdjFLHVPAO -EObkKvbdFeiqmhsq -DoDKjvbdRotHKFdX -DnbkKvbddZxpYZQb -DncKjvbdqqtkNkBN -EPDKjvbdZjShPgBf -DoCkKvbdNHCpMouL -EObjjvbdxZgefYFS -DoCjjvbdNrsvHEuQ -DoCjjvbdwzHeewdr -EObjjvbdvPTzpkPU -EPDKjvbdrounibvG -DnbkKvbdpstGqqjt -EPDLKvbdeFOrCXDK -EOcLKvbdGBPRYizm -DoDLKvbdNwnuzdOU -DnbkKvbdRMwaxnUz -EOcLKvbdDihKWXjA -EObkKvbdFeirOJTq -DoDLKvbdSKxeuGjs -EOcLKvbddndsKssr -DnbjjvbdiCPDEvpq -EOcKjvbdMoxQumfs -DnbkKvbdfNGWfljL -DnbkKvbdIHGzZXwg -EObjjvbdTlWPAvOi -DoDLKvbdnPyyVkZC -EOcKjvbdkWWmdBxX -EObkKvbdEJgjWXjA -DnbjjvbdkMalZdgP -DnbkKvbdsCGNLfjy -DnbjjvbdYqMeIleR -DncLKvbdMgComPtk -DoCkKvbdMfbolouL -DncKjvbderAvzlDP -DnbjjvbdqwQLcIyR -EObjjvbdcImJkFwY -EPCjjvbdYzberKVy -DoCjjvbdEzsqElCi -EObkKvbdRotGiecw -EPCkKvbdGLErcINV -DoCkKvbdYpmEiMdq -DoDKjvbdJXsaglRQ -DnbkKvbdFVxpPmJe -DnbkKvbdxUmEpyLn -EPCjjvbdLrXMytpz -DnbkKvbdhtzEvqtb -EPDKjvbdDxYLstTl -EPCkKvbdiBoDFXQq -EPCkKvbdZoOJEeZj -DoCjjvbduDCuWuoP -EObkKvbdjcLkQfuH -DoCkKvbdcImKLGWx -EPDLKvbdEYXlUUTl -EOcLKvbdZLqdTnMN -EOcKjvbdmozYujyC -DncLKvbdJpzEnfOF -EOcLKvbdiCPCdvpq -DncKjvbdADRxKZhp -DoDLKvbdmJDsqVSB -EObkKvbdnBiwYPOV -EObkKvbdqwQMDIxq -DncKjvbdeFOqbWbj -EPDKjvbdmfeYMmfy -DnbkKvbdGLFSbhNV -DoDLKvbdwkXDgzzG -EObkKvbdbAvFFpQX -EPDLKvbdyXhjBoyk -DoCjjvbdMfbpMouL -DoCjjvbdREDApRES -DncLKvbdmajWwnmu -DoDLKvbdIidAJofd -DoCjjvbdSZihTCvA -DoCkKvbduLwvaUBX -EPCkKvbdiHJbyVjV -EObkKvbdGYtuAdXb -DoDLKvbdCTBCtFwS -EOcLKvbdhlFENtby -DoCkKvbdySnIlrBg -EPDLKvbdwuNFQyMO -DncKjvbdlqxtzTDi -DoDKjvbdWWhxWEFH -DoCkKvbdiHJcZVjV -EPDKjvbdCflGHAzc -DncLKvbdzROmJKXA -EPDLKvbdCJLBjhej -EOcKjvbdVrNwbEkc -DnbkKvbdUtNUFlWK -DoDKjvbdLBKflbYR -EPCjjvbdauBfwkTh -EPCkKvbdrXQMDJZR -DnbjjvbdnVUyjjSG -DncKjvbdiMEdOUby -DoDKjvbdqiAKFNPF -EOcLKvbdQdDBQQcr -DoDKjvbdpxnggQdY -DncKjvbdtSrTYydc -DnbjjvbdwzHefXeS -DoCjjvbdRosfjGEX -EPCkKvbdnPyxujyC -EObjjvbdZyEJnCkr -DnbkKvbdhytelRNf -EPDLKvbdeYZstSFz -EObjjvbdTfzmlXVe -EOcKjvbdbKkenmcA -DncLKvbdvwMAuaVu -EObkKvbdwMvAMdEm -EOcLKvbdkHflFfNk -EPCjjvbdzoPpeDMY -DoCjjvbdiLeDmuCy -EOcKjvbdRpUGjGDw -DnbkKvbdUslsekuj -EPCjjvbdmJEURVRa -DncLKvbdZjSgofaf -EOcLKvbdaMjasUlg -DoCjjvbdREDBPpdS -DnbjjvbdIwsaglQp -DoCkKvbdkNCLzFHP -DoDLKvbdaRfChUFk -EPCjjvbdrRtjnKaN -EPCkKvbduoTzpkOt -EOcKjvbdnHFYMmfy -EOcKjvbdHDkVjBjK -EObjjvbdEXxMTssl -DnbjjvbdNPxRWOHT -EObjjvbdiZtfLpmf -EObjjvbdTvLojTaR -DoDKjvbdKkBIWAKZ -DoDLKvbduCbtwVno -DncLKvbdmttzKjSG -DncLKvbdbBVdfQQX -EObkKvbdyXiKBpZk -DncLKvbdzGxlAMdw -DoCkKvbdMpXpvNfs -DoCkKvbdKQydoGOF -EPDLKvbdTfzmlXVe -EPDKjvbdQccBPqES -EPCjjvbdZtJIyESn -DoCjjvbdVrOXbElD -DnbjjvbdbLMGOmcA -DnbkKvbdnPzZWKyC -EPDLKvbdmajWwoOV -EObjjvbdQwOEDMHc -EPCkKvbdTvMQKUBR -DoCjjvbdOTUVgEtp -DoCkKvbdIHHZyXxH -EPDLKvbdDoDLKwDE -EObjjvbdiZtfMQmf -EObjjvbdijGHimXr -DoDKjvbdVrNxCElD -EPDLKvbdJutedFGi -DnbjjvbdmSZVZsEJ -DncKjvbdqlzKYlIJ -EOcKjvbdfelZnGgA -EOcKjvbdYlRctOLm -DoDKjvbdPxmAHSrK -EPCjjvbdWWiYWEEg -DoCjjvbdbAvFFoow -EOcKjvbdFjeSbglu -EPDLKvbdlqyVZsEJ -EOcKjvbdddoRbXDK -EPCkKvbdaRecHtFk -DncLKvbdSKyGUgKs -DoDLKvbdcyyPwyQb -DoDLKvbdnVUzKjRf -EObjjvbdYkqdUOLm -EObkKvbdRbEEkhyL -DncKjvbdtAHQhAAr -DnbkKvbdVqmwbFMD -EOcLKvbdznoqFDLx -EOcLKvbdEXxLtTsl -DnbkKvbdtumwipsA -EObjjvbdmJEUQtqa -DncKjvbdxwhjCPyk -DnbkKvbdyfyMANFX -DncLKvbdiVZeXRtb -EObkKvbddtAUATMv -EOcKjvbdxnSgwriD -EObjjvbdlrZVZrdJ -EPCkKvbdsBelkfkZ -DoDKjvbdFVyPomJe -EPCkKvbdQmYBxnUz -EOcKjvbdSBdFLhyL -DncLKvbdmJETpuSB -DoDLKvbdRECaPpcr -DncLKvbdIxUBglRQ -DoCjjvbdpssfrSLU -DnbkKvbdSQUHJedX -EObjjvbdkySrTZHU -EObkKvbdZtIiZETO -DoCjjvbdtumwipsA -DoCjjvbddBrlrAUN -EPCjjvbdKCjDQibx -DoCjjvbdQccAopdS -DoDLKvbdSBceLiYk -EPDKjvbdREDAoqDr -EOcKjvbdZQleJMeR -DoCkKvbdEARiMywX -EPDKjvbdkDLkQgUg -DncLKvbdFjdsDIMu -EPCjjvbdlrYtysDi -EPCkKvbdezuxeIsw -EObkKvbdyNsHxTJD -DnbkKvbdemGWgMik -DoDLKvbdBhkCKhej -EOcLKvbdjvWmcaww -EPDLKvbdqTsgRrLU -EObkKvbdZyDimcLr -EPCjjvbdlrYtzTEJ -DoCkKvbdHgGyyYXg -DoCkKvbdZoNhddyj -EPDKjvbdhtzFWquC -EPCkKvbdDoCkKwDE -DoDLKvbdsrqsZZeD -EPCkKvbdiHJbxuiu -DoCjjvbdhlFEOUcZ -EPDKjvbdDigiuwjA -EPDKjvbdQdDBPqES -DoCjjvbdcTCjsdKB -DncLKvbdUsmUFkuj -EPDLKvbdnHEwlnGy -EOcLKvbdxVNEqYkn -DoDKjvbdEuxopNJe -EObkKvbdkClLQfuH -EPCjjvbdcTDLUEKB -EOcKjvbdEPDKkXDE -EPCjjvbdXsLaNUOx -DoDKjvbdFWZQQNKF -EPDLKvbdUtMtFlVj -EOcKjvbdzaAPGfal -DnbkKvbdHlBznXRL -DoDLKvbdTlVoBWPJ -EPCkKvbdDoCjkXDE -EOcKjvbdrzMQTAhO -EOcLKvbdozmdLXoA -DoDLKvbdzQnmIjXA -DoCkKvbdmgExMmgZ -EPCkKvbdzjUoocrt -EOcLKvbdwyhGFweS -EOcLKvbdWWhxVceH -DncLKvbdqqtkOKaN -DoCkKvbdOTTvHEuQ -DoDLKvbdjJehKMwr -DoCjjvbduDCtvuoP -DnbjjvbdqdEiPmvB -DnbjjvbdhtzEwRuC -DnbkKvbdRkYetfkT -DoDKjvbdCDpBVjNG -DoCkKvbdcSbjscjB -EPDLKvbdYpldiMdq -DoCjjvbdaaWEfPow -EOcKjvbdqZPHgQdY -DoCkKvbdeOdrjtUS -DoDLKvbdFaPRZJzm -DnbjjvbdRECaPqES -DncKjvbdaMjaruMg -EObjjvbduVnYJpsA -DnbkKvbdqTsfrSLU -DncKjvbdYqMeJMdq -EOcKjvbdvvlBWAuu -DnbjjvbdUxgtZkOn -EOcKjvbdOSsufduQ -EOcLKvbdtumxJqTA -DncKjvbdIryAsNXl -DoDKjvbdMuTRkNAX -DoDLKvbdxnSgwrhc -EOcKjvbdiHKCxujV -EObkKvbdeKJrVtzn -EPDLKvbdjhHMGGNk -EOcLKvbdkVwNdBww -EOcLKvbdygZMANEw -EPDLKvbdRXODcLhD -EPCjjvbdSPsfjFcw -DoDKjvbdYpleIldq -DoDLKvbdOEcsiIjd -DnbjjvbdddoRavbj -DncLKvbdHDkWKBjK -DoCjjvbdxxJKBoyk -EPDKjvbdYkqdUNkm -DoDLKvbdDnbjjvcE -DoCkKvbdVvhxVceH -EPDLKvbdWRnXbFMD -EObkKvbdliEUQtqa -EPCkKvbdNQXqVmfs -EOcLKvbdIGfyyYYH -DncKjvbdxUldpxlO -DoDKjvbdznopdcLx -DncKjvbdHDkVibKK -EPDLKvbdjlbLydgP -DoDKjvbdYTMAltOx -DoDKjvbdcSbkUEKB -EPCjjvbdzoQREblY -EOcKjvbdZxcinDMS -DoDKjvbdZyDjODMS -DoCjjvbdxZgfFwdr -EPDLKvbdaMkBsVMg -EPCkKvbduDDUvuno -DncKjvbdsCFmLgKy -DoDLKvbddeOrCWcK -DncLKvbdNddThhjd -EOcKjvbdBvzcheQW -EPDLKvbdeEnqbXCj -DoCjjvbdNrtVfduQ -EOcKjvbdZQmEiNFR -EPCkKvbdGFjSNiTq -EPDKjvbdZxcinCkr -DoCjjvbdkNBlZdgP -DoCkKvbdEYXkstTl -DncLKvbdYpmEhmEq -EOcLKvbdePFSkTsr -DoCjjvbdemFvfmKL -DnbkKvbdemFwGljL -EPDLKvbdmbJvxOnV -EPCjjvbdtbcVXVoP -EOcKjvbdFkErcHmV -DoDKjvbdVUMtFlWK -EOcLKvbdkMakydfo -DnbjjvbdIMBznWqL -EObkKvbdptUHRrLU -DnbkKvbdjJfHilwr -EPCjjvbdGYuUaDxC -EObjjvbdmtuZjjRf -DncLKvbdkCkkQfuH -DoDLKvbdtlXwBUBX -DncLKvbdCWzchePv -EObkKvbdrEEiPmua -EOcLKvbdYqNFIldq -DoDLKvbdfILWRnQg -DoDLKvbdqUUGrRkU -DoCjjvbdfMfWflik -EOcLKvbdOTTugEuQ -DncLKvbdjvWnDaww -EOcLKvbdsPuoKDVf -EPDLKvbdZirhPfaf -DoCjjvbdDwxLsstM -DnbjjvbdfHkWRmpg -DncLKvbdrpWOibuf -EPDLKvbdZtIhyESn -DncLKvbdwygfGYEr -EPCjjvbdeEoSCWcK -EPCjjvbdjuvmdBww -EObjjvbdqUTfqqjt -EOcLKvbdZjSgogBf -DoDKjvbdYqMdiMeR -DoCjjvbdKefICApu -DoDLKvbdMfcQNQVL -EPCkKvbdjggMGGNk -EObkKvbdCDoaVjMf -EObkKvbdWWiXuceH -EOcLKvbdURROuVHm -DnbjjvbdpssfrSLU -DncKjvbdgFkzNgHA -DnbjjvbdaSFbgtFk -DncLKvbdIxTahMQp -EPDLKvbdKWVFceGi -DncKjvbdFVyPomKF -DoDKjvbdZirgpHBf -EObjjvbdVqmwadkc -EPCkKvbdieLHVPAO -DncKjvbdZLqdUOMN -DoDKjvbdWWiYWDeH -EObkKvbdQwNdClID -DnbjjvbdMoxRVnGs -DncLKvbdrDdiPmvB -DnbjjvbdZQleJNFR -EOcLKvbdrDdhpOVa -EPDLKvbdYqNFImFR -DoDKjvbdEYXlTtUM -DoCjjvbdhuZeWqtb -EPDKjvbdMfcPlpVL -EOcKjvbdNQYQvNfs -DoDKjvbdiUzFXSVC -DoCkKvbdmRxtzSci -DnbjjvbdbiMikGXY -DoCjjvbdQdDBQQdS -EObjjvbdqZPIGqDx -DoCkKvbdkWWmdBxX -DoDKjvbdKxpirzuG -DoCjjvbdlBNPNALA -DoCjjvbdhzVGMROG -DoCjjvbdzoQREcMY -EPDKjvbdlAlnmALA -EPDLKvbdwuMeRZLn -EOcLKvbdYqMdiNFR -EObkKvbdOTTugEuQ -EOcKjvbdYTMAmUOx -DnbjjvbdRDcBQRES -DoDLKvbdidkHVPAO -EPCkKvbdSKyFtfjs -DoCjjvbdhytelQmf -DncLKvbdEztRElCi -EPDLKvbdRWnEDLgc -DoDKjvbdwuNFQyLn -EObkKvbdGLFTDHmV -DnbkKvbdShyiqABM -EObkKvbdUaCQsRSZ -EOcKjvbdjuwNcbXw -DnbkKvbdmfeXlnHZ -DncKjvbdsPuoKDVf -EOcKjvbdNGbomPtk -DoDKjvbdvPTzpkOt -EPDKjvbdJqZdneme -DncKjvbdqTtGqqkU -DnbkKvbdjggLeemk -DoCjjvbdVZIUZkOn -EPCkKvbdzjVPodTU -DncKjvbdnBjXYOnV -DoDKjvbdHgGzYxYH -EPCkKvbdSZigsCvA -EPCjjvbdtbbtvuno -DoDKjvbdPIAXyAZB -EObjjvbdRNXaxmtz -DoCkKvbdUyITykPO -EPCkKvbdssRryZeD -EObkKvbdJuuGEFGi -DoDLKvbdxZgfGXeS -EObjjvbduoTzqLOt -DoDKjvbdbrbkTcjB -DncLKvbdxxIiaoyk -DoCjjvbdFxtuBDxC -EPDLKvbdzaAPGgBl -EPDLKvbdpxnhGqDx -EOcKjvbdtSqsZZeD -EOcLKvbdMowpvOGs -EObkKvbdVBCRSpqy -DoCkKvbdZRNEiMeR -EPCjjvbdczYowyQb -DncKjvbdjgfkfGNk -DnbkKvbdssSTYzFD -EOcLKvbdVhYWYGxz -DncKjvbdKDJcQibx -DncKjvbdZHWdAPTJ -EPCkKvbdFjdsChNV -DoDLKvbdJcJcRJcY -EPCjjvbdRjyGVHLT -DnbkKvbdBcpBWKMf -DoCjjvbdxUmEpyMO -EPDKjvbdZoNiFEzK -DoCjjvbdPIAYZAZB -EOcLKvbdFejSOIsq -DoDKjvbdjggMGFmk -EObkKvbdWRnXadlD -EObkKvbdnGdxMmfy -DoDLKvbdLBKgNBxR -DoCjjvbdaSGChTek -EPCkKvbdSCEElIxk -EObjjvbdIxTbHlQp -EPCkKvbdOEcshhkE -EOcLKvbdbsCjsdKB -DncLKvbdCSaDUGXS -EPCjjvbdRzJgsDWA -EPDLKvbduCbuXVno -EOcLKvbdGdLViajK -DncKjvbdCWzdJEpW -DncKjvbdjuwODbXw -DncLKvbdqUTfqqjt -EOcKjvbdxUmFRYkn -DoCjjvbdVAaqSqRy -EPDLKvbdaMkBsUlg -EOcKjvbdGLFTCgmV -EPCkKvbdZeYGzgiC -DoCjjvbdwXLaWBVu -DoCjjvbdelevgMik -EPDKjvbdkHgMGGOL -DoCjjvbdcJMjKewY -EOcLKvbdwzHfGYEr -DncLKvbdlZTRryGt -EOcLKvbdfVzwoizs -EPDKjvbdhzUelRNf -EPCkKvbdiHKCxvKV -EOcKjvbdGFjRmhtR -EPDLKvbdGLEsChNV -DoDKjvbdYORAXuWU -DnbjjvbdpstHSSKt -EObkKvbdegkVqmpg -EPDLKvbdhyuGMQmf -EObkKvbdliDtQtqa -DoCkKvbdfNGXGlik -DoCkKvbdHfgZyXwg -DoCjjvbddndsKssr -EPCjjvbdZMSDsnLm -EObkKvbdEXxMTstM -EPDKjvbdJvUecdfi -DnbkKvbdVUMsekuj -EPCjjvbdPyNAGsSK -DoCjjvbdMSWmZuQz -EObkKvbdBcpBVjNG -DnbjjvbdezuxdiUX -EPCjjvbdBdQAvJlf -DncKjvbdOTUWHFVQ -DoDKjvbdaSGDIUFk -EOcKjvbdUGzmlWvF -EOcLKvbdjlakydfo -DoCkKvbdWSOXaeLc -DoDKjvbdznpRFDLx -DoCkKvbdwtldpxlO -DoDLKvbdGdLVjBjK -EObjjvbdmttykKSG -DoDKjvbdZjShQGaf -DoDKjvbdrDdhomvB -EPDLKvbdiUyeXSVC -DncKjvbdIsYaSmXl -DnbjjvbdVhXvYHYz -EPDKjvbdwzHfGXdr -EOcKjvbdxsOJMqbH -DoCjjvbdehKuqmqH -EPCjjvbdZdxGzhJC -EOcKjvbdsCGMlHLZ -DoCjjvbdOEcshhkE -DoCjjvbdEzsqElDJ -DncLKvbdURRPVVIN -EPCkKvbdZoOJFEzK -DnbjjvbdBiKajhfK -EOcLKvbdbUafwkTh -EOcLKvbdVZHszKoO -DnbkKvbdGKdsDIMu -DnbkKvbddoFSkUUS -DnbjjvbdPxmAGrqj -EPCjjvbdKNADzHVB -EPCjjvbdcyxpXxqC -DnbkKvbdLBLGmBxR -EPDKjvbdFWYopNJe -EPCkKvbdcJNKKewY -DoCjjvbdGLErcHmV -EPCjjvbdWXIxWDdg -DnbkKvbdQvmcbkhD -EOcLKvbdbVCGwjtI -DoCjjvbdmgFYMmfy -EPDLKvbdQdDApRES -DnbkKvbdWWhwvEFH -DnbjjvbdxZhFexFS -EPCkKvbdCIjakJGK -EPCkKvbdKQyeOfOF -DncKjvbdEObjkXDE -DnbjjvbdNGcPlotk -DoCjjvbdVUMtGMVj -EPDLKvbdelfWgNKL -DnbkKvbdqwPlDJZR -DncLKvbdbiMikFwY -EObkKvbdkNBkzEgP -DoCkKvbdmuUyjiqf -DncKjvbddneSjtTr -EPCkKvbdRkZFtgLT -EObkKvbdRjyGUgLT -EPCkKvbdKaKgMaxR -DnbkKvbdZMRdTnMN -EPCkKvbdqZOhGpcx -EPCkKvbdxwhjBozL -DncKjvbdGckViajK -EPCkKvbdiifHilxS -EOcLKvbdqUUGrRjt -EPCjjvbdbhljLGWx -DnbkKvbdhgKCxujV -DoDLKvbdJSyAsNXl -DoDLKvbdjgflFenL -EPCkKvbdMJBlQxAS -DncLKvbdUMVoAvPJ -DoCkKvbdkCkjpgVH -EPDKjvbdqGEEsvAh -EObkKvbdmRxuZrci -EObjjvbdNdctIhjd -EPCkKvbdCSaDTevr -EPCjjvbdRDcAopcr -EObkKvbdwtmEpyMO -EOcKjvbdqZPHfqDx -EOcLKvbdaNKbStmH -EOcLKvbdaSFcHsfL -DnbkKvbdRosgJecw -EObkKvbdkySrSyGt -EOcLKvbdwuMdqYkn -EPCjjvbdrDdhonWB -EPCkKvbdiBoDEwRR -EPCkKvbdEztQdlCi -EObkKvbdFyUuBEXb -EPDKjvbdOAIsUJrA -EPDKjvbdKCicRKCx -EObjjvbdSZihSbvA -DncLKvbdvAdYsPEh -DncKjvbdySnImSCH -EObkKvbdiVZeXRtb -EOcKjvbdsCFllHLZ -EPDKjvbdZeXfzgiC -DnbjjvbdMpXpvNgT -DoDLKvbdsCFllHKy -DoCkKvbdqYoHfpdY -DnbjjvbdRzKHrbvA -EOcKjvbdNHComPtk -EOcLKvbdCJLBjiGK -EPDLKvbdsZlPsAhO -DnbkKvbdemFvgMik -DoCjjvbdFyUuBDwb -DnbjjvbdrafMlGkZ -DncKjvbddZyPxYpb -EObjjvbdxZhGFwdr -EPCkKvbdEXwlTssl -DnbkKvbdANIYrvyx -EObjjvbddePRawCj -EPDKjvbdyNsIXrhc -EPCkKvbdhkeEOVDZ -DoDLKvbdAMgxrwZx -EPDLKvbdsQWPJbvG -DoCkKvbdkVvmcbXw -EPDKjvbdJYTbIMQp -DncLKvbdBsAcTewS -DncLKvbdxrnJNRag -EOcLKvbdmSYtzSdJ -EObkKvbdqdFJQNua -DoCjjvbdZyEKOCkr -DoCkKvbdZLrEUOLm -EPCkKvbdRNXaxnUz -EPDLKvbdnUuZjjRf -EObkKvbdmbKXYOmu -DnbkKvbdlZTSTYgU -EPDKjvbdGYuUaDxC -DncLKvbdFyVVAcxC -DoDKjvbdEvZPpMjF -EPDLKvbdSwjlNzjx -EPCjjvbdbKkeoNcA -DoCkKvbdMfcQMotk -DnbkKvbdyTNiNRbH -DncLKvbdFWYpQMjF -EPCkKvbdEvYopMjF -DncKjvbdeKJrWUzn -EOcKjvbdpssfrSLU -EObjjvbdKCjDRJbx -DnbkKvbdeUAUATMv -EPDLKvbdjKGIJlxS -DnbkKvbdpssfqrLU -EPDKjvbdqZPHgQdY -EPDLKvbdeAURNXif -DoCjjvbdypoMhiwA -EPDLKvbdGYtuAdXb -EObkKvbdRaceLiYk -DoCjjvbdXsMBNTnx -EOcLKvbdKCjCqKCx -DoCjjvbdYSlAmUPY -EPDLKvbdpstGrSKt -EPDKjvbdhtyeXRuC -EObjjvbdtlYXBUBX -EObjjvbdRMxByNtz -EObjjvbdhanbeWqR -EOcKjvbdpyPIHQcx -EPDLKvbdrRtjnLBN -DoDKjvbdNQYQvNgT -DnbjjvbdbsDKsdJa -DnbjjvbdDxYMTssl -EPDLKvbdnCKWxOmu -DncKjvbdILazmwQk -DoDKjvbdhgJcYuiu -DoCjjvbdlYrrSyHU -EOcKjvbdVUNUFkvK -EObjjvbdRyjHrbvA -DoDLKvbdDnbkKvbd -EOcKjvbdaNKbStmH -DnbkKvbdjblLRGtg -DncKjvbdxUleQyLn -EPDKjvbdLGFhBaQu -EObkKvbdqmZiyLgi -DoCjjvbdJuuGEFGi -EPDKjvbdqmZixlIJ -DoCjjvbdXnRAYVVt -EOcLKvbdWIYVxGxz -EPCkKvbdxZgfGYEr -EPDKjvbdfNGWfmKL -EPDKjvbdbrbjscjB -DoDKjvbdsPunjCvG -DoDKjvbdziuQQDsU -DoDLKvbdbhlijfWx -EPCkKvbdhgKCyWKV -EPDLKvbdGLEsCgmV -EOcKjvbdmIcspuSB -EPDKjvbdIwsbILqQ -DoDLKvbdpedEsvBI -DncLKvbdsPunjDVf -DncLKvbdIxTbHkqQ -DncLKvbdcSbkTdJa -DncKjvbdUWLpJsaR -DnbkKvbdsQVnjCvG -EPDKjvbdyXiJapZk -EPCkKvbdrzLosAgn -DncLKvbdNsTugEuQ -DoDLKvbdrykoraHn -EObjjvbduaDySoFI -DncKjvbdZHWdAOri -EPCjjvbdlqxtysEJ -DnbkKvbdOSsvHEtp -DoDKjvbdRotGjGDw -DoDKjvbdYfvdAOsJ -DoCkKvbdBhjajiGK -EObjjvbdCgLegAzc -DoDLKvbdhtyeWrVC -EOcKjvbdzitoocrt -EOcKjvbdNVTSKmAX -EPCjjvbdVYgsyjnn -EObkKvbdliEUQuRa -DoCkKvbdqFceUWAh -EPDKjvbdIsZAsMxM -DnbkKvbdUVlPjUBR -DoDKjvbdbUafwjsh -EObjjvbdQlxCZOUz -DoCkKvbdQvnEDLhD -EOcKjvbdUVlQKUBR -EPDKjvbdehKvRnQg -DoDLKvbdxmsIYTIc -EObjjvbdsCGNLfkZ -EObjjvbdmSYtzSdJ -DoCjjvbdiMEcnVDZ -EPCjjvbdypnlhiwA -DoCjjvbdRyihTDWA -DoCjjvbdZoOJEdzK -DoCjjvbdJpzEoGOF -DoCkKvbdYpmEiMeR -EPCkKvbdbhljKfWx -EPDLKvbdqYnggQcx -EOcLKvbdwjwEHzyf -EPCjjvbdLFegbAqV -DoCjjvbdMoxQvNgT -EPCjjvbdZsiIyETO -DoDLKvbdZQmFImEq -DnbjjvbdYkrDtOMN -EPCjjvbdjggMGGOL -DncLKvbdDwwlTstM -EOcKjvbdCWzciFQW -DoCkKvbdyYIiaozL -DnbkKvbdNsTufeVQ -DoDKjvbdjlakydfo -EObjjvbdUGznLvue -DoCjjvbdeFOqawDK -DoCjjvbdZnmiFEyj -EOcKjvbdVBCQrprZ -EOcLKvbdrovOjCvG -DncKjvbdrovPKCuf -EOcLKvbdlYrqryHU -EObkKvbdcyyPxZQb -EObjjvbdnBivwnnV -EObjjvbdjJehJlwr -DnbkKvbdOFDtJIjd -DnbjjvbdVAaqSqSZ -EObkKvbdrXPkbiZR -DoCjjvbdzaAPGfal -DncKjvbdZQldhmEq -EObjjvbdmoyxvLZC -DnbkKvbdmpZxujyC -DoCjjvbdvwLaWBWV -DncLKvbdiVZdvquC -DnbjjvbderBWzlDP -EPCjjvbdjbkjpfuH -DncLKvbdrafNLfkZ -DncKjvbdrWokbhxq -EPCkKvbdsZkosBHn -EOcKjvbdidjfuPAO -DnbjjvbdNGcPmQUk -EPCjjvbdrJAKFNOe -DnbjjvbdTukoitBR -DnbkKvbdySmhlrCH -EObkKvbdrXPkcIxq -EOcLKvbdFejSOItR -EObkKvbdmgExMnGy -EPDKjvbdqrVLOLBN -DoDKjvbdLAkHNCYR -EObkKvbdVrOXbEkc -DnbjjvbdEXwlUTsl -EPCkKvbdyXhjBpZk -EObkKvbdiifHjMxS -EOcKjvbdEKHiuxKA -EObkKvbdZLqdTmlN -EObkKvbdWRnXaeLc -DnbjjvbdWSNwaeMD -DnbjjvbdfNGWgNKL -DoDKjvbdoAKztIDn -DncLKvbdmaivxOmu -DnbjjvbdZLqcsnMN -EObjjvbdcTDKscia -EPCjjvbdOTTufeUp -DoDKjvbdGdLVjBjK -DncKjvbdcJNKLFvx -EOcLKvbdTYKkmzjx -EOcKjvbdZRMeImEq -DoDLKvbdKQyePFnF -DnbkKvbdNrtWGduQ -EPCjjvbdatbHXjtI -EPCjjvbdvwMAuaVu -EPDLKvbdnQZxvLZC -EObjjvbdtlYXAsaX -DnbkKvbduDDVWvPP -EPDLKvbdqTtGrSKt -EObjjvbdxnSgwsJD -EObjjvbdbKkenmcA -EPCkKvbdFaOqYizm -EOcKjvbdLGGHbBRV -DoDLKvbdRzJhTCvA -EPCjjvbdiMFDmtcZ -DnbjjvbdWWhwvEEg -EPCjjvbdJmAEZgVB -DoCjjvbdmuVZjirG -DoCjjvbdliEURUqa -DoDLKvbdnCKWwnnV -EPDLKvbdhgJbyViu -DnbkKvbdjggMFfNk -EObkKvbdEuxopMie -EPDKjvbdssRsYydc -DncLKvbdliDsqVRa -EOcLKvbdLBKflbYR -DncKjvbdzoPpeClY -DncKjvbdqFdEsvBI -DoCjjvbdZMRctOMN -DncKjvbdDnbkLWcE -EObkKvbdMfcQNPuL -DoDKjvbdUWMPjTaR -DnbjjvbdxmsHwsIc -EObkKvbdrDdhonWB -EPCkKvbdhgJcYvJu -DoCkKvbdlYsSSyHU -EPCjjvbdNdcsiJLE -DoDKjvbdhlEcmuCy -EObjjvbdJTZAsNXl -EPCjjvbdznpQeClY -DncLKvbdDxYMTssl -DoCjjvbdkVwNcbXw -EOcLKvbdMgDPlpUk -EObkKvbdXsMAlsnx -DnbkKvbdiBncEvqR -EPCjjvbdeFPSCWcK -DoDKjvbdmuUzKjSG -EPDKjvbdqrUkNjaN -DoDKjvbdhyuFlQnG -EOcKjvbdDigivYKA -DoDLKvbdJYUCHkqQ -DncKjvbdACqwiyiQ -EPDKjvbdEYXkstUM -DoDLKvbdKDKCpicY -DncLKvbdCDoaVjNG -EObkKvbdxZhFexFS -EPCkKvbdKDJcQjCx -DoDLKvbdEPCkKwCd -EPCkKvbdTfzmkwVe -DnbjjvbduWOYJqTA -DoCjjvbdcJMijfXY -EPCkKvbdmaiwYPOV -EOcKjvbddjJrVtzn -EObkKvbdpstHSRjt -EOcKjvbdyXiKCQZk -DnbkKvbdIsYaSmYM -DnbjjvbdwtmFQxlO -DnbkKvbdYpleJMdq -DoCjjvbdkNBkzFGo -EOcKjvbdbsCkUEKB -DoDKjvbdYlRctOMN -DnbkKvbdjuwOECXw -EPDKjvbdWRnXaeMD -DncLKvbdkDLkQgVH -DoDLKvbdFeiqnJTq -EOcKjvbdzHYlAMeX -EPCjjvbdJbjCpjDY -EPDLKvbdzitopDsU -DnbkKvbdziuPpDrt -DncLKvbdySnImSCH -DnbjjvbdySnImRbH -DoCjjvbdKjaIWAJy -DnbjjvbdTqRPUthN -DoCjjvbdURQntuIN -EObjjvbdQlxCYmtz -EPDKjvbdMtsSLNAX -EObjjvbdJbjDQicY -DoDKjvbdEPCkKwDE -EObkKvbdKQydoGNe -DoDLKvbdVwJXuceH -EObjjvbdnUtykJrG -DncLKvbdwMvANEEm -EPDKjvbdpyPHgQdY -DnbjjvbdUVkpKUBR -EOcLKvbdhfjCyVjV -EPDKjvbddoFTKstS -EPCkKvbdANHyTXZx -EPCkKvbdUxhTyjoO -EObjjvbdkVwNdBxX -EPDKjvbdDoCjjvbd -DnbkKvbdWWhwudEg -DnbkKvbdyTNiMrCH -DoDLKvbdelewGljL -DncLKvbdUGznMWue -DncKjvbdwygfFwdr -EPCkKvbdJqZePFnF -DnbjjvbdNsTugEuQ -DoDKjvbdQcbaPqDr -DncLKvbdfMevgNJk -DncLKvbdlrZVZrdJ -DoCjjvbdFjeTCglu -DnbjjvbdYqNFImEq -DoCjjvbdsCGMkfkZ -DncLKvbdhuZdwSUb -DoCkKvbdrXPkbiZR -DoCjjvbdZRMdiMdq -DoDKjvbdemFvgMjL -DoCjjvbdygZMANEw -EOcKjvbdZRMeIldq -EObkKvbdiHJcZWKV -DncKjvbdCJKbKiFj -EObjjvbdzROlhjXA -DnbjjvbdDoDLKvbd -EPDLKvbdVYgtZjnn -EObkKvbdDoCjjwDE -DnbkKvbdrouoJbuf -DoCkKvbdyTOImRag -EPDKjvbdBcpBVilf -DoCjjvbdCWzdJFQW -EPCkKvbdbrbjscjB -EOcLKvbdwkWdHzzG -EPDKjvbdnGeXlnGy -EPCkKvbdznpREcLx -EPCkKvbdZMRcsnLm -EOcKjvbdJSyArmXl -DnbkKvbdZMSDtNkm -EPDKjvbdAMgySvzY -DoDLKvbdyYJJbPzL -DoCkKvbdLAjgMaxR -DoDLKvbdWIXuxGxz -DoCjjvbdqwQLbiYq -DnbkKvbdpyPIHQcx -EOcKjvbdfNGXHNJk -DncKjvbdqYnhHQdY -DncKjvbdeEnrBvcK -EPDKjvbdZjTHpGaf -DoDLKvbduoTzqLPU -DnbkKvbdIjEAJofd -DnbkKvbdxnSgxTJD -DoDLKvbdXsLaMsnx -DnbjjvbdaRfDHsek -DoCkKvbduLwwAtBX -DnbkKvbdrpWPJcVf -DoDKjvbdrbFlkgLZ -DoCkKvbdlqxtyrdJ -EObkKvbdRyihSbvA -EObkKvbdWRnYCFLc -DoCkKvbdOEcshhjd -DnbkKvbdZjTHpHBf -DnbjjvbdcyyPwxpb -DncLKvbdkVvmdCXw -DncLKvbdcScKtEJa -DnbjjvbdrSVLOLBN -EObkKvbdiGjDYvKV -EPCkKvbdEJgjVwjA -DnbkKvbdRosgKFdX -EPDLKvbdcScKtDia -DoCjjvbdtbcVXVno -DncKjvbdhgJbyViu -EPCjjvbdjJehKNYS -EObkKvbdyOTIYTJD -DnbkKvbdRaceMJYk -DoCkKvbdqiAKEmOe -DoDLKvbdEKHiuwjA -EObkKvbdxUldpxkn -EObkKvbdFejRmhtR -DncLKvbdSBcdlIyL -EPCkKvbdxZhFexFS -EObjjvbdwjwEHzzG -EPCjjvbdmRxtzSdJ -EPDLKvbdEvYooljF -DoCkKvbdmgFXlmfy -DoCjjvbdtkxXBTaX -EObkKvbdmgExMnHZ -DncLKvbdjvXODaww -DoCkKvbdSCEFMIyL -EPDKjvbdVYhTykOn -DoDLKvbdNsUVgFUp -DncKjvbdRXOEClID -DoDKjvbdnVVZkKSG -DoDKjvbdWWhxVcdg -EPCkKvbdwuNFQxlO -DncLKvbdKeegbBRV -DncLKvbdUWLpJsaR -EOcLKvbdNxOuzcmt -EObjjvbddwzUUSFz -DoCjjvbdJXtBhMQp -DoCkKvbdLGFgbBRV -EOcLKvbdcJMjKewY -DnbjjvbdxUmEqYkn -DnbkKvbdjbkjqGtg -EPCkKvbdIHGzYwwg -DnbjjvbdrpWOjCvG -DoDKjvbdZMRctNkm -DnbkKvbddZyPwxqC -DoCjjvbdtcDVWuno -DoCkKvbdJcKDRJcY -EOcLKvbdmbKWwnnV -EPDKjvbdcasNSAUN -EPCkKvbdUaBpsQqy -EObkKvbdJutedFHJ -DoDLKvbdBhjakJFj -DnbkKvbdnUuZjiqf -EPDKjvbdpxoHgQcx -DnbjjvbdZjTHofbG -EObkKvbdkxsSSxgU -DnbjjvbdWRmwbElD -DoCkKvbdRkZFuGjs -EPCkKvbdwNWANDdm -EObjjvbdTkvPBVni -DoDKjvbddndrkTtS -DncLKvbdZtJIxdSn -EOcLKvbduaDyTOeI -EOcKjvbdxZgfGXdr -EOcLKvbdkySrTZGt -EPDKjvbdVwJXucdg -EPDLKvbdatagYLUI -DoCjjvbddZxpYZQb -EPDKjvbdtunXjRTA -DoDLKvbdWSOYBeMD -DoCjjvbdHlBznXRL -EPDLKvbdcyxpXxpb -DnbjjvbdAMhYsWzY -EObjjvbdraemLgKy -EPDKjvbdJpzFOenF -DoCjjvbdZnnIeEyj -DoCjjvbdrWpLbiZR -EOcKjvbdLqwMytpz -DncKjvbdKQzEoFme -EPDKjvbdZRMeJMeR -DncKjvbdEuxpPlie -EOcLKvbdFWYpPlie -EOcLKvbdjblKpgUg -EOcLKvbdiBnbdwQq -DoDLKvbdOTTufeVQ -EPDKjvbdpyOggQdY -DnbkKvbdGBOqYizm -EObjjvbdRjxfUfkT -EPCjjvbdUMVoAuoJ -DoDLKvbdVwJXvEEg -EObkKvbdnCKXXoOV -DoDKjvbdNPxRVmgT -DncLKvbdZsiIxdSn -EPDKjvbdjlalZeHP -DoDLKvbdeFPSBvbj -DoDKjvbdVqnXbFMD -DncKjvbdHffyyYYH -EOcLKvbdBhjbLJFj -EPDKjvbdJvVGEFHJ -EOcKjvbdgQBzvdYI -EPDLKvbdpyOggRDx -EObjjvbdKQyeOfNe -EPCjjvbdtcCtwVno -EPCjjvbdQvmdClHc -DnbkKvbdyXiKBoyk -DncKjvbdqTsgSSLU -EObjjvbdyNrgxShc -DnbjjvbdRkZFuGjs -EObjjvbdYfvdAOri -DoDKjvbdkMbMZeGo -EPDLKvbdCIjbLIej -DoDKjvbdHffyxwwg -EPCkKvbdGdLVibJj -DoCkKvbdaaVdepQX -DnbkKvbdSQUGifDw -EPCkKvbdqYngfpdY -DnbkKvbdxUleQyLn -DoCjjvbdqlyixkgi -EPCkKvbdjgfkfGNk -EObjjvbdeFOqavbj -DoDLKvbdYkrDtNlN -DoCkKvbdjhGlFenL -EPCjjvbdijFhJmXr -EObjjvbdnGeYMmfy -EOcLKvbdbhmJjfXY -EOcLKvbdLBKfmCYR -DncLKvbdJSxaSmXl -EPCjjvbdsQVnicWG -DoDKjvbdjhHLfFnL -EObkKvbdjuwOEBww -DoCjjvbdiBncEvpq -EOcLKvbduLxWaUAw -DncLKvbdhuZdwRtb -EOcKjvbdjvWnECXw -EObkKvbdZeYGzghb -DoDLKvbdNQYQumgT -DoDKjvbdJpydoFnF -EPCkKvbdRjyFuGkT -DnbjjvbdraelkgKy -EObjjvbdfNGXHMjL -DoDLKvbduWNwiqTA -DncKjvbdnVUzLJrG -DoDLKvbdehKvSOQg -EPDLKvbdwtmFRYkn -DoDKjvbdKfFgaaQu -DncKjvbdCTBDTfXS -EObjjvbdDoCjjwCd -EPCjjvbdYTMAmUOx -EOcKjvbdiMFDnVCy -EObkKvbdjlalZeHP -DnbjjvbdCJLCLIfK -DoDLKvbdZMRdUNkm -DnbjjvbdURRPVUgm -EObjjvbdJcJbpibx -EObkKvbdrWpMDJZR -EObjjvbdjuwNdBxX -EPCjjvbdbBVdfQQX -EPCjjvbdKRZeOfOF -DoCkKvbdKDKCqKCx -DoCjjvbdkVvmdBxX -EPDKjvbdvAdYroEh -EOcLKvbdtcCuXWPP -EPCjjvbdczZQXxpb -DncKjvbdUxhUZkPO -EObjjvbdlrYtysEJ -DncLKvbdcScLUDia -EPDKjvbdBsAbsevr -DoDLKvbdqTtGqrLU -DoDKjvbdSCEFLiYk -EPCjjvbdRWmccLgc -DncLKvbdNQYQunGs -EObkKvbdmbKXYPNu -EPCjjvbdfMewGmKL -EObjjvbdzROmIiwA -DnbkKvbdliETptqa -EPDKjvbdHlBznWpk -DoCkKvbdUaBpsQqy -DoCkKvbdWSOYCFMD -DoDLKvbdxmrhYTIc -DncLKvbdLAkGlbYR -DncKjvbdlhctRUqa -DoCjjvbduDCtwVno -DnbkKvbdIjEAKQHE -DnbjjvbdiLddNuCy -EPDKjvbdEXwktUTl -EPCjjvbdyNrgwsJD -EObkKvbdnPzYujxb -EPDKjvbdznoqEcMY -EPDKjvbdZRNEhleR -DoCjjvbdGQATXHFy -EPCjjvbdyqPNIiwA -EOcKjvbdkxrrTYgU -EOcKjvbdcImKLFvx -DoCkKvbduoTzpkPU -EPCjjvbdJXtCIMQp -EOcKjvbdrpVoJbvG -DncLKvbdqZPIHRDx -DnbjjvbdTAFJHand -EOcKjvbdtcCuWuno -DncLKvbdfIKurNqH -DncKjvbdLrWmZtpz -DoDLKvbdMtsRjmAX -EObjjvbdLGGHbBRV -EObkKvbdCWzchePv -EOcKjvbdZxcjODMS -EObkKvbdzaAPGgBl -DoDLKvbdKVtecdgJ -DnbjjvbdHDjvJbJj -EPCjjvbdLiCLqYAS -EPDLKvbdFVxpPmKF -DoDLKvbdZisIPgBf -DncLKvbdTppoUtgm -DnbjjvbdpyPIGpdY -DoDLKvbdEztRElCi -DncLKvbdHgGzZYYH -DnbjjvbdZLqctOMN -DnbkKvbdqTtGqqkU -DnbjjvbdiMEcnVCy -EPDKjvbdvBDxrneI -DoDKjvbdemGXHNJk -DoDKjvbdhficYvKV -EObjjvbdegkWSOQg -DoDLKvbdOFDtIiKd -EPCjjvbdBdQAuimG -DoCjjvbdpyPHgREY -DncKjvbdJXsbHkpp -DoDKjvbdRbEElIxk -DoDKjvbdsQWPJcWG -EObkKvbdsCGNLfkZ -EOcLKvbdzaAPGgCM -EObkKvbdzjUoodSt -DnbkKvbdemFvgMjL -DnbkKvbdWWhxVcdg -DncLKvbdxrmiMqag -EPCkKvbdMSWlytpz -EObjjvbdwNWAMdFN -EPDLKvbdlrYtzTEJ -DnbjjvbdVqnYBeLc -DncKjvbdnHEwmOGy -DnbjjvbdtbbuWvPP -DncKjvbdmIcspuSB -EObkKvbdEOcKkXCd -EOcKjvbdDncKkXCd -EPDLKvbduaDxrndh -DoCjjvbdOFDshhkE -DnbkKvbdRaceLhyL -EPCkKvbdZshhyDrn -DoCjjvbdCSaDTfWr -EOcKjvbdqUTfrSLU -EPDLKvbdtTRryZdc -DoDLKvbdkyTRsZGt -EPDKjvbdyqPNIjXA -DoCkKvbdNUrrKmAX -DoCjjvbdSCDeMIxk -EObkKvbdkMbLzEgP -DncKjvbdEvZPpMie -DoCkKvbdyYIibQZk -EObkKvbdNPxQumfs -EOcLKvbdDncKjvbd -EPCkKvbdozmcjxPA -EPDKjvbdCIkCLIfK -DncKjvbdcyxoxZRC -DoCkKvbdeOdrkUUS -DoCjjvbdhzVFlQnG -EObjjvbdOFETiJLE -DncKjvbdhyuGLqNf -EObkKvbdRWmdClID -DoCjjvbdFpATWgFy -DnbkKvbdlqxtysDi -EObjjvbdqmZjYkhJ -DoDKjvbdZyDjODMS -DoCjjvbdEJhJvYKA -EOcKjvbdqTsgRrLU -EOcKjvbdZsiIxcrn -EObkKvbdIHGzZYYH -EPDKjvbdHgGyxxXg -EObkKvbdxmrgwriD -EPCkKvbdxrnJNSBg -DnbkKvbdjhGkefOL -EPCjjvbdKQydoGNe -EOcKjvbdqvpMDJZR -EObjjvbdQdDBQQdS -DoDKjvbdSKxfVHKs -DoDKjvbdbLLeoODA -DoDLKvbdBsAcUGWr -DoCjjvbdRzKHrbvA -EObjjvbdfMfXGljL -EObkKvbddeOrCWbj -DoDKjvbddjJrVtzn -DoDLKvbdhtydvqtb -DnbjjvbdRNXayOUz -EPDLKvbdRjyFtgKs -EObkKvbdsPuoKCvG -EPCkKvbdYqNEiNFR -DncKjvbdUxgsyjnn -EPCjjvbdZRMdhldq -DoDLKvbdEJhKWXjA -DoCkKvbdQwODblID -EPCkKvbdssRrxzFD -DnbjjvbdZxdKOCkr -EObjjvbduCcUwVno -EOcKjvbdmuUzLKRf -EPCjjvbdfpBzvcwh -DnbjjvbdMowpvNfs -EPDKjvbdGLErcHmV -EPDLKvbdZoOIeEyj -DncLKvbdSLZGUgKs -DncLKvbdlqyUzTEJ -EPCjjvbddePRawDK -DncKjvbdHEKvKCJj -DoDKjvbdeEnqavcK -DoDLKvbdtSrTYzFD -EPDLKvbdxUmFQxlO -DnbjjvbdLLBIWAJy -EOcLKvbdMowqWNfs -EPDKjvbdptUGrSKt -DoDLKvbdHEKvKCKK -EPCjjvbdJcJbpjDY -DnbjjvbdMuTRkNAX -DnbkKvbdEzspdlDJ -DncLKvbdVUMsekvK -EPDKjvbdOTUVgEtp -DncKjvbdAMgySwZx -DoCkKvbdwtmFRYkn -EObjjvbdIjEAKPgE -EPDKjvbdRpTfjGEX -DncKjvbdFjeSbglu -EObkKvbdjFLGtoAO -DoCkKvbduWOYJqTA -EPCkKvbdVAapsQrZ -DnbjjvbdVwJXudEg -DoDLKvbdUtMsfLvK -EPCjjvbdHELVjBij -DncKjvbdRWnECkhD -EPDLKvbdZsiJZDsO -DncLKvbdnPzZWLYb -EPCjjvbdznoqEcMY -EOcKjvbdzoQQeDMY -DnbjjvbdznpQdbkx -EPDKjvbdeYZtTrFz -DoCkKvbdkySrTZHU -DncKjvbdCSaDUGXS -DoCkKvbdcJNJjfXY -EOcLKvbdCEQAvJlf -EPDKjvbdyzdmqhJI -DncLKvbdNPwpvNgT -DoDKjvbdqmZixkgi -EOcKjvbdVYhUZkPO -EObkKvbdhgJbxvJu -DoDKjvbdUQqPUuHm -DncLKvbdqvolChyR -EPCkKvbdEXxMTssl -DnbkKvbdHgGzYwxH -DoDLKvbdIidAJpGd -DnbkKvbdZLqdUOMN -DnbkKvbdGckViaij -DoCkKvbdFVxopNJe -EOcLKvbdRbEFMIyL -EObkKvbdLAjflawq -EObjjvbdziuPodTU -EPDLKvbdQwNdCkhD -EPCjjvbdZxdJmcLr -EPDLKvbdxrmhlqag -DoCkKvbdSPsgJfDw -EPCjjvbdkDLjpgUg -DnbjjvbdtbcUwWOo -DnbkKvbdWIXuxHYz -EObjjvbdEvYpQMie -DoDLKvbdIHGzZXxH -EPDLKvbdVYgszKoO -DncKjvbdhancEvpq -EPCjjvbdcJNKKewY -EPDKjvbdWWhwvEEg -EOcLKvbdvAdYsOdh -EObkKvbdcyyPwxqC -EObjjvbdSPtGifDw -EOcLKvbdkMalZeHP -EPDKjvbdYlRctNlN -DoDLKvbdKWVGEFGi -DncLKvbdMgColouL -DncLKvbdhbPCeXRR -DncLKvbdDwxMTstM -DoDKjvbdvAcySndh -EObkKvbdXGYytAPT -DoCjjvbdmuVZjjRf -EOcLKvbdDGlFgAzc -DoDKjvbdiBncFXRR -DoDKjvbdkaMnmALA -DncKjvbdVBCQrqSZ -DoCkKvbdVviYWEFH -EObkKvbdAMhZSwZx -DoDLKvbdeAUQlwjG -DoDLKvbdZxcjODMS -EOcLKvbdrpWPKDVf -EPCkKvbdWRnYCFLc -DnbkKvbdKeehBaRV -DoDKjvbdMSXMzUpz -EOcKjvbdRkZGVGjs -DoDLKvbdFkFScIMu -DoCjjvbdZjTHogBf -DnbkKvbdnBivwnmu -EOcKjvbdCTAcTevr -EOcKjvbdVviXvDeH -DoDLKvbdliDsptqa -EPDLKvbdZirgpGaf -EPCjjvbdaRfChUFk -EPCjjvbdkClKqGtg -DoCjjvbdKQyeOfOF -EPCkKvbdqvpLbiYq -DnbjjvbdCTBDTfXS -DoCjjvbdOEctIhkE -EObjjvbdbVCHXkUI -DncKjvbdxnTIXrhc -DnbjjvbdezvYdhsw -EPCjjvbdDwwkstUM -EPCkKvbdaaVdepQX -DoDLKvbdjlbMZeHP -DoDLKvbdqAiFAXHd -EPDLKvbdGLEsCglu -EPCjjvbdZyDinClS -EPCkKvbdSLYeuGkT -EPDKjvbdwyhGFweS -EOcLKvbdjJfIKNYS -DoCjjvbddeOrCXCj -DoDKjvbdkxrqsZHU -EOcKjvbdGYuVBEYC -DncKjvbdHkazmvqL -DnbkKvbdZsiIxdSn -EObkKvbdhanbeXQq -EOcLKvbdMpXqWNfs -DnbkKvbdEztQdkcJ -EPCjjvbdDjHjWXjA -EOcKjvbdNQYQvNgT -EPCkKvbdNHCpNPtk -DoCjjvbdbsCkUDjB -EObkKvbdOStWGeUp -EOcKjvbdVqnYBdlD -DoCkKvbdvlvANDeN -DoDKjvbdnQZyWKyC -EOcLKvbdkyTRsYft -EOcKjvbdnVUyjiqf -EPCjjvbdXnRAXtut -EPDKjvbddZxpXxpb -EPDLKvbdfHjvSOQg -DncKjvbdXsMBNTnx -DncKjvbdEARiMzXX -EPCjjvbdOStVgEuQ -DnbjjvbdHELWKCKK -EOcLKvbdehLWSOQg -DncLKvbdYkqctOLm -DoDLKvbdxsOJMqbH -DoCjjvbdzGyMANFX -DoCjjvbdSCEElJZL -DoDKjvbdRkYeuHLT -EOcKjvbdXsLaMsnx -DnbjjvbdePFSkUUS -DncKjvbdGZUuAdXb -EOcLKvbdlZSqsZGt -DncKjvbdiCPCdwRR -EObjjvbdjvXOEBxX -EPDLKvbdRXOEDMHc -EPCkKvbdZisIQHCG -EPDKjvbdjKGIKNYS -DncLKvbdWWiYVdEg -DnbjjvbdaMkBruNH -EOcLKvbdOFEThiKd -DoCkKvbdVZHszLPO -DoDKjvbdiHJcYvJu -EPCkKvbdwuNFRZLn -EObkKvbdJqZdoGNe -EOcKjvbddndsLUUS -EOcLKvbdBraCtGWr -DncLKvbdxrnJNRbH -DoDLKvbdCWzciFPv -EPCkKvbdtlXvaUAw -DoCjjvbdMfbomQUk -DoCjjvbdfoazwDxI -DoCkKvbdauCHXkUI -DnbjjvbdaogHELzd -EPCjjvbdTulPisaR -EPCkKvbdOSsvHEtp -DoDLKvbdTkuoBVni -EPDKjvbdVBBqTRSZ -DnbjjvbdEJgivYKA -DncKjvbdJXtBgkqQ -DnbkKvbdbsCjsdJa -EPCjjvbdhlEcnUby -EObjjvbdssSSyZdc -EObkKvbdhgKCyWJu -EObkKvbddeOqbWcK -DoCkKvbdqvpLcJYq -EPDKjvbdxZgefXeS -EOcLKvbdkVwOEBww -EPDKjvbdemFvfljL -EPCjjvbdFkErcIMu -EOcKjvbdZyEKNcMS -EPDKjvbdqlzJxlHi -EPCjjvbdmbJwXnmu -EOcLKvbdcTDLTcia -DoCkKvbdyzdmqhJI -DnbjjvbdGdLWKBij -DoDKjvbduaDxsPEh -DoDKjvbdZshhxdTO -DncKjvbdptUGqrKt -EPCjjvbdJvVFceGi -EOcKjvbdddoRawDK -DoCkKvbdfMfXHMik -EObjjvbdVAbRSpqy -EObkKvbddZyPxYpb -DnbkKvbdVYgszKnn -DoCkKvbdZMRdUNkm -EObjjvbdTvMPitBR -EObkKvbdIxTaglQp -EObkKvbdGGKSNiUR -DoCkKvbdGBOpyJzm -EPCjjvbdqrUjmjaN -DncKjvbdIMBzmvpk -EPCjjvbdcyxoxYpb -EOcKjvbdmIcsqUrB -DoCkKvbdqvolChyR -EPCjjvbdkHgMGGOL -EPDLKvbdpaIeAWgd -DncLKvbdqvokcIxq -EOcKjvbdZsiJYcrn -EObkKvbdyYJKBpZk -DoCkKvbdKDKDQicY -EObkKvbdlhdTptqa -EObkKvbdyXhjBpZk -EObkKvbdKNAEZfta -EOcLKvbdRyihTCvA -DncLKvbdtcCtwVno -DnbjjvbdVZITykOn -DoCjjvbdJSyArlwl -EPDKjvbdDxYLtUUM -EPDKjvbdvlvANEFN -DoDKjvbdrykpTAgn -DnbjjvbdeYZtUSFz -DoDKjvbdzjVQQETU -EObjjvbdiHJbyVjV -DoCjjvbdcScLTcjB -DncLKvbdhaoDEwQq -DnbkKvbdQlwbZNtz -EPCjjvbdEARiMzXX -EPCjjvbdGFjSOIsq -DoDKjvbdrXPlChxq -DoDLKvbdYqMeImEq -DoDKjvbdOFETiJKd -EPCjjvbdCTBDUFvr -DoCkKvbdZoOIdeZj -DncLKvbdHgHZyYXg -EOcLKvbdCSaCsevr -DoCjjvbdsQWOjCuf -DoDKjvbdKWUfDeGi -EOcKjvbdzitpPcrt -EPDKjvbdZyDimcMS -EPCjjvbdBcpAuilf -EOcKjvbdqwQMCiYq -EOcLKvbdsrrTZZdc -EObjjvbdSQUHKGEX -DoDLKvbdcyxoxZRC -EObkKvbdWXJYWEFH -DnbkKvbdhgKDYuiu -DoDKjvbdrSVLOKaN -EPCjjvbdMoxQumgT -EPDKjvbdcbTMrATm -EPDKjvbdznopdcMY -DnbjjvbdzdzOzdyp -EObjjvbdGYuVBEXb -EPDKjvbdiZtekpnG -DoDLKvbdvvlAuaVu -DoDKjvbdEYXkstTl -EPCjjvbdauCHYKsh -DoCjjvbdDjIJuwjA -EObjjvbdkNCLzFGo -EPDLKvbdiGicZWKV -EPCkKvbdtlXvaTaX -DoCkKvbdpyOggQcx -EObjjvbdtTSSyZdc -DoDLKvbdiZtelROG -EOcLKvbdWRnYCFMD -EPDLKvbdNddUIhjd -DncLKvbdEObjjvbd -EPDLKvbdVUNTelVj -EPCjjvbdVhXvYGxz -DoCkKvbdfRaWzkbo -DoCjjvbdRjyGVHKs -DoCjjvbdSKxfUfkT -EOcKjvbdaRecITek -DoCkKvbdEJhKVwjA -DoDLKvbdwXLaWBVu -EPDLKvbdLYqJrztf -DncKjvbdUMVoAuoJ -DnbjjvbdvmWAMcdm -EObjjvbdpssfqrKt -DnbjjvbdhlEcnVDZ -EOcKjvbdNsUWGeVQ -EObjjvbdVUNTekuj -DnbkKvbdVYgsykOn -EObkKvbdpssgSRjt -DncKjvbdVZITzLOn -DoDKjvbdGGJrNiTq -DoDLKvbdACqwizJQ -DoDKjvbdIryArmXl -DoCkKvbdZMRdTmlN -DnbkKvbdrovPKDVf -EObkKvbdrounjDWG -DnbjjvbdCSaDTevr -DnbjjvbdUyITyjnn -DnbkKvbdKRZeOfOF -DoCkKvbdDigiuxKA -EOcKjvbdxsNhlrCH -EOcLKvbdDjHiuxKA -DncKjvbdXmqAXtvU -DnbjjvbdqFdFTvAh -EObkKvbdxrmhmSBg -DoCjjvbdIidAKPfd -EOcKjvbdKQydoGOF -DnbjjvbdlqyUzSdJ -EPDKjvbdtvOYKQsA -EPCkKvbdcIljLFvx -DoCjjvbdYqNEhldq -EPDKjvbdczYpYZRC -DoDLKvbdiBoCeXQq -EOcLKvbdiCPDFXRR -EPDLKvbdZisHofaf -EPDKjvbdmIdURVSB -EPDKjvbdZRNFIldq -DoDKjvbdJpydoFme -DoDLKvbdWWhwudEg -DncLKvbdDnbjjwDE -DncKjvbdqTsfqqkU -DncKjvbdKDKDRKDY -DoDKjvbdTulQJsaR -DoCjjvbdSBdFMIyL -DncLKvbdqTtHSSKt -EOcKjvbdBcoaVjMf -EObjjvbdiiehKNXr -EObjjvbdCWzciFQW -EPDLKvbdWSNwadlD -EPDKjvbdKVuGEFHJ -DoCkKvbdZMRdUNlN -EPDKjvbdZRMdiMdq -EPCkKvbdxUmEpyMO -DoDLKvbdRkYfVHKs -EObjjvbdIwtCIMQp -EPDKjvbdmJDsqUqa -EPDKjvbdrDeJPmvB -EOcKjvbdTvMPisaR -DncKjvbdMtsRjmAX -DnbjjvbdlqyUysDi -EPDKjvbdQwNdClID -DncLKvbdRjxfVGjs -EObkKvbdauBfxKtI -DoDLKvbdiZtfLpnG -DoDKjvbdhancFXRR -DoDKjvbdREDBQQdS -EObjjvbdrzMQTBIO -EOcKjvbdcImKKfXY -DoDLKvbdijGIKNXr -DncLKvbdgGMZmfgA -EPCjjvbdZnmheFZj -EPDKjvbdmuVZjiqf -EObjjvbdeFPRawDK -EPDLKvbdrNZiyLhJ -EOcKjvbdlhdURUrB -EPDLKvbdGGJrNhtR -EOcKjvbdiGibyWKV -EOcKjvbdQlwbZNtz -DncLKvbdnVUzKiqf -EOcKjvbdbsDKscjB -EPDLKvbdDnbjjvcE -DoCkKvbdySmhmRag -DncKjvbdkyTSTYft -DoDLKvbdEYXkstUM -EOcKjvbdiHJbyVjV -EOcKjvbdsQVnicWG -DoCkKvbdoznDkYPA -EObkKvbdURQoVVHm -EPDLKvbdFfKSNiTq -DnbjjvbdVgxVwgYz -DnbkKvbdmfeYNOHZ -DoDKjvbdyqPNIiwA -EObjjvbdFVyQPlie -EOcLKvbdGdKvKBij -EPCjjvbdDwxMUTtM -DoCkKvbdKVtfEEfi -DoCkKvbddjKRvUzn -EObkKvbdliEURVSB -EPDLKvbdWSNwaeMD -EOcLKvbdJqZdoFnF -DnbjjvbdKxqJrzuG -DnbjjvbdmuUyjjSG -EPDLKvbdADRxKZhp -EPCkKvbdiCPDEwRR -EObjjvbdTXkMNzkY -DnbjjvbdMgDPlouL -EPCjjvbdyzeNqghh -EOcKjvbdmuUyjjSG -EPDKjvbdDoDLKvcE -EPDLKvbdNxPVzdNt -DoDKjvbdBhjbKhfK -DnbjjvbdZLrETmlN -DoCkKvbdHffyxwwg -EOcKjvbdYSlAmUPY -EPCjjvbdtTSTYzFD -DoCjjvbdFjeTCgmV -EObjjvbdNwnuzcnU -DoDLKvbdSPsfiecw -DoDKjvbdKVtedFGi -EObjjvbdUaCQsRRy -EObkKvbdbsDLUDjB -EObkKvbdEOcKjvcE -EPCjjvbdyNsIYShc -EOcLKvbdbVCGxKsh -DoDKjvbdlZSqsYft -DoCjjvbdUslselWK -DncLKvbdbUbHXkUI -DnbkKvbdYkqcsmkm -DncKjvbdXsMAmUOx -DoDKjvbdJuuFcdgJ -EOcLKvbdGLFTChNV -DoCkKvbdaaWEfQQX -DncKjvbdVqnXbFMD -EOcKjvbdZyEJnClS -DoCkKvbdNdctJIjd -DoDLKvbdmaiwYOmu -EPCkKvbdmbJvxPOV -DncLKvbdTqRPUuIN -EPDLKvbdGGKSNiUR -EPCjjvbdIwtCIMQp -EOcKjvbdHDjvJajK -EOcLKvbdZyEJnDMS -DnbkKvbdrWpMDJZR -EOcLKvbdbUagXjtI -EOcLKvbdLGFgbBRV -EOcKjvbdqvpMDIxq -EPDKjvbdOAJSsjSA -DncKjvbdsrqsYyeD -DnbjjvbdtkwvaUBX -DnbjjvbdGQASwGfZ -EObkKvbdURROtuIN -EObkKvbdiUydwRtb -EOcLKvbdqlyixkhJ -EPCkKvbduaEYroFI -DoCkKvbdnUtyjiqf -DoCkKvbdssSTYzFD -DncLKvbdeATqMwjG -DnbkKvbdqlyjYlHi -DncLKvbdTAEhhCOd -EOcLKvbdpxoIHQdY -EPDKjvbdEXxLsstM -DncLKvbdbLLfPNcA -DoDLKvbdCWzdIeQW -DnbjjvbdWSNwbElD -DoDKjvbdGFjSOJUR -DoCjjvbdmttzKjRf -EPCjjvbdqmZjZMHi -DncLKvbddwzUTqez -EObkKvbdrEFIpOVa -DnbjjvbduMYWaTaX -EPDKjvbdTAEiIBoE -EOcKjvbdVrNwaeMD -DoCjjvbdSwkMNzjx -DoDKjvbdZoNheEyj -EObjjvbdFpASvgGZ -DnbkKvbdvBDxsPEh -DoDKjvbdIHGzYxYH -EOcLKvbdhanbeXQq -EObkKvbdACqxJyhp -DoDLKvbdgQBzwDxI -EObjjvbdOYOuzdNt -DnbjjvbdRWmdDMHc -EPCkKvbdePFTLUUS -DnbkKvbdHlBznWpk -EPCkKvbdqlyixlIJ -DnbjjvbdIHHZyYXg -EObjjvbdBcoaVimG -EOcLKvbdZnnIddzK -DnbjjvbdBiLBjhfK -EPDLKvbdeOeTKtTr -EObkKvbdYlRcsnLm -DoDKjvbdnHExNOGy -DoCkKvbdnCJwXoNu -EOcKjvbdwWlBWBWV -DnbjjvbdGYuVAdXb -EObkKvbdLGGHbBQu -EPCkKvbdEJgjVxKA -EObkKvbdlqyVZrdJ -EObkKvbdaNLBsUmH -EPCkKvbdGQASwHGZ -DncLKvbdnBjWwnnV -DnbjjvbdUslsekuj -DncLKvbdeATqNYJf -EOcLKvbdIwtCHlQp -EOcLKvbdGLErcIMu -DnbkKvbdjvXOECXw -EPCkKvbdfSAvzkbo -DnbjjvbdsCGNMHKy -DoDLKvbdURQnuVHm -EObjjvbdQvmdCkgc -EPCjjvbdSPsgKFcw -EPDLKvbdYpmEhleR -EPCjjvbdFjdsDHlu -EPDLKvbdqdFIpOWB -EObjjvbdnQZyVkZC -EPCjjvbdQdCaQRES -DnbjjvbdADRwiyiQ -DnbjjvbdiiehKNYS -DoCkKvbdHkaznWqL -EObjjvbdmoyxujxb -EOcLKvbdxxIibQZk -EObjjvbdsPuoKCvG -EObjjvbdjcMKpftg -EOcKjvbdZisHofbG -DncLKvbdUGznLwWF -DoDLKvbdFfJqnJUR -DnbjjvbdsBelkgLZ -DoCkKvbdrbGNLfkZ -DncKjvbdeYZssqez -EPCkKvbdyNsHwsIc -DnbkKvbdrafMkfjy -EPCjjvbdZyEJnDMS -DnbjjvbdFpASwGey -DnbkKvbdLGGIBaQu -DncLKvbddiiqutzn -DncKjvbdWIXuwfxz -DoCjjvbdNPxRVnHT -DncKjvbdwygefXeS -EPDLKvbdmJEUQtrB -EPCjjvbdQwOECkhD -DoDLKvbdNGbpMotk -DncLKvbdRyjIScWA -DncLKvbdVrOXaeMD -DncLKvbdQmYBxnUz -DnbjjvbdVBCRSqSZ -EPCkKvbdRosfifEX -EPDLKvbdlYrqrxgU -EPDLKvbdKVuGDeHJ -DncLKvbdDncLLWcE -EOcLKvbdfNGXGmKL -EOcLKvbdQvmdDMHc -EOcLKvbdEARiMyvw -DoCjjvbdnHFXlnGy -EOcKjvbdhtyeXRtb -DncKjvbdMgDQNQVL -EObjjvbdpedFUWBI -EPDKjvbdkHfkfFnL -DoDKjvbdrXQMChyR -EObkKvbdREDAoqES -DoDKjvbdBdQAvKMf -DoCkKvbdjvWnDaxX -DnbkKvbdePEsKstS -EPDKjvbdyOTHwsJD -DnbkKvbdrSVKnKaN -EPCkKvbdZirgpHBf -DoCkKvbdsQVnjDVf -DnbjjvbdGLEsCgmV -EPDLKvbdelewHMjL -EObjjvbdjlbMZeGo -DoDLKvbdxrmhlrCH -DoCkKvbdczZQXyQb -EObjjvbdRDcBQRDr -DoCjjvbdxLXEHzyf -DoCkKvbdkySrTZGt -DoCjjvbdDoDKjwCd -EObkKvbdKWVGEEfi -DoDKjvbdTqQoUuIN -EObjjvbdZRNEiMeR -DoDKjvbdxUmEpyMO -EPDLKvbdxxJJaozL -EObkKvbdraemLfkZ -EPCjjvbdbiNKLFvx -DnbjjvbdZjSgpHCG -EObjjvbdqBIeAXHd -EObjjvbdVUNUGMWK -EPDKjvbdliDsqUqa -EOcLKvbdxZgfGYFS -DnbjjvbdYpmFJMdq -EPCkKvbdcTCjtEKB -DncLKvbdVUMtFlVj -EPDKjvbdcIlijevx -DoCjjvbdpstHSSKt -EOcKjvbdLAjgMaxR -DoDKjvbdHkaznXQk -EPDLKvbdrovPJcVf -EObjjvbdjblLRHVH -EPCkKvbdfSAvzlCo -EPDLKvbdkHfkefOL -DoCjjvbdbiNKKfXY -EPDLKvbdjJfHilwr -EOcKjvbdxVMeQxkn -DncKjvbdqlzJyMIJ -DoDLKvbdffMZnGgA -EPDLKvbdrpWPJcVf -DnbkKvbdNsTvGeVQ -DncKjvbdZshiZETO -DoCjjvbdWRnXaeLc -EPDLKvbdUaCRTQqy -EOcKjvbdKDKDQjCx -EPCkKvbdLKaIWAJy -DoDKjvbdjblKpftg -EPDKjvbdfHkWSNqH -EObjjvbdSCEEkiZL -EPDKjvbdcyxpYZQb -EPDLKvbdVUMtFkuj -DnbjjvbdVBCQrprZ -EObjjvbddoEsLUUS -DnbkKvbdiHKDZVjV -EOcKjvbdpyPHgRDx -EObjjvbdYpleJNFR -DncLKvbdrDdhpOWB -DncLKvbdcbSmSAUN -DncLKvbdQwODcLgc -EPCjjvbdKVuFcdgJ -EPDLKvbdJvUecdfi -EObkKvbddjJqvUzn -EPCkKvbdLrXNZuQz -DnbkKvbdDihJuxKA -DoCjjvbdegkWSORH -DncKjvbdFyVUaEYC -DoDLKvbdNHDPlpVL -DoDLKvbddneTKtUS -DoCjjvbdEARhlywX -DncKjvbdmbJwYPOV -DnbjjvbddeOrBvbj -EPDKjvbdAMhZTXZx -DnbjjvbdULuoBVoJ -DoCkKvbdMfbomQVL -EObjjvbdyTNhlqbH -EPDLKvbdcyxowxpb -DoCkKvbdEPDLLXCd -DncLKvbdSCEFLiZL -DnbjjvbdBiLCKiFj -EPCjjvbdmgExNNgZ -EOcLKvbdsPvPKDVf -DoCkKvbdbKkfOmcA -DncLKvbdIxTaglRQ -DnbkKvbdFVyQQNJe -EPDLKvbdbsCjtEKB -EPDKjvbdakMFnnDA -EObjjvbdWWiYVcdg -DnbkKvbdfSAvzkcP -EOcLKvbdbKkennDA -EPCjjvbdTppoVUhN -EPDLKvbdemGWgMjL -DnbjjvbdJvUedFHJ -DoDLKvbdqvokbiZR -EPCjjvbdZMRctOMN -DoCjjvbdNPwpunGs -DoCkKvbdZtJIyDrn -EPCjjvbdFejRnIsq -EPDLKvbdZshhxdTO -DncLKvbdxZhGGXeS -DoDLKvbdKyRKSztf -EPDKjvbdCflFgAzc -EPDKjvbdOEdThiKd -DoDLKvbdTAFIgaoE -EObjjvbdEARiNZvw -EOcLKvbdjhHLefOL -DncKjvbdbVCHXjtI -EPDKjvbdeFPRawCj -DoDLKvbdtcCuWuoP -DoDLKvbdUVkpJtAq -EPCjjvbdaSFcHsfL -EPDKjvbdPxmAGrrK -EPCkKvbdDjHjWXjA -DnbkKvbdpssfqrKt -DoDKjvbdePEsKtTr -EObkKvbdDwxMUTtM -DnbkKvbdZRMdiNEq -EPCjjvbdhuZdvquC -DoCjjvbdGLEsChMu -EPDKjvbdRDbaQQdS -EOcKjvbdEJhJvYKA -DncKjvbdkxsSSxft -EObjjvbdKRZdnfOF -EOcLKvbdZQmFIleR -DnbkKvbdjcLjpfuH -DnbkKvbdYzbfSKWZ -EPDLKvbdbUafxLTh -EPCjjvbdJuuFcdgJ -DoCkKvbdJcKCqJcY -DoCjjvbdSKyGVGkT -DoCjjvbdemFvflik -DoCjjvbdvBEYsPEh -EOcKjvbdCWzdJEov -DncLKvbdqTsgSSKt -DnbkKvbdUMVoBWOi -EPCkKvbdOEcsiIjd -DncLKvbdaSFbhUFk -DoCkKvbdhtzEwRuC -DoCkKvbdiCOcEvqR -DoCkKvbdfILVqnRH -DnbkKvbdCJLCKhej -EPCkKvbdakLeoODA -DnbkKvbdUaCRTQrZ -DoDKjvbdRacdkhyL -EPCjjvbdYNqAXtut -DncKjvbdwzHfFwdr -DncLKvbdNrsvGeUp -EPDKjvbdDoCkKvbd -EPCjjvbdrafNLfkZ -EObjjvbdmajXXoOV -DncLKvbdVAbRTQrZ -EObkKvbdkySrTZHU -DoDKjvbdZeXfzghb -EPDLKvbdiCOcFWpq -EOcKjvbdUQpnuUhN -DncLKvbdijGIKMwr -DncKjvbdHgHZxwwg -DncLKvbdVTmUFlWK -DoDKjvbdeYZtUSFz -EPDKjvbdHffyyYXg -DncKjvbdXsLaMtOx -DncKjvbdzitoocrt -DoDKjvbdhtyeWquC -EPDKjvbdEuyPpNKF -DnbkKvbdtvOYKRTA -DncKjvbdZnnJFEzK -EPCkKvbdqZPIGpcx -DnbkKvbdVgxWYGxz -EPCjjvbdOStWHEuQ -EObkKvbdNddTiIjd -DoDKjvbdwXMBWAuu -EPDLKvbdsPvPKDVf -DncLKvbdQvnDbkhD -DncKjvbdEKHjWYKA -EPCkKvbdCgMFgAzc -EOcLKvbdQvnDbkgc -EPCjjvbdDoCkLWbd -DnbkKvbdKCibpicY -EOcLKvbdhfibyViu -EOcLKvbdzQnliJwA -DncKjvbdEASImZwX -EPDLKvbdFkFTChNV -DnbjjvbdEuxoomKF -EOcKjvbdYqMeJMeR -DnbjjvbdgQBzvdYI -DoCjjvbdkxrrSxft -DnbjjvbdjuwNdCYX -EOcLKvbdfpBzwEXh -DoCkKvbdnHFYMmgZ -EOcKjvbdjlbMZeHP -DoCkKvbdmttzKjSG -EPDLKvbdzjUopDsU -EPDLKvbdsZlPraIO -EOcLKvbdLBLHMbYR -EPDLKvbdtbcVXVno -DoDLKvbdaaVeGQQX -EPCjjvbdWSOYCEkc -EObjjvbdxUmFQyMO -DoDLKvbdRbDdkiZL -DoCjjvbdhlFDnVCy -EPDKjvbdcTDKscia -EPCkKvbdjlbMZeGo -DncLKvbdCIkCKiGK -DoCjjvbdrbFmMGkZ -EObkKvbdQccAoqDr -DnbjjvbdTqRPVUgm -EPCkKvbdNrsufeUp -EOcLKvbdrMyjZLhJ -EPDLKvbdiifHimXr -DnbkKvbdpstHSRjt -EOcKjvbdZtIhxdSn -DnbkKvbdbhmKLGXY -DnbkKvbdkxsSSxft -DoCjjvbdTAFIhBnd -EObkKvbdUtMtGLvK -EPCjjvbdpstGrSLU -DncKjvbdxLXDgzyf -EOcKjvbdSCDdlIxk -EObkKvbdOFEUIiLE -DnbkKvbdjggLefNk -DncKjvbdliEUQtqa -EOcLKvbdFjdsDHlu -DncLKvbdeEnqavcK -EOcLKvbdnPyyVjyC -DoDKjvbdliDsptrB -DoCkKvbdrXQLbiZR -DncLKvbdFkErbhNV -DoDKjvbdTqROtthN -DoCkKvbdYSlAmUOx -DnbkKvbdKVuGDdgJ -EOcKjvbdvwLaWAvV -DoDLKvbdEObjjvbd -DnbkKvbdwXLaWBVu -DnbkKvbdmtuZjiqf -DoDKjvbdegkWRnRH -DoCkKvbdeXzUUSFz -DncLKvbdfNGXGmJk -DoCjjvbdEztQdlCi -EPCkKvbdEuyQPljF -EPCjjvbdrEEiQNvB -DnbkKvbdLqwNZtpz -EObkKvbdKeegbBQu -EObkKvbdvBEZSoFI -DoDLKvbdrXQLbhyR -DnbkKvbdbKlGPODA -DncLKvbdnCKXYOnV -EOcKjvbdjcMKpfuH -DoCkKvbdQdCaQRES -EPCkKvbdDncKjwCd -DoDLKvbdYlSDtNkm -EObkKvbdmbKXXnmu -EPCkKvbdjgfkfGOL -DnbkKvbdZyDjNcMS -EOcLKvbdkNCLyeHP -DncLKvbdVUMtGLuj -EOcKjvbdKVtedFGi -EPCjjvbdKRZeOenF -DoCjjvbdUQqPUthN -EPDKjvbdkMbLydgP -EObjjvbdVqmxBdlD -EPDKjvbdjAQGaPgK -DoCkKvbdTlVnaWPJ -EPCjjvbdwjvdHzzG -EObjjvbdBsBCtGWr -EPCjjvbdwuNEqZMO -DncLKvbdbrcKtEKB -EPCkKvbdFyVVAcxC -EPCkKvbdaSGCgsfL -EPDKjvbdrylQTBIO -DncKjvbdfSBWzlCo -EObjjvbdfRaWzlCo -DnbkKvbdsPvOjDWG -EPCjjvbdcbSlrAUN -EObkKvbdrWpLbhxq -EPCjjvbdhgKDZVjV -EOcKjvbdhlFDnUby -DoCkKvbdddoSBvcK -DoCkKvbdpssfrRkU -DoDLKvbdJutfEFGi -EObkKvbdEPDKkWcE -EOcKjvbdcJNJjevx -EPCjjvbdcTDKscia -DncKjvbdYlRcsmlN -EPDLKvbdkHgMFfNk -DoCkKvbdjbkjqGuH -EPDKjvbdTvMPjUAq -DnbkKvbdQYmAGsRj -EPCkKvbdKeegbApu -EPDKjvbdiLdcmtcZ -DoCkKvbdNeDshhjd -EOcLKvbdxnShXsIc -EPDLKvbdyOShXrhc -EObkKvbdbPgHELzd -DoCjjvbdDoCkKwDE -EOcLKvbdmbJvxPOV -DnbjjvbdkNBlZeHP -DnbkKvbdRXNdDMID -DncLKvbdXnRAYUvU -EObkKvbdBcpAuilf -EPDKjvbdSLYeuGkT -DoCjjvbdRaceLiYk -DncLKvbdZoNiFEzK -EOcLKvbdGLEsDIMu -DnbjjvbdnUuZkJqf -DoCkKvbdlqyUyrci -DoCkKvbdLGGHaaRV -DnbkKvbdmoyyWLYb -DncKjvbdMpYRWOGs -DnbjjvbdkyTRsYft -EObkKvbdjKFhJmXr -DnbjjvbdxLWcgzzG -DoCkKvbdxnShXrhc -DnbjjvbdRbEEkiZL -EOcLKvbdWWiXudEg -DoDLKvbdDjIKVxKA -DoDKjvbdgFkzNgHA -EPDLKvbdvvlAuaVu -EPDLKvbdauBfwkTh -DncLKvbdmIctQtrB -EPDKjvbdCDpBWJmG -DoDKjvbdvAcxsPEh -EOcKjvbdrJAKFNOe -EOcLKvbdbsDKscia -DncLKvbdAMhYsWzY -DncKjvbdddnrCXDK -EOcLKvbdkHflGGOL -DoDKjvbdbUafxKsh -DnbkKvbdNdctIiLE -EOcLKvbdvBDyTPEh -DoCjjvbdFejSOJUR -DnbkKvbdUQpntuHm -EObjjvbdTpqOttgm -DoDLKvbdddoSCXCj -DncLKvbdbVCHXkUI -EPCjjvbdKNAEZgVB -EPDKjvbdFjdsDIMu -DnbjjvbdpaIeAXHd -EOcLKvbdrDdhpOWB -EPDKjvbdIxUBhLpp -EPDKjvbdhkddOVCy -EPCkKvbdTkuoAuni -EPDLKvbdnPyxujxb -EObjjvbdfSBWzlCo -EPDKjvbdMuSrKmAX -EPDLKvbdmozYvKyC -DnbkKvbdZirhPfaf -EPCjjvbdNQXqWOHT -DncKjvbdZsiIyESn -DnbkKvbdURQnuUgm -DoCjjvbdkIHMFfOL -EPDKjvbdKfGHaaRV -DncLKvbdtcDUwVoP -EOcLKvbdxrnImRbH -EPDLKvbdozmdLYPA -DoDKjvbdUVkojUBR -DnbjjvbdqUUHRrLU -DoDLKvbdEARhmZvw -EOcLKvbdZHWdAOri -DoCjjvbdVUMtGLuj -EOcLKvbdmfeYNNfy -EPDKjvbdZirgogCG -DnbjjvbdEJhKVwjA -DnbkKvbdkVvmdBxX -DnbjjvbdvBEYsOeI -EPCkKvbdDoCjjwDE -DoCjjvbdRXNdClID -EPDKjvbdkxrrTZGt -EOcLKvbdZdxGzhJC -DoDLKvbdxnSgxSiD -DoDKjvbdIryAsMxM -DnbkKvbdTYKlNzjx -DncLKvbdIGfzZYXg -DncLKvbdQvnEClHc -DnbkKvbdqUTfrRkU -DoDKjvbdRDcAopdS -DoDKjvbdTfznMXWF -EOcLKvbdauCHYKtI -EObkKvbdNrsvHEtp -DoDLKvbdDihJvXjA -DnbjjvbdliDtRVRa -DncKjvbdgFlZmfgA -DncLKvbdmJDsptqa -DncKjvbdfoazvdXh -EOcKjvbdJXtBgkpp -EPCkKvbdqUUGrSKt -EPDKjvbdrMzJyLgi -EPCjjvbdiGjDYuiu -EOcLKvbdkWXNcaww -EOcLKvbdxxIjBoyk -DnbkKvbdePErjssr -DnbjjvbdIryArmYM -EOcLKvbdRMwayNtz -EOcLKvbdRkZGUgKs -DoDKjvbdZLrEUOMN -DnbkKvbdDHMFgAzc -DnbkKvbdwXMBVaVu -DnbjjvbddeOrCXDK -EPDLKvbdwuMeQyLn -EPCjjvbdBhjbLIej -EPDKjvbdaNLCSuMg -EPCjjvbdBhkCKhej -EPCkKvbdptUGrSKt -EObkKvbdVTmTfLvK -DoCkKvbdDoDKkXDE -DnbjjvbdfoazvdYI -DnbkKvbdatbHYKtI -DnbkKvbdVUMtGLuj -EPDKjvbdeEoRavbj -DoCkKvbdJpzFPGNe -DnbjjvbdNHDQNQUk -DncKjvbdYNqAXuWU -EPCkKvbdZnnIddzK -EObkKvbdYlRdTnMN -EPDKjvbdEzspdkcJ -DoDLKvbdCIkBjhfK -EObjjvbdTkuoAvOi -DoCkKvbdhkdcnUby -EPCjjvbdHfgZyYXg -DncLKvbdbsCkTdKB -DoCjjvbdLqwMzVQz -DoDLKvbdRkYfUgLT -EOcLKvbdbQHHELzd -EPCkKvbdbVCGxLTh -EObjjvbdmSYuZsEJ -DoDKjvbdssRsYyeD -EPDKjvbdLrWlytpz -DncKjvbdJTZBSlxM -DnbkKvbdxrnJMrBg -EPCjjvbdxZgfFxFS -EObkKvbdUQpnuVIN -EObkKvbdzjUpQESt -EObjjvbduaDxsPFI -DoDLKvbdkyTRsYft -DoDKjvbdyTOImRbH -EObkKvbdegkWRnQg -DoCjjvbdaSFbgsek -DoDKjvbdrylPsAhO -DoCjjvbdgGMZnGgA -EPCkKvbdlqyUzSdJ -DncKjvbdwNWAMdFN -EPDKjvbdTlWPAuoJ -EOcLKvbdUMWPAuoJ -DnbjjvbddZxowxqC -EPCkKvbdEuyQPlie -DoDKjvbdVAaqSqSZ -EPDLKvbdwtldpxlO -EOcLKvbdrRtkNkBN -DncKjvbdJqZeOenF -DncKjvbdfHkWSNqH -DoCkKvbdnUuZjirG -EOcKjvbdsCFmMGkZ -DoDLKvbdwzIFfYEr -EOcLKvbdqqtjmjaN -DoCjjvbdrbGNLgKy -EPDKjvbdNHComQUk -DnbkKvbdIMBznWqL -EPCjjvbdEKHivXjA -EPDLKvbdVhYWYGxz -EPDLKvbdZxcjNblS -DnbjjvbdJpzEoFme -EPDKjvbderBWzkcP -DoDLKvbdpssgRrKt -EObkKvbdtbbtvuoP -EOcLKvbdqGDeUWAh -DoDKjvbdlZSrTYft -EOcKjvbdFfKRmhtR -DnbkKvbdNPxRVnGs -EPDLKvbdZshhxcsO -EPCjjvbdMoxQvNgT -EPCjjvbdKaKfmBxR -EPDLKvbdSwjkmzjx -DoCkKvbdjbkkRGtg -DoDKjvbdfoazwDxI -DoDKjvbdqwQLbhxq -EPCkKvbdZtIhyETO -DncLKvbdmpZxukYb -EOcKjvbdMoxQumgT -DoCjjvbdLYqJrzuG -EObjjvbdnGeXlmfy -EPDLKvbdyzeOSHhh -EOcLKvbdiZuGMQmf -EPCkKvbdWSNwadkc -DncKjvbdhfibyVjV -EOcKjvbdQmXbZOUz -DoCjjvbdSKxeuGkT -DnbjjvbdbrbkUDjB -EPDLKvbdJcKCqJbx -DnbjjvbdjSziTLJz -EOcKjvbdZxdKNcMS -DoCkKvbdelfWfmJk -DoCjjvbdFjeScHlu -EPDLKvbdnCJvwnnV -EPDKjvbdNrsufduQ -DnbkKvbdjcLjqGuH -EObjjvbdmbKXYOnV -DoCjjvbdRacdkiYk -EObkKvbdaaVdfQQX -DoCkKvbdJpydnfOF -DoCkKvbduCbtwVoP -DoDKjvbdpxnhHRDx -EOcKjvbdmJEUQtqa -EPDLKvbdRkZGVGjs -EPDKjvbdEObjkXCd -EObjjvbdCTAbtGWr -DoCkKvbdqTsfrSKt -DncLKvbdaMkBsUmH -DncLKvbdqlyixlIJ -EPCkKvbdvwMAuaVu -DncKjvbdiUzEwRuC -DoDKjvbdiUzFWrVC -DnbkKvbdkDMKpfuH -EObkKvbdZnnJFEzK -EObkKvbdWWhwudEg -DoCjjvbdypoNIiwA -DoCjjvbdShyiqABM -DnbjjvbdOFEThhkE -DnbjjvbdRXNcbkgc -DoCkKvbdqUTfrSKt -EPDLKvbdfNGWgMjL -EPDLKvbdGFirOJUR -EOcKjvbdSCEFMJYk -EOcKjvbdmpZxukYb -EPDLKvbdrafNLgKy -DnbkKvbdmJDsqUrB -DnbjjvbdjKFgimXr -EOcLKvbdVYgtZjoO -EObkKvbdTvMPjUBR -EOcLKvbdSxKkmzjx -DoDKjvbdnPzYvKxb -EPCjjvbdaRfDITek -EObkKvbdjKGIJmXr -DoCjjvbdliEURVSB -EObkKvbdFaOqYizm -EOcLKvbdqGEEsuaI -DoCjjvbdZQleJNEq -DoCjjvbdbKlFnnDA -DnbjjvbdWIXuwfxz -EPDLKvbdNGcPmPuL -DoCjjvbdBsBDTevr -DnbkKvbdczYoxYpb -EObjjvbdJutedEfi -DncLKvbdGFirNhsq -EPDKjvbdUaCQrqRy -EPCjjvbdQwNdDMID -EPDLKvbdtSrSyZeD -DnbkKvbdNHDQMpUk -DoDKjvbdZirgofaf -EObkKvbdrpWOibuf -DoCkKvbdwygfFxEr -EPCjjvbdSwjlNzjx -DnbkKvbdjKGHjMxS -DncLKvbdijFhKNXr -EOcKjvbdddoRavbj -EPDLKvbdmIdTpuSB -DncLKvbdiiehJmYS -EObkKvbdjcLkQgUg -DoDKjvbdsQVoJbuf -EObjjvbdhzUfMQmf -DnbkKvbdcImKKfWx -EObkKvbdbQHHELzd -DnbjjvbdWWiXuceH -EPDKjvbdjJegjNXr -EPCjjvbdZyEKNblS -DoDKjvbdLqvlzVQz -EPDLKvbdZRNEhmFR -DnbkKvbdGcjuibJj -EOcLKvbdGAnpxizm -EPCjjvbdkVvnDaww -EOcKjvbdHffzZXwg -DoCkKvbdKeehCAqV -EPCjjvbdHEKuiajK -EOcKjvbdUtMselWK -EPDKjvbdEXwlTstM -EPDKjvbdsrrSxzFD -EOcKjvbdEztQeMDJ -EPCkKvbddoFSjstS -DoCkKvbdSCEElIyL -DncKjvbdFVxpQNJe -DnbjjvbdXmqAYUut -DoCjjvbdiZtfLpmf -DoDKjvbdwygeexEr -EOcLKvbdiUyeXSUb -DncKjvbdsZkoraIO -EOcLKvbdACrYJyhp -EOcLKvbdTlVoBVoJ -EPCkKvbdqZPHfqDx -DnbkKvbdmJDsptqa -DncKjvbdhkeDnUcZ -EPDKjvbdURQoUtgm -EPDKjvbdjAQHAogK -EObjjvbdCIkCKhfK -EOcKjvbdYzbfRjWZ -DnbkKvbdWRnYCEkc -DncKjvbdyzeORgiI -EObjjvbdEPCkLWbd -DoDLKvbdNHComPuL -DnbkKvbdaRebhUFk -DnbkKvbdhlEcmtby -EOcLKvbdliETqUrB -EPDKjvbdIxTbHkqQ -DncLKvbdCEPaVjNG -EOcLKvbdIjEAJogE -DoCkKvbdsZkpSaHn -EPDLKvbdEXxLtTtM -DncKjvbdwXMAvAuu -EPDKjvbdakMGPODA -EPCkKvbdauBfxKsh -EOcKjvbdCJKakJFj -EPCkKvbdyXhjBozL -DoDLKvbdkWWnDbYX -DncKjvbdEPCjkXDE -DoDKjvbdlqxtzTDi -EPCjjvbdyTOJNSBg -DoCkKvbdnGeYMmgZ -EPCkKvbdaSFbhUFk -EObjjvbdnCKWxPNu -DoCjjvbdrWpLbhyR -EPDLKvbdmRxtyrci -DnbjjvbdSBdElJZL -DnbkKvbdrXQLbiYq -DoDLKvbdWHwuwfxz -DoCjjvbdZRNFJNEq -DncKjvbdUVkpJsaR -DoCjjvbdbiMijfXY -EPDKjvbdVTmTekvK -DoCjjvbdeXytTrFz -DoDLKvbdyYJKCQZk -DoDLKvbdczZQYZQb -EObjjvbdRadFMJZL -DncLKvbdkVvnECYX -DncKjvbduaDySneI -DnbjjvbdwuNFQyMO -DncLKvbdsrqrxzEc -DoDLKvbdcSbjtEKB -EPCjjvbdZtJIyETO -DoDLKvbdJvUfDdgJ -DnbjjvbdhbPDFWqR -DncKjvbdcyyQYYpb -DoDKjvbdWSNwbFMD -DoCjjvbdmajXXoNu -EPCkKvbdxZgeexEr -EOcKjvbdxsOIlrBg -DoDKjvbdZyEJmbkr -DncLKvbdTkunaVni -EOcLKvbdUQpoUthN -DoDLKvbdyNsHxTJD -DncKjvbdEztRElCi -DnbkKvbdXnRAYVVt -DnbjjvbdqAheAWgd -DnbkKvbdCJLBkIfK -EPDKjvbdUGzmkwWF -EPCkKvbdSiZiqABM -EPDLKvbdidkGtoAO -EOcLKvbdYlSDsnLm -EPDKjvbdMSWmZtpz -DoDKjvbdlhdURVRa -EOcLKvbdOYOuzdOU -DncLKvbdrafMlGkZ -EObjjvbdrylPraHn -DnbjjvbdDncLKwCd -DoCkKvbdoznELXoA -DoCkKvbdmttykJrG -DoDLKvbdBvzciEov -EPCjjvbdeXzUUSFz -DoDKjvbdtunYKQsA -EObjjvbdqceJQNvB -EOcLKvbdqTtGqqkU -DoCkKvbdiGjDYujV -EPCkKvbdRWnEDLhD -EOcLKvbdcSbjtDia -DncLKvbdTqROuVHm -EOcKjvbdiifIKMxS -EObkKvbdlYrqsZGt -DoDKjvbdSBdFLhxk -DnbkKvbdVUNUFkuj -DoCjjvbdrzLpSaIO -DoDKjvbdzGxlANFX -DoDLKvbdfHjuqmpg -EPDKjvbdZRMeIldq -DncKjvbdMfcPlpVL -DncKjvbdxKwDgzzG -EOcLKvbdYzbfRjVy -EObkKvbdWSNwbElD -DoCkKvbdeFOrCXCj -EObjjvbdbKlGOmcA -EOcKjvbdDxXktUTl -EPCjjvbdvBDySneI -EPDKjvbdLFehCBRV -DoDLKvbdiZuFlROG -EPDKjvbdDoDLKvbd -DoCjjvbdQwNdCkhD -DoCjjvbdCJLBkIfK -DnbjjvbdlqyUzSci -DncLKvbdNHCpMpUk -EOcKjvbdiMFEOVCy -DoCkKvbdnGeYNOGy -DnbkKvbdZoOIddzK -EOcKjvbdFpATWffZ -DoDKjvbdeOeTKtTr -DnbjjvbdGGKSNhsq -EOcKjvbdyXiKCPyk -DoCjjvbdeAURNYKG -DoDKjvbdpssfrRjt -EPDKjvbdnVVZjjRf -EOcKjvbdiZuGMQmf -EOcLKvbdNHDPlotk -DnbjjvbduCbtwVoP -EOcKjvbdxUleQxlO -DoDKjvbdnHFYMnGy -DnbjjvbdUVlPitAq -EPCkKvbdjAPgAofj -DoCkKvbdTlVoAuoJ -EPCkKvbdmSYtyrdJ -EPDKjvbdBsAcTevr -EPCkKvbdUyITzKnn -DnbjjvbdbQHGdLzd -EOcLKvbdezuyFIsw -DoDLKvbdEXwlTtUM -EOcKjvbdKyRJrztf -DnbjjvbdtTSSxzEc -DnbjjvbdHDjujBij -DoCjjvbdsQVnicWG -EObkKvbdZsiJYcrn -EPDLKvbdUtNUFkuj -DoDKjvbdNPwpumfs -EOcKjvbdSBcdlJZL -EPDLKvbdmfeXlmfy -DncKjvbdIsZAsNXl -DncLKvbdmJDsptrB -DncKjvbdGYuUaEXb -DncLKvbdyYJJbPzL -DnbkKvbdrpVnicWG -EPCjjvbdTqQoVUgm -DoDLKvbdFVyPpMjF -EObkKvbdZnnIeEyj -EObkKvbdbUagYKtI -DoCkKvbdqGDdtWBI -EPDLKvbdFVxpQNKF -DncLKvbdkWXNdCYX -EPDKjvbddwystRez -EOcKjvbdaNKasUlg -DnbkKvbdNdctIhjd -EPCkKvbdatagYKsh -DoCkKvbdfNFvgMik -EObjjvbdJYTbIMQp -DoCjjvbdEYYMTtTl -DncKjvbdWRmxCElD -EPCkKvbdbsCjsdKB -EOcLKvbdFVxpQMie -EObkKvbdpaJFAWgd -EPDLKvbdijGHimXr -EPCjjvbdlhctQtqa -EObjjvbdFVxoolie -DncKjvbdrJAKEmOe -DnbkKvbdzQnmIiwA -EPCkKvbdkHfkeemk -DnbjjvbdLGGHaaQu -DnbkKvbdOSsugEtp -DnbkKvbdZtIiYcrn -DoCjjvbdQZNAGsSK -EObjjvbdNPxRWOGs -DoCkKvbdVUMsfLuj -DnbjjvbdmJETqUqa -EPDLKvbdBsAcUFvr -EOcLKvbdIsZArlwl -EPCjjvbdNddTiJKd -DoDKjvbdyXhiaozL -DncLKvbdjmCLzEfo -EOcLKvbdRadElJYk -DncLKvbdjbkkQfuH -EObkKvbdXFxzUAOs -DncLKvbdxZhGFwdr -DoCjjvbdNsTugEuQ -EObjjvbdRbDdlIyL -DoCkKvbdePEsLUUS -DoCjjvbdOStVgFVQ -EPDLKvbdUtMtGLuj -EObjjvbdFjdrbhMu -EOcKjvbddeOrBwCj -DnbjjvbdxUmFRYkn -DnbjjvbdCEQBVimG -EOcLKvbdvAdZTPEh -EPCkKvbdGcjvJaij -EPCjjvbdOFETiIjd -EOcLKvbdemGWgNKL -DoCkKvbdqTsfrRkU -DncLKvbdbrcKsdKB -EPDLKvbdTAFIhBoE -DoCjjvbdKCjCqJbx -DnbjjvbdNsUWHFUp -EPDKjvbdkWWmcaxX -EPDLKvbdbKlFoNcA -DoCjjvbdkIGkefNk -EPCkKvbdXFyZtAPT -EPDKjvbdpxnhGpcx -DoDLKvbdhanbeWqR -EOcKjvbdliEUQtqa -EObjjvbdbBVeFpPw -EObkKvbdQdDApQdS -EPDLKvbdnQZyVkZC -EObjjvbdhbOcEwQq -DnbjjvbdBdPaWKMf -DoCjjvbdCTAbtGWr -EPCjjvbdEvYpQMie -EObjjvbdDxYLtUTl -EObkKvbdCTBDTfXS -EPCjjvbdmpZxvKyC -EPCkKvbdRzKITDWA -EObkKvbdemGXGmJk -EOcLKvbdIryAsNXl -DoDKjvbdkWXNcaww -EObkKvbddCTNSAUN -DncKjvbdvBDxroEh -DncLKvbdiCPDEwRR -EObjjvbdRkZGVHLT -DoCjjvbdFkFSbhNV -EPDLKvbdwjvdHzzG -DoDLKvbdqquKmkBN -EOcKjvbdsQVoJcVf -EPCjjvbdYlSEUOMN -EObkKvbdjKGIKMxS -DncLKvbdRpUGifDw -EObkKvbdEuxooljF -EPDLKvbdzitpQETU -EOcKjvbdTvLpKUAq -DoCjjvbdrSVKmkAm -EOcLKvbdEvZQPmJe -EPCkKvbdfelZnHHA -EOcLKvbdjhGlGGNk -DncKjvbdCEPaWJmG -DncLKvbdrpVnjDWG -DoDLKvbdeOeTKtUS -DoCkKvbdtbbuXVno -EObkKvbdYpleJMeR -DnbjjvbdiCPDEvqR -DoDLKvbdUslsekuj -DnbkKvbdGBPQyJzm -EPCkKvbdtbcUwVoP -DoDKjvbddxZssrFz -DncLKvbdkIGlGFmk -EPCkKvbdhuZdwRtb -EObkKvbdehLWSOQg -DoCkKvbdatafwjsh -DoDKjvbdhfjCyViu -DoCjjvbdFyUuAcxC -EObkKvbdUMWPAvPJ -EPDLKvbdxxIjBoyk -DnbjjvbdMRvlytpz -EPCkKvbdDxYLtUTl -DnbjjvbdiVZeXSUb -DoCjjvbdffMZmgHA -EPDLKvbdnPyyVkYb -EPCkKvbdZtIhyETO -DncKjvbdRECaPqDr -EPDKjvbdVrNxBeMD -DnbkKvbdKVuFdFGi -EOcLKvbdrzLosAgn -EPDKjvbdLLAgvAKZ -EOcLKvbdLYpirztf -DncKjvbdnGeXlnHZ -EOcLKvbdQdDAopdS -DnbkKvbdptTfrRkU -DoCjjvbdqGEFUVaI -DncLKvbdrDeIomvB -DoDLKvbdyOTHxSiD -EOcLKvbdRpTfjGDw -DoDLKvbdzitpPdTU -DnbjjvbdUxhTykOn -EOcKjvbdGFjSNhtR -EObkKvbdidkGuPAO -EObjjvbdVAapsQrZ -EPDLKvbdQccAopdS -EObjjvbdmozYukZC -EOcKjvbdGFjSOIsq -EPCkKvbdyzeNrHiI -DncLKvbdEOcKjvcE -DncLKvbdLFfIBaQu -DoDKjvbdtlXwBUBX -DoCjjvbdeOeTLTsr -DncKjvbdiZuGLpnG -DoCkKvbdWRnYBdkc -DncLKvbduCbtvvOo -DnbkKvbdGGKRnIsq -EOcLKvbdVTmUFkuj -EOcKjvbdFkEsDHlu -DoDKjvbdQwNcbkgc -DncLKvbdWRmwbFLc -DnbjjvbdHlBzmwRL -EPDKjvbdDncKjwCd -EObkKvbdGBPRYizm -EOcKjvbdqrVLNjaN -EObjjvbdqFceUVaI -DoCkKvbdZQmFImFR -EPDLKvbdmIctRVSB -EObkKvbdjAQHBPfj -EObjjvbdrEFIonWB -DnbjjvbdsPuoKCuf -DoDKjvbdtbbuXWPP -EPDLKvbdOStWGduQ -DoCkKvbdUQqPUuIN -EPDLKvbdwyhFewdr -EObkKvbdShyiqAAl -EPDLKvbdGZUuBEXb -EPCkKvbdHffyyXwg -EObjjvbdGBOpyJzm -EObkKvbdZirgpGaf -EObkKvbdRjxfUfkT -EPDKjvbdZHWdAPSi -DnbjjvbdVrOYBdkc -DoCjjvbdGGKSNhsq -EOcKjvbdJqZeOenF -EOcLKvbddBsNSAUN -DncKjvbdZtJJYcsO -EPDKjvbdBraDTevr -DoCkKvbdRDcApQdS -EObjjvbdGGJrNiTq -DoCjjvbdGLFTCgmV -DoCjjvbdtlXwBUAw -DncLKvbdQwNdClHc -DoDLKvbdygYlAMeX -EPDLKvbdTvMQKTaR -EPCjjvbdiMFDnVDZ -DoCjjvbdiBoDFXRR -EObkKvbdUQqOuUgm -EOcKjvbdaMkBsVNH -EObkKvbdwuNEqZMO -EObjjvbdLAkGlbXq -EObkKvbdkCkkQgUg -DncLKvbdVqnYCFLc -EPCkKvbdxVMeRZLn -DncLKvbdRXOEClHc -EObjjvbdvwMAvBWV -EObjjvbdIwsahLpp -EObjjvbdKDKCpicY -DoDKjvbdlrZUzTEJ -EOcLKvbdyYIjBpZk -DncLKvbdxsNhlqag -EPDKjvbdgPazvdXh -EPDLKvbdbKlGPNcA -DoCjjvbdqUUHSRjt -DnbkKvbdNeDsiJKd -DnbjjvbdqGEFTvAh -DoDKjvbdnUtykKRf -EPDKjvbdZtJJZDrn -DoCjjvbdmRxtysEJ -EOcKjvbdQmXbYnUz -EPDKjvbdjmCLzFGo -DncKjvbdsBfMkfkZ -EPCkKvbdFVxpPlie -DnbkKvbdZLrEUOMN -DoCkKvbdEOcKkXDE -EObkKvbdvBEYsPEh -EPDKjvbdcJMjLGXY -EOcLKvbdOYPVzcnU -DnbkKvbdsQWOjDWG -EOcLKvbdfHjvRnRH -DoDLKvbdmbKXYPOV -DncKjvbdrpWPJcVf -EOcKjvbdURROuUgm -DnbkKvbdrovOicWG -EObjjvbdLYpirzuG -DnbjjvbdGQASvgGZ -DnbkKvbdYzcFqjVy -DncKjvbdBsBCtFvr -DoDLKvbdYgXEAOri -EOcLKvbdqTsfqqjt -DncKjvbdPIAYZAYa -EOcLKvbdypnliJwA -DnbkKvbdhyuGLqNf -EOcLKvbdjhGkfGOL -DncKjvbdjblLRGuH -EPCjjvbdxwhibPyk -EOcKjvbdBhkCLIfK -DnbjjvbdJTZArlxM -DoCkKvbdRjxetgKs -EObkKvbdiUyeWrVC -EOcKjvbdwXLaWAuu -EPDLKvbdssSTZZdc -EObkKvbdcSbjtDia -DncKjvbdgGMZnHHA -DoCkKvbdatafwkUI -DncLKvbdnCKWxPNu -EObjjvbdyOShXrhc -EPCjjvbdpyPHfqEY -DoDKjvbdbUbGxKsh -EOcKjvbdypoNJKXA -EObkKvbdyTOJMrBg -DoDLKvbdiZtfLpmf -EPCkKvbdLGFgbBQu -EOcLKvbdCJLBkJFj -DnbkKvbdUxgszLPO -DoDKjvbdUQqPVVHm -EPCjjvbdijGIKNYS -EPDKjvbdCJKajhej -EPDLKvbduoTzqLPU -DnbjjvbdJTZBTMwl -EOcLKvbdLAjfmBwq -DoDLKvbdQwOECkhD -DoCjjvbdQYmAHTSK -DoDKjvbdEuyQQMjF -DoDKjvbdZdwfzhIb -EOcKjvbdyTOJNRag -DoDLKvbdbBVdfQPw -DoCkKvbdbVBfxLUI -DncKjvbdcIljKevx -EOcLKvbdhgKDZViu -EObjjvbdOTUWHEtp -DncKjvbdZRMeIldq -DnbjjvbdkHgMGGNk -EOcLKvbdZMSETmlN -EPCkKvbdjcMKpfuH -EPDLKvbdiBncFXQq -EObjjvbdJcKCqKDY -DoDKjvbdQwOEClID -EPCkKvbdRpUHJecw -DoDKjvbdZjSgogBf -DoCkKvbdEObkKvbd -DoDLKvbdDwwktUTl -DoCkKvbdSKyGVHKs -DnbkKvbdZMSETnMN -DncLKvbdiZuGLpmf -EObjjvbdjcLjpgVH -EOcLKvbdYzcFqjVy -EPCjjvbdQvnDcLhD -DoCkKvbdDihJvYKA -EPDLKvbdJqZeOenF -EOcKjvbdWXJXvDdg -DoCjjvbdznpQeCkx -EPCjjvbdjJehJmXr -DoDKjvbdmSYuZsDi -DoDKjvbdFVyPolie -DnbjjvbdULvPAvOi -DncKjvbdwzIGFwdr -DnbkKvbdOEcsiJKd -EPCkKvbdEJhJuwjA -EObkKvbdYSkaNUOx -EObkKvbddoFSkTtS -DoDLKvbdFkFTDHlu -DoCjjvbddwzTtRez -EOcLKvbdDwwlUTtM -DoDKjvbdHDjvJaij -EObkKvbdyTOIlrBg -EOcLKvbdtSqsYzFD -EObkKvbduVmwjQsA -EPDKjvbdbiMjKfXY -DncLKvbdsQWPKDWG -DncLKvbdRbEElIyL -DnbjjvbdGKeTDHlu -EPCkKvbdrpWOjDWG -EObjjvbdVwJYWEFH -EPCjjvbdvBDySoFI -EPCkKvbdZMSDsmkm -EObkKvbdqYnhHREY -EObjjvbdyqPMiJwA -DncLKvbdCTBCtGXS -EPCkKvbdfekynGgA -EPCkKvbdvvkaWBVu -DoCjjvbdGZUuAdYC -DoDKjvbdpyOgfqDx -EPCjjvbdePFTKstS -EOcLKvbdVviXudFH -EPCkKvbddZyQYZQb -DnbkKvbdUaCQrqRy -EPDLKvbdQwNdDMID -DncKjvbdUaCRTQrZ -DnbjjvbdHDkWJbKK -EOcKjvbdOTTvGduQ -DnbjjvbdssRrxzEc -EObjjvbdezuxdiTw -EOcLKvbdGLFTCgmV -EPDLKvbdUxgtZkOn -EOcLKvbdbrbjscia -DnbjjvbdjJfHimXr -EOcKjvbdjcMLQgUg -DoDKjvbdlYrqrxft -EPDKjvbdGYttaEXb -EOcLKvbdhbPDEwQq -EOcKjvbdvAcxroEh -DoDKjvbdVgxVxHYz -DoCkKvbdTqQnuVIN -DoCjjvbdrXQMCiZR -EOcKjvbdMSWlytpz -DoCjjvbdBiLCLJFj -EObkKvbdUyHtZkPO -DoDLKvbdGcjujCJj -EPCjjvbdfkGzbfAE -DoCjjvbdDoCjjwDE -DnbkKvbdqGDdsvAh -DoDLKvbdjvXNdBww -EOcKjvbdANHySvyx -DoCjjvbdeJjRvUzn -DncKjvbdqUTgRqkU -DncLKvbdEvZQPljF -DnbjjvbdSPsgKFdX -EOcKjvbdGLFScHmV -EPCjjvbdqUTgRqkU -EPCkKvbdNxOuzdOU -DoCkKvbdpfEEtWBI -EOcLKvbdDwwlTtTl -EPCjjvbdSZjITDWA -DncKjvbdQwNcblID -DnbjjvbdijGIKMwr -DnbjjvbdYpldiMdq -DncLKvbdemGXHNKL -EPCkKvbdEKHjWYKA -DoDLKvbdwXMBWAvV -DnbjjvbdQwOEClHc -DnbkKvbdbUbHYKtI -DncLKvbdCSaCtFvr -DncLKvbdEuyPpNJe -EPDKjvbdFVyPolie -DncKjvbddneSkTtS -EOcKjvbdZtJIxcsO -EOcKjvbdiGicZWJu -DncLKvbdOFDtIiLE -DoDLKvbdOSsufduQ -DnbkKvbdMfcPmQVL -EObjjvbdiUzEwSVC -DoCkKvbdCIkBkJFj -DncLKvbdYkrETmlN -EObjjvbdqZOggREY -EPCkKvbdHDkViajK -DnbkKvbdbsDLTdKB -EPDLKvbdlqxtzTDi -DncKjvbdLGFgbAqV -EObjjvbdoAKztHcn -EPDLKvbdRXODblID -DoCjjvbdIHGzYwxH -EObkKvbdNPwqVnHT -EOcKjvbdxrnImRag -EOcLKvbdiLddNuCy -DoCkKvbdkMakzEfo -EObkKvbdnPyxukYb -EPCjjvbdZdwfzgiC -EPCkKvbdnHEwmNfy -EObjjvbdySmiNRag -EOcKjvbdzeZnzdyp -EPCjjvbdJvVFdEgJ -EOcKjvbdZQldiMeR -EOcKjvbdFyVVAdYC -DncKjvbdJXsahMRQ -DnbjjvbdfNGXGljL -EOcLKvbdwWlAvAvV -DncLKvbdkIHLefNk -DncLKvbdliDtQtrB -DoCkKvbdxZgefXdr -DncKjvbdCWzchdpW -EPCkKvbdpyPHfpdY -EOcKjvbdhbOcFWqR -DnbjjvbdzjUpPdSt -DoDLKvbdZMRdUOLm -DncLKvbdVwJXucdg -EPCjjvbdWXIxVcdg -DnbkKvbdMpXpvOHT -DncLKvbdRkZGVHKs -DoDKjvbdmpZyWKxb -DoCjjvbdegkWRmpg -DncLKvbdyzeOSHhh -EPDLKvbdRECaPpdS -EPDKjvbdqvpLcJZR -DoCjjvbdRDbaPqDr -EObjjvbdRECaPqDr -EOcLKvbdsBfNLgLZ -DncKjvbdZyEKOCkr -DnbkKvbdSPsgJfEX -EPDKjvbdZRMdiMeR -EPDLKvbdDwwktTsl -EPDLKvbdLhbLpxAS -EPDKjvbdZirgpHBf -DoCkKvbdmtuZkJqf -DnbjjvbdwWkaWAuu -DnbjjvbdRDcBPqES -DnbkKvbdyzeNqgiI -EObjjvbdYkrEUOLm -DoCkKvbdmtuZkKRf -DoCkKvbdNdctIhkE -DnbjjvbdhytfLqOG -EOcLKvbddZyPwxpb -EPCjjvbdYzbeqivZ -EOcKjvbdwygfGXeS -EOcLKvbdRosfifEX -EPCkKvbdznopdbkx -EObkKvbdVBBqSqSZ -EObjjvbdQlxCZNtz -EPCkKvbdhlFDmtby -DoDLKvbdCDpAvJmG -EPDKjvbddeOrCXDK -EOcLKvbdrovOjDWG -DnbkKvbdIGfyyYYH -EObkKvbdmbKWwnmu -EOcLKvbdkDLjqGuH -EPDLKvbdqrUkNjaN -EPDKjvbduDDVXWPP -EObjjvbdZnnJFEzK -DnbjjvbdaRfCgtGL -DoCkKvbdGKdsDHlu -DncKjvbdqlyiyMHi -DoDLKvbdSLYetgLT -DnbkKvbdZQleJNEq -EOcLKvbdZLrETnMN -DnbjjvbdiUydwRuC -EObjjvbdnPzYvLYb -EPCjjvbdGYuUaEYC -EObjjvbdACqwiyiQ -DncKjvbdIHGzZYXg -DncKjvbdxrnIlqag -DnbjjvbdySmhlqag -DoCjjvbdSCEFMJZL -EObjjvbdSKxfUfjs -DnbjjvbdnUtyjjRf -DncLKvbdkyTRsZGt -DoDLKvbdWRnXbElD -EOcKjvbdjvXNcbYX -EOcKjvbddjKSWUzn -DoDKjvbdvBDxrneI -EOcLKvbddndsKtTr -DoDLKvbdZjTHpGbG -DnbkKvbdpfDdsuaI -EPCkKvbdfMfWgNJk -DoCkKvbdjJegjNXr -DoDKjvbdcTDLTdKB -EPDLKvbdwzHfFxEr -DncKjvbdfMfWgMik -DnbkKvbdrbFllGkZ -EPCkKvbdCIkCLJGK -EObjjvbduDDUvvOo -EOcKjvbdDxYMUTsl -EOcLKvbdsPvOibuf -DncKjvbdUsltGLvK -EPCjjvbdyOShYTIc -DoDKjvbduaEZSoEh -DncKjvbdLrXMzUpz -DoCkKvbdNsTufeUp -EObkKvbdLGGIBaQu -EPCjjvbdmSZVZsEJ -DncLKvbdQdDAoqDr -DoCkKvbdKCicRJbx -EPCkKvbdxwhibQZk -DoDKjvbdTvMQJsaR -DoCkKvbdYzcGSJuy -DnbkKvbdwyhGFwdr -DoCjjvbdEOcLKwDE -DoCkKvbdGGKRmhtR -EOcLKvbdrzMQTAgn -DoDLKvbdJvVFceHJ -DnbkKvbdfMfWfmJk -EPCkKvbdmajWwnmu -EPCjjvbdxrmiMqag -EOcKjvbdqUTfqqkU -EObkKvbdoAKztHcn -EObkKvbdkyTSTZHU -EPCjjvbdiCOcEwRR -DnbkKvbdGZUtaDwb -EPCjjvbdYORAXuWU -DoCkKvbdULvPAuoJ -DnbjjvbdcSbjscjB -DoDKjvbdLrXMytpz -DncKjvbdIryBTNYM -DoCjjvbdZyDinCkr -EPDLKvbdZoOJFEyj -DncLKvbdajkfOmcA -EPDLKvbdRNYCYmtz -DoCkKvbddePRawDK -EOcKjvbdbUbHYKtI -EPCjjvbdbrbjscjB -EPDKjvbdKDJcRKCx -EObjjvbdqcdiQOVa -EPDKjvbdZjTIPgBf -DnbjjvbdrSUjmjaN -DnbjjvbdEXxLsstM -EPCkKvbdFjeSbglu -DnbkKvbdLqwMytpz -DoDKjvbdUGznMXVe -EObkKvbdpstHRrLU -DoDKjvbdYTLaNUPY -DnbkKvbdGKdrbhNV -EObjjvbdRMxCZNtz -DncLKvbdDihJuwjA -EPCjjvbdOFDtJIkE -DnbkKvbdliEUQuSB -DoDKjvbdkCkkQftg -EPCkKvbdGZVVAcwb -EObjjvbdkyTSSxgU -EPDKjvbdIryBSlxM -EOcKjvbdWIXvXfxz -DoDLKvbdhfjCyWKV -DoDKjvbdNQXpumfs -DncKjvbdiMEcnVCy -EPDLKvbdxVMeRZLn -EPCkKvbdDoDKjwDE -DnbkKvbdSCEFLiZL -DoCjjvbdqYoHgQcx -EObjjvbdxZhFexFS -EOcLKvbdkDMLRGuH -EPCkKvbdVwJXvDdg -DoCjjvbdjhHLefOL -EOcLKvbdiCOcFWpq -DnbjjvbdrovOjCvG -DncLKvbdRzKHsCvA -EPCkKvbdDoDLKwDE -EOcKjvbdrNZjZLhJ -EObjjvbdTAFIhBoE -DncKjvbdlqyVZsDi -DncLKvbdjggMFenL -EPDLKvbdUsltGMWK -DoCjjvbdkyTRsZGt -EOcLKvbdrzMPsBHn -EPCkKvbddZxpYYpb -DncLKvbdGKdsCgmV -DnbkKvbdvAdYsPEh -DoDLKvbdqUUGrSKt -EPCjjvbdxnTHxTIc -EOcKjvbdZisIQGaf -DncLKvbdBhjbLJFj -DoCkKvbdJSyBTNYM -DnbjjvbdmfdwlmgZ -EOcLKvbdJcJcRJbx -DncLKvbdmoyyWLYb -EObjjvbdSKxfUfkT -EObjjvbdlAlnmALA -DoDLKvbdTlVnaVoJ -EOcKjvbdnCKWwnnV -EPCjjvbdjbkkRGtg -EPCjjvbdULuoBVoJ -EPDKjvbdwMvAMceN -DnbkKvbdznopdcLx -EPCkKvbdeuzwoizs -EPCjjvbdpssfrRjt -EOcKjvbdiGibyWJu -DnbkKvbdYSlBNToY -EPDKjvbdkVwNcbYX -DoCjjvbdsPuoJcVf -DnbkKvbdrbGNLgLZ -DnbkKvbdRbEFMJYk -EObjjvbdqceIonVa -DnbkKvbdTpqPUuHm -EOcLKvbdVviXvEEg -EOcLKvbdvAcxrndh -DnbjjvbdTYKkmzkY -EOcLKvbduDCuXVno -EPCkKvbdEvYpPlie -DncLKvbdaSGCgtFk -DoCjjvbdpfDdtWBI -DncLKvbdHDkWJbJj -DncLKvbdqZOgfpdY -EPCkKvbdFxuVBEXb -DoDKjvbdnBivwnnV -EPCkKvbdRWmcbkhD -EObjjvbdfIKvSOQg -DnbkKvbdcIlikGWx -EOcKjvbdQdDBQQdS -EPCjjvbdnPzZWKyC -DnbkKvbdZxcimbkr -DncLKvbdLFfHaaRV -DoCjjvbdYSlBNToY -DnbjjvbdKCicRKDY -EPCkKvbddneSjtUS -EObjjvbdmIctRUqa -DncKjvbdYqMdiNFR -DnbjjvbduaDyTPFI -EPCkKvbdePEsLTtS -EPCkKvbdbUagYKsh -DoDLKvbdssSSxzFD -EObkKvbdMuSrLNAX -EPDLKvbdddnqbWbj -DnbkKvbdvAcySneI -EPDKjvbdatbGxLUI -EOcLKvbddePRbWbj -DoDLKvbdijGIKNYS -EPCjjvbdNrsugEtp -EOcLKvbdxZhGGYEr -DnbkKvbdTkvPAvPJ -DoCjjvbdFyUuAcwb -DnbjjvbdJTZBTMxM -EPDLKvbdaMkCStmH -EPDLKvbdjKGHimYS -DnbkKvbdelewGlik -EObjjvbdkHgMGGOL -EObkKvbdURRPUuHm -EOcLKvbdjKFhKNYS -EPDLKvbdhyuFkpnG -EOcLKvbdRosgJecw -DoCjjvbdczYoxYqC -DncLKvbdzaAPGgCM -EPDKjvbdiUzEwSUb -DoCjjvbdKQzEneme -EObjjvbdatagXkTh -DoCjjvbdwtldqYkn -EOcKjvbdUxgszLOn -EPCkKvbdUaBprprZ -EOcLKvbdYNqAYVVt -EObjjvbdbUafwkTh -EPDLKvbdcIljLGWx -DnbjjvbdNHDPlotk -EOcLKvbdkIHMFfOL -EPDKjvbddePSCXDK -EOcLKvbdbUafxLTh -DoDKjvbdQlwaxmtz -DoCkKvbdbQHHELzd -EPDLKvbdhficZWKV -DoDKjvbdqrVLOLAm -DoCjjvbduDDUvvPP -EPCjjvbdCEQAuilf -EOcLKvbdEASIlywX -DncLKvbdRNXayNtz -EOcKjvbdVrOXaeMD -EPCjjvbdFWYopNKF -DnbkKvbdSQTfjFcw -DoDLKvbdJTZAsMwl -DoCjjvbdiCPDEvpq -DncKjvbdVwIwuceH -EPDLKvbdJvVFcdfi -EPCjjvbdcbSlrATm -DnbjjvbdqBJFAXIE -EPCkKvbdTAFJHbOd -EPCjjvbdcTCkUEKB -EPCkKvbdxwhibPzL -EPCkKvbdRpTfifEX -EPDLKvbdvAdYsOeI -DncKjvbdpxngfpdY -EPCjjvbdEXwksstM -DnbkKvbdNrsufeUp -DnbkKvbdJKEAJogE -DoCkKvbdNsUWGduQ -DoCkKvbdbrcLTcjB -EOcKjvbdiHJcZViu -EObkKvbdEztQdkcJ -DoCjjvbdliETptqa -EOcLKvbdOEdUIhjd -DoCkKvbdSKxfVGkT -EPCjjvbdIsZAsMxM -EOcKjvbdZsiIyDsO -DncLKvbduDCtwWOo -DnbkKvbdEztQdlCi -DnbjjvbdLZQjSztf -DoDLKvbdXmqAXuVt -EPCjjvbdxsOJNSCH -DoDLKvbdRadElJZL -EOcLKvbdWRnXbEkc -DncKjvbdSCEFLiYk -EPDLKvbdidkHVPAO -DoCjjvbdkClKqGtg -EPDKjvbduLxXBUAw -DncLKvbdqUTfqqkU -EObjjvbdcImKKevx -DoDLKvbdMgCpMpVL -DnbjjvbdtTRsYydc -DnbkKvbdKefHbBQu -EOcKjvbduoTzpjnt -DoCjjvbdjuwNcaww -DncKjvbdTkvPBVni -EPDLKvbdapGfdLzd -EPDKjvbdvAdZTPEh -EPCkKvbdwXLaVaWV -EOcKjvbdZoNhddyj -DncKjvbdqceIonVa -DnbjjvbdIwsbHkqQ -DoDKjvbdjFKfuPAO -EOcLKvbdbhmJkFvx -DncKjvbdDxYMUUTl -DnbjjvbdMfbpNQVL -DoDLKvbdZeXfzhIb -EOcLKvbdVAbRSpqy -DncLKvbdZxcjOCkr -EOcKjvbdyTNiNSCH -EObkKvbdiLddOUcZ -DoCjjvbddwystRez -DoDKjvbdUsmTelWK -EPDLKvbdEPCjkWcE -DoDKjvbdIwsaglQp -EObkKvbdGcjvJbKK -DoCkKvbdRzJgrbvA -EObkKvbdkxsSSxft -DncLKvbdfHjvSNpg -DnbkKvbdxsNiMqag -DoDLKvbdcImKKevx -EOcLKvbdJutfDdgJ -DoDLKvbdhancEwRR -EObkKvbdnPzYvKyC -DoDKjvbdNHDPlouL -EPCkKvbdKaKgMbXq -EOcLKvbdqUTgSRkU -EPCkKvbdZjSgpHBf -DncLKvbdHffzYxXg -DoCkKvbdFkErbhMu -EObjjvbdhancEwQq -EPDKjvbdJYUCHkpp -EPDKjvbdtkwwBUAw -EOcLKvbdiZuGMRNf -EObkKvbdrJAKElne -DnbjjvbdIHHZxwwg -EPDKjvbdkHgMGGNk -DoCjjvbdeOeSjtUS -DoDLKvbdJbicQjCx -DncKjvbdnGeXlnGy -EPDKjvbdKVtecdfi -EOcKjvbdULuoBVni -DnbkKvbdmJDtRVRa -DncLKvbdJTZAsMxM -EPDKjvbdVgxVxHYz -EPCjjvbdVBCRSqSZ -EPCjjvbdJqZdnfOF -DncKjvbdqdEiQOVa -DnbkKvbdZLqdTnLm -EOcKjvbdzHZMANFX -DncKjvbdVrNxBdkc -DnbjjvbdKkAgvAKZ -DnbjjvbdmbKWxOnV -DoDKjvbdYqMeImEq -EObjjvbdbUagYKtI -DncKjvbdQZNAHSqj -DoDLKvbdfoazvcwh -DnbkKvbdVvhwvDdg -DoDKjvbdURQoUthN -EPDLKvbdvBDyTOeI -DnbjjvbdrRuKmkBN -DnbkKvbdRbDdlIxk -EObjjvbdSCDdkhyL -DoDKjvbdSBceMJYk -DoDLKvbdwyhGGYFS -EPDKjvbdQvmcblID -DoDLKvbdaaWFGQQX -DoDKjvbdEASImZvw -EPDLKvbdnQZyWLYb -EPDKjvbdbrcLUEJa -EOcLKvbdKCicQjDY -EPCjjvbdVBCQsQqy -EPCkKvbdkaNPNALA -DncLKvbdaNKartmH -DoDLKvbdCTAbtFvr -EObjjvbddZxowxpb -EObkKvbdTpqOuUgm -DncLKvbdZQleJNFR -DnbjjvbdUVlPisaR -EObjjvbdBsBCtFvr -EPCjjvbdJutecdgJ -EOcKjvbdfNFvgNKL -DncKjvbddneSjtUS -DoDKjvbdjcMKqGtg -EOcLKvbdGdLWKCKK -EOcKjvbdRDcBPpdS -DoCkKvbdauCGwkTh -EPCjjvbdaNLCStmH -EOcKjvbdelfWgMjL -DoDLKvbdtSrSxyeD -EPCjjvbdemGXGmKL -EOcLKvbduDCuXWOo -DncKjvbdauBfxLUI -DnbjjvbdIHGyyXwg -EPCjjvbdEvYooljF -EObjjvbddneTLUTr -DoCjjvbdySmiNRag -DoDKjvbdqUUHSRjt -EObjjvbdczYpXxpb -EObkKvbdaMkBrtlg -EPDLKvbdnUuZkKRf -DoDKjvbdcScKsdJa -EPCjjvbdsrrTYydc -EObjjvbdZoNiFEyj -EPDLKvbdmttyjirG -EOcLKvbdYqMeIleR -DoDKjvbdKWUfEFGi -EOcLKvbdcyxoxYqC -EObkKvbdNeETiJLE -EPCkKvbdUMWOaVoJ -EPCjjvbdWSOXbElD -EPCkKvbdNHCpNPuL -EObkKvbdEuyQQNJe -DoCkKvbdmgExNOGy -EOcKjvbdZtJJYcsO -EOcLKvbdMpXqVnGs -EObjjvbdbsDLTcjB -EPCjjvbddoFTLUTr -EOcLKvbdaNKbTVNH -DoCjjvbdJcKCpicY -DoDLKvbdsBfMlGjy -EPDKjvbdqiAJdlne -EObkKvbdKefHaaRV -DoDLKvbdbiNJjewY -EPCkKvbdVTltFlWK -DoDLKvbdbBWFGPpX -DncLKvbdVZITzKoO -EPCjjvbdnUtzLKSG -EPCkKvbdBraDTevr -EPDLKvbdTkunaWPJ -EObjjvbdZRNFJNEq -DnbkKvbdxUldqYkn -EPDLKvbdtvOYJpsA -EOcLKvbdJvUfEEgJ -DoDKjvbdlYrqsZGt -DncKjvbdePFSjstS -EPDLKvbdqquLOLAm -DoCkKvbdSPtHKFdX -DoCjjvbdZyDjNcMS -EPDKjvbdTlVnaWPJ -EPCjjvbdZirgpHCG -EObkKvbdNQYQvNfs -DncKjvbdqqtjnLBN -DoDKjvbdjJehJmYS -DncLKvbdrNZixlHi -EPDLKvbdMfcPlpVL -EPCjjvbdUWMQJtBR -DoCkKvbdfMfWfljL -DnbjjvbdaRfDHtFk -DncLKvbdiMFDnVDZ -DoCkKvbdXrkaNToY -DoCjjvbdZLqdUNlN -EObkKvbdRjxetfkT -EOcLKvbdmgFXmOGy -EPDKjvbdUQpntuHm -DoDKjvbdpstHRrKt -DncLKvbdHkazmwRL -EObjjvbdpfEFUWAh -DoDKjvbdZyEJnDMS -EObkKvbdiBoCeXQq -DoCkKvbdeATplxKG -DncLKvbdWRmwadkc -EPDKjvbdUQqPUthN -DoCjjvbdnBjXXnmu -EPDLKvbdZjTIPfbG -EPCkKvbdWHwuxGxz -DncKjvbdYpmFJMdq -DoDKjvbdhbPDFXRR -DnbkKvbdBdQBVimG -DoCjjvbdmIctRUqa -EPDKjvbdZyDjNbkr -EOcLKvbdQYmAHSrK -DnbjjvbdqYoHgQcx -DncKjvbdqiAKFMoF -DncKjvbdOTUWHEuQ -DoCjjvbdVTmTfLuj -DoCkKvbdddoRbWcK -EPDKjvbdIsYaTNYM -EObkKvbdRosfiedX -EOcKjvbdcTDLUEKB -EOcLKvbdmozYujxb -DnbjjvbdZirgogBf -EPCjjvbdKWUeceHJ -DnbjjvbdZoOJEdzK -EPDKjvbdEJhKVwjA -DoCkKvbdfpBzvcxI -DoDKjvbdlrYtysDi -DoDLKvbdZjSgofbG -DoCjjvbdUtMtGMVj -EPCjjvbdGGKRmiTq -EPCkKvbdQvnDcMID -DnbkKvbdKCjCqJbx -EPCkKvbdYpleImEq -DoDLKvbdjKFgjNXr -DoDLKvbdZshhxcrn -EPDLKvbdnVVZjjRf -EOcKjvbdqdFIpNua -DnbjjvbdVwIxVdEg -DoCkKvbduaEZSneI -DnbkKvbdznoqFClY -DoCjjvbdoAKzsgcn -EOcKjvbdSLZGVGkT -DncKjvbdiCObeWqR -EPCjjvbdWRnXbEkc -EObjjvbdRotGiecw -EObkKvbdKDKDQibx -DnbjjvbdlYsRsYft -EOcKjvbdUaBqSprZ -DoCjjvbdhkdcmuDZ -EOcKjvbdjgflFfNk -DoCjjvbdGKdrcINV -EOcLKvbdEJgjVxKA -EObkKvbdSxKkmzkY -DnbjjvbdsZkosBIO -DoCjjvbdBvzchePv -EObkKvbdGYtuBEXb -EPDKjvbdiLeENtby -EPCkKvbdRNXbYnUz -EObjjvbdfHkWRnQg -EObkKvbduDDVXWOo -DoCkKvbdJbjCqJbx -EPDLKvbdpedFTvBI -DncLKvbdjJegjMwr -EPCjjvbdUxgszLPO -EObkKvbdxmrhXsJD -EOcKjvbdJSxaSmXl -EPDLKvbdfNFwGmJk -EPDKjvbdsrrTYydc -DncKjvbdhgKDZVjV -EPCkKvbdZMRctNkm -DoDKjvbdezuyEhtX -EPCkKvbdEXwlUTsl -EPDLKvbdeAUQlxKG -DoDKjvbdZnmiEdyj -EObkKvbdrzMPraIO -EPCjjvbdxxIibPyk -EPCkKvbdKfFgbBRV -DoDKjvbdyzeORhIh -DnbkKvbdbAvFGPpX -DncKjvbdZoOJEdyj -DnbkKvbdrJAJdmOe -DoDKjvbdKVuFdEfi -EOcKjvbdqdFJQNvB -EPDLKvbdOEctIhkE -EPDLKvbdvBEYsOeI -DncKjvbdHELVjBjK -DncLKvbdZshhyDsO -EPDKjvbdGdKuibJj -DoCkKvbdEYXkstUM -DnbjjvbdJpyeOfNe -EPDKjvbdzoPpdbkx -DoCkKvbdMSXMytpz -DncLKvbdqZOggQcx -DoDKjvbdmuUyjirG -DnbkKvbdNVSqkNAX -DncLKvbdRotHJfEX -EOcKjvbdZyEJnCkr -EPDLKvbdyYJKBpZk -DnbkKvbdxmrgxTJD -DnbkKvbdhaoDFWqR -DncKjvbdbhmJjevx -EObjjvbdSKyGVGjs -DnbjjvbdSKxfVHKs -DnbjjvbdqdFIomua -DnbkKvbdkHflGGOL -DoDLKvbdqGDeUVaI -EObjjvbdjmBlZeHP -EPCkKvbdmttykJrG -DncLKvbdRXOEDLgc -DoDLKvbdhaoDFWqR -DoDKjvbdvvkaWAuu -DoCkKvbdbhmKKfWx -EObjjvbdSBdFMJZL -DnbjjvbdnUuZjjSG -EPDLKvbdliDtQuSB -EOcLKvbdsCFmMGjy -DnbjjvbdtunXjQsA -EObkKvbdkCkjqHUg -EObjjvbdDoCkKvbd -DnbkKvbdiZuFlROG -EOcKjvbdRNYCZNtz -EOcLKvbdxUmEpxlO -EPCkKvbddePSBwDK -EOcLKvbdauBfxKsh -DoCjjvbdtkwwBTaX -EObjjvbdmgEwmNfy -DnbjjvbdOStWHEuQ -EPCkKvbdGLFTChNV -EPCkKvbdKDJbpjDY -DoDLKvbdnPzZVjxb -DoCjjvbdFVyPomJe -DncLKvbdACqwizIp -EPCkKvbdZirhQGaf -DncKjvbdtTRsZZeD -EObkKvbdLBLHMbYR -EOcLKvbdrNZjZLgi -EObjjvbdTXkLmzkY -EPCkKvbdBsAbsfXS -EOcKjvbdeATpmXif -DoCkKvbdMSWmZuQz -DncLKvbdVTmTfMVj -DoDLKvbdZxdKODMS -EPDKjvbdZjShPgCG -EPDLKvbdxVMdpxkn -EPDLKvbdcSbjsdKB -EPDLKvbdiifIJlwr -DoDKjvbdKQydoFnF -EObkKvbdegkWRmpg -EObkKvbdiBncFXQq -DoDLKvbdNdctJJLE -EOcKjvbdUyHszKnn -EOcLKvbdSQUHKFcw -EObkKvbdUaBqSprZ -DoCkKvbdSCDeLiZL -EPCkKvbdKDKCpjCx -EPDLKvbdwygfFweS -DoDKjvbdiVZeWqtb -DoCjjvbdMRwMyuQz -DoCjjvbdsCGNLfkZ -DoCkKvbdmRxuZsEJ -EPCkKvbdkDMLRGtg -EObkKvbdGdKuibJj -EPCkKvbdePFTLUTr -EOcKjvbdXrlAlsoY -DoDLKvbdZjTHogBf -DnbjjvbdZirhQGaf -EPCkKvbdFVxooljF -DoCkKvbdbKkeoNcA -DoDKjvbdqYngfqEY -EPDLKvbdrWokcJYq -DoCkKvbdMowqVnHT -EPCkKvbdqqtjnKaN -DoDLKvbdiCPDFWqR -DoDLKvbdeJiqutzn -EObkKvbdqcdiPmvB -EPCjjvbdMgComQUk -DoDLKvbduVnYKQsA -DnbjjvbdjhHLfFmk -EOcKjvbdVvhwvEEg -DnbkKvbdZtIhyESn -DncLKvbdznopeClY -EPCkKvbdwtldqZLn -EOcKjvbdeEnrBwDK -DoCkKvbdkxrqsZHU -DoDKjvbdijGHimYS -DncLKvbdfNGWgMjL -EOcKjvbdmbKWxOnV -EPCkKvbdhtzEvrVC -DoDLKvbdhfibyWJu -DoCkKvbdXrkaMsoY -DoCkKvbdzoPpdbkx -EPDLKvbdSLYeuGjs -EOcLKvbdqlyixlIJ -EObjjvbdnVVZjiqf -EOcLKvbdyNrhXriD -DoCjjvbdRjyFtgLT -EOcLKvbdkyTRryHU -EPCjjvbdrykpTBIO -EObjjvbdlqxtzSdJ -EObjjvbdcarmSATm -EOcKjvbdXsLaNToY -EOcKjvbdlqxtysDi -EOcLKvbdaMkCStmH -DncKjvbdbAvFGPow -EPDLKvbdTulQKTaR -DncKjvbdXGYzUAOs -DncKjvbdezuxeItX -DnbkKvbdrykpTBIO -DoCkKvbdxnShXsIc -DoDLKvbdEPCjkXCd -DnbkKvbdIxUBgkpp -DnbkKvbdBiKbKhfK -DoDKjvbdKNADygVB -EObjjvbdADRxKZiQ -EPCjjvbdMfcQMotk -EObjjvbdSBcdkhxk -EPDKjvbdNrtVgFVQ -EPDKjvbdZMRdTnLm -EObkKvbdehKvRnQg -DoCkKvbdliETptqa -DoDLKvbdEXwktUUM -EObjjvbdBiLBjiFj -EOcLKvbdRkYeuGjs -EOcKjvbdmttzKjRf -EObkKvbdxrmhmRbH -DnbkKvbdyXiJaoyk -EObkKvbdxmrgwsIc -DoDLKvbdiZtfMQmf -DnbkKvbdpxoHfpcx -EObjjvbduaEZTOdh -EObkKvbdqqtkNkAm -DoDKjvbdxmrgxTIc -DncLKvbdMgColpVL -EPCkKvbdZnnJEeZj -EPCjjvbdVYgszKoO -EPCkKvbdBcpAuilf -EObkKvbdlhdUQuSB -EObkKvbdMIbLpxAS -EPCjjvbdnVUyjirG -DoDKjvbdKRZeOenF -DnbjjvbduCbuXWPP -DnbjjvbdssRsYydc -EPCkKvbdlhctQtqa -DoCkKvbdsQVoJcVf -EObjjvbdegkWSNpg -DoDLKvbdOAJTUKSA -DoDLKvbdliEURVSB -DoDKjvbdxsNhlqbH -DnbjjvbdOSsvGdtp -EPDKjvbdaaVeGPow -EObjjvbdNeETiIjd -DnbkKvbdJKEAJpHE -EPCjjvbdANIYsWzY -DoCjjvbdjvWmdCXw -EPDKjvbdrouoJcVf -DnbjjvbdiUzFWquC -DnbjjvbdFxtuBEYC -DnbjjvbdRkYfVHLT -EObjjvbdQwNccMID -DoCjjvbdXsMAmTnx -DoCjjvbdjJfIKMxS -EOcLKvbdbiMikGXY -DoCjjvbdQdDAoqES -EPCkKvbdVwIxVcdg -EOcLKvbdCEQAvKMf -EPDLKvbdzROmJKXA -EPDLKvbdZLrDsnLm -DncKjvbdjggMGFmk -DnbkKvbdddnrBvcK -DnbjjvbdpecdsvBI -EPCkKvbdijFgjNYS -EOcLKvbdUaBqTQqy -DncKjvbdkHgMFfNk -EObkKvbdZGvdAPSi -DnbjjvbdqUTgSRjt -DoDLKvbdqvpLcIyR -DncLKvbdLqvlytpz -DnbkKvbdKDJbpjCx -DoCjjvbdlqyUyrci -DnbkKvbdUQqPUuIN -EObkKvbdTlVnaVni -EOcLKvbdNdcshiLE -EObkKvbdkDMLRHUg -DncKjvbdIxTbILpp -EPCkKvbdePFTKssr -DnbjjvbddeOrCWcK -DnbkKvbdatbGxLTh -EObkKvbdqlzKZLgi -EPCjjvbdOTUVgFUp -EOcLKvbdpfEFTvAh -DncLKvbdZnnIdeZj -EObkKvbdZxdKODLr -DoDKjvbdjggLfGNk -EPCjjvbdRDcAopdS -DncKjvbdlZTRryHU -DncKjvbdZshiYdSn -EPDKjvbdatbHYLTh -EPDKjvbdLAjfmCXq -EPDKjvbdOFEUIiLE -DncKjvbdxVNFQxlO -DoCjjvbdrafNLfkZ -DoCjjvbdGFiqnJTq -EPCkKvbdUsmUFlWK -EObkKvbdLBLHMbXq -EPCkKvbdtlYWaUBX -EPCjjvbdSPsfjGEX -EObjjvbdIjEAJogE -DoDLKvbdNHCpNQUk -DncLKvbdYkqdUNkm -DoCjjvbdqquKmkBN -DnbjjvbdEuyQQMjF -EOcKjvbdURRPUthN -EObjjvbdmoyxvLYb -EObkKvbdGYtuAdYC -DnbjjvbdZeYGzhJC -DoDLKvbdCgLfHAzc -DoDLKvbdhuZeXSUb -DoCkKvbdjlbMZdgP -DoCkKvbdemGWgMjL -EPCkKvbdxxJJaoyk -EPDLKvbdqGEEsuaI -EObkKvbdEKHjVwjA -EOcKjvbdiBoDFWpq -EPCkKvbdffLzNfgA -EObjjvbdDoCjkXDE -EPDKjvbdhficZWJu -DoCjjvbdWWiYVdFH -EPCkKvbdKQzFOenF -DoCkKvbdmbJvxPOV -DnbkKvbdtAHQhAAr -EPDLKvbdmSYtzSci -EPDLKvbddeOqavcK -DoCjjvbdCEQBVjMf -EPDLKvbdlYrqsYft -DnbkKvbdJSyBTNXl -EPCjjvbdcbSmSATm -DoDKjvbdfNFwGmJk -DoCkKvbdGLErbhNV -EObkKvbdiZuFlQnG -DnbjjvbdxUmEpxlO -EPDKjvbdUWMPitBR -EPDKjvbdrafNLfjy -EPDLKvbdrWolDJZR -EObjjvbdhbPDFXQq -DncLKvbdqrUkNjaN -DnbkKvbdBiLCKhej -DoDKjvbdSCEFMIxk -DoDLKvbdffLzNgHA -EPCkKvbdZLqcsmkm -DnbkKvbdZMSEUOMN -DnbjjvbdzaAPHHCM -DnbjjvbdCIkBjhfK -DoCkKvbdZirgpHBf -DnbjjvbdIwtBhLpp -EObkKvbdeOeTLUTr -EObkKvbdUxgszLPO -EObkKvbdhzVGLqOG -DnbjjvbdOTTufdtp -EOcKjvbdZRNEhleR -EPCjjvbdKyRKSzuG -DoCkKvbdZtJJYcsO -EOcLKvbdemGXGmKL -EPDKjvbdJXsahMQp -DoDLKvbdhbObeWqR -EObjjvbdFVxpPljF -EOcKjvbdaNLBruMg -DoCjjvbdpyPIGpcx -EOcLKvbdZMRcsmkm -EOcLKvbdnGeXmNgZ -DoDLKvbdjlalZeGo -DoDLKvbdaSGDHtGL -EPCkKvbdCTAbsewS -EPCjjvbdZjSgofbG -DnbjjvbdJutecdfi -EPCkKvbdIryBSmYM -DoCjjvbdfekzOHHA -DnbkKvbdREDAoqES -EPCjjvbdtTSTYzEc -EPCkKvbdmoyyVkYb -EObkKvbdmfdxMnGy -DoCkKvbdwuNFQxkn -DncKjvbdsBelkfjy -EPDLKvbdQvmdDLhD -EPDKjvbdBhkCLJFj -DoCkKvbdeJiqutzn -EOcLKvbdqTsfrSKt -DoDLKvbdakLfOmcA -DncKjvbdKaLHMawq -EPCkKvbdznopdcMY -DoDKjvbdZtJIyDsO -DoDLKvbdsQVnjCvG -DncKjvbduDDUvuno -DoCkKvbdJYUCHlQp -DnbkKvbdnBiwYPNu -EObjjvbdlYrqryHU -EPCjjvbdqcdiPnWB -DoCjjvbdUQpoUthN -EPDKjvbdsZlQTAhO -EOcKjvbdtbbtwWOo -EPDLKvbdJuuGDdgJ -EOcKjvbdjggMGGOL -EPDLKvbdHffyxwxH -EOcLKvbdSCEElIxk -EObkKvbdIwsbHkqQ -EPDLKvbdjbkjqHUg -DnbjjvbdnQZxujxb -EPDKjvbddePRbWbj -DoCkKvbdhtydwRuC -DoDKjvbdCDoaWKMf -EOcKjvbdRjyGVGjs -EObjjvbddCTNSATm -EOcKjvbdZLrETmlN -EPDKjvbdlrZUysDi -EOcLKvbdwtmFRZMO -EPCjjvbdtTRrxydc -EObjjvbdeFPSBvcK -DoCkKvbdwuNFRZLn -DnbjjvbdhytfLpmf -EPCkKvbdrykpTAgn -EObkKvbdRDcApRDr -DoCjjvbdZnnIeFZj -EOcLKvbdePErkUTr -DoDLKvbdrbGNLgLZ -EObjjvbdVZIUZjoO -DncLKvbdzHYlAMeX -DnbkKvbdbsDLTcia -EPCjjvbdOSsufdtp -DncKjvbdpstHSSLU -DncKjvbduDDVWuoP -EPDKjvbdiMEdNuCy -EOcKjvbdtbcVWuno -DoDKjvbdqUTgRqjt -DncLKvbdZyDjNcLr -DoDLKvbdRWmdDLgc -DncKjvbdZLqdUOMN -DoDKjvbdijGIJlwr -EObjjvbduMYXBUAw -DoCkKvbdHDkWJajK -DoCjjvbdRpTfifEX -DoCjjvbdUyHszKnn -EPDKjvbdqZPIGpdY -EPDKjvbdRWmdCkhD -EObkKvbdsrrSyZdc -EOcKjvbdYlSDtNlN -DncKjvbdbKkennDA -EPCkKvbdiZuGMQmf -EPCkKvbdEztQeLbi -EPCkKvbdaRebgsfL -DoCkKvbdBcpAuilf -EOcKjvbdyNsIYShc -EPCjjvbdcIlijewY -DoCjjvbdmbKXXoOV -DncLKvbduDCtwWPP -EPDKjvbdnCJwXoOV -EPCjjvbdjcLkQgUg -DnbkKvbdtcCtwVno -DncKjvbdGFjRmiUR -DncLKvbdrWpLcJYq -DncLKvbdKWVGDdfi -EPCkKvbdnUuZkJrG -EPCjjvbdiCPCeWqR -DncKjvbdEYYMUUTl -EObjjvbdrpWOicWG -DoDKjvbdFejSOIsq -DnbjjvbdqiAJdmOe -EOcKjvbdUyITzKnn -DoDKjvbdfMfWgMjL -DnbkKvbdXrkaMtOx -DoCkKvbdKefIBaRV -EPCjjvbdyTNhlqbH -EPCjjvbdtlXwBUAw -EOcKjvbdRosfjFdX -DoCjjvbdYpldiMeR -DnbjjvbdwzIFexFS -DncKjvbdSCDeLhyL -DncLKvbdrzLpSaHn -DncKjvbduCcVWuoP -DoDLKvbdatagXkTh -DnbkKvbdsCGMlGkZ -EPCkKvbdkWXNdBww -DncKjvbdJcKCpjCx -EOcKjvbdNxPVzdNt -EPCkKvbdKRZeOfOF -DncLKvbdcIljLGXY -EPDLKvbdVhXuwfxz -DoCjjvbdaoffckzd -EOcKjvbdLhbLpxAS -DnbjjvbdnHExMmgZ -EObjjvbdbhljKfXY -DnbjjvbdkDLkRGuH -EPDLKvbdfHkWSORH -EObjjvbdzoPqFClY -DncKjvbdznopdbkx -EObjjvbdnUtzLKRf -EPCkKvbdZQldiMeR -DoDKjvbdFjeScHmV -EPDKjvbdEOcLKwCd -EPDKjvbdyqOmJKXA -EOcKjvbdSQTfiecw -DoDLKvbdDoDLLXDE -DoDKjvbdhlEcmuDZ -EObjjvbdfHkWRmqH -DnbkKvbdIGfzYwwg -DncLKvbdUWMPjUAq -EPDKjvbdkHflGGOL -DnbkKvbdnPzZVjyC -EPDLKvbdSBceLiYk -DncLKvbdUtMsfLvK -DnbkKvbdbrcLTdJa -EObkKvbdIwtCHkqQ -EPDKjvbdtbcVWvPP -EObkKvbdtbcVWuoP -DoDKjvbdKVtfEFGi -EPCjjvbdMRvlytpz -DoDLKvbdwuMeRYlO -EOcKjvbdlhdTqVRa -EPDKjvbdiGjCyVjV -DnbjjvbdrDeJQNua -DoDKjvbdrbFmMHKy -EOcKjvbdfHjurNpg -DnbkKvbdZRNFJMeR -EOcKjvbdqFdEsvBI -DnbjjvbdZirgogCG -DoDLKvbdDncKjwDE -DoCkKvbdjhGlFfOL -EObjjvbdmaivxOnV -EObkKvbdKkAhWAJy -EOcKjvbdNrtWHEuQ -DnbkKvbdFkFTChMu -EObkKvbdeOdrjstS -EOcKjvbdIwsbHlQp -DoCkKvbdeATpmXif -EOcLKvbdKaKgMaxR -EObkKvbdUGznLvvF -DnbkKvbdbLMGPODA -EObjjvbdTkvOaVoJ -EOcKjvbdsQVoKDVf -EPDKjvbdznopdcLx -DoDLKvbdpfDdsvAh -DncKjvbdrDdhpNua -EOcLKvbdhficZVjV -DncKjvbdFxuVBEYC -EPDKjvbdzjVQQETU -EObkKvbdKRZePGNe -EObjjvbdDncLLXDE -EOcLKvbdYkqctNkm -DoDKjvbdtvOYKRTA -DoCkKvbdmajWxPNu -DncKjvbdIjEAJofd -EPCkKvbdiCPDFWqR -EOcLKvbdIHHZxwwg -EOcKjvbdYpmEiNFR -EOcLKvbdQmYCZNtz -EOcLKvbdVYhTykPO -EPCkKvbdJKEAKPfd -DoCjjvbdRkYfUfjs -EPDLKvbdlZTSTZGt -DoDLKvbdNGbpNQVL -DoCjjvbdvAdZTOdh -EPCjjvbdliDsqUqa -EPDKjvbdSPsfiecw -EOcKjvbdYlRcsmkm -DnbkKvbdwXMAvBVu -EPCkKvbdRjxfVGjs -EOcLKvbdCIkCKiFj -DoCkKvbddxZssrFz -EOcKjvbdREDApRES -EOcLKvbdTpqPVVIN -EObjjvbdaaWEeoow -EOcKjvbddeOrCXCj -EOcLKvbdAMgySvyx -EPDLKvbdNPwqVnHT -EObkKvbdwuMeRYlO -DoCkKvbdTkuoAuoJ -EPDKjvbdmJDspuRa -EPCjjvbdNHCpNQVL -DncKjvbdGcjvKBij -EOcKjvbdbQHHELzd -EPDKjvbdPxmAGrqj -EPCjjvbdRbDdkiYk -EPDLKvbdTAFJHand -DoDKjvbdqmZjZMHi -EObjjvbdtSrTYzFD -DncLKvbdhlEcmtby -EObjjvbdmJEUQuSB -DncKjvbddndsKstS -EPDLKvbdmgFYNOGy -DnbjjvbdSCEElIyL -DncKjvbdmaivxOmu -DoDKjvbdFVyPomKF -DnbkKvbdMpXqWOHT -EObjjvbdKefICBRV -EObjjvbdqGDdtWBI -DnbkKvbdCJLCLIfK -EObkKvbdLqwNZtpz -DoDLKvbdiifHjMwr -DoCkKvbdddoRawDK -DncKjvbdbrcKscjB -DnbjjvbdrSVLNkAm -DnbjjvbdffLynHHA -EObkKvbdTAFJHbPE -DncKjvbdDncKkWcE -EOcLKvbdrouoKDVf -EOcLKvbdZisIPfbG -EOcLKvbdiGicYuiu -DoDLKvbdVgxWXfxz -DoCkKvbdffMZmgHA -EObjjvbdWfZZtAPT -EPDLKvbdEzsqElCi -DoCkKvbdYSlAlsoY -EPDLKvbdFWYpPmKF -DoDKjvbdkNCMZdfo -EPDLKvbdehLWSOQg -DnbjjvbdxxJKCPyk -EOcLKvbdMfcQMpVL -EOcLKvbdnVVZkKRf -EObjjvbdczYoxZQb -EPCkKvbdSQUGiedX -DoDKjvbdeuzwpJzs -DoDLKvbdqZPHfqDx -DoCjjvbdKeehCBQu -DnbkKvbdADSYJyiQ -DoCjjvbdFkFTDHlu -EPDKjvbdZoOJEdzK -EPCjjvbdZjTIQGbG -DncKjvbdZHWdAOri -EPCjjvbdeXystRez -EObkKvbdIxTagkpp -EObjjvbdxZgfFxEr -DoDLKvbdjhHLfGNk -EObkKvbdTfznMWue -DoDLKvbdOSsufeVQ -DncKjvbdVUNTelWK -EPCjjvbdZQmFImEq -DnbjjvbdkClLQftg -DnbjjvbdRXNdDLhD -DncKjvbdTqQoVUgm -EPCjjvbdNQYRVmgT -DoDLKvbdnUuZjiqf -DoDKjvbdbsCjsdJa -EOcKjvbdFkEsDINV -DoDKjvbdyOTHxSiD -EOcKjvbdkMbMZdgP -DnbkKvbdeEnqavcK -DoCkKvbdxZhFfYEr -DncKjvbdNPxQunGs -EOcLKvbdOYOuzdNt -DncKjvbdJbicRKDY -DncKjvbdjAQHAofj -EOcKjvbdWWiYVcdg -DnbjjvbdjFKftoAO -EPCkKvbdTXkLmzjx -EPCkKvbdWSNxBeMD -DoCkKvbduMXwBTaX -DoDLKvbdLBKfmBxR -DoCjjvbdEObjjwDE -EPDKjvbdTlVnaVoJ -DoDLKvbdhgJcZViu -EObjjvbdatbHXjtI -EOcLKvbdZeXfzgiC -EPCkKvbdeFPRbXCj -EPCkKvbdZQleJMdq -DnbjjvbdUWLojUAq -EPCjjvbdFaOpyJzm -DnbkKvbdANIYrwZx -EPCkKvbdbBWEeopX -DoDLKvbdczYpYYpb -EPCkKvbdbVBfxLTh -DoDKjvbdLBKflawq -DoCkKvbdyOSgxSiD -EPDKjvbdkDLkQgVH -EObkKvbdjmBlZdfo -EPDKjvbduoTzqLOt -EOcLKvbdaRebhUFk -EPDKjvbdatbGwjtI -EOcLKvbdCIjbLIfK -DncKjvbdkIGkeemk -DncKjvbdxVMeRZMO -EOcKjvbdRXODcMHc -DnbjjvbdqquLOLAm -DoDKjvbdDHLfHAzc -DoCkKvbdnVVZkKRf -DoDLKvbdGcjvJbKK -DoCjjvbdzoQRFDLx -DoDLKvbdmuUzLKRf -EPDLKvbdtumwiqTA -EOcKjvbdmJDsptrB -EPCjjvbdIGgZxwwg -EPDLKvbdxLXDgzzG -DnbkKvbdQwNdCkhD -DnbjjvbdcasNSAUN -EPCkKvbdTulQKTaR -EOcKjvbdhgJbyVjV -DoDLKvbdKVteceHJ -DnbjjvbdHgGzYwxH -EPCjjvbdxnSgxTJD -EPDKjvbdyYJKCPzL -EOcKjvbdOFDtJJKd -EObkKvbdRadEkhxk -DoCkKvbdiifHjNXr -DoCjjvbdnUtyjirG -EObkKvbdJpydoGNe -DoDKjvbdZLqctOLm -DnbkKvbdsBfMkfkZ -EOcLKvbdOStWGeVQ -EPDLKvbdijGIJmYS -DoDLKvbdxxJJbQZk -DncKjvbdHbLydzAD -EOcLKvbdyTNiMqag -EPDKjvbdMgComQVL -DoDLKvbdzitoocsU -EPDKjvbdsBfMkfjy -DoCkKvbdFyUtaEYC -DoDLKvbdJKEAJpGd -DoCkKvbdygZMAMeX -EPCkKvbdJqZdoFnF -DnbkKvbdiBnbdvqR -EOcLKvbdSQUGjFdX -DnbkKvbdmSYtzTEJ -DoCjjvbdehKvSOQg -EOcLKvbdGckVibJj -DncKjvbdhficYvJu -EPDKjvbdwuMeRYkn -EOcLKvbdFejSNiUR -EPCjjvbdOFEUJJLE -DnbkKvbdXsLaMtOx -EPDKjvbddZyPxYpb -EPCkKvbdhzVFkqNf -DoDKjvbdOEdUIiLE -EPCkKvbdnGeXmOHZ -EObkKvbdiMEdNuCy -DoDLKvbddoFTLTtS -EObkKvbdIxTbHlQp -DncLKvbdZRMdhmEq -DoDLKvbdZnmheEyj -EPDKjvbdKeegbApu -DncLKvbdNVTSLNAX -EOcKjvbdKDJbqKCx -EPCjjvbdFfKSOIsq -EPCjjvbdxnShYSiD -EOcLKvbdOStWHFVQ -DncLKvbdsPvOicWG -DnbjjvbdxnTHwsJD -DoDKjvbdLAkGmBwq -DoCkKvbdwMvAMceN -EOcLKvbdmRyVZsDi -EPCkKvbdmpZyWKyC -DoDLKvbdrykpTBIO -DoCjjvbdVgwvYHYz -EPDLKvbdTvMPjUBR -EOcLKvbdgFkzOGgA -DnbkKvbdVBBpsRRy -DnbjjvbdRzKISbvA -EObjjvbdxnTIXsJD -EObjjvbdZoOJEdyj -EPCjjvbdHDjuibKK -EPCjjvbdezuxdiUX -EOcKjvbdYTMAmToY -EObjjvbdJYTbILpp -DoDKjvbdkClLRHUg -EPDKjvbdTkvPAvPJ -EObkKvbdeAURNXjG -DncLKvbdTukpKUBR -DoCjjvbdcTDKsdJa -DoDKjvbdBsAcUGXS -EObjjvbdDoCjjvcE -EOcKjvbdtlYWaTaX -DnbjjvbdRDbaPpcr -EPCjjvbdrylPsAgn -DoCkKvbdOhAYZAYa -DnbjjvbdiUydwSVC -DoCjjvbdwzIFfYFS -DoCkKvbdZshiZDrn -DoCkKvbdZoOIddyj -DncKjvbdpssgSSKt -EPCjjvbdrSUkNkBN -EPDKjvbdjJfIJlxS -EOcLKvbdxVNFRYkn -DoDKjvbdWWhwvEFH -DncLKvbdRDcBQQcr -DnbkKvbdliETpuRa -EPCjjvbdZRMdiMeR -DnbkKvbdiMEdOVCy -EPCjjvbdznpREbkx -DoCkKvbdwzIFexFS -DnbjjvbdmSYuZrdJ -DoDLKvbdCWzchdov -EPDLKvbdpfEFTvAh -EPDLKvbdyOTIYTIc -DncKjvbdNQXqVnHT -DoDLKvbdCgMFgAzc -EOcKjvbdIwtBgkpp -EPDKjvbdRjyGUfjs -EObjjvbdACqwjZiQ -DoDKjvbdpstGrSKt -DnbkKvbdnGdwmOHZ -DncKjvbdiZtfLpnG -DoDLKvbdaSGCgtFk -DoCkKvbdFfJqnIsq -EPCkKvbdkNCLzEgP -EOcKjvbdFeirOJTq -EOcLKvbdUtNUGMWK -EObkKvbdSQUHJfEX -EPCkKvbdqquKmkBN -DnbjjvbdbhmKKfXY -DoCkKvbdIsYaTNXl -DoCjjvbdZoNheFZj -EOcLKvbdBhjbLIfK -EOcKjvbdatafwjsh -DoCjjvbdkxrrSyHU -EPDLKvbdSCEElIxk -EOcKjvbdfMevfmKL -EPCjjvbdMJBlRYAS -DoCjjvbdSxKkmzkY -DnbkKvbdkNCLydgP -EObkKvbdkxsSTZHU -DoCjjvbdRpUGiedX -EOcKjvbdjblLRGuH -EObkKvbdyTNiMrCH -DnbjjvbdZeXfzhJC -DoDKjvbdZxdJmblS -DncKjvbdOStWHEuQ -DoCkKvbdyNsHwsIc -EPDKjvbdkxrqryHU -EObjjvbdZLqctNlN -DoDLKvbdxnSgxShc -EPDLKvbdnBjWwoNu -DoDKjvbdkIHMGGOL -EObjjvbdqUUGrRkU -DncLKvbdRjyGVHKs -EPDKjvbdhfjCyWJu -EPCkKvbdHELVjBjK -DncKjvbdgQBzvcwh -DoDLKvbdVAaqSpqy -DoCkKvbdySnJNSBg -DoDLKvbdpeceUWAh -DncLKvbdaRebgsfL -EOcKjvbdZLqctNlN -EObjjvbdtbbtvvPP -DoCkKvbdZMSDtNlN -EOcKjvbdsBelkfjy -EPDLKvbdTpqPVVIN -DnbjjvbdBiKbKhfK -DnbjjvbdOFEUIiKd -EPCkKvbdSiZjRAAl -EObkKvbdwjwDgzyf -EPCjjvbdhlEdNtby -EPCjjvbdhtydwSUb -EOcKjvbdnQZyVjyC -DoDKjvbdRzKIScWA -EOcLKvbdLBLHNCXq -DoDLKvbdssSTYzFD -EObjjvbdEvYpPlie -DncLKvbdhficYvKV -EPCjjvbdnUuZkJqf -DnbjjvbdXnRAXtut -EPDKjvbddijRutzn -EOcLKvbdEvYpPljF -DoCjjvbdTulQKUAq -EObkKvbdxmsIYShc -EPDLKvbdkyTRryHU -EObjjvbdCEQAvKNG -EObjjvbdGYuVBEYC -EPDKjvbdvAdYsOeI -EObjjvbdRpUHKGEX -EPCkKvbdKDJcQjDY -DoDLKvbdunszqKoU -DoCjjvbdJvUfEEfi -DncLKvbdrpWPJcWG -DoCkKvbdajkfPNcA -DnbjjvbdFpATXHFy -EObkKvbdFfJrOJTq -DncLKvbdZnnJFEyj -DoCjjvbdOEctIiKd -EPDLKvbdVhXuxGxz -EPDKjvbdySmhlrCH -EOcKjvbdiGjDZWJu -DncKjvbddZyQYZRC -DncLKvbdziuPpETU -DncLKvbdJTYaTNXl -EPCjjvbdNddThiKd -DnbkKvbdbAudepPw -EOcKjvbdMowpunHT -DoDLKvbdmbKXYPNu -DoDLKvbdezvZEiTw -DnbjjvbdrMyixkgi -DnbkKvbdKWVGEFGi -DoCjjvbdkDLjpftg -DnbjjvbdJqZePFme -EObkKvbdDwxLsssl -EPCjjvbdmoyyWLYb -EPCkKvbdFjdrcHmV -DoCkKvbdDwxLtTsl -EOcLKvbdoAKztHdO -EPDLKvbdTkuoAuoJ -DncLKvbdURRPVVHm -EPCkKvbdKCicRJcY -DoCkKvbduDCuXWOo -DoCjjvbdRXNdDMID -DoDKjvbdBcpBWJlf -DoCjjvbdTqROttgm -DncKjvbdRadFMIxk -DoDLKvbdCSaDTewS -EOcKjvbdQlxCYmtz -DncLKvbdeOeSkUTr -DnbkKvbdTqQntthN -DnbjjvbdhbObdvpq -EPDLKvbdMowqVmgT -DncKjvbdANIZTWzY -EPDLKvbdiVZeXRtb -DncLKvbdYNqAXtvU -EOcKjvbdfIKurNpg -DoCkKvbdFpATWfey -EPCjjvbdHkazmwRL -DoDKjvbdJvUfDdgJ -EPCkKvbdSBdElIxk -DoCkKvbdbsCjtEJa -DoDLKvbdvBEYsOdh -EOcLKvbdGGJqmhsq -EOcLKvbdJSyBSlxM -DncLKvbdnQZxukZC -EOcLKvbdySnIlrCH -DoCjjvbdIjEAKPgE -DoDLKvbdhlEcnVDZ -EPDKjvbdZeYGzghb -EPDKjvbdbKlGOnDA -EPDKjvbdkMbMZdgP -EOcLKvbdDoCkKwCd -DnbjjvbdLBLGlbXq -EPDLKvbdZxcinCkr -DoCkKvbdqTsfrRjt -DoCkKvbdADSYJzIp -DoDKjvbdbUagYKsh -EObjjvbdjAQHAofj -EOcKjvbdDoDKkXDE -EPDKjvbdSZigsCvA -EPCkKvbdKRZePGOF -EPCjjvbdKaKgNCXq -EObkKvbdxxJKBoyk -EOcKjvbdxmrgwsIc -DnbkKvbdmozYvKyC -DoCkKvbdqquLOLAm -EObkKvbdDncLLXCd -EPDLKvbdjcMKpftg -EPCjjvbdwkXDgzzG -DoDLKvbdHffyxwwg -DoCkKvbdvAdZSneI -EOcLKvbdrovOjDVf -EOcLKvbdsPuoJbuf -DoDLKvbdySnJNSBg -EObkKvbdXsMAltOx -DncLKvbdFfKSOJTq -EPCkKvbdddnrCWcK -DoCjjvbdySmhlrBg -DnbjjvbdNxPVzcnU -DncKjvbdhtzEvrVC -DoCjjvbdQwODblHc -DoDLKvbdjcLjpgVH -EOcLKvbdbKlGOmcA -EPDKjvbdfMfWflik -DncKjvbdmbJwXnmu -EOcLKvbdTkuoAvOi -DnbjjvbdsZkoraIO -DoDKjvbdZMSEUOLm -EOcLKvbdsCFmLfkZ -DncKjvbdUxhTyjnn -EPDKjvbdRosfjGEX -EOcLKvbdmuUzKirG -EPCkKvbdGGJrOItR -EObjjvbdEXwktUUM -DnbkKvbdiifHimXr -EPDKjvbdmJDspuSB -EObjjvbdwyhGFwdr -DncKjvbdatafwkUI -EPDLKvbdYNqAXtut -DoDLKvbdEPCkLWcE -EOcLKvbdqceJQOWB -EPDKjvbdySnJNSBg -DnbjjvbdyzdnSIIh -DoDKjvbdrDdiQNvB -DoCkKvbdYkqdTnLm -DoCkKvbdlZTSTYgU -EPDKjvbdMpXqWNfs -EObkKvbdJbicQjDY -DoDLKvbdGAoRYizm -DncKjvbdmgExNOHZ -DoCjjvbdznoqFDLx -EOcKjvbdieLGtoAO -DoCjjvbdMfbpMotk -EObkKvbdyzdnSHiI -EObkKvbdcSbjscia -DoDKjvbdNGcQNQUk -EPDKjvbdNGbpMpVL -DoDLKvbdUQqPVUgm -DnbjjvbdVvhwuceH -EPDKjvbdDxXkstTl -EPCjjvbdPyNAHTRj -EPDLKvbdeOdsLTtS -DoDKjvbdTAEiICPE -DoDKjvbdZisIQGaf -EObkKvbdxVMdpxkn -EPCkKvbdnUtzKjRf -EOcKjvbdhtydvrVC -DoDKjvbdbrcLTcia -EPDLKvbdbhlikFvx -EPDKjvbdANIZSwZx -EPDKjvbdtbbuXWOo -EObjjvbdliDtQtqa -DncLKvbdGLFScIMu -DnbkKvbdfMfXGljL -EObkKvbdCTBDTewS -EPDKjvbdSiZiqAAl -EOcKjvbdFfKSNhsq -EPCjjvbdyYJKBpZk -DncKjvbdAMgyTWyx -DnbkKvbdpaJFAXIE -EOcKjvbdEYYMUUTl -EPCjjvbdeFOrBvcK -DoDLKvbdptUHSRkU -DoCkKvbdOYPVzcnU -DnbjjvbdijFhKMxS -DnbkKvbdEKHivXjA -DncLKvbdsPvOicVf -DoCjjvbdmbJvxOmu -EOcKjvbdDxYMUUTl -DoDKjvbdZtIhxdTO -DncKjvbdTlVoAuoJ -DoDKjvbdFyUuBDwb -EObkKvbdQYmAGsSK -DnbkKvbduLwwAsaX -EPDKjvbdegkWRmpg -EPDLKvbdRDcAoqDr -DoCjjvbdFWZPolie -DoCkKvbdbhmJkGWx -DncLKvbdrWpMDJYq -DnbjjvbdaaWEeoow -DoDLKvbdzHYlANFX -DoCkKvbdjFLHUoAO -DnbjjvbdZyEKNbkr -DoDKjvbdLrXMyuQz -EPDLKvbdwNWAMdFN -DoCkKvbdkWXODaxX -EOcKjvbdraelkgKy -EOcLKvbdmSZVZsDi -EPCjjvbdkMbLzEfo -EObjjvbdaSFbgtFk -EObkKvbdmIctRUqa -DncKjvbdhtydvquC -EPDKjvbdZoOJEeZj -DoDLKvbdyXiJaozL -EOcLKvbdVwIxWEFH -DnbkKvbdYpmFJMdq -EPDLKvbdjKGIKMwr -EPCkKvbdFpASwHGZ -DncKjvbdKQzEnfNe -DoDLKvbdkVwODaxX -EPCjjvbdzaAOffal -EObjjvbdnHEwlnGy -DncLKvbdLqwMyuQz -EPCkKvbdWRnXaeMD -DoCkKvbdcbSlrAUN -EPDKjvbdMJBlRYAS -EOcLKvbdZxcimbkr -DncLKvbdCDpBVimG -DoDKjvbdGdKvKBjK -EPDLKvbdziuPodSt -DnbkKvbdbrbjtEKB -EOcLKvbdmIcsptqa -EPDKjvbdMRwMyuQz -DoDLKvbdfHkVrNqH -DnbkKvbdLZRKSzuG -EPDKjvbdTfzmkwWF -EOcLKvbdSKxeuHLT -EPDLKvbdkHgLfGNk -DoDLKvbdVhXuxHYz -EOcKjvbdkHgMGGOL -DoDKjvbdEARhmZvw -EPDLKvbdjKFgimXr -EObkKvbdSQUGiecw -EPCjjvbdjKFhJlxS -DoDKjvbdDxXlTtUM -EPDLKvbdelfWgMik -EOcKjvbdtcDVXWOo -DoDKjvbdiZuFlRNf -DoCkKvbdsBellHKy -EPCkKvbdjlbLyeGo -EOcKjvbdhfibxujV -EObjjvbdhyuGMROG -DoDLKvbdgQBzvdYI -DoDKjvbdeATpmXjG -EPDLKvbdjKFgilxS -DoDKjvbdrpWPJbuf -DncLKvbdDncLKvcE -DoCkKvbdkVvmdCXw -DncLKvbdGcjujCJj -DncLKvbdpxngfpcx -DnbjjvbdiCPCdwQq -EPDLKvbdijFhJlwr -DncKjvbdhgJbxvKV -EPCjjvbdZxcjNbkr -DncKjvbdZQleJMdq -DncLKvbdyfxlAMeX -EPCjjvbdFfJrNiUR -EPDLKvbdzjVQPdSt -DoDLKvbdjAQHBPfj -EObjjvbdZoOJFEzK -EObkKvbdFpATWgGZ -EPDKjvbdvAcxrneI -DoDLKvbdxrnJMrCH -DoCkKvbdjmCLydfo -EPCkKvbdegjuqmqH -DoCkKvbdSBdFLiZL -EObkKvbdbAvFFopX -DncLKvbdGQASwGey -DnbkKvbdQccAopdS -EPCkKvbdZshiYdSn -EPCjjvbdHDjujCKK -EObjjvbduDDVWuno -DoCjjvbdzjVQQDsU -EOcLKvbdeFOqavcK -DoDLKvbdyXhibPzL -DoDLKvbdrzMPsAgn -EObkKvbdUtNTfMWK -EOcLKvbdLqwNZuQz -EPDKjvbdqBJFAXHd -DoCkKvbdnUuZkKSG -DoCjjvbdZHXEAOsJ -DncKjvbdQdDBPpcr -DnbkKvbdCIkBkIej -DnbkKvbdMgDPmQUk -DnbkKvbdxxIjCPyk -DnbjjvbdZsiIxdSn -DoCkKvbdADRxJzJQ -EObjjvbdkxsSTZHU -DncKjvbdWXIxVdEg -DnbjjvbdLrWmZtpz -EPDKjvbdhzUelQnG -DoDLKvbdSBceLhxk -EObjjvbdWIXvYGxz -EPDKjvbdEYXktUUM -EObkKvbdhlFENtby -EPDLKvbdNwnuzcmt -EOcKjvbdaaWEfPpX -DncLKvbdddoSCWcK -EPDKjvbdmaiwXnnV -DoDLKvbdMgDQMpUk -DoDLKvbdjFKfuPAO -DncLKvbdnGeYMmfy -DncLKvbdrSUjmkAm -EOcLKvbdfHkWRnQg -DnbjjvbdnCKWxPNu -DnbjjvbdraemLgKy -EObkKvbdWWiYWDdg -DoCkKvbdKfFgaaQu -EPCkKvbdaSFcIUGL -EOcKjvbdkxrqryHU -DncKjvbdRDbaQQcr -DncLKvbdbVBgXjtI -DoCjjvbdqZPHfqDx -DnbkKvbdcyxowxpb -EPCkKvbdWXIxWDeH -DoCkKvbdyXiKBozL -DnbkKvbdlZSrTYft -EObjjvbdGdKujBij -DnbjjvbdtcDVXWPP -DoDKjvbdZnmhddyj -EObkKvbdTukoisaR -EObkKvbdzoPqFCkx -DncLKvbdLhalQxAS -EPCkKvbdVwIwudFH -DoDKjvbdjKGIKNYS -DoDLKvbdjhHLeenL -EPDKjvbdJTZBSlxM -DoCjjvbdFaOqZJzm -DoDLKvbdnBjXXnnV -DoCjjvbdeFPSCXDK -EPCjjvbdbAvFGPow -DnbkKvbdVwIwvEFH -EObjjvbdqUTfrSLU -DncKjvbdqlyixkhJ -DoDKjvbdSLZFuGjs -DncLKvbdsCGNLfkZ -EPDLKvbdaofgDkzd -DoCkKvbddiirWUzn -EOcKjvbduCcVWuno -DnbkKvbdSPsfjGDw -DoCkKvbdFWYpQMie -DoDLKvbdRECaQRES -EPDLKvbdhfibyVjV -DnbjjvbdqTsgSSLU -EObkKvbdrXQMChyR -DncLKvbdNrtVfduQ -EObjjvbdiUzEvqtb -DncKjvbdUaCQsRRy -EPCjjvbdRbEEkiYk -DncKjvbdUtNUGMVj -EPCjjvbdzHYlAMeX -EPCkKvbdeEoRbXCj -DoDLKvbdcScLUDia -DoDLKvbdtbbuWuno -EOcKjvbdbUafwkTh -DoCjjvbdtcDVXWOo -EOcKjvbdHgGyxxYH -EOcLKvbdWSOXbEkc -DoCkKvbdKeehCBRV -DncLKvbdMgComQVL -DoDKjvbdUMVoBVoJ -DoCjjvbdzoQRFCkx -DoCkKvbdUWMQJsaR -DnbjjvbdkNCLydgP -EOcKjvbdmozYvKyC -DnbkKvbdmgExMnGy -DncKjvbdznpQeDMY -DoDKjvbdZxcjNbkr -EOcKjvbdqdEiQNua -EPDLKvbdfHkVrNpg -DnbkKvbdXsMBMsoY -EObkKvbdcJNKLGXY -EPDLKvbdVqmwbEkc -EPCkKvbdJcJbpibx -EObjjvbdYNqAXtvU -EObkKvbdjAQHApGj -EPDKjvbdrbFmMHLZ -DnbkKvbdPIAXyAYa -DoDKjvbdSLZGVHLT -DoCkKvbdDnbkLWcE -DncKjvbdzoPpeDMY -EPDKjvbdQwNdDLhD -EPDKjvbdhfjCxuiu -DoCjjvbdajkenmcA -EPDKjvbdtTSTYyeD -DoCjjvbdijFhKMwr -DoDLKvbdpfDeTuaI -EPCjjvbdJXtCHlQp -EOcKjvbdjbkkRGuH -EObkKvbdVTlselWK -DoCkKvbdauCHXkTh -DnbjjvbdSLZGVGjs -DoDLKvbdehLWRmqH -DncKjvbdSBdFLhyL -DoDLKvbdmajXYPOV -EOcKjvbdpeceTvAh -EPCjjvbdNdctIhkE -EOcLKvbduWNwjQsA -DoCjjvbdtvOYKRTA -DncKjvbdqiAJeNOe -DnbjjvbdUtNUGLvK -EPDKjvbdMgColotk -EOcKjvbdQlxCZNtz -DoDKjvbdmfdwmNfy -EPDKjvbdrovPKDVf -DnbjjvbdDjIJuwjA -EPCjjvbdsBfNMHLZ -DoCjjvbdJbjDRJcY -EPDLKvbdZRMeJNEq -EPCkKvbdRkYfVGkT -DncLKvbdRbDeLiYk -EPCjjvbdqiAJdloF -DoCjjvbdFyVUaDwb -DoCjjvbdMRvmZtpz -DoDLKvbdGQATWffZ -EPCjjvbdwtmFQyMO -EOcKjvbdTIzKRAAl -DoCkKvbdsQVnicVf -DoDLKvbdFfKRmhtR -EOcKjvbdsCFmLfjy -DoDKjvbdddnqbXDK -DoDKjvbdYgWdAOri -DoCkKvbdmuUyjjSG -EObkKvbdhficYvJu -DoCkKvbdQlxCZNtz -EPCkKvbdGZVUaEXb -DncLKvbdEXxMTtTl -DoDKjvbdGFirNiUR -EPCjjvbdpssgRrLU -EObkKvbdVZHsykOn -DncKjvbdyTOJMrBg -EOcKjvbdRacdlIyL -EObkKvbdiCOcFWqR -DoDLKvbdRjxfVGkT -EOcLKvbdiBncFXQq -DncLKvbdnQZxukYb -DoDKjvbdpaIeAWgd -DncKjvbdVqnYCEkc -DnbjjvbdZRMdhmEq -EPCjjvbdhgKDYuiu -EOcLKvbdCIkBjhfK -EPCkKvbdZnmhdeZj -EOcKjvbdTppnuUhN -EOcLKvbdbVBfxKsh -EPDKjvbdFVxpQNKF -DnbjjvbdjvWnDaxX -EObjjvbdANIYrwZx -EObjjvbdauCHXjtI -EObkKvbdZirgpGaf -EObjjvbduoTzqLPU -DoDLKvbdxZhFeweS -DoCjjvbdILaznWqL -DncLKvbdaMkBrtlg -EObjjvbdNrtVgFUp -DnbkKvbdRzKHsCvA -DoCkKvbdiZuFkpnG -DnbkKvbdEztRElDJ -EPCjjvbdRECaQQdS -EPCjjvbdqqtkNkAm -EObkKvbdyNrhXriD -DoDLKvbdegkWRmqH -DncKjvbdNQXqWNfs -DoDLKvbdRadFLhxk -EPDKjvbdxUmFQyLn -EPCjjvbdxxJKBoyk -EObkKvbdnVUzLJqf -DnbjjvbdSQUGiedX -DncLKvbdrpVnjCvG -DoDKjvbdZirgpGbG -DncKjvbdOAJTUJrA -DnbjjvbdUyHsyjoO -EPDKjvbdfpBzvdXh -EPCjjvbdyTNhlqag -DncKjvbdLBKflaxR -DoCjjvbdVwJXvEEg -EOcKjvbdVqnXadlD -DoDKjvbdyNrgxSiD -EObjjvbdnVVZjjRf -DnbjjvbdFeiqmiTq -EObkKvbdFVxpQMie -DnbkKvbdIBkydzAD -EPCkKvbdZjTHofaf -DncLKvbdnPzYukZC -EObkKvbdLYqKSzuG -Dnbjjvbdxmrgwrhc -EObkKvbdTkuoBWOi -EObkKvbdIrxaSlxM -EOcLKvbdJqZeOfOF -DoCjjvbdBhjbKiFj -EPCkKvbdrDeJPnVa -EPCkKvbdNwoVzcnU -EOcLKvbdXmqAYVWU -EPCkKvbdZeYGzhJC -EOcKjvbdNddUIhjd -DoDKjvbdjggLeemk -EObkKvbdxZgefXeS -EOcKjvbdgFkzOGgA -EObkKvbdNdcsiIkE -EPDKjvbdbiMikFwY -EPDKjvbdelfWfmJk -EOcKjvbdHELWJajK -DoDLKvbdZRMeIldq -EOcLKvbdRXNccMHc -EPCkKvbdQlxCZNtz -DoCkKvbdyTOJMqag -EPDLKvbdCTAcTevr -EOcKjvbdrpVnicWG -DnbkKvbdZLrETmkm -EOcLKvbdRpTfifEX -DnbjjvbdQcbaPqDr -DoCkKvbdEuxpQNKF -EPCjjvbdNeEThiKd -EPDKjvbdVYgtZjoO -DoCjjvbdZRMdhleR -DoCjjvbdZsiIyDrn -EPDLKvbdaSGCgtGL -EPDLKvbdqTtGqrKt -DoCkKvbdnVUzKjSG -EPCjjvbdzQoMiJwA -EPDKjvbdXrlBMtOx -DoCjjvbdNHColpVL -EObkKvbdXnRAXuVt -EObjjvbdMJCMQxAS -EObkKvbdIrxaTMxM -DnbjjvbdbAudfQQX -DnbkKvbdnCKXYOmu -DoDKjvbdEXxMUUTl -EObkKvbdyXhiaozL -EObjjvbdEJhKVwjA -EOcKjvbdpfEFTuaI -EOcKjvbdbVCHYLTh -DncLKvbdyqOliJwA -EOcKjvbdkxrqsZHU -DncKjvbdDjHjVwjA -EPCkKvbdkDMLQfuH -EPCjjvbdUVlPjUBR -DoDLKvbdjJfHimXr -DoCkKvbdEuxooljF -DoDLKvbdYzcGRjWZ -DoDKjvbdwyhGGYFS -DnbkKvbdsrrSxyeD -EPCkKvbdxmrhXrhc -EPDKjvbdDjHivXjA -EObkKvbdfMfXGlik -EPDLKvbdGdKvKBij -DoCkKvbdbLMGOmcA -EPCkKvbdRXNdDLgc -EPCjjvbdZsiIxcrn -DoDKjvbdpyPIGqEY -EPDKjvbdlZTRryHU -DoDKjvbdUslsekvK -DncKjvbdKfFhCBQu -DncLKvbdSCDeMIyL -EPDKjvbdJcJcRJcY -DoDLKvbdraellHLZ -EPCjjvbduDCtwWPP -DnbkKvbdBdPaWJlf -EPCkKvbdqFceUVaI -DnbkKvbdcyxoxYqC -DnbkKvbdlYsSTYft -EObjjvbdZHXEAOsJ -EObjjvbdURROtuHm -EPCjjvbdZLrDsnMN -EPCjjvbdfIKvRmpg -EPDLKvbdwWlBVaVu -EObkKvbdZMSDsmkm -EPDKjvbdKNAEZfuB -DnbjjvbdhyuGMROG -EObjjvbdJuuGDdgJ -EPDLKvbdgQBzwDxI -EObjjvbdjvXNdCXw -EPCjjvbdlZSrSyGt -DoDKjvbdXsLaMsnx -DoDLKvbdTlVoAuoJ -DnbkKvbdptUGrSLU -EObkKvbdEztRFMCi -EOcLKvbdTkvOaVoJ -EObkKvbdDoCjjwCd -EPCkKvbdTfznLwVe -EObkKvbdRjyGUfjs -EPDKjvbdVviXvEFH -DnbjjvbdKkBIWAKZ -EOcLKvbdqFdFUVaI -EOcLKvbdBhjakJFj -DncKjvbdauBgYKsh -DnbjjvbdxKvdHzyf -DoCjjvbdxVMdqYlO -EPCjjvbdEPDLLXDE -EPDLKvbdVvhwucdg -DncKjvbdaRfDITfL -EPDKjvbdfpBzvcxI -DoCkKvbdGLFTDHmV -DoDLKvbdcTDKtDjB -DnbkKvbdZRMeIldq -EObjjvbdRjyGVGkT -EPCjjvbdlhctRVRa -DnbjjvbdyXhibPzL -DnbjjvbdFpASvgFy -DnbjjvbdKCicRJcY -DnbkKvbdPxmAGrrK -EPCjjvbdpstHSSKt -EObkKvbdiZtelQnG -DoDLKvbdKkAgvAJy -EObjjvbdsPvPKCuf -EOcLKvbdhyuGLqOG -EPDLKvbdyOSgxShc -EObkKvbdmJDsptqa -EPCjjvbdbVCHYKtI -DoCkKvbdCJLBkIfK -EPDKjvbdTqQnuUgm -EOcLKvbdypnmIjXA -DoDLKvbdiLddOUby -DoCkKvbdaSFbgtGL -EPDLKvbdraellGjy -EObkKvbdWRmwbEkc -EPCjjvbdDoDLKvcE -DnbjjvbdjEjfuPAO -DnbjjvbdqvokbiYq -DnbkKvbdVZITzLOn -EPDKjvbdUWLpJtAq -EObkKvbdwtmFQyMO -DoDLKvbdFWZQPmKF -EPDKjvbdLBKgMawq -DncLKvbdANIYsWyx -EObkKvbdqvolDJYq -EOcKjvbdQlwbZOUz -EPCkKvbdlqyUzTEJ -EPCkKvbdSLYfUgKs -DoCjjvbdRotHJfEX -EOcKjvbdrXQMCiZR -DncLKvbdaofgELzd -DoDKjvbdehKvSNqH -EPCkKvbdzaAOfgBl -DoCkKvbdVUMsfMVj -DoDLKvbdUGznLwVe -EPDLKvbdDoDKjwDE -DoCjjvbdANHxsXZx -EPCkKvbdJpydnenF -EPCjjvbdtTRsZZeD -DoDLKvbdnQZyWLZC -EPCkKvbdKNADyfta -EPCkKvbdUVlPjTaR -DncLKvbdeOeSjstS -DncKjvbdXrlAmUOx -DoCkKvbdxnTIXrhc -EPDLKvbdZjTIQGaf -DoCjjvbdPxmAGrrK -EPDKjvbdLZQirztf -DoDLKvbdkHflGFnL -DoCjjvbdiMFEOUby -DnbjjvbdhaoDFXQq -EPCkKvbdyzeNqhIh -EPDKjvbdbUbGwkUI -DoCkKvbdEXxLsstM -DoDLKvbdaRebhUGL -EObjjvbdMfbpNQUk -DoDLKvbdCEQAuilf -EObjjvbdMowpunHT -DoDLKvbdzHYlAMeX -DoCkKvbdegkVqnQg -DnbkKvbdwWlAuaVu -DncKjvbdFfJqnItR -EObjjvbdZjTHpHBf -EPCkKvbdbsDKtEJa -EOcLKvbdZtIiZESn -DoDLKvbdpxoIHRDx -EPDLKvbdTpqOtuIN -DnbjjvbdmoyxvKxb -DncKjvbdqGEEtWBI -EPCkKvbdQwNdClHc -DoCkKvbdHELViajK -EPDLKvbdCJLBkIfK -EPDLKvbdvwMBWBVu -EPDKjvbdxrmiNRag -EOcKjvbdxVMeQyLn -DoCkKvbdraelkgLZ -EPCjjvbddndsLUUS -DoCjjvbdhgKDYvKV -EPDKjvbdBiKbKiFj -DncKjvbdKkBIWAKZ -DnbjjvbdjlakzEgP -EObjjvbdNrtWGeUp -EPDKjvbdidkGuPAO -DnbkKvbdjAQHBPgK -DoCkKvbdUxgtZkPO -DoDLKvbdDoCkLXDE -DoDLKvbdkVvmcaxX -EPCkKvbdmfeXmOHZ -DoCjjvbdHDkWJajK -DoDLKvbdkHgMGFnL -EObjjvbdBdQAuilf -EPDKjvbdxUleQxlO -DoDKjvbdJbjDRJcY -EPDKjvbdXsMAltOx -EOcKjvbdIrxaSmXl -DoDLKvbdyYJJbQZk -DoDLKvbdQlwaxnUz -EObkKvbdqvpMDIyR -DoCkKvbdhzVGLpnG -DncKjvbdJKEAJofd -EOcLKvbdZLrETnLm -DncKjvbdQvnDcMID -EPDLKvbdiLddOUby -EOcKjvbdeJiqvUzn -DnbjjvbdsBemMGkZ -EPCkKvbddtAUASmW -EPCjjvbdiLeEOVCy -EPDKjvbdkxrrSyHU -DoCjjvbdURQoVUhN -EOcKjvbdtkwwBUBX -EOcKjvbddeOqawCj -EOcKjvbdbAvEfPow -EPCkKvbdzROmIjXA -EObjjvbdKDKCpibx -EPDKjvbdIGfyyYXg -EOcLKvbdeOdsKssr -EOcKjvbdsBelkgKy -DoDKjvbdJYUCIMRQ -EOcLKvbdjcMLQgVH -EOcLKvbdJTYaSmXl -DoDLKvbdNddUJIkE -DoDLKvbdFjdsChNV -DnbjjvbdmttyjjSG -EPDLKvbdVgwuxHYz -EOcLKvbdsCGMkfjy -EOcKjvbdKWVGDeHJ -EPDLKvbdjJegjMwr -DoCkKvbdNHDQMotk -DoDLKvbdjmBkydgP -DnbkKvbdSLZFtfjs -EPDKjvbdjbkjpfuH -EObjjvbdkVwNdBww -DncKjvbdFxtuBEYC -EPCkKvbdrMzJxkhJ -DoDLKvbdptUGrSKt -EOcKjvbdhzUelQnG -EObkKvbdsQVoKCuf -DoCkKvbdzitpPcsU -DoCkKvbdySnJMqag -DncKjvbdZRMeImFR -EObkKvbdYzcFrKVy -DoDKjvbdrNZjZMIJ -EPCkKvbdEvYoolie -EOcLKvbdLBKgNCXq -DnbkKvbdrpVnjDWG -EObkKvbdLLBHvAJy -DoCkKvbdqmZixkgi -DoCjjvbdhytfLpmf -DnbkKvbdVZHsyjoO -EObkKvbdWWhxWEEg -EObkKvbdhfjDZWJu -DoCjjvbdZoOIddzK -DoCjjvbdCDoaWJmG -DoCkKvbdzitoocrt -EOcLKvbdOSsvGduQ -EOcLKvbdVqnXbElD -EPDKjvbdgFlZnHHA -EOcKjvbdUsltFkvK -EPCkKvbdePFSkTsr -EPCkKvbdssSTYzFD -EOcLKvbdVTlselWK -DncKjvbdZRMeJMdq -EOcKjvbdYSlAlsnx -DncLKvbdSZihTDWA -DnbjjvbdvvlBWAuu -EOcLKvbdEvZPoljF -EPDKjvbdHELWJbJj -DoDKjvbdDjHiuxKA -DncLKvbdrMyjYkgi -EOcLKvbdRbDdlIxk -DoDLKvbdFVyQQMie -EOcLKvbdZxdJmcMS -EPDKjvbdFejRmiUR -EPCjjvbdnPyxujxb -DoCkKvbdjKGIKNXr -DoCjjvbdYSlBNUPY -DoDLKvbdZshiZDsO -EPDLKvbdkyTRsYft -DncKjvbdJbicQicY -DoCkKvbdXGZZtAOs -DnbkKvbdZjSgpGbG -DncKjvbdWSOYBeMD -DoDLKvbdKNADyfta -DoDLKvbdLBKgMbYR -EObjjvbdNddThhkE -EPCjjvbdQdCaPqES -DnbkKvbdvBDySoFI -EPCkKvbdDoDLLWcE -DncLKvbdaSGDHtGL -EObkKvbdKNADzGta -DncLKvbdTAFJHaoE -EOcLKvbdTAFJIBoE -DoDLKvbdUtNTelWK -EPCkKvbdKefICApu -EObkKvbdySmhlqbH -EPDLKvbduaEYroFI -DnbjjvbdSKxfVHLT -EObkKvbdhkdcnVDZ -DnbkKvbdCSaDTevr -DoCkKvbdiBoCeXQq -DncLKvbdZjShQGaf -EPCkKvbdIwsagkqQ -DnbkKvbdnCKWwoNu -DncKjvbdelfWgNJk -EOcLKvbdSPtHKFcw -EObjjvbdZRNEhleR -DoCkKvbdbLMGPNcA -DoCkKvbdRkZFtfjs -EOcLKvbdySmhmSBg -DoCkKvbdWHxVwgYz -EObjjvbdURQntuHm -EPDKjvbdySnJMqbH -EOcLKvbdOStWHEtp -EPCjjvbdeOeTKstS -DncLKvbdssRsZZdc -EObjjvbdrovPKCuf -EPDKjvbdiZuFkqOG -DncLKvbdsBfNLfjy -EOcLKvbdCDpAujNG -EPDKjvbdOSsugFUp -DoDLKvbdNQYRVmfs -EOcLKvbdTAEiHaoE -DoCjjvbdEPDKjwDE -EPCkKvbdqUUGqqkU -EPDKjvbdtbcVXVoP -DnbjjvbdhbOcEvqR -EOcKjvbdCTAcUGWr -EPCkKvbdQdDApQcr -DnbjjvbdTfznLwWF -DnbkKvbdCDoaVjMf -EPCjjvbdBsBDUFvr -EPCkKvbdWWiXuceH -DoCjjvbdJcJcRJbx -DoDLKvbdsCGMlHKy -EPCjjvbdSBceLhyL -DoDKjvbdHffzZYYH -EPCkKvbdvAdZTOeI -DnbkKvbdxwhjBpZk -DncKjvbdOFDtIhjd -DoCjjvbdmpZxujxb -EOcKjvbdIryAsMwl -EPCkKvbdTqQnuUhN -DncKjvbdOSsvHEtp -EPDLKvbdZoOIdeZj -DnbkKvbdKeegbAqV -EPCjjvbdqFceUWAh -DnbkKvbdCWzchdpW -EPCkKvbdzQnlhiwA -DoDLKvbdqdEiQNua -DncKjvbdddoRawCj -EPDLKvbdlYrrSxft -DnbkKvbdRWnECkgc -DncKjvbdGYuUaEYC -EPDLKvbdZsiIxcrn -DoCjjvbdJbibqJbx -EPDKjvbdGYtuBDxC -DnbjjvbdCEQAvKMf -EObjjvbdvAcyTPEh -DoCkKvbdxwhjBozL -DoDKjvbdNsTugFVQ -DoDKjvbdkHgLeemk -EOcLKvbdwWlBVaWV -EOcLKvbdrNZjYkgi -DnbkKvbdJYUBglRQ -DnbkKvbdjvWmdCXw -EObjjvbdmajXYPOV -DncKjvbdDihJuxKA -EPCjjvbdwzIGGYFS -DoDKjvbdMpYQvOHT -DncLKvbdbhljLFwY -EObjjvbdelevgMik -DnbjjvbddePSCWbj -DnbjjvbdKQydnenF -DnbkKvbdZQmEhmFR -DoDKjvbdjKFgimYS -EObjjvbdANIZSvyx -DoCjjvbdfHkWRnRH -EObkKvbddiiqutzn -EOcKjvbdqYnhHQdY -DoDKjvbdKCjDQjCx -DoDLKvbdjgflFfNk -EOcLKvbdtTRrxzEc -DnbkKvbduLwwBUAw -DncLKvbdkWXOEBxX -EPDKjvbdNxPVzcnU -EPCjjvbdUMVnaWOi -EObkKvbdZQmFImEq -DncLKvbdQvmdDMID -EObjjvbdGFjSNhsq -EOcLKvbdbAvFFpQX -DoCjjvbdkCkjqGuH -EPCkKvbdbLLeoNcA -DoDLKvbdemFwGmJk -EOcKjvbdVUMtFlWK -EPDLKvbdWXJXucdg -DncLKvbdqcdhpNua -DncLKvbdGYuUaDxC -EPCkKvbdGZUtaDwb -EOcLKvbdjuwODaxX -EOcKjvbdSKyFuHKs -EOcLKvbdNQYQvOHT -EPCkKvbdNGcQNPuL -EOcLKvbdPIAYZAZB -EObjjvbdMfcPlpVL -EPCjjvbdLAjflbXq -EPCjjvbdySmhmRbH -EPDKjvbdxsNhmSBg -EOcKjvbdZMSDsmkm -DoCjjvbdbAudfQQX -DoCjjvbdePErjtTr -DncKjvbdtkxXBUBX -DoCkKvbdqvokbiYq -DnbjjvbdMfbpMouL -DnbjjvbdijFhKNXr -DoDKjvbdhgJcZVjV -EPDKjvbdIHGzZYYH -DnbjjvbdNsTufeVQ -DnbjjvbdqlyixlIJ -EPDLKvbdmaivxPOV -DnbkKvbdmJDsptrB -DnbjjvbdQYmAGsSK -EOcKjvbdZjTIQHCG -EPDKjvbdqGDeTuaI -EOcLKvbdADSYJzIp -DncLKvbdeuzwoizs -EObjjvbdFyUuBEXb -DncLKvbdnUtykJqf -EPCjjvbdelfXGmKL -EOcKjvbdKCjDQjDY -DncKjvbdaaVeGPow -DncKjvbdqvolDJYq -DoCjjvbdDnbjkWbd -DoCjjvbdjlakyeHP -DoCkKvbdLZRJrztf -DncKjvbdZisIQHCG -EPDLKvbdZyDjNbkr -DnbkKvbdLAjfmBwq -EOcKjvbdtSqryZeD -EOcLKvbdIMBzmvqL -EObjjvbdiVZdvqtb -DoDLKvbdMgDPmQVL -EPDLKvbdMgCpNPtk -EObjjvbdKVuGDeHJ -EOcLKvbdjJehJlxS -EPCkKvbdhlEcmuDZ -DoDKjvbdHfgZyXwg -EPCjjvbdShyiqABM -EPDLKvbdMgColouL -EPDLKvbdVqmwadkc -EPCjjvbdnCKWwnmu -DncKjvbdRpUGjGEX -DoDKjvbdkWWnECYX -DnbjjvbdkMalZeGo -EOcKjvbdxUleRYkn -EObkKvbdFxtuBDxC -EObjjvbdnGdwlnGy -EObkKvbduaEYsOeI -EPCkKvbdyTOJMrBg -EObjjvbdDHMFgAzc -DnbjjvbdEOcKkXCd -EPDLKvbdBhjbLIfK -EPCkKvbdZtJJZETO -EOcLKvbdIwsagkqQ -DoCkKvbdZyDjNbkr -DnbjjvbdBsAbsfWr -DoCjjvbdeOeSjssr -EObkKvbdVUNUGMWK -DncLKvbdfMfWfmKL -DoCjjvbduaEZTOdh -DoCkKvbdZisIPgBf -DnbjjvbdVZHtZjoO -DoCjjvbdCWzchePv -EObjjvbdJmAEZfuB -EObjjvbdvvkaVaWV -DoCjjvbdiiegjNXr -DnbjjvbdcScLUEJa -DncLKvbdJXsbHlQp -EPCjjvbdrpWOjDVf -DoDLKvbdDnbjjwDE -DnbjjvbdxnShYSiD -DoCjjvbdqGEFUWBI -DoDKjvbdtSrTYzEc -EObkKvbdEPDLLWcE -DoDKjvbdKQzEnfOF -EPDLKvbdIwtBhMRQ -DoCjjvbdTvLojUBR -EPDLKvbdZyDimbkr -EPDLKvbdptTfrSKt -DncLKvbdkMbLyeHP -EOcKjvbdKfFhBaQu -EObjjvbdeEoRbXDK -EOcKjvbdHDjvJbJj -EObkKvbdEztQeLcJ -DncKjvbdUtMsfLuj -DnbjjvbdRXOECkgc -DncKjvbdLAjfmBxR -EOcLKvbdsPvPJcVf -EPCjjvbdygYlAMdw -DnbjjvbdmuVZkKRf -EPCkKvbdSZigrcWA -DncLKvbdcJMikGWx -EOcKjvbdGLErcHlu -DoDKjvbdKNADygUa -EPDLKvbdMfbolpUk -DoDLKvbdUxhTyjoO -EPCkKvbdMtrqjmAX -EPDLKvbdLBLGmBxR -DoCjjvbdrzMQTAgn -EPDLKvbdUxhTykPO -DnbkKvbdnVUzLJqf -DoCkKvbdLYpirztf -EPDLKvbdFejSOItR -DncLKvbdvlvANDeN -DncLKvbdwtleRYkn -EObkKvbdcJNKLFvx -EPCjjvbdYSkaNTnx -EOcLKvbdSxKlNzjx -DnbjjvbdHbMZdzAD -EPCjjvbdXnRAXuVt -DoDKjvbdQmYBxnUz -DoCkKvbdWSOYCEkc -DnbkKvbdemGXGlik -EObjjvbdNeDsiJLE -DoCkKvbdbiMijfXY -EPCjjvbdmIdTptrB -DoCjjvbdEztQeMDJ -DncLKvbdCIjbLIfK -EPCjjvbdhkeENuDZ -DoCkKvbdAMgxsWzY -DoCjjvbdiZtelQnG -EOcKjvbdWXJXuceH -EOcLKvbdZRMeJMeR -EPCkKvbdiVZdvquC -DoDLKvbdkVvmdCXw -EObjjvbdnHExMmgZ -EPDKjvbdHgHZyYYH -EPDKjvbdRbEFMJYk -EPCkKvbdvBEZSndh -DnbkKvbdcScLTdJa -DoDLKvbdcJMijfXY -DnbjjvbddndrjstS -EPDLKvbdbiNJjevx -DnbkKvbdOSsvGduQ -DoDKjvbdMowpvNfs -DoCkKvbdZjSgpGaf -DnbkKvbdddnqawDK -DoDLKvbdKaLGmCYR -DoCjjvbdmuVZkKSG -EOcKjvbdZQldiMdq -EObjjvbdRNXayOUz -DncLKvbdeuzxQJzs -DncLKvbdEOcKkXCd -DncKjvbdhtyeXSUb -DnbjjvbdEObjkXDE -DncLKvbdKQyePGNe -EOcLKvbdHgGzZXwg -EObkKvbdrMzJxlIJ -EObkKvbdRXNdClHc -DoDLKvbdwzIFexEr -EPDKjvbdJYUCIMQp -DnbkKvbdhbOcFWqR -EOcKjvbdnGdxMmgZ -EObjjvbddeOqawCj -EPCjjvbdqTsgSSKt -DncKjvbdJXtBhLqQ -DoDLKvbdatagYKsh -EOcKjvbdjEkHUoAO -DncKjvbdLFfICBRV -DnbkKvbdKQydoFme -EPDKjvbdhlFEOVCy -EPCkKvbdZxdJmblS -EPDKjvbdJbjCqKCx -DncKjvbdwNWANDdm -EPDLKvbdpyPHfqDx -EPCjjvbdOTTufeVQ -EPCkKvbdtbbtvvOo -DoCjjvbdbBWEfQQX -EObjjvbdKNAEZgVB -DnbjjvbdJXtBgkqQ -EPCjjvbdGYtuBEXb -DoDLKvbdZjShQGaf -DoDLKvbdQmYCYnUz -EOcLKvbdpedFTvAh -EObjjvbdKQydoGNe -EPCkKvbdKDJcRKDY -EObkKvbdrafMkfkZ -EObkKvbdiCObdwRR -EPCjjvbddBsMrAUN -DoDKjvbdWIXvXgYz -DoDKjvbdkClKpftg -EOcKjvbdkCkjpftg -EOcLKvbdVrOYBeLc -EObkKvbdmoyxukZC -EPCjjvbddZyQXyRC -DoCkKvbdhbPCdvqR -DoCkKvbdJvUeceGi -EOcLKvbdVqnXaeMD -DoCkKvbdWWhxVceH -EPDKjvbdiGjDZVjV -EObjjvbdGAnpxizm -DoCjjvbdiZuFlQnG -EOcKjvbdTqRPVVIN -EPCjjvbdqdEhomvB -DoCkKvbdLAkHMaxR -EPDLKvbdOEdThiKd -DnbkKvbdkxrrTZGt -EOcLKvbdEPDLLXCd -DoDLKvbdTIzKRAAl -EPDLKvbdSCDeLiZL -EPCkKvbdpyOgfpdY -EPCjjvbdtkwwBTaX -EPDKjvbdiBoCeWqR -DoCjjvbdhgJbxujV -DoDLKvbdqdEhpNvB -EOcKjvbdkCkjqGuH -EPCjjvbdhbObeXQq -EOcKjvbdxsOImRbH -DoCjjvbdKWVFceHJ -DoDKjvbdBiKbKiGK -EPDKjvbdnGeXmNgZ -EPDKjvbdiifHjNYS -EOcKjvbdauBgXjsh -DnbkKvbdUtMsfLvK -DncKjvbdNrtVgEuQ -EPDLKvbdUsmUGLvK -EOcLKvbdNGcQMpVL -EPCkKvbdqmZjZLhJ -EObkKvbdFfKSOJUR -DncKjvbdhaoCeXRR -DoCkKvbdmfdwlnGy -EPCjjvbdjbkjqGuH -DoDKjvbdlqyVZsEJ -DnbjjvbdWWiYVcdg -EOcKjvbdeATqMwjG -EOcKjvbdqUTgSSKt -DncKjvbdqwQMDJZR -EPCkKvbdsQVoJbuf -DoCjjvbdVTmUFlVj -DoDKjvbdmajWxPOV -EOcKjvbdUQpoUthN -DoDKjvbdwMvAMdEm -EPDLKvbdDnbkLXDE -DncLKvbdFfKSNiTq -DncKjvbdIryBSlwl -DoDKjvbdmgEwlmfy -DncKjvbdqwPkbhyR -DncLKvbdNeETiJKd -EObjjvbdDoCjkXCd -EObkKvbdjgflFfNk -DncLKvbdxsNhlrCH -DoCjjvbdeFOrCWbj -EObjjvbdkNBkzFHP -DoCjjvbdxrmiNSCH -EOcLKvbdVwJXvDeH -EPCkKvbdZRMdhmEq -EObjjvbdjSzhsKiz -DoCkKvbdqdEiQOVa -EOcLKvbdpaJFAWhE -EPDLKvbdRkYfVGjs -DncKjvbdMpXqWNgT -EOcLKvbdVYhUZkPO -DoCjjvbdUxhTyjnn -DoCkKvbdOYOuzcmt -DoDKjvbdZLqdUNlN -DoDLKvbdJSyBTMxM -DoDLKvbdYORAXtut -DncKjvbdHffzYxXg -DncLKvbdmpZyVjyC -EOcKjvbdmfeXlnGy -DoDLKvbdkHfkeenL -DoDLKvbdJTZBSmYM -EObkKvbdrMzKZMHi -DncLKvbdiLeDmuCy -DoDKjvbdjvXNcbYX -DnbkKvbdrJAJeMne -DoDLKvbdvlvAMdFN -EPCjjvbdZLrDsmlN -DnbjjvbdaaVdfPpX -EObkKvbdrbFlkfjy -DoDKjvbdGLErbhNV -DoCjjvbdCIkCKhfK -DnbjjvbdeEoSBwDK -DncLKvbdirziSjiz -EPDKjvbdwzIGGYEr -DncKjvbdbVCGwkTh -EObkKvbdakMFnmcA -DnbkKvbdRpUHKFdX -DoDLKvbdMSWlytpz -DncLKvbdpssgRrKt -EPCjjvbdZRMeImEq -DoCjjvbdqrVKmjaN -EObjjvbdjAQGaPfj -DoDLKvbdyqOmJJwA -DnbjjvbdQccApRES -DoDLKvbdIsYaSmXl -EPCjjvbdrovPKDWG -EPDLKvbdqdEhpOVa -DoCkKvbdVviYVdEg -DoCjjvbdqZPIGqEY -EPCkKvbdOTTvGeVQ -DoCkKvbdDncLLXCd -EObkKvbdvBEYsOeI -DoCjjvbdYORAYVVt -EOcLKvbdhgKCxuiu -DoDKjvbdddoRbWcK -EObkKvbdmoyyWKyC -EOcLKvbdyYJJbQZk -DnbjjvbdUyIUZkPO -DncKjvbdFyUuBDxC -DoCjjvbdnQZyVjyC -DoDLKvbdatbHYKsh -DoCjjvbdczYowxpb -DncLKvbdIsZAsMxM -EPDKjvbdGKeTChMu -DoCkKvbdptTgSRjt -EPDKjvbdMtrqjmAX -DncLKvbdKQzEoFme -EObjjvbdFxtuAcxC -DncKjvbdkDLkRHVH -EPCkKvbdunszqKnt -DoCkKvbdezuxeJTw -EObkKvbdzjVQQDsU -EPDLKvbdjKGIKMxS -DoCjjvbdcyyQXxqC -EObkKvbdhtydwRtb -DnbjjvbdfNGXHNKL -DoDKjvbdmoyxujxb -DncLKvbdmuVZkJqf -EObkKvbdZyDjNbkr -DnbkKvbdyXhiaozL -EObkKvbdKWUfDeHJ -DoCkKvbddoFTLUUS -DnbjjvbdJvUfEFHJ -EObjjvbdsrqrxzFD -EObjjvbdmgFYMmfy -DnbjjvbdbrcLTcjB -EPDKjvbdZtIiZETO -DncKjvbdSLZGVHLT -EObjjvbdhtzFXSVC -EOcKjvbdvAcxsPEh -EOcKjvbdbrbjsdKB -DoDKjvbdezuxdiTw -DoDKjvbdhkdcnVDZ -DoCkKvbdNddUJIkE -DnbjjvbdsCGMlGjy -EOcKjvbdssSSxydc -DoCjjvbdSPtHJfDw -DoDLKvbdmRyVZrdJ -EOcLKvbdBdQBVjNG -EPCjjvbdtvOXipsA -EOcLKvbdDwwlUUUM -EObkKvbdhkeENuDZ -EOcKjvbdwygfGYEr -DncKjvbdbsCkUEJa -DnbkKvbdvlvAMceN -EPDKjvbdTvMPitAq -EPDLKvbdMowpvOHT -EOcKjvbdNQXpvNgT -DncKjvbdYzcFqiuy -EObjjvbdqUUGrRjt -EOcKjvbdUaBqTRSZ -DnbjjvbdrafMkfjy -DncLKvbdmgFXmNfy -DncKjvbdNrtVfdtp -EOcKjvbdVZITyjoO -EPDKjvbdTukpJtBR -DoDLKvbdyOTHxTIc -DnbjjvbdsBfNLfkZ -EPCjjvbdmJDtRVSB -EObjjvbdmJDtRUrB -DnbjjvbdiVZeWrVC -DncKjvbdBiKajhfK -DnbkKvbdziuQPcsU -EOcKjvbdGFiqnJTq -DoCjjvbdAMhZTXZx -DncLKvbdDjHiuwjA -DnbkKvbdBdQBVjNG -EPCjjvbdqlzKYkgi -DncLKvbdLLBIWAJy -DncLKvbdbhljKfXY -DncKjvbdaogHELzd -DnbkKvbdjEkGtoAO -DnbjjvbdGdKvJbKK -EPDLKvbdqrUjnKaN -EObjjvbdnVUykKSG -EPDKjvbdVrNwbFMD -DoDKjvbdvlvAMdEm -EPCjjvbdaaWEeopX -EPDLKvbdULuoBVoJ -EPDLKvbdzjUpPcsU -EPDKjvbdZnnJEdyj -EPDKjvbdtlXwAsaX -EPCjjvbdjJfHimXr -EPCkKvbdxwiKBpZk -DoCkKvbdLiBlQxAS -EObkKvbdXFxytAOs -EObjjvbdnQZxukYb -DncKjvbdZxcjNcMS -DnbkKvbdQcbaQQcr -EObkKvbdVgxVwgYz -DoDLKvbddoEsLUUS -EOcKjvbdTppnttgm -DoDKjvbdBhkBjhej -EPCkKvbdlhcsqVRa -DoDKjvbdZshiYcsO -DoDKjvbdtcDUvvPP -DnbkKvbdRkZFuGjs -DoCkKvbdaaVeFopX -EObkKvbdYORAXtut -DncLKvbdqwPlDJYq -DoDLKvbdbBWEepPw -DnbkKvbdVvhxWDdg -EObkKvbdfHkVqmpg -DncKjvbdaMjartmH -EPCkKvbdBhjbLIej -DoCjjvbdCIjbKiFj -DoDKjvbdkIHLefOL -EOcKjvbdrbGMlGkZ -DncLKvbdPxmAGsRj -EOcKjvbdZxdKODMS -DncKjvbdkDLjqHUg -EOcLKvbdjEkHUoAO -DoDLKvbdrovOjDVf -DncLKvbdZshiZESn -DncKjvbdUyIUZjnn -EPDLKvbdxmrhYSiD -DoCjjvbdaNKasUlg -DnbkKvbdYqMeJMdq -DncKjvbdZoOIeEyj -EOcKjvbdemGXGlik -EObjjvbdyzdnRhIh -DncKjvbdHEKvJbJj -EObkKvbdSCDdlIxk -EPCjjvbdGAoQxizm -DoCjjvbdaNKasVMg -EObkKvbdePErkTtS -EPCjjvbdlhdUQuSB -EPDKjvbdNQXpvOGs -DoCkKvbdXnRAYUut -EObkKvbdcTCkUEKB -DncLKvbdmRyUzSdJ -EPDLKvbdrSVLNkAm -DoCkKvbdJvUecdgJ -DoDLKvbdRDbaQRDr -EPDKjvbdYlSETmlN -EPCkKvbdbUagYKtI -EPCjjvbdssRrxzFD -EPCjjvbdRMwbYmtz -DnbjjvbdxrmhmRag -DoDKjvbdTvLpJtAq -EPDKjvbdVBBprprZ -DnbkKvbdRkYeuGkT -EOcKjvbdmbKWwoOV -EOcKjvbdZeYGzghb -EPCjjvbdFeirOJUR -DoCkKvbdZsiIxcrn -EPDKjvbdDnbkKvcE -DoDLKvbdsrrTZZeD -DncKjvbdJbjCpicY -DnbjjvbdcyxpXxpb -EPCjjvbdrXQLbhxq -DncKjvbdzROmJJwA -DoDKjvbdqdFIpNvB -EPDKjvbdkHfkfGNk -DoDKjvbdFjdsDINV -DoDKjvbdUyITyjoO -EOcLKvbdiUzEwRtb -EPCkKvbdmfeYMmgZ -DncLKvbdHgGyyXxH -EObkKvbdMuTSLNAX -DncKjvbdtbcUwWOo -DoCjjvbdVwIxWEFH -EOcKjvbdhgJcZWKV -DoCjjvbdsCFllHLZ -EPDKjvbdGcjvJbKK -EOcLKvbdnGeYNNfy -DncKjvbdZnnIeFZj -DoDKjvbdxUldqZLn -EOcKjvbdrovOibvG -DoDKjvbdUWLpKTaR -DncKjvbdePFTKtTr -EPDLKvbdFxtuAdYC -DoDLKvbdfIKvRnQg -EPDLKvbdypnmIjXA -DncKjvbdbUagYLUI -EPDKjvbdnVUyjiqf -EObkKvbdKWVGDeGi -EObkKvbdaNKbSuMg -DoDKjvbdNVSqkNAX -EObkKvbdhbPDFWqR -DoDLKvbdLGFhBaRV -EOcKjvbdbrcLUDjB -EObjjvbdZHXEAPTJ -EPCjjvbdCSaDTevr -DncLKvbdgQBzvcxI -EObjjvbdidjfuPAO -DoDLKvbdzjUoodTU -DncKjvbdGLEsChNV -EPCjjvbdNeDshiLE -EObjjvbdGGKRnIsq -EObkKvbdeYZtTqez -EOcKjvbdQwODblHc -DoCkKvbdkClLRHVH -EPCkKvbdxUldqYkn -EPCkKvbdvBDxsPFI -DnbkKvbdqvpLcIyR -DncKjvbdqmZixkhJ -DoDLKvbdkVwNdCYX -EObkKvbdUxgsykPO -EPCkKvbdjcLjpgUg -DnbjjvbdbUagYKtI -EObjjvbdDjHjWXjA -EObjjvbdrykpSaIO -EObjjvbdrbGMlGjy -DncLKvbdVYhUZjnn -DoDLKvbdjlakydfo -DnbkKvbdVTmUGMVj -EObjjvbdZjTIQHCG -EOcLKvbdZxcjNcLr -DoCkKvbdqTsgSRjt -DnbjjvbdCIkBkJFj -EPCkKvbdaogHELzd -EPCjjvbdNPxQunGs -EObjjvbdxZhFfXeS -DoDKjvbdjblKqHUg -EObkKvbdNPxRWNgT -DoDKjvbdkaNOmALA -EPDLKvbdxsOImSCH -EOcLKvbdZshhyETO -EPDLKvbdIHHZyYYH -DoDKjvbdliEURVRa -EObjjvbdiVZeXRtb -EOcKjvbdiHJcYvJu -EOcKjvbdIsYaTNXl -DoCkKvbdtlXvaTaX -EOcKjvbdNQYRVnHT -DoDKjvbddjJqvUzn -DoDKjvbdULuoBVoJ -DoDLKvbdUslselVj -EPCkKvbddePSCWbj -EPDKjvbdNeDtIiKd -EOcKjvbdiUzFXSUb -DoCkKvbdmRyVZsEJ -EPCjjvbduLwwAtBX -EPDLKvbdxZgfGXdr -DnbkKvbdBcpAujNG -DnbjjvbdZtJIyDrn -EObjjvbdmbJvwnmu -EPCjjvbdXnRAYVWU -EOcLKvbdyOShXsJD -DoCjjvbdptUGqqkU -DnbkKvbdFpASwHGZ -DnbkKvbdwtleRYlO -EPCkKvbdnHFYMmfy -EPDKjvbdKCjDQjDY -EObkKvbdeqaWzlDP -DoCkKvbdbLMGPODA -DoCjjvbdpyPIGqDx -EOcKjvbdbhmKLFwY -DoDLKvbdEOcKjwCd -EPCkKvbdePFTKtUS -EPCkKvbdtvNwipsA -EPCkKvbdzoQQdblY -EOcLKvbdKjaHvAJy -EPDKjvbdvPTzpkOt -EPDKjvbdMJCLpxAS -EObkKvbdWWhwvEEg -DnbkKvbdcJNJjevx -DoCkKvbdNQXpunGs -EPDKjvbdWSNxBdlD -EPDKjvbdwyhFeweS -DncKjvbdddnrCWcK -EObjjvbdeKJrVtzn -EObjjvbdrykosBIO -EPDKjvbdiiehKMxS -DncKjvbdrWpMCiZR -DoCjjvbddoFSjssr -DoCjjvbdbhmKKfWx -EObjjvbdmajWwoNu -EOcLKvbdDxYLstUM -EPCjjvbdddoRawDK -DncKjvbdmuUzKjSG -DoDKjvbdLFegbBRV -EPCkKvbdySnJMqbH -DnbjjvbdLLAgvAKZ -EPCjjvbdraemMHLZ -EObjjvbdnUtzLKSG -EPDKjvbdkDMLQgVH -DoDKjvbdkHgMGGOL -DoCjjvbdxsNiNSCH -EObkKvbdNQXpvOHT -EObkKvbdQwNdDLgc -DnbjjvbdegkWRnRH -DnbkKvbdGZUuAcwb -DncLKvbdiMEcmuCy -DoDLKvbdFfJqnJTq -DoDKjvbdZnnJFEzK -EOcLKvbdTqRPUtgm -EOcLKvbdRjyFuHLT -EOcKjvbdhtzEwRtb -EObjjvbdTXjkmzjx -DoDKjvbdqdFJQOVa -DoCkKvbdGckViajK -DncLKvbdDxXlUTsl -EOcLKvbdeUAUASlv -DnbkKvbdzjUpQETU -DnbkKvbdtcCuWuoP -DncLKvbdauBgXkUI -DoCjjvbdUVlPitBR -DnbkKvbdFfJrOItR -DoDLKvbdxnSgwsJD -EPCkKvbdXsMBNToY -DncLKvbdCTAcUFwS -DoDKjvbdhgJbxvJu -DoDLKvbdhkeDnUby -EObkKvbdEvZPpNKF -EPCjjvbdiHJcZWJu -EObjjvbdIHHZyYXg -DoCkKvbdegkVqmqH -DoCjjvbdxVNFRZMO -DoDLKvbdUQpntuIN -DoDKjvbdEJhJuwjA -DoDKjvbdkHflGGNk -DnbkKvbdmttykKRf -DncLKvbdZxdJmblS -DnbjjvbdZQmEhmEq -DoCjjvbdJcJcQjDY -DoDKjvbdBhkCLIej -DoDLKvbdmIcspuRa -DnbjjvbdqiAKElne -DoCjjvbdJpzEoFnF -EOcKjvbdyOShYTJD -DoCkKvbdmuVZjiqf -DoDLKvbdSCDeLhyL -EOcKjvbdJvUedFGi -EObkKvbdehLWRnRH -EPDKjvbdxmrhXriD -DoDLKvbdOTUWGeVQ -EPCjjvbdzRPMhiwA -EPDKjvbdKRZePGOF -DoCkKvbdrDeIomvB -EPDKjvbdkVvmdBww -DoDKjvbdIGfzYwwg -EPDLKvbdFVyPpNKF -DoDKjvbdhytfLqNf -DnbjjvbdMfbomQUk -EOcLKvbdtcDVXWOo -DoDKjvbdqwPlDJYq -EOcLKvbdZshiZETO -EOcLKvbdeEnrCXCj -EOcKjvbdZLrDsnLm -EPCjjvbdLYqKSzuG -DncLKvbdMtsRjmAX -DoCjjvbdJTZArlxM -EPCkKvbdlZSrTZGt -DncKjvbdRyjITCvA -DoCjjvbdEuxpPmKF -DnbkKvbdTYKkmzjx -DoDLKvbduDDVXWPP -DncLKvbdjAPfaPgK -DncLKvbdrEFJPnVa -EPCjjvbdrXQMChyR -DnbkKvbdznpQeDLx -DoCkKvbdjgflFfOL -EObjjvbdjlalZdgP -DoCjjvbdtbcUvvOo -DoCkKvbdrEFIonWB -EObjjvbdwXMAvAuu -DncLKvbdePFSkUTr -EPCkKvbdTppoUuIN -EPDKjvbdIxUCHlQp -DnbkKvbdBiLBjiGK -DoDKjvbdliDspuRa -EObjjvbdFkFTDIMu -EPCjjvbdsQVnjDVf -EPCjjvbdKefIBaRV -DoDKjvbdIryAsNYM -DoCkKvbdsrqrxzEc -EPCjjvbdLqwNZuQz -EOcLKvbdcIlikGXY -DoCjjvbdADSXizIp -DoCkKvbduaEZTOeI -DncKjvbdvBDyTPEh -EPCkKvbdRkZFuHKs -DoDLKvbdSLZFuGkT -EOcLKvbdfekzOHHA -EOcLKvbdkaMoNALA -DncLKvbdkNCMZeGo -EObjjvbdNsUVfduQ -EPCjjvbdZoNiEeZj -DoDLKvbdLYpirzuG -EPDKjvbdmoyxujyC -DoCkKvbdaMjbSuNH -EPDLKvbdxxIjCPzL -DnbkKvbdVAaqSprZ -DoCjjvbduVmxJqTA -DoCkKvbdRkZGVHLT -DoDKjvbdEuyQPljF -DnbkKvbdptUHSRkU -DncLKvbduLxWaUAw -EObjjvbdaaVdfQQX -EPDLKvbdWWiYVdFH -EOcLKvbdfelZmgHA -DoCjjvbdADRxKZiQ -EOcKjvbdfHkWSORH -EObkKvbdTAEiIBoE -DncKjvbdEKIKVxKA -DoCkKvbdkDMKpgVH -DnbkKvbdCWzciEpW -EObjjvbdxZgefXeS -EOcLKvbdsZkpTBIO -DoDLKvbdrJAKFMne -EPDKjvbdkWXNdBww -DnbkKvbdRbEFLhyL -DncLKvbdWXJYWDeH -EOcLKvbdijFgjMwr -DoDLKvbdnHExMnGy -EObkKvbdZeYGzhJC -DnbjjvbdEvZPpMie -EObjjvbdYpldiMdq -DoCjjvbdfRaWzlCo -EPCjjvbdGYtuBDxC -EOcLKvbdQYmAGrrK -EPCkKvbdlhcspuSB -DoDLKvbdezvZFIsw -EOcKjvbdlYsSTZHU -DnbkKvbdmfeXmOGy -DncLKvbdKDKDQicY -DncKjvbdZjTIQHCG -DnbkKvbdgFkzOHHA -DnbkKvbdaNLBsVNH -DoCjjvbdBsBCtGWr -DncKjvbdqdFIomvB -DnbkKvbdkNBlZdfo -DnbkKvbdSQTgKGDw -DoCkKvbddoFTLTsr -DoDKjvbdEYYLtTtM -EOcKjvbdVwJYWEEg -DoDLKvbdyOSgwrhc -DoCkKvbdZMRdUOLm -DoDLKvbdYSlBMtOx -EPCkKvbdkxsRsYft -DnbkKvbdrzLpTAgn -DncKjvbdRjxfUgKs -DnbkKvbdqquLNkAm -DoDLKvbdRMxCYnUz -EPCjjvbdZoOIdeZj -EObkKvbdrpWOicVf -EPDLKvbdkCkjqHVH -EOcKjvbdmSZUzSci -EObjjvbdRjxfUgLT -EObjjvbdNddThhjd -DoCjjvbdKVuFcdfi -EPDKjvbdzjVPodTU -DncKjvbdJTYaSmXl -DncKjvbddZyQXyQb -EPCjjvbdCIkCKiFj -EPDKjvbdTkunaWOi -EObjjvbdfIKuqnRH -DoCjjvbdZRMdiMeR -DnbjjvbdMpXpunHT -DoDLKvbdZRNEhmFR -EObjjvbdaoffdLzd -DoDLKvbdvAdYsOdh -DnbjjvbdSLZGUgLT -DoCjjvbdSCDdkiZL -DoDLKvbdelewHNKL -DoCjjvbdRXNdDMHc -EObjjvbdkWWnDaww -EObjjvbdcyxoxZRC -DncKjvbdelfWfljL -EObjjvbdZnnJEdzK -EOcKjvbdkHflGFnL -DoCkKvbdhbPCdwRR -EPDLKvbdHDkWKCKK -DnbkKvbdRadEkiYk -EOcLKvbdFWYopNJe -DoDLKvbdqTsfrSKt -EObjjvbdxnSgxTJD -EPDLKvbdxZhFewdr -EPCkKvbdTvLojTaR -EObjjvbdfIKuqnQg -EPCjjvbdDxXlTssl -EObjjvbdQvmccLhD -EObkKvbdRNXayOUz -EPCjjvbdatbGxLTh -EOcKjvbdOSsvGeVQ -EPDKjvbdePFTKstS -DnbjjvbdlYsRsZHU -DnbjjvbdZisIQGaf -DoCkKvbdsrqsYzEc -EObjjvbdfILVqnRH -DnbkKvbdZHWdAPTJ -DoDLKvbdEPCkLXCd -EObjjvbdEXwktTsl -DncLKvbdFVyQPlie -DncKjvbdNsUWHEtp -EOcKjvbdyqOmJKXA -EOcKjvbdADSYJyhp -EPDKjvbdUyIUZjoO -EOcKjvbdmJEURVSB -DnbjjvbdIwtBgkpp -EPCjjvbdZQmEhldq -EPCkKvbdDjHiuxKA -DoDKjvbdrEEiQOVa -DncKjvbdKDKDQjCx -DncKjvbdZRNFJMeR -DncLKvbdwygeeweS -DncLKvbdnUuZkKSG -DoDKjvbdvwMAvBWV -DoCjjvbdBhkCLIfK -DnbjjvbdoznDkXoA -EOcKjvbdjgflFemk -EObkKvbdKVtfDdgJ -DnbjjvbdXrkaNUPY -DncKjvbdhlEdNtby -EPDKjvbdemGWfmJk -DoDLKvbdlhctQtrB -EObjjvbdnVVZkJqf -EObjjvbdwuNEpyMO -DoCjjvbdTpqOuVHm -EObjjvbdbLLennDA -DoDLKvbdiGjDZWKV -EPDLKvbdFjeTDHlu -DoDLKvbdDxYLstUM -EPDLKvbdiUzFXSVC -DncKjvbdJYTbHkpp -DoCkKvbdZshhxdSn -EPDKjvbdxrnIlqag -EOcLKvbdiHJcYvJu -DnbjjvbdkVwNcaxX -EObjjvbdpyPIGpcx -EPCkKvbdauCGxLUI -EObkKvbdWRnXadkc -DnbkKvbdVUNUGLvK -EObkKvbdDxYLsssl -DnbkKvbdCJKbKhfK -DncLKvbdbhmKKfXY -EOcLKvbdZoOIeFZj -DoDLKvbdkNCLzFHP -EObkKvbdpxnggQdY -EObkKvbdYqNFJNEq -EPCjjvbdyzdnSHhh -EOcKjvbdczZQYZQb -DncKjvbdZyDimblS -DncLKvbdyOTIXrhc -EObjjvbdhzUelQnG -EObjjvbdFjeTChNV -DoCjjvbdwMvANEEm -DoDLKvbdRXOEDMID -DncKjvbdiHJcYvJu -EOcLKvbdhtzFWrVC -DncKjvbdVYgsykPO -DoCjjvbdGGKRmiUR -EPDLKvbdQmXbYnUz -DnbkKvbdkIGlFemk -DoCjjvbdSPsgJfDw -DncKjvbdzjVQPcrt -EPDKjvbdmfdxNNfy -EPDKjvbdZyDimblS -DoDKjvbdANIZSvzY -DoCkKvbdJqZdoGOF -EOcKjvbdcJMijewY -DncLKvbdNQXqWNfs -DncLKvbdkNBlZeGo -DoCjjvbdHffzZYXg -DoDKjvbdjhHMGGOL -DnbkKvbdiCObdvpq -DoDLKvbdYlRctNkm -EObkKvbdiUzEwRuC -DncLKvbdMfbomPuL -EPCkKvbdlZSrSyGt -DncLKvbdvAcxroFI -DoCjjvbdNGcQNQUk -DncKjvbdWSNxBeLc -EPCkKvbdqvokcIyR -DncLKvbddZyQXxqC -DoCkKvbdvPTzqLPU -DncLKvbdZxcjNblS -EPCjjvbdkMbLzFHP -EPCkKvbdlYrqsYgU -DnbjjvbdWSOXbFMD -DnbkKvbdWeyZtAPT -EPCkKvbdEKHivYKA -DoCkKvbdkNBkyeGo -DoDLKvbdiBoDEvqR -DoDLKvbdRkYfVGjs -EOcKjvbddneSkUTr -EObjjvbdFejRnItR -DncLKvbdLAjgMbXq -DnbkKvbdUGznLwVe -DoDKjvbdLqwNZtpz -EPDKjvbdUxhTyjnn -EPDLKvbdkNBkyeHP -DoCjjvbdgFkzNgHA -EObjjvbdunszpjnt -EPCkKvbdtAHQhABS -DnbjjvbdbKkfOnDA -DoCjjvbdVviYWEFH -DoCjjvbdGZUuAdXb -EObjjvbdhlFDmuCy -DncLKvbdyfyMAMdw -EObjjvbdFyUtaDxC -DnbkKvbdeEoSCXDK -EOcKjvbdbVCGwjtI -EOcLKvbdTAEhgand -EObkKvbdRpUHJecw -DnbjjvbdZsiJZDrn -DncLKvbdtSqrxyeD -DoDKjvbdJSxaSmYM -EPCkKvbdjuvnECYX -DoDLKvbdrMyjYkgi -DnbkKvbdjJegjNXr -DoDLKvbduaDxsOdh -DoDLKvbdmIcsptrB -EObkKvbdFkFTDHmV -DnbjjvbdYORAYVVt -DncLKvbdddoRbWcK -EPDLKvbdLrWmZuQz -DoDLKvbdliETpuRa -DoCjjvbdbrcKsdKB -DoCkKvbdHkazmvpk -EPCjjvbdUaBpsRRy -EObkKvbdKfFhBaQu -DoCkKvbdKQydnfNe -EOcLKvbdDjIKVxKA -DncKjvbdpeceUWBI -DncLKvbdKaLHNBxR -EPDLKvbdptTfrRkU -EPDKjvbddndsLTtS -EObjjvbdMpXpvOHT -DnbkKvbdaMjaruNH -DoCkKvbdpecdtVaI -DncLKvbdRpTfjGEX -EObkKvbdCSaCsevr -DoCkKvbdnHEwmNgZ -EObjjvbdfHjuqmqH -DoDKjvbdKWVGDeGi -DoDLKvbdWHxVxHYz -DnbjjvbdXsLaMsnx -EPDLKvbdDjHiuwjA -DnbjjvbdaaWFGQQX -DnbjjvbdsrrTZZdc -DoCjjvbddneTKtUS -DoDKjvbdcJMjLFvx -DoDKjvbdaNKbTUlg -DnbjjvbdkHflFfOL -EObjjvbdJpzFOeme -DoCjjvbdrounibuf -DoCjjvbdHgHZxwxH -EOcLKvbdSKxeuGkT -EOcLKvbdzQoNJJwA -EObjjvbdZnnJEdzK -DoDLKvbdJuuFcdfi -DncKjvbdIryBSmYM -EObkKvbdyYJJaozL -EObjjvbdFkEsDHmV -DnbkKvbdfMfXHMjL -DnbkKvbdLGGIBaRV -EOcLKvbdRXNdDMHc -DoDKjvbdegjvRnRH -DnbkKvbdKeegaaQu -DnbjjvbdkMakzEgP -DoDKjvbdcTDKtEKB -DncLKvbdhaoDEvqR -DncLKvbdmgEwmNfy -EPDKjvbdCIjbLIfK -DncLKvbdJvUedEgJ -DoCjjvbdFVxpPljF -EOcLKvbdJYUCIMRQ -EPDKjvbddwyssrFz -DoDKjvbdiMEdOUcZ -DoDKjvbdZQleIldq -EPCkKvbdnQZyVkYb -DoCjjvbdNGbpNPuL -DoCkKvbdOStVgFVQ -EOcKjvbdGBPQxizm -DnbjjvbdOXoVzcnU -DncKjvbdyqPNIiwA -DoDLKvbdkIGlGGNk -EPDKjvbdbiNKLFvx -DoCkKvbdCTBCsfWr -DoDKjvbdShyjRABM -EPCjjvbdxwhjBozL -DoCkKvbdqUUHSSLU -DoDKjvbdbBVdfPow -DoCkKvbdqYnggRDx -DoCkKvbdtkwwAsaX -EPDLKvbdZMSDsnMN -EPDLKvbdZjTIQGbG -EPCjjvbdzoPpdblY -EPDKjvbdVviYWEFH -DnbjjvbdUsltGLuj -DoCkKvbdQdDAopcr -EPDKjvbdZxcjNbkr -EPCjjvbdZisHpGbG -EPDKjvbdEuxpPmKF -EOcKjvbdQwNccLgc -EPCjjvbdEYYLstUM -EObkKvbdZRNEhmEq -DoDKjvbdaRfDIUGL -DncKjvbduaDxsOeI -EObkKvbdmaiwYPOV -EOcKjvbdKDJbqJbx -DoDKjvbdQvnEDLgc -DnbkKvbdtlXvaTaX -EPDKjvbdzQoNIiwA -EOcLKvbdNeDsiIjd -DnbkKvbdBdQAvJlf -DoCkKvbdhzVGMROG -EPDLKvbdUaCQsRRy -EOcLKvbdZisHogCG -DoCkKvbdlqxtzTDi -DoCjjvbdRkZGUgKs -EObkKvbdZnmhdeZj -EOcLKvbdZjTHogBf -DncLKvbdhytfLqNf -EPCkKvbdnPyxvKxb -DncLKvbdjcMKqHVH -EPCkKvbduWNwjRTA -DnbkKvbdwygfGXeS -EObjjvbdTlWOaVoJ -EPCjjvbdUtNUGLvK -EObkKvbdKkAgvAKZ -EObkKvbdaMkCTUmH -EPDKjvbdOFDshhjd -EPDLKvbdhzUfLpmf -EPCkKvbdkySrTYgU -EOcLKvbdFfKSNhsq -DncKjvbdOAJTUKSA -EPDLKvbdrDeJPmvB -EPCkKvbdKRZdnfNe -EPCjjvbdRDcAoqDr -EOcKjvbdNHDQNPtk -EOcLKvbdVTmTfMVj -EOcKjvbdrXQMChyR -DoCjjvbdZQmFJNEq -EPCkKvbdWRmwadkc -EObkKvbdSCDeLhyL -DncKjvbdyNsHxTJD -EPDKjvbdtSrTYydc -DoDLKvbdiGjCxuiu -DoCkKvbdrNZjZLgi -EPDLKvbdJmADzGuB -DncLKvbdtcCuWuno -DnbjjvbdDxXktTtM -EPCjjvbddZyPxZQb -EPDLKvbdlqxtysDi -DoDLKvbdbAueGPpX -EObjjvbdVviXvDdg -EPDKjvbdBdQAvKMf -DnbkKvbdPxmAHSqj -DoDLKvbdUsltFlWK -DncKjvbdVhYWYHYz -DoDKjvbddwzTtSFz -DncLKvbdIGfzYwwg -EPCjjvbdmJDsqUrB -EPCkKvbdGQASwGey -EOcLKvbdTlWOaVoJ -DncLKvbdLFehCBRV -DnbjjvbdTkvOaVoJ -EPCkKvbdwXMAvBWV -EObjjvbdpxnhGqDx -EOcLKvbdsrqryZeD -DoDLKvbduVnXjQsA -DncLKvbdRotHKFdX -EOcKjvbdnUtyjirG -EOcKjvbdCJLCLJFj -EOcLKvbdSCEFLiYk -DoDLKvbdjcMLQgVH -DoCkKvbdLBLGlaxR -EObkKvbdZQldiNFR -EOcLKvbduMXwAsaX -DncKjvbdxrnIlrBg -EObkKvbdehKvRnRH -DoDLKvbdRosfiecw -DoCkKvbdFjdrcINV -EPCjjvbdkWWmdBxX -DnbjjvbdFkFTDHlu -DoCjjvbdTAEhgaoE -DoDKjvbdANIZTWyx -EObkKvbdJSyAsNYM -EPDLKvbdqTtHRqkU -EPDKjvbdbBVeFoow -EPCkKvbdYSkaMsoY -DncLKvbdDnbkKwDE -DncKjvbdMSWlzUpz -DncKjvbdauCHXjsh -DoCjjvbdTvMQKUBR -DoDLKvbdrRuLOLAm -EOcKjvbdatbGxKtI -DncLKvbdNGcQMotk -EPDKjvbdiCObeWqR -DoDKjvbduDDUwVno -DncLKvbdYlRcsmkm -DncKjvbdbAueFoow -EObkKvbdYTMBNToY -DncKjvbdvAdYsPEh -EObjjvbdBdQBWKMf -DnbkKvbduCbuWuno -EOcLKvbdKWVGEFHJ -EObkKvbdcyyQXxqC -DnbkKvbdaMjasUmH -EPCkKvbdmgEwlmfy -DoDLKvbdrDdiQOVa -DoDKjvbdUyIUZjnn -DnbkKvbdnBjXYOnV -EOcKjvbdRpTgJfDw -DncKjvbdjcLjqGuH -DnbkKvbdZjTIQHCG -EOcKjvbduVnYKRTA -DnbkKvbdGckWJbKK -EObjjvbdZyEJnDMS -DncKjvbdNsUWGduQ -EObjjvbdKQzEoFme -EOcKjvbdVUMtGLvK -EPDKjvbdrJAKFMoF -DoCkKvbdNrsvHFVQ -DncLKvbdSKyGUfjs -DoCkKvbdVvhxWEFH -DncLKvbdFejRnIsq -EObjjvbdVYhUZkOn -DoCjjvbdxUmEpxkn -DoDLKvbdBiLCKhej -DoDKjvbdIjEAJofd -EOcKjvbdwzHfFwdr -DncKjvbdFjeTDHlu -DnbjjvbdbiMjKewY -DnbjjvbdaNLCTUlg -EObjjvbdDwxMUUTl -DoCkKvbdmttykKSG -EPDKjvbdiUyeXSVC -EPDLKvbdWIYVwfxz -EPDLKvbdemFvgMik -DoCkKvbdUyHszKoO -EObkKvbdTXkMNzjx -DoDKjvbdSQTgKFdX -DnbjjvbdLiBkpxAS -EPCkKvbdRosgKGEX -DoCkKvbdmfdwmNgZ -DncLKvbdiHJbyViu -DncLKvbdxrnJMqbH -EOcKjvbdhlFENtcZ -DoCjjvbdbKkennDA -DnbkKvbdGckWKBjK -DnbjjvbdUyIUZkOn -EPDKjvbdeEnrCXDK -EOcKjvbdsBfMkgKy -DncKjvbdxsNiNSBg -EPDKjvbdkNCLzEgP -EPDKjvbdSKyGVGjs -DoDKjvbdrWolChyR -DncLKvbdWSNwaeLc -EOcKjvbdJYTbHkqQ -DnbjjvbdZshiZDsO -DoDKjvbdSKxfUfjs -EPCkKvbdptTgRrKt -EPCjjvbdREDApQdS -DncLKvbdtvOXjRTA -EPDKjvbdemGXGljL -EObjjvbdBdQAvJmG -EPDLKvbdhuZdwRuC -DncLKvbdjvWnDaxX -EPDLKvbdFVxopMie -EPCkKvbdajkeoNcA -EPCjjvbdSPsfifEX -DnbkKvbdBsAcTfWr -EPCjjvbdEOcLLWcE -DoCjjvbdZLrDsmlN -EPCkKvbdxnSgxTIc -EObjjvbdGQATXGey -EObkKvbdbsDLUEKB -DoCjjvbdrSVKmjaN -EPCkKvbddneTLUUS -DoCkKvbdxmrgwsJD -EPDKjvbdGYuVAdXb -DncLKvbdauBfxLTh -EPDLKvbdrMzKZLgi -EObkKvbdUsltGLvK -DnbjjvbdDxXlTstM -EObkKvbdsBfNLgLZ -DncKjvbdidjgUoAO -EPDLKvbdJJdAKQHE -EOcKjvbdbBWFFpQX -EPCjjvbdSZihTDWA -EPCkKvbdhgKCxuiu -DncKjvbddneTLUTr -DoDKjvbdczZPxZRC -DnbjjvbdlYrrTYft -DoDKjvbdWXJXvEEg -EPDLKvbdbhmJkFvx -EPCjjvbdDxYLtTsl -EPDKjvbdqdFIonVa -EObjjvbdCIjbLIej -DnbjjvbdmbKXXnmu -EPDKjvbdlZTSTYft -EPDKjvbdwXMBVaWV -DnbjjvbdSPtGjGEX -DoDKjvbdrMzKYlHi -EPCkKvbdiVZdwSVC -DnbjjvbdptUHSSKt -DncLKvbdcSbjscjB -DoDKjvbdSPsfiecw -EOcKjvbdegkVqnQg -EObkKvbdjuvmcbXw -DncKjvbdCJLCKhfK -EObjjvbdVqnYBeMD -DoCjjvbdKCjCqJcY -DncLKvbdZRMdhmEq -EOcKjvbdrRtkOKaN -DoDLKvbdRpTfiedX -DoCjjvbdRMwbZOUz -DoCjjvbdrXQMDIxq -EObjjvbdsrqsZZdc -DnbjjvbdfjfzbfAE -DoCkKvbdJSyBTMxM -EPDKjvbdnCJvwoNu -DoCjjvbdmbJvwoNu -DnbkKvbdFWZQPljF -DncLKvbdxnSgwriD -DnbjjvbdVvhwucdg -DoCjjvbdjgfkfFnL -DncLKvbdzRPMiKXA -EOcLKvbdqZPHgREY -EPCkKvbdrylPsAgn -EPCkKvbdVZITykPO -DoCjjvbdhkeEOVDZ -EOcKjvbdUVkpJtAq -EOcKjvbddCTMrAUN -EPDKjvbdZeXfzghb -EPCjjvbdiMFDmuDZ -EPCjjvbdJKEAJpHE -EOcLKvbdajkeoODA -DnbjjvbdZRNEhmFR -EOcLKvbdNHCpNQVL -EObjjvbdmRxtzSci -DoCjjvbdzRPMhjXA -DnbkKvbdnGdwmNfy -EObkKvbdvAcxsOeI -DoDLKvbdBsAcTevr -DoCkKvbdozmdKxPA -DnbkKvbdTlVoBVoJ -EPCkKvbdqwQLcIxq -DncLKvbdbiMjLGWx -DoDLKvbdfHkWRnRH -EOcKjvbdbVCGxKsh -DoCjjvbdTqRPUthN -DoCkKvbdbQGgELzd -EOcLKvbdQZNAHSrK -DoDLKvbdZyDjNbkr -EPCjjvbdqiAJdmOe -EObkKvbdKaLHNBxR -DncKjvbdyXhjBozL -EObjjvbdDjIKWYKA -EOcKjvbdLFegaaQu -EPDKjvbdZjTIPgCG -EOcLKvbdfHjuqnQg -DnbjjvbdlhcsqVRa -DoCjjvbdMuSqkNAX -DncLKvbdCIkBkIej -DncKjvbdUaCQsQqy -EObjjvbdRbDdkhyL -EOcKjvbdpssfrRkU -EOcKjvbdLGFhBaQu -EPCkKvbdqqtjnLBN -EOcLKvbdWRmwbEkc -EObjjvbdpedFTuaI -DoCkKvbdJJdAJofd -DoDLKvbdwNWANEEm -EPCkKvbdYgWdAOri -DoDLKvbdvAcyTOeI -DnbkKvbdbhmJjfWx -EOcLKvbdypnliKXA -EOcKjvbdZyEJnClS -DoCjjvbdZoNhdeZj -EPCkKvbdkDLkRGtg -EObjjvbdNsUWGdtp -DnbjjvbdZQldhmFR -EOcKjvbdYpmEhldq -EPCkKvbdZQmEiMeR -DnbjjvbdhytfLpnG -EObjjvbdmtuZkJrG -EObjjvbdGLEsDINV -EPCjjvbdVhXvYHYz -DoDLKvbdKefICAqV -DncKjvbdUtMsfLvK -EOcLKvbduaEZTOeI -EPDKjvbdddoSBwDK -DoCkKvbdffLymgHA -DnbkKvbdbAueGQQX -DnbkKvbdbrcLTcia -EPCjjvbdRbEElJYk -DoCkKvbdGFirNiTq -DoDKjvbdNdctIhkE -EPDLKvbdQccAoqES -DnbkKvbdFfKRnJUR -DnbjjvbdFfJrNiUR -EPDLKvbdCfkegAzc -EPCjjvbdRXNccMHc -DoCkKvbdZjShPgBf -EOcKjvbdSLZGUfkT -DoDLKvbdBcpAujMf -EOcLKvbduWNwiqTA -DoDLKvbdpyOgfqEY -EOcKjvbdcScKtEJa -EObjjvbdnCJwXoNu -DnbkKvbdjFLGtoAO -DoCjjvbdXrlBMsnx -EPDKjvbdhgJcZWJu -DoCjjvbdiBoDEvpq -EPDKjvbdczYoxYqC -DoDLKvbdjFLHVPAO -DnbjjvbdbPgGdLzd -DoDKjvbdWIYWYGxz -DncKjvbdhytfLpnG -EObjjvbdfHjuqnQg -DnbjjvbdmgExMmgZ -EOcLKvbdhgKDYuiu -EPDKjvbdmJEURVRa -DoDLKvbdJpyePGNe -DoDLKvbdlhdUQuRa -EObkKvbdmuUzLKSG -DnbjjvbdxwhjBozL -EPDLKvbdVZIUZjnn -EPDLKvbdJpydnfOF -EPCkKvbdqqtjmjaN -EPCkKvbdZoOJFFZj -DnbjjvbdmttzKjRf -EPDLKvbduWOXjQsA -EOcLKvbdwtleRYkn -DoCjjvbdLYpjSzuG -EObjjvbdIsYaSmYM -DnbjjvbdyzeORhJI -EOcLKvbdkWWnECXw -EPDKjvbdVviYVcdg -DoDKjvbdBcoaVjMf -DoCkKvbdiMEcmuDZ -EObjjvbdLKaHvAKZ -DncLKvbdJTZArlwl -EOcLKvbdhaoCeWpq -DncLKvbdrWpLcJZR -EObkKvbdHkaznWpk -DnbjjvbdzjVPocrt -EOcKjvbdyqPMhiwA -DoCkKvbdpstHRqkU -DnbkKvbdRkYfVHKs -DoDLKvbdVgwvYGxz -EOcKjvbdFfKSNiUR -DnbkKvbdqquLOLBN -DncKjvbdOAJTTjSA -DoDKjvbddneSkUTr -EObkKvbdlqyUysEJ -DoDKjvbdbhmKKevx -EOcLKvbdiCObdwQq -EPCkKvbdFejSNiTq -EObkKvbdwygfGYEr -EPDLKvbdsQWPKDVf -DncKjvbdjbkjpfuH -EPDKjvbdRkZFuGjs -EPDKjvbdwyhFfXdr -DncKjvbdcIlikFvx -DoCkKvbdiUydwSVC -DncKjvbdiUzFXSVC -EOcKjvbdjKFgimYS -EPDKjvbdjvXODaww -EPCkKvbdRbDdlJZL -EObkKvbdrEEhpNvB -EObjjvbdrpVoKDWG -DoCjjvbdNxPVzcnU -EPDKjvbdVgwvYHYz -DnbjjvbdmuUyjirG -EObjjvbdrSVLNkBN -DncKjvbdUWLojUBR -EOcLKvbdwygefXeS -EObkKvbdhaoDEvqR -EOcLKvbdGGKRmiUR -EOcKjvbdeEnqawDK -EPDLKvbdGGJqnItR -DoDLKvbddeOrBvbj -DnbkKvbdiVZeWquC -DncLKvbdJcJcQjDY -EPDLKvbdkDMLQgUg -EObjjvbdemFvflik -EObkKvbdwzHeewdr -DoCjjvbdHDjuiajK -DoCkKvbdrEEiPnVa -EOcLKvbdypnmJKXA -DoDLKvbdmgFXmOHZ -EObkKvbdUsmUFkuj -EPDLKvbdcScKtDjB -EPCkKvbdUyITzLOn -DncKjvbdZnnIddyj -EPCkKvbdaaVeGPow -DoCjjvbdSQTfifDw -DoDKjvbdDoDKkXCd -DncLKvbdhtzEwRuC -EObkKvbdMpXqVnGs -DoDKjvbdDncLLXCd -DoCkKvbdtcDUwVoP -DoDKjvbdtSqryZdc -EPDKjvbdbBWFGPpX -EPCjjvbdmRxtyrdJ -DoDLKvbdGckVjCJj -EObjjvbdzoPpeCkx -DnbjjvbdKWVFceHJ -EPCjjvbdSKyGVHLT -DoDLKvbdelevgNKL -DoCjjvbdTXjlNzkY -DoDLKvbdpstHSSLU -EPDKjvbdhgKCxuiu -EObkKvbdZQleJMeR -EPCjjvbdKVuGDdfi -DncKjvbdUGzmkvvF -DncKjvbdxrnJMqbH -EPCjjvbdKVuGDdgJ -EObjjvbdptTgRqjt -EObjjvbdCDpAujMf -EPDKjvbdczZQXyRC -DncLKvbdqYngfpdY -EOcLKvbdqBIeAXIE -EPDLKvbdZLrETmlN -EPDKjvbdNeEThhjd -EOcLKvbdmbKWxOnV -DoCkKvbdCDoaWKNG -EOcLKvbdEOcKkWbd -EPCkKvbdNQXpvOGs -EPDLKvbdFyUtaDxC -EPDKjvbdbLMGOnDA -DoDLKvbdJcJcQjDY -EPDLKvbdOTUWHFUp -DoCjjvbdmgFXlnGy -EOcLKvbdRDbaQRES -DoDLKvbdcyxowxpb -EPDLKvbdliEURVSB -EOcKjvbdXnRAXuWU -DoCkKvbdDnbjjwDE -DoCkKvbdKVuGEEfi -EObkKvbdyOTHxShc -EPDKjvbdySnIlqbH -DoDLKvbdHELWJbJj -DnbjjvbdyOTHxShc -DnbjjvbdczZQXxpb -EPDLKvbdZLrDsmkm -EPCjjvbdfNGWflik -EPDKjvbdmbKWwnmu -DncKjvbdrDdiPnWB -EObjjvbdHDjvKCKK -DnbkKvbdUVkojTaR -EObjjvbdptTfrSKt -EPDKjvbdFxttaEXb -DoCkKvbdjvXNcbYX -DoCkKvbdSLYfUgKs -EOcKjvbdHakzEzAD -DncLKvbdiCObdwQq -EPDLKvbdZLqdUNlN -DoDLKvbdhkeDnVCy -EPCkKvbdemFvgNKL -EObjjvbdliDtQuRa -EObkKvbdwuMdpxkn -EObkKvbdirzhrkJz -EPCjjvbdJYTahLqQ -DncLKvbdIHGyxwwg -EPCjjvbdSQUHKGEX -DoCjjvbdZshiYcsO -EOcLKvbdPyNAHSrK -EPCjjvbdbsCjscia -EObjjvbdUWLojUBR -DoDLKvbdKeehBaQu -EObjjvbdjuwODaww -DoDLKvbdtkxXAsaX -DncLKvbddneSkTtS -DnbjjvbdZtJIxcsO -DnbjjvbdJTYaTNXl -EPCjjvbdGKeTDHlu -DoDLKvbdKQydoGNe -DoDKjvbdVrOXaeLc -EPCkKvbdzHYlAMeX -DoDLKvbdBvzchdov -EObkKvbdapGgELzd -DoDKjvbdaMkBsUlg -DnbjjvbdVUNTelWK -EObjjvbdiHJcZWKV -DncLKvbdZoNheEyj -DncKjvbdDHMFgAzc -DnbkKvbdFpATXGey -EPDKjvbdMpXqWOHT -EPCjjvbdmSZVZrdJ -EPDKjvbdcIljKfXY -DoCkKvbdjcLkRGuH -DoDLKvbdGYuVBEXb -EObkKvbdWXIxWDeH -DncKjvbdQlxCZOUz -DnbjjvbdYNqAXtut -EPDLKvbdGdKvJbJj -DoDLKvbdGLFSbglu -EPCkKvbdRjxfVGkT -DoCkKvbduCbuXWOo -DoCjjvbduCbtvuno -EObkKvbdjAQGaQGj -DoDLKvbdqBJFAXHd -EOcKjvbdkClKpgVH -EOcLKvbdiMFDmtby -EPDLKvbdjvXNcbXw -EPCkKvbdxUmFRYkn -DoDKjvbdHgGyyYXg -DoCjjvbdRzJhScWA -DnbkKvbdlZTRsYgU -DnbkKvbdFVxpQNJe -EPCkKvbdZyEJmcMS -EObjjvbdZQldhmFR -EObjjvbdYSlBMtPY -DncLKvbdvBDxsOdh -DoDLKvbdvAdYrndh -DoCjjvbdZyEJmcLr -DnbkKvbdKaLGmCXq -DnbkKvbdZQmFImEq -EOcKjvbdqvolDIxq -DnbkKvbdVqnYBdkc -DoCkKvbdnPyxvLZC -EOcLKvbdmJEURUqa -DoDLKvbdfHkVrNpg -DoCjjvbdznopdblY -DoCkKvbdjvWmdCXw -EOcKjvbdunszpjnt -EObkKvbdzoPqFDMY -EObjjvbdDxXktTtM -EObjjvbdBcoaVjMf -DncKjvbdtcDVWuno -EObjjvbdpyOggQdY -DnbkKvbdwWkaWAuu -EPCjjvbdajkeoODA -EOcKjvbdKNAEZfta -EOcKjvbdZisIQHCG -DncLKvbdEXwksstM -DoDKjvbdtbbuXVoP -DncLKvbdDxYMTstM -DoCkKvbdcyyPwxpb -EPCkKvbdxmrgwsJD -DoDKjvbdYSkaNUOx -EOcLKvbdxwhjCPyk -DncKjvbdUsmTekuj -DnbkKvbdkVwOECXw -EObkKvbdnBjXYOnV -DncKjvbdcasNSATm -EPDKjvbdTAFIhCOd -DnbkKvbdkWWnECYX -DnbkKvbdFjeSbgmV -DoCjjvbdJzoewdAN -DnbkKvbdZeXfzhIb -DncKjvbdMJCLqYAS -DoCkKvbdGLFTCglu -DoDLKvbdMuSrLNAX -EOcKjvbdqceIomvB -DoDLKvbdegkVqnRH -DoDKjvbdKfGICBQu -EOcKjvbdEvYopNKF -DnbjjvbdlrZVZsEJ -DoDLKvbdqqtjmjaN -DncLKvbdQmXaxmtz -EPDKjvbdCDoaVjNG -EPCkKvbdqquLNjaN -DnbjjvbdKRZdoFnF -DoCkKvbdkVwOECYX -DncKjvbdGQATXGfZ -DncLKvbdCDpAujMf -EOcKjvbdDxXlUUTl -EPCjjvbdYkrEUNlN -DnbjjvbdZtJIyETO -DoCjjvbdXsMAltPY -EOcLKvbdxxIjCPzL -DoDLKvbdSLZFuHLT -DncKjvbdFVyQQMjF -DoCjjvbdFaOpyJzm -EPCjjvbdrJAJdmPF -EOcLKvbdMuSqjmAX -DncLKvbdEJgiuxKA -EPDKjvbdBdQAuimG -DnbjjvbdWXIxVdFH -DnbkKvbdHDkVjBjK -EPDKjvbdnHEwlmgZ -EPCkKvbdBiKbKhfK -EPDKjvbdhyuGLpnG -DoCkKvbdZsiJZDsO -DnbjjvbddBrlrAUN -DoCkKvbdYqMeIldq -DncLKvbdZLqdUNkm -EOcLKvbdMuSrKmAX -DoCkKvbdDxXksstM -EOcKjvbdqdEiPmua -DoCjjvbdOEdUJIjd -DoCkKvbdEObkLWbd -EObkKvbdfekynHHA -EPCkKvbdrEFIpNvB -DnbkKvbdnBjXXoOV -EPCjjvbdmgEwmOGy -DncKjvbdKCjDQjCx -EPDKjvbdJqZdoGOF -DncKjvbdUsmTfLuj -DoDLKvbdjcMKpgUg -EPDLKvbdSQUGjGDw -DnbjjvbdRacdlJYk -DncKjvbdYgXEAOsJ -EPCjjvbdhficZWKV -DoDKjvbdGAnpxizm -EPCkKvbdRbDeLhyL -DoDKjvbdiBncEwQq -DoCkKvbdxZgfFxFS -DoCjjvbdqvpMChyR -EObjjvbdbUbGxKtI -DoCkKvbdEObkKvcE -DnbjjvbdKQzEnfNe -DoCjjvbdRWnDblID -DnbkKvbdkxrqsYgU -DncLKvbdqwPlCiYq -EPDKjvbdSZjHsDWA -DncLKvbdEPCjjvbd -EOcLKvbdpyPIGpcx -DncLKvbdbVCGwkTh -DnbkKvbdnPzZWKxb -EObkKvbdGKeTDIMu -EOcKjvbdiifIKNYS -DncLKvbdnQZxvKxb -EPDLKvbdGFjSNiUR -DnbjjvbdRNXaxnUz -EPCjjvbdOTTvGduQ -EObkKvbdUtMselVj -DoCjjvbdnUuZkKSG -EPDKjvbdQmXaxnUz -EPCkKvbdNeDtIhjd -DncLKvbdNxOuzdOU -DncKjvbdJJdAJpGd -DoDKjvbdwuNEqYkn -DncKjvbdZMSDtOLm -DnbjjvbdNeDsiJLE -EPCjjvbdJpzEoGOF -EPCjjvbdkDLkRGtg -DoCjjvbdUWLpJtAq -EPDKjvbdfMfWfljL -EPCkKvbdrMzJyMIJ -DoCjjvbdJKEAJofd -DnbjjvbdnBiwXoNu -DoCjjvbdDihJvYKA -DnbkKvbdSZigsDWA -DoCjjvbdFejRmhsq -DnbkKvbdaMkCTVNH -EObkKvbdczZPxZRC -EPDKjvbdVZIUZjnn -DoDKjvbdkySrTZGt -DoDLKvbdsPvPKDVf -DoCkKvbdwWlBVaVu -EPDKjvbdANIZSvyx -EPCkKvbdnHFYNNgZ -DnbkKvbdNdcsiIkE -EPDLKvbdDoCkLWbd -EPDKjvbdQccBPqDr -EObkKvbdSPsfifEX -EOcKjvbdelfXHNJk -EObkKvbdFfKRmiUR -EOcLKvbdKCibqKDY -EPDLKvbdUWLpJsaR -EPCkKvbdKfFhCBQu -EOcKjvbdmuUzLJrG -EOcLKvbdBdQBVjMf -EOcKjvbdfpBzvcwh -EOcKjvbdmRyUzSci -EOcKjvbdFVxpPlie -DnbjjvbdDwwlUUUM -DncKjvbdUyHsyjoO -DoCkKvbdUslselVj -DncLKvbdmuUykJqf -DncLKvbdLFfHbApu -DncLKvbdhyuFlROG -EPDKjvbdxnTIYTJD -EPDKjvbdTulPjUAq -DoCjjvbdCDoaWJlf -DoCkKvbdbLMGOnDA -EPDKjvbdOStVfdtp -EPCkKvbdZRMeImFR -DoDLKvbdiVZeXRuC -EPDKjvbdRosfiedX -DoCjjvbdnGeYMnGy -DoCjjvbdiiehKNYS -DncKjvbdbhmKKfXY -EOcLKvbdnBjXXoNu -EPDKjvbduLwwAtAw -EOcLKvbdygYlAMeX -DoCkKvbdNsTvHEtp -EPCjjvbdsrrTYzFD -EPCkKvbdBdQAuimG -DncKjvbdmfeYMnHZ -EOcKjvbdxZhFexEr -DncLKvbdZshhyETO -EObkKvbdOFEUJJLE -DoDLKvbduDCtvuoP -EOcKjvbdGZVVBEYC -EObjjvbdZRMeJNEq -DnbkKvbdkxsRsYft -DnbkKvbdsBfNLfjy -EOcLKvbdNPxQvOHT -DnbjjvbdpstHRqkU -EOcLKvbdZQleJNFR -EPCjjvbdxVNEpxkn -DoCkKvbdwtmEqZLn -DoCkKvbdGAoQxizm -DoDLKvbdVqmwaeLc -DoDKjvbdKfGHaaQu -DoCjjvbdcJNKLGWx -EPDLKvbdrzMPsBHn -DncKjvbdfoazwDxI -EPDKjvbdZyEJnClS -DnbjjvbdwMvANDeN -EObjjvbdZshiZETO -EPDKjvbdUslselVj -DoDKjvbdwtmEpyLn -DncLKvbdJTYaTMxM -EPDKjvbdvBDxsOeI -DoDKjvbdxrmhmSCH -EPDLKvbdjJegjNYS -EOcKjvbdJvUedEgJ -DnbkKvbdVZITyjoO -DoDKjvbddePSCWbj -DncKjvbdWIXvXgYz -EPDKjvbdZQmFJMeR -DnbjjvbdqdEiPnWB -DoDLKvbdUVkojTaR -DoDLKvbdFVxpPmJe -EPCjjvbdxmsHwsIc -EPDLKvbdiiehJlxS -EPDLKvbdCTAbsewS -EPCjjvbdzoPpdbkx -DnbkKvbdijGHilxS -EPDLKvbdOYOuzdNt -EOcLKvbdTppoUuIN -DnbkKvbdcScLUDia -EOcLKvbdePFTLUTr -EOcLKvbdhgKCxvKV -EPCkKvbdrJAKFNOe -EOcKjvbdVwJXucdg -EPCkKvbdNddUJJKd -DncLKvbdJYUCHlQp -EObjjvbdkVvnDaxX -EPCjjvbdNeDsiJLE -EPDKjvbdyzeNqhJI -EPCjjvbdmIdTqUrB -EPDKjvbdZoOJFEyj -DoDKjvbduaDxsOeI -EPCkKvbdKjaIWAKZ -DncLKvbdKaLHMbYR -EOcKjvbdrafMlHKy -EPCjjvbdhtzEvqtb -EPCkKvbdddoSCXDK -EOcKjvbdzjUpPdTU -EPCjjvbdLZRJrzuG -EOcKjvbdaMjaruMg -DoCkKvbdyOSgwsJD -EPCjjvbdKDKCqJcY -EObkKvbdvAcxrneI -EObjjvbdwuMeQxkn -DncLKvbdmSZUysDi -DnbkKvbdcIlijfWx -DoDKjvbddndrjtTr -EOcKjvbdwtmEqYlO -EOcKjvbdYzcFqivZ -DnbkKvbdCDpBWJmG -EOcKjvbdaSGCgsfL -EObjjvbdIwtBhLqQ -DnbkKvbdyzdmrIIh -EPDLKvbdWexzUAOs -DncLKvbdRXNdCkgc -EOcKjvbdkVwNdBww -DncLKvbdIGfzYxYH -DoCkKvbdbAvFGPow -DoCkKvbdQlxBxnUz -DncKjvbdqrUkOKaN -EPDLKvbdZisIQGaf -DoDKjvbdsQWPJbvG -DncLKvbdjhHMFfNk -EObkKvbdwNWAMdFN -DoCkKvbdeKKRutzn -EObkKvbdJpyeOfNe -EOcKjvbdQmXayNtz -DncKjvbdnHExNNgZ -EPCjjvbdULuoBVni -DoCjjvbdqquLNjaN -EPDKjvbdyzdnSIJI -DnbkKvbdQvnDcLgc -DoCkKvbdtcDUvvOo -DnbjjvbdnGeXmNfy -DoDKjvbdxsNhmRbH -DoDKjvbdtTSSyZeD -DoDKjvbdRadFMJZL -EOcKjvbdUaCQrpqy -DoDLKvbdEJgivXjA -EOcLKvbdGFjSOItR -EPDLKvbdaSGDIUGL -DnbjjvbdJYTagkqQ -EOcLKvbdZLrDsmlN -EOcLKvbdEJgiuwjA -DoDKjvbdxUleRYlO -DnbjjvbdQwODcLhD -EObkKvbdOTUVgEtp -EObkKvbdRMwaxnUz -EObjjvbdrEFJPmua -EOcLKvbdiUzEvquC -DoDKjvbdMpYQumfs -EPCkKvbdhancEvqR -DncKjvbdkNCMZdfo -DncLKvbdZHWdAOri -EObjjvbdlrYuZrci -EObjjvbdgLGzbfAE -EObjjvbdcTCkUEJa -EPDLKvbdVAbRTRRy -DoCjjvbdYqNEiMeR -DncKjvbdBvzchdpW -DnbkKvbdtSqryZdc -EPCjjvbdwygeeweS -DoCkKvbdqlzJyLhJ -EOcLKvbdtbbtvvOo -DoDKjvbdrSVKnLAm -DnbkKvbdfMevgNKL -EObjjvbdRacdkhyL -EPCkKvbdFpASvgGZ -EPDLKvbdZoOJFEyj -EPCjjvbdzjUpPcrt -EOcKjvbdcbSlrATm -EOcKjvbdqwPkbhxq -DnbjjvbdHELVibKK -EPDKjvbdZQldiMeR -DnbjjvbdpstGqrKt -DoDKjvbdGFjRmiUR -EPCkKvbdssRsZZdc -DnbkKvbdlqxuZsDi -DncKjvbdEXwlUTtM -DnbjjvbdyzdnRhIh -EPCjjvbdkCkkRGtg -EOcLKvbdLrWlytpz -EPCkKvbdCEQAvKNG -DncLKvbdVwIxWDeH -EObkKvbduMYXBTaX -DoCkKvbdRyihTDWA -DnbjjvbdkaMoNALA -DnbjjvbdaMjartlg -DoCkKvbdNVTSKmAX -DoDLKvbddwystRez -EPCjjvbdcImJjevx -DoCkKvbdeAUQlwjG -DoDKjvbdZxcjNblS -DncLKvbdkIGlFenL -DoCjjvbdfHjurNqH -DoCkKvbdiBoDFXRR -EPDLKvbdvBDyTPFI -DnbkKvbdUxhUZkPO -EObjjvbdqZOhHQdY -EOcKjvbdSCDeLiZL -DncKjvbdozmckYPA -DncKjvbdgGLymgHA -DncKjvbdILaznWpk -EPCjjvbdqUTgSSKt -DoCkKvbdrovOjCuf -EOcLKvbdKfGIBaQu -EPDKjvbdCIjajiFj -EPCkKvbdmoyxujyC -EObkKvbdySnJMrCH -EOcLKvbdHDjujBij -EObjjvbdrMyiyMHi -DoCkKvbdiifHimXr -DnbkKvbdbsCkTcia -DnbkKvbdMfbpNPtk -EOcLKvbddoErkUTr -DncLKvbdqZOhGqDx -DnbjjvbdDncKkXCd -DoCjjvbdSCEElIxk -EPCkKvbdbUbHXjsh -DnbkKvbdCTAcUGWr -EPDLKvbdZtIiZESn -DnbjjvbdrDeJPnVa -DoCkKvbdZisIQHCG -DncLKvbdgFkzOHHA -EPCkKvbdmfdxMmfy -DncLKvbdMIbMRYAS -EOcKjvbdaogGckzd -EOcLKvbdLAkHMawq -DncLKvbdxwiJbQZk -DncLKvbdauBgYLUI -DnbkKvbdnQZxvKyC -EOcKjvbdFkEsChNV -DoDLKvbdpstGrRjt -EPDLKvbdlYrrSxgU -DnbjjvbdZQmFIldq -DoCjjvbdbhmKLFvx -EObkKvbdsBellGjy -DncLKvbduCcUwWOo -EObkKvbdJuuGEEfi -DoCkKvbdIwtCHkqQ -EPCkKvbdaMkBruMg -DncLKvbdEARiMyvw -EObjjvbdmgExNOGy -DoCjjvbdpfDdsuaI -EPDLKvbdEzspdlCi -EPDKjvbdqdFJQNua -DnbkKvbdnBjWxOnV -EPDLKvbdZisHogBf -EPCkKvbdjcMKpftg -DnbkKvbdauCGwjsh -DoDKjvbdlYrrTZHU -EOcLKvbdzjVPpDrt -DoCkKvbdQdDApQdS -DoDKjvbdehLWRmpg -EPDLKvbduoTzpkPU -DoCkKvbdliDspuRa -DoDKjvbdEXxLsssl -EObjjvbdZsiJYcrn -DoCkKvbdaaWFGPpX -DoCkKvbdrafNMHLZ -DoCjjvbdmgEwlnHZ -EPCkKvbdFkEsCgmV -DncKjvbdqmZjYlHi -DoCkKvbdfILWSORH -DoDLKvbdnCKXYOnV -DnbkKvbdHgGyyYYH -DoDLKvbdEKHjVxKA -EPDKjvbdbAueGPow -DnbkKvbdFyUuBDwb -EPDKjvbduCcUvvOo -EObkKvbdauBfxKsh -EObjjvbdZjTIPgBf -EObkKvbdNGbolpVL -EOcKjvbdeFOqbWbj -DoCjjvbdvwMAvBVu -DnbkKvbdzRPMhjXA -DncKjvbdFkErcIMu -EPCjjvbdhlFEOUcZ -DoCkKvbdJbjCpicY -EPCkKvbdZGwEAOri -DnbkKvbdNQYQunHT -DoCkKvbdkIHMFfOL -EObkKvbdHELVjBij -DoDLKvbdZQldhleR -DoDLKvbdVTmTelVj -DnbjjvbdJTZArlwl -DnbkKvbdCDpAvKMf -DoCjjvbdDxYLtUTl -DoDLKvbdwkWcgzyf -EPDLKvbdLBKgNCYR -DoDLKvbdZMSEUNkm -EOcLKvbdxUmEpxkn -EOcKjvbdGLFTDHlu -EOcLKvbdyYJKCPyk -DoCjjvbdDnbjjvcE -DoDLKvbdatbHXjtI -EObjjvbdbiMjLGWx -EPDKjvbdTYKlNzjx -EOcKjvbduDDUvvPP -EObkKvbdliETpuSB -DnbjjvbdrWolDIxq -EObjjvbdqZOggQcx -EOcLKvbdyXiKBoyk -DnbjjvbdqmZiyMIJ -EPCjjvbdULuoAuoJ -DoDLKvbdYzcGRivZ -DnbjjvbdtkwwBTaX -DnbjjvbdJbicQicY -DoCkKvbdTukojTaR -EPCkKvbdHbLydzAD -EObjjvbdVTltGLvK -EPCjjvbdUsmUFkuj -EPDLKvbdTqROuVIN -DncLKvbdYkrETnLm -DoCkKvbdeFPSBwDK -DnbjjvbdNGcPmPtk -DnbjjvbdWHwuxHYz -DoDLKvbdNUsRjmAX -EOcKjvbdZjTHpHBf -DncKjvbdWXIwvDeH -EOcLKvbdrJAKEloF -DoCjjvbdFeirOJUR -EOcKjvbdWWhwvEEg -DncKjvbdKeehBaQu -DnbjjvbdZLrDsmlN -EOcLKvbdZnnIeFZj -DoCkKvbdjKGHjMwr -EObkKvbdmIctQtqa -DoCjjvbdkClKpfuH -DnbjjvbdcTDKscia -DnbjjvbdADSYKZiQ -EObkKvbdygZMANFX -EPCjjvbdaMkCTUlg -DoDKjvbdzjVPodTU -EPCkKvbdIxTagkpp -EPCjjvbdZjSgpHBf -EOcLKvbdiCOcEvpq -EOcLKvbdsQWOibvG -DoDKjvbdEuxoomJe -DoDKjvbdmuVZkKSG -DoCjjvbdSZjITDWA -DoCkKvbdCJLBkJGK -EPCkKvbdliDsqVSB -DoCjjvbduaDxrneI -EOcLKvbdtvNxJpsA -EOcKjvbdEuyPoljF -DnbjjvbdwWlAuaWV -DncLKvbduMXvaTaX -EObjjvbddxZstSFz -EPDLKvbdmttykKSG -EPCjjvbdfIKvRnRH -DoDLKvbdjgfkeemk -DoCkKvbdHELVjBjK -EObjjvbdaRecIUGL -DnbkKvbdmSYuZrci -DoDLKvbdKfGHaaQu -EOcLKvbdIwsahLpp -EOcLKvbdEuyPomKF -DoCkKvbdsQWPJcVf -DnbjjvbdbPgHDkzd -DoDKjvbdZMSETnMN -DoDKjvbdJSyBTMwl -EPCkKvbdSCDeMIxk -DoDLKvbdtkwwBTaX -DoCjjvbdtbcVWuoP -EPCjjvbdozmdKxPA -DoCjjvbdtkwwBUBX -DoDLKvbdQdDBPpcr -DoCjjvbdJbjCpjDY -EPCjjvbdCTBDTfWr -EPDKjvbdYNqAYUut -DoDKjvbdURRPVUgm -EOcLKvbdNPwqVmfs -DoDKjvbdsCGMkgLZ -DoDLKvbdZtIiYcsO -EObjjvbdhficZWJu -EPCjjvbdTqRPUuIN -EPCjjvbdyOShXsIc -EOcLKvbdliETqVRa -DncKjvbdYqMdhmEq -DoCkKvbdKfGHbBQu -DnbkKvbdqBIeAXIE -EPDLKvbdQZNAHTRj -EObkKvbdRosgJecw -EPCjjvbdKQzEnfOF -DoDKjvbdzRPMiKXA -DnbkKvbdGcjvJbJj -DoCjjvbdbAvEeoow -DncKjvbdFVyQPmKF -EPDLKvbdRzKIScWA -EPCkKvbdKkAhWAJy -EPCkKvbdJqZdnenF -DoCkKvbdVUMtGMWK -DncKjvbdBiLBjiGK -DnbkKvbdjvWnDbYX -DnbkKvbdwuNEqYkn -DoDKjvbdegjurORH -EObjjvbdpeceTvAh -DoCkKvbdAMgySwZx -EPCkKvbdlZSqsZGt -EPDLKvbdbrbkTdKB -EPDKjvbdhzUekpnG -DncLKvbddeOqbWbj -EPCjjvbdsPunibvG -EOcLKvbdVwIxVdEg -DoCjjvbdkIHLefNk -DnbkKvbdxmrhXrhc -EPCkKvbdziuPocrt -EOcLKvbdNUsSLNAX -DncKjvbdhkddNtcZ -DoCjjvbdMpYRWNgT -EObjjvbddZxoxYqC -EOcLKvbdNVTRjmAX -EPDKjvbdZjTIQHCG -DnbkKvbdHEKvJbKK -EOcKjvbdiGibxvJu -DnbjjvbdsCGNMGjy -DoCjjvbdBhkBjhfK -EPCkKvbdSCDdkhyL -DnbjjvbdNPwpvNfs -EOcLKvbdJTZBTNYM -DncKjvbdqGEFTvBI -EObkKvbddneSjtTr -DncLKvbdqdFJPmua -EPDKjvbdrbFmMGkZ -DoCjjvbdhXZAzzAJ -EOcKjvbdkxsSSxgU -EPDKjvbdrEEhonVa -DnbkKvbdYzcGSKVy -DoCjjvbdzROmJJwA -EPDLKvbdOEdUJJKd -EPCjjvbdqquKmkAm -EOcLKvbdZyEKODLr -DnbkKvbdIsZAsMxM -DnbjjvbdZjTHofaf -DoCjjvbdrSUkOLAm -EPCjjvbdBsAbsewS -EObkKvbdUsltGLuj -EPCkKvbdANHyTWyx -EObkKvbdsBemMGjy -EObjjvbdMoxRVmfs -EPCkKvbdNGbolouL -EPDLKvbdjKGHimXr -DncKjvbdUMWPAuni -EOcLKvbdOEdUIhkE -EPCkKvbdjKGHimXr -EPCkKvbdhuZdwSVC -DoCjjvbdCIkBjiFj -EPCkKvbdxZhGFxFS -EObjjvbdOFDtJJKd -DoCkKvbdfNGWgNKL -EPDLKvbdcarmSATm -DoDKjvbdkNCMZeHP -DoDLKvbdkMakyeGo -DnbjjvbdiHJcYvKV -DnbjjvbdWWhxVcdg -EPDKjvbdVUNTelVj -DoDKjvbdZGvdAPTJ -DoCjjvbdDncLLXCd -EPDKjvbduDCuWuno -DoCkKvbdPyNAHTSK -DncKjvbdqwPlDIyR -EOcKjvbdYzbfSJvZ -DnbkKvbdRotGifDw -DoDLKvbdRDcBQRDr -DoDKjvbdEARiNZvw -DncKjvbdJSxaTNYM -EPDKjvbdVwJXvDeH -EOcKjvbdQwOECkhD -DoCjjvbdEPCkLWbd -EPDKjvbdVBBpsRSZ -EOcKjvbdddoSBwCj -EOcKjvbdFkFScINV -EObjjvbdpstGrSLU -EPDLKvbdhaoDFXRR -EPDKjvbdKfGICApu -EObkKvbdBsAcTevr -EObkKvbdhkeDmtby -DoCkKvbdqYngfpdY -EOcKjvbdsPvPKCvG -DoDLKvbduVmwiqTA -EOcKjvbdidkGtoAO -EPCkKvbdyzeORgiI -DoCkKvbdmJDsqUqa -DncLKvbdiGibyVjV -DncKjvbdhtzEwSVC -EOcLKvbdZRMdiNFR -EOcKjvbdrafMkgKy -DoDKjvbdZGwEAOsJ -EOcLKvbdjmCMZeHP -DncLKvbdjKFgimYS -EPCjjvbddZxpYZRC -DncKjvbdjmBkzEgP -EObkKvbdkIHLeemk -EPDKjvbdjAQGaQGj -DncLKvbdSPtHJfDw -DoCkKvbdGKdsChNV -EPCjjvbdrouoJbuf -EPDKjvbdlhcsqUqa -DoCjjvbdwXMBWAvV -DnbkKvbdhkdcmtby -EOcLKvbdFkEsDHmV -EOcLKvbdCIkBjhej -DoCkKvbdiLeDnVDZ -DoDLKvbdDxXlTssl -DnbjjvbdNrtVfduQ -EPCkKvbdHDkWJajK -EPCjjvbdTulQKUBR -DoDKjvbdJYUBhLpp -DncKjvbdiCOcFXRR -DoCkKvbdxsNiMrBg -EObkKvbdQlxByNtz -EPCjjvbdBhkBjiFj -EPCjjvbdNeDsiIjd -DncLKvbdBsAcTfXS -DncLKvbdDwwlUTsl -EOcKjvbdUQqPVUgm -DncKjvbdmttzKirG -EPCjjvbdKWUfEFHJ -EPCjjvbdGKdrcINV -EPDLKvbdkxrrTYgU -DoCkKvbdQdCaQQcr -DnbkKvbdvAdYroFI -EObkKvbdFxttaDwb -DnbkKvbdQdDBPqES -DncKjvbdkVwODbXw -DoCkKvbdrounicVf -EPCjjvbdBcoaVjMf -DncKjvbdcImKKevx -DoCjjvbdxLWdHzyf -EOcLKvbdcbTNSATm -EPDKjvbdRacdlJZL -EPDLKvbdZQleIleR -EPCkKvbdTfznLwWF -EObkKvbdsCFmLgKy -DoDKjvbdyqOlhiwA -EOcKjvbdtcCtwVoP -DnbjjvbdRWmdCkgc -EOcKjvbdqUTfqrKt -DnbkKvbdRyjHsDWA -DoDLKvbdYqMdiNEq -EOcKjvbdhbPCeXRR -EOcKjvbdVrNwbFLc -EObkKvbdZLqcsmkm -DoDKjvbdRWmdDMID -EPCjjvbdkWXNcbYX -DncLKvbdZyDinClS -EOcLKvbdqUTfqqjt -DncLKvbdUtNTelWK -EPDKjvbdkWWmdCXw -DoDKjvbdezuxdhtX -DoCkKvbdaSGCgtGL -EPDKjvbdVwJYWDdg -DoDLKvbdWSOYCFMD -EObkKvbdxwiJaozL -DoCjjvbdTpqOuVIN -DoCkKvbdrzLpSaHn -DnbkKvbdJutecdfi -DnbkKvbdhgKDZVjV -DncKjvbdCJKajiGK -EPCkKvbdbrcLTcia -DncKjvbdxxIibPzL -DoDLKvbdNUsRkNAX -DoCkKvbdZRMeJMdq -DnbjjvbdxsOJMqbH -DncKjvbdqAheAWhE -DoCkKvbdZnnIddyj -DoCjjvbdrpWOibuf -DoCjjvbdDxXlUUTl -EPDKjvbdZirgofbG -DnbjjvbdDnbkKvbd -EOcLKvbdoznDkXoA -DnbjjvbdozmdKxPA -DnbkKvbdfHkVqmqH -DoDLKvbdkDMLRGtg -EPDKjvbdDxXlUTtM -DoDLKvbdZLrETmkm -DoCjjvbdLAkGlbYR -DncLKvbddndsLUUS -DoCjjvbdaRfDIUFk -DnbjjvbdjJfHjNXr -DncLKvbdeFPRbXDK -DoCkKvbdJYTbIMRQ -DnbkKvbdptUGrRjt -EOcKjvbdkMbLzEfo -DoCjjvbdezuxeJUX -DoCjjvbdZMRctOLm -DoDLKvbdWWiXudEg -DnbkKvbdiiehKNXr -DoCkKvbdXrkaNUOx -EPDLKvbdZjTIQGbG -EObjjvbdeOeTLTtS -EPDKjvbdBraCsewS -EPDLKvbdLBKflaxR -DncKjvbdRzJhScWA -EPDLKvbdGKdrbhMu -DoDKjvbdFeiqmiUR -DnbjjvbdFWYooljF -DnbkKvbdUWLoisaR -EPDKjvbdfRaWzkbo -EPDLKvbdKQzEnfNe -DoDLKvbdnUtyjiqf -DnbjjvbdyNrgxSiD -EOcKjvbdjlakzFHP -DoCkKvbdjvXODaxX -DnbkKvbdLFfHaaRV -EPCkKvbdwuMeRYlO -EPDLKvbdtSqrxzEc -DncKjvbddwytTqez -EOcKjvbdZLqcsnMN -DoCjjvbdkxsSTZHU -EPDKjvbdiZtekqNf -EObkKvbdnCKWwnmu -EObjjvbdauBgYKsh -EPDKjvbdrSVKmkBN -EObkKvbdxrnImSBg -DncKjvbdZnnJEeZj -DoDKjvbdZjTIQHBf -DncLKvbdmIctRVRa -DoCjjvbdziuQQDsU -EPDKjvbdZRNFJNEq -EOcKjvbdTqRPUthN -EPCkKvbdePFSjssr -EPDLKvbdfIKuqmqH -DoDKjvbddZyQYYpb -DoDLKvbdWRmwaeMD -DoDLKvbdOYOuzcmt -DoDLKvbdxsNiNRbH -EPCkKvbdNeEThiLE -EPCkKvbdNPxQunHT -EPCjjvbduCbtvuoP -EOcLKvbdjgfkeemk -EObjjvbdjlbLydfo -DoDLKvbdxmsIXrhc -DoCkKvbdlrZVZsDi -DoDKjvbdEztRElCi -EObjjvbdBsAbsfWr -DoDLKvbdZHWdAOsJ -DnbjjvbdSCDdkhxk -EObjjvbdeFOqbWcK -EPDLKvbdZtJJZESn -EPCkKvbdKfFhBaQu -DoCkKvbdMpYQvNfs -EObjjvbdrpWOjCvG -EPDLKvbdJSxaTMxM -EPCjjvbdOSsvGduQ -DoDLKvbdtumxKRTA -EPDKjvbdBcpBWKMf -DnbkKvbdtbbuWvPP -DoDLKvbdKWUfDdfi -EPDKjvbdOStVgFVQ -EObkKvbdZnmheFZj -DoDLKvbdQwODcMID -DoDKjvbdVrNxBeMD -DoCkKvbdaSFbgsek -DoCjjvbdTvMQKTaR -DoCkKvbdZsiIxdSn -EObkKvbdakMFnnDA -DoDLKvbdJutedFHJ -EOcLKvbdhzVFlQnG -EObjjvbdzjUpQDsU -EPCkKvbdzoQQeCkx -DncKjvbdZjShPgCG -DnbjjvbdMgCpMpVL -DnbkKvbdNGbpNPuL -EObkKvbdKfFhBaRV -DnbjjvbdKQzFPFnF -EPDKjvbdCIkBkJGK -EObkKvbdmajXXnnV -DoCkKvbdNwnuzcnU -EObjjvbdauCGwkTh -DnbkKvbdbiNKKfXY -DnbjjvbdQmYCYnUz -DoDKjvbdiLddNtcZ -EOcKjvbdeEoSBwDK -DoDKjvbdcTCkUDia -DnbkKvbdZRNEhmEq -EPCkKvbdHfgZxxXg -EObjjvbdbsDLUDjB -EPDKjvbdhbPDFWqR -DncLKvbdKNADyfuB -EObkKvbdEztREkcJ -DncLKvbdbLMFnnDA -EObkKvbdZjShPgBf -DncLKvbdbVCHXkTh -DnbkKvbdqTtHSRkU -EObkKvbdfSBWzlDP -DnbkKvbdGKeTDIMu -EOcLKvbdGcjvJbJj -EPCkKvbdMowqWOHT -DncKjvbdYpmFIleR -EPDKjvbdZxcjNblS -DncLKvbdNrtVgEuQ -EOcKjvbdqrVKnLBN -DnbkKvbdatbHXkUI -DoCkKvbdEPDKkWbd -EPDLKvbdmIdURVRa -DoCkKvbdMoxRWNgT -EObjjvbdLBKflbXq -DoCkKvbdSwjkmzkY -DoDKjvbdJbicQicY -EObkKvbdNQYQumgT -DoDKjvbdxxJKCPzL -DncLKvbdnGdxNNgZ -DoCkKvbddijSVtzn -EPDKjvbdrJAJdmOe -DnbjjvbdzoQQeDLx -DoCjjvbdZRMeIldq -DnbjjvbdkHgMGGOL -DoCjjvbdaSGChTfL -EOcLKvbdCJLCKiFj -DoCkKvbdVhXvYHYz -EPCjjvbdcSbjscia -EOcKjvbdxZgeewdr -EPDLKvbdYkqdUNlN -DnbkKvbdREDApQdS -DnbjjvbdmozZVkYb -EPDKjvbdaRecITfL -DncLKvbdZyEJmbkr -EOcKjvbdZnnIdeZj -DncLKvbdeXzTsrFz -DoCjjvbdZRMdhmEq -EOcLKvbdGGJqmhtR -EPDKjvbdIidAJpHE -DncKjvbdMRwNZtpz -DncLKvbdnBiwXoOV -DoDLKvbdqYnhGqEY -EOcKjvbdWexytAOs -EOcKjvbdiZuFlQnG -EObkKvbdVAaqTRRy -EPCkKvbdTAEhgaoE -DoDKjvbdMoxQvNfs -EPDKjvbddjJqvUzn -EObkKvbdBiKajhfK -EPDLKvbdZLqcsmlN -DoCjjvbdgPazwDwh -EPCkKvbdwkWcgzzG -EPDKjvbdlYsSSyGt -EObjjvbdZLrDsmkm -DncLKvbdbsCkUDia -EObkKvbdkxrrSyGt -DnbkKvbdnBivxOnV -DoDLKvbdZirhPgCG -EObjjvbdfMevfmKL -EPDKjvbdSQTgJecw -DoDLKvbdUWMPitAq -DoDKjvbdwtleRZMO -EObjjvbdKRZdoGNe -DoCjjvbdauBgYKsh -DoDKjvbdXrlAlsnx -DncKjvbdUMVnaVni -DncKjvbdiHKDYvKV -DnbkKvbdySnJNSCH -EPCjjvbdfNGWgNKL -EOcLKvbdnQZxujxb -EObjjvbdVgwvXgYz -EOcLKvbdjKGHimYS -DnbkKvbdhanbeXQq -DncLKvbdhzUfLpmf -DoDLKvbdczZPxZRC -EPDKjvbdRNYBxnUz -EOcLKvbdlrZVZrdJ -DncKjvbdtcDUwWOo -EPCkKvbdQvmdDLhD -EPCjjvbdfMfWfljL -DoCjjvbdZyEKNbkr -EOcKjvbdgPazvcxI -DncKjvbdfNGXHMjL -DncLKvbdEKHjWXjA -EObkKvbdZjSgogCG -EPCjjvbdxnSgxShc -EPCjjvbdqrVKmkBN -EPCjjvbdbBVdepQX -DoCkKvbdrXQLbhxq -DoCjjvbdbVBfxLTh -EPCkKvbdHlBznWqL -EPDKjvbdTAEhgaoE -DnbjjvbdCfkfHAzc -DnbkKvbdptTfqqjt -EPDLKvbdWIXuwgYz -EObjjvbdrJAJeNPF -DncLKvbdKDKDRJcY -DnbkKvbdrDeIpNvB -DncLKvbdVwIwudFH -DncKjvbdICMZdzAD -EPCkKvbdsQVnjDVf -EPDKjvbdiZuGMRNf -DoDLKvbdIGfyyXwg -EPDLKvbdYORAXtut -DoCjjvbdhzVGMQnG -EPDLKvbdQwNcbkgc -EObjjvbdsBemLgLZ -DoDLKvbdZtIiYdSn -DoCjjvbdelevfljL -DoCkKvbdcyxowxqC -EPDLKvbdZMRdUNlN -EOcLKvbddZyPwyRC -EPCjjvbdZLrDsnLm -EPCkKvbdgPazwEYI -DoDKjvbdqFdEsvBI -EOcKjvbdVviXvDdg -EPCjjvbdCWzdIdov -DncKjvbdrSVKnLBN -EObkKvbdiLddNtcZ -EPDLKvbdrDdiPmvB -EPDKjvbdKDKDRKCx -DoDKjvbdtSqsZZeD -DoDLKvbdwuNFRYlO -DoCjjvbduLwvaTaX -EObjjvbdtkxXBUBX -EOcLKvbdSQTgJfEX -EObjjvbddneTKtUS -DoDLKvbdAMhYsXZx -EOcLKvbdczZPwxqC -EPDLKvbdjbkjqGtg -EOcLKvbdFkEsChMu -EObjjvbdbsCkUDia -EObkKvbdEzsqElDJ -EPDLKvbdGZUuBEYC -DoCkKvbdzROmJJwA -EPDKjvbduMXwAsaX -EPCjjvbdqwQMDJZR -DoDKjvbdqUUHSRkU -DoCkKvbdwtleQxkn -DnbkKvbdQvnEClHc -EPDKjvbdjvXNcaww -DoCjjvbdjggMFenL -EPDLKvbdJYUBhLpp -DnbkKvbdkNCLyeGo -DoCjjvbdDoCkLWcE -EOcKjvbdYqMeJNFR -EPCjjvbdRDcApQdS -EObjjvbdjblKpgVH -EPDKjvbdqqtjnKaN -DoDLKvbdwtmFRYlO -DoCjjvbdnHEwmNgZ -DncLKvbdaMjasVNH -DncKjvbdnUtzLKSG -DoDLKvbdkySrSyGt -EPCjjvbdyNsIXriD -DoCkKvbdRadFMIyL -EOcKjvbdqvokbhxq -EPCjjvbdYkrEUOLm -EPDKjvbdrpWPKCvG -DncKjvbdxUldpyLn -EObjjvbdrbFmMHKy -DoCjjvbdZHWdAPTJ -DncKjvbdEPDLKwDE -DnbjjvbdZHWdAPTJ -DoDLKvbdNrsvHFUp -DncLKvbdCTBDUFvr -EPDLKvbduDDUvuno -DoDLKvbddwystSFz -DnbkKvbdmbJvwoNu -EPCjjvbdcbTNSAUN -DnbjjvbdnVUzKjRf -EOcLKvbdYlRdUOMN -DoCjjvbdTAFIgand -DnbkKvbdpeceUVaI -DoDLKvbdlZSrTYft -EPCjjvbddePRbXDK -EOcLKvbdJqZdnfNe -EPCkKvbdRaceLhyL -EPDKjvbdLAkGlaxR -EPCjjvbdqGDdsvAh -DnbjjvbdxZgefYEr -EObkKvbdKWVGEFGi -EPCjjvbdSQUHKFdX -EPDKjvbdDxYLsssl -EPCjjvbdfHjvSNqH -EPCkKvbdQwODbkhD -EOcKjvbdZnmiFEyj -EPCkKvbdqwQMChyR -EOcLKvbdZyDimcLr -EObjjvbdjAQGaQGj -EPCkKvbdZtJJYdTO -EObjjvbdjFKgUoAO -DnbkKvbdcScLUEKB -EPDKjvbdjcMLRGuH -EObjjvbdqlzKZLgi -EOcKjvbdFfJrNiUR -EObkKvbdKaKgNBxR -EOcKjvbdHDjujBij -EObkKvbdFejSOJUR -DncLKvbdMIalRYAS -EOcKjvbdVTlsekvK -DoCjjvbdUQqOtthN -DnbjjvbdVYgtZkOn -DnbkKvbdrovOicVf -DncKjvbdKfGIBaQu -DnbjjvbdjuvnDaxX -EPDLKvbdHakzEzAD -EPDLKvbdyzdnRhIh -DoCjjvbdZGvdAPTJ -DoDLKvbdqvolChyR -DncLKvbdjlbLyeHP -EPCkKvbdmIdTptrB -EPCkKvbdQcbaPqES -DoDLKvbdddoSBwCj -DnbjjvbdjvWnECXw -DnbjjvbdZisHofbG -EOcKjvbdZQldhldq -DnbkKvbdfekymfgA -DnbjjvbdLBKgMbYR -EPCjjvbdEARiMzWw -EObjjvbdtSrTYzEc -EPDKjvbdZoOIddyj -DnbkKvbdcSbjtEKB -EObjjvbddndsKssr -DoCjjvbdxnSgxShc -EPCjjvbdOTUVfdtp -DoCkKvbdUtMselWK -DnbjjvbdJpydoGNe -DoCkKvbdGQASwGey -DnbjjvbdnGdxMnGy -EPDKjvbdHDkVibKK -DoCjjvbdtbbuXWOo -EPDKjvbdKWVGEEgJ -EObkKvbdGLEsCgmV -DoCkKvbdbrbjtEKB -EPDLKvbdRzJgrcWA -EPCkKvbdaRecITfL -EObjjvbdrbGMlHKy -DnbkKvbdZdwfzgiC -EPDKjvbdVwJXudFH -DoCjjvbdiZtekqOG -EObkKvbdqrUkOKaN -EObkKvbdySnImRbH -EObjjvbddoFTKstS -EOcKjvbdyOTHxTJD -DncKjvbdFVxoolie -DoCkKvbdFejRnIsq -EPDLKvbdptUGrRkU -EOcKjvbdajlGOnDA -EPDKjvbdrRtkOKaN -EOcKjvbdzoQQeDLx -EPCjjvbdrafMlGkZ -EPCjjvbdmpZyWKyC -DoCkKvbddBrlrAUN -DnbkKvbdMgDPlpVL -DnbjjvbdUxhTzKoO -DoCkKvbdSCDdlIyL -EPDKjvbdmbJvxPOV -EPCkKvbdNGcQMpUk -EPCjjvbdVqmxCFLc -DoDKjvbdrDdhonWB -EOcLKvbdYTLaNToY -DoCkKvbdkIGlFemk -EPDKjvbdNrsvHFVQ -EPDLKvbdrzLoraHn -EObkKvbdraelkgLZ -DoDLKvbdBdQAujMf -DncKjvbdwzIGGYFS -EOcKjvbdZeXfzhIb -DoDKjvbdbAueGPpX -DoCjjvbdZtJJYcrn -DoDKjvbdyqPNJKXA -DoCkKvbdTAFIhCPE -DoDLKvbdjblLQgVH -DoCjjvbdZtJJZDsO -EOcLKvbdrNZixkhJ -DoCjjvbdzoPpdblY -DnbkKvbdqcdhpNvB -DncKjvbdYpldhleR -DoCjjvbdmRyUysEJ -DoCjjvbdJXtBgkqQ -EOcKjvbdVwJYWDeH -DoDLKvbdZLqdUOLm -EPDKjvbdEXwlUUTl -EObkKvbdoznDkYPA -EPCkKvbdEASJNZvw -EPCjjvbdFjdsCglu -DoCkKvbdTlWPBWOi -DnbjjvbdcTCjsdKB -EObkKvbdkySrTYft -EPCkKvbdLrXMytpz -DncKjvbdZQmEhleR -EOcLKvbdHkaznWpk -DnbkKvbdHfgZyXxH -EObkKvbdpecdtWAh -DnbkKvbdRadElJYk -EPCjjvbdTXkMNzjx -DoCjjvbdmSYtzTEJ -EPCkKvbdZsiJZDsO -DncKjvbddoErkTtS -DoCkKvbdZRMdiMeR -EObkKvbdTfzmkvvF -DncKjvbdpxnhHQcx -EPDLKvbdaMjbStlg -DoCjjvbdkHfkefOL -DoCjjvbdqqtkOLAm -DnbjjvbdyzeNqgiI -EOcKjvbdiLeDnUby -DncKjvbdyYIjCPyk -EOcKjvbdpfEFUVaI -EPCjjvbdZirgpHBf -DnbkKvbdKWUecdgJ -EOcLKvbdiHKCxvJu -EPDKjvbdcTCkUEKB -EOcLKvbdaMkBsVNH -EPDLKvbdJutfEFGi -EPCkKvbdFaOqZJzm -EObjjvbdhaoCdvqR -EPCkKvbddZxpXxqC -DnbjjvbdZxcinDLr -DoDLKvbdpssfqrKt -DoCjjvbdqTsgRrLU -EPDLKvbdEYXlUTtM -EObjjvbduVmwjQsA -EOcLKvbdNPxQunHT -DnbjjvbdBhjajiGK -DoCkKvbdUGznMXVe -EPDKjvbdVwIwvEFH -EObkKvbdRMwayNtz -DoDLKvbdQZNAGrrK -EObjjvbdKWUedFGi -DoDLKvbdaNKartlg -DncKjvbduWOXipsA -EObjjvbduVmxKRTA -DoDKjvbdygZMAMdw -DoDLKvbdqTsfrRkU -DoCjjvbdEvYpQMjF -EObkKvbdNPxQunGs -EObkKvbdsZlPsAgn -DnbkKvbdZnnIddzK -EPCkKvbdNQXqWOHT -DnbkKvbdGLFSbhMu -DoDKjvbdrzMPraIO -DnbkKvbdZirgofaf -EPDKjvbdijFhJlxS -DncKjvbdWRmxBeLc -DnbkKvbduDDUvuoP -DoDKjvbdiZuGMQmf -EObkKvbdelfXGljL -EPDLKvbdfNFvfljL -DncKjvbdGKdrcINV -EObjjvbdFfJqnIsq -EOcLKvbdILaznWqL -DncLKvbdJutedFHJ -EOcLKvbdIwtBhLpp -EPDLKvbdsrrSyZdc -EPDKjvbdczZQXxpb -DncLKvbdDoCjjvcE -EPCjjvbdpxoIHREY -DoCkKvbdxxJJbPzL -EPCkKvbdVZIUZkPO -EPDLKvbdULuoBWPJ -EPCkKvbdfMfWfmJk -DnbjjvbdZtIiZETO -DoCjjvbdiMEcnUby -DoCkKvbdcyyPxZQb -DoCkKvbdZirgofaf -EObkKvbdozmdLYPA -DoDKjvbdYkrEUNkm -DoCkKvbdLqwMzVQz -EObjjvbdLFfICBRV -EObjjvbdjJehKNYS -DoCjjvbdEJgiuwjA -EPCkKvbdyqPNIiwA -EPDKjvbdNdcsiIjd -EPCjjvbdauBgXjsh -DnbkKvbdyzeORgiI -EPCkKvbdsCGNLgLZ -EObkKvbdtbbtwVno -EObjjvbdwuMdqZLn -EObjjvbdSQTfiedX -EPCjjvbdmttyjjSG -DncLKvbdnHFYMnGy -DncKjvbdxmsIXrhc -EPDKjvbdQYmAGsRj -EObjjvbdfoazvdYI -DoDLKvbdhaoDEvpq -EObjjvbdDihKVwjA -DoCjjvbdZMSDtNlN -DnbjjvbdhlFDnVDZ -EPCjjvbdiCPCdwRR -DncLKvbdULuoBVoJ -DoDLKvbdyYJKBpZk -DoDLKvbdRbDdlIyL -EOcKjvbdYSlAlsoY -DoCkKvbdySmhlqbH -EOcKjvbduWNxKRTA -DnbkKvbdFjeTDIMu -DoDLKvbdzaAPGgCM -EPCkKvbdBhkCLJGK -DnbkKvbdYpmFJNFR -EPCjjvbdQccBQQdS -EOcKjvbdqGDdtVaI -EOcLKvbdILazmvqL -EPDLKvbdajkennDA -DoDKjvbdxVMdqZLn -EPDKjvbdNPxQunGs -EObjjvbdhytfMROG -EPDKjvbdEXxLtTtM -EPDKjvbdZnnIdeZj -DoDKjvbdGKeTChNV -DncLKvbdjmCMZeGo -DnbkKvbdQwNdClHc -DncKjvbdXrlBMtOx -DoCkKvbdzaAOgHBl -DncLKvbdcIlijewY -EObjjvbdrbFllHKy -EOcKjvbdmbJwXnmu -EObkKvbdssSSxydc -DoDKjvbdSQTgKGEX -DnbjjvbdUyHtZkPO -EPCjjvbdFyUuAdYC -DoCkKvbdqFcdsvBI -EOcLKvbdqwQLbhyR -DoCkKvbdbsCkUEKB -EPCjjvbdIjEAKQHE -DnbkKvbdaNKbTUmH -EObkKvbdnCKWxPOV -EOcLKvbdZxcinClS -EObjjvbdhlFDnVDZ -DncLKvbdpyPHfpdY -EOcKjvbdTlVoAuoJ -EOcKjvbdmbKXXoOV -DoCkKvbdxsOImSBg -DncKjvbdZHXEAPTJ -DoDLKvbdDjIKVwjA -DoDLKvbdnCJvwoNu -EPCjjvbdZeYGzghb -EPDKjvbdHffzYxXg -EObjjvbdirzhrkJz -DoCjjvbdZnnJFFZj -EPDKjvbdeATqMwif -DoDKjvbdbVCHXjsh -DoCjjvbdGckVjCKK -EOcLKvbdyYJJbPzL -DoCjjvbdiCPDFWpq -EOcLKvbdIwtCILqQ -DoDLKvbdKQzFOfOF -EOcKjvbdNPwqWNgT -EObjjvbdZLqcsmkm -EPDLKvbdnPyxvKxb -DoDLKvbdKjaHvAKZ -EObjjvbdjKFgjNYS -DnbkKvbdLAkGmCXq -DoDLKvbdeEoSBwCj -DnbjjvbdHlBznXRL -DnbjjvbdKfGHbBRV -DnbkKvbdZQldiMdq -EOcLKvbdnBivwnnV -DncKjvbdsQVoKDWG -EObkKvbdypnlhiwA -EObkKvbdrykpTAgn -DoCjjvbdaMkBsUmH -EPDLKvbdRDcBPqES -DoCjjvbdpxngfpdY -EOcKjvbdEztRFLbi -EOcLKvbdcbTNSAUN -DoCkKvbdjcLjpfuH -EPCkKvbdjSzhsKiz -EPCkKvbdoAKztIDn -EPCjjvbdMgDQNPuL -DoDLKvbdKNAEZgVB -EPCjjvbdZsiJZDsO -EOcLKvbdkCkkQfuH -DoCjjvbdnGeXmNfy -DnbjjvbdrpVoJbuf -DoCkKvbduCbuWuoP -EObjjvbdSwkMNzkY -DoCkKvbdrNZiyMHi -DnbjjvbduDCtvuoP -DoDLKvbdMuSqjmAX -EObkKvbdsQVnicVf -EPCjjvbdmfeYNNgZ -DncLKvbdmIdURUqa -EPCkKvbdGBPQyJzm -EPCjjvbdZRNFImEq -DncKjvbdNddUJJLE -EObkKvbdaSFbgsek -DncKjvbdDoCkKwDE -DoCjjvbdtkxWaUBX -DncLKvbdfNGXHMjL -EPCkKvbdqTtHSSKt -DnbkKvbdxmrhXsJD -DnbjjvbdmttykKSG -EObjjvbdqcdhomua -DoCkKvbdVTlsfMVj -DnbkKvbdRECaPpcr -DnbkKvbdijFhKNYS -EObkKvbdIwsbIMRQ -EPDLKvbdJbibqJbx -EPDKjvbdxxJKCPyk -EOcKjvbdjuvnECYX -DnbkKvbdKRZePFme -DnbkKvbdMpYRVnGs -EOcKjvbdfMevgNKL -DoCkKvbdmfeXmOHZ -DncLKvbdFpATXGey -DoDKjvbdJXtCIMQp -EObjjvbdZshiZDsO -EPDLKvbdaRfDHsfL -DncKjvbdMIakqYAS -EObjjvbdSLZGUfjs -DoDKjvbdBcoaWJmG -DoDKjvbdEuxpPlie -EObjjvbdJcJbqKCx -DoCjjvbdxwhiapZk -DnbkKvbdsBemLfkZ -DoDLKvbdHgGyxwxH -EOcKjvbdQdDApRDr -EPDLKvbdKWUfDeHJ -DnbjjvbdjvXODbYX -DoDLKvbdHELWJbKK -DncLKvbdgFkynHHA -EPCkKvbdPxmAHSqj -DoDLKvbdYkqdTnLm -EPCkKvbdJYUCILpp -EOcKjvbdxwhjBpZk -DoCjjvbdiMFENtcZ -DoCjjvbdnCJvwoOV -DoDKjvbdSKxetgKs -EOcKjvbdWRmxCFMD -EOcLKvbdpedFTvBI -EObkKvbdbAvEfPow -EObkKvbdZnmiEeZj -DnbkKvbdtTSSyZeD -EPCkKvbdPxmAGsRj -EPCkKvbdVTmUGLvK -EObkKvbdJmADyfta -EOcKjvbdwWlBVaWV -DoDLKvbdjcMKqGtg -EOcLKvbdGGJrNiTq -DnbkKvbdgPazvdYI -EPCkKvbdGLEsDHmV -DnbjjvbdqceIomua -DncLKvbdjbkjpgUg -DoCjjvbdSxLLmzkY -EPDLKvbdjKGHilxS -EPDKjvbdmbJvwoNu -EPDKjvbdjmBkyeHP -EPDLKvbdzROliJwA -DnbjjvbdUaBprprZ -DoDKjvbdtbbtwWPP -DnbjjvbdURQoVVHm -DoCjjvbdjbkjqGuH -DoCjjvbdRbEFLhyL -DncKjvbdBcpAujMf -DoCkKvbdPxmAGrqj -EPDLKvbdZRMeImFR -EOcLKvbdcScKscia -EObjjvbdeXytTrFz -EPCjjvbdKfGICBQu -DncKjvbdijGIKMwr -EObjjvbdZLqctOLm -EObkKvbdSLZFuGjs -DnbjjvbdZMRcsnMN -EPCkKvbdWSOYBeMD -EObjjvbdRacdlJYk -DnbjjvbdFyVUaEXb -EObjjvbdRbEFLiYk -EObjjvbdZjTIQGaf -EPCkKvbdNsTugEtp -DoCkKvbdEASIlyvw -DoCjjvbdsrrSxzFD -DoDLKvbdQwOEDMID -EPDKjvbdaaVeGQPw -DoCjjvbdFejRnItR -EObkKvbdRacdlIyL -DnbjjvbdGGJqnIsq -DoDLKvbdGYtuBDxC -DncKjvbdbLMGPODA -EObjjvbdqYoIGpcx -DncKjvbdrykosAgn -EPCjjvbdJbjDQjCx -EObjjvbdkySqsYft -EPDKjvbdxwhjBpZk -DncKjvbdauBfwkTh -EPCkKvbdtSrSxydc -DoDKjvbdMRvmZuQz -DncLKvbdnUtyjiqf -DoDKjvbdSLYetgKs -DoDLKvbdJbjCqJcY -EPDLKvbdShyiqAAl -EPDLKvbdSQUHJfDw -EOcLKvbdijFhJmYS -EPDLKvbdvwMBWAvV -EObjjvbdeXytUSFz -EObjjvbdWXJXuceH -EPCkKvbdrDeIomvB -DncKjvbdczZQXyRC -DnbjjvbdQlxCZOUz -EPCjjvbdQccApRDr -DoCkKvbdqiAJdloF -DoCjjvbdDwwktTtM -EPCjjvbdRpUGjGEX -DnbkKvbdWfYytAPT -EPCjjvbdUMVoBVni -EObkKvbdxnShYTIc -EObjjvbdVAaqSprZ -DncLKvbdKVtfDdgJ -DoCjjvbdliEUQtqa -DnbjjvbdiGjCyWKV -DnbjjvbdqrVLOLBN -EObkKvbdUaCRSqSZ -EObkKvbdTkvPAuni -DoCjjvbdIGgZyXwg -DoDLKvbdssRsYzEc -DnbjjvbdZLqdTmkm -EPCjjvbdUtNTfLvK -DncKjvbdfMewGmJk -EOcLKvbdCTBDTfWr -EPDKjvbdFpASwGey -EPCjjvbdZLrETmkm -EPDLKvbdyXhjCQZk -DnbkKvbdeATqMxJf -DoCjjvbdjJfHilwr -EPDKjvbdzitopESt -EPDKjvbdEuxopMjF -DoCkKvbdvBEYroFI -DnbkKvbdrNZiyMIJ -EPCjjvbdxVMdpyMO -DnbkKvbdQlxCZOUz -DnbkKvbdqmZiyLhJ -DncLKvbdXnRAXuWU -EObkKvbdRadElJYk -DncKjvbdLiBkqYAS -DnbjjvbdmRyUysDi -DoDKjvbdKCicQjDY -EOcLKvbdRkZGVGjs -DoDKjvbdtSrSyZdc -EOcKjvbdRyjISbvA -EPCjjvbdHffyyYYH -EOcKjvbdaogHDkzd -EPCjjvbdidkGuPAO -EOcKjvbdCDpAujMf -DoCkKvbduVnXjQsA -DnbjjvbdTulQJtAq -DncKjvbdqTsgRrLU -DoCkKvbdzdynzdyp -EObkKvbdemGXHNKL -EOcKjvbdJXtCHlRQ -EPDKjvbdegkWRnQg -DoCjjvbdyXiKCPyk -EPDLKvbdlZTRsZHU -DoCjjvbdfNFvgNKL -DnbjjvbdbVBgYLTh -DncKjvbdcJMikFvx -EPDLKvbdUMVnaVoJ -DoCkKvbdgQBzvcxI -DoCjjvbdZtIhxdSn -EPCjjvbdRWnEDMID -EObkKvbdjlakydfo -DncLKvbdrpWOicVf -EOcKjvbdhgKDYuiu -DoDKjvbdmIdTqUqa -EPCjjvbdwtleQxkn -EObkKvbdcJNKKfWx -DncLKvbdNsUWGdtp -DoDKjvbdWSOXbEkc -EPCkKvbdpyOhHREY -DoDKjvbdkyTSTYft -EPCjjvbdFjdrbgmV -DncLKvbdrounjDWG -DoDKjvbdVTmTfLvK -EPDLKvbdSCDeLiYk -DoCkKvbdrXPlDIxq -DncLKvbdKVuGDeHJ -DnbjjvbdrWokcIxq -EObjjvbdKVuGEEfi -EPDLKvbdrbGMlGjy -EPDKjvbdlqxtzSci -EOcLKvbdwygeeweS -EObjjvbdjKGIKNYS -EObkKvbdVrOXbElD -DnbjjvbdrMzKZLgi -EPCkKvbdMpXqWNfs -EPDLKvbdrSUkOLAm -EPDKjvbdZisIPfbG -EPDLKvbdRDbaQRES -DncKjvbdVTmUGLvK -EOcKjvbdYzcGRjWZ -EObjjvbdMuSrLNAX -DncKjvbdjgflGFnL -DncLKvbdWIXvXfxz -DoDLKvbdNHComPtk -EOcLKvbdSBceLhyL -DoCkKvbdZRMeImFR -EPDLKvbdiifIKMwr -DoCkKvbdvBDxsOeI -EPDLKvbdxmsHxShc -EOcKjvbdcyyPxZRC -DoCkKvbdsBfNMHKy -DoDLKvbdaRebhTfL -DncLKvbdypoNJKXA -EObkKvbdzRPNJKXA -DnbkKvbdTvLoitBR -EOcKjvbdWHwuxGxz -EObjjvbdZHWdAPTJ -DnbjjvbdySnJMqag -EPCkKvbdtTRsYzFD -EPDLKvbdhytelQnG -EPCkKvbdTppntuHm -DnbjjvbdZeYGzhIb -EPCjjvbdIwsaglQp -DoCkKvbdpstGrRkU -EObjjvbdCJLBjiFj -EOcLKvbdePErjstS -EPDKjvbdpxnhGqDx -DnbjjvbdZyEKOClS -DoCjjvbdpyOhHREY -DncLKvbdNGcPmPuL -DoDLKvbdQwNccLgc -EPDKjvbdmbJvxPNu -DnbkKvbdQwOEDMHc -DoDKjvbdXrlAltOx -EPCkKvbdGQASvgGZ -EOcLKvbdmttykKSG -EOcLKvbdGLFSbgmV -DncLKvbduCbuWvOo -EPDKjvbdSQTfiecw -DoCkKvbdYkqctNkm -DoDLKvbdlZSqsZHU -DoDLKvbdqGEEtVaI -EObjjvbdhytekpmf -DoDKjvbdmuUzKiqf -EObjjvbdrMyiyLhJ -DoDLKvbdEARhlzWw -EObjjvbdaRfCgsek -EPDKjvbdaNKaruNH -EOcLKvbdJqZeOenF -DnbjjvbdTfzmlXVe -DoCjjvbdzQoNIjXA -EObkKvbdMpYQvNfs -DncLKvbdVrOYCElD -DoCjjvbdijGIJlwr -DoDLKvbdrXQMDIyR -EPDLKvbdEYYMUTtM -DncKjvbdkHgMFenL -DnbjjvbdqdFIpOWB -EObkKvbdqFceTvAh -EObjjvbdyOSgxSiD -EOcKjvbdDnbkKvcE -DoDLKvbdYqMeImFR -EObkKvbdwtleRZMO -EPCkKvbdrWolCiYq -EObjjvbdrXPkcJYq -DoCkKvbdtlXvaUBX -EOcLKvbdeYZssrFz -DoDLKvbdnGeYMnHZ -EObkKvbdYTLaMtOx -DoDLKvbdJcJcRKDY -EPDKjvbdeKJrVtzn -DoCkKvbdrSUkNjaN -DncKjvbdeATqNXjG -EObkKvbdqlzJyLhJ -EObjjvbdDjIJvXjA -EObjjvbdzGyMAMdw -DoDLKvbdFfJrNiTq -EOcLKvbdBhkCKiGK -EObjjvbdpssgSRjt -DncKjvbdKaLGlbXq -EOcLKvbdlYrqrxgU -EPCjjvbdVqmxBeLc -EPDLKvbdZQmFJNFR -DoCkKvbdkCkkQfuH -DncKjvbdauCGwjsh -DoCjjvbdEASIlywX -DncKjvbdLAjgNBxR -DncKjvbdCDpBVimG -EOcLKvbdqlzJxkhJ -EPDLKvbdtvNxKRTA -DnbkKvbdGLFScINV -DoCkKvbdQvmdCkhD -EPDKjvbdFjdrbhNV -EPCkKvbdZLrETnLm -EPDLKvbdTvLoisaR -EPDLKvbdsrrTZZdc -EPCkKvbdZMRcsmlN -DncLKvbdxnTHxTIc -EOcKjvbdzROliJwA -EOcKjvbdsQVnjDVf -EObkKvbdqGDdsvBI -DncKjvbdwtleQxkn -EObjjvbdTqRPUuHm -DnbjjvbdVwIwvEFH -EPCjjvbdZshhxcsO -DoCkKvbdKCibqJbx -EOcKjvbdUVlQKTaR -EObkKvbdVTmUFlWK -EOcLKvbdmIctRVRa -DoDKjvbdPIAYZAYa -DoCkKvbdjvWnDbXw -DnbjjvbdtvNwjRTA -EObjjvbdNHComQUk -EOcKjvbdySnImRbH -DoCjjvbdDjIKVxKA -DncLKvbdKefHbApu -EObjjvbdehLWRmpg -EOcLKvbdJTZAsMwl -DoDKjvbdZirgpHCG -EObkKvbdozmcjxPA -EObkKvbdsZkosAgn -EPCjjvbdSxKlNzjx -DoCjjvbdfILVrNpg -EPCjjvbdGGKRnJTq -DnbjjvbdpssgSSLU -DoDKjvbdrDdiPmvB -EPCkKvbdZtJJYcsO -DoDLKvbdNdctIhkE -EPCjjvbdcImJkFvx -EOcLKvbdGLErbhNV -DoCkKvbdnQZxukYb -EPCkKvbdWSNxBeLc -EPCkKvbdsPvOjDWG -EOcLKvbdeFOqavbj -EPCjjvbdjAQHApHK -EPDKjvbdwXMBVaVu -DncLKvbdMowqWNfs -DoCkKvbdRbEFMJYk -DoCkKvbdrNZjZLhJ -DoCjjvbduDCtwWPP -EObjjvbdNeEUJIjd -DnbkKvbdlYsRsYgU -DoCjjvbdUxgsyjnn -EObkKvbdbLMGPODA -DoCkKvbddneTKtUS -EOcKjvbdvvkaWAuu -EPDKjvbdVUNUFkuj -EObjjvbdKDKDQjCx -EPDKjvbdnUuZjiqf -DoCkKvbdsCFmMGkZ -DncKjvbdrpVnjDWG -DnbjjvbdiZtfMQmf -DoCkKvbdwWkaVaVu -DoCjjvbdSCDeLiZL -DncKjvbdEYYLtTsl -EPDLKvbdOSsufeVQ -EOcLKvbdWSOXadlD -EPDLKvbdpaJFAXHd -DncKjvbdSCDdkhyL -DoCjjvbdIMBzmvqL -DnbkKvbdVUMsfLvK -DoCkKvbdlhctQuSB -DncKjvbdJuuGEFGi -EPCjjvbdJSyAsMwl -EOcKjvbdUtMtGMVj -EPCkKvbdHDkWKCKK -DncLKvbdySnImRag -EPCjjvbdwMvAMcdm -DnbkKvbdelevfmJk -EPDKjvbdYORAYUvU -EPCkKvbdVwIxWDeH -EObjjvbdtvOXipsA -DncLKvbdhlEdOUcZ -EOcLKvbdTlVoAuoJ -EPCkKvbdNQXpunHT -EOcLKvbdWXJXvDdg -DnbkKvbdZoOJFEzK -EObkKvbdmbKWwoOV -DnbjjvbdiHKDYvKV -DncKjvbdfSBWzlDP -DoCkKvbdLBKflawq -EObkKvbdUsmUFkvK -EObjjvbdLqwNZtpz -DoCkKvbdsBfNLfjy -DncLKvbdjvWmcbYX -EObkKvbdaMkBruMg -EPCkKvbdHkazmvqL -DnbjjvbdRyjHrbvA -EPCkKvbdNQXpvOHT -EObjjvbdOYPVzcnU -DoCjjvbdaSGCgtFk -DoDKjvbdxmsHxSiD -EObjjvbdZirgogCG -EOcLKvbdmuVZkKSG -DncLKvbdUyHszKnn -DnbkKvbdxmsHxTJD -EPCkKvbdVrOYBdkc -EOcLKvbdhkdcmuDZ -DncKjvbdwuMdpyLn -EObkKvbdxVMdpxlO -EPDKjvbdmbKWwoOV -DoCjjvbdhkeDmtby -DncLKvbdLFehCBQu -DoCkKvbdYSkaNUOx -DnbkKvbdmaivxPNu -EPDKjvbdfNFvgNKL -EPDKjvbdhlEdOUcZ -EPDLKvbdTukpKUAq -DncKjvbdUVlQKTaR -DnbkKvbdYgWdAPSi -DoDKjvbdIwsbHkpp -EOcKjvbdlZTSTYgU -DoCkKvbdNHColpVL -EPCjjvbdxrmhmRag -EObkKvbdUxgsyjnn -DoCjjvbdsQVoJbvG -DoCkKvbdBdQBVjMf -EObkKvbdIHHZxxXg -EOcKjvbdJuuFdEgJ -DoDLKvbdwyhGGXeS -DnbkKvbdSKyFuGkT -DoDKjvbdiGibxvKV -DncKjvbdnBjXXoNu -DnbkKvbdFpATWffZ -EPCjjvbduDCtvvOo -EObjjvbdIsZArlxM -DncKjvbdEvYopMjF -EObjjvbdwuMdqYkn -DoCjjvbdwyhFfYEr -EPCjjvbdqUTfrSLU -EOcLKvbdzGxlANEw -EPCjjvbdEOcKjwCd -EPCkKvbdOSsvGeUp -DncKjvbdhlEcnUcZ -EPCkKvbdUVkoitAq -DnbjjvbdOAJTTjSA -DncKjvbdqmZiyLhJ -EObjjvbdpstGqrLU -EPDLKvbdFxuVAcwb -DoCkKvbdauBgYKsh -DnbjjvbdZMRcsmkm -EOcLKvbdqrVLNkBN -DoDKjvbdNQYRWNgT -DoCjjvbdCTBCtFvr -DncKjvbdZyEKNcMS -EPCkKvbdVviYVdFH -DoDKjvbdePErjtUS -EObkKvbdwtmFRZLn -DncKjvbdpedEsvAh -EPCkKvbdzoQRFClY -DoDKjvbdIxTbIMQp -DoDLKvbdxsOImSCH -EPCjjvbdYfwEAOri -EOcKjvbdnPyyWLZC -EOcKjvbdhlFEOVCy -DoCjjvbdwyhFfXdr -DnbkKvbdZQmEhleR -DnbjjvbdbAudepPw -DnbjjvbdMpXqVmgT -DncLKvbdNeEUIhjd -EObkKvbdMfbomQUk -DoCkKvbdqvpMDJYq -DoDLKvbdfekzNfgA -EOcLKvbderAvzlCo -EOcLKvbdiZtelQnG -EPDLKvbdRXNdClHc -EPDKjvbdNrsufeUp -DncKjvbdZQldiMeR -EObkKvbdiLdcmtby -DncLKvbdZQmEhleR -DncLKvbdZRNEiMdq -DncLKvbdWRmwadlD -EPDLKvbdGLEsDHlu -DncLKvbdZjTIPgCG -EObjjvbdxnTIXsIc -EPCjjvbdliETptqa -EOcKjvbdlrZUyrci -DoDKjvbdbKlFnnDA -DnbjjvbdwXLaWBWV -DoCkKvbduaEZSoFI -EPCjjvbdRyjHrbvA -EPCjjvbdLhakpxAS -DoCkKvbdmaiwXoNu -EOcKjvbdyNrhYShc -EObjjvbdsCFllGjy -DnbkKvbdZshhxdTO -DoDKjvbdZjShPfaf -EOcKjvbdmajWwnmu -EObjjvbdJvUfEFHJ -EPCkKvbdOEcsiIkE -EPCkKvbdkNBlZeGo -DoCjjvbdVviXudFH -DnbkKvbdjJfHjMxS -DoDLKvbdGBPRZJzm -EOcKjvbdiCObdvqR -DnbjjvbdVwJYWDeH -DncKjvbdGAoQxizm -EObjjvbdxmsIYSiD -DncLKvbdqqtkOLAm -EObjjvbdvvlAvBWV -DncKjvbdvAdZTPFI -EOcKjvbdjAQHAogK -EObkKvbdpxoIHRDx -EPCkKvbdffLynGgA -EPDLKvbdTvLpKUAq -EOcKjvbdmttzKjSG -DoCkKvbdqwQMChyR -DoDKjvbdrzMPsAgn -DoDLKvbdyYJKCPyk -DoCkKvbdRbEEkhxk -EPCkKvbdBdQAuilf -EPDLKvbdRaceMIyL -EOcKjvbdraelkfjy -EOcLKvbdEASIlzWw -DnbkKvbdOSsvGeUp -DnbjjvbdmuVZkJrG -DnbkKvbdVwIwvDeH -DoDKjvbdwWlAvBVu -DncKjvbdSKyFuGjs -DoCkKvbdOXnuzcmt -DncKjvbdrXPlDJZR -EPDLKvbdsBfNMGjy -EPDLKvbdiifHilwr -DnbkKvbdjvWmcbYX -DoDLKvbdZnmhddyj -EPCkKvbdemFvfmKL -EPDLKvbdNxPVzcnU -DnbjjvbdRkYfUgLT -EPCkKvbdZRMdhldq -EObjjvbdYqMdhmFR -DncLKvbdJvVGDeGi -EPDKjvbdUtMsfLuj -DoDLKvbdZyEJnClS -DnbkKvbdjcMKqGtg -EPCjjvbdDnbjkXDE -DnbjjvbdLGGICAqV -EPDKjvbdWIXvYGxz -EOcLKvbdBiLCKhfK -DnbkKvbddwzUURez -EOcLKvbdZQldiMdq -DncLKvbdKVtfEFGi -DoCkKvbdvAcxsPEh -DncLKvbdjvWmcbXw -EObkKvbdqiAJeNOe -EOcLKvbdUMWPBWPJ -EPCjjvbdOFDshhjd -EOcLKvbdVrNxBeMD -EPDKjvbdiGicZWKV -EObkKvbdtTRrxzFD -DoCjjvbdjJfHilxS -DoCjjvbdelfXGmKL -EPCjjvbdIrxaTMwl -EOcLKvbdRECaPpcr -DnbkKvbdiLeDmtby -EPDLKvbdGcjvKCJj -EOcKjvbdWWiXuceH -DoCkKvbdpstHRrLU -EPDLKvbdkHgLeemk -EPCkKvbdzGxlANEw -EObkKvbdjKGHjMwr -EPCkKvbdiUzEvquC -EOcLKvbdwXMBWBVu -EObkKvbdeKKRvUzn -DncLKvbdSBceLhxk -DoDLKvbdJbibqJbx -DncKjvbdeAUQlxJf -EPDKjvbdbUafwkUI -DoCkKvbdxnTIXriD -EPDLKvbdRacdlJYk -EOcLKvbdmgFXlnGy -EOcKjvbdHELWJaij -EPDLKvbdLhbMQxAS -DnbkKvbdhbPDFXRR -EOcKjvbdqwQMDIxq -DncKjvbdeOdrkTsr -EObjjvbdyOSgwriD -EPCkKvbdjmCLyeHP -DnbjjvbdZisHpGbG -EOcKjvbdIHGzZXwg -DncLKvbdwWkaWAvV -DoDKjvbdffLzOHHA -EPCjjvbdqZPIHREY -DoCkKvbdDjHivYKA -DoDLKvbdYNqAYVWU -EPCkKvbdzjUpPcrt -DncLKvbdlqyVZrdJ -DncLKvbdDoDLLXDE -DoCjjvbdcSbjtDia -DoDKjvbdDxXlUTsl -DncLKvbdJYTahLpp -EObkKvbdNQXqVnHT -EObjjvbdijGIJlxS -EObjjvbdOStVfdtp -EPCkKvbderBWzlCo -EObjjvbdKQzEnenF -EPCjjvbdmtuZkKRf -EPCkKvbdEJhJuxKA -EPCjjvbdgGLymfgA -EObjjvbdRbDeLhxk -EOcKjvbdrSUkNkAm -DoDLKvbdEOcLLXDE -EObjjvbdBhjbKiFj -DoDLKvbdBdQAuimG -DnbjjvbdDwwkstTl -DoDLKvbdVwJYVdEg -EOcKjvbdACqwizJQ -EObjjvbdZsiIyETO -EObkKvbdGLFSbhMu -EOcLKvbdFkFTChNV -DnbjjvbdVBCRSprZ -DoCjjvbdssRsYydc -DoCkKvbdUMWOaWOi -DoDKjvbdYSlBMsnx -EObkKvbdNsTvHFVQ -EPDKjvbdZisIPfaf -EOcLKvbdpssfqqjt -EPCkKvbdNHCpMpVL -EPDKjvbdczZPwxpb -EPCjjvbdnBivxPOV -DoDKjvbdUtNTelVj -EPDKjvbdjhHMFfNk -EObjjvbdEuyPolie -EPDLKvbdKQydneme -EPCkKvbdQvnECkgc -EPDLKvbdatbGxLTh -DoDLKvbdNPxQvOGs -DoDLKvbdySnImSCH -EObkKvbdvBEZTOeI -DoCjjvbdatagXkUI -DnbjjvbdmbKXXnnV -EOcLKvbdmbKXXoNu -EPCkKvbdNsUWGduQ -DncLKvbdpssgSRjt -EPDLKvbdiUzFXSUb -EObkKvbdyzeORgiI -EOcLKvbdKDKDQibx -DoCjjvbdmJDtQuSB -DncLKvbdaNKaruMg -DnbkKvbdOEctJJKd -EObjjvbdkVvnECXw -EObkKvbdKaLHMbXq -DoCjjvbdYzcFqiuy -DoCkKvbdvwLaWAvV -EPDLKvbdnBiwXoNu -EOcLKvbdLBKgNBwq -EPCkKvbdCJLBjiFj -EObjjvbdptUGqrLU -DoCkKvbdWXJYWEFH -EOcLKvbdNeEThiLE -EPCjjvbdtAHQhAAr -EOcKjvbdUGzmlXVe -DnbkKvbdrylPsBIO -EPCjjvbdICLzEzAD -EPDKjvbdrpVoKCuf -EPCjjvbdRkZFuGjs -Dnbjjvbdznopdbkx -DoDLKvbdmgFYNNfy -EObjjvbdptUHRrKt -DoCkKvbdhfjDZWJu -DncLKvbdLGFgbBRV -EPCjjvbdZnnIeEyj -DoDKjvbdmtuZjirG -EPCkKvbdmbJvwoOV -DncLKvbdJpydoFme -EPDKjvbdFyUtaEXb -DnbkKvbdqFcdtWAh -DnbjjvbdWRnXaeMD -EOcKjvbdCIkBkJGK -EOcKjvbdJTZBSlxM -DnbjjvbdziuPocsU -DnbjjvbdhzUelQmf -EPCjjvbdUaBqSprZ -DncLKvbdxZgefXdr -EObjjvbdKVuFdEgJ -EPCjjvbdAMgyTWzY -DnbjjvbdiHJbxuiu -DoDLKvbdUtNTekuj -EPCjjvbdUQpnttgm -DoDLKvbdVAbRTRSZ -DncKjvbdkxsSTYgU -DnbkKvbdMfbomQUk -DoCjjvbdTAEiHbOd -DoCjjvbdczZPxYpb -DnbkKvbdUVkojUBR -DncKjvbdddnqavbj -DoDLKvbdxwhiapZk -DoDKjvbdZirhPfaf -DoDKjvbdTukoitAq -DoCjjvbdrJAKFMne -EObkKvbdZQmEhmFR -DoCjjvbdHgHZyXxH -DncLKvbdNHCpNPuL -DoCkKvbdfIKvRmpg -DoCjjvbdNsUWHEtp -DoCjjvbdpfDdtWAh -DoDLKvbdBhkCKiGK -EObjjvbdtSqsYydc -EPDLKvbdQccBPqES -EOcLKvbduMXvaUAw -EOcLKvbdZMRctNkm -EObjjvbdRadFMIxk -DncLKvbdjhGlFfOL -DoCjjvbdhtzEvqtb -DnbjjvbdUtNUGMWK -EPCjjvbdaaWEfQQX -DncKjvbdunszpkOt -DoDKjvbdEJgjWYKA -DoCkKvbdQYmAGsRj -DoCjjvbdmozYujyC -DnbkKvbduVnYKRTA -DnbkKvbdZxcjNblS -EPDKjvbdzRPNIiwA -EObkKvbdzitopESt -EObjjvbdfILVrNpg -DoCjjvbdNGcPmPuL -DnbjjvbdEYXlUUTl -DnbjjvbdraellHKy -DoDKjvbdZQmEhmFR -DoCkKvbdZnnIdeZj -DnbjjvbdjcMKpgVH -EObkKvbdTfznLvue -EOcKjvbdFkErcIMu -DncKjvbdGdKvKBjK -DoCjjvbdVvhwvEFH -EPCkKvbdmJEUQuSB -DncKjvbdIsZBSlxM -DnbkKvbdmbJvxPNu -DoDKjvbdTqRPVUhN -DoDLKvbdwygefXdr -DnbjjvbdLGGHbBRV -DncLKvbddijSVtzn -EObkKvbdZnnJFFZj -EOcKjvbdCTBCsfXS -DoDLKvbdmttzKjSG -EOcKjvbdyNsIXsIc -EOcKjvbdbVBgXjtI -EOcLKvbdGFjRnJUR -DnbkKvbdYTMBMtOx -EPCkKvbdNGcQMouL -DoDKjvbdJcKDQibx -DoDLKvbdrpWOicWG -EOcKjvbdRaceMIyL -EPDLKvbdWWiYWDeH -EPDLKvbdczZQXxqC -DoDKjvbdLBKgMaxR -DnbjjvbdZjShQHBf -DoCkKvbdKaLGlbXq -DnbkKvbdGdKujCJj -EObkKvbdIBkydzAD -DnbkKvbdqUTgSRkU -EOcLKvbdBiKbKhfK -DoDKjvbdVwIwvEEg -EPDKjvbdIjEAKQHE -DoCkKvbdEPCkLWcE -DoDLKvbdrDeJQNua -EOcLKvbdNddUIhjd -EPCkKvbdYNqAXtvU -EObkKvbdUaCRSqRy -EPCjjvbdqqtjmjaN -EPDLKvbdhbOcFWpq -DoDKjvbdULvPBVni -DoDKjvbdGGJrOJTq -DoCkKvbdqceIpNvB -EOcKjvbddePSCXCj -EPCjjvbdVUNTekuj -DnbjjvbdLGGHbApu -DoCkKvbdcTDLTcia -DnbkKvbdNsUWGeVQ -EObjjvbdZLqcsmlN -EObkKvbdxrnJMrCH -DnbjjvbdqvolChxq -EPCjjvbdaNKbSuNH -DnbkKvbdlYrrTYft -EPCjjvbdwtldpyMO -DnbkKvbdNddThiKd -EPCkKvbdjJfIJlwr -EPCjjvbdJpzEoFme -DnbkKvbdiMEcmuDZ -EOcKjvbdkVvmdBww -EOcLKvbdAMgxrwZx -EObjjvbdatbGwjtI -EOcKjvbdTAEhhCOd -DnbjjvbdfNFwHNJk -EObjjvbdVBBqSpqy -EPCjjvbduaEZSndh -EPDLKvbdpstGqqkU -DnbkKvbdIwtCHlQp -DncKjvbdrbGNMGkZ -EOcKjvbdILaznWqL -DoCjjvbdTXjkmzkY -DoCjjvbdIGfyyXxH -EOcKjvbdjKFhKNXr -EPDKjvbdRDcApRES -EObjjvbdmfdxNNfy -EObjjvbdDihKWYKA -DoCjjvbdzaAOffal -EPDLKvbdQccBQQcr -EPCjjvbdTlWPAvOi -DnbjjvbdqUTfrSLU -EObjjvbdVAbRTRRy -DoCkKvbdnCKWxPOV -EOcKjvbdFjdrbhNV -DnbjjvbdrzLpTAhO -DoCjjvbdDxYMUUUM -DnbjjvbdmoyxujyC -DnbjjvbdUVkoitAq -EObjjvbdrEEhpOWB -DncKjvbdRjyGVGjs -DoCkKvbdJJdAKPgE -DoDKjvbdKDJbqKCx -EPDLKvbdcTDLUDia -DoCkKvbdePEsKssr -EPCjjvbdJbjCqJbx -DoDLKvbddBrmSATm -EOcLKvbdlhcsqVRa -EOcLKvbdKfGICBRV -EPDLKvbdrovPJbvG -DoCjjvbdbAvFGQQX -EPDLKvbdlZTSSxft -DnbjjvbdLqvmZuQz -DncLKvbdZshiYdSn -EOcLKvbduMXvaTaX -EObjjvbdZtJJYcrn -EOcLKvbdczZPwxpb -EPDKjvbdatafwjtI -EObkKvbdsQVnicWG -DnbjjvbdrWokcIyR -DncLKvbdJuteceGi -EOcLKvbdADRwiyiQ -EPDKjvbdCIkBjiFj -EPDKjvbdrNZjYkgi -DnbkKvbdSLYeuHLT -DoDKjvbdkNBkzEfo -DnbkKvbdcyxowyQb -EPDKjvbdYkrETnMN -DoDKjvbdwWlAvAvV -EPCkKvbdczZPxZQb -EPCkKvbdKCibpjCx -EOcKjvbdhytfLqOG -DnbjjvbdxmsHwriD -EPDKjvbdmfeYMmgZ -DoCkKvbdNQXpvNfs -DncLKvbdirziSkJz -EOcKjvbdHffzYxYH -EOcKjvbdWXIxWDdg -DncLKvbdVvhwuceH -DoDLKvbdFxtuBDxC -DncLKvbdJcKCqJbx -DoCkKvbdxLWcgzyf -DnbjjvbdCJLBjiGK -EPCjjvbdcasMrATm -DoDLKvbdLFfICAqV -EPDKjvbdqmZjZMHi -DncKjvbdczZPwxqC -EObkKvbdrWpMDJYq -EPCjjvbdLFehCBQu -EPCkKvbdRzJgsDWA -DoDKjvbdIsZArlxM -DncLKvbdqFcdsuaI -DncLKvbdULvPBVni -EOcLKvbdWXJXuceH -EPDLKvbdaNLCTVMg -EObkKvbdUxhUZjnn -DncLKvbdeATplxKG -DoCjjvbdmSYtzSci -EOcLKvbdkMbLzEfo -EPCjjvbdrpVoJcWG -EPCjjvbdXrlAlsoY -DoDLKvbdUxhTzKnn -EPCjjvbdOEdUJJLE -EObjjvbdKDJcRKCx -EPDKjvbdcyxpXxqC -DnbkKvbdZxdKODMS -DncLKvbdcImJjfWx -DnbjjvbdpfEFTuaI -DnbkKvbdZoNheEyj -EOcKjvbdjFKfuPAO -DnbkKvbdFVyQQNKF -DnbkKvbdDjHiuwjA -EPCkKvbdMgDPlotk -EPDKjvbdxnShXsIc -DoDLKvbdOTUVfduQ -DncKjvbdFejRnIsq -DncKjvbdSQUHJfEX -DncLKvbdRXOEDMHc -DoCkKvbdsZkosAgn -DoDKjvbdUsmUGLuj -EPDKjvbdiifIJmYS -DoDLKvbdZQmEhmFR -EObjjvbdeUAUASlv -DoDLKvbdUsltFlVj -DoCjjvbdSiZjRABM -EOcLKvbdegkVrORH -DoDKjvbdYlRdTnLm -DncKjvbdzitopESt -DnbkKvbdhbPDEwQq -DncKjvbdSKxetgLT -DncKjvbdZQmEiNFR -EPDLKvbdUyITzLPO -DnbjjvbdznpQdblY -EObkKvbdbLMFoODA -EPDLKvbdBhjbLJFj -DoDKjvbdNwoVzdOU -DncKjvbdvBDxsPEh -DnbkKvbdSBceLiZL -EPCkKvbdOhAXyAZB -EObjjvbdZisIQGbG -EOcLKvbdAMgxrvyx -EPDKjvbdCDpAvKMf -DoDKjvbdxVMdpxlO -EOcKjvbdJbicRJbx -DoCkKvbdTppnuVIN -EObjjvbdZjTIPfbG -DoCkKvbdpyOhHQcx -DoCjjvbdfHjvSOQg -DoCjjvbdzoPpdcMY -EPDKjvbdmfeYNNfy -EPCjjvbdXGYzUAPT -DoDLKvbdypnmJKXA -DnbkKvbdBsAcUFwS -DoDLKvbdQYmAGsRj -EObjjvbdUxhTyjnn -DoCkKvbdrouoKCvG -DoDLKvbdhtydwSUb -EPCkKvbddwytUSFz -EOcKjvbdrbFmLgLZ -EObkKvbdbPffckzd -EObjjvbdDxXlTtUM -DnbkKvbdqGEFTvAh -EPCjjvbdDoCkKwDE -EOcLKvbdVviYWDeH -EPCjjvbdWSOYCFLc -DncKjvbdmbKWxPNu -DoCkKvbdZshhxdTO -DoDKjvbdwtldqYkn -DoDLKvbdYSlBMsoY -EPDKjvbdRkZFuHKs -DnbkKvbdeYZstRez -DoCjjvbdrNZixlIJ -DoCjjvbdmgFXlmgZ -EPCkKvbdYlRcsmlN -DoCjjvbdOFETiJKd -EPDLKvbdBhkCLJFj -EPCjjvbdmuVZkJrG -DnbkKvbdFjeTChMu -DoCjjvbdJTZBSlwl -DnbkKvbdozmdLYPA -EObjjvbdtbbtvuoP -DncKjvbdqUTfrSKt -DncKjvbdyTOImSBg -DnbjjvbdcTCkTdKB -EOcKjvbdKaKgNCXq -EPDKjvbdZoOIeEyj -DoDKjvbdYqMeIleR -DncKjvbdnPzZWLZC -EPDLKvbdZirhPfbG -DnbkKvbdGQATXGey -EOcKjvbdZsiJYcsO -DnbkKvbdrWpMDJYq -DoCkKvbdMuTSLNAX -EObjjvbdpxnhHRDx -EOcKjvbdzitpQESt -EPCjjvbdhuZeXSUb -DoCjjvbdNeDtJIkE -DoCkKvbdCEQBWKMf -EPCkKvbdHEKvKCJj -EPCjjvbdatbHYLTh -EObkKvbdLGGICBRV -DncKjvbdRjxeuGjs -DoDKjvbdnHFYNOHZ -EObkKvbdIryAsNYM -EObjjvbdmfdwlnGy -EOcLKvbdNeDsiIkE -DnbjjvbdJTYaSlxM -DoCkKvbdRadEkiYk -DncLKvbdjKFgjNYS -EObkKvbdZjShQGaf -EOcKjvbdKfFgaaQu -DoDKjvbdhgJbyVjV -DoCkKvbdwuNFRZMO -DncLKvbdfekzNfgA -DncKjvbduCcVWuno -EPDLKvbdVrNxBdkc -DnbkKvbdRkYeuHLT -DoDLKvbdwuNEpxlO -DoCjjvbdQccAoqDr -EOcKjvbdUGzmkvvF -DncKjvbdEJhKWYKA -EOcLKvbdssSSxyeD -DoCjjvbdVviXvEEg -DnbjjvbdEuxopNKF -EObkKvbdLAkGlbXq -DoCkKvbdZsiJZESn -DoCkKvbdhkeEOUby -DnbkKvbdbhlikGXY -EObkKvbdLBLGmCYR -EPCjjvbdxUleQyLn -DncLKvbdrbGNMGjy -DoCkKvbdddoSBwDK -EPDLKvbdkyTRsYgU -EPDKjvbdehLVqmqH -EPDLKvbdrbFmMHKy -DncLKvbdmbJvwoOV -EOcLKvbdVUNUFkvK -EPDLKvbdrpWPJbvG -DncKjvbdGAnpxizm -EOcKjvbdyzeNqghh -DoDLKvbdhbPDFWpq -DoDLKvbdfVzxQJzs -DoDLKvbdUMWPBVoJ -EOcLKvbdRpTfjFdX -EPCkKvbdpfDeUWBI -EObjjvbdmuUyjirG -EObjjvbdtbbtwWOo -EObkKvbdrylPsAgn -EOcLKvbdmSYtysEJ -DncKjvbdSCDeMJYk -DoCjjvbdTppoUthN -EPDKjvbdVTmUFkuj -EObjjvbdIsZAsNXl -EOcKjvbdSBcdlJYk -DnbkKvbdZQleIleR -DnbjjvbdddoSBvcK -EOcLKvbdNHComPuL -DncKjvbdiCPCdvqR -EOcKjvbdliDspuSB -EObkKvbdzoPpeCkx -DnbjjvbdcJMijevx -DoDKjvbddZxpYZQb -DoDKjvbdkySrSxft -DoDKjvbdyXhiapZk -EPCkKvbdOAIrsirA -EObkKvbdUaBqSqSZ -EPCkKvbdZtJIyESn -DnbkKvbdTvLoitAq -EPCjjvbdyzeNrIJI -EOcKjvbdiCPDEwRR -EPCkKvbdnCJvwoNu -EPCkKvbdIGfzZYXg -DoCkKvbdkySqrxft -DoCjjvbdZdxGzgiC -DncKjvbdzitpPcsU -DncLKvbdbVCHXjsh -EPCkKvbdlhcsqVSB -EPCjjvbdGYtuAcxC -EOcLKvbdjAQGaQHK -EObjjvbdjlakzFGo -EOcLKvbdvwMAvAuu -EPCjjvbdTqQoVUhN -EPCkKvbdeEnrBwCj -DoCkKvbdsCGMkgKy -DnbjjvbdhkeDnVDZ -EPCjjvbdOFDshiLE -DnbjjvbdDwwlUTsl -EPCkKvbdKWUedEgJ -EPDLKvbdsQVnicWG -EPCkKvbdjgflFfOL -EObkKvbdQYmAHTSK -EObkKvbdSPsgJecw -EObjjvbdjAQGaPgK -DoDLKvbdDxXlUUUM -DoCjjvbdegjuqnQg -DnbkKvbddwzTsqez -DncKjvbdxxJJbPyk -EOcKjvbdGKeTChMu -DoCkKvbdeFPSCWcK -EObkKvbddeOrBwDK -EPCkKvbdaNLBsUmH -DoDLKvbdRpTgJedX -EPCkKvbdkySrSxgU -EPCkKvbdVYhTzKoO -EPCjjvbdxxIjCPyk -EPDLKvbdVrOXadkc -EOcLKvbdEOcKjwDE -DncLKvbdmfeYMnGy -EPCkKvbdVAaprprZ -EPCjjvbdFWYpQMjF -DoCkKvbdqrUjmkAm -DoCjjvbdQvmdDLhD -EPDLKvbdeATqNYKG -DnbkKvbdLGGHaaQu -EObjjvbdezvZEhtX -DnbkKvbdjuwNdBww -DncKjvbdJTZAsMwl -EPDKjvbdkxrrTYgU -EPDKjvbdbAudfQQX -DoCkKvbdVUNUGMVj -EPDLKvbdaNLBsUlg -EPDLKvbdDwxLtUUM -EPCjjvbdMgColpUk -EPDLKvbdaogGdLzd -EPDKjvbdzGxlANFX -EPCkKvbdUQqOuUgm -DoDKjvbdEPDKkXCd -EPDKjvbdbsCkTcia -EObjjvbdTAEhhBnd -EPCkKvbdhzVFkpmf -DnbkKvbdaSFcHtGL -DoCjjvbdGBOpxizm -DncLKvbdGYttaEYC -DoDKjvbdqYoHfpdY -EOcKjvbdrouoKCuf -EOcKjvbdiCPDFWqR -DnbjjvbdVAaprqRy -EPCjjvbdePFSjtUS -DnbkKvbdLGGICBRV -EPDLKvbdkMalZeHP -DoDLKvbdJutfEFHJ -DoDKjvbdVBCRSqSZ -EObjjvbdvvlBWBWV -EOcLKvbdFVxpPmJe -DoDLKvbdKfGHaaRV -DnbjjvbdBvzdIdpW -DncKjvbdNsUWHFUp -EPDLKvbdrSVLNjaN -EPDKjvbdgGMZnGgA -DnbkKvbdSBceMIyL -EOcLKvbdSBdFLiYk -EOcLKvbdRyigrcWA -EPDKjvbdaMkBruNH -DncKjvbdUaCRSpqy -DnbjjvbdIMBzmvpk -DnbkKvbdbVCGxKtI -DncLKvbdliDtQuSB -EObkKvbdHDkVjBjK -DncKjvbdmSYtyrci -DnbkKvbdxVMdpxlO -EPCjjvbdRpTfjGDw -EPCkKvbdhancEvpq -EPDLKvbdNsTvHEuQ -DoDKjvbdfekymfgA -EObkKvbdUWLojUBR -EPCjjvbdJXtBgkpp -DoCjjvbdEPCkLXCd -EPCjjvbdZxcjNcLr -DoCjjvbdZsiJYcrn -EPCkKvbdZtIiZDrn -EObkKvbduLxWaUBX -EObkKvbdZdxGzghb -EOcKjvbdkClLRHVH -EOcLKvbdFjdsDINV -DncKjvbdNeEUIiKd -EPCkKvbdYpmFJNFR -EPDKjvbdlhcsptqa -DoDLKvbdnCKWwoOV -EObkKvbdDnbkLXCd -EObkKvbdQwOECkhD -EOcKjvbdUaCRSpqy -EPCjjvbdBcoaVjNG -DnbjjvbdxmrhXsJD -EObjjvbdcImKKewY -DnbkKvbdpyOgfpdY -DnbjjvbdpyOggRDx -EObjjvbdEOcKjwDE -DnbkKvbduCcUwVoP -EOcKjvbdhgKCxuiu -DoDKjvbdiZtelQmf -DoDKjvbdnBjXYOnV -EPDLKvbdczZPwxpb -EPCjjvbdADRwizJQ -EObjjvbdfVzwpJzs -DnbjjvbdxxIiapZk -EPCjjvbdjcLkQfuH -EPCjjvbdcyyQYYqC -DoCkKvbdEuyPpNJe -DncLKvbdcJNJkGWx -DoDKjvbdZoOIdeZj -DoCjjvbdWHxVwgYz -DnbjjvbdeEoRbWbj -DncKjvbdZMSDsnLm -EOcLKvbdbiNKLFvx -DnbkKvbdjcLjqHVH -DnbjjvbdEYXktTtM -EPCjjvbdCSaCsfWr -EOcLKvbdBdQAuimG -EObkKvbdqdFIpOWB -DncLKvbdelevgNKL -EObkKvbdZMRdUNkm -EPCkKvbdrDdiQOVa -DoDLKvbdCWzdJFQW -EObjjvbdxUleQyMO -DncKjvbdBsAcTfXS -EOcKjvbdRMxBxmtz -EOcKjvbdSKyFuGkT -EPCkKvbdEuxooljF -DncLKvbdYgWdAPSi -DoCkKvbdiHJcYvKV -EPCkKvbdZQldiNFR -DncKjvbdjAPgAofj -EObjjvbdkVvmdBxX -DoDLKvbdsBfMlHLZ -DoDLKvbduWNxKQsA -EObjjvbdOTTugEtp -DoCjjvbdIxUBgkqQ -EOcKjvbdqFceUWAh -DnbjjvbdTkunaVoJ -EPDKjvbdiZtfLqOG -DoCjjvbdcImJkGXY -DncLKvbdpstGrSLU -DncLKvbdRpTfjGDw -DnbkKvbdznpREblY -DnbjjvbdqdEhomvB -DncLKvbdIwtBhMRQ -DoDKjvbdhtzFWqtb -EOcKjvbdiBncEwQq -EPDKjvbdZQleJMdq -EOcLKvbdLAkGlaxR -DoCkKvbdZsiIyDsO -EObkKvbdeOdsKssr -DnbjjvbdJcKCpjDY -EPDLKvbdSBdElIyL -EPCkKvbdyOTHwrhc -EPDLKvbdGLEsDIMu -EPCjjvbdmJETqVRa -DncKjvbdKDJbqJbx -EOcKjvbdbsCkTdKB -EOcKjvbduDCuXVno -EOcKjvbdrXPlDIxq -EOcKjvbdqlyixkhJ -EObjjvbdRkYfUgLT -EPDLKvbdLAkGmCXq -DnbjjvbdHgGzYxXg -DncKjvbdpstHSSKt -DoCkKvbdqvolCiYq -DoCkKvbdmgFYNOHZ -DnbkKvbdqGDeTvBI -DoDLKvbdyzeNrHhh -DnbkKvbdwzHefXeS -DoDKjvbdbiMjLGXY -DnbkKvbdTulQKTaR -DnbjjvbdsPunicVf -DncKjvbdqvpLcIyR -DncLKvbdOFEThhkE -EOcKjvbdZshhxdSn -DncKjvbdpyPHfpdY -DoDLKvbdNGcPmQUk -DoCkKvbdVgwvXfxz -DoCjjvbdCgLegAzc -DnbjjvbdauCGxLTh -DoDKjvbdqFceTvBI -DoCjjvbduMYXAsaX -EPCkKvbdrSVKmkAm -EObkKvbdOYOuzcnU -DncKjvbdYkqctNlN -DncKjvbdSZjHrcWA -DoCjjvbdrEFJQNua -EPCjjvbdRosfjFcw -EObkKvbdZoNiFEyj -EPDKjvbdVgwvXfxz -DoDLKvbdhbPCdvqR -DncKjvbdqvokcIyR -DnbjjvbdpssfqqkU -DncLKvbdzoPpdbkx -DnbjjvbduaDySoFI -EOcKjvbdEASImZwX -DncKjvbdbrcKtDjB -DoCjjvbdQccBQQdS -DoCkKvbdDigjVwjA -DnbkKvbdbVBfwkUI -EOcKjvbdIsYaSlxM -DoDLKvbdKVtedEgJ -EPCjjvbdIryArlxM -DncKjvbdpeceTuaI -EObkKvbdZshiYdSn -DncLKvbdZtIhyESn -DnbjjvbdOYOuzcnU -DoDKjvbdUxhTyjoO -EObjjvbdTppoVVHm -DncKjvbdrWolCiYq -DoDLKvbdNVSrKmAX -EObkKvbdiGicZWKV -DoDKjvbduVmwipsA -EPCjjvbdNPwqVnHT -EObjjvbdelewGmJk -EOcLKvbdgGLzNgHA -DoDKjvbdcJNJjfWx -DoCkKvbdyOTHwriD -EObjjvbdEzspeLcJ -DnbjjvbdjhHLeenL -DncKjvbdOStWHFVQ -EOcLKvbdsZlPsBHn -EPDLKvbdtcCuWuno -DnbkKvbdULunaVni -EPDKjvbdJqZdnfNe -EOcKjvbdqwPkcIxq -EObjjvbdrJAJeNOe -DnbjjvbdRECaPpdS -EPCjjvbdpfEEsvBI -EPDLKvbdIsZArmYM -EPDLKvbdJYUCILpp -EOcLKvbdYlSDtNlN -EPCjjvbdJYTbHkpp -EPDKjvbdYzbfSJvZ -EPCjjvbdRaceMJYk -EObjjvbdZisHofaf -DnbkKvbdRbEElIyL -EOcLKvbdijFhKNXr -EOcKjvbdRXNdDMID -DncLKvbdbiNKLGXY -DoDLKvbdlZSrSyHU -EObkKvbdqZPIHRDx -DoDKjvbdnPzYujxb -EObkKvbdnHEwlmfy -EObkKvbdCWzdIePv -EObkKvbdqlyiyLgi -EPCjjvbdkySqryHU -EObkKvbdcImKKevx -DncKjvbdEASJMzWw -DncKjvbdRkYfUfkT -EPCjjvbdqYoIGpcx -DncKjvbdGckWKBjK -EPCjjvbdYTLaNUOx -EPDKjvbdwtleRZMO -EObkKvbdGFiqnJUR -DncLKvbdlhdURVRa -EObjjvbdqlzJxkhJ -DncLKvbdFaPQyJzm -EPCkKvbdpssgRrLU -EObjjvbdiCOcFXRR -DncKjvbdqTtGqrLU -EPCjjvbdsCFlkgLZ -EOcKjvbduWOXiqTA -EOcKjvbdkClKqGuH -EPCjjvbdMowpvOGs -EPCkKvbdxrmhmRag -DoCjjvbdiUzFXRuC -EOcLKvbdUMWPAvOi -DoDLKvbdmfdwlmgZ -EPCjjvbdehKurNpg -EOcLKvbdBsAcTevr -EPCjjvbdZjTIPgBf -EObjjvbdPIAXyAZB -EPCjjvbdCDoaVjNG -DncKjvbdrpVnicVf -DoDKjvbdlZTSSxgU -DncKjvbdGZVVAdYC -EPDLKvbdsCGMkfjy -EPCjjvbdSPsfjFdX -DoCjjvbdJXsbIMQp -DncKjvbdzeZnzdyp -DnbkKvbdlYsRsYft -DncKjvbdbiMjLFwY -EPDKjvbdyOShYSiD -DoCkKvbdOTTufduQ -EPDLKvbdVwJYVcdg -DoCkKvbdGFiqnJTq -EOcLKvbdUslselWK -EObjjvbdkxsSSyHU -EOcLKvbdxsNhmSBg -DnbjjvbdqqtkOLAm -DnbjjvbdeFPRawDK -DnbkKvbdLZQirzuG -EPCkKvbdFWYpPlie -EObkKvbdrWpMCiYq -EOcKjvbdiiehKNXr -EPDKjvbdEvYopNJe -EPCkKvbdxrmhmSCH -DoCkKvbdptUHSRkU -EOcKjvbdKCjDRJcY -DoDLKvbdrMzKYkgi -DoCjjvbdZLrDtNkm -DoCkKvbdqYnggQcx -DnbkKvbdrovOibvG -DncKjvbdADRwizIp -EOcLKvbdZisHpHCG -EPCjjvbdZRNFImFR -EPDKjvbdVwIxVceH -EOcKjvbdrDeJQNua -EPCkKvbdIxTaglQp -DncKjvbdGFiqmiUR -EPCjjvbdVwJXvEEg -DnbkKvbdwuMeRZMO -EPCkKvbdZRNFImFR -EPCkKvbdnHEwlmgZ -EPDKjvbdLYqKSzuG -DoDKjvbdZsiJYdTO -DoDLKvbdShyjRAAl -DoDKjvbdRadFLiYk -DnbkKvbdjbkjpgUg -EObkKvbdUaBpsRRy -EOcKjvbdehKuqnRH -EObkKvbdDwxMUTsl -EOcKjvbdptUHSSKt -EPDKjvbdHEKuibJj -EOcKjvbdxxIjBpZk -EObkKvbdelewGmJk -DncLKvbdTvLpKUAq -EPCjjvbdGLErbhNV -DncLKvbdfHjvRmqH -DnbjjvbdkMakyeHP -EPDKjvbdJcKCpjDY -DoCkKvbdRECaPpcr -EOcLKvbdmgFYMmgZ -EObjjvbdZRMdiMeR -DoCjjvbdYzcFqivZ -DoCkKvbdeOeTKtTr -EPCkKvbdXFxytAPT -DncLKvbdZnnJEdzK -DncLKvbdhtyeWrUb -EOcKjvbdEJgivXjA -EPDLKvbdssSTYyeD -EPDLKvbdLBLGmCXq -DnbkKvbdKeegbApu -DoDLKvbdJYUBhLqQ -EPDKjvbdwNWANDdm -DoCjjvbdKfGIBaRV -DoCjjvbdbhljLFwY -DncLKvbdmgFXmNgZ -DoDKjvbdZRMeJNFR -DoCkKvbdWeyZtAOs -DoCkKvbdbiNKLFvx -EPDKjvbdUsmTfMVj -EPCkKvbdijFgjMwr -DnbkKvbdbsCjtDia -DnbjjvbdZQleJNFR -DoDLKvbdNQXqWNfs -EOcLKvbdULunaVoJ -DncLKvbdrEEhpOVa -DncLKvbdRyigsCvA -DoCkKvbdVwJYWEEg -DncLKvbdjKGIKMwr -EObkKvbdrEFIpNvB -DoCjjvbdGLEsDINV -EOcLKvbdJSyArlxM -EPCjjvbdTJZiqABM -DncLKvbdCTAbsewS -DnbjjvbdZjTIPfaf -EPCjjvbdbPfgELzd -DnbjjvbdLBLHMbXq -EPCjjvbdqiAKFMoF -DnbkKvbdIBlZdzAD -EPDLKvbdyTNiNRag -DoDLKvbdZjSgogCG -EPCjjvbdjAPgAofj -EPCjjvbdxmrgxTJD -EObjjvbdSPsgKGEX -EObkKvbdRWnDblHc -DnbjjvbdZQmFImFR -DoCjjvbdjuwODaww -EOcLKvbdVviXvEFH -EPCjjvbdcImJkGXY -EPDKjvbdVAbQrqSZ -DoCjjvbdWWiXudFH -EPDKjvbdapGfdLzd -EObkKvbdQwOEDMID -EPCjjvbdKDKCqKCx -DncKjvbdJvUfEEgJ -EObkKvbdDoDLKvcE -EOcKjvbdqwPkbhyR -EObjjvbdyTOJNSCH -EObkKvbdZsiIxdTO -DoCjjvbdaSFbhTfL -EOcKjvbdUslsekvK -DoDKjvbdehLWSORH -EPCkKvbdBsBDTfWr -DoCkKvbdMfbpNQVL -DoCkKvbdezvZFJUX -EObjjvbdJYUBhMRQ -DncKjvbdlhcsptqa -DoCkKvbdiZtfMQnG -EObkKvbdZRMdhleR -EPDLKvbdkySrSxgU -DoCkKvbdYlSDsmkm -DnbkKvbdkNBkzEfo -EPDLKvbdyYJKCPzL -EOcKjvbdqwPkbiZR -DncLKvbdqdFJQOWB -DoDKjvbdFyUtaDxC -DnbjjvbdZyDinDMS -EOcKjvbdqrVKnKaN -DoCjjvbdMgDPlotk -EPCjjvbdUVlPitBR -DoDLKvbdbsCkTcjB -EPCjjvbdnGdwlnGy -DnbkKvbdapGfdLzd -EPDKjvbddndsKtTr -DncLKvbdsrrTZZeD -EObkKvbdqdFJQOWB -DncKjvbdRadFLhxk -DnbkKvbdfILWSORH -DnbkKvbdqZOggQcx -EPDKjvbdCDpAujMf -EObjjvbdxsOImSBg -DoDKjvbdrSUjmjaN -EObkKvbdrMyjYkhJ -EObkKvbdANHySvzY -EObkKvbdgGLynGgA -DoDLKvbdNdcshiKd -EObjjvbdePErkTtS -EPCkKvbdSCEFLhxk -DoDKjvbdIxUBhLqQ -EPCkKvbdVvhxWDdg -EOcLKvbdKfGHbBQu -DoCjjvbdajlFoNcA -DoCkKvbdQdDAopdS -DoDKjvbdSBceMJZL -DoDKjvbdOStWGdtp -DoCjjvbdGdLWKBij -DnbkKvbdvOszpjnt -DncLKvbdUVlPjTaR -DoDLKvbdliDsptrB -EOcKjvbdZisHpHCG -DoDKjvbdkVwODaxX -DoDLKvbdfVzwpJzs -DnbkKvbdDjIKWYKA -EObkKvbdrJAJdmPF -EObjjvbdeATpmYJf -DnbkKvbdQmYByOUz -EPDLKvbdxmrhXsJD -EPDLKvbdCJLBjiGK -DoCkKvbdYpmFJMeR -DoDKjvbdXnRAXuWU -DoDKjvbdiMFDmtby -DnbkKvbddZyQYZQb -DncLKvbdZtIiYdSn -EObjjvbdwMvANDdm -EPDLKvbdIwsbHkqQ -DncKjvbdURQntthN -EObkKvbdTqROttgm -EPCjjvbdTkvOaVni -EOcLKvbdfNFwHNKL -EObkKvbdjgflFfOL -EObjjvbdUQqOuUhN -DncLKvbdegjurNqH -EPDLKvbdxUmEqZMO -DoDKjvbdGcjvKBjK -DoDKjvbdVTltFkuj -DnbkKvbdLYqKSztf -DoDKjvbdUyHtZkOn -EPDLKvbdvAcyTOdh -DncKjvbdqFcdsvAh -DncLKvbdrbFmMHKy -EOcKjvbdYlRdTnLm -DoCjjvbdEASJMzXX -EObkKvbdMoxQvNfs -EOcKjvbdiHJcYujV -DnbjjvbdvAcyTPEh -DoDLKvbdGQASwGfZ -EObkKvbdMoxRVnHT -EObkKvbdhgJcYvJu -DnbjjvbduWOXipsA -DoDLKvbdQcbaQQdS -EObkKvbdUsltFkvK -EPDKjvbdKyQirzuG -EPCjjvbdmJDtQuSB -EObkKvbdXrkaMsoY -EOcKjvbdrEFIpOVa -EPDKjvbdVqmwadkc -EOcKjvbdqYoIGqDx -EObkKvbdtbbtwWOo -EPCkKvbdSKxfUfkT -EPCkKvbdmJDsqUrB -DncKjvbdhaoCeWpq -EObjjvbdFxuVAdYC -EPCkKvbdqFcdsvBI -EPDLKvbdOTUWGeVQ -EPCkKvbdlhdUQtrB -DoDKjvbdCJLCLJGK -EPDKjvbdMgCpMotk -DnbjjvbdrbFlkgLZ -DoDKjvbdqBJFAWhE -EPCjjvbdpyPHfqDx -EOcKjvbdTlVoBVni -EPCjjvbdrRtkNkBN -EPCkKvbdWWhwuceH -EPDKjvbdcImKKewY -EOcKjvbdYSlBNToY -EObkKvbdZRMeIldq -EPDLKvbdMoxRWNgT -EObjjvbdMIbMQxAS -EPCjjvbdQdDBQQdS -EObkKvbddZyPwxqC -EOcLKvbdACrXiyiQ -EPDLKvbdcSbkUEJa -DncLKvbdTkunaWPJ -DnbjjvbdvBEYrndh -EObjjvbdmIctQuRa -DncKjvbdiUydvqtb -DoCjjvbdhkdcnUby -EOcKjvbdePFTLTsr -EOcLKvbdiHJbxujV -EObjjvbdZsiJZESn -EOcKjvbdpxoHfqEY -EPDKjvbdFyUuBDwb -DoDLKvbdBiLBkJGK -EPCkKvbdliDtQuRa -DoDKjvbdhbOcEwQq -DncLKvbdRosgJfDw -EObjjvbdrzMQSaIO -EObkKvbdUsmTfMVj -EOcKjvbdWXIxWEFH -EPCjjvbdcTCjtDjB -EObkKvbdbBVeGQPw -EOcLKvbdaSGDHtFk -DoDLKvbdqFdFUVaI -EPCkKvbdxxIjBozL -DncLKvbdNddUIiLE -EObjjvbduMYWaUAw -EPCkKvbdWWiXvDdg -EObjjvbdJXsbILqQ -DnbkKvbdDnbjjwCd -DnbkKvbdxUldqZMO -DoCjjvbdKyRKSztf -DncLKvbdLFehBaQu -EPDLKvbdjvXNdBww -EOcLKvbduaEZTPFI -DoCkKvbdfMevfmKL -EPCkKvbdpxoIGqEY -EPCkKvbdKWUecdgJ -EObkKvbdmbJwYOmu -EPCkKvbdIsZArmYM -DnbjjvbdxLXDgzyf -DncLKvbdEvYopMjF -DncLKvbdmJETqVRa -DnbkKvbdrouoKDWG -EPDLKvbdbVCGwkTh -DoDKjvbdZirhPgCG -EPDKjvbdTvMQKUAq -DnbkKvbdLrWlzVQz -EOcLKvbdrEEiPmua -DnbjjvbdczZQXyRC -DncKjvbdnUtzKjSG -EPCjjvbdkNCLzFHP -DncKjvbdZyEKNbkr -EObkKvbdJuuFdEgJ -DncLKvbduCbuXWPP -EPCjjvbdyNrhXriD -DnbkKvbdIxTaglQp -EPCjjvbdJvVFceHJ -EPCkKvbdVBBprqSZ -EOcKjvbdkxrqsYgU -EPCjjvbdGLFSbhMu -EObjjvbdnPzZWLYb -EObkKvbdjblLRGuH -DoDLKvbduaDyTPFI -EPCjjvbdiifIJmXr -EObkKvbdYkqctOMN -EPCkKvbdelfXHMjL -EPDLKvbdeFOrCWbj -EObjjvbdeUAUATNW -EPCjjvbdWRmxBeMD -DoCjjvbdZxcinDMS -EOcLKvbdWRmwbElD -DoDLKvbdpssfrSLU -DncLKvbdQccApRES -DoDKjvbdGdKujBij -DoDKjvbdZLqdTmlN -DoCjjvbdbiNKLGXY -DoCjjvbdVZITzKoO -DoCkKvbdsPuoKCvG -EPDKjvbdNGbomQVL -DnbkKvbdkIHMGFnL -EPDKjvbdvPTzpjoU -EOcKjvbdczZPxZQb -DncKjvbdliEURUrB -DnbkKvbdGZUtaDxC -EPCjjvbdrMyjZLhJ -EPCjjvbdTulPjTaR -DoCkKvbdZeYGzhJC -DncLKvbdwygefYEr -DnbjjvbdehLVrOQg -DnbjjvbdZxcjNblS -DoCjjvbdSLYetgKs -EPCkKvbdVAbQrpqy -EPCjjvbdtTSTZZdc -DnbkKvbdSCEFMIyL -DoDKjvbdrDeJPmvB -EOcLKvbduDDVXVno -DoDLKvbdZdxGzhIb -EObkKvbdhgJbxujV -DncLKvbdlYsRsZHU -DoDLKvbdhzUelQmf -EObkKvbdWWhwvDeH -EPCjjvbdjgfkfFmk -EObkKvbdzaAPHGal -DoDLKvbdEPDLLXDE -DoCjjvbdTukpKTaR -EOcKjvbdhaoCeWpq -EPDKjvbdwjvdHzzG -EPDLKvbdJTZBTNYM -DoDLKvbdRECaPqDr -DncKjvbdjhGkfGNk -EObkKvbdjhGkfFmk -DncLKvbdqlyixkhJ -EObkKvbdjEkHUoAO -EPCkKvbdcasMrAUN -EObjjvbdhzUfLqOG -DoCkKvbdEvYopNKF -EPCjjvbdjuwODaxX -DncLKvbddiirWUzn -EObkKvbdOStVfduQ -DnbjjvbdypnmIjXA -DnbjjvbdRWnEClHc -EOcLKvbdbhljLFvx -EPDLKvbdJXsaglRQ -EObkKvbdhzUfLqOG -EObkKvbdnPyxujyC -DoDKjvbdBiKajiFj -DoDKjvbdZjTHpHBf -EPCjjvbdaSFcITek -EObjjvbdYzcFqiuy -DncLKvbdqdFIpNvB -DoDKjvbdLYqJrzuG -DoDLKvbdVwJXucdg -DnbjjvbdhbObdvqR -DoCkKvbdCEQBWJlf -DoDLKvbdSCDdlJYk -EPDLKvbdZyEJnCkr -DoDKjvbdvAcyTOeI -DoDKjvbdkIHLfFmk -EPCjjvbduaEYroFI -DnbkKvbdjblKpgUg -EOcKjvbdwygefYFS -EOcKjvbdliDsqUqa -DnbjjvbdjcMLRGtg -EObkKvbdRbEElJYk -EPCkKvbdqrUkNjaN -EOcLKvbdRotGifDw -DnbkKvbdUsmUGLuj -DoCjjvbdeKJqvUzn -EPDKjvbdQwNdClHc -EOcLKvbdcScLTcjB -DoCjjvbdvBDxroEh -DoDLKvbdIxUBglQp -EPDLKvbdfVzxQJzs -DncLKvbdqlzKYlIJ -DoDKjvbdaNLCSuMg -EOcKjvbdwjwDgzyf -EPDKjvbdIxTaglRQ -DoDKjvbdVTltGLuj -DoCkKvbdiMFENuDZ -EOcLKvbdZyEJnDMS -DnbkKvbdiBoCeXRR -EPCkKvbdbiMijewY -EOcKjvbdmttzLJqf -DncKjvbdYTLaMtOx -EPCjjvbdfIKuqmqH -DoCjjvbdBdQBVjNG -EObkKvbdieLGuPAO -EPDLKvbdsZlQSaIO -DnbkKvbdEztQeMDJ -EPCjjvbdIjEAJpHE -EOcLKvbdfILWRmpg -EPCjjvbdZyDinDLr -DncKjvbdLGGIBaRV -DncLKvbdmozZWLZC -DoCkKvbdlZSrSxft -EOcLKvbdFjdrcINV -EOcKjvbdQvnDblHc -DoCkKvbdqUUHRqkU -EPDKjvbdnBjWwnmu -DoCjjvbdZxcjNbkr -DncKjvbdZisIQHCG -DoCkKvbdJcJcRJbx -EPDLKvbdlhdUQtqa -DnbkKvbdrzLpSaHn -DoDKjvbdziuPpDrt -EPDKjvbdEYXlTtUM -EObkKvbdqdFIpOVa -DncKjvbdpxnhHQdY -DnbkKvbdLhakqYAS -EPCkKvbdrRtkNkBN -EObkKvbdqrVKmjaN -EOcKjvbdxUldqZMO -EOcKjvbdrbFllHKy -DoCkKvbdySmhlrBg -EPCkKvbdkxrqsYgU -EPCkKvbdZLqcsnMN -DncKjvbdFpATXHFy -EPDLKvbdZRMdiMeR -EPDLKvbdRNXbYmtz -DoCkKvbdpyPIGqEY -DoDLKvbdKaKfmCYR -EPDLKvbdrylPsBIO -EObjjvbdUQqOuVHm -EPCkKvbdezvZFItX -EOcKjvbdZirhQHCG -DoDKjvbdePFSjssr -EOcKjvbdCTAcTfXS -EOcKjvbdkxsRsYft -EPDLKvbdQwODcMHc -DoDKjvbdwuNFRZMO -EPCjjvbdEuyPomKF -DoCkKvbdpxnhGpcx -DncKjvbdiVZeWrUb -EOcKjvbdrEEiPmvB -EOcLKvbdZxdJnDLr -EObjjvbdUtNUFkvK -DoDLKvbdZQmFIldq -EObjjvbdnCJvwnmu -EPCkKvbdRWmccLgc -DnbkKvbdnUtykJqf -DnbkKvbdVBBqSpqy -EPCkKvbdZoOIddyj -DnbkKvbdZQldiNFR -DncLKvbdmRyVZsDi -DoCjjvbdcasMrATm -EOcLKvbdtbbtvuno -DoDLKvbdZtJJYdSn -DnbkKvbdGKeTDHlu -DoCkKvbdZjTHpGbG -EOcKjvbdHDjvKCKK -EObjjvbdddnqbXCj -EObkKvbdlZTSTYgU -EPCjjvbdqqtjmkBN -EObjjvbdtAGqIAAr -EObkKvbdrRtjmjaN -DnbjjvbdMRwMytpz -EPCkKvbdsQWPJbuf -DoDKjvbdqFceUWBI -DoCkKvbdnBjWxPNu -DoDLKvbdiUzFXRuC -EObkKvbdQccBPqES -DnbjjvbdOFDtIiLE -EPDKjvbdYlRcsnMN -DncKjvbdFfJrNhsq -DoCkKvbdsCFmMHKy -EPDLKvbdYkrETnMN -DoCjjvbdYNqAXuWU -EPDKjvbdrovPKDWG -DoDLKvbdbKlGOmcA -DoCkKvbdOStWHFVQ -EObjjvbdhbObeXQq -EPCjjvbdeEnrBwDK -DoDLKvbdrbFmMGkZ -DncKjvbdxZhGGYFS -EPDKjvbdbrbkTdKB -EPDKjvbdraellGkZ -EPCkKvbdssSTZZeD -EPDKjvbdDjHiuxKA -DoCjjvbdzoPqFDMY -EPCjjvbdlAlnmALA -DoDKjvbdmtuZjjRf -DoDKjvbdFpASvfey -DoCkKvbdjlakyeGo -DoDKjvbdxnSgxTIc -EPCjjvbdxZhFfXeS -EPCkKvbdqcdiPnVa -EOcLKvbdmfeYMnHZ -DoDLKvbduCbuWvOo -DoDKjvbdmIcsqUqa -EPDKjvbdzoQQdblY -DoDLKvbdRNXayOUz -DnbjjvbdrJAKFNOe -DnbjjvbdZLrEUOMN -EOcKjvbdwygeexEr -EPCkKvbdbVBfwjtI -EObkKvbdKDKDRJbx -DoCkKvbdGckWKBij -EOcKjvbdzjVQPdSt -EPDLKvbdqlzKYkhJ -DnbjjvbdajkennDA -DoDLKvbdRzJgsCvA -EObjjvbdehKuqmqH -DncKjvbdajlFnnDA -DnbjjvbdjEkHUoAO -DoCjjvbdFVyPomKF -DoCkKvbdJcJbpjCx -DnbkKvbdRaceLiZL -EPDKjvbdeEnrBwDK -DoDLKvbdxKvdHzyf -DoCkKvbdSPtHKFcw -EObkKvbdjhHMGGOL -EOcLKvbdGGJqnItR -DoCjjvbdnGdxNNgZ -DoDKjvbdbKkfOmcA -DnbjjvbdelewHNKL -EPCkKvbdcSbjsdJa -EPCkKvbdTAEhgbOd -DncLKvbdUslselVj -DnbjjvbdVrOYBeMD -EObjjvbdEzspeMDJ -EPCjjvbdcTDLTcjB -EPDLKvbdsPvPJbuf -EOcKjvbdqGEFUWBI -EPDKjvbdVgxWYGxz -EOcLKvbdSPtGjGDw -EObkKvbdGckVibJj -DoDLKvbdeEoSCWcK -EPCkKvbdQvmdClID -DncLKvbdhytelROG -EPCkKvbdeXzTtSFz -EPCkKvbdrXQMDIxq -EObkKvbdtlXvaUAw -DnbkKvbdiMFDmtcZ -EPDLKvbdJqZeOfNe -EPDLKvbdmIdUQtrB -DoDKjvbdVTltGLvK -DncLKvbdZRNEhleR -EPDKjvbdjlakydfo -DnbjjvbdFpASvfey -EPCkKvbdkySrTYft -EOcLKvbdVUMtGMVj -EPDLKvbdmRyUysDi -EPCkKvbdGKeScHlu -EObjjvbdczZPwyRC -EPDLKvbdVYhUZkOn -DncLKvbdJbibqKDY -EPDLKvbdfekzNfgA -EObkKvbdKQydoGOF -EObkKvbdVgwvXfxz -DncLKvbdQdDApQcr -DncLKvbdGFjRnJUR -DncKjvbdjgflFemk -DoDKjvbdlhctRVSB -DncLKvbdZLqctOLm -DncKjvbdfSAvzlCo -EPDKjvbdZRMeIleR -EObjjvbdZRMeJMdq -EOcKjvbdMuTSKmAX -DncKjvbdqYngfpdY -DnbkKvbdxrmiMqbH -EObjjvbdbPgGckzd -DoCkKvbdpstGqqkU -DncLKvbdmJDsqVSB -EPDLKvbdtunYKQsA -EObkKvbdDnbkKwCd -EPDLKvbdEXwkstUM -DoDKjvbdrRtkNkBN -DncLKvbdIwtCIMQp -EPDLKvbdZQmEhmEq -DnbkKvbdxmrhYTIc -DoCjjvbdCSaDUGWr -EPCkKvbdatagXkUI -DncLKvbdEPDKkWcE -DncKjvbdZjShPgBf -EPDKjvbdHDkVjCJj -DoCjjvbdsrrTYzEc -EObjjvbdhlEcnUby -DnbjjvbdemFvfmKL -EObkKvbdlhcsqUqa -DoCkKvbdZtIiYdTO -EObkKvbdEXwlTssl -DoDKjvbdhaoCdvqR -EObkKvbdliEURUrB -DoDLKvbdEYXkstTl -DncKjvbdFkEsDINV -DoDKjvbdFkErcHmV -DoDLKvbdKCjCpjDY -EPCjjvbdjJegjMxS -DnbkKvbdnCKWwnmu -DnbjjvbdqwQLbiYq -DoDLKvbdSZigsDWA -EObjjvbduVnYKRTA -EOcKjvbdTlWOaVoJ -DnbjjvbdSCDeMJYk -DnbkKvbdQvmdClID -EPCkKvbdziuQPdTU -EOcLKvbdhficZWJu -EOcKjvbdZLqdTmkm -DoDKjvbdcImKKevx -EOcLKvbdGFirOJUR -EObkKvbdREDApRES -DoDKjvbdHELWKBij -EOcKjvbdrSVLNkBN -EOcKjvbdBdQBWJlf -DoCjjvbdFpATXHGZ -DnbjjvbdqZOhGpdY -EPDLKvbdCSaDUGWr -DoDLKvbdrpWPJcWG -DnbjjvbdZsiJYdTO -EPDKjvbdJvVGEFGi -EPCkKvbdmIctRVSB -DncKjvbdBiLCKhfK -DoCkKvbdZisIQGbG -DoCjjvbduWNwjQsA -EOcLKvbdiHKCyVjV -EPCjjvbdlZSrTZGt -EObjjvbdNPxRWNgT -DncKjvbdeAURNXif -DncLKvbdOStWGeVQ -DoCjjvbdJvUeceGi -DoDKjvbdXsMBMsnx -EPDKjvbdGLFSbhMu -EPDLKvbdEvZPolie -EOcKjvbdrRtjnLBN -EPDKjvbdyOTHxTJD -EPDKjvbdmajWwnmu -EPCjjvbdrNZjZLhJ -DncKjvbdajlFoODA -DoDKjvbdrEFIpOVa -DnbkKvbdpedEtWBI -DncKjvbdqwQMChyR -DnbjjvbdnCKWwnnV -DoCjjvbdNUsRkNAX -EOcLKvbdULvPBWPJ -DncLKvbdjlalZdfo -EPDKjvbdjJfHjNYS -DoDKjvbdPxmAHTSK -DnbkKvbdmIctQtqa -EObjjvbdnHFXmNfy -EPCkKvbdqlzJyLhJ -DnbjjvbdVqnYCElD -EPDKjvbdqTsgRqkU -EPCjjvbdADSYKZhp -EPDLKvbdEvZPoljF -DoCkKvbdLFfICBRV -EOcLKvbdZRNFJNFR -EPDKjvbdpedFUWBI -EPDKjvbdVwJYVceH -DoCjjvbdGYtuBDwb -DoCjjvbdVYgtZjoO -DncKjvbdQccApQcr -EOcLKvbdWWiYWDdg -DncKjvbdyTOJNSBg -DnbjjvbdbAueFpQX -DnbkKvbdiUydwSUb -DoDKjvbdKVtfDeHJ -DoDKjvbdEObjkXCd -EOcKjvbdqlyjYlHi -EOcKjvbdfRaWzlCo -EObjjvbdRWmcblID -DoDLKvbdCDpAvKMf -DncLKvbdmuVZjjSG -EPDLKvbdkaMnmALA -EPCkKvbdcSbkTdKB -DnbjjvbdZtJIyESn -EPCkKvbdQvmccMHc -DncLKvbdfHjvRmpg -DoCjjvbdVvhwvEEg -EPCjjvbdXrkaNTnx -DnbkKvbdGFirNiUR -EObkKvbdZLrDsnLm -EObkKvbdySnJNRbH -DncKjvbdaMkBsUmH -EPCkKvbdqGEFUWBI -EObjjvbdmajXYOnV -DnbkKvbdHELWKBjK -EPDKjvbdWSOYCFLc -DncLKvbdehKurNqH -EPDLKvbdSZjIScWA -DncKjvbdZQldiNEq -DncLKvbdVwIwvEEg -DnbjjvbdauCGxKsh -DnbkKvbdKefHbApu -DoCkKvbdssSTYyeD -DnbjjvbdSPsgJfEX -DoCkKvbdeKKRvUzn -DoDLKvbdiMEcnVCy -DoDLKvbdoAKzsgcn -DoDKjvbdDoDKjvbd -DncKjvbdFWYopMie -EPDLKvbdRNXaxmtz -EOcLKvbdKefHaaRV -EPDKjvbderAvzkbo -EObjjvbdzoQREcMY -DnbkKvbdijFgjMwr -EObjjvbdhbObdvqR -EPCkKvbdySmiMqbH -EObkKvbdyzeOSIIh -DnbkKvbdjcLkRHUg -DoDLKvbdJpydoGNe -DoDKjvbdwXMBWBWV -EObkKvbdsBfMkgKy -DnbkKvbdYkqdTnMN -EPCjjvbdEPDLLWbd -EObkKvbdDwxLtUUM -DncKjvbdNrtVgFUp -EPDKjvbdZQleJNFR -EPDKjvbdJKEAKPfd -DnbjjvbdhgKCxvJu -EObkKvbdLAkHMbXq -EPDKjvbdhancEvqR -DoCjjvbdNsUWHEuQ -DnbkKvbdZjTHofaf -EPCjjvbdrDdiQOVa -EPDKjvbdkMbLzEgP -EPCkKvbdZoOJFEyj -EPCkKvbdADRxJyhp -EObjjvbdaSGCgsfL -DnbjjvbdJbjDQibx -EPCjjvbdpfEEtWBI -EOcLKvbdZxdJmblS -EPCkKvbdRpTgKGEX -DoCjjvbdzRPNIiwA -EObkKvbdzoPpeClY -EObjjvbdeFOrBwDK -DoCkKvbdOTTvHEtp -DnbjjvbdGQATWgFy -EPCjjvbdEvZQQNJe -EObkKvbdjvWnECYX -DoDLKvbdyTOIlqag -DnbkKvbdEASJNZvw -EOcKjvbdsZkosBHn -DoDLKvbdtSqsYyeD -DncKjvbdqlyixkgi -EPCjjvbdTppnuVHm -DncKjvbdatbHYKsh -DoCkKvbduVmwjQsA -EPCkKvbdvAcxsOeI -EObkKvbdRjyFuHLT -EObjjvbdTukoitAq -EOcLKvbdkySqrxft -EObjjvbdQccBPpdS -DoDKjvbdffLzNfgA -DoDKjvbdiCOcEvqR -DncKjvbdIBkzEzAD -EObjjvbdVZHsyjoO -EOcLKvbdZoNheEzK -DnbkKvbdsZkpTAhO -DnbjjvbdqFdEtVaI -DnbkKvbdIGfzZXwg -EPDLKvbdlrZVZsEJ -EObjjvbdBcpAvJmG -DnbjjvbdtSqsYzFD -EPDLKvbdJJdAJogE -DncKjvbdxVMdpyMO -EPCjjvbdQwOEDLhD -DoCjjvbdmgFXmNgZ -DoDLKvbdjEkGuPAO -EPCjjvbdACrXjZiQ -DoCjjvbdZMRdTmlN -DncLKvbdiLeDnVDZ -EObjjvbdVAaprpqy -DoDLKvbdRjyFuGjs -DnbjjvbdVAbQrprZ -EObkKvbdSZjHrcWA -EPDKjvbdVrOYBeMD -EPDLKvbdDwxMUTsl -EPDKjvbdRadElIxk -DnbjjvbdmozZWKyC -DoDLKvbdptTgRrKt -EPCjjvbdatagXkUI -DncLKvbdZLqcsnMN -DoDLKvbdfNFwGmJk -EObkKvbdqTsfrSKt -DncLKvbdZjTHpGbG -DoCjjvbduWNwipsA -EPDKjvbdauCGwkTh -DncLKvbdKVuGEFGi -EObjjvbdZirhPfaf -DoDKjvbdxKvcgzyf -DnbkKvbdxsNhlrCH -DoCkKvbdBsBDUGWr -DncKjvbdfMfXHNJk -DnbjjvbdOSsugFVQ -DncKjvbdZisIPfaf -DnbjjvbdZHXEAOsJ -DnbjjvbdLZRJrzuG -EObkKvbdwuNFQxlO -DncKjvbddxZtURez -EPCkKvbdxrmiNSCH -DoDKjvbdiUydwSVC -EObjjvbdiifIJlwr -DncLKvbdssSSxyeD -EPDKjvbdOEcsiJLE -EOcKjvbdySnIlrBg -EPCkKvbddZyQYZRC -DnbjjvbdWXJXudEg -DoDLKvbdKaLHNCXq -DoDKjvbdGGKRmiTq -DnbkKvbdlrYtyrdJ -EPDKjvbdhtzEvrVC -EObkKvbddZyQYYqC -DoDLKvbdhaoCdwRR -EPCkKvbdxLWdHzyf -DoDKjvbdySmhmRbH -DnbkKvbdZLqcsmlN -EObjjvbdZtJIxdTO -DoDKjvbdDwwksssl -EPDKjvbdFyVVAdXb -DoCkKvbdUtNUFkvK -EPDLKvbdxmsIXsIc -EPDLKvbdUsmUFkuj -EOcKjvbdGKdsDHlu -EOcKjvbdACqwjZiQ -EPDKjvbdFpASwHGZ -DoCkKvbdGZUtaDxC -DncKjvbdmSZVZsEJ -DoCjjvbdJbicRKCx -DncLKvbdTvMQJsaR -DoCjjvbdNeDtJJKd -EPCjjvbdnPzYvKxb -DoDLKvbdyTNhlrCH -EPDKjvbdRosgJecw -EObkKvbdTAEiICOd -EOcKjvbdapHHDkzd -DoCkKvbdjlakzFGo -DncLKvbdrpWPJbuf -DnbjjvbdNQXqVnHT -EOcLKvbdkNCLzFHP -EObjjvbdTukpKTaR -EOcLKvbdEuxpPlie -EPCkKvbdJuuFdFHJ -EPDKjvbdGGJqmiTq -DnbjjvbdOAIrtJrA -DnbjjvbdelfWgNKL -EObkKvbdhbOcEwRR -DncLKvbdqiAKFNPF -DncKjvbdVqnYCFMD -DoDLKvbdWHxWXgYz -EOcLKvbdNVTSKmAX -EPDKjvbduaDySndh -DnbkKvbdiifIJlxS -EPDKjvbdeATpmYJf -DncLKvbduCcVWuoP -EPCjjvbdhficYvJu -DncKjvbdehLVqnQg -EPCkKvbdrDeJPmua -DoCjjvbdTfzmlWue -DncKjvbdZoNiFEyj -DoDLKvbdxmsHxSiD -EObkKvbdVwJYVdFH -EPCjjvbduMXwBUBX -DnbkKvbdTqROuVIN -EPCjjvbdGKeTCglu -EPDLKvbdcyyPwxpb -EPDLKvbdQmXayOUz -EPDLKvbdZyDinCkr -EPDLKvbdZoNheEyj -DncLKvbdmfdxMnGy -DnbkKvbdkClLRGuH -DncLKvbdJXsbIMQp -DnbjjvbdjJegilxS -DoCkKvbdnPyxukZC -EPDKjvbdZMRcsnLm -DoCkKvbdHffzYxYH -DnbkKvbdbsDLTcjB -DoDLKvbdSwjlNzjx -DncKjvbdkaMnmALA -DncLKvbdqmZjZLhJ -DoDKjvbdqrUkNkBN -DncLKvbdmfeXmOGy -EPCjjvbdZMRdTmlN -DnbkKvbdypnlhjXA -EPDLKvbdyOTHxTJD -EObjjvbdMRwMzVQz -EPCjjvbdSCDeMIxk -EObjjvbdOXnuzdOU -EPDKjvbdOStWHFVQ -DoDLKvbdrzLpTAgn -DnbkKvbdULuoAvPJ -EPDKjvbdZxdKODMS -EOcKjvbdbAvEfPpX -DncKjvbdyOSgwriD -EPDLKvbdrJAJdmPF -EPDLKvbdauCGxKtI -DncLKvbdqrVLOLAm -EPDKjvbdkHgLfFmk -DncKjvbdUaCRSqSZ -DnbkKvbdbQGgELzd -EOcKjvbdcJMijfXY -EPCkKvbdeOeTLUTr -EOcKjvbdQmYByNtz -EPDLKvbdFxuVBDwb -EOcKjvbdGGJrNiUR -DoDKjvbddndsLTtS -EOcLKvbddZyPxYqC -EPCkKvbdSKxfVHLT -EOcKjvbdSCDdkiYk -DnbjjvbdtvNwjQsA -EOcKjvbdJXsbILqQ -EObjjvbdjcLkRHVH -EObjjvbdkCkkQgUg -DoCjjvbdTqQnttgm -EPCkKvbdEuyPoljF -DoCkKvbdTqQnuUgm -DoDLKvbdLrWlzVQz -EPCjjvbdRjyGVGkT -DoDLKvbdHEKvKBjK -DoCjjvbdnCJvxOnV -EObkKvbdptUGrRkU -EPDKjvbdQwNcblID -DoCjjvbdIidAKPgE -DoCjjvbdTYLMNzkY -DnbjjvbdEztRFMCi -EObkKvbdBhkCLJGK -EPDLKvbdZisHpGbG -EPDLKvbddePRbXDK -EObkKvbdUQpntuIN -EObjjvbdEPCjjvcE -DncKjvbdbiNJjewY -EPDLKvbdVrOYCElD -EPCkKvbdSBdElIyL -DoDLKvbdzjVQQETU -DoCjjvbdCDpAvKNG -EObkKvbdNHComPuL -EOcKjvbdGdKvJaij -DnbkKvbdqmZjYkgi -DncKjvbdQvnEClID -DncLKvbdWWiXudFH -DoDLKvbdCEQBWJlf -DncKjvbdMpXqWOGs -EPDKjvbdVBCRSqRy -EPDLKvbdqUTgSRjt -EOcLKvbdJXtCHkqQ -EObkKvbdBiLBkJFj -EOcLKvbdVvhwvEEg -EOcKjvbdCTBCsewS -EOcKjvbdyNsHwriD -DoDKjvbdwzHfFxEr -DnbjjvbdypoMiJwA -DoCjjvbdJbicQjCx -EOcLKvbdVUMsekuj -EOcKjvbdCEQBWJlf -EObjjvbdIjEAKQGd -DoCjjvbdDjIJvXjA -DoDLKvbdFyUuAdYC -DncLKvbdRotGiedX -DoCjjvbdBhkBjhej -EOcKjvbdBhkCKhfK -EPCkKvbdLFfHbBRV -DoCkKvbdNUrrLNAX -EOcKjvbdZoOIeEzK -EPCjjvbdkMbMZeHP -DoCjjvbdkVwNdBxX -EPCkKvbdNddThiKd -DnbjjvbdjcLkQftg -DnbkKvbdFkErcHmV -DnbjjvbdqGEEtWAh -DncKjvbdmSYuZsEJ -DoCjjvbdUsmTfMWK -DoCkKvbdVUMtFkvK -EOcKjvbdKfGICBRV -DnbkKvbdMSWlzUpz -EOcLKvbdVBBprpqy -EPCjjvbdnHEwmNgZ -DoCkKvbdeEoRawDK -DnbkKvbdpssgSSLU -DncKjvbdOSsugFUp -DnbkKvbdwzHfGYFS -DoCjjvbdTAEiHbPE -EObkKvbdKaLGmCXq -DnbkKvbdCWzciFQW -DncLKvbdnVVZjiqf -EPCjjvbdOStWHEtp -DoDKjvbdkIGkfFmk -DoDKjvbdZjTIPfbG -EOcKjvbdXsMAlsnx -DnbjjvbdILazmwRL -EOcKjvbdrDdiPmvB -EPDKjvbdiUzEwRuC -EOcKjvbdqAheAXHd -EPCjjvbdRyigsCvA -DoCjjvbdpyOggQcx -EPCkKvbdZyDjNblS -DncLKvbdFejSNiTq -EPDKjvbdzRPNIjXA -DncLKvbdaMkBsVMg -EObkKvbdLYqJrzuG -DncKjvbdsBfNMHLZ -EPDKjvbdjgflFfOL -DoDKjvbdCTAcUGWr -DnbjjvbdSLZGVGkT -DoCkKvbdZQmEhldq -EPDKjvbdUsmTfMWK -DoCjjvbdKefICBRV -EPCjjvbdZMSDsnMN -EObkKvbdwzIGGXdr -EObjjvbdrRtjnLAm -EPDKjvbdXrlAmTnx -EPCjjvbdZtJJZETO -DnbjjvbdieLGtoAO -DnbkKvbdnCJvxPOV -EPDKjvbdjKFgjNYS -DoCkKvbdlhcspuRa -EPDKjvbdbAvEfQPw -EOcLKvbdiGjDYuiu -DncKjvbdnQZxvLZC -DoDLKvbdaogHDkzd -DnbjjvbdMfcQMouL -DncKjvbdKaKgMbYR -DncKjvbdrbGNMHKy -DoCkKvbddoFSjtUS -EPDLKvbdNddTiIjd -EPDKjvbdhgKDZViu -EPDLKvbdkMbLzEfo -DoDKjvbdjmCMZdfo -DoDKjvbdSCDeLhyL -DoCkKvbdQwODcMID -DnbkKvbdgGLymgHA -EPDKjvbdWIYVwfxz -DnbkKvbdZLqdUNkm -DoCkKvbdYlSETmkm -DnbkKvbdLqvlyuQz -DnbkKvbdZRMdiMdq -EOcLKvbddePSCXCj -EPDLKvbdRacdkiYk -DnbjjvbdZisIQGbG -EObjjvbdrpVnibvG -DncLKvbdIxUCHlRQ -EPCkKvbdhuZeXRtb -DnbjjvbdQwODblID -DoDKjvbdezuyEhsw -DncKjvbdiLddNtcZ -EPCkKvbdiLeENtby -DnbjjvbdxKvcgzzG -EPDLKvbdRXNdClID -DncLKvbdEKHjVwjA -EOcLKvbdzoPqFCkx -DoDLKvbdliEURUqa -DoCjjvbdyOTIYTJD -DncLKvbdIHGyyXwg -EPCjjvbdShyjRABM -DoCkKvbdnPyyWLYb -EObjjvbdsPvPJcVf -EPDKjvbdTXjlNzjx -DoDKjvbddneTLUUS -EOcKjvbdmuUyjiqf -DncKjvbdZoOIddzK -DoCjjvbdpyOhGqEY -DoCkKvbdwjwDgzyf -DnbkKvbdxZgeexEr -EOcLKvbdHDjvKCKK -DoCkKvbdpxnhHQdY -DoDLKvbdLrWlzUpz -EPDKjvbdatbHXkTh -DoDLKvbdZyDinDLr -EPCjjvbdGGJqnJTq -DoDKjvbddneTLTsr -DncLKvbdyzdmqhJI -EObkKvbdRjxfVGkT -EPDKjvbdOAJTTirA -EPCjjvbdZoNiFEzK -DnbjjvbdOhAXyAYa -DnbjjvbdACqwizIp -DoDLKvbdcImJjevx -EPDLKvbdxmrhYTIc -DoDLKvbdjcLkRGuH -EPCkKvbdxVNEpxlO -EPCkKvbdKCibqJbx -DoCkKvbdjJfIKMxS -DoDLKvbdVYhUZjoO -EPDLKvbdrJAKEmPF -EOcLKvbdRDbaQRDr -DoCkKvbduWOXiqTA -DoCjjvbdZyDjNcLr -EObjjvbdbBWEeoow -EPDLKvbdUQpnttgm -EOcKjvbdlBNOmALA -DnbjjvbdSPsfiecw -DnbjjvbdwzIGGYFS -EOcKjvbdLGFgaaRV -EOcKjvbdrXQLcJYq -DnbkKvbdmbKXYPOV -DoCkKvbdZisHogCG -EPCkKvbdFVyPpMjF -EOcKjvbdYkrDsmkm -DoDKjvbdxUmEqYlO -EPDKjvbdKNAEZgUa -DoDLKvbdqZPIGpcx -DoCjjvbdMgComPtk -EObjjvbdUyHszKoO -DoCkKvbdeEnqavcK -EPDKjvbdqYoIGqEY -DoDLKvbdCDoaWJmG -EPDLKvbdlZSrTZHU -EPCkKvbdZxcinDMS -DoCkKvbdgFkzNfgA -EOcKjvbdYNqAXtvU -EObjjvbdwygefYEr -EPCkKvbdbBVdfQQX -DnbkKvbdqrVLOLAm -EOcKjvbdFjeTDINV -DnbjjvbdnHFYMnGy -EPCjjvbdrbFllHKy -EPCjjvbdZLrDtOMN -EPDLKvbdcJNKKfWx -DoCjjvbdraemMHLZ -DoDKjvbdeJjSWUzn -EPCkKvbdZnmiEdyj -DnbjjvbdwtleQxlO -DnbkKvbdDwwlUTtM -DoDKjvbdrWpMDJZR -EOcKjvbdegkVrORH -EPCkKvbdiCOcFWqR -DnbkKvbdBsBDTevr -DoCjjvbdjcLjpfuH -DnbjjvbdZxdKODLr -DoCjjvbdqceIpOVa -DoDLKvbdVvhxVceH -EObkKvbdsrqryZdc -DnbkKvbdMSWlytpz -DoDLKvbdqTsfqrKt -EPCjjvbdjKGIKNYS -EOcLKvbdiGibxvKV -EPCjjvbdKDKCpibx -EPDKjvbdQdDBPqDr -DncKjvbdozmdLYPA -DoCkKvbdTvLojUAq -DnbkKvbdbhmKLFwY -EPDKjvbdCIjbLIej -DncKjvbdkHfkeenL -DoDKjvbdtAGqIABS -EPCjjvbdRosfjFdX -EOcKjvbdraemLgLZ -DnbkKvbdxmrgxTIc -DoCkKvbdOAJStJrA -EPCjjvbdqYngfpdY -EPDLKvbdBvzdJEov -DoDKjvbdrDeIpOWB -EObjjvbdqUTfrSKt -EOcKjvbdxnShXsIc -DoDKjvbdEzsqFLcJ -EObjjvbdDxYMUUUM -EOcKjvbdjKFhKNYS -EOcKjvbdjgflGFmk -DoCkKvbdGGKRnItR -EPCkKvbdREDApRDr -EOcLKvbdNQYRWOHT -EPCjjvbdxmrgwriD -DncLKvbdbsCjsdJa -EOcKjvbdypoNIiwA -DncKjvbdZoOJFEyj -DoCjjvbdrbGMkgKy -EPDKjvbdyTNiNSBg -DoCjjvbdczZPwyQb -DoDKjvbdWfZZtAOs -EPDKjvbdznoqFClY -DncKjvbdTlVoBVoJ -EPCkKvbdIxUBhMRQ -DoCkKvbdZQmEiNEq -DoDKjvbdnVUykKRf -DnbjjvbdUtMtFlWK -EObjjvbdOTUVfeUp -DoCjjvbdZMSEUOMN -DoCjjvbdwjwDgzzG -DoDKjvbdYqNEiNFR -DoDLKvbdqiAKEmOe -EPDLKvbdfNGXHNJk -DnbjjvbdCEQBVjMf -EObkKvbdqUUGrRjt -DnbkKvbdjmCLyeHP -DnbjjvbdcJMikFwY -EPCjjvbdjuwNdBxX -DoCkKvbdeqaWzkbo -DncKjvbdTkvOaVoJ -DoDKjvbdZoOIeEzK -DoDLKvbdKDKDRKDY -DncLKvbdqwQMDJYq -EObkKvbdKeegbBRV -EPDKjvbdegjuqnRH -DoDKjvbdxwhjBpZk -EObjjvbdziuQPdSt -EPCjjvbdZyEKOCkr -EPCjjvbdRWmdCkhD -EOcLKvbdQcbaQRES -DncLKvbdIrxaTNYM -DnbjjvbdGFiqmiTq -DoCjjvbdZeXfzghb -DoCjjvbdSLZFuGkT -EPDKjvbdIryBSmYM -EOcLKvbdRyjHsCvA -EPDKjvbdzoPqFCkx -EPDLKvbdFeirOIsq -EObkKvbdLiBkpxAS -DoCjjvbdmuUyjirG -EOcKjvbdpfDeTuaI -DncLKvbdtSqsYyeD -EOcLKvbdAMhYrwZx -EOcKjvbdJSyAsNYM -DncLKvbddneTLTsr -EPDLKvbdANIYsWyx -EObkKvbdRXODblHc -DoCkKvbdYzcGRjWZ -DoDLKvbdkHgLfFnL -DoCkKvbdpyPIGqDx -EObkKvbdwuNEpxkn -DoDLKvbdJSxaTNYM -DoDLKvbdRNXbZOUz -DnbjjvbdNHDPlpUk -EObjjvbdKQzFPFnF -EOcKjvbdwkWdHzzG -EObkKvbdiCPCdvpq -EPCkKvbdwzHfFwdr -DoDLKvbdwuMeQxkn -DoDLKvbdmoyxujyC -DncLKvbdyYJKBoyk -EOcKjvbdhgJbxujV -EOcKjvbdvAcySndh -EPCjjvbdOYPVzcmt -DncKjvbderBWzlCo -DncLKvbdEuxoolie -DoDLKvbdUsmTelVj -DoCkKvbdcImKKfXY -EPCkKvbdKDJcRJcY -DoDLKvbdfILWSOQg -DoDLKvbdtcDVWuno -DoDKjvbdegjvSNpg -DncKjvbdjvXOEBxX -DncKjvbdvOszpjoU -EOcLKvbdkIGkfFnL -EPDKjvbdZxcinCkr -EOcKjvbdNxPVzcnU -DnbkKvbdNrsvHEtp -DnbjjvbdwygefXeS -EObkKvbdnHEwmOGy -EObkKvbdZRNFIleR -DoCjjvbdNHColotk -EPDKjvbdTkuoBVni -EObkKvbdkHgLfGNk -DoCkKvbdVvhxWEEg -EOcLKvbdtbcVWvOo -DoDKjvbdULvOaWOi -EObkKvbdNdcsiJLE -DoDLKvbdOYPVzdNt -DoCkKvbdNeDsiJLE -EOcLKvbdXGYytAOs -EOcKjvbdcIljLGWx -DoDKjvbdIMBzmwQk -EPDKjvbdbrcKscjB -DoCjjvbdqdEhpOWB -DnbjjvbdzoPqFClY -DnbjjvbdKDKCqJcY -EPDLKvbdZRNEhldq -DncLKvbddZyQXyRC -DncLKvbdRzKHrcWA -EObkKvbdTAFIgbPE -EObjjvbdwtmFRYkn -DoDLKvbdCTAbtFwS -EObjjvbdJzpFwdAN -DoCjjvbdCTAbsevr -EObjjvbdyzdmrIIh -DnbkKvbdANIZTXZx -EPCkKvbdVwJXvDeH -DncKjvbdmfdwlnHZ -DoCjjvbdZirhPfaf -EPCkKvbdiHJcYvJu -DnbjjvbdRMxCYmtz -EPDLKvbdZHWdAPSi -DnbjjvbdWSNxBdkc -DoDKjvbdNxPVzdNt -EObjjvbddePRawDK -DncKjvbdaSGCgtGL -DncKjvbddoFSjstS -DnbjjvbdOFETiJLE -DoDLKvbdeAUQmYJf -EObjjvbdZshiZESn -EPCjjvbdVwIwvEFH -DnbkKvbdKDKDQjDY -EPDLKvbdRbEFMJZL -DoDKjvbdiZuGLpnG -DoCjjvbdqGEEtWAh -DnbjjvbdnBiwYPNu -DnbjjvbdtlXwBTaX -DoCjjvbdqYoHfqEY -EPCkKvbdIsZArmXl -DoDLKvbdmfeYNNgZ -DoCkKvbdrafNLgKy -DnbkKvbdYfwEAOsJ -DoDLKvbdrEFIonWB -EPCjjvbdRXODcMID -EPCjjvbdZisIPfbG -DncKjvbdoAKzshEO -EOcLKvbdNQXqVmfs -DnbkKvbddoEsKssr -EPDKjvbdNeETiJLE -EPCkKvbdVgwvXfxz -EOcKjvbdIsZBTNXl -EObkKvbdFeirOJUR -EPCjjvbdVAbRSpqy -DnbjjvbdeXyssqez -EPDLKvbdZGwEAOri -DoCkKvbdVAaqSqRy -DoDLKvbdiVZeWrVC -EPDKjvbdGYuUaDwb -DncLKvbdLrXMyuQz -EPDKjvbdGZUtaEXb -EOcLKvbdzoQRFDLx -EPCkKvbdTAFJICOd -EPDKjvbdNPxRVmfs -DoCjjvbdauBfxKsh -DncLKvbdMIbLpxAS -DoCkKvbdmgEwmNfy -DoDLKvbdhanbdvqR -DoCkKvbdSLYfUfjs -DoCjjvbdTvMQJsaR -DnbkKvbdlhcspuRa -DnbjjvbdJSyBSlxM -EPCjjvbdSLZFuHLT -DoCkKvbdYTLaNUPY -EObjjvbdFeiqnJUR -EPDKjvbdYlRctNkm -EOcKjvbdHDjvJaij -DnbkKvbdnCJvwnnV -DoCjjvbdNHDPlouL -DncLKvbdWXIxWDdg -DoCkKvbdJSyAsMwl -EObkKvbdxmrhXriD -DnbkKvbdJzpGYEAN -EOcLKvbdddnqawDK -EOcLKvbdhyuFkpnG -DnbkKvbdtAHQhABS -DoCjjvbdjhGlFemk -DncLKvbdjJehJmXr -EPDLKvbdHffyyXwg -DoCkKvbdRbEFLiZL -DoCjjvbddePSBwCj -EPDKjvbdeOeTKtUS -DnbjjvbdrDeIomvB -DnbjjvbdVZIUZjoO -EPDKjvbdxmsIYTIc -EPCjjvbdDnbkLXDE -DnbkKvbdYlSDtNlN -EObkKvbdeFPSBvbj -EPCkKvbdkDMKpgUg -DoCkKvbdbKlGPODA -EObjjvbdGdLVjCKK -EPCkKvbdkCkjqGuH -EOcLKvbdqYngfpcx -EPDLKvbdeKJqvUzn -DoCkKvbdkIHMGGOL -DncKjvbdDoDKkXDE -EPCkKvbdsCGNMHLZ -EOcKjvbdyzeNqhJI -DnbjjvbdqwQLbhxq -EObjjvbdaaWEepPw -EObjjvbdDxXktUTl -DnbjjvbddwzTtRez -DnbjjvbdKQyeOfNe -EPDKjvbdbBVdepPw -DncLKvbdfSAvzkbo -DoDKjvbdqYoIHQcx -DoCkKvbdeEnrBwCj -DncKjvbdehLVqnRH -EPDLKvbdhfjDYuiu -EPCkKvbdvmWANEEm -EPCkKvbdZRNEiNFR -EOcLKvbdCSaCtGXS -DoDKjvbdbhljKevx -DoDKjvbdbBVdepQX -DncLKvbdqTsfrSKt -EPDKjvbdjEjgVPAO -DoCjjvbdFeiqmiTq -EObjjvbdcImJkGXY -EObjjvbdJbjCqJcY -DnbkKvbdjcLjpftg -EPDLKvbdWXJYWEEg -DoDKjvbdznpREbkx -EObjjvbdfILVqmqH -DnbkKvbdxwiKCQZk -EPDLKvbdOEdUJIjd -DnbkKvbdsCFmLgKy -DncKjvbdijFhKMxS -EPCjjvbdzitpQDrt -EPCkKvbdZQleImEq -DoDKjvbdZxdKNcLr -DncKjvbdGdLVjCKK -EOcKjvbdhzUfLpnG -DncLKvbdwzHfGYEr -EObjjvbdEObjjvcE -EOcLKvbdfHkVqmpg -DnbjjvbdXnRAXuVt -EOcLKvbdeFOrBwDK -EPCjjvbdzitoocsU -EPDKjvbdZxdJmblS -EObjjvbdFjeScHlu -DoDKjvbdjhGkfFmk -EOcLKvbduDDVXWPP -EPDLKvbdJYUCHkpp -EPCkKvbdkClKpgVH -EObkKvbdJcKCqJbx -DncKjvbdEXwlUTsl -EObkKvbdxwiJbPzL -DncLKvbdHDjujCKK -DnbkKvbdEuyQQMie -EPCkKvbdUaBpsRSZ -EPCkKvbddoFTKstS -EPCjjvbduaEYsOeI -DoDLKvbdcTDKscjB -DncLKvbdNdcshiKd -DnbjjvbdWSOYCEkc -EOcKjvbdZnmiEdzK -EPDKjvbdUQpnttgm -DoCjjvbdnGdwmOGy -DoCkKvbdZyDjNblS -EOcKjvbdShyjRAAl -DncKjvbdTkvOaWPJ -DoDKjvbdOEcsiJKd -DncKjvbdbVBfxKtI -EPCkKvbdrafNLfjy -DoDKjvbduaEZTOeI -DncLKvbdGGKSNhtR -EPCjjvbdnBjWxOmu -EObkKvbdKefICBRV -DncKjvbdZoNheFZj -DnbkKvbdEOcKkWbd -EPDKjvbdNGcPmQUk -EObkKvbdaMjbStlg -DnbkKvbdJYTbIMRQ -DncLKvbdJXsahLpp -DncKjvbddeOrBvbj -DoDLKvbdJSyAsMwl -EPCkKvbdZdwfzhJC -DoCjjvbduDDVWuno -DnbjjvbdEztQdkbi -EOcLKvbdUyHsykOn -EObjjvbdDjHivYKA -DoDLKvbdnUtzLKSG -DncLKvbdSLZFuGkT -DoDKjvbdlYrrTZGt -EOcLKvbdqUUGqrKt -EPDLKvbdEPCjjvcE -EPDKjvbddxZtTrFz -EObkKvbdlYrqrxgU -DoCjjvbdauCGwjtI -DnbjjvbdQZNAHTRj -DoDKjvbdMoxRVmfs -DncLKvbdOTTvGeUp -DncKjvbdcJNKKewY -DoDKjvbdmuVZjjSG -EPDKjvbdUWLpKUAq -EOcLKvbdSLZGVGjs -EObjjvbdCIjakJGK -EPDLKvbdZnmhddyj -EOcKjvbdLBKgMaxR -EOcLKvbdDjHjVwjA -DnbkKvbdYlRcsnLm -DoCjjvbdrRuKnKaN -EPCkKvbdptUHSSLU -DncLKvbdYpmEiNFR -EObkKvbdMIalQxAS -DnbjjvbdJuteceHJ -DncLKvbdFWYpPlie -EPCkKvbdmgFYMmgZ -DoCjjvbdmbJvxOnV -DncKjvbdIGfzZYXg -EPDLKvbdqTtGqrLU -EPCjjvbdWRmwbElD -EPDLKvbdGLErcIMu -EPDLKvbdwygefYEr -EPDKjvbdrSUkOLBN -DoCkKvbdNQYQumfs -DoCkKvbdRjyGVGjs -EPDKjvbdmajXXoOV -DncKjvbdIGgZxwwg -DnbkKvbdxwiJapZk -DoDKjvbdYqMdhleR -EOcLKvbdZtJIxdSn -EPDLKvbdTIzKRABM -EPDKjvbdCEPaWJlf -EOcLKvbdjgflFfOL -EPCjjvbdZjShQGbG -DoDLKvbdHDjvJbKK -EOcLKvbdBiKbLIfK -DncLKvbdiHJbxujV -EObkKvbdKeehBaQu -EPDLKvbdYSlBMsnx -EObkKvbdmJDsptrB -DoDKjvbdTkuoAvPJ -EPDKjvbdZyEJnDLr -EPCkKvbdZoNhddyj -EPDKjvbdVZHsykOn -DnbkKvbdjJegjNYS -DoDLKvbdtcCtwVno -EOcKjvbdkIHLefOL -EOcKjvbdYkqdTnLm -DnbkKvbdiZuGMQmf -DoCjjvbdZLrDsnLm -DoCjjvbdDwwktTsl -EObjjvbdRzKHrbvA -DoDKjvbdQlwaxnUz -EObkKvbdyTOImRag -EPCjjvbdQmYByOUz -EObjjvbdbrbkUDjB -DoDLKvbdGYtuAcwb -DncLKvbdePFSjssr -DoDKjvbdRbDdlIxk -DoDKjvbdwzIGGXeS -EPCjjvbdOTUVgEuQ -EPCkKvbdemGWfmJk -EOcLKvbdZQmEhmEq -DoCjjvbdZRMeJNFR -DoCjjvbdvBEZSoEh -DncLKvbdhlFDnVDZ -DoCjjvbdJJdAKPfd -EObjjvbdyYJKCQZk -EObjjvbdRzKITCvA -EPCjjvbdUMVnaWPJ -DoCjjvbdNddThhjd -EOcKjvbdNPwpvOHT -DnbjjvbdZisHpHCG -EObkKvbdGLFScINV -EOcLKvbdbsDLTdJa -EObjjvbdbhlijfWx -DoDLKvbdVZHszLPO -EObjjvbdZnnJFEyj -DoDKjvbdeOeSkTtS -DoDLKvbdkCkjpgUg -EPCjjvbdFejRnJUR -DoCjjvbdZsiIyDrn -DoDLKvbdtunYJqTA -DnbkKvbdoznELXoA -DoCjjvbdZtIiYcsO -EOcLKvbdGGKSOJUR -DoCjjvbdUMWPAuni -DnbkKvbdEPDKkWbd -EPCkKvbdUxhTzLPO -DoDKjvbdGdKvKBij -DncKjvbdmSZUzSci -EPCjjvbdZjShQGaf -DncLKvbdWRmxCElD -EPDLKvbdqvpMDIyR -DncKjvbdCJKakIfK -EPDKjvbdHELWJbKK -DoDKjvbdjlbLzFGo -EPCjjvbdTkvPBWOi -DoCkKvbdJvVGEFGi -EOcLKvbdUyHszLPO -EObjjvbdVBBpsQqy -DnbkKvbdZdxGzhIb -DnbjjvbdsPvOicVf -DoDKjvbdtcCtwWPP -EOcLKvbdwtmFRYkn -EPDKjvbdegjvSNqH -DoDKjvbdIxUBglQp -EOcLKvbdBcpAvKNG -DnbjjvbdwXMAvAvV -DnbkKvbddoEsLUUS -DncKjvbdCIkCKiGK -DoDKjvbdlZTSTYft -EPCjjvbddoEsKtTr -EObjjvbdFfJrOJTq -EPDLKvbdliDsqVSB -DncLKvbdbUagXjtI -EObkKvbdIsYaSlxM -EPCjjvbdHkaznXRL -DnbkKvbdxUmFQyMO -DoCjjvbdWWiXvDdg -EPCjjvbdSQUHKFcw -EPDLKvbdjKGIJlwr -EOcKjvbdXFxytAOs -DncKjvbdmbKWwoNu -EObjjvbdiZuFkpmf -DoCjjvbdFyVVBDwb -DnbjjvbdeqaWzlDP -EPCjjvbdRyjHsDWA -DnbkKvbdqlzJyMHi -DnbkKvbdZRNFImFR -DoCkKvbdYfwEAPSi -DoCjjvbdOAIrsjSA -EPCkKvbdaNLCTVMg -DnbjjvbdqceIomvB -DnbjjvbdsCFlkgLZ -DoDLKvbdmIdURUqa -EOcKjvbdZshhxcrn -DoDKjvbdZjTIPgCG -DncKjvbdemGWfmJk -DnbjjvbdACqxKZiQ -EObkKvbdkVvnEBxX -DncLKvbdUtNTfMWK -EPDLKvbduaDxsPFI -EObkKvbdgQBzvcxI -EObkKvbdSZihTDWA -EOcLKvbdqYnggREY -EPDKjvbdqiAJdmPF -EOcLKvbdiGjDZVjV -EOcLKvbdGZVVAdXb -DoDKjvbdhfjCxuiu -DnbkKvbduMYXBTaX -DoCkKvbdjSziTKiz -DoDKjvbdqlzKZMIJ -DnbjjvbdkVwOEBxX -DoCjjvbddtAUASmW -DoDLKvbdzjVQQESt -EOcLKvbdkySrSyHU -DncLKvbdNGbolotk -DnbjjvbddeOrBwCj -DoDLKvbdiLdcmuDZ -DoDKjvbdSPsfjFdX -DoCkKvbdbUafxKtI -DnbkKvbdcJNJkFvx -EObjjvbdFejSNiUR -EPDKjvbdQmYCYmtz -DncKjvbdfVzwpJzs -EPDKjvbdWRmwbEkc -DncLKvbdFkEsDIMu -DoCjjvbdQccBPqES -EObkKvbdKCibpjCx -EOcKjvbdLBLHNBwq -DoCkKvbdUMWOaVoJ -DoCjjvbdrbFmMGjy -EOcLKvbdJvVFdEgJ -EPCkKvbdjhHMGFnL -DncKjvbdNxOuzcmt -EPDKjvbdEXxLstUM -DoDKjvbdwygfGXeS -EObkKvbdyTNiMrBg -DncKjvbdlZSrSxgU -EPDKjvbdJXtCHlQp -EPCkKvbddndsLTsr -EObjjvbdNdcshhkE -DncLKvbdSCDeLhyL -DncLKvbdNsTvHEuQ -EOcKjvbdACqxKZiQ -DoCjjvbdptTgRqjt -EPDKjvbdOEdTiJLE -DoDKjvbdrpVoKCvG -DnbjjvbdFjeSbhNV -EPCjjvbdNGbolouL -EPDLKvbdrEFIonVa -DnbkKvbdOFDsiIjd -DoCkKvbdTqQoUuIN -EPDKjvbdeOdsKtTr -DncKjvbdyNrhXsIc -EPDKjvbdnQZxujyC -EPCkKvbdYqMdhmFR -DncLKvbddeOrBvbj -DoCjjvbdLGFgbApu -DoCjjvbdemFwHMik -DoCkKvbdRXOEClHc -DoCkKvbdZQmEiNFR -EPCjjvbdEASIlzXX -DnbkKvbdrWokbiZR -EObkKvbdHELWKBij -DnbkKvbdbUagXkUI -EOcKjvbdbsDLUDia -EOcLKvbdUWLojUAq -DnbjjvbdQvmccMID -DoDKjvbdZxcjODMS -EPDKjvbdTulPjUBR -DncLKvbdjSzhsKiz -EOcKjvbdTAFJICOd -DnbkKvbdKNADzHVB -DoCjjvbdliDtRVSB -EObjjvbdWXIxVceH -EPCjjvbdfHkWRnQg -EObkKvbdjAQGaPgK -EObkKvbdkClLRGuH -DncLKvbdZnnIdeZj -EObjjvbdlYsRsYgU -DoDLKvbdpyPHgQcx -DnbjjvbdnPyyWKyC -EObjjvbdQwNcblID -DnbjjvbdCJKajhfK -EPDKjvbdiHKCyWKV -EObjjvbdeEoRavbj -EOcKjvbdmaivwnnV -EOcKjvbdwNWANDeN -EPDKjvbdTAFIhCPE -DoCjjvbdZQleJMeR -EPDKjvbdmtuZjiqf -DnbkKvbdEPCkLXCd -EObkKvbdqGEEsvBI -EOcKjvbdmIdTqVSB -EObjjvbdJTZBSlwl -EPCjjvbdqlzKZMIJ -EPDKjvbduCbtwWOo -EPDLKvbdnPzYukYb -EPDKjvbdeFPSBvbj -EPDLKvbdHEKvKCJj -EPDKjvbdVUNUGLuj -EOcLKvbdJuuGEEgJ -EOcKjvbdzQnmJKXA -EOcLKvbdrbGMkfjy -DnbjjvbdUsltFkuj -DnbkKvbdDxYMUUUM -DnbjjvbdUQpoUuHm -EPDKjvbdRbDdlJZL -DncLKvbdmgFXlmfy -EPCjjvbdJbibqJcY -DoCjjvbdEPDLLWcE -DoDLKvbdMJCMRYAS -DoCkKvbdQZNAGsSK -EObjjvbdiCPDFXQq -EOcLKvbdVwJXvEEg -DoDLKvbdsrqsYzFD -DncLKvbdjuvnDbXw -EPDKjvbdhgKCyWKV -DoDLKvbdNdctIiKd -EObkKvbduaEYrneI -DoCkKvbdNVSrKmAX -DncKjvbdXnRAXtvU -DoDKjvbdhkddNtcZ -DoCkKvbdiBnbdwQq -DnbkKvbdLBLGlawq -DoDKjvbdygZMANEw -DnbkKvbdZsiIxcsO -EObjjvbdiBoDEwRR -DoCjjvbdHbLzEzAD -EPCkKvbdjbkkQgVH -EOcLKvbdsBemLgLZ -EOcLKvbdptUGrRkU -EPCjjvbdznpQdbkx -DoDKjvbdGYtuAdXb -EOcKjvbdzjUpQETU -EOcLKvbdypoNIjXA -DnbkKvbdSQUHJfDw -EPCkKvbdbsCjtEKB -DoDLKvbdajlFoODA -DoDKjvbdelevfmKL -DnbkKvbdCTAbsfWr -DoDKjvbdjhGlGGNk -DoCkKvbddCTMrATm -EPDLKvbdaMjbSuMg -DoCkKvbdKaLHNCYR -DncLKvbdGGKSNiTq -DoCjjvbdLZRJrztf -EPDLKvbdjlakyeGo -EObkKvbdwuMdpyLn -DnbkKvbdegjuqnQg -EPDKjvbdtTSTYydc -EObkKvbdZyDjOClS -DnbkKvbdqGEEtWAh -EOcLKvbdKQydoFnF -EPDLKvbdqUTgSSKt -DnbjjvbdMJCMQxAS -EPCkKvbdiMFDnUby -EOcKjvbdfpBzwEXh -DoCkKvbdSBceMIxk -EObjjvbdfMevgMik -EPCjjvbdjAQHAofj -EPCjjvbdZLrETnMN -EObkKvbdDoDLLXCd -DncLKvbdSZjHsDWA -DnbjjvbdOStVgFVQ -EObkKvbdbhlijfXY -DnbkKvbdjEjftoAO -DoCjjvbdeEnrCXDK -EOcLKvbdZyEKNcMS -EPDKjvbdWSNwadkc -EPCjjvbdkDLjqHUg -DoCkKvbdSCEFLiYk -DncKjvbdtkwwBTaX -EPDKjvbdCTAbsevr -DncLKvbdmfdwlnGy -DncLKvbdTukpJtBR -DoCjjvbdlYrrTZGt -EOcKjvbdnCKWwoOV -DncKjvbdMgColpVL -EPDLKvbddwytURez -DoCkKvbdakLenmcA -EPCkKvbdQvmdCkhD -DncLKvbdEARhlzWw -EOcLKvbdrXQMDJYq -EObkKvbdmJETptrB -EOcKjvbdAMgxsXZx -EPDKjvbdULvPBVni -DoDKjvbdqGEFTvAh -DoDKjvbdGLFTChMu -DoCjjvbdLBKgNCXq -DoCjjvbdOEcsiJLE -EObjjvbdSLZFuHKs -DoCjjvbdtkxXAsaX -DnbjjvbdNGbpNQVL -EOcLKvbdiLeEOUby -EObjjvbdDoCjjwDE -EPCkKvbdxrnJMrCH -EPDKjvbdJTZBTMwl -DncKjvbdBcpBWJlf -DncLKvbdGKdsDHmV -DncLKvbdDwwlUUTl -EPDLKvbdbQHHELzd -EPDLKvbdYlSEUOLm -EObjjvbdhtyeXSUb -EPCjjvbdACqxKZiQ -EObjjvbdrDdiPmua -EPCkKvbdcyxpYYqC -EPDKjvbdrXQLbiZR -DncKjvbdjmBlZeHP -DncKjvbdlYrrTYft -EObkKvbdaaWFFpPw -DncKjvbdwyhGFwdr -EPCkKvbduLxXAtBX -EObjjvbdhancEvpq -DncLKvbdbiMjKevx -DncKjvbdTIyjRABM -DoCkKvbdcImKLFvx -DnbkKvbdZjSgpHBf -EPCkKvbdGdKvJbJj -EOcLKvbdSCDeMIyL -EOcKjvbdZxdJnClS -EOcLKvbdHDkVibJj -DoDKjvbdezuxeJTw -EOcKjvbdqFceUVaI -EPDKjvbdWIYWXfxz -DoDKjvbdNQXqWOHT -DnbkKvbdOStWHEtp -EPDKjvbdLAkGmBxR -EPDKjvbdDxXksssl -EPCkKvbdTqRPVUgm -DoDLKvbdrDdhomvB -DncLKvbdptUGrSKt -EOcKjvbdiBnbeWqR -DoDKjvbdezvYeJUX -DnbkKvbdOAJStJrA -DnbjjvbdtcCuWvPP -DnbjjvbdIjEAKPgE -EObkKvbdWWiXvEEg -DnbkKvbdSBdFMJYk -EOcKjvbdQdCaQQcr -EPDLKvbdLZRKSzuG -DoCkKvbdpfEFTuaI -DnbkKvbdVBBqSqRy -DncLKvbdMoxRVnGs -EOcLKvbduoTzqKnt -DoCjjvbdxxJKCPyk -DncLKvbdVvhwvEFH -EPDLKvbdOYPVzcnU -EOcLKvbdBdPaWJlf -DnbkKvbdJSyAsMwl -DoCkKvbdYTLaMsnx -EOcKjvbdUWLpJsaR -DoCjjvbdhbOcEwRR -DncKjvbdKfGHbAqV -DoCjjvbdlZTSSyGt -DncLKvbdatbGxLTh -EPDLKvbdiGicYvKV -EOcLKvbdTIyjRAAl -EPDKjvbdZsiIyDsO -DnbjjvbdZLqcsmlN -EOcLKvbdeOeTLTtS -DncKjvbdQdCaPqDr -EPCjjvbdUGznLvvF -EObkKvbdrDdhpNvB -EPDLKvbdRadFLhxk -DnbjjvbdhytelQmf -EPDKjvbdFkFSbhNV -DoDKjvbdaSGDHsek -EObkKvbdzHYlAMdw -DnbjjvbdliDsptrB -EPCkKvbdYlSDtNlN -DoDKjvbdnPyxujxb -EObjjvbdRkYfVGjs -EPCjjvbdRaceMJZL -EOcLKvbdnUuZkJrG -DncKjvbdOYOuzdNt -DoCkKvbdJbjDQicY -DnbjjvbdRyjHsCvA -EOcLKvbdUGzmlXVe -EPCjjvbdMoxRWOGs -DncKjvbdlrZUzTEJ -DoCjjvbdJYUBgkpp -EOcLKvbdACrXizJQ -EPDKjvbdsCGMkfkZ -DncKjvbdqYnhGqEY -DncLKvbdjgflFemk -DncKjvbdrzMQTAgn -DoCjjvbdlZTSSxgU -EPDLKvbdKCibqKCx -EOcLKvbdmJDtQuSB -DncLKvbdQcbaPqES -DoCjjvbdOXoVzdNt -EObkKvbdbsCjsdKB -EPDKjvbdySmiMqbH -DoCjjvbdrMzKZLhJ -DncKjvbdtAGqIAAr -EPCjjvbdEXxMTtUM -EOcKjvbdVrOYBdkc -DoDKjvbdzROlhiwA -DncKjvbdqTtHRrLU -DnbkKvbdiUzEwSUb -DoCkKvbdZLqcsnMN -DnbjjvbdUaBqTRRy -DoDKjvbdRosgKGEX -EObkKvbdShzKRABM -DoDLKvbdqZOhHRDx -EPDLKvbdiUzFWqtb -DoCkKvbdZyEJmbkr -DncKjvbdREDBPpdS -EPCjjvbdMSWmZtpz -EPDLKvbdTAEiHaoE -DoDKjvbdNeETiIjd -EOcLKvbdqdFJPmua -DoCkKvbdRpTfjFcw -DncLKvbdznoqEcMY -DoCkKvbdFfJqmiUR -EOcLKvbdSPsfifEX -DnbjjvbdtunYJpsA -EPDKjvbdqcdiQOVa -DnbkKvbdeXyssrFz -EPDLKvbdQYmAGrqj -EObjjvbdegjuqmpg -EOcLKvbdbLLenmcA -EOcLKvbdpyPHgREY -DoDKjvbdZRMdhmEq -DncLKvbddZxoxZRC -EOcKjvbdKxpjSztf -EPDKjvbdKkBHvAJy -EObkKvbdnBiwYOnV -EObkKvbdrWolDJYq -DoCkKvbdZyEJmbkr -DoDKjvbdkDMLRHUg -EPCjjvbdQwNccMID -DncKjvbdSZihSbvA -DncLKvbdnHFXmNgZ -DncKjvbdGKeSbhMu -DncLKvbdULvPAuoJ -EOcLKvbdYqNFJMeR -DoDLKvbdMfcPmQVL -EPDKjvbdFpATWgGZ -EObjjvbdeqaWzkbo -EOcKjvbdZoNhddzK -EObjjvbdFeiqmiTq -DoDKjvbdauBfwjsh -EOcLKvbdBraDUFvr -DoDLKvbdyYIjCPzL -DnbjjvbdmRxuZsEJ -EObjjvbdMfcQMpUk -EOcKjvbdyNsIXrhc -EPDKjvbdREDBPpcr -EPCjjvbdRkYeuGkT -EPCkKvbdtAHRIAAr -DnbkKvbdxUmFQxkn -EObkKvbdtTSTZZdc -EOcKjvbdmIdUQtqa -EOcKjvbdXrkaNUPY -DoDKjvbdCWzdIePv -DoDKjvbdbBVdfQPw -EPCjjvbdZyEJmblS -DncKjvbdlZTRrxft -EPDLKvbdIxUCIMQp -DnbjjvbdKyRKSztf -EOcKjvbdNeEUIhjd -EOcLKvbdjKGIJmXr -DoDLKvbdCEPaVimG -EPCkKvbdOFDsiIkE -EOcLKvbdehKvSORH -DoDKjvbdwWkaWAuu -EPDKjvbdpxoHfpcx -EPDKjvbdJbjCqJbx -DncKjvbdZtJJZETO -EPDLKvbdsZkpTBHn -EPCkKvbdTlWPAuoJ -DoCjjvbdjggMFfOL -DoDKjvbdfMewGlik -EPDLKvbdnBivwoOV -DoCjjvbdwuNEpxkn -DnbkKvbdiifIKNYS -EOcKjvbdKVuFdFGi -EPCjjvbdZdxGzgiC -EOcLKvbduaDxsPEh -EPCkKvbdRotHJfEX -DncLKvbdCIjajhej -DoCkKvbdcImJjfWx -EOcLKvbdKVtecdgJ -DoCjjvbdeFOrBwCj -EPDKjvbdqvpLcIxq -EObjjvbdEARiMyvw -DncKjvbdbUafxLTh -DncLKvbdLAkGmCYR -DoDKjvbdxVMdqYkn -EPDKjvbdWWiYWDdg -EObkKvbdKDJbpjCx -DoCkKvbdnPyxvKyC -DoCkKvbdZsiJYcsO -EObkKvbdJpzFOeme -EOcLKvbdOSsufeUp -DoDLKvbdTfznMWvF -EPDLKvbdfNFwGlik -EPDLKvbdCDpAuilf -EPDKjvbdbiMikGWx -DoCkKvbdrbGMkfjy -DoCjjvbdWIXuxHYz -EPDKjvbdGFiqnIsq -EPDLKvbdNGbpMpVL -EOcLKvbdtSrTYyeD -DoDKjvbdjJfHjNXr -EPCkKvbdzitpPcrt -DoDLKvbdxmrgxSiD -EPDLKvbdcJNKLFvx -EPDLKvbdsrrSxydc -DnbkKvbdqceIonWB -EPCkKvbdZnnIddzK -DoCjjvbdLYpirztf -EPCjjvbdLrWlzUpz -DnbjjvbdRkZGVGjs -EObjjvbdnBivxOmu -DoCjjvbdmIdUQuSB -EObkKvbdtcCtvuoP -DnbjjvbdANIYrvzY -DncKjvbdmaivwoNu -EOcLKvbdrouoJcWG -DoDLKvbdTppoVVIN -DoDLKvbdVUMtFkuj -DncLKvbdznpQdblY -DncKjvbdEPCkLXDE -EOcLKvbdfHkVqmqH -EPDKjvbdapGgDkzd -EPCjjvbdSPsfifDw -DoDLKvbdGKeTDINV -EObjjvbdyqPNIjXA -EPCjjvbdatbGwkUI -DoCjjvbdCTAcTewS -DnbjjvbdxnTIXsJD -EOcKjvbdbKlFnnDA -DncKjvbdjJegjNXr -EObjjvbdMuTRkNAX -EObkKvbdUxgsykOn -DoCkKvbdRaceMIxk -EPDLKvbdJbibpibx -DoDKjvbdEztQdlCi -EPDKjvbdcyyPwyRC -DncKjvbdjlbMZdfo -EPCkKvbdRXNdClID -DncLKvbdtbbuXVoP -DoDKjvbdieLHVPAO -DoDKjvbdFVxopMie -EObjjvbdzoPpdblY -EPCjjvbdmIdUQuSB -EPCkKvbdYkrEUNkm -DoCkKvbdVwIxVdEg -DoCjjvbdOSsvGdtp -EPCjjvbdmSYtysDi -EObkKvbdWWiYVceH -DoDKjvbdrNZixkgi -EPDKjvbdbVCHYKsh -DnbkKvbdjKFgimXr -EPDKjvbdNsUWHFUp -EObkKvbdeAUQlwjG -EOcKjvbdTAEiICPE -DoCkKvbdZLqdUNkm -EOcKjvbdZisHogCG -EPCkKvbdKVtfEEgJ -EObjjvbdaSGDIUGL -EPDKjvbdZRNFIleR -DoDKjvbdyXiJaoyk -EObkKvbdRkYfVHKs -DnbkKvbdLAkHNCXq -DncKjvbdJpyePFnF -EPCkKvbdkHgMFenL -DoDLKvbdOFDtIhkE -DoCkKvbdtTSTZZdc -EOcLKvbdkClKpfuH -DoCjjvbdBcpBVjNG -DnbkKvbdfMfXHNJk -DoDKjvbdBsBCtFvr -DoCjjvbdHgGzYwwg -DncLKvbdSwjkmzkY -DoCkKvbdDihJuwjA -EPDKjvbdQccBPpdS -EPDKjvbdehLVqnQg -DoCjjvbdmozZVkZC -DoDLKvbdaNKasVNH -EObkKvbdrRtkOLBN -DoDKjvbdehLWRnRH -EObkKvbdSCEEkiYk -DoCjjvbdRXOEDMID -EOcKjvbdFejRmiUR -EOcLKvbdFkEsChNV -DncKjvbdWWhwuceH -EPCkKvbdNwoVzdOU -EOcKjvbdePFSkUTr -DoDKjvbdMRwMzUpz -EObjjvbdLrXMzUpz -EPDKjvbdZxdJnDLr -EOcLKvbdrRtkNjaN -EPCkKvbdTvLoitBR -DncKjvbdKeehCApu -EPDLKvbdemFvfljL -DncLKvbdeFOqawCj -DoDKjvbdZyEJnCkr -DoCjjvbdlZTRsZHU -DnbkKvbdRbDdlJZL -DnbjjvbdYqMdiNFR -EObjjvbdSQTfjFdX -DoCjjvbdgFlZnGgA -DoDLKvbdwtldqYkn -EObkKvbdjggLfFmk -DncLKvbdMgCpNPtk -DncKjvbdmpZyWKxb -EPDKjvbdVqnYBeMD -DoDKjvbdULuoBWOi -DncLKvbdezvZEiTw -EPCkKvbdjblLRHUg -EPCjjvbdBiKakJGK -DncKjvbdTukpJtAq -DoCkKvbdkWWnEBxX -EPCjjvbdnPzYvLZC -EOcLKvbdWHxVxGxz -DncLKvbdNsUWHEtp -EObkKvbdHDkWKBij -EObkKvbdVAbQsQrZ -DnbkKvbdKCibqKDY -EObjjvbdLYqKSztf -DoCkKvbdZLrDtOMN -EOcKjvbdemFvgNJk -DncLKvbdiCOcEvpq -DnbkKvbdEXxLtTtM -EObkKvbdFjdrbglu -EObkKvbdmttykJrG -DoCjjvbdePFTLUTr -DoCkKvbdWRmwadlD -DoDLKvbdVqmxCElD -EPCkKvbdnBiwXoOV -DnbjjvbdEvZQPmKF -EObkKvbdSKyGVGkT -EPCjjvbdauBgXkTh -EPCjjvbdVrNxBeLc -EObjjvbdOEcshiLE -DoDLKvbdbLMGPNcA -DnbkKvbddZxpYYqC -DoCkKvbdlZTSTZHU -EObkKvbdtlXwBTaX -EObkKvbdHffyxwxH -EPDKjvbdrpWOicVf -DncKjvbdkVvmdBww -EPDKjvbduaDySoFI -EObkKvbdsZkosBHn -DoDLKvbdTAFJICOd -DnbjjvbdpstHRrLU -DncKjvbdUQqOtuIN -EPDKjvbdVUMtFlWK -DoDLKvbdrouoKDVf -DoCjjvbdmRyUysDi -EPDKjvbdgFkzNgHA -DnbjjvbdZshiZDsO -DnbjjvbdIMBzmwRL -EObjjvbdZshhxdTO -EOcLKvbdZGwEAOri -EPCkKvbdkHflFfOL -DoCkKvbdKDJcQibx -EOcLKvbdFkEsCgmV -EPCjjvbdJutfEEgJ -DoCkKvbdOXnuzdNt -EPDLKvbduLwwAtAw -DoDKjvbdqvpLbiZR -EPCjjvbdGYuVBEXb -EOcLKvbdCJKajhfK -DnbjjvbdkMbLyeGo -EPCkKvbdijGIKMwr -DoDLKvbdJzpGXdAN -DoDKjvbdNwnuzdOU -EOcLKvbdtSqsYyeD -EOcLKvbdmRxuZrdJ -EPDKjvbdhlEcmtcZ -DoCkKvbdbiNJjevx -DoDKjvbdGckVibJj -DoDLKvbdGLFSbhMu -EPDKjvbdEObjkWbd -EObkKvbdBhkBjiGK -EPDKjvbdtAGqIAAr -DoCkKvbdWRmwadkc -EObjjvbdQdDAoqDr -EOcLKvbdwNWANDeN -EPCjjvbdMowqVmgT -EPDLKvbdegkWSNpg -EPDLKvbdjAQHAogK -DoDLKvbdvwLaVaWV -EPCjjvbdLGFgbBQu -DoCjjvbdxsOJMrCH -EObkKvbdFkFTChMu -EObjjvbdbLLenmcA -EPDLKvbdiCObeXRR -EPCjjvbdhbObdvpq -EObkKvbdVZIUZkOn -EPDLKvbdfVzxPizs -EPDKjvbdnPyyVjyC -DncLKvbdRzKITCvA -EOcLKvbdUtMsfLuj -DncKjvbdVBBpsRRy -DnbkKvbdzeZnzdzQ -EOcLKvbdUtNTfMVj -EObjjvbdqcdiQOWB -DoCkKvbdNddTiIjd -DncLKvbdrykosBHn -EPDKjvbdWRnYBeLc -DncLKvbdrXQLcIxq -EPCkKvbdUWLpKTaR -DoCkKvbdZRNFJMeR -EPDLKvbdunszpjoU -DoDKjvbdzitpPdSt -EObkKvbdvBDxrneI -DoDLKvbdVviXvDeH -EPCkKvbdDihJuxKA -EPCkKvbdNPxQunGs -DoCjjvbdmuUzKjRf -DnbkKvbdbPffdLzd -DoDLKvbdXrlBNTnx -DoDKjvbdZQmEhmFR -EObjjvbdmttzLKRf -DoCkKvbddijRvUzn -EPDLKvbdHffyyYXg -EPCkKvbdcTDKtEJa -EPCkKvbdpecdtWAh -DncKjvbdRjxeuGkT -EPCjjvbdqdEhpOVa -EPCjjvbdelfXGmJk -EObkKvbdWWhwudFH -EPDKjvbdhbObeXQq -DoCkKvbdffLynHHA -DnbjjvbdpaJFAXIE -DoDKjvbdqZPIGpcx -DoDLKvbdmaivxPOV -DncKjvbdqFdEsvAh -EPCjjvbdrpWOibvG -EPCkKvbdyfyMAMdw -DoDLKvbdhuZdvqtb -DncLKvbdWRnYBeMD -DncLKvbdDncLKvbd -EObkKvbdhzUfLpnG -EOcLKvbddoFSkTtS -EPDKjvbdbKlFoODA -DoCkKvbdRWmccLhD -EObjjvbdeAUQlxJf -DncLKvbdKVuGEEfi -EObkKvbdVvhwvEEg -EPDLKvbdhaoDEvqR -EPDKjvbdpfEFTvBI -EPCkKvbdyzeNrIJI -DoDLKvbdGckViaij -EObjjvbdnHExNNfy -EObkKvbdZLqdUOLm -DoDLKvbdDxXktTsl -EObkKvbdFVxpPmKF -DoDKjvbdNdctJJLE -DnbkKvbdTXkMNzjx -DncKjvbdbrbkUEKB -DoCkKvbdGKeSbhNV -EPDKjvbdYSkaMtOx -EPCjjvbdiGicYujV -EObjjvbdnHFXmOGy -DoDKjvbdZyDjNblS -EOcLKvbdGYtuBEXb -DnbjjvbdqGDeUWAh -DnbkKvbdTppnuVHm -EOcLKvbdPyNAGsRj -EPCkKvbdIrxaSlxM -DncKjvbdCfkfHAzc -DnbkKvbdIHHZxxXg -EPCjjvbdjKFhKMxS -EOcKjvbdehKvRnRH -EObjjvbdxVMdpyMO -DnbjjvbdSLYetgKs -EObkKvbdRjyGUfkT -DoCjjvbdwyhFeweS -DncLKvbdrJAKElne -EPCjjvbdiGjCxvKV -EPCjjvbdCIjajiFj -DoDLKvbdunszqLPU -DnbjjvbdySmhlrCH -DnbkKvbdnBjWxPNu -DoDKjvbdlhdTqUrB -DoCjjvbdGdKvJajK -EObjjvbdkySqryHU -EPCjjvbdYkqdTmkm -EObkKvbdDnbjkXDE -EPDKjvbdKDKCqKDY -EOcLKvbdeYZstSFz -EPDKjvbdZyDjNbkr -DncLKvbdPyNAGrrK -DoCkKvbdTlVoAuni -DncKjvbdEPCkKvbd -EPCkKvbdcTCkTcjB -DnbkKvbdcJNKLGXY -DnbjjvbdRkYfVHKs -DoDLKvbdaaWEfQQX -EPDKjvbdmbJvwnmu -EOcLKvbdZyDimcMS -DoDLKvbdYkrEUNkm -DoDKjvbdmaivwnmu -DoDLKvbdqYoIHQcx -EPDKjvbdLrWlyuQz -DncLKvbdkCkkQgVH -EObjjvbdrXPlChyR -DoCjjvbdJTYaTMwl -EPCkKvbdNsTvHFVQ -DnbjjvbdeEnqavcK -EPCjjvbdVvhwuceH -EPCkKvbdbLMFoODA -EPDLKvbdCIkCLIfK -DoDLKvbdbLLennDA -DncLKvbdyNrhYTIc -EPDLKvbdNHCpNQUk -DnbkKvbddndsLUTr -DncKjvbdaogHDkzd -EPDLKvbdZjSgpGbG -DnbjjvbdaSGDIUGL -EPCkKvbdjhGlFfNk -EPDLKvbdbKkenmcA -EOcKjvbdIHHZyXxH -DoCjjvbdiUydwRtb -EPDLKvbdauBgYKtI -EPDLKvbdZMSDsmlN -DoDKjvbddneSjtTr -EPCjjvbdJbibqJbx -DnbjjvbdGYtuAcwb -DoDLKvbdsQVoJbvG -DoCkKvbdxmrhXsIc -DoCjjvbdyNsHwsJD -DoCkKvbdKWVFceGi -DoDLKvbdsBfNMGkZ -DnbkKvbdJzoewdAN -EPDKjvbdwzHefYFS -DnbjjvbdBiKbKhej -EOcKjvbdjuvmdCXw -EOcKjvbdbhmKKevx -DoCjjvbdehLWRmpg -EPCjjvbdACrYJzJQ -EOcKjvbdhuZeXSUb -DoCkKvbdJcJbqJcY -EPDKjvbdYqMeJNEq -DncLKvbdmJDtRUqa -EPDKjvbdnBjWxOnV -DoDLKvbdOEctJIkE -DoCjjvbdDxYLtTtM -EOcLKvbdZnnJFFZj -EOcKjvbdKRZeOfNe -DoCjjvbdTukpJtAq -DoDKjvbdhyuGLpnG -DoDKjvbdhtzFWrUb -DnbkKvbdQccBQRDr -EPCjjvbdTukojUBR -EPDKjvbdeKKRvUzn -EOcLKvbdeXzTtSFz -DncKjvbdyTOJNSCH -EObkKvbdjmBkydfo -EPCjjvbdelevflik -DoDKjvbdZtJIxcrn -DoDKjvbdqiAJeNOe -DoCjjvbdddnqavbj -DoCjjvbdZLrDtOMN -EPDKjvbdZyEKNcLr -EObkKvbdMgDPmQVL -EPCjjvbdxrmiMrBg -EObjjvbdZGvdAPSi -EPCkKvbdvvkaWBWV -DncKjvbdfMewHNJk -DoCjjvbdlrYtyrdJ -DncLKvbdiLeDnVCy -DnbjjvbdvwLaWBWV -EOcLKvbdVBCRSprZ -DoDLKvbdYzbfSKVy -DnbkKvbdXrlBNUPY -EObjjvbdKfFhCAqV -DoCkKvbdVTmTekvK -EPDLKvbdaSGChTfL -DncLKvbdauCGwjsh -EObjjvbdBcpBWJlf -DnbjjvbdZjTIQHCG -DoCkKvbdDjHiuxKA -EObkKvbdZxdKNblS -DoDLKvbdptTfrRjt -DoDLKvbdJbjCqKDY -EOcKjvbdEJhKWYKA -DnbkKvbdssSSyZeD -EOcLKvbdZshhyESn -EPDKjvbdRjxfUgKs -DncKjvbdwygefYEr -EPCkKvbdiLeEOVCy -DnbkKvbdTvLojTaR -DoCkKvbdzdzOzdyp -EPDKjvbdVUNUGMWK -EObjjvbdqdEhonVa -EPDKjvbdKefHbAqV -DncKjvbdtSqsYzFD -DoDLKvbdZjTIPgBf -EPCkKvbdRjyFuHLT -EOcKjvbdUtMsfLvK -DoCjjvbdnHEwlnGy -DnbjjvbdURQnttgm -DoCkKvbdFfJrOIsq -DoDLKvbdjKGIKMwr -EOcKjvbdTAEiIBnd -EPDLKvbdFxttaEXb -DoDKjvbdJTZAsNYM -EPCkKvbdFejSNhtR -EPDKjvbdwkXEHzyf -DnbjjvbdbUafxLTh -DoCkKvbdZQleJNEq -EPCjjvbdmpZyVkZC -DnbjjvbdmJEUQuRa -EObkKvbdrEFIpNua -EOcLKvbdJpzEnfNe -DnbjjvbdyTNiMqag -EObjjvbdNQYQvOHT -EPDKjvbdGKdrbgmV -EOcLKvbdCJKakIej -DncLKvbdlhcsptrB -DnbjjvbdZirhPfaf -DncKjvbdZoNiFFZj -EOcLKvbdjuwNcaww -EOcKjvbdUyITzLPO -DnbjjvbdxVMdpyLn -EObjjvbdnCJwXnnV -EPCjjvbdIMBznWqL -EObkKvbdJpzFOenF -EObjjvbdlhdTpuRa -DncLKvbdSCDdkiZL -EObjjvbdZxcimcMS -EOcKjvbdxVMdqZLn -DoCkKvbdrJAKFMne -EObjjvbdXsMAmUPY -EObjjvbdeFOqbWbj -DncKjvbdCTBCsfWr -DoCjjvbdRyjHsCvA -EPDKjvbdziuQQDrt -EOcLKvbdziuPocrt -EPCkKvbdWWhwvEEg -EPCkKvbdeEoRavcK -EPCjjvbdSKyFuGkT -EPCjjvbdrEFIonWB -EObjjvbdrEFIpOVa -DncKjvbdzGyMANEw -EPDKjvbdrRtjmjaN -DoCkKvbdJbjDRKDY -EObkKvbdfNFvgNKL -DnbkKvbdZHWdAPTJ -EPCjjvbdCDoaWKMf -DncLKvbdJKEAKPgE -DnbjjvbdssSTYydc -EOcKjvbdIsYaTNYM -EPCkKvbdgPazvcxI -DoCjjvbdmozYvLYb -DnbkKvbdeATqNYKG -EObjjvbdIwsbIMQp -EPDLKvbdpssfrSKt -EPCkKvbdhzUfLpmf -EOcKjvbdNGcPlpUk -DncLKvbdhkeEOVDZ -EPDKjvbdLFfIBaRV -EPCkKvbdJuuGEFGi -EOcKjvbdRacdlJYk -EPCjjvbdmbKWxOmu -EPDLKvbdwtmFQxkn -DnbjjvbdgvyAzzAJ -EPDKjvbdNrsugFVQ -DncKjvbdmttzLKRf -DnbkKvbdZyEKNcLr -EObkKvbdxrmiNRag -DoDLKvbdiMFDnVCy -EObjjvbdWSNxBdlD -DnbkKvbdCTBDUFwS -DoDKjvbdYTLaMtPY -EOcLKvbdZtIiZDrn -EObjjvbdYzcGSJvZ -EObkKvbdCSaDUFvr -DoCjjvbdTppnuUgm -DoCkKvbdOTUVfduQ -EOcLKvbdfpBzwDwh -DncKjvbdGBPQyJzm -EPCjjvbdVZITyjnn -EObkKvbdVhXuxGxz -EObjjvbdiifHimXr -EPDKjvbdvwMAvAvV -EOcKjvbdkWXODbYX -DoDKjvbdmbKXXnnV -DoDLKvbdZsiJZDrn -DoCkKvbdlrZUzTDi -DoDKjvbdSQTfjGEX -EOcKjvbdqcdiPnWB -EOcLKvbdpssgSSKt -EPDLKvbdhkeENuCy -EPDKjvbdZQmEhmEq -DoDKjvbdZtJIxcrn -DncLKvbdhgJbxujV -DoCkKvbdDoDKkXCd -EObkKvbdZGvdAOsJ -EObkKvbdwjvdHzyf -EPCjjvbdUQpoUuHm -EPDKjvbdUGznMXVe -DnbjjvbduaEYroFI -DoDLKvbdehLWRnRH -DoDLKvbdgQBzwEYI -EObkKvbdbUagYKsh -EObjjvbdyqPMhiwA -EPDKjvbdvvkaWBWV -DnbkKvbdJTYaTNYM -DoDKjvbdZtIhxdSn -EOcLKvbduaEZTOdh -EObjjvbdkNCMZeGo -EPCjjvbdZLqdTnLm -DoCkKvbdUsltFkuj -DncKjvbdnPyyVkZC -DoDLKvbdwjvdHzzG -EPCkKvbdGKdsCgmV -DnbjjvbdiMFDmtby -EObjjvbddneSjtUS -DncLKvbdezvZFJUX -EPCjjvbdhbOcFWqR -DoCkKvbdaMjbTVMg -DoDLKvbdHDjvKCJj -EOcLKvbdpxoIHRDx -DoDKjvbdZshhxcrn -EOcLKvbdcJNKKewY -EObjjvbdTppntuHm -EPCjjvbdemGWfmJk -DoCkKvbdjcLkQftg -EObkKvbdQwODbkgc -EPDLKvbdCTAcUFwS -DnbjjvbdvOszpkPU -EOcKjvbdkClLRHUg -EOcLKvbdNHCpMpVL -EObjjvbdZMRcsnMN -DoCjjvbdpxnggQcx -EOcKjvbdyTOJNRbH -EPDKjvbdeKKRutzn -DncKjvbdrzLosAgn -EPDKjvbdYzcGRjWZ -EPDKjvbdQcbaPpdS -DnbkKvbdtkxXAsaX -DncKjvbdCDpAvKMf -EPDKjvbdHEKvKBjK -EOcKjvbdfpBzvdYI -DncLKvbdiifIJmYS -EPDLKvbddeOqbWbj -DnbkKvbdZyDinDMS -DoDLKvbdkNCLydgP -EOcLKvbddePSCWbj -DnbkKvbdZxcjNcMS -DoCjjvbdQwNccMID -EPDLKvbdiiehKMwr -EOcLKvbdCTBDUFwS -EPDLKvbdbLMGOnDA -EOcLKvbdUMWOaVni -DnbjjvbdyqPMhjXA -DncKjvbdCTAbsewS -DncKjvbdMpYQvOHT -EPDKjvbdTqRPVVIN -DoCjjvbdZxdJnClS -DoCjjvbdWSNwbElD -DnbkKvbdrWokcIxq -EObkKvbdWIYWXgYz -EPDKjvbdzitopDsU -EObjjvbdUVkojUBR -EPDLKvbdEObkLXCd -EOcKjvbdrbFmMHKy -DnbjjvbdehKuqmpg -EOcLKvbdZshiYcrn -DoCjjvbdZnnIdeZj -EOcLKvbdmttzLKRf -EObjjvbdGZUuBDwb -DoCjjvbdHDjvJaij -DnbjjvbdKQzFPGNe -DncKjvbdRbDeMJYk -DoCjjvbdezuyEhsw -DoDKjvbdwkWdHzzG -DncKjvbdEASJMyvw -DncLKvbdyfyMANEw -EPCjjvbdCSaDTfXS -EOcKjvbdCJKajiGK -EObjjvbdrJAKFNOe -DnbjjvbdFWZPoljF -DnbjjvbdmpZyVjyC -EPDKjvbdiifIKNYS -DncKjvbdGAnqYizm -EOcKjvbdiMFEOVDZ -DnbjjvbdJXtBglRQ -DoCkKvbdijGHilwr -DoCjjvbdDwxMUUUM -DoDLKvbdUMWPBVni -EPCjjvbdDwwksssl -DnbkKvbdNeDshhkE -EObkKvbdbAudfQQX -DnbkKvbdwuMdqZLn -DnbjjvbdijGHjNXr -EPCjjvbdOFETiIkE -DoCjjvbdxsOImSCH -DoCkKvbdLiBkqYAS -DncKjvbdFkFTDHmV -DoCjjvbddoErjstS -EObjjvbdyOTIXsIc -DncKjvbdeXzTtSFz -DoCjjvbdqdFIonWB -EPDLKvbdMpYRWNgT -DoDLKvbdfNGXHNJk -EPCjjvbdePErkTsr -DoCjjvbdNHCpNQVL -EObjjvbdsQVnjCuf -DnbjjvbdtcDUwWPP -DoCjjvbduaDySndh -EPDKjvbdqZPIGqDx -EObjjvbdijFgimYS -DncKjvbdZyEJmblS -DoDKjvbdirziSkJz -DncLKvbdeOeTKtTr -EOcKjvbdfpBzwEYI -DnbkKvbdezvZFItX -EPCjjvbdrRuLOKaN -DncLKvbdbrbjscjB -EObkKvbddBrlrAUN -EPDKjvbdZoOIdeZj -EOcKjvbdGYuUaEYC -EPCkKvbdNxPVzdNt -EOcLKvbdhlFDmuDZ -DncKjvbdKVtecdgJ -EPDLKvbdqlzJxkhJ -EOcKjvbdySmhlqbH -EPCkKvbdxsNiNRag -EPDKjvbdTYKkmzjx -EObkKvbdIryBTMxM -EPDLKvbdxnShXsIc -EPCjjvbdaSFbhUGL -EObjjvbdRDbaQQdS -EObkKvbdrbFmMGkZ -EPCkKvbdWXJXudEg -EOcLKvbdcJNKKfXY -DncKjvbdEuxpPljF -DncKjvbddCTNSATm -EOcLKvbdFVyQPmKF -EPCkKvbdpeceUWBI -DoDLKvbdVTmUGMWK -DoCjjvbdFyVVBEXb -EOcLKvbdTukpKTaR -DncLKvbdDHLegAzc -EPCjjvbddxZtTrFz -DncKjvbdssRsZZeD -DoDKjvbdeOeSjstS -DoDKjvbdQdDApQcr -DncLKvbdURQoUuIN -DnbkKvbdezuxdiUX -EPCjjvbdbPgHDkzd -EOcKjvbdFWZQQMjF -DoDKjvbdMfcQMotk -EPCjjvbdrWokbiYq -DoDKjvbdnGdwmOGy -EOcKjvbdnBjXYOmu -EOcLKvbdDoCjjvbd -DoDLKvbdsQVoJbuf -EObkKvbdZirhQHBf -EPCkKvbdIGgZxwwg -DncLKvbdrMzKZMIJ -DnbkKvbdkHflFemk -EObkKvbdfHkWSORH -DnbkKvbdwygfGYEr -EOcKjvbdxmrgxTJD -DnbjjvbdGdLViaij -DoDKjvbdmSYtysEJ -EObkKvbdfILVqmpg -DncLKvbdADSXizIp -DoCjjvbdznpQdbkx -DncLKvbdmbKWxOnV -EPCkKvbdJvUfEEfi -EOcLKvbdcScLTdJa -DnbjjvbdQcbaPpdS -EPDKjvbdDoDKjvcE -DncKjvbdhzUfMROG -DncKjvbdbrcKtDia -EOcLKvbdJpydoFme -DnbjjvbdxLWdHzyf -EPCjjvbdwuMeQyMO -EOcLKvbdiifHimXr -EOcLKvbdySmiNSCH -EPCjjvbdznopeCkx -EPDLKvbdZshhyESn -DoDLKvbdrDeJQNvB -DoDLKvbdILaznXQk -DoCjjvbdnUtzKiqf -DnbkKvbdjJehKMwr -EOcLKvbdDxXlUUUM -DoCkKvbdtSqsYyeD -DoDKjvbdxVMeQxlO -EPDLKvbdZjTHofaf -EObkKvbdZisHogBf -DnbkKvbdnBiwXoOV -DoCkKvbdYSkaMtPY -DncLKvbdHELVibKK -EPCkKvbdhlEcnVCy -EPCkKvbdZLqdTnMN -DoDKjvbdbsCkUEKB -EPCkKvbdMpYRVnHT -EOcLKvbdFWZQPljF -DoDLKvbdznoqEcLx -DnbkKvbdcImJjewY -EPCkKvbdvvlBVaWV -DoCkKvbdmIdTqUrB -DncKjvbdxZgeexFS -EOcLKvbdrouoJbvG -DoCkKvbdWRnYBdlD -DoCkKvbdBhjbLJFj -DnbjjvbdrouoKDWG -DoDKjvbdUxgsyjnn -DoDLKvbdakMFnnDA -EOcLKvbdZtJJYcsO -DncLKvbdrbFllHKy -EPCjjvbdmajXXnmu -DncLKvbdpyPHgQdY -EObjjvbdyNrgwsJD -EPCjjvbdaMjaruMg -DncLKvbdYfwEAPTJ -DoDKjvbdbiNKLFvx -DoCjjvbdajkfOnDA -EObjjvbdZoOJEeZj -EOcKjvbdqZOhGqEY -EOcKjvbdziuPodTU -DoDKjvbduLxWaUBX -EObkKvbdyXhjBoyk -DoDKjvbdTkunaWPJ -EObkKvbdBraCsfXS -DoDLKvbdTAEiICPE -DnbkKvbdDjHjVwjA -EOcKjvbdqlzKZLhJ -EObkKvbddneTLTsr -EObkKvbdWRmwaeMD -DoDLKvbdLBLHNBwq -DoDLKvbdUxhUZkPO -DncKjvbdYlSDsmkm -DoCkKvbdxZhGFwdr -EObjjvbdbsDKsdJa -EPCkKvbdGYuVAdYC -EObkKvbdRXNccLhD -DnbjjvbdFVxpQMjF -DoDLKvbdMgDQNPtk -EObkKvbdQvmccMHc -DncKjvbdMpXqVnHT -DoCjjvbddZxoxYqC -DncKjvbdnVUzKjRf -DoCjjvbdEuyQPmKF -DoDKjvbdLYqKSzuG -EPDLKvbdTAFJICOd -DoCjjvbdCJLCKiFj -EOcLKvbdFyVVAcwb -DoCjjvbdbQHHDkzd -DoCkKvbdNrsvGduQ -DnbjjvbdRWmcblID -DnbkKvbdQvnEDLgc -DnbjjvbdVZITzKnn -EPDLKvbdxxJJaoyk -EObkKvbddoEsLUTr -DncLKvbdZQldhldq -DoDLKvbddCSmSAUN -DoDLKvbdYpldhldq -DoDLKvbdDxXlUTsl -EPCkKvbdnGdxMmfy -DncKjvbdwWlBWAuu -EOcLKvbdkDMKpgUg -DoDLKvbdZshiYdSn -EPDLKvbdhfjCyWKV -EObjjvbdKRZeOeme -DoCkKvbdznopdcLx -EPCkKvbdZMSDsnMN -DnbkKvbdkWWmcbXw -EObjjvbdpxoHfqEY -DnbkKvbdtlYXAsaX -EPDLKvbdjvXNcaww -EPDLKvbduDDVXVoP -DoDKjvbdLGFgbBQu -EObjjvbdmuUzLKRf -EObjjvbdRaceMIyL -EPDLKvbdiHKCyVjV -DoCkKvbdxnTHwriD -EOcLKvbdZjTIPgCG -DncLKvbdBcpBVjNG -EPDLKvbdVwIxVceH -DoCkKvbdkIGkeemk -DnbkKvbdozmdKxPA -DoDKjvbdjuwNdCXw -DoCkKvbdeEoSCXCj -EPCkKvbdcScKtEJa -EPDLKvbdySnIlrBg -EPCjjvbdnQZyVkYb -DoDLKvbdqYnggREY -EObkKvbdBsBDUGXS -DnbkKvbdUWLoitAq -DoCkKvbdIGgZxxYH -DoDLKvbdvwLaWBVu -EObjjvbdmfeXlnHZ -EPDLKvbdRXNdDMID -EPCjjvbdZLrDsmkm -EOcKjvbdUQpoUuHm -DnbkKvbdEzsqFMDJ -EOcLKvbdQlwayOUz -EPDKjvbdyzdnRhJI -DoDLKvbdwzHfGXeS -EOcKjvbdTvMPitBR -EOcKjvbdJbicRJcY -DoDLKvbdFVxpQNJe -DoDLKvbduLxXBTaX -DoCjjvbdLYpirzuG -DnbjjvbdvwMAvBWV -EPCkKvbdBiKbKiFj -DncLKvbdIryArmYM -DncKjvbdySmiNRag -DncKjvbdeEoRbWbj -DoDLKvbdjuwOECXw -EPDLKvbdFWZPomJe -EObkKvbdjcMLRGtg -DncLKvbdQwNccMHc -EPDLKvbdzQoMiJwA -DoDKjvbdmSYtzSdJ -EOcLKvbdelfWgMjL -EOcLKvbdiMFENuCy -EPCkKvbdezvZEhsw -EPDLKvbdUVlPisaR -EPDKjvbdbKlGOmcA -EObkKvbdzGyMANEw -DoDKjvbdXFxzUAPT -EPDLKvbdqrUkNkAm -EOcKjvbdPxmAGsSK -EOcLKvbdyfyMAMeX -EObjjvbduDDUwVoP -DncLKvbdyYJJbQZk -DoDLKvbdxVNEqYkn -EPCjjvbdNPxRWOHT -EObkKvbdYqNEiNEq -EPDKjvbdXrlAlsoY -EPDLKvbdbrcKtEJa -EObjjvbdGdKvJbJj -DoCjjvbdrDeJPnVa -DoDKjvbdZLrETnMN -DoDKjvbdKVuGDeGi -DoCkKvbdZtJIyETO -EObjjvbdYSlAlsoY -DoDLKvbdCSaDUGWr -EObjjvbdmfeYNNgZ -DoDKjvbdtumwiqTA -DncKjvbdqFdEtWAh -EPCkKvbdauCHXjtI -DnbjjvbdvOszqKoU -EOcKjvbdxrnImSBg -DoCkKvbdjvWmdBww -EPCjjvbdmuUzKiqf -EObjjvbdNdcsiIjd -EOcLKvbdNPxRVnGs -EObkKvbdSPsgKFdX -EPDLKvbdVAbQsQqy -EPDKjvbdVZHsyjoO -DncKjvbdJzofXdAN -EObkKvbdFjeTChNV -DnbjjvbdjJegjNXr -DnbkKvbdZLrDsnLm -DnbjjvbdbAueGQQX -DncLKvbdQcbaQQdS -DnbjjvbdFjdrbglu -DncLKvbdAMgxsWyx -DnbjjvbdRpUHKGDw -DncLKvbdMfcPlpVL -EObjjvbdIwtBhMRQ -EPCkKvbdelfXGmKL -DoDLKvbdFkErbhMu -EPCjjvbdHffyyYXg -DoDKjvbdOEctJIkE -DoCkKvbdKkAgvAKZ -EObjjvbdzitopDsU -EPCjjvbdRpUHJfEX -DoCkKvbdZLrDtNkm -EPCkKvbdijGIKNXr -DoCjjvbdxUmEpxlO -DnbjjvbdIxTbIMRQ -EPCkKvbdMfbpMotk -DncLKvbdjlbLzFGo -EObkKvbdrRtkNjaN -DnbkKvbdRosgKFcw -EPDLKvbdpfDeUWAh -DnbkKvbdkxsRryHU -EPCkKvbdkVvmcbXw -EOcKjvbdhficZWJu -EPDKjvbdCEQBWKMf -DoCjjvbdUyITzKoO -DnbjjvbdaNKbStmH -EPDLKvbdFWYpQMie -EObjjvbdhytekqNf -EObjjvbdeXyssqez -DnbkKvbdLAjgNCYR -DncKjvbdSBdFLiZL -EPDKjvbdBhkBjiGK -DoDKjvbdmajWxOmu -DoCjjvbdrMzJyMHi -DoDKjvbdZLqctOMN -EOcKjvbdnPzYujxb -DncKjvbddoFTKstS -DncLKvbdjcMLRGuH -DoCkKvbdbUagYKtI -DncLKvbdVAaqTRSZ -EPCjjvbdOEdTiJLE -EPCjjvbdJvUfEFHJ -DnbjjvbdIryBTNYM -EPDKjvbdYpleJNEq -DncKjvbdZGwEAOri -DncLKvbdBdQAvJmG -DoCkKvbdmIdTqUqa -EPCkKvbdtcCuWuno -EPCjjvbdmuUyjjSG -DncLKvbdjAQHApHK -EPCjjvbdGdKujBjK -EPDKjvbdYkrETmlN -DncKjvbdYORAYUut -DnbkKvbdiHKCxvJu -EPCjjvbdkHgLfGOL -DoCjjvbdpssfqqkU -EPDKjvbdZnmheEzK -EPDLKvbdySmhlrCH -EPCkKvbdjJegilxS -DoCkKvbdqcdhpNua -EPDKjvbdIHHZyXxH -DnbjjvbdjmBkydgP -DoCjjvbdYkqcsnLm -EPCkKvbdZnmhdeZj -EPDLKvbdDjIJuwjA -EOcLKvbdnQZxvKyC -EPCkKvbdBhkCKiGK -DnbjjvbdYkrDsnMN -DncLKvbdyzeNqghh -DncLKvbdrRuKmjaN -EPCjjvbdssRsYzEc -DoDLKvbdZQleJNFR -EObjjvbdZQleJMeR -EPDKjvbdtvNxJqTA -EObjjvbdbBWFGPpX -EPDLKvbdajkeoODA -EPDLKvbdSZihTCvA -EObkKvbdZMRdTnMN -EPCkKvbdsCFmLgKy -EObjjvbdVvhxVceH -EPCkKvbdaaVeFpQX -DoCjjvbdZQmEhleR -EOcKjvbdhzUfLpmf -EPCkKvbdREDBQRDr -DncLKvbdemFwHNJk -EOcKjvbdGAnqYizm -DncLKvbdtTRsZZdc -DoDLKvbdGGKRmhtR -DoDLKvbdIidAJogE -DoCkKvbdxZhGFxEr -DncLKvbdpxoHgREY -DnbjjvbdQcbaQRES -EPDKjvbdjAPfaPgK -EPCkKvbdvwMAuaWV -EOcKjvbdZLrDsnMN -DncKjvbdyqOlhiwA -EObkKvbdRacdkiYk -DoDKjvbdUWMQJsaR -EPDKjvbdUGzmkvvF -DoCjjvbdhbPDFXRR -EObjjvbdXGZZtAPT -EPCjjvbdMoxRWNgT -EOcKjvbdGFiqmhtR -DoCkKvbdNPxRWNgT -EObkKvbdyNrgxTJD -EPDKjvbdrXPkcJYq -EOcLKvbdFjeTChMu -DncKjvbdjvXNcaww -DncKjvbdkMbMZdgP -EOcKjvbdDnbkLXDE -EObjjvbdbBWFGPow -DoCjjvbdAMhZSwZx -EPDLKvbdZRNEiMeR -DoDKjvbdqdEiQNvB -DoCkKvbddePRavbj -EPDKjvbdaMjbStlg -EObkKvbdHgGyxxYH -EOcKjvbdtkxXBUAw -DnbjjvbdmSZUysEJ -EObkKvbdrXQLbhxq -EObkKvbdVTlsfMWK -DoDKjvbdSLZGUfjs -DoCkKvbdFVyPpMjF -DoCjjvbdhgKCyViu -EPCkKvbdZMSDtOLm -EPCjjvbdySmhlqag -EPDKjvbdWRmwadlD -EPCjjvbdqZPHfpdY -DoDLKvbdXsMBMsoY -DncLKvbdelewHMjL -EObjjvbdYpleImEq -DoDKjvbdZirgogBf -EOcLKvbdrXPlChxq -EPCkKvbdFVxpQMie -DoCkKvbdrNZjZMHi -EOcKjvbdDjIJuxKA -DncLKvbdeOeSkTsr -DoCjjvbdZoNhddyj -DoDKjvbdkWXNcaxX -DoDLKvbdTpqOtthN -DnbjjvbdehKuqnQg -EPCjjvbdmgFXlmfy -DncLKvbdShyiqAAl -EOcKjvbdKaKgNBwq -EPDKjvbdEztREkbi -EOcKjvbdVviXvEFH -EPDKjvbdcIlikGWx -EPCkKvbdUWLojUAq -EPDLKvbdOStWHEtp -DoCjjvbdHlBzmwRL -DnbjjvbdWIYVxHYz -EPDLKvbdADSXjZhp -EPDKjvbdRzJgrcWA -EObkKvbdxrnIlqag -EObjjvbdRosgKFcw -DoDKjvbdkySrTYgU -DncKjvbdsrqrxydc -EPDLKvbdZyEKODLr -EPCjjvbdEXxMUUTl -EOcKjvbdtcCtwWOo -DncLKvbddndrkTtS -EPDKjvbdrafMkfjy -EPCjjvbdJcJbpibx -EObkKvbdFfJqnIsq -EPCkKvbdyNsHwriD -DoCjjvbdaRebgsfL -DnbjjvbduoTzpjnt -EPCjjvbdZGvdAOsJ -DoDKjvbdmozYujyC -EPDKjvbdZGvdAPSi -DnbjjvbdmSYtzTDi -DoCjjvbdRotGjFdX -EObkKvbdSBceLhxk -DoCjjvbddijRvUzn -EObkKvbdMgDQNPtk -DoCkKvbdFVxoomKF -DncKjvbdGcjujBjK -EPDKjvbdBcpAvJlf -DncLKvbdLBLHNCYR -EObkKvbdmIctQtrB -DoDLKvbdFpATXGey -EPCkKvbdbrbkUDjB -DncLKvbdcTCjtEJa -DncLKvbdBsAbsfXS -EPDKjvbdFpATXGfZ -DoDKjvbdwuMeQxlO -EObkKvbdqUUGqrKt -DncKjvbdZyEKODLr -EPDKjvbdjhHLefNk -EPCkKvbdrbFmMGjy -DoCkKvbdsQWOjCvG -DoCjjvbdLBLHMbXq -EObjjvbdrpVnicVf -EPCjjvbdVqmwaeMD -DncLKvbdRNYCYnUz -EObjjvbdRXNdCkhD -DncKjvbdIHHZyYXg -DnbjjvbdyTOJMrCH -DoDLKvbdUsmUFkuj -DncKjvbdQcbaPqES -DnbkKvbdmgFYNNgZ -EOcKjvbdkySrTYgU -DoCjjvbdHlBzmwQk -DnbjjvbdaSFcITek -EObjjvbdQdCaPqDr -DncKjvbdxVMdpyLn -EOcKjvbdiMEdOVCy -DoCjjvbdRosgJecw -DncLKvbdkDMLQftg -EPCkKvbdKDKCqKDY -DoCjjvbdjvWnDaww -EOcLKvbduVnYJpsA -DoDLKvbdWRnYBdlD -DoDKjvbdssSSxzFD -EPDLKvbdJYTaglRQ -EOcLKvbdhzUfLpmf -DoDLKvbdJutfDdgJ -EOcKjvbdxmrgwrhc -EObkKvbdwWkaVaVu -EOcKjvbdxrmiMrBg -DoDKjvbdRDcApRES -DoCjjvbddjJrVtzn -EOcKjvbdxVNEqYlO -DoCjjvbdJJdAJofd -DoDLKvbdemGWfmJk -EOcKjvbdnPyyWKyC -DoCjjvbdbrcLTcia -DoDKjvbdjuvmdCXw -DncLKvbdtkwvaUAw -EOcKjvbdHDkViaij -EObkKvbdRDbaPpcr -EOcLKvbdtSqryZeD -EOcKjvbdrRuLOKaN -EOcKjvbdczYowyRC -DnbkKvbdjcMLQfuH -DncKjvbdmbJwYOnV -EPDLKvbdZnmiFEzK -EPDKjvbdjbkkQgVH -EObkKvbdJTZArmYM -DncKjvbdSPsgJfEX -DncLKvbduMYXBUBX -EObkKvbdkIHMFfOL -EOcKjvbdYORAYVWU -DoCjjvbdyzdmqghh -DncLKvbdtumwiqTA -EPDKjvbdQmYCZOUz -DoCjjvbdtcCtvvPP -EObjjvbdVTmUGMVj -EObkKvbdBsAcUGXS -DoCjjvbdqYngfqDx -EPCkKvbdtkxXBTaX -DoDLKvbdACqwiyhp -DncKjvbdraelkgKy -EPDKjvbduLwvaUBX -DncKjvbdpssgSSLU -EPCjjvbdIxTbHlRQ -EPDKjvbdPyNAGrqj -DoDLKvbdnCJvxOnV -EObkKvbdZRNFJNEq -DoCjjvbdFxuVBEYC -EOcKjvbdVAbRSpqy -DnbjjvbdJbibqKDY -DoDLKvbdKCicQjCx -EPCjjvbdNrtVgFUp -EOcLKvbdZQleJNEq -DoDLKvbdaRebgsfL -DoCkKvbdCIjakIej -EOcLKvbdBraDUGWr -EPDLKvbdADRxKZiQ -DoCjjvbdHkazmvpk -EPDKjvbdUsltGLvK -EOcKjvbdTkvOaVoJ -DncLKvbdZnmiEdyj -DoDKjvbdZtJJYdSn -DoDLKvbdbiNJjfWx -DnbjjvbdIsZBTNYM -EPCkKvbdhbPDEvpq -DncKjvbdqlyjYlIJ -DoCkKvbdbsDLTcia -DoDKjvbdKCjCqKCx -DoDLKvbdnBiwYOmu -DnbkKvbdjKGIKMwr -EPCjjvbdHgGyxxYH -EOcLKvbdcyxpXxqC -DncLKvbdlZSrSyGt -EPCjjvbdTAFIhCPE -EObkKvbdZdwfzgiC -DoDLKvbdSLYfUgLT -DoCjjvbdRMwayNtz -DnbjjvbdCflGHAzc -DoCjjvbdrJAKFNOe -EPCjjvbdjblKpgUg -EPDLKvbdQccAoqDr -DnbjjvbdCJKbKhfK -EPDLKvbdiGibyWJu -EOcLKvbdyNsHxShc -EPDLKvbdmIcspuSB -DnbjjvbdnGdxNOHZ -DoCkKvbdhzVGMRNf -DoDLKvbdeFPRawDK -EObjjvbdsQWOjCvG -EObkKvbdhzUelQmf -EObkKvbdeJirWUzn -DncLKvbdxxIibPzL -EObkKvbdSBceMIxk -DoCkKvbdehKvRmqH -EObjjvbdRbDeLiZL -EObjjvbdGYtuAdYC -DnbjjvbdHDkVibKK -DoCjjvbdKQyeOfNe -DoCkKvbdmbJvxOmu -DoCkKvbdULvOaWPJ -DncLKvbdrWpMCiZR -EObjjvbdhytfLqNf -DoCjjvbdgPazvdXh -DoCjjvbdiHKDYuiu -EPDKjvbdRWnDbkhD -DncLKvbdrMzKZLhJ -EObkKvbdyXhiaoyk -EPCkKvbdjmCLydfo -DnbkKvbdDxYMUTsl -EPDKjvbdxmrgxSiD -DnbkKvbdmSYtyrci -EPCjjvbdqvokcIxq -DoDLKvbdXsMAmUPY -DncKjvbdDoDKkWcE -EPCkKvbdMgDPmQUk -DoDLKvbdKyQirztf -EPCjjvbdmajWwnmu -EOcLKvbddCSlrATm -EPDLKvbdrJAKElne -DoCkKvbdIsZBTMxM -DnbkKvbdffMZnGgA -EOcKjvbdJcKDQjDY -EObjjvbdxsOJMrCH -EObkKvbdEKHiuwjA -DncKjvbdunszpjnt -DoDLKvbdZjTIQHCG -DnbjjvbdsQVnibvG -DnbkKvbdGQATXHGZ -DnbkKvbdBsBDTfXS -DoCkKvbdBsAbsevr -DoCkKvbdRXNdDLhD -EPCjjvbdRadElJZL -DnbkKvbdxwhibPzL -EOcKjvbdCJLBjiFj -DncLKvbdZMSDsmkm -DoDKjvbduaEZSoFI -EPCjjvbdhgJbxujV -EOcLKvbdCJLBjhfK -DoCkKvbdZisHpHBf -DoCkKvbdqFdFUWBI -EPCkKvbdDGlFgAzc -DncKjvbdZxcjNblS -EPDLKvbdLqvmZuQz -DoDKjvbdxZhGFxFS -EObkKvbdZdxGzhIb -DoDLKvbdqwQMChyR -DoCkKvbdjlalZeGo -DncKjvbdZRNEhldq -EPCkKvbdZHXEAPSi -DoDKjvbdDoDLKwCd -DnbkKvbdmbJwYPNu -DncKjvbdMfcPlouL -DoCkKvbdQwODblHc -DoCjjvbdNQYQunGs -DnbjjvbdlqxtzSci -EOcLKvbdrDdhpNua -DncLKvbdKefICApu -EPDKjvbdatagXkUI -DoCjjvbdaofgDkzd -EObkKvbdIrxaTMwl -DncLKvbdSLYfVGkT -EPCkKvbdelevfmKL -DncKjvbdFfKSOIsq -EObjjvbdfILVqnQg -DncLKvbdZjShPgCG -DoCjjvbdrNZixlHi -DnbkKvbddoFTKstS -EOcKjvbdWSNwbFMD -EPDLKvbdpxngfqDx -EOcKjvbdIHGyxxYH -EOcLKvbdvwMAuaVu -EOcKjvbdkxrqryGt -DncLKvbdZjShQHBf -DnbjjvbdiUzEvquC -EObkKvbdpxoHfpcx -DoCkKvbdGAoRZJzm -EOcKjvbdehLVrOQg -EPDKjvbdkDMLRGuH -DnbkKvbdKCjDRKDY -EPCjjvbdLGFhBaRV -EPDLKvbdaMjbSuNH -DncKjvbdWfYzUAOs -DoCjjvbdsBelkfjy -DncLKvbdZnmheFZj -EOcLKvbdatagYLUI -EObkKvbdWXJXvEEg -DoDKjvbdZMRdTmlN -EPCjjvbdWXIwvEEg -DoCjjvbdkCkjqHUg -EPCjjvbdijFhJlxS -EPDKjvbdmSZUysEJ -DoDKjvbdMgDQMouL -EPCkKvbdrDdhomvB -EPCjjvbdRNXbYmtz -EPCkKvbdUtMtFlWK -DnbjjvbdGcjvJajK -EPDKjvbduaDyTOeI -DncLKvbdziuPocrt -DoCjjvbdcScKscjB -DncKjvbdmgExMmfy -EObjjvbdJcJcQibx -EPDKjvbdMpXpvNfs -EObkKvbdyqPNIjXA -EPCjjvbdCSaDUGWr -EOcKjvbdZnnJFEyj -EObkKvbdyOSgwriD -EPCjjvbdtkwwAtBX -DnbkKvbdDncLLXDE -EOcKjvbdZshhxcsO -DoCjjvbdxVMdpxlO -DncKjvbdLGGHaaQu -DoCkKvbdxUmFQyMO -EPDKjvbdpfEEsvAh -DoCkKvbdZRMdhldq -EPDLKvbdYzberJuy -EObjjvbdfHkWSOQg -EPDLKvbdRMxByNtz -DncLKvbdmoyyWLZC -EObkKvbdhtydvrVC -DoCkKvbdVhYWYGxz -EPDKjvbdbVCHXjsh -EPCkKvbdTlWPBVni -DncLKvbdFkEsCgmV -DnbkKvbdIsYaSlxM -DncKjvbdzaAOffbM -DncLKvbdaSFcHtGL -DoDLKvbdiGjDYuiu -EObjjvbdDigjVwjA -DncKjvbdqmZixlIJ -DnbkKvbdRjxfUgLT -EObkKvbdeAURNYKG -EPCjjvbdjvWnECXw -EPCjjvbdNQXqVmgT -DoDLKvbdxmsHxShc -EPCkKvbdqwPlChxq -DnbjjvbduLwwAsaX -DncKjvbduCbuWuno -DnbkKvbdJpydnenF -EPDLKvbdRXOEClID -DncKjvbdSKyFuGkT -DncKjvbdczZQYZRC -EPCkKvbdGZUtaDxC -EPCjjvbdOAJTUKSA -DnbkKvbdsZlQSaHn -DncKjvbduWNwiqTA -DoDLKvbdRNYCZOUz -DoCkKvbdVTmTfMVj -EOcLKvbdeATpmYJf -DncKjvbdbUbGxKsh -DnbkKvbdLZRKSztf -DncKjvbdcJMjLFwY -DnbkKvbdRadEkhyL -EPCkKvbdauBgXkTh -EObkKvbdrJAKFNOe -EOcKjvbdDnbjkXDE -DoDKjvbdrafMlGjy -EOcLKvbdliDtRVRa -EObjjvbdZjShQHCG -DnbjjvbdZnmiFEyj -EPDKjvbdbAueFpQX -EPCjjvbdVwJYVcdg -EObkKvbdijGIJmYS -DoCjjvbdJpyeOenF -DoDKjvbdYlSDsnMN -DncLKvbdehLVqmqH -DnbjjvbdTppnuVHm -EOcKjvbdSLYetgLT -EPCkKvbdZyEKOClS -DoDKjvbdHDjujBij -EPCkKvbdHkazmvpk -EObkKvbdkxrrTYft -EPCjjvbdOTUVfeVQ -DoCjjvbdYzbfSKWZ -DncKjvbdkxrrSxgU -EObjjvbdEOcKkXCd -EPDKjvbdcTCkTcia -DoDKjvbdatagXkTh -DoDLKvbdNHCpMpUk -DoDKjvbdhtzEvquC -EPCjjvbddePSBvbj -DoDLKvbddneTLUUS -DncLKvbdijFhKMwr -EPDLKvbdpxoIHRDx -DncLKvbdqquLOKaN -EPCkKvbdSCEEkiZL -DoDLKvbdvAdYroEh -DncLKvbdDwwksstM -EOcKjvbdKWVFcdgJ -EPDKjvbdZnmhdeZj -DoCjjvbdJSyBTMxM -DoDLKvbdtcDVXVoP -EOcLKvbdbAudfPow -EPCjjvbdpfDdtWAh -DncKjvbduCcUwWOo -DnbjjvbdGFirOItR -DnbjjvbdLBKgNBxR -DnbjjvbduVnYJpsA -DnbjjvbdjuvnDbXw -DoDKjvbdFkFTDINV -EOcKjvbdEvZQQMie -DoCkKvbdMfbolpUk -EPCjjvbdhbPCdwQq -DoDKjvbdZyEKNblS -EPCjjvbduCbtwWPP -DnbjjvbdgLGzbfAE -EObjjvbdqGDdsvAh -EPDLKvbdNGbolotk -DoCkKvbdSPsfifEX -DncLKvbdbVCGwjsh -EObkKvbdijGHjMwr -DnbjjvbdRosfifDw -DoCjjvbdQccApRDr -DoDKjvbdqTtHSSKt -EOcLKvbdsQWPJcVf -EObkKvbdeOdsLTsr -DncLKvbdcTDLUDjB -DoDKjvbdVgwvXfxz -EOcKjvbduoTzqKnt -EPCjjvbdYNqAYVWU -EObjjvbdemGXGmJk -DoCkKvbdVgxWXfxz -DoCjjvbdqlzKZLgi -EPDLKvbdLFfHaaQu -DnbkKvbdcSbkTcjB -EObjjvbdgGLzNgHA -EObjjvbdZjSgpGbG -DnbjjvbdGckVjBij -EOcLKvbdUMVnaWOi -EObkKvbdrylQSaHn -EPDLKvbdZHWdAOri -DoDKjvbdyfxlAMdw -DnbjjvbdZMSDsnLm -DoDKjvbdOTUVgEtp -DnbkKvbdJSxaSlwl -DncKjvbdkNCLzFGo -DoDKjvbdfMevgMik -DnbjjvbdMgDPlpVL -DncKjvbdqquLOLAm -DoCkKvbdfNFwGlik -DncLKvbdpxnhHRDx -DoDLKvbdZMRdTmlN -EPCkKvbdURRPVVHm -EPCkKvbdmgEwmOHZ -EOcLKvbdVAapsRSZ -DoCjjvbdczZPwxpb -EPDLKvbdWXIxWDdg -EPCkKvbdUVlQJtBR -EOcKjvbdelfWgNJk -EPDKjvbdUtMtFkuj -DnbjjvbdRkZFtfjs -EObkKvbdCJLCLJGK -DoDLKvbdKVuGEEgJ -DncKjvbdIxTbHkqQ -DncLKvbdMSWlzUpz -EPCkKvbdKefICAqV -EOcKjvbdtunXjRTA -DoDLKvbdZMSETmlN -EObkKvbdapHHELzd -EObkKvbdmRxtyrdJ -DoCjjvbdtTSSxzEc -EObjjvbddeOrBvbj -DncLKvbdJYUBgkpp -EPCjjvbduLxXBUAw -DnbjjvbdSLYetfjs -DncKjvbdzQnmIiwA -EPCjjvbdRpUGjFdX -EOcLKvbdddnqbWcK -EOcKjvbdWWhwucdg -EOcLKvbdCWzdJEov -EPDKjvbdTkuoAuni -DncLKvbdqUTgSSLU -DoDLKvbdNHDQMotk -DncLKvbdWXJXvEEg -EPCjjvbdaNKaruNH -EPDLKvbdraelkfjy -DncLKvbdLqvmZtpz -DnbjjvbdNddThhkE -DoDKjvbdzoQQdcLx -EPDKjvbdYpldiNFR -EObjjvbdZtJIyDsO -DoCkKvbdWWiYWDeH -DoCkKvbdeEoSBwDK -DoCjjvbdBsAcTevr -EObjjvbdqvpMChyR -EPCjjvbdsCGMlHKy -DnbkKvbduLwwAtAw -EObkKvbdMRwMyuQz -DncLKvbdwWlAuaWV -DncLKvbdHgHZxwxH -DncKjvbdBsAcTewS -DoDLKvbdJpyePFme -DncKjvbdVUNUFlWK -DncKjvbdEYXktTtM -DncLKvbdwMvANDeN -DnbkKvbdtSrTZZeD -EOcLKvbdJYUBhMRQ -DncKjvbdlYrrTZGt -DoDLKvbdliDsqUrB -EObjjvbdegjuqnQg -EObjjvbdlZSrTZHU -DncLKvbdfNGWfljL -DoDLKvbdLFegbBQu -DncLKvbdemGXGmKL -EPDKjvbdDwwksssl -DnbjjvbdxmsIYTJD -DoDLKvbdBsBCtGWr -DoCjjvbdIsYaTNYM -DncKjvbdJuuGEEgJ -EObkKvbdkySqsYgU -DnbkKvbdNPwqWNfs -EPDLKvbdmIdTptrB -DoDLKvbdyqOmIjXA -EPCjjvbdhkeEOUcZ -DoDKjvbdJqZePFme -EPDLKvbdfSAvzlCo -EObjjvbdbhljLFvx -EOcLKvbdaMkBsUmH -DoCjjvbdKyRKSzuG -EObjjvbdcSbjtEJa -EOcLKvbdkHflGFmk -DoDLKvbdemFwHMjL -EObjjvbdSLZGVHLT -DoCjjvbdJXtCILpp -EOcLKvbdaaVdfPow -EOcLKvbdFpATWgGZ -DoCjjvbdxZgeewdr -EObkKvbdeEnqawCj -EObjjvbdhytfMQmf -DnbjjvbdoznEKxPA -DnbjjvbdoAKzsgdO -DoCkKvbdYzbfRivZ -DoDLKvbdqqtkOKaN -DncLKvbdqvokcJYq -EPDKjvbdOStVfeUp -DoDKjvbdZxcinDLr -DoCkKvbdcyyQYYqC -EObkKvbdcIlikGWx -EOcLKvbdffLzNgHA -EPCjjvbdMtsRkNAX -EOcKjvbdpeceTvBI -EOcKjvbdZsiIxcsO -DncLKvbdJvVGDdgJ -DnbkKvbdZMRdTmlN -EPDLKvbdnCJwXnnV -EObkKvbdxUldqZLn -EPCjjvbdNddUJIkE -DoCjjvbdyYJJapZk -DnbjjvbdpxoHgQcx -EObjjvbdHDjvKBij -DncKjvbdUtNUFlWK -EPCkKvbdkVvmdBww -DnbjjvbdgGMZmgHA -DoDLKvbdmIdTqVSB -EOcLKvbdzitpPdTU -DncLKvbdkxrqrxgU -DoCjjvbdVBBpsRSZ -EOcLKvbdGFiqmiTq -EOcKjvbdxsOJMqag -DoCkKvbdHDkVjCJj -EPDKjvbdjSziTKiz -EOcKjvbdCTAbsewS -EPCkKvbdkWWnDbYX -DoDLKvbdJSxaTMxM -DoDLKvbdMoxRWNgT -DoDLKvbdmuVZkJrG -EPDKjvbdbUbHXjtI -DnbjjvbdkWWnEBxX -EOcLKvbdnPyxukZC -DnbjjvbdXrlBMtOx -DoDLKvbdJuuGEFGi -EPDKjvbdUaBprprZ -EObjjvbdsrqrxydc -EObjjvbduCbtwWOo -DoCkKvbdSLYeuHLT -DoDKjvbdKQyePFme -EOcKjvbdeYZssrFz -DoDKjvbdpxoHfpdY -EPCkKvbdcIljKfXY -EPDKjvbdDwwksstM -DnbkKvbdsQWOicVf -EPDLKvbdIidAKQHE -DoDLKvbdrDeJPnWB -EOcLKvbdZoNiEeZj -EObjjvbdptTgRrLU -EPDKjvbdmRyUzTEJ -DoDLKvbdFxtuBEYC -DnbkKvbdehLVqmqH -EPCjjvbdUtNUGLuj -DoDLKvbdxVNEqZLn -DncKjvbdySnImRbH -DoCjjvbdbLMGPNcA -EPCkKvbdzQoMiKXA -DnbkKvbdbiMijevx -EOcKjvbdSQTfiedX -DnbjjvbdZisIQHBf -EObkKvbdYpleIldq -DncLKvbdjmBlZeHP -DncKjvbdSCDdkhxk -DnbkKvbdrykpTAgn -EObkKvbdZQldiMeR -DnbjjvbdeYZssqez -EPDLKvbdlYrrSyHU -EOcLKvbdTpqOttgm -EOcKjvbdCJLCLIej -EPDKjvbdUQqOttgm -EObkKvbdGBOqZJzm -DncKjvbdqwQMDIyR -EPDKjvbdbBWFFoow -EOcLKvbdZMRctOLm -EPCkKvbdHEKuibKK -DnbjjvbdNddThiKd -DncKjvbdJuuFdEgJ -DncLKvbdRzJgsDWA -DncLKvbdRWmdCkhD -EPCjjvbdZRNFImEq -EOcLKvbdUaBqTRSZ -EObkKvbdWIXvYGxz -DoDKjvbdrRuKnKaN -DoCjjvbdYgXEAPTJ -DoCkKvbdwuMeQyMO -EPDLKvbdkHfkfFmk -DoDKjvbdTqQnuUhN -DoCkKvbdbKlFoODA -EObkKvbdrzLoraIO -DncLKvbdFxuVAdYC -DoCjjvbdZQldiMeR -EOcKjvbdJTZBTNXl -EPDKjvbdsQWPKCvG -EOcLKvbdeEoRawDK -EPDLKvbdtTSSxzEc -DncLKvbdliDsqUqa -DnbjjvbdZQleImEq -EPCjjvbdaSGDITek -DoDLKvbdRWnDbkhD -EPDLKvbdpedEsvAh -EPCkKvbdYpldhldq -DoCjjvbdZoOJEdyj -EOcLKvbdmoyxvKyC -EObjjvbdmSZVZsEJ -DoDLKvbdqUUGrSLU -EPDLKvbdmpZxujyC -EPCjjvbdCDpBVilf -EPCjjvbdFfJrNhsq -DoDKjvbdsZkosBIO -DnbjjvbdiBnbdvpq -DncKjvbdkDMKpftg -EPCkKvbdatbGxLTh -DoCjjvbdJTYaTNXl -DnbjjvbdhkdcnVCy -DncLKvbdyNrgxTIc -EPDLKvbdyNsHwriD -EPDLKvbdBdQBVilf -DoDLKvbdIsYaTNXl -DnbkKvbdkxsSTZHU -EPCjjvbdBsBDUGWr -EOcLKvbdgQBzwDxI -DnbjjvbdjblLQfuH -DnbkKvbdbVBgYKsh -DncLKvbdMgComPuL -EPDLKvbdqceIpOVa -DnbjjvbdqFceTvAh -EPCjjvbdFWYpQNJe -DoDLKvbdHDjujBjK -DncLKvbdIHGyyXxH -DnbjjvbdeFOqawCj -DoDKjvbdGQASwGfZ -DncLKvbdrWokbhyR -DncKjvbdSKyFtfkT -DoCkKvbdemFvfmKL -EPDKjvbdxsNhmRbH -EOcKjvbdsPunicVf -EObjjvbdrbGNMGjy -EPDLKvbdOXoVzcnU -EOcLKvbddZxpYYpb -DoDKjvbdVBBpsRRy -EPDKjvbdHDkWKCKK -DoCkKvbdSiZjRAAl -EPDKjvbdURQoVVHm -DoCkKvbdpyPHgQdY -EOcKjvbdGAoQxizm -DnbjjvbdMpXpvNfs -DncKjvbddndrjtUS -DnbkKvbdlhcsptqa -DoCkKvbdfNFvfmKL -EPCkKvbdHffyxxXg -DoCkKvbdYpleImFR -DoCkKvbdbBVdfPpX -DncLKvbdWSNxBdlD -EPDKjvbdSQTfjFcw -EPCjjvbdkxrqsYgU -EPDKjvbdrovOjCvG -DoCjjvbdaSGCgsek -DncLKvbdZGwEAOri -DoDLKvbdJmADzHUa -DoCjjvbdNdcshiKd -DoCkKvbddneTLTtS -EObkKvbdMoxQumfs -DncKjvbdVgxVwfxz -DoDKjvbdGcjuibKK -EObkKvbdTqQnuUhN -DncKjvbdURRPUuIN -EObkKvbdbrbjtEJa -DnbkKvbdKQyeOenF -EObjjvbdbKkfOnDA -EPDLKvbdlhdTptrB -EObjjvbdxnTHxTJD -EObjjvbdKCjCpjDY -DoDLKvbdMSWmZtpz -DoCkKvbdBsBCsfXS -DnbkKvbdfRaWzkcP -EPDKjvbdbAvFGQQX -DoCjjvbddoFSjtUS -DnbjjvbdypoNJJwA -EPDKjvbdzdzOzdyp -EObjjvbdJpzEoFme -DoCkKvbduCbuXWPP -EPCkKvbdFfJrOItR -DoDLKvbdkIGlFfOL -DnbjjvbdbAudfPpX -DoDLKvbdtAHRIABS -EOcLKvbduDCuWuno -DoDKjvbdkHgLfGNk -EOcLKvbdxZhFeweS -EObkKvbdUxgszKoO -EOcKjvbdiBoCeXRR -DnbkKvbdZeXfzhJC -EObkKvbdtcDUvvPP -EOcKjvbdMtrrLNAX -DnbkKvbdWXJYVceH -DnbkKvbdJbjCpibx -EPCkKvbdajlFnnDA -DnbjjvbduaEZTPEh -EOcKjvbdGcjuibJj -DncLKvbdKefHbAqV -DoDKjvbdUxgtZjnn -EPCjjvbdVZITzKnn -EPDKjvbdHkaznXRL -DnbkKvbdOEdTiIkE -DnbjjvbdiGjDYvJu -DoDKjvbdnUtykJrG -EPCkKvbdBdQBWKNG -EPDKjvbdsBemLfkZ -EPCjjvbdtumwiqTA -EOcKjvbdnCKXYPOV -DncLKvbdVwIxVdFH -DnbjjvbdWIYWYGxz -EObkKvbdFpATXHFy -DoCjjvbdauBgXjtI -DnbkKvbdTqROuVHm -DnbjjvbdlhcsqUqa -EPDLKvbdxZhGGXeS -DoDLKvbdZjTHogCG -EOcKjvbdbKlGOnDA -EObjjvbdLiBlRYAS -DncKjvbdxrnJMrCH -EOcLKvbdMJBlRYAS -EOcKjvbdUsmTekuj -DnbjjvbdEYYMTssl -EObkKvbdZMSEUNkm -DncLKvbdGGKSNhsq -DoDKjvbdGZVVAdXb -EPDKjvbdKRZdoFnF -EOcLKvbdEXwlUTtM -DoDKjvbdEztQeLcJ -DoCkKvbdJYUBglQp -DoCkKvbdJTZAsNXl -EObjjvbdvmWAMdEm -EPCjjvbdxZgefYFS -DncKjvbdtTRrxzEc -EOcLKvbdiGjDZWJu -DoCkKvbdYlRctOLm -DncKjvbdDxXlTtUM -EPCjjvbdcyxpYYqC -EOcLKvbdqGDeUWBI -DnbjjvbdnPyxvLZC -DoDLKvbdKefHbApu -DoCkKvbdjblKqHVH -EObkKvbdTfzmkvue -EOcKjvbdZnmiEdzK -EOcKjvbdDxXkstTl -EPDLKvbdBdQAujMf -DoDKjvbdGZVVBDwb -DoDLKvbdEvZPpMie -EPCjjvbdVwJXuceH -DoDLKvbdRjyFtgLT -DoCkKvbdXsLaNTnx -DnbjjvbdDHLfHAzc -DoCkKvbdVBCQrprZ -DoCkKvbdyNsIYShc -EPDKjvbdyXiJbPzL -DoCjjvbdUsltFlWK -EPCkKvbdcyyQYZRC -DnbkKvbdddnqbWbj -EPCkKvbdmuUyjjSG -EObkKvbdZyDinDLr -DnbjjvbdZtIiZESn -EPCjjvbdVBCRTRRy -EOcLKvbdCWzciFPv -EObkKvbdrEFJPnWB -DnbkKvbdqUUHSRkU -EPDLKvbdlqyUyrci -DoCjjvbdIMBznXQk -DoCjjvbdUxgsykOn -EPCjjvbdXsMBMsnx -DncKjvbdjuvmdBxX -EOcLKvbdkIGkeemk -DoCjjvbdjKGIKNYS -EPDLKvbdSLZGVGjs -EOcKjvbdMfcPmQUk -DoCjjvbdrNZjYlIJ -EOcLKvbdkyTSTZHU -EObjjvbdjAQGaQHK -EPDKjvbdMoxRVnHT -EObkKvbdeATpmXif -EObkKvbdFjdsDHmV -DncLKvbdbLLfOmcA -EPCkKvbdunszqLOt -DnbkKvbdnQZxvLZC -DncLKvbdZyDjNblS -DnbkKvbdptTfrSKt -DoDLKvbdzaAOgHCM -EPCjjvbdhbPCeXRR -DnbkKvbdmuVZkKSG -DoCkKvbdziuQQESt -DnbkKvbdhgKDZWKV -DnbjjvbdULuoBWPJ -DncLKvbdWXJXucdg -DoCjjvbdRacdlJYk -DoDLKvbdegjvSNqH -EOcLKvbdnUtzLKRf -EOcKjvbdFxtuBEXb -DoCkKvbdmIcsqUrB -EObjjvbdULvPAvPJ -EOcLKvbdSwkLmzkY -EPCkKvbdSZjITCvA -EPCkKvbdeOdrjtUS -EPCjjvbdIxUBhLpp -EObkKvbdqiAJeMoF -DnbkKvbdhlEcmtcZ -EOcLKvbdFejRnJTq -EOcKjvbdwXMAvBWV -DoDKjvbdmpZyWLZC -DoCjjvbdGLErbhNV -DoDLKvbdmaivwnmu -EOcLKvbdOXoVzcnU -DncLKvbdBhjbLJGK -EPDKjvbdZjTIQGaf -DoCkKvbdgPazwEYI -DncLKvbdGGKRmiUR -EObjjvbdfHkWRmpg -DnbkKvbdXrkaNUPY -EPCkKvbdzQoMhiwA -EOcKjvbdrpWOjDVf -DncKjvbdZtJJZDrn -EPDKjvbdqZOggRDx -DnbjjvbdhgJbyWKV -DoDKjvbdiVZdwRuC -DoDKjvbdIwtCHkpp -DoDKjvbdVAapsRRy -EPDLKvbdwjvcgzzG -DoDLKvbdRyihScWA -DoDLKvbdrRuKmkAm -DnbkKvbdqGDdsuaI -EPCkKvbdAMhYrwZx -DncKjvbdSPsfjGEX -DncKjvbdczYpXxpb -DoDLKvbdkIHMGFmk -EPCjjvbdkClKqHUg -EObkKvbdxVMdqZMO -DoDKjvbdBdQBVjMf -EObkKvbdZjTHpGbG -EPDKjvbdTfzmkvue -EPCkKvbdLAjfmCXq -DoCjjvbdLGGHbApu -EPDKjvbdEzsqEkcJ -DoDKjvbdwygfGYFS -DoDLKvbdhgJbyWKV -EPDLKvbdZshiZETO -EPDLKvbdKWUfDdfi -DnbkKvbdqYoHgQcx -DncKjvbdnGeYMmgZ -EPDKjvbdKCjDRKDY -DoCkKvbdJcKDQibx -EObkKvbdZoNiFFZj -EPCkKvbdUyHsykPO -EOcKjvbdtvNxKQsA -EObjjvbdatafwjtI -DoDLKvbdhzVFkpmf -EObkKvbdMgComQVL -EPCkKvbdSCEEkhxk -DoDLKvbdgFlZnGgA -EObjjvbdZMSETnLm -EObkKvbdtumxKQsA -EObjjvbdZoOIddyj -EOcLKvbdqZOggQcx -EOcLKvbdKfFhBaQu -DncLKvbdzGxlANEw -EObjjvbdehLWRnQg -EObkKvbdEPCjkWbd -EObkKvbdqYnhHRDx -EObkKvbdjvXODaww -DnbjjvbdqTsgSRkU -EOcKjvbdTqQoVVHm -DnbjjvbdQmYBxnUz -DnbjjvbdpyOhGqEY -EOcLKvbdLGGHbAqV -EObkKvbdZirgpHCG -EObkKvbdqYnhGpcx -DncLKvbdrbGNLgKy -EObkKvbdkySrSxgU -EOcLKvbdeAUQlwjG -DncKjvbdkVwNdCYX -DoCjjvbdJvVGDeHJ -EPCkKvbdEuyPpNKF -EOcKjvbdDjHivXjA -DnbjjvbdkNCLydfo -EPCjjvbdZjTHogBf -DoDKjvbdGKeTDINV -DnbkKvbdJXtBglQp -DnbjjvbdFejSOIsq -EOcKjvbdhytelRNf -DnbjjvbdbBVdeopX -DoCkKvbdFjdsDINV -DoDLKvbdjvXNcbXw -DnbkKvbdZdxGzhJC -EPDLKvbdjAPgBQGj -EObjjvbdJXsbHkqQ -EPDKjvbdiVZdwRtb -EObjjvbdGFjSNiTq -EPDKjvbdznpQdbkx -EPCjjvbdemFvgNKL -EPDKjvbdWXIxWEEg -DncLKvbdEObkKvcE -DnbjjvbdLAjfmCYR -EPDLKvbdEXwkstTl -EObjjvbdFfKSNhsq -DncKjvbdygZMANFX -EPCkKvbdYqNFIleR -DoCkKvbdSKyGUgLT -DncKjvbdBdQBVjNG -DnbkKvbdbUagYLTh -EOcKjvbdsPunjDWG -DncLKvbdrEFIonVa -DncKjvbdaSGChTfL -DoCkKvbdcJNKKfXY -EObkKvbdULuoBWOi -DncLKvbdKWVGEEgJ -EPCkKvbdqFdEsuaI -EPDKjvbdAMgySvyx -DncLKvbdiUzEwRuC -EObjjvbdZoNheEzK -DnbkKvbdZLrETnMN -EObjjvbdKWVFcdfi -DoDLKvbdcScLUEJa -EPCkKvbdIwsbIMRQ -EOcKjvbdsBemMHKy -EOcLKvbdzitoodSt -EPDKjvbdrMyjZLhJ -DnbjjvbdaRfCgsfL -DoCkKvbdKQzEnenF -EOcLKvbdUGznLvue -DncLKvbdZxcinCkr -DnbjjvbdEuyPpNKF -DncKjvbdGFirOIsq -EOcLKvbdVqmxBeMD -EOcLKvbdwuMeRZLn -DnbkKvbdBhkBkIej -EOcKjvbdNQXpumfs -EObkKvbdVBCRTRSZ -DoDLKvbdZeYGzhJC -DncLKvbdREDBPqES -DnbjjvbdvBEZSoFI -EPCjjvbdakLeoNcA -EPDLKvbdeFOqbWbj -EPDLKvbdiGicZWJu -EPCkKvbdEKHiuwjA -EPCjjvbdwkWcgzyf -DoDKjvbdmpZyVkZC -EPCkKvbdSZihSbvA -EPDKjvbdelevfmKL -DnbjjvbdeATplwif -DoCjjvbdGAnpxizm -EPDKjvbdTlWPBWOi -EOcKjvbdmSYtzTEJ -DncLKvbdnGeXmNfy -DoDKjvbdTIzJqAAl -EOcKjvbdqdEiPnVa -EOcKjvbdcTCkUEKB -DoCjjvbdEvYopMjF -DoDLKvbdwuMdpyMO -EPDKjvbdEuyQPlie -EOcLKvbdVUMsfMVj -EObjjvbdijFgilxS -DoDKjvbdnPyxujyC -EOcKjvbdTAFIgbPE -DnbkKvbdZxdJnDLr -DncLKvbdqdEiPmua -EOcKjvbdhgJcZVjV -DnbkKvbdRbEFLhxk -DoDKjvbdmaivwoNu -DoCkKvbdZQmFJMdq -DncLKvbdeYZtTqez -EObkKvbdqYoIGpdY -DnbjjvbdEASJMyvw -DoDKjvbdwzHfGYFS -DncKjvbdjvXOECYX -DncLKvbdbBVdepQX -DoDLKvbdrEFIomua -DnbjjvbdYgWdAOsJ -EOcKjvbdkMakydfo -EPCjjvbdegkWSNqH -EPDLKvbdYlSEUNkm -EPDLKvbdzRPMhjXA -DnbjjvbdmSZUyrci -EPDKjvbdiiehKNXr -EPDLKvbdwzIGGXdr -DncKjvbdSLYetfkT -EOcLKvbdURROtuHm -EPDLKvbdEYYLtUUM -EOcLKvbdaSGDIUFk -DnbkKvbdhfibyViu -DncKjvbdeFOqavcK -EPDLKvbdZtIhyETO -EOcKjvbdsPuoKDVf -DoDLKvbdBhkBjiGK -EPDLKvbdnQZyVkYb -DncLKvbdNsTugEtp -EPCjjvbdCDpBWJmG -DoCkKvbdmIdTqVRa -EOcKjvbdptUHRqjt -DnbjjvbdRpTfifDw -DncKjvbdaRebgtFk -EPDLKvbdEARiMyvw -EOcKjvbdyNsHxShc -DoCkKvbdxKwDgzyf -DncKjvbdwuNFQyLn -DncLKvbdegjvSORH -DncLKvbdOStWGdtp -EOcLKvbdcTCkTdKB -DncKjvbdRECaQRES -DoDLKvbdkIHMFemk -EPCkKvbdfjfzcGAE -DncKjvbdZLqdTnLm -EOcKjvbdIMBzmwRL -EOcKjvbdwzHeexFS -EPCjjvbdKVuFdFHJ -EPCjjvbdRXODcLgc -DoDLKvbdlrZVZrdJ -EPDKjvbdjKGIJmYS -EObkKvbdHEKujCJj -DncKjvbdNddTiIjd -DoDKjvbdZjSgpGaf -DoCjjvbdmfeXlnHZ -EPCjjvbdRosfifDw -DoCjjvbdZxcinDLr -DoCjjvbdNeDsiIjd -EPDKjvbdVgxVwgYz -DnbkKvbdqTtGrRjt -DnbkKvbdTqQntuIN -DncKjvbdBvzdJEpW -EPCjjvbdqUUHRrLU -DnbjjvbdqcdhonWB -DncKjvbdHDkWKBjK -DnbkKvbdxVMeQxlO -EObjjvbdkClKpgVH -EOcLKvbdCSaDUGXS -DncLKvbdUQqOttgm -DoCkKvbdZxcjOClS -EPDKjvbdVqmxCFMD -DnbjjvbdqmZixlHi -DnbjjvbdiUydvquC -DoCkKvbdOTTugFVQ -EOcKjvbdUQpoVVIN -DoCkKvbdNHDPlpVL -EOcLKvbdDncLKwCd -EOcLKvbddeOrCXCj -EObjjvbdqvolChyR -EOcLKvbdaofgELzd -DoDLKvbdrpVoKDWG -DncKjvbdaMjasUmH -EObjjvbdliETqUrB -DncLKvbdXsLaMtOx -EObkKvbdrykpTAhO -EPDKjvbdehKvRmpg -EObjjvbdUxhTzKnn -DncLKvbdTfznMXVe -EPDLKvbdqUTfqqkU -DoCjjvbdHELWKCKK -DoDLKvbdwuNFQyMO -DoCjjvbdffLynGgA -EOcLKvbdSLYetfkT -EPDKjvbdtTRryZeD -EPDKjvbdddoRbXDK -DoDKjvbdFVxooljF -DoDLKvbdxsNiNSCH -DoDLKvbdsCGNMGkZ -EOcLKvbdkHfkfFnL -EPCkKvbdqrUjnLAm -DnbkKvbdHELViajK -EOcKjvbdNHDQMouL -EPCkKvbdWWhxVdFH -DnbkKvbdUWMPitBR -DncLKvbdZoOJFFZj -DncKjvbdcIljKewY -DoDLKvbdVUNUGLvK -EObkKvbdNsTufdtp -DnbjjvbdGKdsCgmV -EObkKvbduDCtwWPP -EObjjvbdkMbMZeGo -EPCkKvbdJSyAsNXl -DnbjjvbdmbJwXnmu -EPCkKvbdRjxeuGkT -EObkKvbdaSFcITek -EPDLKvbdGYtuAdYC -DoDKjvbdFeirNiUR -EPCjjvbdhyuGMQmf -EObjjvbdDxYLstUM -EObkKvbdFfKRmhtR -DnbkKvbdyTNhmSCH -EPCjjvbdJSyAsNYM -EPCkKvbdEuxpQMie -DoDLKvbdkClLQgUg -DnbkKvbdssRrxzEc -EPDLKvbdRMwbZNtz -EPCkKvbdssSTYyeD -DoCkKvbdYqMeImEq -EOcLKvbdjuwOECXw -EOcKjvbdOTUWHFUp -EPCjjvbdliDtQtrB -EPDKjvbdZxdJmblS -DoDKjvbdbVCHXkTh -DoDKjvbdpstHSRjt -EOcLKvbdNPwpunGs -DoCkKvbdLAjgNCXq -DoCjjvbdDoDKjvbd -DoCkKvbdZirgpHBf -EPDLKvbdezuxdiTw -DoCkKvbdLrXMyuQz -DncLKvbdqlyjYkgi -DnbkKvbdLrWlzUpz -DoCjjvbdhytfLpnG -EObjjvbdxrmiNSBg -EPDLKvbdqquLNjaN -EObjjvbdiHKCyVjV -DncKjvbdjSziTKiz -EPCjjvbdCflGHAzc -EPCjjvbdZtJJZDrn -EPCjjvbdJKEAKQHE -EPDKjvbdIxTbHlRQ -EOcKjvbdZRMdhmEq -EOcLKvbdmttykJqf -DncLKvbdEzsqFMDJ -EPDKjvbdJuteceGi -EOcKjvbdemFvfmJk -DoCkKvbdkySqsZGt -EOcLKvbdlrZVZsDi -EOcLKvbdEXxLstTl -DnbkKvbdkNBlZeHP -DncLKvbdauCHYKsh -EPCkKvbdhuZeXSVC -EPCjjvbdOTTufdtp -DoDKjvbdDoCkKwCd -DoDLKvbdOAIrsirA -EPCjjvbdlAmPNALA -EOcLKvbdiBoCdwQq -DoCkKvbdnCJwYOnV -EOcLKvbdqwQLbhxq -DncLKvbdGYuVBEYC -EPCjjvbdcyyQXxqC -EPDKjvbdrEEiPmvB -DnbkKvbdJbibqJbx -DncLKvbdiGjCxuiu -EObjjvbdjKGIJmXr -EPCjjvbdFkEsDIMu -EPDKjvbdCWzchePv -EObjjvbdEObjjwDE -EPCkKvbdQdDApRDr -DoDLKvbdbAvEfQPw -DoDLKvbddtAUATNW -DnbjjvbdUxhUZkOn -DnbjjvbdwNWANEEm -EPCjjvbduDCuWuoP -DnbjjvbdjAQHApHK -DncLKvbdJzpFxEAN -DncKjvbdwtldpxlO -EObjjvbdBraCtGWr -EPDKjvbdJmADzGuB -DoDLKvbdRadEkiZL -DoCkKvbdAMhZTXZx -DoCjjvbdqGDeUVaI -DoCjjvbdVvhxWDdg -EOcKjvbdSBceMIyL -DnbkKvbdRkYfUfjs -EOcLKvbdFWYpQMjF -DoDLKvbdhlFENuCy -EObkKvbdiCObeWpq -DnbkKvbdHELWJaij -EObkKvbdCTAcTfWr -EPDKjvbdbrcLTdJa -DoDLKvbdDncKkXDE -DoCkKvbdmSYtzSdJ -EOcLKvbdVZHszLPO -DnbjjvbdhkdcmuCy -DnbkKvbdLrXNZuQz -EPDKjvbdZnmiFEzK -EPCkKvbdlrZVZsEJ -DnbjjvbdqmZixkhJ -DoDLKvbdcTCjsdKB -DoCkKvbdcyyPxYqC -DoDKjvbdssRrxydc -DoDKjvbdvPTzpjnt -EObjjvbdZLqctOMN -DoDLKvbdRNXbYnUz -DncKjvbdJYUBglRQ -EObkKvbdkIGlGFnL -DoDLKvbdiUzEwSUb -EPDKjvbdeEnrCWbj -DoDLKvbdRbDdkhxk -EObjjvbdYzcFqjWZ -EOcLKvbdjggLfFnL -DncLKvbdgQBzwEXh -DoCjjvbdQlxByNtz -DnbkKvbdoznDjwoA -DnbkKvbdVgwuxHYz -DoDLKvbdaaVdepQX -DoDKjvbdLZRKSztf -EPDKjvbdbUbHXkUI -EOcLKvbdjhGkfFmk -EObkKvbdeEoSBvcK -DncKjvbdUtMtGMVj -EPDLKvbdJTZAsMxM -DnbkKvbdOEdUJJKd -DoDKjvbdZHXEAPSi -EObkKvbduaDyTPFI -DnbjjvbdqAiFAWhE -EObjjvbdelevgNKL -DnbjjvbdTAEhgbPE -DoDKjvbdnPzZVkZC -DoDKjvbdQwNdDLhD -DnbjjvbdnBjWwoNu -EObkKvbdfMewGljL -DncKjvbdrpVnjCuf -EPDLKvbdLGFgbBRV -EObkKvbdkCkkRHUg -EObkKvbdTlVoAuoJ -EPDLKvbdrMyjZMHi -EOcLKvbdWHwuxHYz -EOcKjvbdLrXNZtpz -EObjjvbdbQHHDkzd -EOcLKvbdfILWRnRH -EPCjjvbdyfyMAMeX -DncLKvbdNHCpNQVL -EPCjjvbdFkEsDHlu -DncKjvbdGGJqmhtR -DnbkKvbdvAcxrndh -DoCjjvbdqGDeTvBI -DoCjjvbdJvUfDdgJ -DoCjjvbdUVlPisaR -DoCkKvbdqTsgSRkU -EObjjvbdjblKpftg -EObkKvbdtcDVXWPP -DnbkKvbdfHkVqnRH -DncLKvbdmoyxvLZC -EObjjvbdkHfkfFnL -EPDKjvbdwNWAMcdm -EPCjjvbdJpzFOfNe -DncKjvbdmbJvxOnV -DncKjvbdTqQnuUgm -EOcLKvbdTpqOuVHm -DoCjjvbdYlSETmkm -DoDKjvbdjEkGuPAO -DoCkKvbdwygefXdr -EObkKvbdrXPkcJYq -DoCjjvbdxUleQyMO -EOcLKvbdBsAcTfXS -EPDLKvbdLBLGlbXq -EObjjvbdmbJvwnnV -DnbjjvbdbVCGwjsh -DnbkKvbdxUmEpyMO -EPCkKvbdYSlBNTnx -DoDKjvbdeOeSkUTr -DncLKvbdqmZixlHi -EPCkKvbdNHCpNQVL -DoCkKvbdDigjWXjA -EObjjvbdrDeJQNvB -EOcLKvbdJuuGDeHJ -DoCkKvbdddnrCXCj -DoDKjvbdqTtGqrKt -DoDKjvbdeOeTKstS -EObjjvbdySmiNRbH -DnbjjvbdZshiYdTO -EObjjvbdnCKXXnmu -EPDKjvbdqiAKFMne -DoDKjvbdNeEUIiKd -DnbjjvbdzitpPdTU -EPCkKvbdzaAOffal -EOcKjvbdZtIiZDrn -DoCjjvbdtSrTYyeD -DoDLKvbdFVxopNJe -DoDLKvbdJJdAJpHE -DoDLKvbdHDjuiaij -EObkKvbdUWMQKUAq -EPDKjvbdTpqOuVIN -EOcLKvbdqvpMChyR -DoCkKvbdVviXudEg -DoCkKvbdGLErbgmV -EPCkKvbdZirhPfbG -DoCkKvbdWXJYVceH -DnbjjvbdhkeEOUcZ -DncKjvbdSPtHJedX -DncKjvbdFfKRnIsq -DncKjvbdWWhxVdEg -DoCkKvbdOStWHEuQ -DoDLKvbdEuyQPmKF -DncKjvbdrpVoKDWG -DoCjjvbdKVtfEEfi -DoCjjvbdWXIwudEg -EPDKjvbdSCDeMIyL -EPDKjvbdDoDKkXCd -DoCkKvbdJpzEnenF -EPDKjvbdaaWEfPow -DoCjjvbdVwJXucdg -EPCjjvbdauCHYKtI -EOcLKvbdNeDshhkE -DncLKvbdNGcQMpVL -EOcLKvbdIryBSmXl -DnbkKvbdTAFJICPE -EOcLKvbdrMzKYlHi -EOcKjvbdznopeDMY -EOcLKvbdMRvmZuQz -DncKjvbdeFOqbXCj -DncLKvbdbhlijfWx -EOcKjvbdqdEhpOWB -DoDLKvbdUWMQJsaR -DoDLKvbdptUGqrLU -EObjjvbdaSGChUFk -EPCjjvbdYTMAltOx -DncKjvbdEPCkLWbd -EOcKjvbdKCjDRKCx -EPDKjvbdZyDjNcMS -DncLKvbdFfKRnJUR -EPDKjvbdrNZiyLhJ -EOcKjvbdZeXfzgiC -EOcKjvbdbUbGwkTh -EPDLKvbdHfgZxwxH -DncLKvbdrovOjCuf -DnbjjvbdfNGWflik -DnbkKvbdZoNiFEyj -EPCjjvbddneTKtUS -EObjjvbdRbDdlIxk -EOcKjvbdKfFgbBRV -EPDKjvbdFyUuBDxC -EPCkKvbdiUzFXRtb -EPCjjvbdrJAJeNPF -DncLKvbdVAbRSqSZ -EObjjvbdaNKbTVMg -DoCkKvbdlhctQtqa -DoDKjvbdZshiZDrn -EPDLKvbdFkFSbglu -EPCjjvbdHffyxwxH -DncKjvbdTvLojTaR -DnbkKvbdauCHXkUI -DoDKjvbdGdKuiajK -EOcKjvbdkClKqHVH -EPDLKvbdnUtykKSG -DnbkKvbdBiKbKhej -DoDLKvbdHffzZXwg -EPCjjvbdbrbkTcjB -DoCkKvbdVwJYWDdg -DncLKvbdJJdAJogE -EPCkKvbdJvUfDdfi -DoDKjvbdZeYGzgiC -EObjjvbdZyEJnDMS -EOcLKvbdmSZVZsEJ -EPCkKvbdDnbjjvbd -EPCkKvbdJvVGDeGi -DoCjjvbdTXkLmzkY -DnbkKvbdLqwNZuQz -DncKjvbdZtIiYcsO -DoDKjvbdLYqKSztf -DnbkKvbdULuoBVni -EObkKvbdiBnbeWqR -EObjjvbdfILWRmqH -DncKjvbdezvYdhsw -DnbjjvbdJvUfEEfi -EPCkKvbdRpUHKGDw -EObkKvbdZGwEAPTJ -EOcLKvbdcTCkUEKB -EObjjvbdGAoQxizm -DnbjjvbdNwoVzcmt -DncLKvbdJbicRKDY -DnbkKvbdGZVVAcxC -EPCkKvbdRadFMJYk -DnbjjvbdxsNiNRag -DnbjjvbdiBncFXRR -EPCjjvbdySmiNRbH -DoDKjvbdeATqMxKG -DnbjjvbdtSrSyZdc -EOcKjvbdwtldpyLn -EPDKjvbdqwPkbiYq -EPDLKvbdzitpPcsU -DoDKjvbdDjHiuwjA -EPCkKvbdfMewGmKL -DncKjvbdlrYtyrci -EPCjjvbdZQldiMdq -EPDKjvbdJbjDQjCx -DncKjvbdqTsgRrKt -EPCkKvbdEvZQPljF -DoCkKvbdUsltGMWK -EOcLKvbdEJgivXjA -DnbkKvbdePFTLTtS -EPDKjvbdEYYLstTl -EPDKjvbdMfcPmPuL -DoDKjvbdBsAcTevr -EPDLKvbdwtleRZMO -EObjjvbdRotHJfDw -EOcKjvbdJuuFdFHJ -DnbjjvbdZoOIeFZj -DoDLKvbdsZlQSaHn -EPCjjvbddoFTLTtS -DncKjvbdbVBgXjsh -EPCkKvbdaMkBrtlg -EPDKjvbddiiqutzn -EObkKvbdiZuFkpnG -EPCkKvbdIxTaglRQ -EOcKjvbduaEYrndh -DnbjjvbdzQoMiJwA -DoCkKvbdsCGNMHKy -EObjjvbdMoxQunHT -DnbkKvbdxwiJbPzL -EOcLKvbdJbibpjCx -DncKjvbdIxTbHkpp -DoCkKvbdwuMeQxlO -EOcKjvbdKeehCBRV -EPCkKvbdZxdKNblS -EPCjjvbdLFegbBQu -DoCkKvbduLwwBUBX -DoDKjvbdjlbMZeHP -DoDLKvbdjAPfaPfj -EObjjvbdqGEFTvBI -EObjjvbdeAURNXif -EObjjvbdxmrgxTJD -EPCkKvbdqGDeUWAh -DncKjvbdqTsfqrKt -EObjjvbdjEjftoAO -EOcKjvbdNrtWHFUp -EObkKvbduCcUvvOo -EPCkKvbdvwMAvBWV -DncLKvbdtkwwBUBX -DoCjjvbdVZHsyjnn -EPDKjvbdQccBQQdS -DnbkKvbdjgfkeemk -EPDLKvbdFyVVBDxC -DncLKvbdrNZiyMIJ -EObjjvbdHfgZxwwg -DoDKjvbdqceIomvB -EPCkKvbdNGcPlouL -DoCkKvbdCIkBkIej -DoCjjvbdjKFhJmYS -EObkKvbdBsBDUGWr -EObkKvbdnQZxvKyC -DnbjjvbdhzVFkqOG -EPCjjvbdGLFScHlu -DoCjjvbdtlXwAtBX -DoDLKvbdUtMtFkvK -DoCkKvbdBvzchdov -DncLKvbdlZSrTZHU -EOcKjvbdZnnJEdyj -DncKjvbdYpleJMdq -EPDKjvbdiMEcmtcZ -EPCjjvbdfelZmgHA -DnbkKvbdLhalRYAS -DncKjvbdehLWRnRH -DnbjjvbdeKJqvUzn -EPCjjvbdqqtkOLBN -EOcLKvbdfRaWzlDP -DncLKvbdhtzFWquC -EObkKvbdJvVFdFGi -EObkKvbdMfcPlotk -DoCjjvbdtcCuWvPP -DnbjjvbdwtmFRZMO -DoDKjvbdsPvPKCvG -EPCjjvbdmfdwmOHZ -EPDLKvbdMgDPlouL -DoDKjvbdnGdwlnHZ -DoCkKvbdVwJXudFH -EObjjvbdQdCaQQcr -DnbkKvbdYSkaNUPY -DoCjjvbdULvPAuni -EPCjjvbdSZihScWA -DoCkKvbdBiLCKhej -DnbkKvbdhXZAzzAJ -EOcLKvbdQYmAGsRj -EOcLKvbdZtJIyDrn -DnbkKvbdNsTufduQ -EOcKjvbdEXxMUTsl -DoDLKvbdKyRJrzuG -DoDKjvbdrWpLbhxq -DnbjjvbdrDeIonWB -EPDKjvbdHELViaij -DoDLKvbdBdQBWJmG -DncLKvbdRjyGUfkT -EPDLKvbdYNqAYUut -EPDKjvbdRXNdClID -EPCkKvbdNwnuzdOU -EOcLKvbdjmBkydfo -DoCjjvbdrpWPKDVf -EPCkKvbdZyEKNbkr -EOcKjvbdQZNAHTRj -EOcKjvbdwtmEpxkn -DncLKvbdLhbMRYAS -DoCjjvbdsrrTZZdc -DncKjvbdxmrgxShc -EPCkKvbdmozZVkZC -EPCjjvbdbsDLTcia -DoDKjvbdGKeScIMu -EPCjjvbdrEFIpOWB -EOcKjvbdmpZxukZC -DoCkKvbdTkunaVni -DoCjjvbddneSkUUS -EPCjjvbdTlVoBWPJ -DoDKjvbdxsNhmSCH -EPCkKvbdVviXvDdg -DnbjjvbdwzHfFwdr -EPDKjvbdfMewHMjL -DoCjjvbdbsDKtDjB -EPDLKvbdUQpoVVIN -EObkKvbdrEFJPmua -EObkKvbdhlEcnUcZ -DoDKjvbdZRMeIleR -DnbjjvbdmajXYOnV -DoDKjvbdaRfDHtGL -DoCjjvbdbhljKewY -DoDLKvbdDwwksssl -DncLKvbdUMWOaVoJ -DncKjvbdWWiYWDdg -DoCjjvbdyXiJbQZk -DnbkKvbdHDkVibKK -EPCjjvbdtSrSxzEc -EOcLKvbdaSGChUFk -DnbkKvbdYSlBNUOx -EPDLKvbdJTZBSmYM -DoCjjvbdTkvOaWOi -DncKjvbdMowpvNfs -EPDKjvbdeEnqavcK -EOcLKvbdiifIJlxS -DnbkKvbdqceIpNua -EPDKjvbdrNZixkhJ -DncKjvbdiHKDZViu -DnbkKvbdrDdiPnWB -DncLKvbdLGFhCAqV -DoCjjvbdwuMdqYlO -EPCjjvbdePFTKssr -EObjjvbdVBCQrpqy -EObjjvbdbrcKsdKB -DnbkKvbdBvzciEpW -DoCjjvbdIHGyyXxH -EObjjvbdrzLpTAhO -EOcKjvbdemGWgNJk -EObkKvbdVZHtZjnn -EOcKjvbdiCObeXRR -EPCkKvbduoTzpkPU -DoCkKvbdrNZjYkgi -DnbkKvbdTAEhgand -EOcKjvbdhuZdwRuC -DoDLKvbdWWiXuceH -EPDKjvbdZoOIddzK -DncLKvbdVAbRSprZ -DnbjjvbdhgKDZWJu -DoCkKvbdVZITykOn -DoCkKvbdiGibyWKV -EPDLKvbdwyhGGYFS -DoDKjvbdiHKCxvJu -EPDLKvbdhyuGLpnG -EPDKjvbdOAJStKSA -EOcKjvbdzitpPdSt -DoCkKvbdzROlhjXA -DoDLKvbdtTSSxzEc -DoDKjvbdzoQRFCkx -DnbkKvbdxnSgxShc -DnbjjvbdiBoDFWqR -DoCjjvbdnBjWwoNu -DncLKvbdVYhTzKnn -DncLKvbdkIGkefNk -DnbkKvbdlqxuZsEJ -EOcLKvbdACrYJzIp -EPDKjvbdmaiwYOnV -EOcKjvbdYkrEUNlN -DoCjjvbdVUNTfLuj -DoDLKvbdfHkWSOQg -DnbkKvbdBraCsfXS -EOcKjvbdMJBkpxAS -DoDKjvbdcyyQXyQb -EObkKvbdeEnrCXDK -EObkKvbdFejSNiTq -DoCjjvbdEYXkstTl -EPDKjvbdyYIjBpZk -DncKjvbdiHJcZWKV -DncKjvbdQdDAoqDr -EObkKvbduDDUvvOo -EPCkKvbdzGyMANEw -DoDKjvbdQvnECkgc -DncKjvbdVviXudEg -DoDLKvbdQZNAHTSK -EPDKjvbdkCkjqHUg -EObjjvbdwyhFeweS -DoCjjvbdxwiJbQZk -EOcLKvbdEPDLLXDE -DncLKvbdVrNwbFLc -DoCkKvbdjAPgBPgK -EOcKjvbdpstGqqjt -EPDLKvbdHDkVjCKK -DncKjvbdirzhrjiz -DnbjjvbdxrnJNSBg -EPCkKvbdraelkgLZ -DncLKvbdptTgRqjt -DoCkKvbdIsYaTMxM -DoCjjvbdMpXqVnGs -DoDLKvbdUVkoitBR -DoCkKvbdjmCLyeHP -DoCjjvbdiVZeWquC -DoCjjvbdVUMtFlWK -EPDLKvbdxKvdHzzG -DoDKjvbdiMEdNuCy -EPDKjvbdwzIFfYEr -EObjjvbdJXsagkpp -EPCkKvbdxrmhmSBg -DoDKjvbdlqxuZsDi -EPDKjvbdsQVoJcVf -DnbjjvbdEYYLstUM -DncLKvbdkHgLfGNk -EPCjjvbdbsDKtDjB -DnbjjvbdJcKDQibx -DoCjjvbdyzdnSIIh -DnbkKvbdrpWOjCuf -EObjjvbdbAudeopX -DnbkKvbdYkqctNlN -EPDLKvbdfHkWRnRH -EPDLKvbdXmqAYUut -DncKjvbdFyVVBEXb -DnbkKvbdrDdhpNua -DncKjvbdeAURNXjG -DoCkKvbdOTUVgEuQ -EPCjjvbddwyssrFz -DoCjjvbdMpYRWNfs -DoCkKvbdjuvnDaww -DnbkKvbdVhXvXgYz -EObjjvbdTulQKTaR -EObjjvbdOAJTUJrA -EPDLKvbdsZkosBIO -DoCkKvbdhgJbxvKV -EPCjjvbdnBivxOnV -DncKjvbdxrnIlrCH -DncLKvbdzaAPHGbM -EPCkKvbduMXvaUBX -DnbkKvbdSBceMJZL -EObjjvbdJpzEoGOF -DnbkKvbdWexytAPT -DnbkKvbdkVwNcaxX -EOcLKvbdEYYLsstM -DoCkKvbdRosfiedX -EOcKjvbdwuMdpyMO -EObjjvbdUsmUFlWK -EObjjvbdjuwOECXw -DncKjvbdqlzJxkgi -DoCkKvbdiHJbxujV -EPDLKvbdakMFoNcA -EOcLKvbdmIcsqUqa -EPCkKvbdeKKSVtzn -EPCkKvbdvBEZTOeI -DncKjvbdpstHSRjt -EOcKjvbdKVuGEEfi -DoDLKvbdZQldiNFR -EPCjjvbdxnTIYShc -EOcKjvbdtunXjQsA -EPDKjvbdjcLkRHVH -DncKjvbdDoDLLXCd -DnbjjvbdZyEJnDMS -DoDLKvbdFkFTCgmV -EOcKjvbdhkddOUby -EPDLKvbdNeEUJIkE -DnbkKvbdyzeNqghh -EPDKjvbdFVxopMjF -EOcKjvbdGdLVibKK -DncKjvbdBdQAvJlf -DoDKjvbdbiNKLFwY -EPCkKvbdnGeYNNgZ -EPDLKvbdEYXlUTsl -DncLKvbdOEcsiIjd -DncKjvbdKaLHMbYR -DncKjvbdyTOIlrCH -EPCkKvbdMpXpumgT -EPCjjvbdtbbtwVno -DoDKjvbdrRtkOLAm -EObjjvbdbLLfPNcA -DncKjvbdjmCLydgP -DnbkKvbdTkuoBVoJ -DnbkKvbdSCDdlJYk -EObkKvbdCEPaVjNG -DoDLKvbdFaOpxizm -EPCjjvbdfMevgMjL -DoCkKvbdYzcGRjVy -DnbjjvbdKRZdoGNe -EPDLKvbdZisIQHCG -EOcLKvbdZMSEUOMN -DoCjjvbdiGibxuiu -EPDLKvbdZQmFJMeR -DoCkKvbdsBemLfjy -DncLKvbdzoPqEcMY -DncLKvbdMoxRWOGs -EOcLKvbdFeirOJUR -DoDLKvbdpyOgfpdY -DncLKvbdyzeOSIJI -DoDLKvbdRkZFuHKs -DnbkKvbdxVNEqZLn -DoCjjvbdMgDPmPuL -EPDKjvbdZQmEhmFR -DncKjvbdBraDUFwS -DoCkKvbdqqtjmkAm -EPDLKvbdLZQirzuG -DoDLKvbdlYsRryGt -EOcKjvbdKaLHNBxR -EOcKjvbdTqQoUthN -EObkKvbdhbObeXRR -EPDKjvbdJutfDeGi -DoDLKvbdRkZFuGkT -EOcKjvbdrbGNLgKy -DnbjjvbdmpZyWKyC -EPDKjvbdHELVjBij -EPCjjvbduDDUvuoP -EOcKjvbdrDeIonWB -DoCjjvbdnPyyWLZC -EPDKjvbddndrjtUS -EObjjvbdjuvnDbYX -EPDLKvbdCIkBjhfK -EObkKvbdZjTHogCG -EOcKjvbdjJehKNYS -DnbkKvbdSxLMNzkY -DoDLKvbdKDKDRJcY -EPCkKvbdmpZxvKxb -DnbjjvbdssSTYyeD -EObjjvbdHDkVibJj -DnbkKvbdSLZFtgLT -DoCjjvbdxnTIXriD -DnbkKvbdcSbjsdJa -DoCkKvbduoTzpjoU -DoCjjvbdXsLaNUOx -DoDLKvbdcScKtEJa -DnbkKvbdfpBzwDwh -EPDKjvbdjlakyeGo -DnbjjvbdYzcFqivZ -DncLKvbdCIkBjiGK -EPDLKvbdxZhFfYFS -EObjjvbdrEFJQNvB -DoDLKvbdjAPgBQHK -EOcLKvbdkDLjqHUg -DoCkKvbdiUzFWqtb -DoCkKvbdKVtfDdfi -DoDLKvbdwkXEHzyf -EObjjvbdqcdhpOWB -EPCkKvbdeEnrBvbj -DoCkKvbdCTAbsewS -DnbjjvbdNHCpMouL -DoDKjvbdSQUGiecw -DoDLKvbdelevfmKL -DoCkKvbdySnImSCH -DncKjvbdANIZSvzY -DncKjvbdrJAJeNPF -EPCjjvbdqTtGqqjt -EObjjvbdaRfDHsfL -EPCkKvbdrJAJeMne -EPDKjvbdiGjDYvJu -DoDKjvbdMgCpMpVL -DncKjvbdZjTIQHCG -EOcLKvbdJYTbILqQ -DoCkKvbdzoPqEbkx -EPDLKvbdvlvANDeN -DncLKvbdatafwjsh -DncLKvbdJuuFcdgJ -DncLKvbdwXMAvBWV -DoDLKvbdaMjbStmH -DoCkKvbdeOdsLTtS -DoDKjvbdbLLeoNcA -EPDKjvbdJKEAJpGd -DnbjjvbdZnnIeEyj -EOcLKvbdunszpjnt -EObkKvbdmoyyWKxb -EObkKvbdILazmvpk -EPDKjvbdQlwbYmtz -EPCjjvbderAvzkcP -EObkKvbdegjvSORH -EOcKjvbdsrqsYydc -EOcKjvbdfIKvSORH -DnbkKvbdFjdsDIMu -EPDKjvbdpstHRqjt -EOcLKvbdWRmxCElD -EOcLKvbdkHflGFnL -DoCjjvbdZjTHofbG -EObjjvbdeEoSBwCj -EPCkKvbdJSyBTNXl -DnbkKvbdUaCRTQqy -EPDKjvbdSLZFtfkT -DncKjvbdyNrgwsJD -DoDKjvbdezuxdiUX -DoDLKvbdACrXiyhp -DoDLKvbdxwiJaoyk -EOcKjvbdUxhTzLOn -DnbjjvbdnHFYNNfy -EOcLKvbdhanbeWqR -DoDKjvbdzHYlAMdw -DoCjjvbdKyRJrzuG -DncLKvbdliETpuRa -EObkKvbdczYpXyRC -DoDKjvbdFfKRnIsq -EPDKjvbdVAbQsRSZ -DncKjvbdezvZEiUX -DoCkKvbdZisHofbG -EPDKjvbdjKFgilxS -EOcLKvbduVmxKQsA -DnbjjvbdhuZeWrUb -EObkKvbdGYuUaDxC -DoDLKvbdaaWFGPpX -DnbkKvbdUQpoVUhN -EPCjjvbdZxdJmcMS -DncKjvbdhbPCdwRR -EObkKvbdZRMeJNFR -DnbjjvbdTlVoBWOi -DoCkKvbdatbHYKtI -EObkKvbdiHJbxvJu -DncKjvbdsQWOjCvG -DncLKvbdRosfjGEX -EObkKvbdREDBQRDr -EOcLKvbdeEnqawCj -EPDLKvbdGZVUaEXb -EPDLKvbdIryArmXl -EObjjvbdiiehJlwr -DoCkKvbdMJCMRYAS -DnbkKvbdlrYtzTDi -DoDLKvbdnGeXlmfy -DoCkKvbdSCDeMJZL -EObkKvbdLFegaaRV -DoDKjvbdGGKRmhsq -EObkKvbdiLdcnVDZ -DnbjjvbdGBOqZJzm -DnbjjvbdhfjCxvKV -EPCjjvbdlBNPNALA -EOcKjvbdtbbuXWPP -DncLKvbdEPCjjwDE -DoDLKvbdLqwNZtpz -EPDLKvbdbVCGwkUI -DncLKvbdZyDimcLr -DncLKvbdfILWSNpg -DoDKjvbdFVyPpNJe -DncKjvbdqiAJeMoF -EOcKjvbdqrVLOLAm -DoCjjvbdehKuqnQg -DoDLKvbdGLFTCglu -DoCjjvbdXrlBMtPY -DncKjvbdlYrrTYgU -EPCkKvbdWSNxCFMD -DncKjvbdUVkoitAq -DncLKvbdfHjvSORH -DoCkKvbdCEPaWKMf -EObkKvbdmbJvxPOV -EPDKjvbdwzHefXeS -EOcKjvbdvvlAvAuu -DncLKvbdpxngfqDx -DnbjjvbdIwtCIMQp -DncKjvbdHDjvKBjK -EOcKjvbdjmCLzFGo -DnbkKvbdZMRdTnMN -EObjjvbdEOcLLWbd -DoDLKvbdkNBlZdfo -EPCjjvbdemGXHNKL -EOcLKvbdkxrqryGt -EOcKjvbdsPvPKDWG -EOcKjvbdXsMAlsoY -DnbkKvbdmIcspuSB -DoCjjvbdUaBpsRRy -EOcLKvbdSPsfiedX -EOcKjvbdSCEEkiYk -DncKjvbdWXJXudEg -DncLKvbdRyigrbvA -DoDLKvbdUMVoAvOi -DnbjjvbdZtIhxcsO -EOcLKvbdJXsbHkpp -DnbkKvbdZtIhyETO -DncLKvbdHlBzmvpk -EObkKvbdzHZMAMeX -EPDKjvbdKCjCpjDY -EOcKjvbdjblKqHUg -DoDKjvbdGGJrNiUR -DoDLKvbdrEFIomvB -EPCkKvbdrovPKDVf -DoDKjvbdpxnhGpdY -EPDKjvbdemGWgNKL -EPDLKvbdTlWPAuoJ -EOcLKvbdhuZeWqtb -DnbkKvbdhyuGLpnG -EObjjvbdSBcdlJZL -DnbkKvbdeEnqbWcK -DnbjjvbdJKEAJofd -EObjjvbdbQGfckzd -EPCjjvbdRkYeuHLT -DoDLKvbdXrlBMtOx -EObkKvbdznoqFCkx -EPDLKvbdjggLfFnL -EPDKjvbdhuZdwSVC -EPCkKvbdeEoRbXDK -EPCkKvbdKaKgNCYR -DoDLKvbdWWhxWDdg -EPCjjvbdqUTfqqjt -EOcKjvbdcSbkTdJa -DncKjvbdauCHXjtI -DoCkKvbdQlwbZNtz -DnbjjvbdqvolCiYq -EOcLKvbdePFSjstS -EOcKjvbdhgKDZWKV -EObkKvbdCgLfHAzc -DncKjvbdnUuZkKSG -DnbjjvbdlhctRUrB -DoDKjvbdpyPHgREY -DoCkKvbdjJegimXr -EPDKjvbdfHkVrORH -EPDKjvbdyTOIlqbH -EPDKjvbdjKFhKNYS -EPDKjvbdFWZPpMie -EPCjjvbdIwsahLpp -EObkKvbdKfGIBaQu -DncKjvbdGFirOJTq -DnbjjvbdpedFUWBI -EPCkKvbdNeDshiKd -EObjjvbdBiLBjhej -EObjjvbdCJKbLJFj -DncKjvbdvwMAuaWV -DnbjjvbdZRMdhleR -DncKjvbdhgKCyViu -DoCkKvbdhficZWKV -DnbjjvbdwkWdHzyf -DncLKvbdVBBqSprZ -EOcLKvbdUsmTelVj -EOcLKvbdFxuVBEYC -DoDKjvbdKaLHMbYR -EPCkKvbdGdKuiaij -EPDKjvbdfIKvRnQg -DncKjvbdfekzNfgA -DoCkKvbdJbicRJbx -EOcKjvbdIwsagkpp -DncKjvbdOEctIiKd -DncKjvbdOTUVfduQ -EPCkKvbdFWZPomKF -EObjjvbdezvZFJUX -DoCjjvbdtSrTYzFD -DoCkKvbdbVCHYLTh -EPDLKvbdZMRdUOLm -DoDLKvbdNwoVzdNt -EPDLKvbdFaPRZJzm -DoCjjvbdxZhGFweS -EPCjjvbdZQmFImFR -DnbjjvbdsQWOibvG -DoCjjvbdSBdFMIxk -EPCkKvbdEObkKvcE -DoDKjvbdqFcdsvAh -EOcKjvbdezuyEhsw -DnbkKvbdVqnXaeMD -EObjjvbdnGeXlmgZ -DncLKvbdCIkBkIfK -EPDLKvbdpecdtWAh -EPDKjvbdsQVnjCvG -DoDKjvbdkDMLQfuH -EObjjvbdAMhZTWzY -EPCjjvbdiCObdvqR -DoDKjvbdUWLoisaR -DncLKvbdSPtHKGDw -EObjjvbdaNLBrtmH -EPDKjvbdUyHszKoO -DoDKjvbdQwNccLhD -EPDLKvbdnVUzKjRf -DoCkKvbdRyigrcWA -EOcLKvbdbiNKLGXY -DncKjvbdlhctRVSB -DoCkKvbdNPxRWNfs -EObjjvbdANHxsXZx -DnbjjvbdNrsvHEuQ -EPCjjvbdmbJvxPNu -EOcKjvbdJvVGEFGi -EPDKjvbdUWLoitAq -DoCkKvbdkDMKpfuH -EOcLKvbdfjfzbfAE -EOcLKvbdczZQYZRC -DoDLKvbdQwNcblHc -EObkKvbdOTTugEtp -DncKjvbdbUagYLTh -EPCjjvbdfNGWfmKL -EObjjvbdiVZdvrUb -DncLKvbdZyDinDMS -EPCkKvbdmaiwYOmu -EOcLKvbdqUUHSRkU -DncLKvbdDncKjvbd -DoCkKvbdVqmxCElD -EPCkKvbdaRfDIUFk -EOcKjvbdjKGIJlxS -DncLKvbdkxrrTZHU -DncKjvbdypnmIjXA -DoDLKvbdJpyeOfOF -DoDLKvbdwXMBVaVu -DoDKjvbdKfFhCAqV -DoCjjvbdIxTahLqQ -EOcLKvbdADSYKZiQ -DoCkKvbdMowpunHT -EOcKjvbdgKfzbfAE -EPDKjvbdhkddOVDZ -EPDLKvbdemFwHMik -EPCjjvbdUVlQKTaR -DncLKvbdRWnECkhD -DnbjjvbdkWXODbYX -DoCjjvbdZeYGzghb -DoCkKvbdSKyFtfkT -DoDLKvbdBhkCLJFj -DncKjvbdlhdTqVRa -EPDKjvbdqqtjmjaN -DoDLKvbdZjTHofbG -EPDLKvbdJmADzHVB -DoDLKvbdSBceLhyL -EObjjvbdqwPlCiYq -DncLKvbdYORAXtvU -EPDLKvbdZnnJEdyj -DoCjjvbduWNxKQsA -EPDKjvbdWSNxCElD -DoCkKvbdRjyFtgLT -DoCkKvbdeOeSkUUS -EOcKjvbdDihKVxKA -EObjjvbdffLymgHA -DoDLKvbdcScKsdKB -EPDLKvbdlYsSSyGt -DnbjjvbdGKeTDINV -DoDLKvbdCTBCtGXS -EObjjvbdEASIlyvw -EPDLKvbdfMfWfmKL -DoCkKvbdpstGqrLU -DncLKvbdtlXwAsaX -DoDKjvbdNrsvHEuQ -EObjjvbdCTBDTfXS -DoDKjvbdkMalZeHP -DoDLKvbdQccBPqDr -DnbkKvbdYqNEiNEq -DnbkKvbdvBDyTOeI -DnbjjvbdLAkGmBxR -EObkKvbdLiBlRYAS -EPCjjvbdTukpKUBR -EObkKvbdhuZeWqtb -DoDLKvbdZyEJmbkr -DnbjjvbdxrmiNSCH -EPCjjvbdKWVFdFHJ -EPCjjvbdRWmcblID -EPCkKvbdsQVoJcVf -EPCkKvbdGcjuibJj -DoCjjvbdJuteceHJ -DnbjjvbdLLAhWAJy -DncKjvbdULunaWOi -EOcLKvbdHlBznXQk -DoDKjvbdvBDxroEh -DoDKjvbdzaAPHGbM -DoDLKvbdUyITyjoO -DnbkKvbduaDxroFI -EObkKvbdAMhZSvzY -EObjjvbdDoDKkWbd -EObkKvbdGKdrbhNV -EPCkKvbdmgFXlnGy -EOcKjvbdzdzOzdzQ -EPCkKvbdKkBHvAJy -EOcKjvbdqAiFAWhE -DoCjjvbdQvmdClID -DncKjvbdMtsSKmAX -EObjjvbdziuPpETU -DoDKjvbddZyQYZQb -EPDLKvbdauBgXkTh -DnbkKvbdnCJvwnmu -DoCjjvbdxUmFQyMO -DncKjvbdXGYzUAPT -EPDLKvbdOAJTUKSA -DncKjvbddZyPwxqC -EOcKjvbdqlzKYlIJ -DnbjjvbdkVvnDaww -DnbjjvbdZdxGzhIb -DnbkKvbdDwxLtTsl -EObkKvbdGKdrcHmV -DncKjvbdTAFJHbOd -DoDKjvbdEObkKvcE -DnbkKvbdaNLCSuNH -DoDLKvbdDxYLtTtM -EObjjvbdVZIUZjnn -DoCkKvbdNsUVfduQ -EOcLKvbdGGKRmhtR -EPDKjvbdbKlFnmcA -DncKjvbdvvlAvBWV -DoCjjvbdliEUQtrB -DnbjjvbdjgfkfGNk -EPDKjvbdlYsSTYft -DoDLKvbdbKlGOnDA -EPDKjvbdjAPfaPfj -DnbkKvbdzGyMAMeX -DoCjjvbdZnmhddzK -EPCkKvbdIMBzmwQk -EObkKvbdjEkHVPAO -EPCkKvbdQccBPpdS -EPCjjvbdhgKCxvJu -DncLKvbdVgxVxHYz -EOcKjvbdxVNFQxkn -DoDKjvbdbLMGPNcA -DncLKvbdGckWJajK -DnbkKvbdrMyiyLgi -EOcLKvbdKefICApu -DoCjjvbdqFdEtWBI -EPCkKvbdYSlBNUPY -DoCjjvbdIwsbILpp -EPCjjvbdmgFYMnHZ -EObjjvbdQvmccMID -DncLKvbdURQntthN -EOcLKvbddxZtUSFz -EPCkKvbdhtzFWqtb -EOcKjvbdVBCRSpqy -DncKjvbdtbbtvvOo -EPCkKvbdczZQYZQb -DnbjjvbdQwODcLgc -EPDLKvbdtunXipsA -DncLKvbdBhjajhej -DoDKjvbdNrtVfduQ -EOcLKvbdKWUfDdfi -EObjjvbdpstHRrLU -DnbjjvbdznpRFClY -EPCjjvbdfNFvgMik -DoCjjvbdUsltGLvK -DnbjjvbdlqyVZsDi -DoCkKvbdNPwqWOHT -EOcLKvbdakLeoNcA -DoDKjvbdsCGNMGkZ -EPDKjvbdaRfDHsfL -DoDKjvbdZtIhyDrn -EPDLKvbdOStVgFUp -EPCkKvbdeATplxKG -DncLKvbdySmhlrBg -DoDKjvbdnCKWwoOV -DnbjjvbdDncKjvcE -EOcLKvbdwzIGGXdr -EObjjvbdmIdTqVSB -DnbjjvbdUGznLwVe -DncLKvbdTkvOaWPJ -DncKjvbdyOSgwsIc -DncKjvbdjmCLzFGo -DoDLKvbdpssfqqkU -EPDKjvbdmtuZjirG -EOcKjvbdOFEThhkE -DoDKjvbdIMBznWqL -EPCkKvbdJvVFcdfi -EPDKjvbdnBivxOmu -EObkKvbdTvLojTaR -DoCkKvbdMRwNZtpz -EObjjvbdEARhlzXX -DnbjjvbdcScLTcjB -DncKjvbdxmrhXrhc -DoDKjvbdEvZQQNKF -DncLKvbdGLErcHmV -DoDLKvbdFkFTChMu -DoCkKvbdOFETiIkE -EPDKjvbdnVUzLKRf -EPDKjvbdmuUzKjSG -EPCjjvbdwuNFQxkn -DncLKvbdeATpmXjG -EObjjvbdxUmEpxkn -EPDKjvbdcSbkTcjB -EPCjjvbdmbKXXoNu -EPDKjvbdSQUHKFdX -DoDKjvbdCTAbsewS -EOcLKvbdVwJYVdFH -DoDKjvbdZtIiYcsO -EPDKjvbdhkeENtcZ -EObkKvbdGBOpyJzm -EPCkKvbdRMxCYmtz -DoCjjvbdzjVPocsU -DoDLKvbdrDdiPnWB -EPCjjvbdFjdsDIMu -DoDLKvbdSLZGUgLT -EPDLKvbdKefHaaQu -DoDKjvbdKCibpicY -EOcLKvbdijGIJmYS -EObjjvbdelfWgNKL -DnbkKvbdbhmKKfWx -DoDKjvbdSQUHKGEX -EPCkKvbdnGdxMmgZ -DncLKvbdJJdAKPgE -EPDLKvbdmRyUyrdJ -EOcLKvbdhzUfLqOG -DoDKjvbdLAjgMaxR -DoDKjvbdRosfjGEX -EObkKvbdpssfqqjt -DnbkKvbdjAQHAofj -DncLKvbdidkHUoAO -DoCkKvbdCIjbLIej -DncLKvbdelfWfmKL -DoDLKvbdxUleQxkn -EPDLKvbdEvZQPljF -DncLKvbdJbjDQjCx -DncLKvbdyOTIXriD -DoDKjvbdTulPjUAq -DnbjjvbdJSyAsNYM -EOcLKvbdbBVeGQQX -EPCjjvbdbKkenmcA -EPCjjvbdiGjDZWJu -DncLKvbdcSbjsdJa -EObkKvbdZtJIyDsO -DoDLKvbdrafMkgLZ -DoCjjvbdiMFDmuDZ -DnbkKvbdnUtyjirG -EPDKjvbdfNFvflik -DoDLKvbdrWokcJZR -DncKjvbdWWhxWDdg -EPDLKvbdNeDtJJKd -EOcLKvbdqlzKYkhJ -DncKjvbdSQUHKGDw -DoCkKvbdkHflFfOL -EPCkKvbdRXNdDMID -DncLKvbdSLZFtfkT -EOcLKvbdZQldiMeR -DnbjjvbdSBdElJYk -DncLKvbdwWlBVaWV -DoCjjvbdhzUfLqOG -DoDLKvbdmJEUQuSB -DnbjjvbdULvPBVoJ -EPDLKvbdYkrDtOMN -EPDKjvbdHEKujBij -EObjjvbdJuuGDdfi -EObjjvbdzaAOgGbM -DncLKvbdkClLRHUg -EObkKvbdYTMAmToY -EObjjvbdxVMeQyLn -DoDKjvbdrEFJQNua -DncKjvbdYSlBNTnx -DnbjjvbdrSUkOLAm -EOcLKvbdrylQTBIO -DnbjjvbdrouoKDVf -DoDLKvbdwWkaVaVu -DoCkKvbdZQmFIleR -EPCjjvbdiLeENtby -DoCjjvbdrDeJQNua -EObjjvbdIGfzYxXg -DoCkKvbdySmiMqag -EOcKjvbdbVBgYLTh -DoDKjvbdLFehCApu -EPCkKvbdCDpAvJmG -EObkKvbdZLrDtOLm -EPCkKvbdZnnJEdyj -EPCjjvbdZjSgpGbG -EOcKjvbdWSOYBdkc -EPDKjvbdwtleQyLn -DnbkKvbdmJDtQuSB -EObkKvbdkWXODbXw -DncKjvbdezuyEiTw -EObjjvbdnBjWwnmu -EPDKjvbdZxdJmcMS -EPDKjvbdrbGNMHLZ -EObkKvbdEYXlTssl -DnbjjvbdyTOJNRag -DnbkKvbdGZVVAdYC -EPCjjvbdTYLMNzkY -DncLKvbdJcJcRKDY -EOcLKvbdYpmEhldq -DoCkKvbdjKFgjNYS -EPDLKvbdJbibqKCx -EPCjjvbdyTNiNSCH -DoDLKvbdGGKRmhsq -EPDLKvbdLAkGmCYR -EPDLKvbdCEPaWKMf -DoCkKvbdZsiIyDsO -EPCjjvbdjbkkRGuH -DnbkKvbdqYoHgREY -DoDLKvbdZMRctNkm -EObjjvbdDjIJvYKA -DncKjvbdVqnXbEkc -EPCkKvbdiHKCyViu -EOcKjvbdkHflGFmk -DoDKjvbdOFDsiIjd -EOcLKvbdVrOYCEkc -EPCjjvbdhtydvrUb -DoDLKvbdrNZjYlHi -EPDKjvbdVwIxWDeH -EObkKvbdhyuFlRNf -EPDLKvbdSKyFuHKs -DoCkKvbdBhjajiFj -DoDKjvbdhanbeWpq -DncKjvbdGGJqnJTq -EPDKjvbdZtJIyETO -EOcLKvbdANIZSvzY -DnbkKvbdptUHSSLU -DoDLKvbdRDcBPpdS -DoDKjvbdBcpAujNG -DnbjjvbdaaVdeopX -DnbjjvbdhtydvrUb -DoCkKvbdkWXNcaxX -DncLKvbdrNZjYkgi -EPCjjvbdBiKajiGK -EObkKvbdwkWcgzzG -EPCkKvbdRDcApQcr -DncLKvbdfekzNgHA -DoDKjvbdiBoCdwRR -EOcLKvbdIBlZdzAD -DnbkKvbdZLqcsnMN -DoDKjvbdatbGwkUI -EObjjvbdmgFXlmfy -EPDLKvbdxUmEqYkn -EPDLKvbdauBfxKsh -EObjjvbdsPvOjDVf -DnbkKvbdkVwNdBww -EPCkKvbdzaAPGfbM -EOcLKvbdRotGjGDw -EPCkKvbdqceJPmua -EPDLKvbdZyDinCkr -EObkKvbdCDoaWKMf -EOcKjvbdjmCLzEgP -EPDKjvbdHlBznXRL -DncKjvbdeOeTLTtS -EPCjjvbdGZUuBEXb -DnbkKvbdqTtHRqjt -EOcLKvbdFyUuAdXb -EPDLKvbdEARiMzWw -EOcKjvbdFeirNiUR -DoCkKvbdzjUoocsU -EOcLKvbdEztQdlCi -DncLKvbdKCjCpibx -EPCjjvbdxZhGFxFS -EObjjvbdwWkaWAvV -DnbkKvbdaaWFFoow -EOcKjvbdBsBDUGXS -EPDLKvbdmIdUQuRa -DncKjvbdVAbRTRRy -DoCkKvbdHffyxxYH -EObjjvbdDGkfHAzc -DoCkKvbdiCPDFXRR -EPCkKvbdVrNwbEkc -EPCkKvbdiGjDYvKV -DnbkKvbdIMBzmvpk -EPCkKvbdKxqJrztf -DncLKvbdmIctQuSB -EOcKjvbdaSFbhUGL -DoCjjvbdmbKWwnmu -DoCkKvbdiUyeWrVC -DncKjvbdGGKRmhsq -DoCjjvbdehLVqnQg -DncLKvbdTkunaVoJ -DnbjjvbdGZUtaDxC -EPCjjvbdtSrSyZeD -DoDLKvbdjbkkQfuH -EOcLKvbdOFDtJJLE -DnbjjvbdBdQAvJlf -DoCkKvbduDDVWvPP -EOcKjvbdZtJIyDsO -DncLKvbdQccBPpdS -DncLKvbdiUzEvquC -EPCjjvbdvvkaWAuu -DoDLKvbdZoOIeEzK -DnbkKvbdkCkkRGuH -EOcKjvbdRkZGVHLT -EObkKvbdtcCuXVno -EPCjjvbdMpYRVnGs -DoDKjvbdFfJrNiTq -DnbkKvbdZnmiFFZj -EPDLKvbdbhmKKfWx -DoDLKvbdDjHivXjA -DoDLKvbdiLeDnVDZ -EOcLKvbdUQqOtthN -EPDKjvbdZHXEAOri -EObkKvbdvAdYrndh -EObkKvbdQlwaxnUz -DoCjjvbdQwOEDLhD -EPDLKvbdqrVKnLBN -EObjjvbdwtmFQxkn -EPDLKvbdTfznMWvF -DnbkKvbdaMjasVNH -EPCjjvbdcyyQXxpb -DncKjvbdMfcQMpUk -DnbjjvbdZnmheEzK -DncLKvbdbrbkUDia -DncLKvbdiCOcFXRR -DoCjjvbdZxcimblS -EPDLKvbdRkYfVHKs -DncKjvbdDoDKjvbd -EOcKjvbdGAnpxizm -EOcKjvbdYpldhldq -DnbkKvbdQwOEDMID -DnbjjvbdcyxoxYpb -DoCjjvbdakMGOnDA -EPCjjvbdLAkGlawq -DncKjvbdJJdAKPfd -EOcLKvbdxrnImSBg -DoDLKvbdNddUJIjd -DncLKvbdfIKvRmpg -DoCjjvbdiZuGLqOG -EOcLKvbdeAURMwif -DncLKvbdiCPCeWpq -DoCjjvbdGcjvKBij -EPDKjvbdRDcBQQdS -EPCjjvbdUtMtGLvK -EPDKjvbdyXhjBoyk -DoDKjvbdqZOgfpcx -EObjjvbdYTMAmUPY -DoDLKvbdiCObeXQq -DncKjvbdmJDtRUqa -EObkKvbdSCEElIyL -EObkKvbdNGbpMouL -DoCkKvbdEzsqElCi -EObjjvbdOStWHFVQ -EPCjjvbdjmBlZdfo -EPDKjvbdiUyeWqtb -DnbjjvbdYSkaNUPY -DoCkKvbdTAEhhCPE -DoCjjvbdmttyjjSG -EOcKjvbdrMyjZMIJ -EPDKjvbdUsmTelVj -EPCkKvbdNsTugFUp -DnbkKvbdWRnYBeMD -DncLKvbdHgGzZXxH -EPDLKvbdZLrDsmlN -DncLKvbdcSbkUDjB -EObkKvbdziuPpDrt -DoCjjvbdZyEJmblS -EObkKvbdjggMFenL -DnbkKvbdmfeXmNfy -EObkKvbdiBncFXRR -EPDKjvbdADSXiyiQ -EObjjvbdLFfHbApu -EOcLKvbdRMwbZOUz -EPCkKvbdFVxoomJe -EOcLKvbdZnmiEdyj -DncLKvbdULunaVoJ -DncLKvbddndsKtTr -EPDKjvbdEztQeMDJ -EObkKvbdcScKscjB -EOcKjvbdFkErbglu -DoCkKvbdsBfMlGkZ -EPDLKvbdCSaCsfWr -EPCjjvbdVAapsRSZ -EOcLKvbdgFkzNfgA -EPDLKvbdjhHLefNk -EObjjvbdyNsIXsIc -DoCjjvbdqcdiPmvB -EOcKjvbdeXyssrFz -DnbjjvbdEOcKjwCd -DoDLKvbdGKdrbgmV -DncLKvbdKQzEoFnF -DoCkKvbdqvpMDJZR -EObkKvbdZyEKODMS -DncKjvbdBhjbKiFj -DncKjvbdfHkVrNqH -DncLKvbdeXyssrFz -EObjjvbdxmsHwriD -EPDKjvbdRyigsCvA -DoCkKvbdZoNiEeZj -EPCkKvbdhzUfLpnG -DncKjvbdVUNUFkuj -EPDKjvbdRXNdDMID -EObkKvbdlBMnmALA -EPDKjvbdffMZnHHA -EPCjjvbdEARhlyvw -EOcKjvbdVTltGLvK -EOcKjvbdJqZdoFme -EObkKvbdyOTHwsIc -DoDLKvbdCfkegAzc -DnbkKvbdZMRdTmkm -DnbkKvbdhkeEOUcZ -DoDKjvbdZnnIeEyj -DnbjjvbdrafNMGkZ -DoDLKvbdZtJIyESn -EOcLKvbdaRecITek -EPCjjvbdZoOJEdyj -DoDLKvbdxsNhlrBg -EPCjjvbdZxdKNcMS -DoCjjvbdCWzdJEov -EObkKvbdTppnttgm -DnbkKvbdjmCLydfo -EObkKvbdBsAbsewS -EObjjvbdjgflFemk -DnbjjvbdpstGrSKt -EOcLKvbdOTTvHFUp -DoCkKvbdczYowyRC -EObkKvbdTvMPjUAq -EOcKjvbdezvYeJUX -EPCkKvbdzHYlANEw -EPCkKvbdqcdiQOVa -DoCkKvbdsrrSxyeD -EObkKvbdOTUWGeUp -DoDKjvbdbUbHYLTh -DoCkKvbdHakydzAD -DoDKjvbddjJrWUzn -EPDKjvbdmaiwYPOV -DoCjjvbdtbcUwVno -EPDLKvbdrMyjYkgi -DoCjjvbdUQpoUtgm -DncKjvbdddoSBwDK -EPCkKvbdatbGwkTh -DncKjvbdmbJvxPNu -DnbjjvbdwzHeewdr -DncLKvbdzitpPcrt -EOcLKvbdrMyjYkgi -EOcLKvbdrEFIomvB -DoDLKvbdiifIJlxS -EOcLKvbdtvOYKQsA -DoCkKvbdxsNhlqag -DnbjjvbdyTOIlqag -DncLKvbdIGgZyYXg -EOcKjvbdUsmUGMWK -EObkKvbdhzUfMQnG -EPDLKvbdZxdJnCkr -DncKjvbdKWUeceGi -EOcLKvbdmbJvwnnV -DoDLKvbdDncKjvbd -EPCkKvbdZoNheEyj -DncLKvbdVqnXadlD -DncLKvbdtunXipsA -DncLKvbdjAPgBPfj -DoCkKvbdyqPNJKXA -DncKjvbdrpWPJbuf -EOcKjvbdqvpMDJYq -DnbjjvbdcTDLUDia -DnbkKvbdiGjCxvKV -EPDKjvbdauBfxKtI -DoCkKvbdLFfHbApu -DoDLKvbdHffyyXwg -EOcKjvbdIxUCHkqQ -DoDKjvbdzQoMiJwA -DoDKjvbdyYIjBoyk -EObkKvbdxnSgwriD -EObkKvbdIMBznWpk -EPDKjvbdYlSDtOMN -DoDKjvbdijGHjMxS -EOcKjvbdYkqcsnMN -DoCjjvbdmaiwYOmu -EPDKjvbdHELWKBjK -DoCjjvbdwtmFRYlO -EOcLKvbdFeiqnJTq -EPDKjvbdiBncEvqR -DoCkKvbdJXsbILpp -EObjjvbdULunaVni -DncKjvbdDwxLstUM -DoDKjvbdrWpMChyR -EObkKvbdYzcFqivZ -DncKjvbdEzspdlDJ -EPDKjvbdfMfXGmKL -DoCkKvbdCTAbtGWr -DoDLKvbdRkZGUgKs -EPCkKvbdFWZQQMie -DnbjjvbdxVNEqYkn -DoCjjvbdeFPRbWbj -EPCkKvbdZshhyESn -EObjjvbdqrVKnLAm -EPCjjvbdptUGqqjt -EOcLKvbdrEEhpOVa -DncKjvbdzQoNIjXA -DncLKvbdmgFXlnGy -DoDKjvbdZjShQHBf -DnbjjvbdjKGHjNXr -DoDLKvbdqFcdsvAh -EPCkKvbdOEdUIiLE -EPDLKvbdNeEUJJKd -EPCjjvbdzHZMANEw -DnbkKvbdqlzJyMIJ -DnbjjvbdelfXHMjL -EPCkKvbdANHyTWzY -DnbjjvbdREDBPpcr -DncLKvbdQmYCZOUz -EOcKjvbduoTzpjoU -DoCjjvbdqrUjmkBN -DnbjjvbdyfxlANFX -EOcLKvbdJmADygUa -EPDLKvbdyNrhYTIc -DoCjjvbdCTAbtFwS -DncLKvbdSwkLmzkY -DnbjjvbdjhHMFfNk -DoCkKvbdZeXfzhIb -DnbjjvbdbrbjtEJa -DoCkKvbdxrmhmRbH -DoDLKvbdrXQLbhxq -EObjjvbdTulQKUBR -EPCkKvbdMpYQumgT -DncKjvbderBWzlDP -DoCjjvbdiGjCxvJu -DoCjjvbdlZSqsZGt -EOcLKvbdZisIPfaf -DnbkKvbdHEKvKBij -DncLKvbdjSziSjiz -EPDKjvbdCEQBWJmG -EObkKvbdGGKRmiUR -EPDKjvbdMuTRkNAX -DnbjjvbdrXQLbiYq -EPCjjvbdOTUWGduQ -EPCjjvbdnBjXXoNu -DoDLKvbdcarmSAUN -DoCjjvbdNPwqWOGs -EObkKvbdUslsekvK -DnbjjvbdzaAPGfbM -DoCkKvbdGdLVjCJj -DoDLKvbdRjyFtfkT -DoDLKvbdGLFTDHlu -DnbkKvbdGFirOJUR -EPDLKvbddoFTLUUS -EObkKvbdkxrrTZGt -DncKjvbdxrnJMqag -EOcLKvbdCDpBWJmG -DoCjjvbdlqyUysDi -EPDKjvbdTfzmlXVe -DncKjvbdEuxpQMie -EOcKjvbdbLLfPNcA -DncKjvbdVgxWXgYz -DoDKjvbdrbFmLgKy -DoCjjvbdzaAPGfbM -DncLKvbdYSlAlsoY -DoDLKvbdZyEJnClS -EPDLKvbdEvYopMjF -DncKjvbdmtuZjiqf -DoCjjvbdCJKbLIfK -EOcLKvbdcIljLFvx -EObkKvbdrJAKFNPF -DoDKjvbdBiKbKhfK -EPDKjvbdWIYWYGxz -DoCkKvbdjAQGaQHK -DnbjjvbdjblLQftg -DncLKvbdbhlikGXY -EPDKjvbdZLrDsmkm -DoDLKvbdVTlsfMWK -DoCjjvbdliDsptqa -DnbkKvbdjuvmcbXw -DoCjjvbdbVCHXjtI -DoCkKvbdQvmdClID -DnbjjvbdLAkHNCXq -EPDKjvbdZtIhyETO -DnbkKvbdYkqdTmlN -DoDKjvbdMtrrKmAX -DncLKvbdJXtCIMQp -EPCkKvbdlhdTqUqa -EObjjvbdnHFYNNfy -EPDKjvbdxrmhlrBg -DncLKvbdiLeDmtcZ -DncKjvbdNrsufdtp -EObkKvbdlhcsptqa -EObjjvbdNeETiIkE -DnbkKvbdxsNhmRbH -DnbkKvbdADRxKZhp -DnbjjvbdTqROuUgm -EOcKjvbdpxoIGqDx -EOcLKvbdqBIeAWhE -DnbjjvbdCIkBjiFj -DncLKvbdTlWPBWPJ -DoCjjvbdEKHjVxKA -DnbkKvbdZRNFImEq -EObkKvbdJbicQjCx -DoDKjvbdNsTufeVQ -EObjjvbdDxYMUTsl -DoDLKvbdaSFcITfL -EPDKjvbdcTDLTcia -DoCkKvbdlhdTpuRa -EObjjvbdCJKbKiFj -DncKjvbdqAiFAWhE -EPDKjvbdUslsfLuj -EObjjvbdWWiXuceH -EPCjjvbdOEcshiLE -EPDLKvbdEJhJuxKA -DoCkKvbdKyRKSzuG -DncKjvbdHffzZXxH -EOcLKvbdSLZGUfkT -EObkKvbdHgHZxwxH -DnbkKvbdcSbjtEJa -EPDKjvbdZGwEAPTJ -DoDLKvbdeAURNXif -EPDLKvbdMpYQunGs -EObkKvbdNeDshiKd -DoDLKvbdzoQQdbkx -EPDKjvbdWHxWXfxz -EPCjjvbdCEPaVjNG -DoCjjvbdbhlikFvx -EOcLKvbdBvzdIdpW -DoCkKvbdNPwqWNfs -EPCjjvbdbhlijfWx -DncKjvbdqwQLbiZR -EObjjvbdkClLRGuH -DncKjvbdNHDQNQVL -DncKjvbdhkdcmuDZ -EOcKjvbdKWVFdFHJ -EPDLKvbdYTMBMtOx -EObkKvbdSKxfVGjs -DncKjvbdZoOJEdzK -EObjjvbdMpXqVmgT -EPDKjvbdhaoDFXRR -EPCjjvbdrpWPJcVf -EOcKjvbdczYpYZRC -DoDLKvbdLLAhWAJy -DoDKjvbdEObkLXDE -EPDKjvbdnVUykKRf -DnbkKvbdBvzdIdov -EOcKjvbdGFirOJUR -DoCjjvbdGGJrNiTq -EPDKjvbdqAheAWgd -DncKjvbdxmsIXriD -EObkKvbdVAbQsRRy -EPDKjvbdRXODbkhD -EObjjvbdVZHtZjoO -EOcKjvbdffMZmfgA -EOcLKvbdbiMjLGXY -DoDKjvbdUQpoVUhN -EPCkKvbdhfjCxuiu -DoCkKvbdziuPocsU -EObjjvbdBhkBkJFj -DnbjjvbdeAURNXif -DncKjvbdQlxByOUz -EPDLKvbdRbEEkhxk -EPCjjvbdrbFlkgKy -DoCjjvbdaSFbhUGL -EOcKjvbdsCGMkfkZ -DoCkKvbdJbicRJcY -DnbkKvbdqlzKYlHi -DoCjjvbdZyDimblS -EOcLKvbdsrqsZZdc -DoDKjvbdjggMGGNk -DnbkKvbdADSXiyiQ -DoCkKvbdehKurORH -EOcLKvbdrylPsAgn -EPCjjvbdRWmdClID -EPCjjvbdbsCjsdKB -EObjjvbdUQpoVVHm -DnbkKvbdiCObeXQq -DncLKvbdUQpoVUhN -DoCkKvbdKCicRKDY -DncKjvbdjlakzFGo -DnbkKvbdMgDQMpVL -DoDLKvbdWSNxBeMD -DnbkKvbdvBEZTOdh -EPCjjvbdsQWPKCuf -EObjjvbdZeYGzghb -DnbkKvbdxsNhmSCH -EPDLKvbdkySrTZGt -EObkKvbdrDdiQNvB -DncLKvbdHDjuiajK -DoCjjvbdURROtuIN -DncKjvbdKyRJrztf -EObjjvbdIGfyyYXg -DncLKvbdXsMBMtPY -EPCkKvbdaaVdfPpX -DncKjvbdiHJbyWJu -EOcKjvbdSKxfVGjs -DoDKjvbdxZgfFwdr -DnbkKvbdRNYCZNtz -EPCkKvbdCDoaWKNG -DoDKjvbdDjHjWYKA -EPDKjvbdyNsHwsIc -DoDKjvbdUtNTfLuj -DoDLKvbdGGKRnJTq -EPCkKvbdsBemMGjy -EPDKjvbdSQUHKFcw -DnbjjvbdkClKpfuH -EObjjvbdRyjHrcWA -EOcLKvbdSPsfjGEX -DoCjjvbdGckWKBij -EPCkKvbdGdKujBij -DnbjjvbdcJMijewY -EPDKjvbdkIGkefOL -EPCkKvbdrSVLNkBN -DnbkKvbdrpWPJbvG -DoDLKvbdZirgpHBf -EPCkKvbdHDjujBij -EPCkKvbdvBDySoEh -DoDLKvbdePEsKssr -DoDLKvbdZRMdhldq -EObjjvbdUQqPUtgm -DoDLKvbdMSXNZtpz -EObjjvbdVYhTzKnn -EOcKjvbdrNZixlIJ -DoDLKvbdTpqPVVIN -DnbkKvbdkCkjqHVH -DnbkKvbdkWWmcaxX -EOcLKvbdJSyBSlwl -EObkKvbdmRxtzTEJ -DncKjvbdptTgRqjt -EOcLKvbdqYoHfqEY -DoDKjvbdGZUtaDxC -EOcKjvbdKQydoGNe -EPDLKvbdssSTZZeD -EObjjvbdhkddOUcZ -DoDKjvbdGdKvJbKK -EOcKjvbdULvPAuoJ -DoCkKvbdrEFJPnWB -DnbjjvbdfNGWfmJk -EPCkKvbdkWXODaww -EOcKjvbdMtrrKmAX -DnbjjvbdEuyPpMie -EObjjvbdrSVKmkAm -EPDLKvbdhanbdvqR -DoCkKvbdkWWmdBww -DnbjjvbdxUleQyLn -EOcLKvbdpyPHfpdY -DncKjvbdpfDeTvBI -DoCkKvbdnVVZjirG -DnbkKvbdzjVPocsU -EPDLKvbdmfdwlmfy -DnbkKvbdSKyFuGjs -EObkKvbdVAaprpqy -EPCjjvbdUaBqTRRy -EObkKvbdZoNhddzK -DncKjvbdrNZiyLhJ -DncKjvbdaMkBruNH -DoDKjvbdZyDjNcMS -EPCjjvbdZjTIQHCG -EObkKvbdjJegilwr -EPDKjvbdHffzYxYH -EPDKjvbdaSGChTfL -DoDLKvbdcJMjLGWx -EOcLKvbdtlXvaTaX -DoCjjvbdGYuVAcxC -EOcLKvbdUsltGLvK -EPDLKvbdRNXayOUz -DoDLKvbdRadFLiYk -EOcKjvbdCTAbsfXS -EPCjjvbdGZVVAdYC -EPDLKvbdypnliJwA -EPCjjvbdSBdFLhxk -EOcLKvbdGLFSbhNV -DncKjvbdTppnuUhN -EObkKvbdezvYdiTw -DoCkKvbdIsZBSlxM -DncLKvbdRNYBxmtz -EPCkKvbdeFOqawCj -DnbjjvbdtSrTYzEc -DncKjvbdkDLkQgUg -DnbjjvbdEARhlzXX -EOcKjvbdWRmxBeMD -DoDLKvbdzQnliKXA -EPDKjvbdpfDdtWAh -DncLKvbdMgCpMpVL -DnbkKvbdiZtfLpmf -EPDLKvbdzQoNJJwA -EPCkKvbdaNKasUmH -EPDLKvbdRbDeLhyL -DoDLKvbdKRZeOeme -EOcKjvbdZxdJmcMS -DncLKvbdeKKSVtzn -EPDLKvbdRjxeuHLT -EObkKvbdNGcPmPtk -DoCkKvbdtcDVWvPP -EPCjjvbdcTDKscjB -DoDLKvbdbrcLTcia -EObjjvbdvlvAMcdm -EObjjvbdFxuVBDwb -EPCjjvbdhkdcmtby -EOcKjvbdRotHKFcw -DncLKvbdelfWgNKL -EObkKvbduCbuXVno -EPDKjvbdEYXlUUUM -EOcKjvbdbUbHXjsh -EOcLKvbdmgEwmOHZ -DoCjjvbdEXxLsssl -EPDLKvbdZLqdTmlN -EOcLKvbdbsCkUEJa -EOcKjvbdqvpLbhxq -EOcKjvbdfIKvRmpg -DncLKvbdGBOpxizm -DoDLKvbdnBiwXnmu -DoCjjvbdKWVFceGi -EOcLKvbdRbEEkiZL -EObjjvbdffMZmgHA -DoCjjvbdUMWPBWPJ -EObkKvbdkClKpftg -DoDLKvbdBhkBkIej -DoDKjvbdhgJbyWJu -DoCjjvbdEASIlzXX -EPDKjvbdGZUtaDxC -DnbjjvbdlYsRryHU -EOcKjvbdhgKCyWJu -EPCkKvbdsQWOibuf -DoCjjvbdRMwbYmtz -DoDKjvbdZxdJnClS -EPCjjvbdJTZBTNYM -DnbjjvbdiLeEOUby -EOcLKvbdjEjgUoAO -EPCkKvbdzitopDrt -EPCjjvbdtcCuWvPP -DncKjvbdZMRdUNlN -DoDLKvbddZxoxZRC -DoDKjvbdFVxoomKF -DoCkKvbdSLYeuGkT -DncLKvbdYSlBNTnx -EObkKvbdeuzwoizs -EPDKjvbdUQpoUuIN -DoDKjvbdmpZxujyC -EPCjjvbdDGlFgAzc -EPCjjvbdkCkkRGuH -DnbkKvbdvlvAMdFN -DoDLKvbdatbHXkUI -EPCjjvbdFWYoolie -DnbjjvbdrEFJPnWB -EObkKvbdpyOggQcx -EOcKjvbdqwQMChxq -EOcKjvbdqrVLNkAm -EOcKjvbderBWzlCo -DoDLKvbdRWmdDMHc -EOcLKvbdZoNhdeZj -DnbkKvbdunszpkPU -EPDKjvbdGAnpxizm -DoCkKvbdKCjCqKCx -EOcKjvbdZshhyDrn -DoDKjvbdddoSBvcK -DncKjvbdcScKtEJa -EOcLKvbdZjShQGbG -DncLKvbdDncKkXDE -EPDLKvbdrzMQTBHn -EPDLKvbdIxUBglRQ -EPDKjvbdcyxpXxpb -EObkKvbdMSXMytpz -EObkKvbdijGIKMwr -EObkKvbdzdzOzdyp -DnbjjvbdeATplwjG -DnbkKvbdcIlikFwY -DoDLKvbdsPunicVf -EPDKjvbdmozYvLZC -DoCkKvbdkyTSSxgU -DncLKvbdRWnDcLhD -DncKjvbdHELWJaij -DncKjvbdZQmFIleR -EOcKjvbdiCOcEvpq -EOcKjvbdbrbkUEKB -EOcLKvbdOFEThhjd -EObkKvbdbBVdepPw -EObkKvbdUxhTzKnn -EObkKvbdzoPpdblY -EOcLKvbdrbFllHLZ -DoDKjvbdjggMGGOL -DncLKvbdqceJQNua -DoDKjvbdiHJbxvJu -DoDLKvbdySnImSBg -EPCkKvbdtTRrxzFD -EOcLKvbdkVvnEBxX -DnbjjvbdtcCtvvOo -EPCkKvbdyzdmrHiI -DoDKjvbdFjdrbhMu -DoDLKvbdZyEKODLr -DoDKjvbdURQnuVHm -EPCkKvbdZyDimcMS -EOcLKvbdNQXpunHT -DnbjjvbdQlxCYmtz -DnbjjvbdCDoaVimG -EObjjvbdsPvOibvG -DnbjjvbdgGLynGgA -DncLKvbdCDoaWJmG -EObkKvbdnCKXXnnV -EOcLKvbdUxgtZkPO -DnbkKvbdiMFDmuDZ -DncKjvbdiGicZWKV -DoDKjvbdcScKtEJa -DoDKjvbdpssgRqkU -DncKjvbdsBfNLgKy -DoDLKvbdGYttaDwb -DncKjvbdjvWnDaxX -EPCjjvbdhgJcYuiu -DnbjjvbdxUldpxlO -DoDKjvbdUaCRSqSZ -DnbkKvbdNwoVzdNt -DoCkKvbdZnnIeEzK -EPDKjvbdNeEUJIkE -DnbjjvbdJbjDQjDY -EPDLKvbdKVuFceGi -EPCkKvbdKkBIWAJy -EObjjvbdrafMlHLZ -EOcLKvbdZLqctNkm -EObjjvbdMgComPtk -DncKjvbdjhHMGGOL -DnbkKvbdJYUCIMQp -DoCjjvbdhlEcnVCy -DoDLKvbdxsOJNSBg -EOcLKvbdRMxBxmtz -EOcLKvbdHDjujCJj -EObjjvbdZRMdhmFR -EPDLKvbdUQpoUthN -EPCkKvbdvlvANEFN -EObkKvbdSCEEkhxk -EPCjjvbdLBKfmCXq -EPDKjvbdOStVfduQ -EPCjjvbdGcjvJbKK -DnbjjvbdVBBprpqy -DoCjjvbdirziTLJz -DncLKvbdFWYpQNKF -DoDLKvbdjKGHjNYS -DncKjvbdZnmiEdzK -DoDKjvbdySmiMrBg -DncLKvbdeAURNYKG -EPDLKvbdemGWflik -DoDKjvbdaMkBrtmH -DoDKjvbdIxUBglRQ -DoDKjvbdOEcshhjd -EPCjjvbdpxnhGqDx -DncKjvbdYSlBNToY -DnbjjvbdGGKSOJUR -EOcLKvbdZjTHpGbG -EPCjjvbdIHGzZYXg -DncKjvbddndsLTsr -DnbjjvbdqAheAXIE -EOcKjvbdVhXvXfxz -DncKjvbdFyVVAdYC -DnbjjvbdJvVFceGi -EPCkKvbdoznDjwoA -EPDKjvbdvPTzqLPU -EObjjvbdiifIKMwr -EOcLKvbdlZTSSxgU -EObjjvbdQvnECkgc -DncLKvbdjgfkfGNk -DnbkKvbdCDoaWJmG -DnbkKvbdxnTHwriD -DncKjvbdoAKzshDn -DoDKjvbdvAdZSndh -DnbjjvbdRpTgKFcw -EOcLKvbdiiegilwr -EOcKjvbdGdLVjBjK -EObkKvbdGFjRmhtR -EPCjjvbdZsiJYdTO -EPCjjvbdJJdAKPfd -EPDLKvbdKfGHbBRV -DncLKvbdjhHMFenL -EObkKvbdbLMFnnDA -DoCjjvbdUWMPisaR -DnbkKvbdZjTHpHCG -EObkKvbdbsCkTcjB -EPCkKvbdSLYfUfkT -DoDKjvbdZeYGzhIb -DncKjvbdrovPJcVf -EPCjjvbdePFSjtTr -DncKjvbdJbibqJbx -EPDLKvbdDxYMUUTl -DnbkKvbdZHXEAPSi -DncKjvbdVTmUFlVj -EPDKjvbdzoQREcLx -EPDKjvbdKfFhCAqV -DoDKjvbduDDUwVoP -DoDKjvbdgFlZmfgA -EObjjvbdTAEiHbOd -DoCkKvbdMowqVmgT -DncKjvbduMXwBTaX -DncKjvbdeYZssrFz -DncLKvbdmfdxNNgZ -DncLKvbdxLXDgzzG -DoCjjvbdNsTvGduQ -EPDLKvbdTpqOtuHm -EObkKvbdZMRctOMN -EPCjjvbdHEKuibJj -EPCjjvbdBiKbLJGK -DoCjjvbdUtNUFkvK -EOcKjvbdVTltFkuj -DnbjjvbdczYpXxqC -EPDLKvbduWNxKQsA -EOcKjvbddZyQYYqC -DnbkKvbdyfyMAMdw -DncLKvbdDihKWXjA -EPCjjvbdoAKztIDn -DoCjjvbdcTDLUDjB -EPDKjvbdJcJcRKCx -DncKjvbdIxTahLqQ -DoDLKvbdTqROttgm -DoDKjvbdjblLQgUg -EOcLKvbdTppnuUhN -EPCjjvbdrMyjZLgi -EObjjvbdypnmIjXA -DoCkKvbdczYoxZRC -EObkKvbdFjeTDHmV -EPCjjvbdZxcimbkr -DoDKjvbdatbHXkUI -EPDKjvbdvmWAMdEm -DoCjjvbdqwQMCiYq -DoDKjvbduWNwjQsA -DncKjvbdACqwjZiQ -DoCjjvbdOTTvGduQ -EObkKvbdirzhsKiz -EObjjvbdOTTugFUp -EOcLKvbdKDJbqJcY -DoCjjvbdiUyeXRtb -EObjjvbdfMfXHNKL -EOcKjvbdjhHMFfNk -DncKjvbdRpUGjFcw -EPCjjvbdfILVqnRH -EOcKjvbdiHKCyWJu -DoDLKvbdnPzYvLYb -DnbkKvbdnGeYNOHZ -DoDKjvbdtvOXjQsA -EPCjjvbdmIctRVRa -EOcKjvbdpyOhGpcx -DnbkKvbdKQydoFnF -DoDKjvbdkVvnDaww -EObjjvbdbUbHXjsh -EOcKjvbdCJLCLIfK -EPDKjvbdZeYGzhJC -DncKjvbdcScLUDia -DoCkKvbdQmXbZOUz -EOcLKvbdRadFMIxk -DnbkKvbdziuPodSt -EOcKjvbdEXxMUUTl -DnbjjvbdegjvSOQg -EObkKvbdZtJJYdTO -EPDKjvbdVAbQsQrZ -DnbkKvbdkHflFfOL -EObkKvbdtcCuXWOo -DnbjjvbdcTDLUEJa -EPCjjvbdZjTIQHBf -EObjjvbdTAEhhCPE -EOcLKvbdbhlikFwY -DoDLKvbdEPDKkWbd -EOcKjvbdZtJJZESn -EPDKjvbdZMRdUNlN -EPCkKvbdhgJcZWJu -DncKjvbdUaBqSprZ -EOcLKvbdEJgiuxKA -EObjjvbdSPtHKFcw -DoCjjvbdFfKSOJUR -EObjjvbdVrOXaeMD -DoCjjvbdrXPkcIxq -DoDKjvbdZjTHofaf -EOcLKvbdVYgszLOn -DncKjvbdIwsagkpp -DncLKvbdTkvPBVni -EOcLKvbdUtNUFkuj -EObjjvbdZnmheEyj -EPDKjvbdyYIjBoyk -EPCkKvbdqlyiyMIJ -EPCjjvbdYzbeqjVy -EOcLKvbdUQqOuVIN -EObkKvbdZMSDtOMN -DncKjvbdVvhxWDdg -EOcLKvbdiZuFlRNf -EObjjvbdZtJJYcrn -EPCjjvbdmuUzKirG -DoDLKvbdVUMtGMVj -EPDLKvbdhWyAzzAJ -DoDLKvbdfIKvRmqH -DnbjjvbdqdFIpOVa -DnbkKvbdIwtCHkpp -EOcKjvbdeEnrBvcK -DnbkKvbdJuuFdFGi -DoDKjvbdeOeTKtUS -EObjjvbdKWUfDeGi -EPCjjvbdiHJbyViu -EOcKjvbdBraCsfWr -DoCjjvbdGYuVBEYC -DoCkKvbdnHEwmOHZ -EPDKjvbdZisIQGaf -EPCkKvbdmpZxvKyC -DoDLKvbdmSYuZrdJ -EObkKvbdKDJbqKCx -EOcLKvbdZsiJZETO -EPDKjvbdnCJvxOmu -DoCkKvbdjgflGGOL -DnbkKvbdRosfjFdX -EPCjjvbdRECaQQcr -DnbkKvbdNHComQVL -EPCjjvbdrJAKEmOe -DoDLKvbdqBJFAXIE -DncLKvbdGLFTDINV -EOcLKvbdhgJbxujV -DnbkKvbdjSzhsKiz -EOcKjvbdKWVGDdfi -DoDKjvbdZnnIeFZj -DnbjjvbdxxIiaoyk -EObkKvbdczYpYZQb -EPCjjvbdZxcjODMS -EObkKvbdiHJbxvKV -DoCjjvbdJzoexEAN -DoCjjvbdaRfChTek -DoDLKvbdxwhjCPyk -DoDLKvbdVqnYBeLc -DnbkKvbdRDcBPpdS -EObkKvbdYqNFImFR -EPDKjvbdsrrTYzFD -EOcKjvbdqcdhpOWB -EOcKjvbdaNLCTUmH -DoDKjvbdnPzYukZC -DncLKvbdKCjDRKCx -EObjjvbdFkEsDINV -EPDKjvbdMgDQMouL -DncLKvbdOXnuzdNt -EPCjjvbdpstGqrLU -EPCkKvbdRbDdkhyL -DnbkKvbdaogGdLzd -DncKjvbdjlbLydgP -DnbjjvbdUMVoAvPJ -EPCjjvbdJqZeOfOF -DoDLKvbdUsmTekvK -DoCjjvbdpyOgfpcx -DnbkKvbdJYUCIMRQ -DncLKvbdjJfHjMwr -DoCjjvbdRosgKGDw -DoCkKvbddZxpYYqC -DncKjvbdddnrBwCj -EPDKjvbdijGIJlxS -DoCjjvbdkWWnECYX -EObkKvbdqlzJxlIJ -EOcLKvbdzaAPHHBl -DoDKjvbdlZTSSyGt -DnbjjvbdatbHXkUI -EOcLKvbdNdcshiKd -DncKjvbdGdKujBjK -DnbjjvbdRWnDcMID -DoCjjvbdSxKlNzkY -EPDKjvbdHDkWJbJj -EPDLKvbdZxcjNcLr -EOcKjvbdLYqKSzuG -EPDLKvbdjuvmcaww -EPDKjvbdxmrhYTJD -EOcKjvbdZirhPfaf -DnbjjvbdfIKurNqH -EPCkKvbdYTLaNTnx -DoDLKvbddtAUASlv -EPCkKvbdZLrDtOLm -DnbjjvbdnGdxMnHZ -DoCjjvbdeFPSCXCj -DncLKvbdYORAYUvU -EPCjjvbdrXQMDJZR -EPCkKvbdRpTfjGDw -DoCjjvbdpssfrSKt -EPCkKvbdKWUedFHJ -DnbjjvbdVvhwvDdg -DncKjvbdLrWlzUpz -DncKjvbdwtmFQxkn -EObkKvbdmIdTqUqa -DnbkKvbdJutedFHJ -EOcKjvbdVZITykPO -DoDLKvbdhbPDFXQq -DnbjjvbdmuVZjirG -DncLKvbdieKgVPAO -DncKjvbdEuyPpNJe -DoDKjvbdiHJcYuiu -EPDKjvbdmgFYNNfy -DnbkKvbdOTUWGeUp -DoCjjvbdZRNFJNFR -EPDLKvbdYpmFJNEq -EObkKvbdRMxBxnUz -DncKjvbdNQYQvOHT -EOcLKvbdMoxRVnHT -DoDKjvbdpyOhGpcx -EObjjvbdRyjITDWA -EObjjvbdrykosAhO -EOcLKvbdhaoDFXRR -DoDLKvbdIryBSmYM -DnbjjvbdlZSrTYft -DncLKvbdegjurORH -EOcKjvbdJYUCHlRQ -EOcLKvbdREDApRES -EObjjvbdmgFYMnHZ -EPCkKvbdZyDimblS -DoCkKvbdiCPCdwQq -EObkKvbdbVBgYKtI -DoDLKvbdNddUJJLE -DoCjjvbdrpVnibuf -EPDLKvbdKaLGlbYR -DnbjjvbdTpqPVUhN -DoCjjvbdcyxoxYpb -EPDKjvbdhfibxvJu -EPCjjvbdJpydnfNe -DncLKvbduWOXipsA -DoDKjvbdrRtkNkAm -EObkKvbdNQXqVmgT -EObkKvbdCIkBkJFj -EPDLKvbdqUUHSRjt -EOcLKvbdeYZtTqez -EPCjjvbdqUUHRqkU -DncKjvbdkWXODaxX -EPCkKvbdaNKbTVNH -EPCjjvbdvAcxroEh -EOcKjvbdlZTSTZGt -EOcLKvbdLAkHNCYR -DoDLKvbdUtMselWK -EPCjjvbdnVUzKjRf -DoDLKvbdypoMiJwA -EObjjvbdKDKCqKDY -DoCjjvbdrWolDIxq -DoDKjvbdwyhFfXeS -EOcKjvbdnGeYMmgZ -DoDLKvbdREDAopcr -EPCjjvbdiUzFXRuC -DoDLKvbdZQldhmEq -EPCjjvbdtvNwipsA -EPDKjvbdbrcLUDia -DoDLKvbdegkVqnQg -DoCjjvbdznopdcMY -DoCjjvbdmfeXlmgZ -DncLKvbdXrlBMsnx -DoCjjvbdmgEwmOGy -DoCkKvbdjmCLydgP -DncLKvbdmJEUQuSB -DnbjjvbdRbDeLiYk -DnbkKvbdQdDBPqDr -EObkKvbdjKGHjMxS -DoCkKvbdyOTHxSiD -EPCjjvbdQwNdCkhD -EObjjvbdfNFwGljL -EObjjvbdVqmxCElD -EOcKjvbdeOeTKtTr -DoDKjvbdUaBqSpqy -DnbjjvbdmIdURUqa -DoCkKvbdUWMQJtBR -DnbjjvbdxnSgxSiD -DncKjvbdwXMBVaVu -DnbjjvbdvvkaVaWV -EObkKvbdmaiwXnmu -DoCjjvbdgQBzwEYI -EOcKjvbdFVxpPmJe -EObjjvbdKDJcQjCx -DoCkKvbdYlRdUOMN -EOcLKvbdZoOIddzK -DoCjjvbdffMZnHHA -DncKjvbdnQZxujxb -EPDLKvbdwXMBWBVu -DoCjjvbdLFfIBaQu -DncKjvbdGQASwHFy -DnbkKvbdauBfxKsh -EOcLKvbdraelkgKy -EObkKvbdnVUzLKSG -DoDKjvbdANHxrwZx -DncLKvbdqZPHfqEY -EObjjvbdvPTzpjoU -EObjjvbdrWpMDIyR -DnbkKvbdCDpBWKNG -DnbkKvbdyOSgwrhc -DnbkKvbdeKKSVtzn -DncKjvbdMowpumgT -EOcLKvbdOFDtIhjd -EPDKjvbdkDMLRGtg -EPDKjvbdiiehJlwr -EPDLKvbdBdQAvJlf -DoDLKvbdZyEKODMS -EObjjvbdJqZePFme -DnbkKvbdKxqKSztf -EObkKvbdmJEUQuSB -DnbkKvbdREDAopdS -EPDKjvbdwzHefYEr -EPDKjvbdnHExMnGy -EOcKjvbdmozZVjyC -EPDKjvbdZHWdAPTJ -DoDKjvbdjgfkfFnL -DncKjvbdczZPxYqC -DoDKjvbdEXwlUUTl -DncKjvbdhuZdvrVC -DnbkKvbdxKwDgzzG -EPCkKvbdsZlQSaIO -EOcKjvbdzRPMiKXA -DoDKjvbdqvolDIxq -DoDKjvbdQdCaPpcr -EPCjjvbdJmADyfuB -DnbjjvbdsCGNLgLZ -DoDKjvbdKfGICAqV -DoCkKvbdbiNJkGXY -DncKjvbdiGicYvKV -EPCjjvbdSxLLmzjx -DncKjvbdLAjflaxR -EPCkKvbdUyHsyjoO -DnbjjvbdcyxoxYqC -EObkKvbdxZgfGYFS -EPDLKvbdZoNiEeZj -DncLKvbdZtIhxcrn -EPDLKvbdIwtCILqQ -DncLKvbdQmXbYmtz -EOcLKvbdmuUzKiqf -EPDKjvbdsQVnibuf -EObjjvbdOSsugEtp -EOcLKvbdYlSETnLm -EObkKvbdUtNUGMWK -DoDLKvbdzeZnzeZp -DoDKjvbdqTtHRqkU -EObjjvbdmbJvxPNu -DoDLKvbdliDsqUqa -EPCjjvbdhanbdvpq -DoDKjvbdiifHilxS -DoDKjvbdmJDsptqa -DnbkKvbdDncKkWcE -EPCkKvbdaofgELzd -DncKjvbdijGIJmXr -EPCkKvbdRkYfUgLT -EObkKvbdHEKuibKK -DnbjjvbdVhXuwfxz -DoDLKvbdiMEcmuCy -DnbkKvbdJcJcQibx -DnbkKvbdmfeYNOGy -DoDKjvbdqUTgSSKt -EPDLKvbdePErjtUS -EObkKvbdaNKasUmH -EObkKvbdiifIJmYS -EOcKjvbdsPunjCvG -EObkKvbdbrcKtDjB -EPDKjvbdbhlikFwY -EPCjjvbdrpVnjDWG -EPCjjvbdaMkCStlg -DncKjvbdMpXqVnGs -EPDLKvbdZjShPfbG -EPDLKvbdfHkVrOQg -DoCkKvbdDnbjjvbd -DoCkKvbdkySqsYft -DoDLKvbdZRMeImEq -DoDLKvbdYpleIleR -DncKjvbdiHJbyViu -EObkKvbdrMyixkgi -EPDKjvbdqvokbiYq -EOcKjvbdzitoodTU -DnbjjvbdVYhTyjnn -EPDLKvbdyYJJbPzL -EObkKvbdeFPSCWcK -EPDKjvbdIsZArlxM -DnbjjvbdkIHLfGNk -DoDLKvbdehLVqmqH -EOcLKvbdvBEZTPFI -DncKjvbdnUuZjirG -EPCjjvbdakLfOnDA -DnbkKvbdEzsqEkcJ -DnbjjvbdVhXvXgYz -DoCjjvbdIryBTNYM -DncKjvbdZirgpHBf -DoDKjvbdEYYLsstM -DnbjjvbdZshhyETO -DoCjjvbdOTUVgFVQ -EObjjvbdZisHpGbG -DoDLKvbdkDLkRGtg -EObkKvbdegjvSNpg -DncLKvbdfIKvRnQg -DncLKvbdJKEAJpGd -DncKjvbdrRtkNkBN -EPCkKvbdjvWnDaxX -DoCjjvbdmfdwmNgZ -DnbjjvbdbrcLUEJa -DncLKvbdnQZxujxb -DoDKjvbdNsTugEuQ -EOcKjvbdUVlPisaR -EObkKvbdHDjujBij -EPDLKvbdSBdFMJYk -EPCkKvbdVvhxVdFH -DncKjvbdIsYaTNXl -EPDLKvbdIrxaSlxM -EPDKjvbdfoazwDwh -EPCkKvbddeOqbXDK -DoCjjvbdJpzEnfNe -DncKjvbdqiAKFNOe -EPDLKvbduDCtwWOo -DnbjjvbdZjShQGbG -EObjjvbdVAbQsRSZ -DncLKvbdtcCuWuoP -DoDKjvbdTvLoitAq -EOcLKvbdZQleIleR -DoCkKvbduLxXAtAw -DnbjjvbdqYoHfqDx -DoDKjvbdJYTbHkqQ -DncLKvbdGZUtaDxC -EObjjvbdqFdEtWAh -EPCkKvbdILaznWqL -EObkKvbdQwNdCkhD -EPCkKvbdmJDsqUqa -EOcKjvbdvBEYrneI -DoDKjvbdapGgELzd -DoCjjvbdwWlAvAvV -DoDLKvbdJbicQicY -EPDKjvbdaaVdepPw -DoCkKvbdsZkosAhO -DoCkKvbdNeETiJKd -EObkKvbdEObkLXCd -EPCjjvbduCbuXVno -DoCkKvbdrykpTBHn -DnbkKvbdrEFIpNua -DoCjjvbdlYrrSxft -DoDLKvbdqdFIpOVa -EObjjvbdrbFmMGjy -DnbkKvbdRpUHKGDw -EOcLKvbdzoPpdcMY -DoDLKvbdfILVqnQg -DoCkKvbdlZSqsZHU -DncKjvbdrzMQSaIO -DoCkKvbdhuZeWrUb -EObjjvbdfSAvzkbo -DoCkKvbdVZIUZjnn -EOcLKvbdhlEdOUcZ -DoDKjvbdbUagXkUI -DoCjjvbdqUTgRqjt -DoDLKvbdqTsfrRjt -DnbkKvbdrouoKCuf -EPDKjvbdmbKXXoNu -DoDLKvbdhbPDEwRR -DncLKvbduVnYKRTA -DoCjjvbdcJNKKfXY -EPCjjvbdeFOrCXDK -EPCkKvbdczYoxYpb -DnbkKvbdKfGHaaRV -DoCjjvbdMuTRjmAX -DoDKjvbdkMalZeGo -DnbkKvbdbhmKLFvx -EPDLKvbdjuwODbXw -DoDLKvbdUMVoBVoJ -DoCkKvbdRpTgJfDw -EOcLKvbdajlFoNcA -EPCjjvbdRMwaxnUz -EOcLKvbdJcJbpjDY -DoCjjvbdjhHLefNk -EOcLKvbdcasNSATm -DoDKjvbdyOTHwriD -EObjjvbdKQydnenF -EObjjvbdZirhPgBf -EPCjjvbdBiKbLIfK -EOcKjvbdNeDtIiKd -EOcKjvbdkDLjqGtg -DoDKjvbduDDVWuoP -DncLKvbdePErjtTr -EOcKjvbdJbicQjDY -EPDKjvbdrylQTBHn -DnbjjvbdkMbMZeGo -DncLKvbdtlYWaUAw -DoCjjvbdDwxMUTtM -EObkKvbdjblKqGtg -DoDKjvbdRMxCZNtz -EObkKvbdqYoIGqDx -EPDKjvbdmfeYNNgZ -EObjjvbdTAFIhCPE -DoCjjvbdjKGIKMxS -EOcLKvbdMpYRWOHT -EOcLKvbdMoxRVnGs -DncKjvbdhaoDEwQq -DnbkKvbdEXxMTtTl -EPCkKvbdMgCpMpVL -EObjjvbdRzKITDWA -EOcLKvbdrzLosBHn -EPCkKvbdBraCsfWr -DoCkKvbdaaVeGPow -EOcLKvbdIGgZyXxH -EPDKjvbdliETptqa -EOcLKvbdbKlGPODA -DnbjjvbdRadElJZL -EPDLKvbdjFLHVPAO -DnbkKvbdiBnbdwRR -EObkKvbdvBDyTOeI -DnbjjvbdUyHtZjnn -DnbkKvbdmgFYNOGy -DnbkKvbdGKdsDHlu -EPDLKvbdZRNEiMeR -DoCkKvbdbLLeoODA -EObkKvbdANIZSvzY -DoCkKvbdziuPpDrt -DnbjjvbdWHwvXgYz -EPDKjvbdsBfNLgLZ -DoCkKvbdWWiXudFH -EPDLKvbdwzIGGYEr -EOcLKvbdVTmUGMWK -EObjjvbdMSXMytpz -DncKjvbdZirhQGaf -EObjjvbdCJLBjiGK -EPCjjvbdZLrETnLm -EObjjvbdelevfljL -DncKjvbdGYuVBEYC -EPCkKvbdkCkjpgUg -DoCkKvbdbhljLFwY -DnbjjvbdeEoSBvbj -DncLKvbdvAcyTPFI -DnbkKvbdjblLQgVH -EPCjjvbdeEoSBvbj -DnbkKvbdaMjbStlg -EObjjvbdrDdhpOWB -EOcKjvbdbKlFoODA -EPDLKvbdZjTIQGaf -EObjjvbdEzsqEkcJ -DnbjjvbdZRNEiNEq -EObjjvbdqlzJxlIJ -DnbkKvbdkIHLfFmk -EObkKvbdMtrrKmAX -EPCkKvbdNQXpvNgT -EPCkKvbdbrcKtEKB -EObjjvbdSPtGjGEX -DoDKjvbdxwiJaoyk -DnbjjvbdVYhUZkPO -DoDLKvbdXrlBNUPY -DoDKjvbdZnmiEdzK -DoCjjvbdWWiXvDeH -DoDLKvbdyNsHwsIc -DoDKjvbdwyhFfYEr -EPDLKvbdNeDshhkE -EPDKjvbdBiLBkJFj -EOcKjvbdJqZdoGNe -EOcKjvbdbAvEepQX -DoCjjvbdaNLBsUlg -EPDLKvbdvBDxsOdh -DncKjvbdGFirNiTq -EPDLKvbdZnmiEeZj -DncLKvbdePFSjtTr -EOcKjvbdnGdwlnHZ -EOcLKvbduDDUvuno -EObjjvbdZQmFIldq -DoCkKvbdcyxpYYqC -EOcLKvbdMRvlzVQz -DoCjjvbdtcDUwVoP -EPCkKvbdrXQLbhxq -DoDKjvbdkVwODbXw -DnbjjvbdnCJwYOmu -DnbkKvbdqvpLbhxq -DoDKjvbdKDJcQjDY -DnbkKvbdvwMAvAuu -EPDKjvbdtvNxKRTA -DoDKjvbdYkqctOMN -DoDKjvbdtcCuWvOo -DoCjjvbdEObkLXDE -DoCkKvbdbrbjtDia -EObkKvbdDncKkXDE -DnbjjvbdxxJKBozL -EPCjjvbdbhlikGWx -DncKjvbdJXtCIMRQ -EOcLKvbdkVvmcaxX -DoCjjvbdqwPkbhyR -EObjjvbdySnImRbH -EObjjvbdZQleImFR -EObkKvbdmpZxujyC -EPCjjvbdhbPDEvpq -EObkKvbdpyPHgREY -DoDLKvbdwzIGGXeS -EObjjvbdaSGChUGL -DoDKjvbdrbFmMGkZ -EPCkKvbdxKwEHzyf -DnbkKvbdJXtBgkpp -EPCkKvbdlZTRrxft -EOcKjvbdFVyPpNKF -DoCkKvbdaRecHsek -DoDKjvbdFfKRnJUR -DoCjjvbdyOTIXrhc -DoDLKvbdyOSgxShc -DoDKjvbdEOcKjwCd -DoCjjvbdzoPpeClY -DoCkKvbdURRPVUhN -DoDLKvbdVqmxCFMD -EOcKjvbdNVSrKmAX -EOcKjvbdTvLpKTaR -EPDLKvbdCTAbtFwS -EPDLKvbdZyEKNblS -EOcLKvbdsCFllHLZ -EObkKvbdjlbMZeHP -EPDKjvbdMpXpunGs -EObjjvbdaNLCSuNH -DoDLKvbdkCkjqHUg -EPCjjvbdTYKlNzjx -DnbjjvbdNxOuzdOU -DoCkKvbdegjvRmpg -DoCjjvbdhfjCyWKV -DncLKvbdjggMFfNk -EOcKjvbduVmwjRTA -DnbkKvbdDjHiuxKA -EOcLKvbddePRavcK -DnbkKvbdwkWcgzyf -DnbkKvbdHlBznXQk -EPCkKvbdatafxKsh -EPCjjvbdcJMjKfXY -DoDKjvbdrDdiQOWB -DoDLKvbdVvhwvEEg -EObjjvbdwjvdHzzG -DncLKvbduMYXAtAw -DoDLKvbdZQmFJNEq -EPCjjvbdyOTIXriD -DoCkKvbdbiNKLGWx -DncKjvbdHEKvKBij -EPDLKvbdYlSDtNkm -DoDKjvbdTqROuVIN -EPCkKvbddeOqbXCj -EOcLKvbdCTBCsewS -EPCjjvbdnUtykJrG -DnbjjvbdlZTSSyGt -EPCjjvbdjmBkyeGo -DnbkKvbdVhXuwfxz -DncLKvbdePFTLTsr -EOcKjvbdemGWgMik -EObkKvbdhuZeWquC -EPCjjvbdEvYpQNKF -EOcKjvbdpaJFAXHd -DoDKjvbdJSyBSmYM -EOcLKvbdSCDdlIxk -DncKjvbdSLZGVGkT -DnbkKvbdrbFlkgKy -EObjjvbdJSyAsMwl -EOcKjvbdEOcKkXDE -EPCjjvbdMoxQumfs -EPDKjvbdUQpnuUgm -DncKjvbdaaWFFoow -DnbkKvbdakMGPODA -EObkKvbdrEEhomua -EOcKjvbdmozZWLYb -EObjjvbdVgwuxGxz -EOcLKvbdCJLCKhej -EPDLKvbdVUNUGLvK -EOcLKvbdLGGHbBRV -DoCkKvbdlqxtysEJ -EOcLKvbdcScLTdKB -DncKjvbdhtydwRtb -DoCjjvbdcTCjscia -DncLKvbdUslsekuj -DoDKjvbdwuNFRYkn -EOcLKvbdijGHjNYS -DoCjjvbdJSyBSmYM -DoDKjvbdEYXlUTtM -EPDKjvbdUyITzKoO -DnbkKvbdvBDyTPFI -DoDKjvbdYlRcsmkm -DoDKjvbddePRbXCj -EPCkKvbdVZHtZjoO -EPDLKvbdWXIxVceH -EPCjjvbduDDUwVoP -DncKjvbdQlxBxnUz -DoDLKvbdfpBzvdYI -DoCjjvbdMJBlRYAS -EPCkKvbdZisHofaf -DnbkKvbdkWXNdCXw -EOcKjvbdEYXkstTl -EOcKjvbdfekymgHA -EPDKjvbdelfWflik -EPCjjvbddCTNSAUN -EPDKjvbdpfDeUVaI -DncLKvbdiBnbeWqR -EObjjvbdEuyPoljF -EPCkKvbdRDcBQRES -DncKjvbdhfibxujV -EObkKvbdVqnYBeMD -EPDKjvbdJKEAKQGd -EOcLKvbdsQVoJbuf -EOcKjvbdqcdhonVa -EObjjvbdJcKCqJcY -EOcKjvbdpfEEsuaI -EPDLKvbdxnTIYShc -EOcLKvbdxVMdqYlO -EObjjvbdZyDimcMS -DncKjvbdiGjCxvKV -DoCkKvbdRbEEkiYk -DoCjjvbdWIYVxHYz -EPDLKvbdYzcFqjVy -DncLKvbdTYLLmzjx -DoDLKvbdwXLaVaWV -DoDLKvbdMRvlyuQz -DoCjjvbdajkeoNcA -EPCjjvbdjEkHUoAO -DoCjjvbdZoNiFFZj -DncLKvbdlZTRryHU -DoCjjvbdcTDLTdJa -EOcLKvbdlhctRVSB -EObjjvbduaEYroFI -DncKjvbdzjUpQDsU -DoDLKvbdyqPNIiwA -DnbjjvbdhkdcnUby -EObjjvbdVYgtZjoO -DnbjjvbdCJLCLJFj -EPCjjvbdzeZnzdyp -DnbjjvbdqlyjZMIJ -EOcLKvbdGAnpyJzm -DoDLKvbdNGcQMpVL -DncKjvbdADSXiyiQ -DoCjjvbdLBLHNCYR -DoCkKvbduVnXjRTA -DncKjvbdtSqsZZeD -EPDKjvbdpyOhGqEY -EObjjvbdEuyPomKF -EPDKjvbdyOSgxTIc -EPDKjvbdGFiqnJTq -EOcKjvbdyYJJbPzL -DncLKvbdADRwjZiQ -DncLKvbdCSaDUFwS -DoDLKvbdEzsqEkbi -EOcLKvbdssSTYyeD -DnbkKvbdSBdEkiZL -EObjjvbdFWZQPlie -EObkKvbdbBVeFpPw -DoDLKvbdBdQBVjMf -EPDLKvbdptUHRqjt -EPCkKvbdQwODcMID -DoDLKvbdelevgMik -DnbjjvbdVTmUFkuj -DnbkKvbdLYqJrzuG -DoCkKvbdCTAbsevr -DoCjjvbdJpyeOfOF -EPCkKvbdOStWHEtp -EOcLKvbdKVtfEEfi -DoCkKvbdmuUykJqf -DnbjjvbdQZNAHSrK -DnbjjvbdMgDPlpUk -DnbkKvbdCIkBjhfK -EObjjvbdBsBCsewS -EOcLKvbdYzbfRivZ -EOcLKvbdrzMQSaHn -EOcKjvbdRosfjFcw -EPDKjvbdANHyTXZx -EPCkKvbdliDsptqa -EOcLKvbdACrXizIp -EPCjjvbdLFfICApu -DoCjjvbdbAvEepPw -EOcKjvbdTpqPVVHm -DoCjjvbdsBemMGjy -EPCkKvbduaEZTPEh -DoCkKvbdOStWHEtp -EPCjjvbdbBVeGQPw -EObjjvbdOSsufeUp -DoCkKvbdjAQHBPgK -EPCjjvbdbBWEfPow -EPDKjvbdtSqsZZdc -EPCkKvbdegjuqmpg -DoDLKvbdRotGifDw -DoDKjvbdmJEUQtrB -DoCjjvbdcIljKewY -EObkKvbdbiMjKewY -EObjjvbdcScKsdJa -EPDKjvbdtSqsYyeD -DnbkKvbdrpWOjCvG -EPDLKvbdBiKbLIej -EPCkKvbdBdPaWJmG -EObjjvbdZRNEhmEq -EOcLKvbdiUzFWrUb -EPCkKvbdmIdUQtrB -EPCkKvbdbUafxLTh -EOcKjvbdnCKWxOmu -DoCkKvbdsZkosBIO -DnbkKvbdHDjujCJj -DoCjjvbdWSOYCFLc -EPDKjvbdmJETqVSB -DnbjjvbdrXPkcJYq -EObkKvbdMgDPlpVL -DnbjjvbdZisHpGaf -DoCjjvbdGGJqmiTq -EObkKvbdIHGyyYXg -EObkKvbdqTsgRrKt -EObjjvbdmJDtRVSB -DnbjjvbdddoSBvbj -EPDKjvbddePSBvbj -DnbjjvbdBcpAvJlf -DncKjvbdezvYeItX -DoDKjvbdmgEwmNfy -EObjjvbdDigivXjA -EOcLKvbdmJEURUrB -EOcLKvbdePFTLTtS -EPDKjvbdVTmUGMVj -EPDKjvbdnBivwnnV -EPCjjvbdZnmhddzK -DncKjvbdZeXfzgiC -DoDLKvbdEuyPpNJe -DoDLKvbdqdEhpNua -DoDKjvbdFWYpQMie -DoCkKvbdMfcQMpVL -EOcKjvbdmttykKSG -DnbjjvbdlhcspuSB -EPCjjvbdWSNwbFMD -EPDKjvbdRbEElIyL -EOcKjvbdyNsHwsIc -EPCjjvbdrylQTAgn -DncLKvbdADSYJyiQ -EOcKjvbdZjTIPgBf -EObjjvbdKDKDQibx -EObkKvbdKDJcRJcY -DoCkKvbdmSZUzSdJ -EPCjjvbdaNKartlg -DoDKjvbdIGgZyXwg -EObjjvbdauCHXjsh -EObkKvbdxUmEpyLn -EPCjjvbdNsTugEtp -EPDLKvbdZyDimblS -DoDKjvbdbUagYKtI -DncKjvbdliETpuSB -EOcKjvbdDihKWXjA -DncKjvbdZtIiZETO -EObjjvbdygZMAMeX -DoDKjvbdfNGWgMik -DoCjjvbdZMSEUNkm -EOcKjvbdsrqsZZdc -EPCkKvbdACqxJzJQ -EPDLKvbdNdcshiKd -DoDKjvbdyqOmIiwA -EOcKjvbdRMwbYmtz -EOcKjvbdYpmEhleR -DoDKjvbdjJfHimYS -DoCjjvbdrbFmMHLZ -DoCkKvbdBcpBWKNG -DoDKjvbdIxTbHkqQ -DoDKjvbdhuZdwSUb -EPDLKvbdJYUBglQp -EPCkKvbduCcUwVno -DnbkKvbdwuNEpyMO -DncKjvbdssSSxzEc -DoDLKvbdGdLWJbKK -EObjjvbdFjdsDIMu -DncLKvbdfkGzbfAE -EOcLKvbdrRtkOLBN -EPDLKvbdajkfOmcA -EPCjjvbdrMzJxkhJ -DncLKvbdqZOhHREY -DoDKjvbdmJEUQuSB -DnbkKvbdRDbaQRES -EPCjjvbdpyPHgREY -DnbjjvbdMIalQxAS -DncLKvbdiZuGMROG -DoDKjvbdgFkymfgA -DncLKvbdsCGMkgLZ -EObkKvbdRotHJecw -EPDKjvbdkClKpftg -EPCkKvbdRjyGUgLT -EOcKjvbdhuZdvqtb -EOcLKvbdmttzKjSG -EObjjvbdhlEdOVDZ -DoDLKvbdZisHpGaf -DnbkKvbdTqQntuHm -EPDLKvbdNdctIiLE -EObkKvbdWRnXbFLc -EPDLKvbdKVtfDdgJ -EPCkKvbdJSyBTMwl -DnbkKvbduWNxKQsA -DoCkKvbdqGEFUVaI -EPDKjvbdhkdcnVDZ -EPCjjvbdySnIlrBg -EOcLKvbdYlRctNlN -EObkKvbdvBDxroFI -DoDLKvbdxwiJbPzL -EPCjjvbdyNsHxTJD -DoCjjvbdhfjDYujV -DoDLKvbdcImKLFwY -DnbjjvbdqwQMChxq -DncLKvbdaaWEfQPw -DnbkKvbdUQqOuUhN -EOcLKvbdUaCRSqSZ -DnbjjvbdRMxByOUz -EPDKjvbdKCjCpjCx -DncLKvbdrMzJyMIJ -EPCjjvbdOEdThhjd -EPDKjvbdrSUkOKaN -EObkKvbdMowpunGs -DoCjjvbdhzVGLpmf -EOcLKvbdaMkBsVMg -DoCjjvbdkIGkfFnL -DnbkKvbdYpldiNFR -EPDLKvbdZxcjNcMS -EPDKjvbdGGKRnJUR -EPCjjvbdbiNKKfWx -EObjjvbdmRyUyrci -DncKjvbdLrXNZtpz -DncKjvbdZjTIPgCG -DnbkKvbdypoNIiwA -EPCjjvbdDihKVxKA -DncKjvbdyfxlANFX -DoDKjvbdiMFEOVCy -EPCkKvbdtcDUvvPP -DoCkKvbdEvYpQMie -DnbjjvbdZLrDtOLm -EPCjjvbdKQzFPGNe -EPDKjvbdGdLVjCJj -DoDKjvbdqYoHfqDx -DoDLKvbdFVxoomJe -DnbkKvbdKRZePFnF -DoCjjvbdFVyQQMjF -DnbkKvbdTulQJsaR -EObkKvbdkHgMFenL -DoDKjvbdVUMselVj -EPDLKvbdrDdhonVa -DncKjvbdkVvmcaxX -DoDLKvbdrRuKnLAm -EOcKjvbdJbibpjDY -EPDKjvbdXrlAmToY -DnbkKvbdZirhQGbG -DnbjjvbdjgfkfFnL -EOcKjvbdGFjSOJTq -DoDKjvbdSCDeMJYk -DoCkKvbdpecdtWAh -EObjjvbdzeZnzdyp -DoCjjvbdMJBlQxAS -EPDKjvbdnBivwnmu -DoDKjvbdRadElIyL -DoDLKvbdsZlPsBHn -EObjjvbdznopeDLx -EOcLKvbdCJKbKiFj -DncLKvbdmgExNNfy -DnbkKvbdnPzYvKxb -DncKjvbdrDdiPnVa -DoCjjvbdAMgxrwZx -DncLKvbdTfzmkwWF -DncKjvbdqiAJdloF -EPCkKvbdwuMeRZLn -DoCjjvbdVUNUFkuj -DoDLKvbdKQyePGNe -DncKjvbdLqvlzVQz -DoDKjvbdmgFYNNgZ -DnbjjvbddxZtTrFz -EObkKvbdqTsgSSKt -DnbkKvbdZxcimcMS -DoCjjvbdANHySvyx -DoDLKvbdZQmFJMdq -DoCkKvbdHDjujBij -EPDLKvbdsPuoJbuf -EPCjjvbdYpmEhmFR -DncLKvbdZjTHpGaf -EPDKjvbdEuyQQNKF -DoCkKvbdmbKWxPNu -DoCkKvbdRjyFtfjs -DoCkKvbdiifHjNYS -EPDKjvbdpyOhGpdY -DoDKjvbdUVlPitBR -DoCjjvbdEKIJuwjA -EPCjjvbdFkFTDHmV -EOcLKvbdySnJNSCH -DncLKvbdRpUHJedX -EPDKjvbdtvOYJpsA -DoDKjvbdKDKDQjCx -DoDLKvbdaMkCTUmH -EOcKjvbdMpYRVnGs -EOcKjvbdtSqsYzFD -DncLKvbdKaKgNCXq -DoCkKvbdsCFllGkZ -EObkKvbdNrsvGeUp -DoDKjvbdmaivxOnV -EOcLKvbdOEctIhjd -DoCkKvbdemGXGljL -DoDLKvbdjvWmdBxX -EPCkKvbdCIjbLIej -EPCjjvbdkHfkfFmk -DoDLKvbdwzIGFwdr -EOcKjvbddBrlrAUN -EPCkKvbdJutecdgJ -DoCjjvbdWRmwaeLc -DnbkKvbdiVZdwRuC -DnbjjvbdGLEsDHmV -EPCkKvbdxsOJNSCH -EPCjjvbdIwtBgkqQ -DncKjvbdbrbjtDjB -EPCkKvbdjhGkeemk -DncKjvbdWWiXvDeH -EPCjjvbdnUtzKiqf -DncKjvbdTukoitAq -DncLKvbdCIkBjhfK -DoCkKvbdhgKDZWJu -EPDKjvbdBhkBjiFj -DnbjjvbdMfbpNPtk -DoDKjvbdnBjWxPOV -DoCjjvbdEJhKWYKA -EOcKjvbdTpqOtuHm -DoCjjvbdwzIFfXdr -EOcKjvbdrpVoKDVf -EOcLKvbdEYYLtTsl -DoCkKvbdLFfICBQu -EOcKjvbdeXzTsrFz -EOcLKvbdSQUHKFdX -EOcLKvbdraemMHLZ -EPDKjvbdkIGlFemk -DncKjvbdOYOuzcnU -DoCkKvbdIwtCILpp -DncLKvbdZoNiEdzK -DoDKjvbdsrqsZZeD -EPDLKvbdzGyMANEw -DncLKvbdBraCsewS -EObkKvbdpyOgfpcx -DnbjjvbdxmrgxTIc -EOcLKvbdZjSgpHCG -EPCjjvbdrWpMDIxq -DncKjvbdZtJIyESn -EPCjjvbdJSxaSmXl -DoCjjvbdiMFEOVCy -DoCjjvbdDwwlTstM -DncLKvbdJYUCHkpp -EPDLKvbdsrrSxzFD -EObjjvbdkHgMFfNk -EPDKjvbdOStVgFUp -DnbjjvbdjhHMGGOL -DnbjjvbdZyEJmcLr -EPDKjvbdDihKWYKA -DncLKvbdRosfiecw -DoCjjvbdyTNhmSCH -DnbkKvbdFeirNhsq -DoDKjvbdrDeIpNvB -EObkKvbdVAaqTRSZ -EPDLKvbdLAkGlbXq -EOcKjvbdVAaprqRy -EPDLKvbdfIKvRnQg -EPCjjvbdUQpoVUgm -EObjjvbdxVNEpyMO -EOcKjvbdsCFllGkZ -DncKjvbdsBelkgLZ -DoDLKvbdvlvANDeN -DoCjjvbdnBivwoNu -EObjjvbdsCGMkgLZ -EObjjvbdsPvPJbvG -EPDLKvbdxrnImRbH -EPDLKvbdNPxRVnHT -DoDLKvbdMtrqkNAX -DoDKjvbdiGicZWJu -EPDKjvbdOFEUJJLE -EPDLKvbdoAKzshDn -DoDKjvbdehKvRnQg -EObjjvbdLLBIWAKZ -EPDKjvbdeOdsLUUS -DncKjvbdjvWmdBxX -DncLKvbdezuyFJTw -EPCkKvbdNPwpumgT -EPCjjvbdkxsRrxgU -EPDLKvbdptUHSSLU -EPDKjvbdeATqNXif -EPCkKvbdjlakzEgP -EObjjvbdyXiKCPzL -DoCjjvbdhlFDmuDZ -DncKjvbdauCGxLUI -EObjjvbdySmiNSBg -EOcLKvbdfNGWfljL -DncLKvbdVviYWDdg -EPCkKvbdkIHLefOL -EPDLKvbdRNYCZNtz -DoDLKvbdmfdxNOGy -DoDLKvbdcScKtDjB -EOcLKvbdEPDLKvcE -EPCjjvbdUaBprqSZ -EObkKvbdddnqbXDK -EPCkKvbdaaVeGQQX -DoDLKvbduoTzqKnt -DnbjjvbdqwPkbhxq -EObkKvbduaEZTOdh -EOcLKvbdKfFhBaRV -EOcKjvbdVYgtZjoO -EOcLKvbdrSVKnKaN -DnbkKvbdsCFmMGjy -DnbkKvbdSLYeuGkT -DoCkKvbdwWlAvAuu -EPCjjvbdRXOEClID -EPCkKvbdCIkCKiFj -EOcKjvbdGckViajK -DoCkKvbdznpRFCkx -DnbjjvbdxKwDgzyf -DncKjvbdVAaprprZ -DoDKjvbdOEctIhjd -EObjjvbdmIdTptqa -DnbjjvbdvwMAuaWV -EObkKvbdEYXksssl -EPCkKvbdiZtelQnG -EOcKjvbdqdEhpOVa -DnbjjvbdidjfuPAO -DnbkKvbdnBivxPNu -EObkKvbdrSVKmkBN -DnbkKvbdiCPDFWqR -DncKjvbdZisHofaf -DoCjjvbdJvVFcdfi -DoDLKvbdcyxpYYpb -DoCjjvbdrykpTBHn -EPDLKvbdqrUkOKaN -DoCkKvbdGQATWgFy -DncKjvbduaDxsPFI -EPCkKvbdYkqdTnLm -EObjjvbdQYmAGsRj -DnbkKvbdZyEKOCkr -DnbkKvbdOEdThhjd -EPDKjvbdiCOcFWpq -EOcKjvbdMfcQNPtk -EPDLKvbdLGFhBaRV -EPDLKvbdssSSyZeD -EPCkKvbdTAFJIBoE -EObkKvbdeFPRavbj -DnbkKvbdjKFhKNYS -DncLKvbdCJLBjiGK -DncLKvbdqlzJyLhJ -EOcLKvbdRyigsCvA -DoDKjvbdYqMdhldq -DnbjjvbdehKvSOQg -EObjjvbdMgColouL -DoCkKvbdehKuqnRH -DoDKjvbdQvmdCkhD -DoDKjvbdMSWlzVQz -EObkKvbdbhlikGXY -DoCjjvbdeAUQmYJf -EPCjjvbdZyEJmcMS -DoDKjvbdIGfzYxYH -DoDLKvbdHDjvJbJj -EOcKjvbdQwNdCkgc -EPCkKvbdRWnDcMHc -DnbjjvbdrMzJyMIJ -DncKjvbdlhctQuSB -DoDKjvbdbPgGdLzd -EObkKvbdijFhJmXr -DoCjjvbdbQGgDkzd -EPDLKvbdDihJvXjA -EObjjvbdaNKasUmH -DncKjvbdZyEKOClS -DnbjjvbdSLYfVHLT -DoDLKvbdwzHfFweS -EPCjjvbdfNFwHNJk -DoDLKvbdelewHNJk -EPCjjvbduaDxroEh -DoDKjvbddwytURez -DncKjvbdwtmEpyLn -EOcLKvbdCIkBkIej -EOcLKvbdiLddOUcZ -EPDKjvbdiUydwSVC -DncKjvbdrEEiQOVa -DnbkKvbdYzbeqivZ -DoCjjvbdkVwOECYX -DoDLKvbdZLqcsmkm -EObjjvbdVYgtZkPO -EOcLKvbdHffyxwwg -EPDKjvbdcIljLGWx -DnbkKvbdMpXpvNfs -EOcLKvbdFeirOJTq -DncLKvbdWWhxWEFH -DoCjjvbdZRMdhmEq -DnbkKvbdULvPBWPJ -EPDLKvbdZRMdiMdq -DnbjjvbdTYLMNzkY -DoCkKvbdZxcjNblS -DoCkKvbdKCibpicY -EPDLKvbddoFTKtUS -DncLKvbdcImKLGXY -EOcKjvbdKaLGmBwq -EPCkKvbdnHFYMnGy -EPDKjvbdUQqPUuIN -EPDKjvbdeAURNYJf -DoCkKvbdxwiKCQZk -DnbkKvbdKVuGDeGi -EPDKjvbdrovOicVf -DoDLKvbdrylQSaHn -EOcLKvbdySmhlrBg -EOcLKvbdNrsufeVQ -EOcKjvbdzoQREblY -EPCkKvbdzaAOgHCM -DoCjjvbdZLqdTmkm -EObkKvbdNGbpNQUk -EOcKjvbdZshiYdSn -EPDLKvbdDncLKvbd -EOcKjvbdqlzJyMHi -DoCkKvbdBhkCKiFj -EOcLKvbdRaceLhyL -EPDLKvbdxsNiNRbH -DoDKjvbdtcCtwWOo -DnbjjvbdmfdwlnGy -DncKjvbdREDBQQdS -DncLKvbdnPzYvKxb -EPCjjvbdjgfkefNk -DnbkKvbdnUtykJrG -EPDKjvbdSCEFLiYk -EOcLKvbdGcjuiajK -EPCjjvbdJYUCHlRQ -EPDLKvbdYpleIldq -EObkKvbdfMfWflik -DncLKvbdwuMdpyLn -DoDLKvbdEPDLLWcE -DoDLKvbdZLrDtOLm -DoCkKvbddZxoxYqC -DncLKvbdTulQKUAq -DncKjvbdqrUjnKaN -DoCkKvbdGFjRmiTq -EPCjjvbdpssfrRkU -EPDKjvbdrXQLbiYq -DoCkKvbdNQYQunHT -DoCkKvbdNrtWHEuQ -DncLKvbdjgflGGNk -DncKjvbdBsBCsewS -DoCkKvbdMpYRVmfs -DnbkKvbdKfFhBaQu -EObkKvbdGcjuiaij -EObkKvbdakMGOnDA -DnbkKvbdFyUuAcxC -DnbkKvbdtSrTZZdc -EPCjjvbdatafxLTh -EPCkKvbdUGzmlXVe -EObkKvbdZyDinClS -DncKjvbdyzdnSIJI -DnbkKvbdnPyxukZC -DoDKjvbdkDMLQgVH -EObjjvbdbVBfwjtI -EPDLKvbdzRPMhiwA -EObkKvbdhkeDmuCy -DnbkKvbdZQleImEq -EObjjvbdrDeJPnVa -EPDLKvbdaNLBsVMg -DnbkKvbdOEctIhjd -EOcKjvbdatagXkUI -DncKjvbdMowpunGs -EObkKvbdtvNwiqTA -DnbjjvbdyzdnSHiI -EObkKvbdbhlikFvx -EOcKjvbdaNKaruNH -DnbkKvbdiVZdvqtb -EObkKvbdVYgszKoO -DoCkKvbdjJfIKMwr -DncLKvbdezvZFJTw -EObkKvbdcyxoxYqC -EPDLKvbdFejSNiTq -DncKjvbdIwsbIMQp -DnbjjvbdTukpJsaR -EPDLKvbdIsZArlxM -EPDKjvbdTAEhgand -EOcLKvbdfNGXHMik -DoDKjvbdjcMLQgUg -DncKjvbdSLYfVHKs -DoCjjvbdnBjWwoOV -EPCjjvbdnBjWwnnV -EObkKvbdQvmccLgc -EPDKjvbdwuMeRYlO -DoDKjvbdNddUJIjd -DoCkKvbdqUTgSRkU -DoDLKvbdehLVqmpg -DoDLKvbdrovOjCvG -EObjjvbdzoPpdcMY -EPDLKvbdZRNFIleR -DnbkKvbdSLZGVGjs -DoCkKvbdySmiMrBg -DnbkKvbdwyhFfXeS -DoDLKvbdWHwvYHYz -DoCjjvbdIHHZyYYH -EObjjvbdJSyArmXl -DncKjvbdACqxJyiQ -DncLKvbdmpZxujyC -DoCjjvbdFkFScINV -EPDLKvbdCDpAujNG -DnbkKvbdhkeDnUby -DncLKvbdFWYopNJe -DoCjjvbdLAjfmCYR -EPCjjvbdxrmiMrCH -EObjjvbdcImJkGWx -DoCjjvbdFejRnJTq -EObkKvbdYTMAlsnx -EPCjjvbdsPvOibuf -EObjjvbdNeDshhjd -EOcLKvbdBiKbLIej -EObkKvbdauCGxLTh -EPDKjvbdbBWEepQX -EPCkKvbdVrNxBdlD -EObjjvbdMIalRYAS -EOcKjvbdJcKCpjCx -EOcLKvbdLqwNZtpz -DoCkKvbdZisHogBf -DnbjjvbdEPDKjvbd -DoDLKvbdFWZQQNJe -EObkKvbdHgGzYwxH -EOcKjvbdjbkkQfuH -DnbjjvbdtkxXAtBX -EPDLKvbdLAkHNCXq -EOcLKvbdWWhxVdFH -DncLKvbdCWzdIeQW -DoDLKvbdVvhwvDdg -EObjjvbdpfDeUWAh -EOcLKvbdqmZixkhJ -DncKjvbdyzdmrIJI -DncLKvbdRpTgJecw -DoDLKvbdGFjSOIsq -EOcKjvbdwuNFQyLn -DnbjjvbdIsZAsMwl -DncKjvbdptTgRqkU -DncKjvbdZQmEiNEq -DnbkKvbdauCHYLTh -EPDLKvbdyzdmrHhh -EPCjjvbdZoOJFEyj -EOcLKvbdUQqOttgm -DoCjjvbdRNYCZNtz -EPDKjvbdrRtkOLBN -DncLKvbdmajWxOmu -EPDLKvbdLBLHMbXq -DoDLKvbdCIjajhfK -EObjjvbdYkrDtOMN -EOcLKvbdUtNUGMVj -EObjjvbdaSFcHsek -DnbkKvbdXrkaMtPY -DoCkKvbdZQmFImFR -EOcLKvbdcJMijewY -EPDLKvbdGLErbhNV -DnbkKvbdiUydwSVC -EPDLKvbddndsKssr -DoDLKvbdxwhjCPzL -DoCkKvbdxVMeQxkn -DncKjvbdiBoCdwRR -EPDLKvbdnPyyVkZC -EPCjjvbdmuUzLKRf -DoDLKvbdSQUGiecw -DoDKjvbdRbDdlJZL -DncKjvbdqrVKnLAm -DoDKjvbdVBCQsQrZ -DoDKjvbdmbKWxPNu -EObjjvbdFVyQPmKF -DnbjjvbdiiehJlxS -EOcKjvbdIrxaSmYM -EOcKjvbdsZkosAgn -EOcLKvbdnCKWxPOV -EPDLKvbdKWUecdfi -DncLKvbdhgKDZWKV -EPDLKvbdySnImSCH -EObkKvbdJKEAKQGd -EOcLKvbdZMSETmkm -DoCjjvbdhgJcYujV -EOcLKvbdehLVqmpg -DoCkKvbdezuyFItX -DncLKvbdvBDxsOeI -EObkKvbdTulPisaR -DnbkKvbdajkfPODA -DoDKjvbdYkrEUOLm -EPCkKvbdfIKvSNpg -EPCkKvbdiBncEwQq -EOcKjvbdKWUecdgJ -EObkKvbdYlRcsmkm -EPCjjvbddwzUTqez -DnbjjvbdeYZstRez -EPDLKvbdxVNEqZLn -DncLKvbdFjeScINV -EObjjvbdxUleQxkn -DncKjvbdKWUfDdfi -DoDLKvbdssRrxzEc -EObjjvbdRpUGiedX -EOcLKvbdZQleJMdq -DnbkKvbdqdFIpNua -EPCjjvbdYzberKWZ -DoDKjvbdxxIjBoyk -EOcLKvbdEObkKwDE -DoDLKvbdqquLNjaN -DncKjvbdwuNFRZLn -DoCjjvbdqUTgRrKt -EObkKvbdVwIwvDeH -DnbkKvbdVwJYWEEg -DnbjjvbdYlSETnMN -DnbkKvbdqTsgRqjt -DoDKjvbdiGicZVjV -DnbjjvbdxnTHxTJD -EObkKvbdqUTfrSKt -DoCkKvbdFyVVBEXb -EOcKjvbdqGDdsvAh -EPCkKvbdTkunaVni -EObkKvbdMRvlzVQz -EPDKjvbdDncKkWbd -EObjjvbdqqtkNkBN -DncLKvbdfHkWRnRH -DnbjjvbdiLdcnUby -EOcKjvbdVYgsyjnn -EPCjjvbdUtNTfMWK -EPDKjvbdqYoHgREY -DncKjvbdGZUuAdYC -DnbjjvbdDnbjjwDE -EOcKjvbdTqQntthN -EOcLKvbdUyITzLPO -EOcLKvbdjblLRHVH -DoCkKvbdLGFhCBQu -DncLKvbdliEUQuSB -EObkKvbdRacdkiZL -EOcLKvbdaSFcHtFk -DoDKjvbdJYTahLpp -EPDLKvbdUQqOuVIN -EPCjjvbdqmZjYkhJ -DoCkKvbdRjyGUgKs -EObjjvbdyNrhYSiD -EPCkKvbdBhkCKiFj -EObjjvbdYlSDtOLm -DoCjjvbdTAFIhBoE -DncKjvbdNdctJIjd -DoDLKvbdGdKvJaij -EObjjvbdJpydnfNe -EPDLKvbdCDpAvKNG -DoDLKvbdeEoRavbj -DoCkKvbddoFSjssr -EPCjjvbdqYoHfqEY -EPCkKvbdFkFScHmV -EObjjvbdcyyQYZRC -DoDKjvbdyzdmrHhh -DoDKjvbdUWLojUAq -EObkKvbdiCPCdwRR -DoCkKvbdCTBDTevr -EOcKjvbdLAkGlbXq -EPDKjvbdcyyQXyRC -EPDLKvbdyNsHxSiD -EPDKjvbdqUTgRrKt -DoDKjvbdJuuFdEfi -DoDLKvbdEXwktTtM -EObkKvbdeJirVtzn -EObjjvbdYTMBMsnx -DnbkKvbdNQXpumfs -EPDLKvbdzitopDrt -DncLKvbdDxXlUUUM -EOcKjvbdADSXiyhp -DoCjjvbdqTsgSSKt -DoCkKvbdZtIhxdTO -EOcKjvbdUyHtZjnn -EPDLKvbdcSbkTdKB -DncLKvbdxZgfGYEr -DncKjvbdeATplxJf -DoDLKvbdnCJwXnmu -DnbkKvbdbKlFnnDA -DoCkKvbdrDeIpNua -EPCjjvbdmttzKirG -DoDKjvbdbrbkUDjB -DnbkKvbddZxoxZRC -EObkKvbdhgKDZWKV -DnbjjvbdGFiqmhtR -EPDKjvbdULvOaWPJ -EOcLKvbdygYlANFX -DnbjjvbdIHGzZYYH -EOcKjvbdhkeENuCy -EOcLKvbdNddTiJLE -EObjjvbdGFiqnJUR -EOcLKvbdjvWnEBxX -EPCjjvbdVBCRTRSZ -DncKjvbdVBCRTRSZ -EObkKvbdBdQAvJlf -EObkKvbdJYUCHkpp -EOcKjvbdGckVjCJj -EObkKvbdBsAcUGWr -DoDLKvbdIxUBhMQp -DoDKjvbdMgDQNPtk -EOcLKvbdHEKujCKK -DoCjjvbdLhalQxAS -EObkKvbdULuoBVoJ -EPDKjvbdhfjDZVjV -DoCkKvbdKDJbqJbx -DoCkKvbdbKlGPNcA -DncKjvbdrpVnicWG -EPDKjvbdvAdZSneI -DnbkKvbdFyVUaEYC -EOcKjvbdHDjuibJj -DnbjjvbdbiMjLFvx -EPCjjvbdUsltGLvK -DoCjjvbdkNBkzEgP -DncLKvbdFxtuBEYC -EOcKjvbdnBjWxPNu -DnbkKvbdqUTfrRjt -EPCjjvbdZHXEAPSi -DoCjjvbdxxJJapZk -DncKjvbdZyDimcLr -DnbjjvbdiBnbeWpq -EObjjvbdjbkkQftg -EObjjvbdqvokbhyR -EOcLKvbdeYZtTrFz -EPCkKvbdLqvmZtpz -DoDKjvbdNeDsiIjd -EPCkKvbdeXystRez -EOcKjvbdAMhZSvzY -EPCjjvbdSwkMNzkY -DoDKjvbdtlYXAtBX -EPCjjvbdBvzdIdov -DoDLKvbdVBBqSqRy -EOcLKvbdTvMQKUAq -EOcLKvbdxVMeQyMO -EPDLKvbdBsAbtGWr -DoCkKvbdKefHaaRV -DncLKvbdCTBDTewS -EPCjjvbdTIyjRAAl -DoDKjvbdkxsSSxft -EObjjvbdjvXOECXw -EPDKjvbdVTlsfLvK -EOcKjvbdjJfHjNXr -EObjjvbdfMfWflik -DnbkKvbdYqNFImEq -DoDLKvbdcJMikFvx -DoCkKvbdrXPlDIyR -EObjjvbdeOdsLTtS -DncLKvbdJSyArmXl -EObjjvbdkNBlZeHP -EObkKvbdfHkVqnRH -DncLKvbdKCjCqKDY -DoDLKvbdUyHsykOn -DncKjvbdWWiYWEEg -EPCkKvbdKWVFdEfi -EObkKvbdFpATWgFy -EOcKjvbdrzLpTAgn -EPCjjvbdhuZeWrVC -EPCkKvbdraellGjy -DncLKvbdGKeTCgmV -DoDLKvbdCEQAvJlf -DoDLKvbdJvUfEFGi -EOcKjvbdHDkVjCJj -EPCjjvbdZxdJnClS -DoCjjvbdcImJjewY -DoDLKvbdkDMLRHUg -DoDLKvbdqZOggREY -DoCkKvbdkMakyeHP -DoCkKvbdEvYpPmJe -DncLKvbdJJdAJpHE -DoDKjvbdEPCjkXCd -DnbjjvbdlAmOmALA -DoDLKvbdsBfNLgLZ -DncLKvbdKyQjSzuG -EPDLKvbdeAURMxJf -EPCjjvbdkHflGGOL -EOcKjvbdEuxpPlie -DncKjvbdcyyPxYqC -DoCkKvbdRDbaPqES -DncLKvbdaaVeFpQX -EOcLKvbdMuTSLNAX -EPCkKvbdbiMjKfWx -EOcKjvbdSCEEkiZL -DncKjvbdbhmJkGWx -DncKjvbdWXJYVcdg -EOcLKvbdvBDxrndh -DoCkKvbdCEQBVjNG -EPDLKvbdxUmFQyMO -DnbkKvbdznpRFCkx -DoCjjvbdKDJbpjDY -EOcLKvbdREDBQRDr -DoDLKvbdZtIhyETO -EObjjvbdKfGHbBQu -DnbjjvbdnUtzKirG -EPDLKvbdyNsHwsIc -DoCjjvbdIrxaSlxM -DoCkKvbdRjyFuHLT -EPCkKvbdJvUfDdgJ -DnbkKvbdgQBzvcwh -DnbkKvbdpyOgfqEY -DnbkKvbdmRxuZsEJ -EObkKvbdmRyUysDi -DnbjjvbdrzMPraIO -EPDLKvbdDxXksssl -EPDLKvbdqUUGrSKt -EPCjjvbdZisIPfbG -EPDLKvbdiGicZVjV -DnbjjvbdqcdiPnVa -DoDLKvbdGKdsCglu -EPCkKvbdYSlBNUOx -DoCkKvbdjmBkyeHP -EObjjvbdKDJcRKDY -EPDKjvbdiLdcmuCy -DoCjjvbdbAvEfQQX -EPDKjvbdegjvRmqH -EOcLKvbdrounibvG -DoCkKvbdliEUQtrB -DoCkKvbdrXPlChyR -DnbkKvbdcyxoxZRC -DoCkKvbdWIYWYHYz -DnbkKvbdmJETptrB -EObjjvbdbBVeGPpX -DoCkKvbdypnliKXA -EOcLKvbdatagXkTh -EPDKjvbdrounjDWG -EPDKjvbdUyHsyjnn -EPDKjvbddZxoxZRC -DnbjjvbdKCjCpjDY -DoCjjvbdKkBHvAJy -DnbjjvbdjbkkRGuH -DoCjjvbdrafNMGjy -DncKjvbdxnTHwsJD -DncKjvbdemFvfmJk -DnbjjvbdIwsbILqQ -EObjjvbdUMWPAvOi -EOcLKvbdGKdsChMu -DoCjjvbdWXIxWEEg -DoCjjvbdvPTzqKnt -DoDKjvbdILazmwRL -EPCkKvbdjlakzFHP -EPDLKvbdKDJbqKCx -EOcLKvbdHELWKBjK -DoCkKvbdOFDshhkE -EPDKjvbdBhkCKhej -DoDKjvbdNddTiJKd -EPCkKvbdVqmwadkc -EPCkKvbdFfKSOItR -EPCjjvbdZshiYcrn -DncLKvbdvAcxsOeI -EObkKvbdKVtfEFHJ -DncLKvbdXsMBNUPY -DoDLKvbdCTAbtGXS -DoDKjvbdRyjHsDWA -DoCjjvbdJcKDRJcY -EOcKjvbdEuxpPljF -DncLKvbduWNxKQsA -EOcLKvbdhuZeXSUb -EObjjvbdjvWnDaxX -EObjjvbdwWlAvAuu -EObkKvbdqquKnLBN -DoDLKvbddCSmSATm -DoCjjvbdwtmEpxlO -DnbjjvbdDoCkLWcE -DncLKvbdwyhGFxEr -EOcKjvbdrykosAgn -DnbjjvbdNeEUJJLE -DoDKjvbdjuwNdCYX -EPDKjvbdiGibyVjV -DnbjjvbdYqNEhmEq -EPDLKvbdxVNEpyLn -DoCjjvbdZeYGzgiC -DoCjjvbdZjTIQGbG -DnbkKvbdSPsfjGEX -EObjjvbdBsBDUGXS -DoCkKvbdsBfNMGkZ -EOcLKvbdLBLGmCXq -EPDKjvbdJTZBTNYM -DnbjjvbdJTZBSmYM -DoDLKvbdjKFgjNYS -DoDKjvbdqlzKYkhJ -EPCkKvbdkWXOECYX -EObkKvbdFkEsDINV -EObjjvbddndsKstS -DoCjjvbdauBfwjsh -DnbjjvbdFjeTCglu -EOcLKvbdfMfWflik -EObjjvbdlYsRryGt -EPCjjvbdtbcVWuoP -DnbjjvbdMgDPmQVL -DoDLKvbdjhHLefNk -EOcLKvbdUsmTfMWK -DoCkKvbdptTfqqjt -EObkKvbdrRuKmjaN -EPCjjvbdzoQQdcMY -DoDKjvbdrpVoKDVf -DoCkKvbdlZSrTYft -DoCjjvbdBhjajiFj -EOcLKvbdzoQQdbkx -EObkKvbdOhAYZAYa -EOcKjvbdjvXNdBww -DnbjjvbdEXwlTtTl -DoCkKvbdzjVPocsU -DoDLKvbdZQldiMeR -DncKjvbdYNqAYVVt -DnbjjvbdtvNxKRTA -EPCjjvbdqceIonWB -EOcKjvbdyXiKCPzL -DoCkKvbdfIKurNpg -DoDKjvbdFxuVAdYC -EOcLKvbdeOdrjssr -DncLKvbdxnShYTIc -EPDLKvbdoznEKwoA -DoDLKvbdptTfrRkU -DncLKvbdkWWnDaxX -EPCjjvbdKWVGDeHJ -EPCjjvbdtumwipsA -DoCkKvbdZxcinDMS -EObjjvbdCWzdIeQW -EPDKjvbdHgGzYwwg -EOcKjvbduDCtvvOo -DnbjjvbdqvokbiZR -DnbjjvbdmIcsptqa -DncLKvbdrJAJdmPF -EPCkKvbdKjaHvAJy -DoCkKvbdhuZdwSUb -EOcKjvbdnPzZVjyC -DoDKjvbdYSlAmUPY -EOcKjvbdffLzNgHA -DncLKvbdptUHRqjt -EPCjjvbdyTNiMqag -DoCjjvbdauBgXkTh -EPCjjvbdbiMikGXY -EOcLKvbdIHGzZXwg -DncKjvbdrXPkcIxq -DnbjjvbdOTTugEuQ -DnbkKvbdjcMKqHUg -DoDKjvbdffMZnHHA -DoCjjvbddijSWUzn -DncKjvbdBhkCKiGK -DncKjvbdJYTbHkqQ -DnbkKvbdqwPlCiZR -DoCkKvbdxUmFRYkn -DoDKjvbdmSZUzTDi -EPDLKvbdkyTSSxft -DoCjjvbdmajXYPOV -EPCkKvbdMowqVnHT -DncLKvbdTppoUuHm -EPDLKvbdgFkymfgA -EObjjvbdhgJcYujV -DncKjvbdtAGqIABS -DoDLKvbdqZOhGpdY -EObkKvbdjbkkRGuH -DoCjjvbdGLEsChNV -DnbjjvbdZoOIeEyj -DncLKvbdbrbjsdJa -EPCjjvbdGGJqmiTq -EPCkKvbdNPxRWNgT -EPCjjvbdJpydnfOF -EOcKjvbdcyxoxYpb -EPDKjvbdmozZWLYb -EObjjvbdVTmUFlVj -DoCjjvbdNrtWGduQ -DncKjvbdqUTfqqkU -DoDKjvbdTfznMWue -EOcLKvbdNsTugEuQ -DoDLKvbdjhHLfGOL -EObjjvbdZtJJYdSn -DoDKjvbdZjTHofbG -DncKjvbduCbtwVno -EPCkKvbdZtIhxcsO -EOcLKvbdnUuZkJqf -EObkKvbdiCPCeXQq -EOcKjvbdZtJIxcsO -EOcLKvbdZRNEhmFR -DnbkKvbdFjdsDINV -DncKjvbdsZlQSaIO -EObjjvbduLxXAtAw -DncKjvbddoFSjtTr -DoCkKvbdmbKXXoOV -DoDKjvbdOAIsTirA -DncLKvbdMfcQMpVL -EPDKjvbdsrqrxzFD -EOcLKvbdZRMdiMdq -EObkKvbdCTAbsfXS -EPDLKvbdtunYJpsA -EObkKvbdYSkaNToY -DoCkKvbdZMRdUOMN -EPCkKvbdIsYaSmYM -DncLKvbdVYgtZkPO -EObjjvbdaNLBsUmH -EOcLKvbdZyEKOCkr -DoDLKvbdOSsufdtp -DoDKjvbdhbPCdvqR -DnbkKvbdiZuFkpnG -DoDKjvbdHDjujCJj -EPDKjvbdCDpBVjMf -EObkKvbdeFOrBwDK -DoDLKvbdhgJbxvJu -EObjjvbdiZuFlQmf -EPDKjvbdeuzwpJzs -EPDKjvbdezuyEhsw -EPCkKvbdJYTbIMQp -DnbkKvbdkIHLeenL -DoCkKvbdAMgyTXZx -DnbkKvbdfIKvRnQg -EPDLKvbdJqZePFnF -DoCjjvbdRjxfVGkT -EOcLKvbdySmhlqbH -DnbjjvbdEYYMUTtM -DoDLKvbdhtydvquC -EObjjvbdZRMdiMdq -EPCjjvbdVZITzLOn -DoCkKvbdmuVZjjRf -DoCjjvbdzoQREbkx -DnbkKvbdkyTSSxgU -DoCjjvbdzRPNIjXA -EPDKjvbdnPyxvLZC -EOcKjvbdSZjHrbvA -EPCkKvbdShyjRABM -EObjjvbdYpmEiMeR -DoCjjvbdFaOqYizm -DncLKvbdEvZQQMjF -DncKjvbdNrtWGeVQ -DoDKjvbdqdFJPmvB -DnbjjvbdRXODblID -DoDLKvbdyzdnRhIh -EPCkKvbdcTCjsdKB -DncLKvbdJcKCqKCx -EObjjvbdmfdwmNgZ -EPDLKvbdqUTgSSLU -EObjjvbdZyEKODLr -EPDKjvbdTppoVVIN -DnbjjvbdFVyPpNJe -EPDKjvbdJYUBhLqQ -EPDLKvbdqceIpOWB -EPDLKvbdiBnbeXQq -DnbkKvbdGZVVBEYC -DncKjvbdGLFTDINV -EObjjvbdUGzmlXWF -EOcLKvbdxrmiMqbH -DoDLKvbdJpzEnenF -EObjjvbdEvYoomJe -DoDKjvbdJqZdoFme -EObjjvbdEuyPpMie -EOcKjvbdmtuZjjRf -EPDKjvbdjKGHilwr -EPCkKvbdpaIeAWgd -DoDKjvbdGZVUaDxC -DoCjjvbdFkErcHlu -EOcKjvbdrbFllGjy -DnbkKvbdMRwMzUpz -DoCkKvbdDxYLtTsl -EOcLKvbdLBKfmBxR -DoCjjvbdVwJYWDeH -DoCkKvbdZoOIdeZj -EPDLKvbdpfEFUWAh -EOcLKvbdKWVGDdfi -EObkKvbdtvNwipsA -DoCjjvbdwuNEqZMO -EObkKvbdfSBWzkbo -EPDLKvbdFxuVAdXb -DnbkKvbdRWnEClHc -EOcKjvbdkCkjqHUg -DoCjjvbdbsDKscia -EPDLKvbdzQoMiKXA -DnbkKvbdRDcApQcr -DoDKjvbdZtIiYcrn -DoDLKvbdqZPHgQdY -EObjjvbdyfxlAMeX -EObjjvbddjJrWUzn -EPDKjvbdjcMLQgVH -EOcLKvbdozmckXoA -EPDKjvbdcJMjLGWx -EPCkKvbdbhlijewY -EObjjvbdrEFJPnWB -EOcKjvbdmuVZjirG -DncKjvbdnBjXYOmu -DncLKvbdjcLjqHUg -EPDLKvbdlhdUQuRa -DoDKjvbdVwIwvEFH -EObkKvbdZMSDsnLm -DoDLKvbdzHZMAMdw -EOcKjvbdZMSDsnLm -DncKjvbdZshhyDsO -DncKjvbdCEPaWJlf -EOcKjvbdxxJKCQZk -EPCkKvbdezvZEiTw -EPDLKvbdypoMiKXA -EPCkKvbdnUuZjjRf -DnbkKvbdFfJqnJUR -DoCjjvbdTpqPUthN -DncKjvbdcyxoxYpb -EObkKvbdCSaCsfXS -DnbkKvbdRacdlIyL -DoCjjvbdTIzKRABM -EPCkKvbdatbGwjsh -EObjjvbdUsltGMWK -DoDLKvbdtvOXjQsA -DnbjjvbdYSlAmUPY -EOcKjvbdwuNEpxkn -EObkKvbdYqMdiMdq -EOcKjvbdnGeXlmgZ -DnbkKvbdqwQLcJYq -EObkKvbduVmxJqTA -EObjjvbdmoyyVkYb -DoDKjvbdBdPaWKMf -DncKjvbdVvhwvEFH -EObkKvbdauBfxLUI -EOcLKvbdMgDQNQUk -EOcKjvbdsQVnjCuf -EObkKvbdjuvnEBww -DoCkKvbdkWXODbXw -EPCkKvbdZyDjNblS -DoDKjvbdZLqdUNlN -DoDKjvbdbLMFoNcA -DoCkKvbdFVyQPmJe -EOcKjvbdhkdcmuCy -EPCkKvbdmtuZjiqf -DnbjjvbdRbEFLiYk -EPCkKvbdySnJMqag -EPDLKvbdhlFDnVCy -DoCjjvbdzoQREblY -EPCjjvbdvBEYroFI -EPCjjvbdJbjCqJcY -DnbkKvbdliEURUrB -DoDKjvbdOTUWGdtp -EOcLKvbdZnmhddzK -EPDKjvbdSBcdkiZL -DoCjjvbdZMRctOLm -DoDLKvbduCcUwVno -DoDLKvbdEzspeMDJ -EPCjjvbdULunaWOi -DoDLKvbdIwsaglQp -EObkKvbdJuuFdFGi -EPCkKvbdQccBQRDr -EPDKjvbdNrsugEtp -EPDLKvbdEXxLtUUM -DoDKjvbdVBCQsRRy -DncKjvbdeFPSCWcK -DoDLKvbdhficYvJu -DncKjvbdkClLRHVH -EOcLKvbduWNxKRTA -EObjjvbdNPwpumgT -DoCjjvbdjmCLzFGo -DncKjvbdZtIhxdSn -EObkKvbdKQyePFme -EPCjjvbdEuxpPljF -DoCkKvbdZtIhyDrn -EPDLKvbdJpzFOfNe -EPDKjvbduaEZTPFI -EPDLKvbdSQTgKFcw -EOcLKvbdBcpAujMf -EPCjjvbdfHkVrOQg -EPCjjvbdKaKflaxR -EObkKvbdZjTIQGaf -EOcLKvbdijGIKMwr -EPDLKvbdvBEZTOdh -DnbkKvbdZRNEhleR -DnbkKvbdijFgimXr -EObjjvbdEASIlywX -DoCjjvbdKaKgNCXq -EPDLKvbdTppoUuHm -EPCkKvbdwzHefYEr -EPCkKvbdhtyeWrUb -DnbkKvbdPyNAGsRj -EPDKjvbdmttzKiqf -DnbjjvbdRacdkhyL -EOcLKvbdeJjRvUzn -EObjjvbdNHCpNQVL -EPCjjvbdgLGzcGAE -DoCkKvbdidkGtoAO -DnbkKvbdKDJcRKCx -DnbjjvbdSQTgKGEX -EPDLKvbdyqPMiJwA -DnbkKvbdLrWlytpz -DnbjjvbdmgExNNgZ -EPCkKvbdlYsRrxgU -DnbjjvbdTkuoAvPJ -EOcKjvbdgFkymgHA -EPDLKvbdmaivxOnV -DnbjjvbdEztQeMDJ -EObjjvbdWfYzUAPT -DnbkKvbdiMEdNuDZ -DoDKjvbdgQBzwEXh -EOcLKvbdSBcdlIyL -DnbjjvbdrMzJxkhJ -DnbjjvbdddnrCXDK -DncLKvbdmbKXXnnV -DnbjjvbdYzbfSKWZ -EPCjjvbdUMWPBVoJ -EPDKjvbdBraDUGWr -DoCkKvbdFkFTDINV -DncKjvbdYkqdTmkm -DncKjvbdmpZyVjyC -DoCjjvbdZisIQHCG -DncLKvbdYqMeJMeR -EPDKjvbdZjTHpHBf -EOcLKvbdcJMikFwY -DoCkKvbdFpATXHGZ -DnbjjvbdVBBqSpqy -DoCkKvbddZyQXxpb -EOcLKvbdqlyiyMHi -EPDLKvbdfMfWgNJk -DoCjjvbdrNZjZLgi -EPCkKvbdeOdsKtTr -EPDKjvbdLrXMytpz -DncLKvbdQvnDcMHc -DoDLKvbdyYJJbPyk -DnbjjvbdrylPsBIO -DnbkKvbdTqROuUgm -DoCjjvbdcyyQYZRC -EObjjvbdbLMFnmcA -EObjjvbdbVCGxKsh -EObjjvbdelfWgMjL -EPDLKvbdnGdwmOGy -EPCkKvbdcTDLTdKB -DncLKvbdUxhTyjoO -EPCjjvbdwzHfFxEr -EPCjjvbdkxrqryHU -DncLKvbdDihJvYKA -EPCkKvbdRzJhScWA -EObjjvbdZHWdAOri -DoDLKvbdjbkkRGuH -DncKjvbdNVSrLNAX -DncKjvbdVqnYCElD -DnbjjvbdFWZPpMjF -DoCjjvbdZMRctNkm -EPCjjvbdRNXaxmtz -EOcLKvbdLZQjSztf -EObjjvbdePFSjssr -EOcKjvbdjbkkRHUg -EPDKjvbdcSbjtEJa -EObkKvbdKQzFPFme -DoCkKvbdnUtzKjRf -DncLKvbdeOeTKtUS -DoCjjvbdpstGqqjt -EOcKjvbdrpWPJcWG -EPCkKvbdwkXDgzyf -DncKjvbdnPyxvLYb -DoCkKvbdpxoIHRDx -DnbjjvbdLFegaaRV -EPCjjvbdrXQLcJYq -DncKjvbdWXJXvDdg -DnbjjvbdQdCaQRDr -EOcLKvbdWWiXuceH -DoCjjvbdbiNJkGXY -EPDKjvbdijGHjMxS -DoDLKvbdTfzmkwVe -EObkKvbdmSZUzTEJ -DnbjjvbdKefHaaRV -DncLKvbddoFSjstS -DncLKvbdSLYfUgKs -EPCkKvbdCIjbLJGK -DncKjvbdKNADzGuB -DoDKjvbdBcpBVjMf -DnbjjvbdpxoHfqEY -DoCjjvbdANHyTWyx -DoDKjvbdFjeSbgmV -DnbkKvbdxwiKCPzL -DncKjvbdqceIpNvB -DnbjjvbdLFfHbAqV -EPDLKvbdtTSTYydc -EPCjjvbdezvYdiTw -EObjjvbdWWiYVdFH -EOcLKvbdZyDjNbkr -EObkKvbdwzIFeweS -EPCjjvbdjmBkzFGo -EObjjvbdGAoRYizm -EObjjvbdjcMLQgVH -DoCjjvbddePRavbj -EOcKjvbdlhcspuSB -EPCjjvbdSCEFMJZL -EObkKvbdEYYLsssl -EObkKvbdpstGrSLU -DoDLKvbdIGgZxwwg -EObkKvbdWIYWYGxz -EPCjjvbdfILWSNqH -DnbkKvbdFWYpPljF -DoCjjvbdVAbRSqRy -EOcKjvbdeEoSCWcK -EOcKjvbdSBceMIxk -DoCjjvbdgFkzOGgA -EObkKvbdbPfgELzd -DnbjjvbdmtuZkJqf -EPCkKvbdYgWdAPSi -EObkKvbdmaiwXoOV -EOcKjvbdjuvnDbXw -DncLKvbdiBoCdvpq -DnbkKvbdZxcjNbkr -EPDKjvbdKfFgaaRV -DoDKjvbdNGcPlouL -EOcKjvbdHlBznXQk -EPCjjvbdKQydoFme -EPCjjvbdDxYLsssl -DoCjjvbdHbLydzAD -DnbkKvbdZisHofbG -DnbkKvbdvvkaWBWV -DncLKvbddxZtUSFz -EPCjjvbdBcpBWJlf -EObkKvbdVBBprpqy -DoCkKvbdaSFcITfL -DoCkKvbdZLqctOMN -EPDKjvbdFWYpQMie -DncKjvbdOEctJIjd -DoCkKvbdEuyQPmJe -DncLKvbdZGwEAOsJ -DncKjvbdlqyUzSci -EOcKjvbdKCibqKCx -DnbjjvbdEOcLKvbd -DncKjvbddneTLUUS -EPCjjvbdhbPDFWpq -DoCjjvbdeAUQmXjG -EPDKjvbdVwJYWDeH -DncKjvbdePFTKstS -DoCjjvbdjggMFemk -EPCjjvbdcScLUDjB -DoDKjvbdZjTIQGbG -EObjjvbdehKurNpg -DncLKvbdbsDLUEJa -EOcLKvbdEJgjWXjA -EPCkKvbdqquKnKaN -DnbjjvbdZjShQHCG -DoCjjvbdCEPaVilf -EObjjvbdzjUpQDrt -EOcLKvbdUVlPjUBR -DnbjjvbdeFPSCWbj -DoCkKvbdKxpirzuG -DncLKvbdrykpTAgn -DoDKjvbdemGXGljL -DncLKvbdTYKlNzkY -DncKjvbduaDyTOeI -EObkKvbdnBjWwoOV -EPCkKvbdGdLWKCJj -EPDKjvbdKeegaaQu -EObkKvbdxnShXrhc -DoCkKvbdsBemLgKy -EPCjjvbdrzLoraHn -EPDLKvbdrRuKmjaN -DncLKvbdmajWxPOV -DncKjvbdKVuGDeGi -EObjjvbdziuQPdTU -DnbkKvbdZxcinCkr -EPCkKvbdlqxtzTDi -EPCkKvbdyzeOSHiI -DnbkKvbdqmZiyMIJ -EOcLKvbdIwtBgkqQ -DncLKvbdfekzOHHA -EPCkKvbdKNADzGuB -EOcLKvbdUaBqSqRy -EPDKjvbdddnrBvbj -DncLKvbdmuVZjirG -EOcKjvbdbBWEepPw -DncLKvbdwjvdHzyf -EPDKjvbdmgFXlmgZ -EPCkKvbdtSqryZeD -EObkKvbdOFEUIhkE -EOcKjvbdiBncFXRR -DncLKvbdxZgeeweS -EPDLKvbdxwiKCPyk -EPDKjvbdHEKvJajK -DncKjvbdrafMlGjy -EOcLKvbdwWlBWBWV -DncLKvbdegjvRmqH -EObkKvbdehKvRmqH -DoDLKvbdUaBpsQrZ -EPDKjvbdRaceMJYk -DnbkKvbdZRNEhldq -DnbjjvbdKCibpjDY -DoDLKvbdKaLGmCXq -DncLKvbdKaKflbYR -DoCjjvbdZQleJNFR -EPCjjvbdZHWdAOsJ -EObkKvbdpxnggRDx -EPDKjvbdiUzFXSVC -DncKjvbdhfjDZWJu -DoCjjvbdYkrDtNlN -EOcLKvbdkVvmdBxX -DnbjjvbdFkFScHlu -DoCjjvbdlrYuZrci -EOcKjvbdrDdiPnWB -DoCjjvbdfoazvcwh -EPCkKvbdtkxWaUAw -EObjjvbdVYgsyjoO -EPCjjvbdssSTZZeD -DoCjjvbdbVBfwjsh -EPCjjvbdVgwuxGxz -EOcKjvbdZoNhdeZj -EPCkKvbdGYttaDwb -DncLKvbdvAcySoEh -DoDKjvbdIGfzZYYH -DoDKjvbdtcCtvvPP -EObjjvbdkxsRryHU -DnbkKvbdJSyBTMwl -DoCjjvbdsPuoJbuf -DnbjjvbdZxcimcMS -DoDKjvbdNGbpMouL -DnbjjvbdSZjHrbvA -DoCkKvbdmRxtysDi -EOcLKvbdZQmEiMeR -EPCjjvbdpfEEtVaI -EPCjjvbdtTRrxzEc -DoCkKvbdZdxGzghb -DncKjvbdrykpTBIO -EPCkKvbdxxIjCPyk -DncLKvbdCEQAujNG -EOcLKvbdrWokbhyR -EPDKjvbdjJehKMwr -DncLKvbdSxLMNzjx -DnbjjvbdZyDinDMS -EObjjvbdZirhQGaf -DncLKvbdkClKqHVH -EObkKvbdfIKvRmqH -DoDLKvbdQvmcblID -EPDKjvbdNsTufdtp -EObkKvbdZRMeIleR -DnbkKvbddwytTrFz -EObjjvbdZxdKODMS -EPCkKvbdSLZFtgKs -EPDKjvbdrovPJbuf -EPCjjvbdHgHZxxYH -EPCjjvbdddoSBvbj -DoDKjvbdegkVqmpg -DoDKjvbdCfkfHAzc -EObjjvbdtvNxJqTA -EPDKjvbdhtyeXSVC -EPDLKvbdUtMtGLvK -EPCjjvbdFaPRYizm -EPCkKvbdVZIUZkOn -EPDKjvbdFeiqnIsq -EObkKvbdddoRbWcK -EOcLKvbdaNLCSuMg -EObjjvbdFpATXGfZ -DncLKvbdrXPkcJYq -EPCjjvbdFjdrcHlu -EObkKvbdUQqPVUhN -DoDLKvbdpxoHfqDx -DncLKvbdypoNIjXA -EPCjjvbdmRxuZrdJ -EPDKjvbdqZPHgREY -EOcLKvbdZGwEAPTJ -DncLKvbdjuwNcbXw -DoCkKvbdTlWPBVoJ -DoCjjvbdRzKIScWA -EPDLKvbdZnnJFEzK -EPDLKvbdqvokbhyR -DnbkKvbdAMhZTWyx -EPCkKvbdqYoHgRDx -EPDKjvbdZtJJZETO -EObkKvbdWRmxBdlD -DnbkKvbdwWkaWBWV -DncKjvbdgKfzcGAE -DncLKvbdtbcUwVno -EOcLKvbdcImJjfWx -DncLKvbdSwjlNzjx -EObkKvbdjblLQftg -DncLKvbdQmYByNtz -DnbjjvbdhlFDmtby -DnbjjvbdcTDKsdJa -EPCkKvbdqUTgSRkU -EOcKjvbdZQleImEq -EOcLKvbdtTRrxzFD -EPCkKvbdUVkpKUAq -DncLKvbdmbJvwoNu -EPDKjvbdrJAKFMne -DncKjvbdpyOhGqEY -EOcLKvbdLrWlzVQz -DnbjjvbdvAdYsPFI -EPCkKvbdDoDKjvbd -DoDLKvbdelfWgMjL -EObkKvbdaMjbTUlg -EObjjvbduVmwjRTA -EPCjjvbdHffyxwwg -DnbkKvbdXrkaNToY -DoCjjvbdZshhyDrn -DoDKjvbdunszqKoU -EPCkKvbdmJDtRVSB -DnbkKvbdcImKLFwY -DoCjjvbdpedEtVaI -DnbjjvbduMXwAtBX -EPDLKvbdhbPDFWpq -EPCjjvbdrDdiQNua -DnbkKvbdKxpirzuG -EObkKvbdcTCjtEJa -DncLKvbdZQmFIldq -DoCkKvbdqUUGrRkU -DnbkKvbddZyQXyRC -DncLKvbdIryBTNXl -EPDKjvbduaDxrneI -DoCkKvbdZMSDsmlN -DoDKjvbdrovOjCvG -EOcLKvbdhyuFkpmf -DoDLKvbdddnrBwDK -DncKjvbdDwxLstTl -EPDLKvbddZxpXxpb -DoDKjvbdCSaDTewS -EPCkKvbdVqmxBeLc -DoCkKvbdZMSEUNkm -DnbkKvbdznopdcMY -EPCjjvbdqYoHgQcx -EPCkKvbdlhdUQuRa -EObjjvbdauBgYLUI -EObjjvbdySnJMrCH -EObjjvbdkIGlGGOL -DoCkKvbdwXMAvBWV -DnbjjvbdiCOcFXRR -EPCkKvbdIHGzZYXg -EPDKjvbdiMFDmuCy -EOcKjvbdtlXvaUBX -DoDLKvbdhfibxuiu -EPCkKvbdqwQMChxq -EObkKvbdRkYeuGjs -DoDKjvbdYkrEUNlN -EPDKjvbdZshiYcsO -DnbkKvbdQlxBxnUz -DncKjvbdSPtGifEX -DoDLKvbdmajXXoNu -EObjjvbdHbMZdzAD -EPCkKvbdZyEKNblS -EObkKvbdKfFgbBRV -EOcLKvbdOTUVgFVQ -DoCkKvbdfMevgMik -EPDKjvbdptTfrSKt -DnbkKvbdxZhFexFS -DncLKvbdUaBqTQrZ -DoCjjvbduDDUwWPP -DoDKjvbdNsUVfduQ -EObkKvbdvOszpjoU -EObkKvbdNsTvGdtp -EPDKjvbdxwhiapZk -DoDKjvbdiGjCxvJu -DoDLKvbdxxIibPyk -DncKjvbdvAdYroFI -EOcLKvbdLAkGmBwq -DncLKvbdIsYaTMxM -EPDLKvbdFejRmiUR -DoCkKvbdbrbjscia -DoDLKvbdiHJbyWJu -EOcKjvbdIwtBhMQp -EObkKvbdpfDdtVaI -EObjjvbdfMevfmJk -EObjjvbdptUHRrLU -EPDLKvbdYgXEAOri -EObkKvbdZoOJEeZj -DoDKjvbdqUUGqqjt -DnbjjvbdxnTHwriD -EPDKjvbdfHkWRmpg -EPDLKvbdePEsLUUS -EPCjjvbdEPCkLXDE -DoCjjvbdgQBzvdYI -DoCkKvbdZjSgogBf -EObkKvbdtunYKQsA -EPDKjvbdezvYdiTw -EPDLKvbdLBLGmCYR -EObkKvbdSLYfVHKs -EPDKjvbdfILWSNqH -EObjjvbdqlyixkhJ -DoCkKvbdjKFgjNXr -DoDLKvbdyzdmrHhh -DoDLKvbdYpleImEq -DoDKjvbdUxgtZkPO -EPDLKvbdJKEAKPgE -DoDKjvbdRXODblHc -DoCkKvbdmozYujxb -EOcKjvbdMgCpMouL -DncKjvbdZsiJZESn -EPCkKvbdzROmIiwA -DnbkKvbdEOcLKvbd -EPCjjvbdpxoIHRDx -DnbkKvbdEJgivXjA -DoDKjvbdfHjurOQg -EObjjvbdyYIjCPzL -DoCjjvbdvlvANEEm -DncLKvbdOXoVzdOU -EObkKvbdatagYKtI -DnbkKvbdGYtuAcwb -EObkKvbdegjuqnRH -DnbkKvbdtumxKQsA -DnbkKvbdIxTbILqQ -DncKjvbdIsZBTMxM -EPCjjvbdRjyFuHLT -EOcKjvbdJXtCIMQp -DoDKjvbdYkqdUOLm -EObjjvbdZsiIyESn -DnbkKvbdhtyeWrUb -EPCjjvbdEuyQPmKF -EOcLKvbdeFOrCWcK -DoDLKvbdEvYpPlie -DoCjjvbdZtJIyETO -EPCjjvbdrWokcJYq -DoDLKvbduaDySneI -DncLKvbdsPunjCuf -EObkKvbdpyOhGpcx -EObkKvbdliDsqUqa -DoDLKvbdhaoCeXQq -DncLKvbdaRfChUFk -EOcKjvbdYTMAlsoY -EPCkKvbdfkGzbfAE -EOcKjvbdURQnttgm -DoDLKvbdDoCjjvcE -DncLKvbdCJKbLJGK -EPDKjvbdhlFEOVDZ -DnbkKvbduCcVWvOo -EPCjjvbdQdDBPpcr -EObkKvbdbBVdeopX -DnbkKvbdWHwuwfxz -DoDLKvbdsrqrxzFD -DoDKjvbdCSaCsfXS -DoCkKvbdNPxQunGs -EPDLKvbdyzeNrHhh -EObjjvbdWXIwudFH -EPCjjvbdKWVFceHJ -EOcLKvbdqwPlCiZR -DncLKvbdyOTHwsJD -DncLKvbdxUleRZMO -DnbjjvbdZHWdAPTJ -DoDLKvbdePEsKstS -EPDKjvbdHDkVjBij -EObjjvbdSPtHJecw -EObjjvbdyTOJNRag -EOcKjvbdhfibxuiu -EOcKjvbdRDbaPqES -DnbjjvbdemGWflik -DoDKjvbdwjwEHzzG -EObjjvbdsCGNMGjy -DnbjjvbdssRsYyeD -DoDKjvbdJvVFceGi -EPCkKvbdLZQjSzuG -DoDLKvbdqUUHSSLU -EPCjjvbdaaWEeoow -EPCjjvbdDjHiuxKA -EPDKjvbdZQmFIleR -DoDKjvbdRDbaPpdS -EPCjjvbdZoOJFFZj -EObjjvbdQmYBxnUz -EPDKjvbdKCibqKDY -DoDLKvbdsCFmMGjy -DncKjvbdKaKgMaxR -DoCjjvbdrMzJxkhJ -EObkKvbdeKKRutzn -EPCkKvbdcTCjscjB -EPCkKvbdZsiIyDrn -EObjjvbdnBjXXoOV -DoDKjvbdBiKakIfK -EOcKjvbdRpTfjGEX -DoCkKvbdtSqrxydc -EObkKvbdHDkVjBij -DncLKvbdqTsgSSLU -DncLKvbdzdzOzdzQ -DoDLKvbdVrNwadlD -DncLKvbdSQUGifEX -DncLKvbdxxJKBoyk -EPCjjvbdrzLpSaIO -DnbkKvbdhtyeXRuC -DoDKjvbdyTOImSBg -EPDLKvbddZxpXxqC -DoCkKvbdZMSDsnLm -DncLKvbdEARhlzXX -EPDKjvbdkWXOECYX -EObkKvbdSLYetgLT -EPDKjvbdTfznLvvF -DoCjjvbdSZjHrcWA -DncKjvbdmJDsptqa -EOcLKvbdZxdJmblS -DnbjjvbdKWUfDeHJ -EPCkKvbdLiBkpxAS -EObkKvbdePFSkTtS -DoDKjvbdYzbfSKWZ -EPCjjvbdvAdYsPFI -EObkKvbdTAFJIBnd -DnbkKvbdsZkpSaHn -DoDLKvbdczZQYZRC -EPDKjvbdTvMQKTaR -DnbkKvbdyYJKCQZk -EPCkKvbdVAaqTQqy -EOcLKvbdbPfgDkzd -EObkKvbdePErjssr -EPDLKvbdyTOJNRag -EPDLKvbdyTNiNSBg -DoCjjvbdqvpMCiYq -DoDKjvbdRpUHKGEX -DoCjjvbdDoCkLWbd -DncLKvbddCTNSATm -DoCkKvbdcSbkUEJa -EPDLKvbdzjVPocrt -DnbkKvbdxVNFQyLn -DnbkKvbdSKyFtfkT -DoCkKvbdmpZxukZC -DncLKvbdGFjSOJTq -EOcKjvbdhkdcmtcZ -DoCjjvbdyzeORghh -EPCkKvbdRbDeMJZL -DoDLKvbdZMRctOMN -EObjjvbdAMgySvyx -EOcLKvbdTYLMNzkY -DnbjjvbdmuVZjjSG -DnbkKvbdZsiIyDrn -EPDLKvbdjEjfuPAO -DoCjjvbdkxrrSxgU -DncKjvbdSLYfUfkT -DnbjjvbdBcpAvJmG -DoDLKvbdSPsgKFcw -DoCkKvbdrXQMDIyR -EObkKvbdKVuFdEfi -DnbkKvbdrSVLOLBN -DoDKjvbdZnmhdeZj -DoDKjvbdNHDQNPuL -DoDKjvbdpyOggREY -DoCkKvbdQvmcblID -EPCkKvbdMfbomQVL -EPCjjvbdNVTRjmAX -EOcKjvbdbhlijevx -EObkKvbdWWiXvEFH -DncKjvbdlqyVZrdJ -DnbjjvbdrSUkNjaN -DncLKvbdmSZUzTDi -EObjjvbdZQmEhmEq -EOcKjvbdiLdcnVDZ -EObkKvbdySmhlqag -DnbjjvbdbUagYLTh -DncKjvbdBdQAvKNG -DncLKvbdyzdnRghh -EObkKvbdLZRKSztf -DoDLKvbdRXOEDMHc -DncKjvbdFkFSbgmV -EPCjjvbdZQldiMeR -EPDLKvbdFfJqmiTq -EOcLKvbdpssgRrKt -DnbjjvbdKRZeOeme -DnbkKvbdnPzYvLZC -DoDLKvbdUVlQJsaR -EPCjjvbdqFceTvAh -EPDKjvbdEARhlyvw -EPCjjvbdNGbolotk -DoCjjvbdVhYWXgYz -DoCjjvbdUtMtFkvK -DncKjvbdZQldhleR -DnbjjvbdCEPaWKMf -EObjjvbduWOXjQsA -EOcKjvbdIjEAKPfd -DoCjjvbdURRPUuIN -EObkKvbdbhmKKfWx -DoDKjvbdxrnJMrCH -EObjjvbdGFirNiTq -DoDLKvbdtSqsZZeD -EPDLKvbdKkAhWAJy -EPCkKvbdbVBgYKsh -DoCjjvbdKWVFdFGi -EPDKjvbdwXMAuaWV -DoCkKvbdRXNdCkhD -EPCjjvbdZRMdhmEq -DncLKvbdcJMijfWx -DnbkKvbdZRNEiNFR -EObjjvbdAMhYrvyx -EPDLKvbdijGIJmXr -DoCkKvbdbhmJjfXY -EOcLKvbdrzMQTBHn -DnbkKvbdKVtfEEfi -EPCkKvbdxVNFRZMO -EPDLKvbdjcMLQgUg -EObjjvbdjuwODbXw -EObkKvbdZeXfzhJC -EPCkKvbdUyITyjoO -EPCkKvbdGFjRnIsq -DnbjjvbdIwsbHlRQ -DncKjvbdtTSTYzEc -EPDKjvbdhfjCyWKV -DoCjjvbdhytelQnG -DoDKjvbdxnTHxTIc -EOcKjvbdUQqPUtgm -EPDLKvbdkNCMZdgP -DnbkKvbdGKeTDINV -EOcLKvbdZMRcsmlN -DnbjjvbdRXNdCkgc -DoCjjvbdRXNccMHc -EObkKvbdRjyFuGjs -EPDLKvbdmJDtRUrB -DoDLKvbdpyPIGpdY -EPCjjvbdkNCLzEgP -DoDLKvbdZoNiFEzK -DoDKjvbdKVuFcdfi -DoDKjvbdqZOggQdY -EPCkKvbdSQTgJecw -EOcKjvbdrRuKnLAm -EObkKvbdbUbHYLUI -EOcLKvbdyNrgwsJD -DoDKjvbdegkVqnQg -DnbkKvbdGBOpxizm -EObkKvbdJbjDQicY -DncLKvbdSLZFuGjs -DoCkKvbdGckVibJj -DoCkKvbdzeZnzdyp -EObjjvbdxxJKCQZk -EObjjvbdJpzFPGNe -EPCkKvbdUsltGLvK -DoDLKvbdziuQQDsU -DncLKvbdRzKIScWA -DoCkKvbdSLYfVGjs -EPCjjvbdhgKDYujV -DoDKjvbdtunXjQsA -EPDKjvbdqceJPnWB -DncKjvbdUQqOuUhN -EOcKjvbdJvVFceHJ -EPCkKvbdMfcPmQVL -EObkKvbdNrsufdtp -DncLKvbdUQpnuUhN -DncKjvbdYkqdUOMN -EObkKvbdqceJQNvB -EPDLKvbdCWzdJFPv -DncKjvbdauBfxLTh -DncKjvbdZnnJEdyj -DncLKvbdEvYpPlie -DoDLKvbdhaoCdvpq -EObkKvbdCEQBVimG -EOcKjvbdBiKbKhfK -DnbkKvbdeuzwpJzs -DncLKvbdhlEcnVDZ -EObkKvbdkCkjpftg -DncKjvbdZQldhmEq -DoDKjvbdFyVVBEXb -DncKjvbdZirgogCG -EPCkKvbdWXJXvEFH -DnbkKvbdOStVfduQ -DnbkKvbdNGbpMouL -EObkKvbdcIljKfXY -DoDLKvbdXrlBMsnx -EOcLKvbdfNFwGmJk -EObjjvbdUQqPUuHm -DnbjjvbdEXxLtUTl -EPDKjvbdLGFhCBQu -DncKjvbdTYLLmzkY -DoCkKvbdkaNPNALA -DoCjjvbdFxtuBDwb -EPDLKvbdGGJrNhsq -DoCkKvbdZyEJnDLr -EObkKvbdDxXlTssl -EPCkKvbdGKdrbglu -EOcLKvbdmoyyVjxb -DnbkKvbdRNYByNtz -EObjjvbdGFirOItR -DoCjjvbdxUmFRZLn -EPCkKvbdsQWPJcWG -EPCjjvbdegkWSORH -DncLKvbdYzcGRjVy -DoCkKvbdRXNcblHc -EObkKvbdwtldqYkn -DnbkKvbdZisHpGaf -EPCkKvbdGQASvfey -DnbjjvbdeFPRavbj -EOcLKvbdGZVVBEYC -EPCkKvbdKDKDQicY -EPCkKvbdUsmUFkuj -DoCkKvbdatbHXjtI -EObkKvbdlrYtyrdJ -DnbjjvbdjKGHilwr -EOcKjvbdjlakyeGo -DoDLKvbdnPzZVkZC -DnbjjvbdCIjbLJFj -DoCkKvbdegkWSORH -DoDLKvbdjvXODbYX -EPDKjvbdaaVeFoow -DncKjvbdwtmFRZLn -EObkKvbdkNCLzEfo -DncLKvbdrbGMlGkZ -EObjjvbdczZQXxqC -DoCkKvbduaEZTOdh -EObjjvbdZxcjNbkr -EOcKjvbdCJKbKiFj -DnbjjvbdjEkGuPAO -DnbjjvbdZshhyDsO -DoDLKvbdbsCkUDjB -DoCkKvbdNddUIhkE -EPDLKvbduVnYJpsA -DnbjjvbdQvmccMHc -DoDKjvbdDjIKWXjA -DoDLKvbdxZhGGYEr -EObkKvbdqquKmkBN -EObjjvbdLBLHMawq -DoDLKvbdrbFmLgLZ -EPDLKvbdddnrBwCj -DoCkKvbdbrcLUEKB -DoDKjvbdqlyjYlHi -DncKjvbdQwNdDMID -EObkKvbdBiLCKhej -EPCkKvbdSZigsDWA -DnbkKvbdwuNFRYlO -EPDLKvbduCbtvvOo -DnbjjvbdaaWFFpPw -EObkKvbdRECaQQdS -DncKjvbdyOShXsJD -EPCkKvbdFVyPomJe -DoDLKvbdcJMijevx -EObkKvbdSZigsCvA -EObjjvbdrNZjYlHi -DnbkKvbdKfFhBaRV -EPDLKvbdSLZFtgKs -EPDLKvbdrbGNMGjy -EPCjjvbddwzTtSFz -DoDLKvbdnGdxNNgZ -DncLKvbdTfzmlWue -EOcKjvbdbLLfOmcA -DoDLKvbdNGcQNPuL -DncLKvbdUaCQsQqy -EPCjjvbdCfkfHAzc -EPDKjvbdlrYuZsDi -EPDLKvbdmajXYPOV -EObjjvbduCcUvvOo -DoDLKvbdJXsahLqQ -EPCkKvbdOSsugEuQ -DnbkKvbduaDyTOeI -DncLKvbdYqNEhldq -EOcLKvbdeOdsKtUS -EOcKjvbdkHgLefOL -EPCkKvbdrpVoKCuf -EObjjvbdShzJqAAl -DnbjjvbdgPazwDxI -EPDLKvbdEztQdlDJ -DoDKjvbdYpmFImFR -DncLKvbdsBellHLZ -DoCjjvbdatbHYKsh -DoCjjvbdptTgRrLU -EOcLKvbdznpRFCkx -EPCjjvbdWWiYWEFH -EPCjjvbdRosgJedX -DnbjjvbdkIGkefOL -DnbjjvbdiZuGLqNf -EPCkKvbdANIZTWyx -EObjjvbdZQmFJMdq -EObkKvbdjvWmcbYX -DncLKvbdRbEFMJYk -EOcKjvbdpfDdtVaI -EPDKjvbdJqZePFnF -DnbjjvbdeFOqavcK -DoCjjvbdnHFXlnHZ -EPCjjvbdTvLpKTaR -EPDLKvbdVgxVxHYz -EObkKvbdZRNFJMdq -EPDLKvbdbUafwkUI -EObjjvbdKCjDQibx -EPDLKvbdrXPlChyR -DoCjjvbdxsNhlqbH -DoDKjvbdNGbomPtk -EPDLKvbdLBLGmBwq -DncLKvbdIsZBTNYM -EPDLKvbdOXnuzcmt -EPDKjvbdKDJcRJcY -EObkKvbdiBncFWqR -DncLKvbdlhcsqUrB -DncKjvbdrylQTAgn -DoDLKvbdTlWOaWOi -EPCkKvbdegjurNpg -EObjjvbdyTNhmSBg -EPCjjvbdQccBPpcr -EPDKjvbdeOeSkTtS -DoCjjvbdGYuVAdXb -EObjjvbdrzMPsAhO -DncLKvbdrEFJQOVa -EPCjjvbdbhmKKfWx -EPCkKvbdeYZssqez -DnbkKvbdURQntuHm -EPDLKvbdkDLkRHVH -EOcKjvbdlZSrSxft -EObkKvbdijGHimXr -EOcLKvbdpxnggQdY -DncKjvbdJKEAJpGd -EPCjjvbdMowpumfs -DoCkKvbdmSYtysDi -DoDLKvbdBsBDTfWr -EPDLKvbdrMzKZMHi -DnbkKvbdBraDUGWr -DnbjjvbdDxYMTtTl -DncKjvbdFyUuBEYC -EPCkKvbdVZITzKnn -DnbkKvbdTkvPBWPJ -EObkKvbdSQTfjFdX -DoCjjvbdZisIPgBf -EPCkKvbdLGFhCAqV -DoCjjvbdNGcQNPuL -DoCkKvbdqlzJyMIJ -EObjjvbdZtIiZDrn -DnbjjvbdeEoRawCj -DoDKjvbdUaBqSqRy -EOcLKvbdmfdwmOGy -DoDKjvbdptTfqrKt -DoDLKvbdvAcxsPEh -DoCkKvbdySmhmRbH -EOcLKvbdhfjDZWKV -EOcKjvbdHffzZXxH -DoDKjvbdLFfHaaQu -EPCjjvbdgFlZmfgA -EOcKjvbdtcCuXVno -DoDLKvbdZirgpGbG -EObjjvbdNsUWHEuQ -DoDLKvbdsBfNLgKy -DoDKjvbdGGKRnJUR -DoDLKvbdKkAhWAKZ -DnbjjvbdOFDtJJKd -EPCjjvbdMuSrKmAX -DnbjjvbdyXiKBpZk -DncLKvbdOFDtIhjd -DoDKjvbdNPxQumgT -DnbjjvbdrSVLOKaN -EPCjjvbdmJDtRVRa -EPCkKvbdZeXfzgiC -DoDKjvbdhaoCdwRR -DncKjvbdiBncFXRR -EPDLKvbdvBEYrndh -DnbjjvbdBiLBkIfK -EPDLKvbdhgJbyVjV -DncKjvbdzRPNIiwA -DnbjjvbdegjvRmpg -DncLKvbdyYIibQZk -EPCkKvbdxnTIXrhc -EPCkKvbdhkeEOUby -DnbkKvbdjJehKMxS -DoDKjvbdkVwODbYX -EPCkKvbdFWYpQNKF -EPCjjvbdXrkaMsnx -EPDKjvbdRjxetgLT -DoDKjvbdEztRFLbi -DnbkKvbdqdFJQNua -EPDLKvbdTqQntthN -DoDLKvbdYORAXtvU -DnbjjvbdEYXksstM -EPDKjvbdkMbMZdfo -DncLKvbdJKEAKQGd -EOcKjvbdFejSOJUR -DoCjjvbdYlRdTmkm -DoDKjvbdlYrqrxgU -EPDKjvbdKVuFdFGi -EOcLKvbdJqZeOfNe -DnbkKvbdzoPpdcLx -DoDKjvbddePSCXCj -DoDKjvbdEASIlywX -DoCjjvbdrEEiPmua -EPCkKvbdidkGuPAO -EObjjvbdKRZdnfNe -DncKjvbdhgJcZWJu -EPDLKvbdZxcimbkr -EPDKjvbdNeEUIiKd -EOcKjvbdvAdZSndh -DncLKvbdjggMGGNk -EObkKvbdOStVgFUp -EPCkKvbdRaceMIxk -DncKjvbdDwxMUUUM -DncKjvbdWeyZtAPT -EPCjjvbdEYXkstTl -EOcKjvbdxsOJNSBg -EPCkKvbdKQzFPFnF -EOcLKvbdJXtCHkpp -DoCjjvbdtlYXBUBX -EPCjjvbdwuNFRYkn -DoDLKvbdkDLjpfuH -EPDKjvbdxrmhlqbH -EOcLKvbdjmCLzEgP -DoCjjvbduaEYsPFI -EPCkKvbdCEPaWJmG -DncKjvbdwtmEpxlO -EPCkKvbdJbjCpjCx -DnbjjvbdhzVGMRNf -EPCkKvbdZxcinDMS -DoCkKvbdrNZiyLgi -EOcLKvbdIHGyyYYH -EObkKvbdYNqAXuWU -EPDKjvbdtvNwjRTA -EPCkKvbdcJMjLFvx -EPCjjvbdNrsvHEuQ -DoCjjvbdnGeYMmgZ -DoDLKvbdSLZGUfjs -EPDKjvbdtvOYKRTA -DoDKjvbdziuPpESt -DoCkKvbdMgDPlotk -DoCkKvbdeFOrCXDK -DnbkKvbdMgColpUk -EPCkKvbdKVuFdFGi -DoDLKvbduCcUvuoP -DoCkKvbdRDcAopdS -EPDLKvbdehKvSNpg -EOcKjvbdDoCjjvbd -DoCjjvbdOSsufdtp -EObjjvbdGQASwGfZ -DncLKvbdiHJcYujV -DncKjvbdRadFMJZL -EPDLKvbdZxcinDLr -EPDLKvbdhaoDFXQq -DoDKjvbdcJNJkGXY -DoDLKvbduaDySoEh -EOcKjvbdUxhUZkPO -DncLKvbdVYhTzKoO -DnbjjvbdehKvRnQg -DnbkKvbdOhAXyAYa -DncLKvbdxsNiNRag -DoDLKvbdTppoVUgm -EObkKvbdURROuVIN -EOcLKvbdNsTugFVQ -DoCkKvbdrXPlChxq -EPDKjvbdHDkWJajK -DoCkKvbdxnTHxTIc -EPDKjvbdEvZPoljF -EPDKjvbdrzMQTBIO -EPCjjvbdqZPHgQcx -DoCkKvbdVqmxCFMD -DncLKvbdSPsgKGEX -DoCkKvbdzjVPodSt -DoDKjvbdnUtyjiqf -DnbjjvbdIBkydzAD -DoDKjvbdcTDKscjB -EOcKjvbdiHKDYuiu -DncKjvbdBraDUFvr -DoCjjvbdQmYCZOUz -EPCkKvbdySnIlqbH -DnbkKvbdkDLjqGuH -DnbjjvbdVqnYCFMD -DncLKvbdGKeTCglu -DncKjvbdlZSqrxft -DncLKvbdrEEhpNvB -EOcLKvbdrDeJQNvB -EPCkKvbdQmXbYmtz -DoCkKvbdQlxCYnUz -EPCjjvbdEObkLWbd -EPDLKvbdehKuqmqH -EPCkKvbdkCkjpfuH -DncKjvbdRXNcblHc -EPCjjvbdsrqrxydc -EPDKjvbdddoSBvcK -EPCjjvbdADRxJzIp -EPDLKvbdvAcxsPEh -EPDKjvbdSLYfUgLT -DoCkKvbdsrrTYyeD -DoCkKvbdLFegbApu -EPCjjvbdyqOliJwA -EPDKjvbdqTtGrRjt -EPCkKvbdhbObdvqR -EPCjjvbdcScLUEJa -DoDLKvbdRWnDblID -EObkKvbdZLrETnLm -DoDKjvbdiBoDEvpq -DoDKjvbdMpXqVmfs -EPCjjvbdpxngfpcx -DncKjvbdsCGNLfjy -DncKjvbdRjyGVHLT -EPDKjvbdkHflGFmk -DoDKjvbdlhdUQuSB -EPCjjvbdKaLGlbXq -EPCkKvbdVhXvXgYz -EOcLKvbdKyQirztf -EOcLKvbdliDsqVRa -DncKjvbdJutfDdfi -DoDKjvbdEXwksssl -DncLKvbdxxIjCPyk -EObkKvbdKaKgMaxR -EPDKjvbdkCkjpgUg -EOcLKvbdZLqctNlN -EPDKjvbdNddThhjd -EOcKjvbdYlSDsmlN -EPDLKvbdmgExNOGy -DoDKjvbdePErjstS -DnbkKvbdZQleIldq -DncKjvbdpssfrRkU -EOcKjvbdDxYMTtTl -EPCjjvbdySmhmSBg -EPDKjvbdiiehJlxS -EOcLKvbdFkFTDINV -EPCjjvbdVqmxCFMD -DncLKvbdIsZAsMwl -DncKjvbdBraDTfXS -EPDKjvbdmuUykJqf -DnbkKvbdFyVUaEXb -EObjjvbdzROmJJwA -DncKjvbdEYXlUUTl -EPDKjvbdBhjbKhfK -DoCjjvbdJpzEneme -DncLKvbdVwIwuceH -EPDKjvbdhfjDYuiu -EOcLKvbdFpASwHGZ -EPDKjvbdZoOJEdyj -DoDKjvbdqdEiPnWB -DoDKjvbdnBjXYPNu -DoCjjvbdiHKCxuiu -EOcKjvbdGLFTChMu -EOcKjvbdiMEdNtby -DnbkKvbdGdKujBij -DncKjvbdKQydneme -DnbkKvbdziuPocsU -DoDKjvbdmfdxNNgZ -EObjjvbdDxXlUTtM -EObjjvbddePSBwCj -EOcKjvbdNPxQvOHT -DnbkKvbdZHWdAOsJ -EPDLKvbdyqPNIiwA -DoCkKvbdpyPHfqDx -EPDLKvbdUslsekuj -EPCjjvbdiZtfLpnG -DoCkKvbdmSZVZsDi -EPCjjvbdpyOhGpcx -EPDLKvbdzitoodSt -DoDKjvbdVYhUZkOn -EObkKvbdBsAbtGWr -EPDKjvbdvBEYsOdh -EObkKvbdGcjuibKK -DncKjvbdeATqNYKG -DoCjjvbdKNAEZgVB -DncLKvbdqUUHSRjt -EOcLKvbdGcjuibJj -DoDLKvbdnBivxPOV -DnbkKvbdKCjDRKCx -DnbkKvbdrykosAgn -EOcKjvbdUaBqTRRy -EPCjjvbdcSbkTcjB -DoDLKvbdIxTbILpp -DoCjjvbdHDjuibJj -DncKjvbduaDxroFI -DoDKjvbdpedEtWBI -EOcKjvbdXsLaNTnx -EPCjjvbdYORAYVWU -DoCjjvbdYpleIleR -DoDKjvbdCDpAujMf -EPCkKvbdpxoHfpcx -DoCkKvbdUWMPisaR -EPCjjvbdmuUzKjSG -EPDKjvbdkxsRsYgU -EPCkKvbdZxcjNblS -DnbkKvbdbPffckzd -EPDKjvbdUVkpJtBR -DoCkKvbdvlvANEFN -EObkKvbdShyjRAAl -EPDKjvbdxrmhmSCH -DoDKjvbdjvXNcaww -EPDKjvbdkDLjqGuH -EObkKvbdhfibxuiu -EPCjjvbdlqyUyrci -EPDLKvbdFVxopMjF -EOcKjvbdqdEiPnWB -DncKjvbdrXPlChxq -DoCkKvbdxVMeRYkn -EPCjjvbdlhdUQtqa -EObjjvbdRotHKFcw -EObkKvbdwjvcgzzG -EPDLKvbdBhkBjiFj -EObjjvbdlZTSTZGt -DoCkKvbdkIHMFemk -EObjjvbddndrkTsr -DoDLKvbdFVxpQNKF -EPCjjvbdZsiJZETO -EObjjvbdiMFEOUby -DoCkKvbdhlFEOUby -EPCkKvbdrWolDIyR -EObjjvbdmajWwoOV -DoCkKvbdypoMiJwA -DoDKjvbdCDpAvKMf -EPDLKvbdzjVQQDrt -EObjjvbdjlakydfo -EObkKvbdJpyeOeme -DoDLKvbdiHJcYvJu -EOcLKvbdbsDKtEKB -EOcLKvbdrpWOjDVf -EObjjvbdelfWfmKL -EObjjvbdxnSgwriD -DnbkKvbdqlyjZLhJ -EPCkKvbdQdDBPqDr -EPCkKvbdRkYfUfjs -EObjjvbdhtydwSVC -DnbjjvbdWWhwvDdg -DoDLKvbdypnliKXA -DncLKvbdhfibxvKV -DncLKvbdxrmiNSCH -DncKjvbdUaBqSqRy -DoDKjvbdZMSDsmkm -DncLKvbdFjeScHmV -EPDLKvbdQYmAHSrK -DoCkKvbdUVlQJsaR -DoDKjvbdGKdsDHmV -EPCkKvbdkHgLfGNk -EPDKjvbdCIkCLJFj -DoCkKvbdrpWOicVf -DncLKvbdqmZiyMIJ -EObkKvbdNGcQMpUk -EOcLKvbdhfibxuiu -DoCjjvbdjcLjqHVH -EPDLKvbdZxdJnDMS -DncLKvbdHDkViajK -EPDKjvbdhytelRNf -EPDKjvbdZRNFIleR -EObjjvbdNQYRWNgT -EPCjjvbdNdcsiIkE -DoCkKvbdajkfOnDA -EPCjjvbdRNYCZOUz -EPCkKvbdBcpAvKNG -DncKjvbdqTsfqrLU -EPCjjvbdsZlQSaHn -EOcKjvbdqdFIpNvB -DoCjjvbdtbcUwWPP -EObjjvbdEYYMTtTl -EOcLKvbdgGLzNfgA -DoDLKvbdzdynzeZp -DnbjjvbdajlGPNcA -EPCjjvbdEJhJuxKA -EPCjjvbdLLBIWAJy -DnbkKvbdwzIFewdr -DoCkKvbdBvzciEpW -DoDKjvbdaNKasVNH -EPDLKvbdVviXudEg -EPDKjvbdcbSmSAUN -EPDKjvbdqcdiQNua -EPCkKvbdbBVdfPpX -EOcLKvbdrEFIpOVa -DoDKjvbdDigivXjA -DoDKjvbdYSlBMtPY -DoDKjvbdrRtjnLAm -DoDKjvbdKeegbApu -DnbkKvbdHgHZyXxH -EPCkKvbddwzUTrFz -DnbjjvbduDCtwWPP -EOcLKvbdaRfDHsfL -EPCjjvbddeOqbWbj -DncLKvbdOFDsiJLE -EObkKvbdSBceMIyL -EOcLKvbdrylQSaIO -DncLKvbdJcJcQjCx -EPCkKvbdaRfCgsek -EOcKjvbdzitoocsU -DoDKjvbdyzdnSIJI -EObkKvbddndsLTsr -DoDLKvbdcTDKtEKB -EPCkKvbddZyQYYpb -EPDLKvbdCIjakJFj -DncLKvbdLrWlzVQz -EOcKjvbdxrnIlqag -DncLKvbddeOrCWcK -DoCkKvbdRaceLiZL -EPCkKvbddePSCXCj -DoDKjvbdJpzFOeme -DoCkKvbdiMFEOUby -DncKjvbdUQqPVVHm -EOcLKvbdcSbjscjB -DnbjjvbdvPTzpjoU -EPDKjvbdEPDLKvbd -DncKjvbdvBEYsPEh -DnbjjvbdIxTbIMQp -DoDLKvbdZLrETnMN -EPCkKvbdZxdJmbkr -EPCjjvbdIidAKQHE -DncKjvbdrSUjmjaN -DnbkKvbdkaNOmALA -DnbkKvbdiGjCyViu -EPCjjvbdYkrDsmlN -EOcKjvbdypoMhjXA -DoCkKvbdiGjDZViu -DoDLKvbdZxcinClS -DoCjjvbdqUUGrSLU -DnbkKvbdYTLaNUPY -EObkKvbdehKurNpg -EOcKjvbdmRyVZrdJ -EObkKvbdZirhPgBf -EOcKjvbdpyOggQcx -DnbkKvbdfoazwEXh -DnbkKvbdmuUzLJqf -EPDLKvbdYlRdUOLm -DncKjvbdRjyFuGjs -DoDLKvbdQdDAopdS -DoCkKvbdmSYtysEJ -EObjjvbdQdDApRDr -DoDKjvbdyOTHxShc -EPDKjvbdptUHSRkU -EOcKjvbdLGGHaaRV -EOcLKvbdaaWFFopX -DoCjjvbdlBMnmALA -DnbjjvbdZnnIdeZj -DoCjjvbdZMRdUNkm -DoDLKvbdRMxByNtz -EPCkKvbdJYTahMRQ -DncLKvbdpyPIHQdY -DoCkKvbdVBCRTRRy -EOcLKvbdZyEKODLr -EObkKvbdRadEkiYk -EOcKjvbdcyyQXyRC -DnbkKvbdVqnXadkc -EPCkKvbdGKeTDIMu -DnbkKvbdrRtjnKaN -EObkKvbdFVxooljF -DoDKjvbdDoCjjvcE -DnbkKvbddneTLTsr -EPDKjvbdGcjvKCKK -EObjjvbdgPazvdYI -DoDKjvbdSLYfVHKs -DoCkKvbdEPCjkWbd -DnbjjvbdmaivxPOV -EObjjvbdJJdAJogE -DoDKjvbdhkddNtby -DoCkKvbdiCPDEwQq -EOcKjvbdmajXYOmu -DnbkKvbdqYngfqEY -EOcKjvbdTppoUuIN -EPDKjvbdNddThhkE -DncKjvbdDnbkKvbd -DnbjjvbdZRNEiNFR -EPCjjvbdaaWFFopX -EPDLKvbdBhjbKhej -DoCkKvbdfpBzvcwh -DoDKjvbdmSZVZrdJ -EObkKvbdbAueGQQX -EOcKjvbdNQXqWOGs -EPCjjvbdvAcySndh -EOcLKvbdySnImRag -EObkKvbdSxLLmzkY -DnbjjvbdcJMjLGXY -EObkKvbdBsBDUFwS -DoCjjvbdqlyjZLhJ -EPCjjvbdliEURVRa -DoDKjvbdptTgRrLU -DncKjvbdiBoCdwQq -EOcKjvbdEOcLLXDE -EObjjvbdEYYLtTsl -EPDKjvbdVTmTekuj -DncLKvbdLFegbBQu -EPCjjvbdmttzLKRf -EPDLKvbdpfEFTuaI -DncKjvbdiiegjMwr -EObkKvbdxVNEqYlO -DoCjjvbdRWnDblHc -EPCjjvbdaSFbgtGL -DnbkKvbdozmcjwoA -DoDKjvbdPyNAHSrK -DncLKvbdVqnXbEkc -EPCkKvbdFWYpQNJe -EOcLKvbdlYsRsZHU -EOcLKvbdQvmcblID -EObjjvbdRkYetfkT -DoCjjvbdFjdsDINV -EPCjjvbdrafNMGkZ -EPDKjvbdczZQXxqC -EPDLKvbdDwxLtTsl -DoCjjvbdFpASvffZ -DoCjjvbdiMEdOVCy -DoCkKvbdelevfljL -DnbjjvbdaSFcHtFk -DncKjvbdBhkBkIfK -EObjjvbdGKdsDHmV -DncLKvbdhzUekqOG -EOcLKvbdZshiZDrn -DncLKvbdDjIJuwjA -EPCjjvbdpxoHfqEY -EPCjjvbdOAIrsjSA -EPDLKvbdEuyPolie -EPDKjvbdssRrxydc -EPDKjvbdjlakzEgP -DncKjvbdiUydwRuC -DoCkKvbdZMSDtNkm -EPDLKvbdbBVeGQPw -EObkKvbdNHDPlpVL -DoDLKvbdDjHiuxKA -EPDKjvbdatbGwkUI -DnbjjvbdeqaWzkbo -DoDKjvbdvvlBWAuu -EObjjvbdZirhQHBf -EPCkKvbdDncLKvcE -DnbjjvbdehKvSNpg -DncKjvbdVwIwudFH -DoCjjvbdNQYRVmgT -EOcKjvbdNrtWGeUp -DncKjvbdvvlAvAuu -DnbkKvbdjKGHimXr -EObjjvbdhkddNuDZ -EPCkKvbdNddThhkE -EPCjjvbdsPunjDVf -EPDKjvbdxZgfFwdr -DncKjvbdZyDjNblS -EPDKjvbdjcMLQfuH -DncKjvbdwtmFRZMO -DncKjvbdVhXuwgYz -DoCkKvbdVZITyjnn -EPCkKvbdNrtWHEtp -EPCjjvbdMfbomQUk -EObkKvbddwyssqez -EPCkKvbdhfjCyVjV -DoDKjvbdtvOYJpsA -DoDKjvbdiLdcnVCy -EObkKvbdLrWlzUpz -DoCkKvbdSPsgKFdX -EPCjjvbdkNCLyeGo -DncKjvbdCSaCtGWr -DnbjjvbdRkZFtgLT -DoCkKvbdVAaprprZ -DnbjjvbdyXhibQZk -DoCkKvbdsQVnibvG -EPCjjvbduaDyTPFI -DncLKvbdUaCRSpqy -DoDLKvbdnPzYukZC -DoDKjvbdRWnDcMHc -EOcKjvbdxVNFRZLn -EOcKjvbdRkZGUfkT -DnbkKvbdvmWAMdEm -EOcKjvbdmbKXYOmu -EPCkKvbdyXiKCPyk -DnbkKvbdkHgMFfOL -DncKjvbdVYgtZkPO -EPCkKvbdDnbkKwCd -EObkKvbdKfGHaaRV -EPCkKvbdqZOggQdY -EOcLKvbdTlVnaVoJ -DoCkKvbdhanbeWqR -DnbkKvbdypoMiJwA -DnbkKvbduMXvaUBX -DoDKjvbddiirWUzn -EObkKvbdqYoHgQcx -DnbjjvbdFyUuBDwb -DoCkKvbdKCicQjDY -EPDLKvbdezvYeJTw -EPCjjvbdSxKlNzkY -DoDKjvbdQmYByOUz -DnbjjvbdIGgZxxXg -EPDKjvbdqmZjZLgi -DncKjvbdmfeYMmgZ -DncLKvbdGdLVibKK -DoCkKvbdZGvdAOsJ -EObkKvbdjSzhrkJz -EPDLKvbddePRbWcK -EObjjvbdDxXkstUM -DoCjjvbdvlvANDeN -EOcKjvbdrDdiQOWB -DoCkKvbdmajXXoOV -DncKjvbdUtMsekvK -EOcLKvbdxxJKBoyk -EPDKjvbdqYnhGpcx -EObjjvbdatafwkTh -DncLKvbdajkenmcA -DnbjjvbdZQleImEq -EPCjjvbdDncLKwCd -EObjjvbdHELWKBij -EPDLKvbdxrmhmRag -DoCjjvbdwXMBWBVu -EObjjvbdsPvOjCvG -EOcLKvbdssSTZZdc -EPCkKvbddndrkUUS -EOcLKvbdNGbolotk -EObjjvbdZMSDtNlN -EObkKvbdZshiYcsO -DncKjvbdDwxLsstM -EOcLKvbdqZPIGqEY -EOcKjvbdZRNFImFR -EOcKjvbdrDeIonVa -DnbjjvbdYzberKWZ -EObjjvbdegjvRnQg -DoCkKvbduDDUwWOo -EPDKjvbdRotGjGEX -EOcKjvbdKQyeOeme -EPCjjvbdDwxMTtUM -EObjjvbdpedFTvAh -EPDLKvbdFxtuBDxC -DoCjjvbdlqxtzSdJ -DncKjvbdZLrDtOMN -EPCkKvbdGdKujBjK -DoCkKvbdezvYdiTw -DnbjjvbdrEEiQOVa -DncKjvbdOYPVzdOU -DnbjjvbdxwiKCPzL -EObkKvbdRpTgJecw -DoCkKvbdwtmEpxlO -EPDKjvbdqFceTuaI -DncKjvbdsPuoJcWG -DncLKvbdRyjHsCvA -EPCkKvbdyXiJaoyk -EPDLKvbdJvVFcdgJ -DncLKvbdrXPlChxq -EObjjvbdvBEZTOdh -DoDKjvbdqvokcJYq -EOcKjvbdlqxtzSci -EPDKjvbdFkErbglu -DoDKjvbdEPDLKvcE -EObkKvbdijFhJlxS -DoCjjvbdOFDtJJKd -DnbkKvbdyXhiapZk -DncKjvbdEXwlTtTl -DncLKvbdZyEKOCkr -DnbkKvbdqlyjYlIJ -EObkKvbdIGfyxwxH -DnbjjvbdyNrgxTIc -DnbkKvbdeOeSkTsr -EPCjjvbddZyPxZRC -DncLKvbdkDMKpgUg -EPDKjvbdfIKuqnQg -EPCkKvbdhlFENuDZ -DoDLKvbdiBoCdvqR -EPCkKvbdySnImRag -DnbjjvbdIxTahLqQ -DoDKjvbdZnmhddyj -EOcKjvbdgQBzwEXh -EPDLKvbdfILWSNqH -DncKjvbdjcMKqGtg -EObkKvbdKQzEnfNe -EPDKjvbdUQqPVVHm -EObjjvbdREDBPpcr -EObjjvbdnHExMnGy -DnbkKvbdvBDxrndh -DncKjvbdCEPaVimG -DnbkKvbdGBPQxizm -EPDKjvbdLqwMzVQz -DnbkKvbdEPDLLXDE -EPDKjvbdwWkaWBVu -EObkKvbdxrnImSCH -DncKjvbdsrqrxzEc -DnbkKvbdpfDeUWAh -EPDKjvbdjAQHApGj -DoCkKvbdaSGChTfL -DoDKjvbdiHJbxvKV -EPDLKvbdlhdURUqa -EPCjjvbdIwsahMRQ -EObjjvbdGYtuBEYC -DncLKvbdNeEThhkE -EObkKvbdBvzdIePv -EPCjjvbdbAueFpQX -EOcLKvbdjAQGaQGj -EPCjjvbdNHDQNPuL -DncLKvbddoFSkUUS -DncKjvbdACqxJzIp -DnbkKvbdxLWcgzyf -EPCkKvbdTlVnaWPJ -DoCkKvbdCJKbLIfK -DoCkKvbdDwxMUTtM -EPCkKvbdEPDLKwDE -EOcLKvbdTvMQKTaR -EOcLKvbdeXytTrFz -EPDKjvbdNUrrLNAX -DnbkKvbdZjShPgBf -EObjjvbdjAPfaQGj -EPCkKvbdYlRdUNlN -EPDKjvbdzjUoocsU -DoDLKvbdKDKCqJbx -EPCjjvbdQvnECkhD -DnbkKvbdGckVjBij -EObjjvbdXmqAXuVt -EPCjjvbdeFPRavcK -DoDKjvbdEYXlUTsl -DoCjjvbdXrlBNToY -DoDLKvbdrRuLNkAm -DncLKvbdDxXlUTtM -EOcKjvbdwuNEqZLn -EPDKjvbdEOcLLWbd -DoCkKvbdpfDdtVaI -EOcKjvbdmpZyVjyC -EOcKjvbdtSrSxzFD -EObkKvbdsBemLfjy -DoCjjvbdUGznMWue -DncLKvbdbAvEfPpX -DnbjjvbduCcUwVno -DoDLKvbdTppoUuIN -DncKjvbdYqMeImEq -DoCkKvbdrDdhomvB -EObjjvbdgFkzOGgA -EPDKjvbdSwjkmzjx -DoCjjvbdREDBPpcr -EObjjvbdYkrDtNlN -EObjjvbdZisHogCG -DncKjvbdUtMselWK -DoDKjvbdkHfkeemk -DncLKvbdSLYeuHLT -EOcLKvbdeFOrBwCj -EObjjvbdHDjvKCJj -DnbkKvbdkIGkeemk -DoCkKvbdZQmFJMeR -DoCkKvbdqTtGrSKt -DncLKvbdcIljKfWx -DnbjjvbdRjxfUgKs -DnbkKvbdhyuFlROG -EObkKvbdpxoHfpdY -DoDKjvbdhuZdwRtb -DnbkKvbdBdQAvKMf -DoCkKvbdVTlsekuj -EObkKvbdCJLBkIfK -EOcKjvbdmgFYNNgZ -EPDLKvbdxrnImRag -DoCjjvbdbKlGPODA -DoCjjvbdMoxRVmgT -EPDLKvbdKfGIBaRV -DoDKjvbdSCEElJZL -EPCkKvbdmRxtzSdJ -EPDKjvbdjKGIKNXr -DnbkKvbdlhdTptrB -EPDKjvbdBcoaVilf -EPDKjvbdRzKIScWA -EOcKjvbdnHFXmOGy -EPCjjvbdFfJrNhtR -DnbkKvbdzaAPHHCM -DnbkKvbdwXLaWBWV -DoDKjvbdKeegaaQu -EPCjjvbdRotHKFcw -EOcKjvbdnGeXmOGy -DoCjjvbdmIdTqVRa -DncLKvbdfNGWgMik -EPCkKvbdrovPJbuf -EObkKvbdEvYpPljF -DncLKvbdOYPVzdOU -EObjjvbdrzLosAhO -DnbjjvbdyzdnSIJI -EOcLKvbdIsZArmYM -DoDLKvbdvAdZTPEh -DoCkKvbdQvnDcMHc -EObjjvbduMYWaUBX -DncKjvbdUyHszLOn -EPCkKvbdbrbjscia -EObjjvbdTkunaVni -EObkKvbdeATpmYKG -EOcKjvbdqUTfqrLU -EPDLKvbdGYttaDxC -EPDKjvbdRNYByNtz -DncLKvbdADRwizJQ -DncLKvbdKfFgaaQu -EPDKjvbdxZhGGYFS -DncLKvbdwtmFRYlO -EOcLKvbdehLVrNqH -DnbkKvbdKxpirztf -DoCjjvbdZxdKNcLr -DoDLKvbdrbFmMGjy -DoDLKvbdqYnhHQcx -EPCjjvbdGKeTDIMu -EPCjjvbdZRNEhleR -DnbkKvbdfMfXGmJk -DnbjjvbdRjyGVHKs -EPDKjvbdZHXEAOri -EObjjvbdxnTIYTIc -DnbjjvbdTpqOttgm -EOcLKvbdWXIwuceH -EOcLKvbdzROmJKXA -EPCkKvbduCbtwWOo -DncLKvbdJTZBTMwl -EObkKvbdlqyUysDi -DnbjjvbdrpVoJcWG -DoCjjvbdHDjvKCKK -EObkKvbdVwJXvDeH -EPDKjvbdZsiJZDrn -DoCkKvbdhfjDYvJu -DoDLKvbdZyEJmcLr -DnbjjvbdmajXXoOV -DoCkKvbdelewGmKL -DoDLKvbdUtMsfMVj -EOcKjvbdegjuqmpg -DnbkKvbdZMRctNkm -DncKjvbdhlEdOUcZ -DoDLKvbdqAiFAXIE -EObjjvbddBsMrAUN -EPDKjvbdaSGDHtGL -DnbjjvbdbVCGwjtI -DncLKvbdzdzOzeZp -EPDKjvbdKQyePFnF -EPDLKvbdauBgXjtI -EPDLKvbdCSaCtGWr -DnbkKvbdbsCjtEKB -DoDKjvbdCWzdIeQW -EPCkKvbdRbDeLhxk -EObjjvbdOEctJIkE -DoCkKvbdSPtGiedX -DncKjvbddZyPxZRC -DnbjjvbdTukpKUBR -DoCjjvbdpstHRqkU -DncKjvbdNdctIhjd -EOcKjvbdUWMPjTaR -DoCkKvbdLGGHbApu -EObjjvbdmozZWLZC -EObjjvbdULvPAvOi -EPDLKvbdcJMikFvx -DncLKvbdjJfHjMxS -EPCjjvbdqYoIHREY -DoCjjvbdiifHjNXr -EObkKvbdZLrETnMN -DnbkKvbdtSqsYydc -EPDLKvbdCIkCLJFj -DoCkKvbdliDsqUrB -DnbkKvbdNPxQumgT -EPDKjvbdACrYJyiQ -EOcLKvbdYTMBMtOx -DoDLKvbdNGcQNPtk -DncKjvbdtbbtvuno -DncKjvbdZLrEUNlN -DoCkKvbdaogHELzd -DoCjjvbdgFlZmfgA -EPCjjvbdvPTzpkOt -DoCjjvbdjKGHjMxS -EPDLKvbdauBgXjsh -EOcLKvbdiBoCeWpq -EObkKvbdSPsfjGEX -DnbkKvbdzGxlAMeX -DoDLKvbdqFcdtWAh -EPCkKvbdOYOuzcmt -DoCjjvbdDwxLtUTl -DnbkKvbdOTUVgFUp -DnbkKvbdiGibyWJu -EPCjjvbdUyITzLOn -DoCkKvbdbLMFnnDA -DoCjjvbdDwxLsssl -DncLKvbdBiLBjhfK -EPDKjvbdNPwpvOGs -EObkKvbdzQnliKXA -DoCjjvbdeYZssqez -DoCjjvbdeATplxKG -EOcLKvbdRyjIScWA -EPDKjvbddeOqbWcK -EPDLKvbdACrXjZhp -DnbjjvbdmuVZkKSG -EPDKjvbdVqmwbFLc -EPCkKvbdCSaCtFwS -DnbjjvbdVZHszLPO -DoDKjvbdVrNxCFLc -EOcKjvbdegjuqnQg -EPCjjvbdZMSETmlN -EOcKjvbdHDjvKBjK -EPCkKvbdyOTIXsJD -DoDKjvbdnQZyWKxb -DncLKvbdxwhiaozL -DncLKvbdNdcshhkE -EPCjjvbdXnRAYUut -DoDLKvbdNsUWGeUp -DncKjvbdWHwuwfxz -DnbkKvbdRpUGifEX -DnbjjvbdEOcLKwCd -EPDKjvbduaEYsOeI -DnbkKvbdjhHLfFnL -DncLKvbdZoOJEeZj -EPCkKvbdEPCjjvcE -EObjjvbdxUldqYkn -EObkKvbdOEdThiLE -DnbkKvbdjcMKpgVH -EObjjvbdkIGkeenL -DncKjvbdZsiJZDrn -EPCkKvbdxnShXsIc -DoDKjvbdZnmiEdzK -DoCkKvbdVTmUGLvK -EOcLKvbduCcVXVno -EObjjvbdZQleJNFR -EObjjvbdFejRmhsq -EPDLKvbdaMkBruNH -DoCkKvbdNQXqWNgT -DoDKjvbdjuwNcbXw -EPCjjvbdSBceLiYk -DoCjjvbdMgColpVL -DoDLKvbdVZHtZkPO -DoDKjvbduMYXBUAw -EPDKjvbdNeDshiKd -DoDKjvbdTAFJICPE -EObjjvbdJvVFceGi -EObjjvbdNHCpMpUk -DnbkKvbdijGIKNYS -DoDLKvbdDncKkXCd -DncKjvbdkMakyeGo -EObkKvbdjKFgilwr -DoCkKvbdOhAXyAZB -DoCkKvbdUGznMWvF -EOcKjvbdRosfifEX -EPDLKvbdfNFvgMjL -EObkKvbdxxJJbPzL -EPCjjvbdQlxCYmtz -EOcLKvbdgPazwEXh -DoDLKvbdkySrTYft -DoDLKvbdhgKDYuiu -DoDKjvbdYkrETmkm -EObjjvbdNPwpunHT -EOcLKvbdYlRdUNlN -DnbkKvbdZLrDtOLm -EObjjvbdxrnJMrCH -EObjjvbdZnnIeFZj -DoCjjvbdzRPMhiwA -DncKjvbdssSSxyeD -EOcLKvbdjAPgAofj -DncKjvbdRosfifEX -DoDKjvbdEXwktUTl -DnbjjvbdWRmwadkc -EPDLKvbdeEoRavbj -DoDKjvbdXsMBNToY -DnbkKvbdVqmxCFLc -EOcKjvbdkVwOEBww -DoCjjvbdfNGXGmJk -EOcLKvbdmtuZjiqf -DoCkKvbdnPyyWKyC -EObjjvbdJpydoGNe -DnbkKvbdjJfHimYS -DoCkKvbdyXhjBozL -DoCjjvbdkIHLeenL -EOcLKvbdTAEiIBoE -DnbkKvbdvBDxsPFI -DncKjvbdlhdTpuRa -EObjjvbdFfJqmiUR -EPCjjvbderAvzkbo -DncLKvbdwygeexEr -EObjjvbdSBdElJZL -EOcKjvbdySmiMrBg -EPDKjvbdatbGwkTh -DncKjvbdnBivwnmu -EPDKjvbdFxuVAdYC -EPDLKvbdqlzJyMHi -EPDKjvbdZRMdhldq -DoCjjvbdNeDtIhkE -DoCkKvbdfMewGlik -EOcLKvbdhaoDEwQq -DnbjjvbdIwsagkqQ -DncKjvbdkIHMGFnL -DoDLKvbdGdKuibKK -DnbjjvbdTAEiICOd -DncLKvbdNeEThiKd -EObkKvbdYpmEiNFR -EPDLKvbdFkFTDHlu -DoCkKvbdkDLkRHUg -DnbkKvbdyYIjCPyk -DncLKvbdFVyQPmKF -DnbjjvbdZQldhldq -DoDKjvbdVqnYBdkc -EPDKjvbdSKxeuGkT -EPCjjvbdiZuGLqNf -DnbjjvbdJTZArmXl -DnbkKvbdyNrgwrhc -EOcLKvbdrNZiyLgi -DncKjvbdSBdFMJZL -EPCkKvbdfMfWfmKL -EPDLKvbdfMevfljL -DoCjjvbdmIcsqVRa -DoDLKvbdrEEhpOVa -EPDLKvbdZRMeImEq -DoDLKvbdyTNiMrBg -EPCjjvbdsQVnibvG -EOcKjvbdvBDxsPFI -DoDKjvbdqquKnKaN -DncLKvbdqGDeTuaI -EPCkKvbdZdxGzgiC -DoDKjvbdkDLkQftg -DoDKjvbdePEsKtUS -DoDKjvbdUxgtZjoO -DncLKvbdxUmFRYlO -DnbjjvbdwuMeRYkn -DoCkKvbdRWmdClID -EPDLKvbdCDpBWJlf -DncKjvbduaEYrneI -DnbjjvbdfHkVqmpg -EPDKjvbdKxpirzuG -DoDLKvbdZLqdUNkm -DoDLKvbdDwxMTstM -EOcKjvbdrzLosAhO -DnbjjvbdqZPHgQdY -EObkKvbdjggMFfNk -EPCjjvbdZMRcsmkm -EObjjvbdEJgiuxKA -DncLKvbdZtJJZDsO -EObkKvbdRjxeuGkT -DncKjvbdqdFJPmua -DoCkKvbdGYtuAcxC -DoCjjvbdZnmheEzK -DoCkKvbdKWUfEFGi -DoCkKvbdfMfXGmKL -DnbjjvbdjvWmcbXw -DnbkKvbdyzeORhJI -EPDLKvbdpstHRqjt -DoDKjvbdTukpKUAq -DoDKjvbdSPtGjFcw -DncKjvbdWSNxCFMD -DnbkKvbdjlalZdgP -EOcLKvbdkxsRsYgU -EObjjvbdLFfICApu -DoDKjvbdCEQBWKMf -DoDKjvbdbAvFFpQX -DoCkKvbdhgKCxvKV -DncLKvbdjcMLQgVH -EPCkKvbdzitpQDrt -EOcKjvbdNVTRjmAX -EPDKjvbdkxsRsZHU -DoDKjvbdKDJcRKCx -EPDKjvbdFjeScHmV -EPCkKvbdZjTIQHBf -DnbkKvbdlqyUyrdJ -DoDKjvbdehKurORH -EObjjvbdbKlFoODA -DoCkKvbdwtmFQyMO -DoCjjvbdXnRAYUut -DoDKjvbdxsOIlqbH -DncLKvbdyNsIXrhc -DoDLKvbdCEQAvKNG -DncKjvbdRotHJedX -EPDLKvbdVZHsyjoO -DnbjjvbdkCkkRHVH -DoDKjvbdRWmcblHc -DncLKvbdqvokbiYq -DoDLKvbdRkZGVHLT -EObjjvbduCbuXVno -DoCkKvbdEJgivYKA -DoDKjvbdkWWnDbYX -EPDKjvbdnGdxMmfy -DoDLKvbdIHGzYxYH -DoDKjvbduCbtwVno -EObkKvbdqlyjYkgi -EObjjvbdVwIwudEg -DnbjjvbdfRaWzkcP -EPCkKvbdEARhlzXX -DnbkKvbdfMevfmJk -DncLKvbdZyDjNcLr -EOcKjvbdtAHQhABS -DncKjvbdkClKqGtg -DoCkKvbdEObkLXCd -EObjjvbdFkFTDINV -EOcKjvbdEztQdkcJ -DoCkKvbdKaLHNBxR -EPDLKvbdhaoCdvqR -EObkKvbdrJAJdmOe -EObjjvbdrpVnjCuf -EPCkKvbdFjeTCglu -DoCjjvbdqdEiPnWB -EPDKjvbdGFirOJUR -EPCkKvbdJmADzHUa -EPCjjvbdWWhwucdg -DncLKvbdBhkBjiFj -DoCkKvbdSZihSbvA -DncKjvbdZtIiZETO -EPDLKvbdCTAcUGXS -DoDKjvbdVqmxCFLc -DncLKvbdmajWwoOV -EPDKjvbdVhYVxHYz -DoDLKvbddoFSjtTr -DoDLKvbdrzMQTAgn -DoCjjvbdUVlPjUBR -EPDLKvbdtvOXipsA -DoCjjvbdrouoKCvG -EObkKvbdOSsufdtp -EPDLKvbdIGfzZXxH -EObkKvbdbQGgDkzd -DoCkKvbdOFDtJIkE -EPCjjvbdiHJbyWJu -DnbjjvbdLAkHMaxR -EPCkKvbdJTZBTMwl -DncLKvbdSQTfjGEX -EOcLKvbdlrZVZrci -EObjjvbdkyTSTZHU -EPCjjvbdxUleQxkn -EPDLKvbdEKIKWYKA -DoCkKvbdZHWdAPSi -EPDLKvbdxVNFRZMO -EPDLKvbdcSbkTcjB -DoCkKvbdlYsSTZGt -EPDKjvbduaDxroFI -EObkKvbdNHDQMouL -DoDLKvbdxrnJMqbH -DnbjjvbdmfeXmOGy -DoDKjvbdidkGtoAO -DnbjjvbdGYtuBEXb -DnbjjvbdRECaQQdS -DoCkKvbdmajXXnnV -DncKjvbdZMSEUNlN -EPCkKvbdZtJIxcrn -DncLKvbdJpydneme -DncKjvbdVviYWEEg -DoDLKvbdyXhjBoyk -DoCjjvbdbhlikGXY -DnbkKvbdVviXudFH -EPCkKvbdYTMAlsnx -EPCjjvbdxZhFeweS -DoCjjvbdyNsIXriD -DoDKjvbdznoqEcMY -DnbjjvbdauCHXjtI -DncKjvbdIsZAsMwl -EPCkKvbdZMSDtOLm -DnbkKvbdJqZePFme -EPDKjvbdkHfkeenL -DoDLKvbdaNLCStmH -DncLKvbdIwsbHkqQ -EObkKvbdfHjvRnRH -EPCjjvbdlqyVZsDi -EObkKvbdEuxoolie -DoDKjvbdjAPgAofj -EOcLKvbdjcMLRHVH -DncKjvbdjKFgjNXr -EPCkKvbdmIctQuRa -DncLKvbdJpyePGOF -DncLKvbdNGbpMouL -EObkKvbdpfDdsuaI -EPCjjvbdyzeORhIh -DoDKjvbdrDdhpNua -DoCjjvbdFfKRmhtR -EPDLKvbdpfEEsuaI -EPDLKvbdqcdhpOVa -EPCjjvbdVYgsykPO -DoDLKvbdDncLLXCd -EObkKvbduaEYroEh -EOcLKvbdkNBlZeHP -EObjjvbdGcjvJajK -DncLKvbdrpVoJbuf -EObjjvbdEKIJuxKA -DncKjvbdZxcjODMS -DncLKvbdmgFXmOGy -DoCkKvbdUMVoAuoJ -DoDKjvbdqcdiQNua -DnbkKvbdbrcKtDia -DnbkKvbdKfFgbApu -DncKjvbdezvZEiTw -DnbkKvbdlqxtzSdJ -DoCjjvbdOTUWGeUp -EPCkKvbdJXtBhMQp -EOcLKvbdOAJTTjSA -EOcKjvbdfILVrNpg -EOcLKvbdnQZxvLZC -EPDKjvbdyYJJaoyk -DnbjjvbdkMakzFHP -DnbjjvbdjbkjpfuH -DoCkKvbdgGLymfgA -DoDLKvbdJYUBhLpp -EPCjjvbdJSyBTMxM -DnbjjvbdyTNiMrBg -DnbkKvbdqYoHfpdY -EOcKjvbdZyEKNcLr -DoCkKvbdZtIiYcsO -EPCkKvbdZQmFJNFR -DncKjvbdSPsgKFdX -DoCjjvbdvwMAuaWV -EPDKjvbdHfgZxxYH -EObkKvbdrSUjnKaN -DnbjjvbdKWVGEFGi -DncKjvbdsPvOjDWG -EPDKjvbdhzVFkqOG -DoDKjvbdssSSyZdc -DoDKjvbdYkqcsmlN -EPCjjvbdYpldiNFR -DncLKvbdemFwGlik -DoDLKvbdjuvmdBxX -DoDKjvbdCTBDTewS -DoCkKvbdKeehBaQu -EObkKvbdwyhFexEr -DoDKjvbdQvmccMID -DoDKjvbdVviYVceH -EPCkKvbdmRxtyrdJ -EPDLKvbdYqMeJNFR -EPCkKvbdRbDeMIxk -EPCkKvbdcJMjKfXY -DnbkKvbdVwIwvDdg -DnbjjvbdIwtCHkpp -DncLKvbdczYpYYqC -EPCkKvbdKaLGmBxR -DncKjvbduLwwAsaX -DncLKvbdssRrxzEc -EObjjvbdrXQMCiZR -DnbkKvbdZRNFImFR -EOcKjvbdACqwjZhp -DnbjjvbdbKlGOmcA -EObjjvbdGFirOJUR -EPDLKvbdqvokbiYq -EOcKjvbdJmAEZgUa -DoCkKvbdbhljKevx -EPCjjvbdbKlGPNcA -EOcKjvbdRMxByOUz -EOcKjvbdbsDLUEJa -EPCkKvbdRacdlJZL -EObkKvbdmuUyjjSG -EObkKvbdjKFgjNXr -DoDLKvbdlhctQuRa -DoCkKvbdjKFhKMxS -EObjjvbdpedEtVaI -EOcKjvbdIwtBhLpp -DnbjjvbdZHWdAPSi -EOcLKvbdiLdcmuCy -EOcLKvbdjcMLRGuH -EPCjjvbdRbDdkiZL -EOcKjvbdiHJbxvKV -EOcLKvbdaSGDHsfL -DoCkKvbdjKFhJlwr -DncKjvbdiBoCeWqR -EOcLKvbdegjvSNpg -EOcLKvbdrbGMlHLZ -DnbjjvbdBraDUGXS -DncLKvbdFeirOIsq -EPDLKvbdhytekpmf -EOcKjvbdIsYaTMwl -DnbkKvbdrSVLOKaN -DoCkKvbdTIyjRABM -EOcLKvbdsBfNMGkZ -EPDLKvbdUtNTfMWK -EObkKvbdRjxeuGjs -EObkKvbdTqQnuVIN -EObjjvbdhuZdwRuC -EOcLKvbdqTtHSSKt -DncKjvbdmpZxvLZC -DoDLKvbdlAloNALA -EPDKjvbdiLddOUby -EPDLKvbdwuMdpxlO -DncKjvbdNrsvHEuQ -EPCkKvbdyOSgxTJD -EOcLKvbdIryArlxM -EPDLKvbdZHXEAPSi -EPCjjvbdSCDdlIxk -EOcKjvbdySnJNSCH -DnbjjvbdijGIKNXr -EPDKjvbdVAaqTRSZ -EObjjvbdkxsSSxft -EPCkKvbdnUtzKiqf -EPCkKvbdlqxuZsEJ -EObjjvbdEXxMUUUM -EPCkKvbdLFfIBaQu -DnbjjvbdrRtkNjaN -DoCjjvbdNHCpMpUk -EPDKjvbdZjTIQGaf -EPCkKvbdHELWJbKK -DoDKjvbdJbibpjCx -DnbjjvbdJSyArmYM -EPCjjvbdfNFwGmJk -EOcLKvbdYTMBMsnx -DoDLKvbdyTOJMqbH -EObjjvbdEPDLLXDE -DncLKvbdkyTSTZGt -EObjjvbdGBPRYizm -DoCkKvbdVviXvDeH -DncKjvbdsQWOicVf -DoCkKvbdfHjvSNqH -DncKjvbdlZTSSxft -DncKjvbdFVyPolie -EPCjjvbdRXODblID -DoCjjvbdlhcsqVSB -DncLKvbdqYnhGqDx -EObjjvbdFeiqmiUR -DnbjjvbdKefHaaQu -DoDKjvbdRNXbYmtz -EOcKjvbdNwnuzcmt -DoDLKvbdXFxytAPT -EPDLKvbdOTUVfdtp -DoCjjvbdraelkfkZ -DncKjvbdXsMAltPY -DoDKjvbdVUMsfLuj -EPDLKvbdZisIPfbG -EPDKjvbddZxpYYqC -DnbkKvbdzjUopESt -DnbkKvbdVUMtGMVj -DncLKvbduCbtwWOo -EObkKvbdaaVeFpPw -DncKjvbdKNADzGta -DncKjvbdeEoSCXCj -EObjjvbdhancEvqR -EObkKvbdKCicQibx -DncLKvbdijGHjMwr -DoCkKvbdziuPpETU -DoCjjvbdiBnbeXRR -DoCkKvbdZQmEiMdq -EObkKvbdrMyjZMHi -EOcKjvbddoErkTtS -DoCkKvbdtkwvaUAw -EPDLKvbdTlVnaVoJ -DncKjvbdfHjurOQg -DoDLKvbdWWiXvEEg -EPCkKvbdqdEhpNua -EOcLKvbdYSkaMtPY -EPCkKvbdxmsHxTIc -DnbjjvbdJqZdnenF -EPDKjvbdWexzUAOs -EOcLKvbdrovPKCuf -DoDKjvbdkxsSSyGt -Dnbjjvbdzdynzdyp -EOcLKvbdHEKvJbJj -EObjjvbdOStWHEuQ -DnbjjvbdkyTRsZGt -DoCkKvbdcJNKKevx -DoDKjvbdSPtGifDw -EObkKvbdGdLVibKK -DnbjjvbdbBVdfPow -DncKjvbdhtyeXSVC -EPDLKvbdptTfrSLU -DncKjvbdjvXODaww -DncKjvbdqZOgfqDx -DncLKvbdTJZjRABM -EOcLKvbdTpqPVUhN -EOcKjvbdRWmdClID -DoCjjvbdqquLOLAm -DoCjjvbdFfJqmiUR -EOcKjvbddBsMrATm -EOcKjvbdYzcFrKVy -EPCjjvbdsZlQSaIO -EPCkKvbdkHfkeenL -EOcKjvbdiHJcYuiu -DoDKjvbdCEPaVilf -DoCjjvbddBrmSAUN -EPDLKvbdSPtGifDw -EOcLKvbdAMhYrvyx -DncLKvbdTIyjRAAl -EOcLKvbdZtIhyESn -DnbjjvbdVUNUFlWK -EOcKjvbdyXiJaoyk -EPCkKvbdDncLKvbd -EOcLKvbdKWVFcdgJ -EPDKjvbdnQZxvKyC -DncKjvbdjJehJlxS -DoDKjvbdRkYfVHKs -EPDLKvbdirzhsLJz -EObkKvbdVUMtFkuj -DnbjjvbdqwPkbiYq -EPCjjvbdIGfzZYXg -DoCkKvbdlYsRryGt -EObjjvbdpfDeUWBI -EOcKjvbdwtldpxkn -DoCkKvbdzitopETU -DoDKjvbdJuuGEEfi -DnbkKvbdnPzZVkZC -EOcKjvbdmfeYMnGy -EPDKjvbdkIGlGGNk -DncKjvbdezvZEhtX -EPDKjvbdqqtjmkAm -EPDLKvbdzRPNIiwA -DoCkKvbdGKeSbgmV -EPDLKvbdmJETqVSB -EPDKjvbdbVCGwkTh -DoCjjvbdBhkBkIej -EOcLKvbdbBWFFopX -DncLKvbdjggLfGOL -EPCkKvbdzQnmIiwA -EOcLKvbdhbPDFWpq -EPDLKvbdkClLQgVH -EObkKvbdrWpMChyR -DncKjvbdMfbpNPuL -DnbjjvbdNsUVfeVQ -EOcKjvbdaRfDHtFk -DoDKjvbdRbEFLhyL -EOcKjvbdmIcsqUqa -DncKjvbdFVyPpNJe -DoCjjvbdLAjgMaxR -EOcLKvbdypoNJKXA -DncLKvbdEztRFMCi -DoCkKvbduVmwiqTA -EObkKvbdUyHsykPO -DoCkKvbdhzUfLqNf -EPCjjvbdiUzEvqtb -EPDKjvbdpfDeTuaI -EPCkKvbdSwjkmzjx -DncLKvbdjKFgjMwr -EOcLKvbdRWnECkhD -EOcKjvbdZoOJFEyj -DnbkKvbdvvlAvAvV -DncKjvbdZLqcsmlN -DncKjvbdyqOliJwA -EPCkKvbdKWUedEfi -DoCkKvbdePEsLTtS -DnbkKvbdtcDVXVoP -EPCjjvbdKCjCpicY -EObkKvbdZdwfzhJC -EPDLKvbdBhjajiGK -EOcKjvbdJXsahMRQ -DoCkKvbdZxdKNcLr -EPDKjvbdnBjWwoOV -DncLKvbdapGgDkzd -EPDKjvbdjmCLzEgP -EPCkKvbdWRmwbFMD -DnbjjvbdBdQAujMf -EObkKvbdzjUpPcsU -DoDLKvbdwtmFQyMO -DoCkKvbdiMEcmtby -DncKjvbdSBcdkiYk -EPCkKvbdfSBWzkbo -EOcLKvbdxVMeRZLn -DnbjjvbdCSaDUGXS -DncKjvbdZtJIyETO -EPCkKvbdTkvOaVni -DnbkKvbdkySqsYft -EPCjjvbdxsOJMrCH -EPCjjvbdCWzdJEov -EPCjjvbdEARiMywX -EObkKvbdxsNiNSCH -DncLKvbdhbPDFWqR -EObkKvbdVUNUFlVj -EObjjvbdXrlBNToY -EOcLKvbdfHjvSOQg -EPCjjvbdwWkaWAuu -DncKjvbdbKlFnnDA -EPCkKvbdRkZFuGkT -EPCjjvbdMowpvNfs -DncLKvbdmtuZjjSG -DnbkKvbdiCPDEvqR -DncLKvbdbAudfPow -DnbjjvbdFjeSbhMu -DncKjvbdSQTfjGEX -EPDKjvbdbAueGQQX -DnbkKvbdjKGIJmXr -EOcKjvbdIryBTNYM -EPDLKvbdmgEwlnGy -EObjjvbdSBdEkhxk -DoCjjvbdfMfWgMjL -EPDLKvbdEObjjwCd -EObjjvbdhzUekqOG -EObjjvbdWSNwbElD -DoDKjvbdrNZjYkhJ -DoCkKvbdRkYfUgKs -EObjjvbdczYpYZRC -DoCkKvbdzoQQeDMY -DncKjvbdFxuVBEXb -DoDKjvbdSiZjRABM -DoDLKvbdYzbfRivZ -EPDLKvbdlqyUyrdJ -EOcLKvbdtbbuWvOo -DncKjvbdSKxfVGkT -DoCjjvbdEXxLtUTl -EOcLKvbdEPCjkWbd -EPDLKvbdEObkLXDE -EPCkKvbdxKvdHzzG -EPDKjvbdpfDdtVaI -DoCjjvbdbAueGPpX -DoCjjvbdZMRdUOLm -DoDLKvbdwtmFRYkn -DoCjjvbdNPwpumgT -DoCkKvbddijSWUzn -DoDKjvbdJXsbHkqQ -DnbjjvbdxZhFexEr -DoCjjvbdSQUHJedX -EPDLKvbdjmCMZdgP -DncLKvbdMfbomPtk -EOcLKvbdqTtHRqjt -EPCkKvbdqceIpNvB -DncLKvbdFxtuBDxC -EPCkKvbdxVNEpyLn -EOcKjvbdYzbeqivZ -DoCjjvbdNdcsiJLE -DoDKjvbdzjVQQDsU -EObjjvbdvBDySneI -DoDKjvbdBhjbKhej -EPDLKvbdWSOYBdlD -EOcKjvbdOYOuzcnU -EPCkKvbdkCkkQgVH -DnbkKvbdtlXwBTaX -DnbkKvbdTppoVUgm -DoCjjvbdQmXaxnUz -DncKjvbdkHfkfFmk -EPCjjvbdmgEwlnHZ -EPDLKvbdZdxGzhJC -EPCkKvbdmIdTqUqa -DoDKjvbdzGyMAMeX -DnbkKvbdTppnuUhN -DoCjjvbdSLYfUgLT -DnbkKvbdZsiJZETO -EObkKvbdNUrqjmAX -EObjjvbdZyDimcLr -DoCkKvbdRDbaQRDr -DnbjjvbdbAudfPow -EPDKjvbdZjTHpGaf -DoDKjvbdqwQLcIxq -DnbjjvbdZLqdTmkm -DoDKjvbdyXiKCPzL -EObjjvbdssSTYyeD -DoCjjvbdddoRawCj -DoCjjvbdkMbLydfo -DoCjjvbdVTmUFkvK -DoCjjvbdhyuFkpmf -EObkKvbdlYsSSyGt -EPCjjvbdtvNxKQsA -DoDKjvbdRpTgKFdX -EObjjvbdjbkkQgVH -DnbjjvbdaNLCStlg -EOcKjvbdDxYLsssl -DoCjjvbdfNFvgMjL -DncLKvbdrovPJcWG -DnbkKvbddoFSjssr -DnbjjvbdSQTgKGDw -DoCjjvbdQvnEDLhD -EOcKjvbdUxhUZkOn -EPCjjvbdEzsqFMDJ -DoDKjvbdGdKuiaij -EOcKjvbdxrnJMrCH -DnbjjvbdUWMQJtBR -EObkKvbdEKHivYKA -EPDLKvbdYSlAltOx -DnbjjvbdbVCHXjtI -DnbkKvbdtkwwAtBX -DoCjjvbdZQleJNEq -EPDKjvbdEPCjjvcE -EPCjjvbdCSaDUFwS -EPDKjvbdHELViajK -DoDLKvbdijFgjNXr -DncLKvbdjmCLydfo -EObkKvbddZyQXxqC -DnbkKvbdySnImSCH -EPCjjvbdqmZjYkgi -EPCjjvbdGFirNiTq -DoDKjvbdRXNdDMID -DncLKvbdMfcQNQUk -EOcLKvbdZdwfzghb -EPDLKvbdULuoBWOi -EObjjvbdFyVUaDwb -DoCjjvbdNQXpumfs -DnbkKvbdrWolDIxq -EPCkKvbdBvzdIeQW -DnbkKvbdfIKuqmpg -EOcKjvbdnBiwXoNu -EObjjvbdiHKDZWKV -EPCjjvbdZLqdTnLm -DoCjjvbdlYsSTYgU -EPDLKvbdsBfNMHKy -DnbkKvbdjuvmdCXw -EPDLKvbdRDcBQQdS -EOcKjvbdySmhmRbH -EPDLKvbdbrbjscia -EPDLKvbdkxrrTZGt -DoDKjvbdcJMjLGWx -EPDKjvbdKeegbBQu -DnbjjvbdvPTzqKoU -EOcLKvbdIidAKPgE -DoDLKvbdVrOYBdkc -EObjjvbdeFOqawDK -EOcLKvbdZRNEhmFR -EObjjvbdKfFgbBRV -DoCjjvbdiLeEOVCy -EPCkKvbdqmZjYkgi -EPDKjvbdHffyxxXg -EPDKjvbdZLrDsmlN -DnbjjvbdTkuoBVoJ -EOcKjvbduDDUvvOo -DoDKjvbdZdwfzhJC -EPCkKvbdfMfWgNKL -EPCjjvbdRXOECkgc -EOcKjvbdMowpvNfs -DoDLKvbdiBoCeWpq -EObkKvbdNwoVzdOU -EPDLKvbdDoDKjvbd -EObjjvbdLFehCBRV -EOcLKvbduCcVWuno -EOcKjvbdXsMBMtOx -DnbkKvbdcIljKewY -DoDLKvbdEzspdkcJ -DncKjvbdqcdhomua -EPDKjvbdiifHjNXr -EObkKvbdVqnXbFLc -EPCkKvbddwyssrFz -DncKjvbdrSVKmkAm -EPCjjvbdTlVoBVni -EObjjvbdOhAYZAYa -EPCjjvbdRadEkiZL -DoCkKvbdSCEEkiYk -EObjjvbdGZVVAcxC -DnbjjvbdZyEJnDMS -EOcKjvbdzitoodSt -EPDKjvbdXFxzUAPT -DnbjjvbdziuQQESt -EPCjjvbdEARhmZvw -DncLKvbdatbHXkTh -DncKjvbdbsCjtDjB -EPCjjvbdKWVGDdgJ -EPDKjvbdrafNLfkZ -EObkKvbdFkEsChMu -DnbkKvbdVgxWXfxz -EObjjvbdJbjDRJbx -EObkKvbdwyhFfYFS -EPCjjvbdMfbpNPtk -EObkKvbdbsDKtDia -EPCkKvbdkxsRsZHU -DnbkKvbdvAdZTOdh -DncKjvbdptUHRrLU -DncKjvbdvPTzqKnt -DncLKvbdTppoUthN -DnbkKvbdrbFlkgLZ -EPCjjvbdGdKvJajK -EPDLKvbdACqxKZiQ -DoCkKvbdbPffckzd -DoCkKvbdhbOcEvqR -DnbjjvbduCcVWvOo -DoCkKvbdmuUzLKRf -EPCjjvbdbUbHYLUI -DoDKjvbdbKkeoNcA -DoCjjvbdcScKtEJa -DoCjjvbdyzdnRgiI -EPCjjvbdkIGlFfOL -EOcLKvbdzjUpPcsU -DoDLKvbdJuuGEEgJ -DncLKvbdTqROtthN -EOcLKvbdpstGqqkU -EPCkKvbdtSrTYzEc -EPDKjvbdezvYdiUX -DoDKjvbdtTRrxzFD -DoCjjvbdrovOjDWG -DoDKjvbdUQpoUthN -EOcKjvbdKDJbpicY -DnbjjvbdaSGCgtFk -DoDKjvbdGZVVAcwb -DnbjjvbdEvYopNJe -EObjjvbdSQTgKFdX -EPDLKvbdrXPkbhyR -DoDLKvbdhyuGMROG -DoDKjvbdzoQRFClY -EPCkKvbdKWUeceHJ -EObkKvbdZnmiFFZj -DnbjjvbdtcDUwVoP -DoCkKvbdjlakyeHP -EPCkKvbdBvzdIdpW -EPCjjvbddePRawCj -DoDKjvbdmfeYNNfy -DnbkKvbdSLYetgKs -DncKjvbdFejRnJTq -EPDLKvbdIGfzZXwg -DncKjvbdJvVFdFHJ -EOcLKvbdIHHZyYYH -EPDLKvbdyXhiaoyk -DoCjjvbdADSYJzIp -EObjjvbdNPxQunHT -EPCkKvbdxnTHwrhc -DncKjvbdTppnuVHm -EObkKvbdjlbLydfo -DoDLKvbdVBBpsRRy -DnbjjvbdACqwiyhp -DoCkKvbdZRNFJNEq -EOcLKvbdaRfDHtFk -DoCkKvbdKfFgbBQu -DnbjjvbddCTNSAUN -EPDLKvbdTfznMXVe -EOcKjvbdeOeSkUTr -DnbkKvbdqdEiPnVa -EOcLKvbdsBemMHLZ -DoCkKvbdNPxQvOGs -EPDLKvbdOTTufeUp -DncKjvbdraelkfjy -DoDLKvbdZoOIeFZj -DnbkKvbdptTgRrLU -DncKjvbdACrXiyhp -EPDLKvbdIGgZxwxH -DnbjjvbdZnmiEeZj -DnbkKvbdWRmxCFLc -DoDLKvbdyYIiaozL -EPCjjvbdOTTvGeUp -EPCkKvbdNUsSKmAX -EPCjjvbdDigiuwjA -DoDKjvbdIrxaTMxM -DoDKjvbdZyDimcLr -EPCjjvbdjbkkRHVH -DoCjjvbdWXJYVceH -EOcLKvbdlZTSSyHU -DncLKvbdwuNEqYlO -EPCkKvbdrpWPJbuf -DncKjvbdtbcUwWPP -EOcKjvbdGKeScINV -DncKjvbdZeXfzhJC -DncKjvbdUQqPVVIN -DoDKjvbdxsNhmSBg -DoDKjvbdURROuVHm -DncKjvbdRMwbYmtz -DoDKjvbdZRMeImEq -EOcLKvbdWHwvXgYz -EPDLKvbdIwsahMQp -EOcKjvbdfHkVrNqH -EObjjvbddjKSWUzn -DncKjvbdxwiJbQZk -EPCkKvbdMSWlzVQz -DoDLKvbdUQpnuUhN -DncLKvbdiCPCdvqR -DoCjjvbdapHHELzd -DncKjvbdyOSgwrhc -DoCkKvbdDxYLtUTl -EObjjvbdyfyMAMdw -EObjjvbdHffzYxYH -DoDKjvbdYzcFrKWZ -EPDLKvbddZyPwyRC -EPCkKvbdLhalRYAS -DoCkKvbdGYtuBEXb -DoCjjvbdrylQTAgn -DoCjjvbdbBVeGPpX -EPDLKvbdYpmFImFR -DnbkKvbdJcKCpjDY -DncLKvbdYTLaNUPY -DnbkKvbdeOeSjtTr -DoCkKvbdEYYLtTtM -EPCkKvbdrzLoraIO -DoCjjvbdKWVGDdfi -DoDKjvbdBhjbLIfK -EPCkKvbdNQYQvOGs -EOcLKvbduLxXBTaX -EPDKjvbdANHySwZx -DnbkKvbdeOdsLTtS -DnbkKvbdUsmTfMWK -DoDLKvbdcImJkGXY -DncKjvbdsPunibuf -DnbjjvbdIGfyxxYH -DoDLKvbdvBDyTOeI -EPDLKvbdGKeScHmV -EOcLKvbdqFceUVaI -DncLKvbdqdEhpOWB -DoDLKvbdTulPitAq -DnbjjvbdWXIwudEg -EPDLKvbdcTDKtDjB -DoCjjvbdgFlZnHHA -DnbkKvbdwuNEqZLn -EObkKvbdmRxtzSci -EObjjvbdjvXNdCYX -DnbkKvbdqGDdsvBI -DncKjvbdqdEhomvB -DoCjjvbdrpVoKCvG -EObkKvbdWHwvYHYz -EOcKjvbdrykoraHn -EPCkKvbdsPuoKCuf -DncKjvbdZjSgofaf -DncKjvbdNeETiIjd -DoDLKvbddoFSkTsr -EPCkKvbdkWWnECXw -DnbkKvbdZRNFIldq -EObjjvbdzjVQPdTU -DnbjjvbdhytelRNf -EOcKjvbdNPxQunHT -DoCkKvbdmuVZkJrG -EPCjjvbdUVlQJtBR -DoDKjvbdzitpQESt -DoCjjvbdraemLfkZ -DoDLKvbdkNBlZeHP -EObkKvbdrbGNMHLZ -EPDLKvbdkIHLeemk -DoDKjvbdbAvEeopX -DoDKjvbdiGjCxujV -EPCkKvbdqlzJxkgi -DncLKvbdVZITzLPO -EOcLKvbdVZITykOn -EPCjjvbdjuvnDaww -DoDKjvbdkVwOECYX -EObjjvbdcyxpXyRC -DnbjjvbdULvPAuni -DnbkKvbdOTUWGdtp -EOcLKvbdKDJcRKCx -EPCkKvbdBsBDUFwS -DncLKvbdQdDAopcr -EObjjvbdcSbjtEKB -DnbjjvbdlAloNALA -DoCjjvbdADSXizJQ -EOcKjvbdrpWOibvG -EObjjvbdIGfzZXwg -EPDKjvbdptUHRrKt -DncLKvbdZdwfzhIb -DoCkKvbdQZNAGrrK -DoDKjvbduCbtvuoP -EPCjjvbdJuuFceGi -EPCkKvbdgGLymgHA -DnbjjvbdcyyPxYpb -EPCkKvbdhuZeWquC -EObkKvbdyTNiNRbH -DoCjjvbdVAaqSprZ -DncLKvbdoznDkYPA -EPCkKvbdiUydvquC -DncLKvbdhytfMROG -DoCkKvbdmbKXYPNu -DnbkKvbdMpYQunHT -EOcLKvbdHkaznXQk -DoDLKvbdTvMPisaR -DoCkKvbdIryBTNXl -DoDLKvbdZLrDsmkm -DncLKvbdlhctRVRa -EPCjjvbdYkqcsmkm -EPCjjvbdEXwlUTtM -EObkKvbdEvZPoljF -EPDLKvbdZRNEiNFR -DoCkKvbdANIZTXZx -DncKjvbdZoOIeFZj -DoDLKvbdeJirWUzn -DoCjjvbdRWmdDLgc -DoDKjvbdACrYKZhp -EPDKjvbdMowpunHT -EOcKjvbdYTLaNTnx -DnbjjvbdQvnEClHc -DnbkKvbdSBceLhyL -DoDKjvbdjgflGGOL -EOcKjvbdYpldiMdq -DoCjjvbdrovPKDWG -DoDKjvbdZisHofbG -DoDKjvbdEOcLKwDE -EPCjjvbdhfjDZWJu -DncKjvbdhfjCyWJu -EOcLKvbdtSqsYzEc -DoDLKvbdbQHHELzd -DoDKjvbdySnImRbH -EOcLKvbdVqmxCElD -DnbjjvbdNdcsiJKd -EPCkKvbdkNBkzEfo -DnbkKvbdJKEAKPfd -DncLKvbdiifIJlwr -DnbjjvbdhtzEvqtb -EObjjvbdwWlAvBWV -EPDLKvbdlhctQuSB -EOcLKvbdNddUIiKd -EPDKjvbdJSxaTMxM -EPDLKvbdVrOXaeMD -DoDLKvbdGcjvKBjK -DncLKvbdqvpLbiZR -EPCkKvbdjKFgilxS -DncLKvbdDoCjjvbd -DoCjjvbdqqtjnKaN -EOcKjvbdBvzdJEpW -DoCkKvbdcarlrATm -DoDLKvbdQdCaQQdS -DncKjvbdVqnXadkc -DoCjjvbdJvUecdgJ -DnbkKvbdVYhUZkPO -EPDKjvbdxZgfFxEr -EPCjjvbdsPunicWG -DnbkKvbdmSYtyrdJ -DnbjjvbdTulQJsaR -DncKjvbdsrrSxyeD -DnbkKvbdzQnmJJwA -DncKjvbdatafxLTh -EOcLKvbdmfeYNNgZ -EObkKvbdNxOuzcnU -EPDLKvbdDwwksstM -EPDLKvbdxnTIYTIc -EPDKjvbdHgGyyXxH -EOcKjvbdGAnpyJzm -DoCkKvbdUQqPVUhN -DncLKvbdYgWdAOri -DoDLKvbdygZMANFX -EPCkKvbdrJAJdlne -EPDLKvbdZnmheEyj -DnbjjvbdIxUCHkpp -DnbkKvbdjJehJlwr -DoDKjvbdhlEdNuDZ -EOcKjvbdeOeSkTsr -EOcLKvbdVqnYBdlD -DoDKjvbdeATqMwif -EPCjjvbdrXQLbhyR -DnbjjvbdFkErbhMu -DoCjjvbdpxnhHQcx -EOcLKvbdrWpMDIxq -EPDKjvbdVhYWYGxz -DoCkKvbdwzIGFxFS -DoCjjvbdEztQeLbi -DnbjjvbdlZTRrxgU -DncLKvbdSZihSbvA -DnbjjvbdrzLpTAgn -EPCjjvbdNrsugFVQ -DnbjjvbdxUleQxlO -DncKjvbdtkwwBUAw -DoCjjvbdbBVdeoow -EPDKjvbdEObjkXDE -DnbjjvbdhgJbxvKV -EPCkKvbdIwtCHlQp -DoCkKvbdxmsIXrhc -EObkKvbddePSCXDK -EOcKjvbdVrOXbEkc -EOcLKvbdFVyPomJe -DoDLKvbdREDBPqDr -DncLKvbdaNLCStmH -DncLKvbdbAudfQPw -DoDKjvbdRaceLiZL -DoCkKvbdJYUCIMRQ -DnbkKvbdYkrDtOMN -DnbjjvbdFkFTChNV -EOcLKvbdZRMeImFR -EObkKvbdUxgszLOn -EOcKjvbdFjdsChMu -EObkKvbdrafNLgLZ -EPDKjvbdelewGmJk -EOcKjvbdZMRctNlN -DoDLKvbdliEUQtqa -DncKjvbdqUUHSRjt -EPDKjvbduCbtwVno -DoCkKvbdaaVeFoow -EPDLKvbdkClKqGuH -DoDLKvbdCflFgAzc -DoDLKvbdTAEhgbPE -EObkKvbdmtuZjjRf -EObjjvbdKDKCqJbx -DncKjvbdrovOjDVf -DoCkKvbdhtzFWqtb -DncLKvbdEvYpQNKF -EOcLKvbdeFPRavcK -DoDLKvbdhlEcnUby -DoCkKvbdegjvSOQg -DncKjvbdhbPCeWpq -DnbjjvbdsrrTYyeD -DncLKvbdTlWPAvOi -EPCjjvbdwzHeexEr -DncLKvbdmJEUQuRa -DnbkKvbdkIHLeemk -EObkKvbdhtyeXSUb -EOcLKvbdHDkWKCJj -EOcLKvbdRbDdkhyL -EObkKvbdRosfifDw -EPCjjvbdOStVfduQ -DnbkKvbdiHJbxujV -DoCjjvbdsPuoJcWG -EPCkKvbdDxXktTtM -DoCjjvbdHDjujCJj -EObjjvbdUWLoisaR -EPDKjvbdqiAKEmOe -DoDLKvbdxmsIYShc -EPCkKvbdCJKbKiGK -DoDLKvbdRECaQRDr -EPDLKvbdYqNEiNEq -DnbkKvbdiMEcnVCy -DoCkKvbduCbtwVno -DoDKjvbdHbMZdzAD -DnbkKvbdemGXGmKL -DoDLKvbdgQBzwDwh -DoDKjvbdKQzEoGOF -DoDKjvbdWSNwaeMD -EPDKjvbdySmhlqbH -EObkKvbdDxYLtTtM -DnbjjvbdFxuVBEXb -EObjjvbdiBoCdwRR -EPCjjvbdGQATWgGZ -EPCkKvbdYpleJNEq -EOcLKvbdvPTzqKoU -DnbkKvbdZQmEhldq -DncKjvbdLBKgMawq -EPCkKvbdqFceTvAh -EPCjjvbdkIHMFenL -DoDKjvbdehLVqnRH -DoDKjvbdxwhibPyk -DnbkKvbdkMbMZeHP -EOcKjvbdsrrSyZeD -EOcLKvbdMowpunHT -EObjjvbdJqZdnfOF -DoCkKvbdezuxdhtX -DnbjjvbdaaWFFopX -DoCjjvbdqdFJQOVa -EPCjjvbdWWhwudFH -EPDKjvbdhtzFWrUb -EPCkKvbdWSNwaeMD -EObkKvbdcIlikFvx -EPCkKvbdauCGwkTh -EPCkKvbdbhmJkGWx -EPDKjvbdRosgJfEX -DnbkKvbdTvMQJtAq -DnbkKvbdsBfMlGkZ -DnbkKvbdVrNxCElD -DoDLKvbdmpZxukZC -EObkKvbdhlEcnVCy -EOcLKvbdwzIFfYFS -DnbkKvbdZtIhxdSn -DoDLKvbdjgfkfFmk -DoDLKvbdqTtHSRkU -EObjjvbdSCDeLiZL -DoDKjvbdeATplxJf -DnbkKvbdIBkzEzAD -EOcKjvbdFWZQPljF -DoCjjvbdRbDeMJYk -EPDLKvbdDoCkKvcE -DoCkKvbdZjShPfbG -DnbjjvbdNPxQvOGs -EPDLKvbdKyQirztf -DoDLKvbdJutecdfi -DoCjjvbdTppoUuHm -EPDLKvbdjEkGuPAO -DnbkKvbdVTmTekuj -DnbkKvbdZyEJmcMS -EOcKjvbdNddThhjd -DncLKvbdrDdhpNua -EOcKjvbdBiLBkJGK -DoCkKvbdrXPkbhxq -DnbjjvbdZQmEiMdq -DncLKvbdhzUfMROG -EPDKjvbduaEYroEh -DoCjjvbdJYUCHkqQ -DoCjjvbdwzHfFxEr -EPCjjvbdLiBkqYAS -DoDLKvbdxZgfFxEr -DoCkKvbdraemLgLZ -DoDLKvbdxxJJaozL -EPDLKvbdKeehBaRV -DoCkKvbdPIAYZAZB -EObjjvbdBvzdIdov -DoDKjvbdjblKqGuH -DoDKjvbdlhdURVSB -EPDKjvbdqvpMDJZR -DncKjvbdajkeoODA -EOcKjvbdkySqsZHU -DnbjjvbdJqZdnfOF -DncKjvbdZHWdAOsJ -DoCkKvbdaNLCStlg -DoDLKvbdVZHszKnn -DoCjjvbdtvOYJpsA -DoCjjvbdNPxQvNfs -DoDLKvbdZLqctOMN -EObjjvbdvwMAvAvV -DnbkKvbdEuxpPlie -DnbkKvbdAMhYsWyx -DoCkKvbdtumwjQsA -EPCjjvbdVAaprqRy -EObkKvbdlZSqsYgU -EObkKvbdBvzdIdov -DnbjjvbdyOShYTJD -EOcLKvbdZshhxdSn -EPDKjvbdUtMselWK -DoDLKvbdYqNEiMeR -DncLKvbddePSBwDK -DncLKvbdqYnggQcx -DnbkKvbdqceJQOVa -DoDLKvbdtSrTZZeD -EPCjjvbdANHyTWzY -DoDLKvbdcIlikFvx -DoDKjvbdxmsHwsIc -EObkKvbdYzbfRiuy -EPDKjvbdWHwuwfxz -EOcLKvbddndsLTsr -EObkKvbdwXMAuaVu -EPDLKvbdbVBfwjtI -EObjjvbdfMfXHMik -DoCkKvbdOXoVzdOU -DnbkKvbdnGeXlnHZ -EPCjjvbdGGJrOJTq -EPCkKvbdhanbeWqR -EOcLKvbdLhbLpxAS -EPDLKvbdbBVdepPw -EOcKjvbdWSNwadlD -DoCkKvbdaRfChTek -EPCkKvbdmbJvxOmu -DoCkKvbdCSaCsfXS -EObkKvbdbhljKewY -DncLKvbddZxowxpb -DnbjjvbdRDcBQQdS -DnbjjvbdKDJbqKDY -EObkKvbdWRmxCFLc -EPDLKvbdYlSETmkm -EOcLKvbdMIalRYAS -DoDKjvbdCEQAuimG -EPDKjvbdCTAcTewS -EPCjjvbdrRtkOKaN -DnbkKvbdtTRryZeD -DnbjjvbdMgColpVL -EOcKjvbdrDdhomua -EPDKjvbdRbDeMJZL -DnbkKvbdxnSgwrhc -DoDKjvbdVvhxVdFH -DncKjvbdLYqJrzuG -DncLKvbdZsiIyETO -EPDLKvbdieLHUoAO -EPDLKvbdNsUVgEuQ -EPDLKvbdoAKztHcn -DncKjvbdfNFvgNJk -DoCkKvbdqYoHgQcx -DncLKvbddwzUUSFz -DoCkKvbdIHGzZYXg -DncLKvbddZxpXxpb -DnbjjvbdhlFDnUcZ -EPCjjvbdSKxfUfjs -DoCkKvbdbAvFGPpX -EOcLKvbdVhXuwfxz -EPCkKvbddoEsKtTr -DncKjvbdhkeEOVDZ -EObjjvbdNUrqjmAX -EPDLKvbdUWLojTaR -DoDLKvbdWIYVwfxz -DnbkKvbdUtMsekvK -EOcKjvbdRpUHJecw -DoDKjvbdCJKbKiFj -EObjjvbdEuxoomJe -EPCjjvbdLrWlytpz -EObjjvbdMgDPlotk -DncLKvbdNrtWHFVQ -DoCjjvbdZeYGzgiC -EPCkKvbdKaKfmCYR -DoCjjvbdjlakzEfo -EPDKjvbdpeceTvBI -DnbkKvbdKDKCqJcY -DoDKjvbdMowqWNgT -EPDKjvbdRMxCYmtz -EObjjvbdrXQLbiYq -DncLKvbdZnmheFZj -EOcLKvbdiLeENtcZ -DncKjvbdzaAPGfal -EPCkKvbdeATqNYKG -EObjjvbdSCDdlIyL -DoCkKvbdVZHtZjnn -EPCjjvbdZtIhxdTO -EPDKjvbdTlVoAuoJ -EObjjvbdZRNFIleR -DoDLKvbdEPDLKwCd -DnbjjvbdfRaWzkbo -EPDLKvbddneSjstS -EObkKvbduCbtwWOo -EPCkKvbdmoyyWKyC -EPCjjvbdehLVrORH -DoDLKvbduCcUvuno -EObkKvbddZxowxqC -EObkKvbdKQydoFme -EPCkKvbdqqtkOKaN -DoDKjvbduaEYsOeI -EObkKvbdePEsLUTr -DoDLKvbdbsDLTcia -DncLKvbdDwwlTtUM -EOcKjvbdOEdUIhkE -DoDLKvbdtvOXjRTA -EObkKvbdeFPSCXCj -EPCkKvbdqlzJxlIJ -EOcKjvbdUMVoBVni -EPCkKvbdqqtkNkBN -DoDLKvbdiVZeWquC -DncKjvbdZLrDsmlN -EPCkKvbdzitopESt -EOcKjvbdnBjXYPOV -EObkKvbdehKurOQg -DoCjjvbdmJDsptrB -DnbkKvbdaNKbTVNH -DncLKvbdGQASvfey -EOcLKvbdtbcUwVno -EOcKjvbdqUUHSSLU -EOcLKvbdvwLaWBWV -EPCkKvbdRacdlIxk -DnbkKvbdxZgfGXeS -EOcLKvbdVAapsQqy -EOcLKvbdQvnECkhD -EPDKjvbdCWzchdpW -DoCjjvbdpedFUWBI -EPDKjvbdqvpMCiYq -EPDLKvbdEPDKjwCd -DncLKvbdGckWJaij -EObjjvbdgPazwEXh -DoCkKvbdUVlPitBR -DoCjjvbdMSXMzVQz -DnbkKvbdliEUQuRa -DoCkKvbdOStVgFUp -EPCjjvbdUtMtGMVj -DoCkKvbdKWVFdFHJ -EPCkKvbdUxhUZkOn -DnbkKvbdLBKflbYR -EPCkKvbdFkEsCglu -DnbkKvbdKCibpjCx -DnbkKvbdGLEsChNV -DoCjjvbdLGFhCApu -DncLKvbdeXzTsqez -DoCkKvbdxrmhlqbH -EPDLKvbdYlRdTmlN -EPCjjvbdqYnhHRDx -EPDKjvbdWfYzUAOs -EPCkKvbdMJCLpxAS -EObkKvbduCbtwVoP -DoCkKvbdmfdwlmfy -EPCjjvbdVBBprpqy -DoDLKvbdEKHivXjA -DoDLKvbdkWWnECYX -EOcKjvbdqUUHSRkU -DncKjvbdYlRcsnLm -EOcKjvbdelfWfmJk -EPDLKvbdZtIhxcsO -EOcLKvbdGKdrcINV -EPDLKvbdOAIsUKSA -DoCjjvbdXFxytAOs -EPCjjvbdUQpntuIN -EPDLKvbdTvLpJtBR -EPDKjvbdRyihSbvA -DnbjjvbdhyuFlROG -EObkKvbdZxcinClS -EOcKjvbdptTfqrKt -DoDLKvbdURRPUtgm -EObkKvbdaNKbTVNH -EOcLKvbdiZuFlQmf -EPDKjvbdePEsLUTr -EPCjjvbdFxuUaEYC -EPDLKvbdliETpuRa -EObjjvbdjKFhKNYS -DoCkKvbdwzHefXeS -DoDLKvbdFfJqmiUR -EObjjvbdcJMjKewY -EObjjvbdqdFIomua -DnbkKvbdFejRnJTq -DnbjjvbdEzsqFMCi -EPDLKvbdhzUelROG -EPDKjvbdLKaIWAKZ -DoCkKvbdGGJrOIsq -EOcKjvbdVUMtGMWK -EObkKvbdmpZyVkZC -DoDLKvbdJTYaSmXl -EObjjvbdmSZUyrci -EObkKvbdxnSgwsIc -EOcLKvbdhgJcYujV -DoDKjvbdUQpoVVHm -EPDKjvbdKWVFdEgJ -DoCkKvbdWXJXudEg -EObkKvbddxZtURez -DnbkKvbdZRMeJNEq -EOcKjvbdpxoIHRDx -EObkKvbdGGKSOJTq -EOcKjvbdkIHMFenL -EPDLKvbdTqQoUtgm -DnbjjvbdtvNxJpsA -DnbkKvbdFyUtaDxC -DnbkKvbdSLYeuHKs -DncLKvbdxrmhlrBg -DncLKvbdGdLWJajK -EPCkKvbdSPtHJfEX -EPCkKvbdeKJrVtzn -DoCjjvbdWRnXadlD -DncKjvbdhkdcmtby -DoDLKvbdVviYWEFH -EOcKjvbdTAFJICPE -EPCjjvbdCJKbLIej -DoDLKvbdyYJJaoyk -EPDKjvbdNsUVgFUp -EPCjjvbdrDdhomua -DoDKjvbdySnJNRag -EPCjjvbdyNrgxShc -DnbjjvbdADRxKZhp -DnbkKvbdaMkCStmH -EPDKjvbdfIKvRnRH -DnbkKvbdoAKztIEO -DnbjjvbdDjHjVwjA -EObkKvbdjuwODbYX -DoDLKvbdbhmKKfWx -EPDLKvbdKaLGlaxR -DoDLKvbdwzIGFxFS -EPCkKvbdGBOpxizm -EPDKjvbdRXODcMHc -EOcLKvbdYqNFJMdq -EOcKjvbdxUleQxkn -EPDKjvbdZirgpHCG -DncLKvbderAvzkbo -EPCkKvbdTvMPisaR -EPCkKvbdZtJIxdTO -EOcKjvbddePRavcK -DncLKvbdCDpAuimG -EPDLKvbdQdCaPqES -EObjjvbdZyEJmbkr -DoDLKvbdOEcsiIkE -EOcKjvbdrbFlkgLZ -EOcKjvbdRacdlJZL -EPCkKvbdKDKCqKCx -EPDKjvbdrDeIonVa -DncKjvbdOFEThhjd -DncLKvbdLAkHMbXq -EObkKvbdhytekpnG -DncLKvbdrSUkOLAm -DncLKvbdiCOcFWpq -DoCjjvbdrylPsAhO -EOcKjvbdxVNEpyLn -DnbkKvbdmbJvwnnV -DnbkKvbdVAbQsQrZ -EPCkKvbdCTBCtGXS -DncKjvbdTAEiHbPE -EObjjvbdFeiqnJTq -EPDLKvbdDxYMTtTl -DncLKvbdHDkVibKK -DnbkKvbddePSBvcK -DoCjjvbdauCGwkTh -EPDLKvbdWIYWYGxz -DoDLKvbdjcLjqHVH -DoDLKvbdTfznMXWF -DnbkKvbdkVwNcaww -EObjjvbdlYrrSxgU -DncKjvbdaNLCTUmH -EOcKjvbdznoqEblY -DncLKvbdjuwOEBww -DncKjvbdGQATXHGZ -EOcKjvbdiZuFkpmf -EPCjjvbdajlGOnDA -EPDKjvbdJcJbpjCx -DncKjvbdauBgXjtI -EPCkKvbdsZkpTAhO -EPCkKvbdOEdUIhjd -EOcKjvbdNsUWGduQ -DnbkKvbdVTltFlVj -EObjjvbdaNKasVNH -DnbjjvbdhancEvpq -EPDLKvbdZtIiZETO -DoDKjvbdFxuUaEYC -DoDLKvbdLGGHbAqV -DoDKjvbdqceIpOWB -DoDKjvbdvBEZTPEh -DoDKjvbdKefHbBQu -EPDLKvbdlZTSSyHU -DncKjvbdnPyyWKyC -EObjjvbdsZkpTBHn -DoCjjvbdaaVdepPw -EPDKjvbdtkwvaUAw -EObjjvbdEPCkKvbd -EPCjjvbdtkwvaUBX -DncKjvbdRbDeMIyL -EOcKjvbdxwhjBoyk -DoDLKvbdFxuVAcxC -DnbkKvbdxZgfFxFS -EOcKjvbdjhGkefNk -EOcKjvbdEPDKkWcE -EPDLKvbdQvnEDMID -EOcLKvbdqquKmjaN -DoCkKvbdZtJJZESn -EPDLKvbdTkvOaWPJ -DnbjjvbdcSbkUEJa -EObjjvbdQlxBxmtz -EOcLKvbdehKuqmpg -EObjjvbdpyOggQcx -DncLKvbdnVVZjjSG -EPCjjvbdyqOmIiwA -EPDLKvbddZxpXyRC -EObkKvbdRXODcMID -EOcKjvbdnHFXlmfy -EPDKjvbdznpQdcLx -EOcLKvbdqGDdtWBI -EPCjjvbdZoNhddzK -EOcKjvbdqTsgSSLU -EOcLKvbdRzJhTCvA -EOcKjvbdCIjbLIfK -DncKjvbdKQzEoGNe -EOcKjvbdACrXizJQ -EObjjvbdEzspdkcJ -EObkKvbdsZlQTAhO -EPDKjvbdfoazwEYI -DoDLKvbdjAQGaQGj -DoDLKvbdEzsqFMCi -EPDKjvbdyYJJapZk -DnbkKvbdIxUBglRQ -DoCjjvbdtTRsYyeD -EPDKjvbdGKdsDIMu -EOcLKvbdFyVVAcxC -DnbkKvbdZLrDtNkm -EPDLKvbdsrqrxydc -EPDKjvbdrpVnjCvG -DoDLKvbdmSYtzTEJ -EPDKjvbdajkfOmcA -EPDLKvbdssSSxzEc -EObjjvbdDxYMTssl -DnbkKvbdiMFEOVDZ -EOcLKvbdULvOaVni -EPDLKvbdlqyUzSdJ -EObjjvbdZoNheFZj -DncKjvbdcScLTdKB -EObkKvbdGLFTDINV -DncKjvbdcyyQYZRC -EOcKjvbdYqMeIldq -DoCkKvbdOEcshhkE -EObkKvbdirzhrjiz -EOcLKvbdxUmFRYlO -DoDKjvbdkyTRsZGt -DncKjvbdIryAsNYM -EObkKvbduWNxJpsA -DncKjvbdYkqcsnLm -DoDLKvbddZxpXyQb -DncKjvbdRotGiedX -DnbkKvbdKVtedEgJ -EOcKjvbdjvWnEBww -EObkKvbdFyVVAdXb -DoCkKvbdYlSEUNkm -EOcKjvbdcTDLTcia -EPCkKvbdzjUpQESt -DnbkKvbdqUTfqrLU -EPDKjvbdSQUHJfEX -DnbjjvbdiGjDYvKV -EObkKvbdhkdcnVCy -EPCjjvbdJuuFdFHJ -EObjjvbdYkqdTnMN -DoCkKvbdpssgSRkU -EObkKvbdUWLpKUBR -DoDKjvbdZsiJZESn -DnbkKvbdYqMdhmEq -DoCkKvbdjcLkRHVH -DnbkKvbdSPsgKGDw -DoDLKvbdKVtfEEfi -EPCjjvbdiGibyWKV -EPCjjvbdEYYLtUTl -EPCjjvbdFejSOIsq -DncLKvbdRECaQRES -EPCkKvbdEuyQQNKF -EObkKvbdxwhjCPzL -DncLKvbdiLeDnUby -EOcKjvbdEuxpQMie -EOcKjvbdIidAJogE -DoDKjvbdxsNhlqag -EOcKjvbdEzsqFLcJ -EObjjvbdYTMAmToY -DoDLKvbdwuNFQyLn -DoCkKvbdzitpQDrt -EOcLKvbdZtJIxdSn -DncLKvbdqZPHgRDx -EPDLKvbdMoxQvNfs -DncKjvbdmIctQuSB -DoCkKvbdFfKSNiUR -EPDLKvbdhtydvqtb -EObjjvbdxrnJNRag -DnbjjvbddoFTKssr -EPDKjvbdqlyjZLgi -DnbkKvbdyNsHwsJD -EOcLKvbdxnTHwsJD -EObjjvbdUQqOtuIN -DnbkKvbdwtleQyMO -DoDLKvbdrovPKDVf -EOcLKvbdFaPQxizm -EObjjvbdVAapsQqy -EOcKjvbdJvVFdFGi -DnbkKvbduDDVXVno -EObkKvbdZjTHpGbG -EObjjvbdZirgofaf -DncKjvbdAMgySvzY -DoDKjvbdGdLVibKK -DoDKjvbdWRmwbEkc -DncKjvbdXsMAlsnx -DoDLKvbdtcCuXVoP -DoDLKvbdqlyjYlIJ -EPCjjvbdHELVjCKK -DncLKvbdBdQAuilf -DoCjjvbdeFOrCXDK -DoCjjvbdRpTgJfDw -DoCkKvbdLAkHMbXq -EOcLKvbdaRebhUGL -DncLKvbdnQZyWLYb -EObjjvbdXsMBNUOx -DncKjvbdrSVKnKaN -EPCjjvbdAMhZSwZx -EOcLKvbdcScKtEKB -DncKjvbdKaLGlaxR -EOcKjvbdZRMeJNFR -EPCkKvbdwygeewdr -DnbkKvbdhancFXRR -EOcKjvbdOTUVfdtp -EPDLKvbdmbKXYOnV -DoDKjvbdGLFSbhNV -EPDLKvbdMfbomPtk -DnbkKvbdmIcsqVRa -DoDKjvbdwtmFRZLn -DoCkKvbddtAUATMv -DncKjvbdiBoDEvqR -EObkKvbdiHJcYujV -DnbjjvbdiCPDFWqR -EOcKjvbdyTNhlrCH -DoDKjvbdNQYRVmfs -EOcLKvbdFjdrbhMu -DoCjjvbdsrrSyZeD -EPCkKvbdXsMBMsoY -DoDKjvbdjhHLfFmk -EPCkKvbdyOTIYTIc -EOcLKvbdbhmKLGWx -DnbjjvbdxnTHwsIc -EOcLKvbdZoOJEeZj -EOcKjvbdjmBkzEfo -EPDKjvbdYORAXuWU -EPDKjvbdtkxXAsaX -DoDLKvbduaEYsPFI -EPCjjvbdypoNIiwA -DoDKjvbdVBCRTQrZ -DnbjjvbdlrYtyrdJ -DoCjjvbdhzUekpnG -EOcKjvbdcTCjsdJa -EObkKvbdbhlijfWx -EOcLKvbdYTLaMsoY -DnbjjvbdKVtedFGi -EOcLKvbdsPvPJbuf -DncLKvbdNrsvHEuQ -EObkKvbdmfeYMmfy -EPCjjvbdZjTHpHCG -DoDLKvbdpyOhGqDx -DoDKjvbdRkZGVGjs -DnbjjvbdRWnEDMHc -EPCkKvbdjlbMZdfo -DoCkKvbdyqOmIiwA -DoCkKvbddxZstSFz -DnbjjvbdKCibqJbx -DoCjjvbdqqtjnLBN -DnbjjvbdBhjbLJGK -DoDLKvbdrWokbhxq -EOcLKvbdJzpGXdAN -EPDKjvbdRMxCZNtz -DncKjvbdkClLRGuH -DncLKvbdIHHZxxXg -EPDKjvbdZshiYdSn -EPCkKvbdqcdhomvB -DoDKjvbdVTmUFkvK -EObkKvbdZisHogBf -DoCjjvbdRbDdkiYk -DnbkKvbdGGJrOJTq -DncLKvbdeFPRavcK -DnbjjvbdSPtHKGDw -DoDLKvbdJmADyfuB -EPCjjvbdKCibpicY -DoDLKvbdiGicZVjV -DoCkKvbdZLqdUNkm -EPDKjvbdVUNUFkvK -EPCjjvbdemFvflik -EPCkKvbdkxrqrxft -DnbkKvbdRbEElIxk -EPCjjvbdaaVdfQQX -DoDLKvbdySmhlqag -EPCjjvbdrRuKnKaN -DncLKvbdezuyEhtX -DnbkKvbdtbbuWuoP -DnbkKvbdZtIhxcrn -EObkKvbdcyxoxZQb -EOcKjvbdDxYLtTtM -EObjjvbdjggMFfOL -EPCkKvbdGckWJbKK -DnbjjvbdddnqavcK -EPDKjvbdYgWdAPTJ -DnbjjvbdbhlikGXY -DncKjvbdNPxRVmgT -EObkKvbdRpUHKGDw -EObkKvbdmfdwlmgZ -DoDLKvbdBvzdJFPv -DnbjjvbdZHXEAPSi -EPDKjvbdbQHGdLzd -EOcKjvbdCIjbLIej -DnbjjvbdOXnuzdNt -EObkKvbdrSUkNkBN -DoDLKvbdNeDsiJLE -EPCkKvbdiUyeXRtb -EObkKvbdbsDKsdJa -DncLKvbdbrcLTdJa -DncLKvbdSPsgJecw -EObjjvbdKNADzGta -EPDLKvbdFWZPomKF -EPCjjvbdRzKISbvA -EOcKjvbdvmWAMcdm -DncKjvbdwyhGGYEr -EPDLKvbdfHjuqnRH -EPCjjvbdRXOEDLhD -EPCkKvbdyOSgwsJD -DoDLKvbdnCKXYOmu -DnbjjvbdjmCLyeGo -DnbjjvbdTYKlNzjx -DoCjjvbdZisHpGbG -EObjjvbdUWMPisaR -EObjjvbdqFcdtWAh -EOcLKvbdYqNEhleR -DnbjjvbdlZSrSyGt -EPDLKvbdePEsLTsr -DncKjvbdSBcdlJYk -EPDKjvbdePEsLTsr -EPDKjvbdypnmIjXA -DnbjjvbdsQWPKCuf -EOcKjvbdZRNEhldq -EPCjjvbdYpmFImEq -EPCkKvbdKfFhBaRV -DncLKvbdezvZEhtX -DncKjvbdiCObdvpq -DnbjjvbdmJETqUrB -EOcLKvbdfpBzvcxI -DncKjvbdRbDdkhxk -EPCkKvbdmpZyVkZC -EPDLKvbdyNsIXrhc -DnbkKvbdyYJJaoyk -DncKjvbdwWlBVaWV -DoDKjvbdqwPlCiYq -DncLKvbdvvkaVaWV -DncKjvbdcJMjKewY -EObkKvbdbBWFFpPw -EPCjjvbdpyOhGqEY -EPDKjvbdCDpAujNG -EPDLKvbdCSaCtFvr -DoCjjvbdwygfFxEr -EOcLKvbdLFehBaQu -EPCjjvbdssSSxydc -EPCjjvbdHfgZyYYH -DnbkKvbdnBjWxOmu -DnbkKvbdcJNJjewY -EObjjvbdrzLoraIO -EOcKjvbdADRwjZiQ -EPCkKvbdOAJStJrA -DncLKvbdajkennDA -DoCjjvbdmbKWxPNu -EObkKvbdmbKXYPOV -DoCkKvbdKCjCpjDY -EPCkKvbdIjEAJogE -DoCkKvbdkHgLfGOL -DoCkKvbdJcJbqKCx -EPCkKvbdVUMtGMWK -DoDKjvbdNxOuzcmt -EPDLKvbdNQYRVnGs -DnbkKvbdzjUoocrt -DoDKjvbdDnbjjvcE -DoCkKvbdGBPRZJzm -DoCjjvbdtvNwjRTA -EPDLKvbdZQldhleR -DoDLKvbdUtMsfMWK -DnbkKvbdDxYLtTsl -DoCjjvbdmbJwYPOV -DoCjjvbdaNLCTVMg -DoCjjvbdWXIwvEFH -DoDKjvbddZxoxYpb -DncLKvbdijGHimXr -EPDKjvbdZQmEiMdq -DncKjvbdTulPisaR -DncLKvbdnGdxMnGy -EPCkKvbdlYsSSyHU -DoDKjvbdKRZePFme -DoCkKvbdZRNFJNEq -DncLKvbdkMbMZeGo -DoCkKvbdBiLBkIej -EObjjvbdWXIwvEFH -EOcLKvbdGGJqnJTq -DoDLKvbdRWmcblID -EObjjvbdxUleQxlO -DnbkKvbdREDBPpdS -DnbjjvbdiifHjMwr -EObjjvbdZLqctOMN -EPCjjvbdmRxtyrci -DoDLKvbdDxXlTtUM -DoDKjvbdxrmiNSBg -DoDKjvbdTppntthN -EObjjvbdnUtykKRf -DoCkKvbdRNYBxmtz -EOcLKvbdQYmAHTSK -EPCjjvbdZtIhxcsO -DoCjjvbdbsCjsdJa -EPDKjvbdsZkoraIO -DoDKjvbdEJhJvYKA -EOcLKvbdJSxaTMwl -DoDLKvbdANHxrvzY -EObkKvbdcTDKtDia -EPDKjvbdrWolDJZR -DoDKjvbdsQVnicVf -EPCjjvbdYSlAlsoY -EPCkKvbdJYUBhMRQ -DncLKvbdtlXwBUBX -EObjjvbdVrOYBeMD -EPCjjvbdcJNJkGWx -DncLKvbdjKGHjNXr -DncKjvbdRMwayOUz -EObjjvbdzdzOzdyp -DnbjjvbdNHColpVL -DoDLKvbdNddThiLE -EPDKjvbdFjdsCgmV -DnbjjvbdTJZjRABM -DncKjvbdOTTugFVQ -DncLKvbdVYgszLPO -DncKjvbdEARhlzWw -EPDLKvbdUGzmkvvF -DoDLKvbdmRyVZsEJ -EObjjvbdptUHRqjt -EOcKjvbdJpzFOeme -DnbkKvbdMgDPmPtk -EOcKjvbdhzUfMRNf -DoDLKvbdpyPHgQdY -DoCjjvbdZjShQHCG -EOcKjvbdOTTvGeVQ -EPCjjvbdRacdkiZL -DnbjjvbdzitoodTU -EOcKjvbdxxIjCPyk -EObjjvbdunszqLPU -EObjjvbdwjwDgzzG -DnbkKvbdUyHtZkOn -DnbjjvbdqvpMChyR -DnbjjvbdmIctRUrB -EObkKvbdNHCpMpUk -DoDKjvbdeFPSCXCj -EOcKjvbdtvOXjRTA -DncLKvbdZGvdAPSi -DoCjjvbdQcbaPpcr -DoDLKvbdVUMselVj -DnbjjvbdVgxWXgYz -DoDLKvbdjAQHBQHK -EOcKjvbdxxJKCPyk -DnbkKvbdQdDApQcr -DnbjjvbdqrUjmjaN -EOcKjvbdJzofYEAN -DoDLKvbdJvVGEFHJ -EObkKvbdJcJbpjDY -EPDLKvbdhanbdwRR -EObkKvbdiZtfLqOG -DoCjjvbdeOdsLTsr -DoCjjvbdSLZFuGjs -DoCjjvbdqTsfrRjt -EObjjvbdACqxKZhp -EPCjjvbdxZhFexEr -EPDKjvbdiBoCeXRR -DoDKjvbdqFcdtVaI -DnbkKvbdkClLQgVH -DnbkKvbdZQmEhldq -DnbjjvbdQYmAGrqj -DnbjjvbdiLddNuDZ -DoDLKvbdsQWOjDWG -EPDKjvbdVqnXaeLc -DnbjjvbdwNWANEFN -EPCkKvbdsBfNMHKy -EOcLKvbdKQzFOfOF -DoDKjvbdHELVibJj -EPDKjvbdcImJkFwY -DncKjvbdIwtBgkqQ -EObkKvbdANHySvyx -DoDLKvbdpxnhGqEY -EPCjjvbdrafNMHKy -DoDLKvbdSQTfiecw -DnbkKvbdiMEdOUcZ -EObjjvbdQmYCYnUz -EPDLKvbdWIYWXfxz -EPCjjvbdNeEThiLE -EObjjvbdHDkWJaij -DncKjvbdMgDQNPuL -DncKjvbdKWUedFGi -EPDLKvbdJYUCIMRQ -EOcLKvbdRacdkhyL -EPCkKvbdSBdEkhyL -EPCkKvbdMRwMzUpz -EPDLKvbdkxrqsYft -EObkKvbdRkYetgLT -EPCkKvbdNrsvHFVQ -DoCjjvbdqiAKFNOe -DoDKjvbddwystRez -EOcKjvbdrylQTBHn -EPDKjvbdDjHjWXjA -EObjjvbdCIkCLJGK -DnbjjvbdqwPlDJYq -EPCjjvbdnVUzLKRf -EOcLKvbdUxhUZjnn -DnbjjvbdRpUHJecw -DnbjjvbdjhGlFfNk -EObkKvbdJKEAKPgE -DoDLKvbdIidAKPgE -DncKjvbdCSaCtGXS -DoCjjvbdIidAKQHE -DnbkKvbdFjdsCgmV -DoCkKvbdGKeTCglu -EOcKjvbdEzspeMDJ -EOcLKvbdqUTgSSKt -DoCkKvbdnBivwnmu -DncLKvbdJcJcRKCx -EPCjjvbdVwJXucdg -DnbjjvbdKVuGEFHJ -DncLKvbdnVUzKjSG -DoCkKvbdqGDeTuaI -DnbkKvbdLFfICBQu -DnbkKvbdZjTIQGbG -DoDLKvbddBrlrATm -DncKjvbdYNqAXtut -DnbjjvbdURROtuHm -EObjjvbdxmrgxSiD -DoCkKvbdjJfHjMwr -DncLKvbdNwoVzdOU -EPDLKvbdyTNhlqbH -EObkKvbdiMEcnUby -DoDKjvbdJcKCqJbx -EPDLKvbdNrtVgEtp -DncKjvbdjEkGtoAO -DoDKjvbdNVSrKmAX -EOcLKvbdxmsIYTIc -EObkKvbdcTDKtDjB -EPDLKvbdxsOIlrCH -DnbkKvbdbrbjsdKB -DoCjjvbdpfEEtWAh -DoCkKvbdMowqVmfs -EPCkKvbdeATqMxJf -EObkKvbdjJehJmYS -EPDKjvbdxmrhYSiD -EObjjvbdjbkkQgUg -DoCjjvbdYlRdUNlN -DoDLKvbdiHKDZWJu -DoDKjvbdpedEsvAh -DoCkKvbdEuyPomJe -EPCkKvbdhtyeWrVC -DncLKvbdbAvEfQQX -DnbjjvbdTkvPBWPJ -DncKjvbdYlRdUOLm -DncLKvbdCIjajiGK -EPDKjvbdUtNTfLuj -DnbkKvbdKVuFdEgJ -DoDKjvbdfVzwoizs -EPCjjvbdySmiMrBg -EPCkKvbdrpWPJcVf -DoDKjvbdcImJjewY -DoCkKvbdkVvnECYX -DncKjvbdWRnYCEkc -DoDKjvbdCIkBjhfK -EObkKvbdmIdURVSB -DoCkKvbdTppoUuHm -EPDLKvbdUQqOtuHm -DnbkKvbdhgKDYvJu -DnbkKvbdkHgLfFmk -EPDLKvbdCDoaVjMf -EPCkKvbdehKvSNqH -DncKjvbdNeEUJJLE -DncKjvbdlhdTqVSB -EOcKjvbdEuxpPmJe -DncLKvbdqceIpNua -DnbjjvbdnVVZjjRf -DnbkKvbdKDJcRJbx -EObkKvbdnHEwlmgZ -EOcLKvbdFWZQQMjF -DoDKjvbdKWUedEgJ -DoDLKvbdmozZVkZC -DoCkKvbdZdxGzhJC -EObkKvbdGQATWffZ -EPCkKvbdJuuGDeHJ -DoCkKvbdiGibxvJu -DnbkKvbdBraDUGXS -EPDLKvbdiHKDYvKV -DnbjjvbdZxcjODMS -DnbkKvbdnGdwlmgZ -DoDKjvbdkxsRrxgU -EOcKjvbdrzMQTAgn -DncLKvbdjhHLfGOL -DnbjjvbdQvnEClID -DoDKjvbdqdEhomvB -DoDLKvbdGdKvKCJj -DnbjjvbdqvpLbiYq -EObjjvbdsPvOjCuf -DoDLKvbdVqnXbElD -EPDLKvbdeEoRbXCj -DoCkKvbdyYJKBoyk -DoDLKvbdlhdURUqa -EPDLKvbdYkqdTnMN -DoCkKvbdnGdwmNgZ -EObkKvbdGGKSOIsq -EObjjvbdLLAgvAJy -DnbjjvbdajlFnmcA -DoDLKvbdiifHimYS -EPCjjvbdnPzYukYb -EPDLKvbdVYhTyjnn -EOcLKvbdfNFwHNJk -DoCjjvbdbrbkTcia -DncLKvbdRkZGVHLT -EObkKvbdSQUHKFdX -EOcKjvbdSKxeuHKs -DncKjvbdFxuUaDwb -DoCkKvbdaSGDHtFk -EPDKjvbdZyDimcLr -EObjjvbdiGibxvJu -EPCkKvbdDwwktTsl -EPDKjvbdRadEkiZL -EPDKjvbdmgEwlmfy -DncLKvbdaogHDkzd -EOcLKvbdjuvmdCXw -EPDKjvbdqwPlCiYq -DoDKjvbdLBLHNBxR -EObjjvbdeFOrBvbj -EPDKjvbdFyVVAdYC -EPDLKvbdKNADygUa -DncKjvbdbVCGxLUI -DoCkKvbdJSyArmXl -EObkKvbdQvnDbkgc -EObjjvbdrEEiQOWB -EOcKjvbdZMSDtOLm -DoDKjvbdQvmccLhD -EPCkKvbdrzMQTBHn -EPDKjvbdMgCpNQUk -DoDKjvbdmbJwYPOV -EOcKjvbdgGLymgHA -EObjjvbdsrqsYzFD -EPDLKvbdrNZiyLgi -DnbkKvbdiiegimYS -DoDKjvbdqwQLcJYq -EObkKvbdaNLCSuNH -EPCkKvbdnUuZkJqf -EPCjjvbdSCEEkiZL -DncLKvbdVZHszKnn -DnbjjvbdUtMsfLuj -DoDKjvbdxmrgwriD -DoCkKvbdxxJKBpZk -EObkKvbdZMRdUNlN -EObkKvbdbPgHDkzd -EObkKvbdqqtjnLAm -EPDKjvbdURROuUhN -DoDKjvbdCWzdJFPv -DoDLKvbdMSXMytpz -DnbjjvbdqlyjZMHi -DoDKjvbdbsDLUDia -EOcLKvbduVnXiqTA -DoCjjvbdDxYLsssl -DoDLKvbdyqPMiJwA -EObkKvbdeOdsLUUS -EOcKjvbdEuyQQMjF -DoDKjvbdEztQeMDJ -EPCkKvbdGZVVBDxC -DnbkKvbdnGdxNNgZ -DoCkKvbdcIljLFvx -DoCjjvbdYqMdhmEq -EPDLKvbdgKfzbfAE -EPCjjvbdJcKDRJcY -EOcKjvbdOFDtJJLE -DncKjvbdiLdcmuDZ -EObkKvbdrWpLcJZR -DnbkKvbdVAaqTQrZ -DnbjjvbdFkFTChMu -DncKjvbdaaWEepQX -EPCkKvbdpedEsvAh -DncKjvbdjAQGaPfj -DoDKjvbdbUbHXkTh -DoDKjvbdRjyFtfkT -EOcLKvbdOTTvHEtp -DoCjjvbdRkYfVGjs -DncLKvbdzoQRFCkx -DncKjvbdrMzJyMHi -EOcKjvbdULvPBWOi -EOcLKvbdzdynzdzQ -EPCjjvbdtumxJpsA -DoDLKvbdwMvAMcdm -EOcLKvbdqceIonVa -EObjjvbdOEdUIiKd -EObjjvbdHELVjBij -EObjjvbdqcdiPmvB -DoCjjvbdJvVFdFGi -EPDKjvbdWRmwaeLc -EPDKjvbdZxdJnDMS -DoDKjvbdZxdJnDMS -EObjjvbdxUldpxkn -DnbkKvbdSLYetfjs -EPDLKvbdYqMeIldq -DoCjjvbdrMyjYlIJ -EObkKvbddxZtTqez -EPCkKvbdWSNxCElD -DoDKjvbdWWiYVcdg -DoDLKvbdqGDdsvAh -EOcLKvbdhzVFlRNf -EOcKjvbdaNLCSuNH -DnbkKvbdkHgMFfNk -DnbkKvbddePRbXDK -DncKjvbdNVTSKmAX -EObkKvbdhzUfLpmf -EOcKjvbdZMSDtNkm -EPDKjvbdTqROtuHm -DoCkKvbdddnqbXCj -DoDKjvbdliEURVSB -DncKjvbdtvNxKQsA -DnbjjvbdqceJQOVa -EPDKjvbdpyOggQcx -EOcKjvbdtcDUvuoP -EObjjvbdrWpMChxq -EPDKjvbdGYttaEYC -EObjjvbdiifIKNYS -DoCjjvbdZyEJmcMS -EPDLKvbdKQzFOfNe -DoCkKvbdqYoIGpdY -EPDLKvbdxwhibPzL -EPDKjvbdRadElJYk -DoDLKvbdtkwwAtAw -EPCjjvbdDjHjVxKA -EPDKjvbdrzLosBIO -EPCkKvbdBdPaVimG -DoCjjvbdrafMkfjy -EPDKjvbdNGcPmQVL -DoDLKvbdVviYVdFH -EPCjjvbdkVwODaxX -DncKjvbdkMbMZeGo -EOcLKvbdfkGzbfAE -DnbkKvbdpyOhHQdY -DoDKjvbdQdCaPqES -EObjjvbdEKHiuxKA -DnbjjvbdpxnhGpcx -DnbkKvbdkxsSSxgU -DnbjjvbdURQnuUgm -DoDLKvbdTukpJtBR -EPCkKvbdqAiFAWgd -DnbjjvbdgGLymfgA -EOcLKvbdyYIibQZk -DoDLKvbdWHxVxGxz -EPDLKvbdFyVVAdXb -DnbkKvbdrRuKnKaN -DoDLKvbdTpqOttgm -EPDKjvbdLhbLqYAS -DoCjjvbdHELVjCKK -DncLKvbdfSBWzlDP -DoCkKvbdRDcBPpdS -DoDLKvbdsQWPJcVf -EPCkKvbdySmiMrCH -EPCkKvbdbUbHXjtI -DoDLKvbdUtMsfLuj -EPCjjvbdEvZQPmKF -EObjjvbddeOqbXDK -EPDKjvbdkClKqGtg -DncKjvbdqiAJdmPF -EOcLKvbdlrZUyrci -EOcKjvbdbBVeFpPw -EOcLKvbdULvPBWOi -EPCkKvbdcJMjLFwY -DnbjjvbdZtIhxcsO -EPDLKvbdSPtHJfDw -EObkKvbdaNLBsUlg -DoDLKvbdqvpLcIxq -DoCkKvbdpxoIHQcx -EPCkKvbdlZTRsZGt -DoCjjvbderBWzkcP -EPDLKvbdZtJIxdSn -EOcLKvbdmoyyWKxb -DoDLKvbduaDxroEh -EPDLKvbddoErkTtS -DncKjvbdnPzYvKxb -EObjjvbdsZlPsAhO -EPDLKvbdjJfHjMxS -EOcLKvbdbsDLUDia -DncLKvbdMuTSLNAX -EPDLKvbdemGWfmKL -EObkKvbdKefHbBQu -EOcLKvbduVnXjRTA -DnbjjvbdGZVUaEYC -EOcKjvbdkNCMZeGo -EPCkKvbdGKeSbgmV -DoDKjvbdqrVLNjaN -DnbjjvbdEASIlzWw -DnbjjvbdeOdrkUUS -DncKjvbdDjIJvXjA -DoCjjvbdqGEFUWAh -EPCjjvbdQcbaQRES -DnbkKvbdhtydwSUb -DoCkKvbdMuTRjmAX -DnbjjvbdJutfEEfi -EPCjjvbdzGxlAMeX -DncLKvbdIHGyyYYH -DoDLKvbdxUmEqZLn -DnbkKvbdNHCpMotk -DnbjjvbdFyVVAcwb -EPCjjvbdShzJqABM -DnbjjvbdcyxoxZRC -EPCjjvbdqquKnLBN -DncLKvbdcIlikFwY -DoCkKvbdeOeSkTsr -EOcLKvbdYpldhldq -EPDLKvbdQYmAGsRj -DoCkKvbdzGyMAMeX -EPCkKvbdqrVKnLBN -EObkKvbdxUldpxlO -EPCjjvbdfIKuqnRH -EPDKjvbdFWYpQMjF -EPDLKvbdOFEUJJKd -EOcLKvbdHEKvKBij -DoDKjvbdjcMLRHUg -EPCkKvbdWXIwudEg -DncLKvbdgPazvcwh -DnbjjvbdnVUykJrG -EPCjjvbdxxJJbPyk -DncLKvbdjJehKMxS -DncKjvbdEzspdkbi -EPDKjvbdrpVnjDWG -DnbjjvbdVrOYCFLc -DoDLKvbdMfbpMotk -DncKjvbdbhljLGWx -DncKjvbdxrmhlrBg -EOcKjvbdbKlGPODA -DoDKjvbdJvUfEFHJ -EPCkKvbdySnIlqag -EPDKjvbdVAbQrpqy -DnbjjvbdrykosAhO -DnbkKvbdKfFhCBQu -DnbjjvbdEXwktTsl -DoDKjvbdDoDLLXCd -EObkKvbdvwMAvAvV -EObkKvbdXsLaNUOx -DnbkKvbdRDcBQRES -EOcLKvbdZisIPgCG -DoDKjvbdpfEEtWBI -DoDKjvbdfoazwDwh -EPCkKvbdFpASvffZ -EObjjvbdRWnDblHc -DoCkKvbdNxOuzdOU -DncLKvbdYlSDtOLm -EPCjjvbdjbkjqHVH -EPCkKvbdrMzJxkgi -EPDKjvbdCIkBjhfK -EPCkKvbdUslsekvK -EOcKjvbdFejRnJUR -EPDLKvbdNHColotk -EPCjjvbdUxgtZjnn -DoDKjvbdEOcLLXCd -EPCkKvbdkHflGFnL -EPCjjvbdwygfFxEr -DncKjvbdeOdrjtTr -DoDLKvbdqTtHRqjt -EPDLKvbdQwNdCkgc -EPCkKvbdhzVGLpnG -DoDKjvbdxwiKCPzL -EPCkKvbdZirhQGbG -DoCjjvbdqrUkOKaN -DoDLKvbdlrZUysEJ -DoCjjvbdqFdFUWAh -DnbjjvbdyYJKCPzL -DncKjvbdxUldpyMO -EPCjjvbdvAcyTOeI -EObjjvbdLFegaaRV -DncKjvbdemFvgNKL -EOcLKvbdjcLjqHVH -DoDKjvbdRMxCYnUz -EPDLKvbdRjxfUfkT -DoDLKvbdiMEdNuDZ -DoDLKvbdZRMdhmEq -DoDLKvbdqlyiyLgi -EObjjvbdiiehJmYS -DoCjjvbdwuMeRYlO -EPDKjvbdqquKmkAm -EOcKjvbdlrYtysDi -EPDLKvbdliETqUrB -EObjjvbdePErkTsr -DoDLKvbdfHjvRnQg -EObjjvbdRXOECkgc -EObkKvbdMpXqWOGs -DncKjvbdEJhJvYKA -DoCkKvbdVrOYBeMD -EPDKjvbdTkvPBWOi -EOcLKvbdjuvmcbYX -DncKjvbdMfcQMouL -EOcLKvbdMpXpvOHT -DoCjjvbdiLdcmtcZ -DnbkKvbdiHJcZWJu -EPDLKvbdTqQnuUgm -DncKjvbdLGFgbBQu -EPDKjvbdNdctIiLE -EPDKjvbdZxdKODLr -DoDKjvbdSZjITCvA -EPCjjvbdDwxMUTsl -EPCkKvbdySmhmRag -EOcLKvbdSPtHKGDw -DoDKjvbdmIctRUqa -DoDKjvbdaRfChTek -DncLKvbdyNrhXsIc -DncLKvbdJTZBSlxM -DoDKjvbdFeirOIsq -DnbjjvbdJutedFHJ -DnbkKvbdUsltGMWK -DnbkKvbdbhljLGWx -EPCjjvbdirziTLJz -EOcKjvbdnPzYvKyC -DoDKjvbdkDMLRGtg -DncLKvbdyzeNqhIh -EPCjjvbdYTMAmUPY -DoCkKvbdgGMZnHHA -DncLKvbdlZSqsYft -EOcLKvbdZjShQHCG -DnbjjvbdjhGlGGNk -DoDLKvbdkxsRryGt -DoCjjvbdZyDjNbkr -DnbkKvbdNeEUJIjd -EOcKjvbdxxJJbPyk -DoDLKvbdRbDeMIxk -EObjjvbdrDeJPnWB -EPCkKvbdrXPkbiYq -EPCjjvbdeFPRbWbj -DncLKvbdHffyxxYH -EPDKjvbdcyyQYZQb -DoCkKvbdNsTvGeUp -EPCkKvbdfpBzwDxI -EPCjjvbdqTtHRrLU -EPCkKvbdhgJbxvJu -EOcKjvbdkxsRryGt -EPCkKvbdZshhyETO -DnbkKvbdrWpLbiZR -EObkKvbdnHExMmfy -DnbkKvbdbUbGwkTh -DnbkKvbdnHExMnHZ -EObjjvbdZnmiFEyj -EObkKvbdSQUGjGDw -EPCkKvbdqTtGrRkU -EObjjvbdcImKLGXY -EObkKvbdShzJqAAl -DncLKvbdGGJqnIsq -DnbkKvbdehKuqmpg -DncLKvbddeOrCXDK -EOcLKvbdRMwbYmtz -DnbjjvbdgFlZmgHA -DnbkKvbdyOSgxTJD -EOcLKvbdQZNAGsSK -DoCkKvbdRMwayNtz -DncLKvbdezvYeItX -EOcLKvbdVAapsQrZ -DoCjjvbdcImKLFwY -DoDKjvbdTqQnttgm -DnbjjvbdOEdUJIkE -DoDKjvbdeYZssqez -DnbjjvbdZjSgpHCG -DoCkKvbdTvMPisaR -EOcKjvbdZjSgofaf -EPDLKvbdfVzwoizs -DnbjjvbdCSaCsewS -EPDLKvbdFVyPpMjF -EObkKvbddjJrVtzn -DnbjjvbdyOSgxTIc -EOcLKvbdrovPKDVf -DnbjjvbdxZhGGXeS -DncLKvbdbLLeoNcA -EOcKjvbdMfbomQUk -EPDLKvbdaRebhTfL -DoDLKvbdoAKztHcn -EOcLKvbdGckWJbJj -DncLKvbdqmZjYlHi -DncKjvbdZyDinDLr -DoCkKvbdxwhibPzL -DnbkKvbdZoOJFFZj -EPDLKvbdYpmEiMdq -DoCkKvbdiUzFWquC -DnbjjvbdsPvPJcVf -DncKjvbdDwxMTssl -EObkKvbdZQleJNEq -DoDLKvbdWSNxBdkc -DoCjjvbdcSbkTcia -EOcKjvbdqvolChyR -DnbjjvbdqlzJxlHi -DoCjjvbdlrZUzTEJ -EPCkKvbdGdLWJbJj -EObkKvbdzoPqFDLx -DncLKvbdANIYrwZx -EObjjvbdSPsgJfEX -DoCjjvbdbiNJjfWx -DnbkKvbdMfbpNQVL -EObkKvbddePRbXCj -EPDKjvbdShzKRAAl -DoDKjvbdnPyxukYb -EObjjvbdVZITzKoO -EPDLKvbdZyDinDMS -EPCjjvbdYpldhmFR -DoCkKvbdZjTIPfaf -EObjjvbdqdEiPmua -DnbkKvbdRadEkhxk -EPDLKvbdzjVPpDrt -DnbkKvbdaMkBsUlg -DncLKvbdMpXpunGs -DoDKjvbdUxgszLPO -EPCkKvbdiiegilxS -DoCjjvbdEOcKkWbd -EOcLKvbdcTDLUEJa -EPDLKvbdZtIiYcrn -DoDLKvbdmttyjirG -EPDLKvbdGdLVjBjK -DncLKvbdDigjVxKA -EPCkKvbdelfWflik -DoDKjvbdOTUVfdtp -DncKjvbdTlWOaVni -EPDKjvbdrpWOibvG -EPDKjvbdfRaWzlCo -DncKjvbdlrYuZrdJ -DoDKjvbdIsZBSlwl -EPDLKvbdqquLOKaN -DnbjjvbdJmAEZgUa -EPCkKvbdcImJkFvx -DncLKvbdkxrqsYft -EPCkKvbdUWLojTaR -DoDKjvbdnGeXlmfy -DoCkKvbdiMFDmuCy -EPDKjvbdauCHXjtI -DoCjjvbdBsAcUGXS -DoDKjvbdACrYJyhp -DoDKjvbdsZlPsBHn -DoDLKvbdjJegimXr -DoDKjvbdWXIwvDdg -DncKjvbdelewHNJk -EObkKvbdyTOJMrCH -DoCkKvbdNddUIiKd -DoCkKvbdRyjHrbvA -DoCjjvbdiGjCyWKV -DoDLKvbdhlFEOVDZ -EPCkKvbdQdDAoqDr -DoDKjvbdBiLBjhej -EOcKjvbdqlyjZLgi -DncLKvbdtSrTYzFD -DoCkKvbdrMyjYlHi -EObjjvbdhficYuiu -DoDKjvbdfekymgHA -EOcLKvbdiifHjNXr -EObjjvbdIwsaglQp -DoCjjvbdCIkBkIfK -EPDKjvbdaSFcHsfL -DoDLKvbdMgDPlpUk -EPDKjvbdqYnggQdY -DoDKjvbdaSFbgsek -DoCjjvbdiZtekqNf -EPDLKvbdkClKpftg -DoCkKvbduMYWaUAw -EObkKvbdtTSTYydc -DnbjjvbdptUGqrKt -EObjjvbdYlRctNlN -DncKjvbdMgDQNPtk -DncLKvbdILaznXQk -DoDLKvbdiCPDFWpq -DoCkKvbdiGicZWKV -DncKjvbdFjdrbglu -DncLKvbdKWUfDeGi -DoCjjvbdVhXuwgYz -DoDKjvbdhtzFWquC -EPCjjvbdRpTfiedX -DoCkKvbdKVuFdEfi -DoDLKvbdbBWEfPow -DoCkKvbdZyDjODLr -DncLKvbdeAUQmXif -DoCkKvbdIidAKQHE -EPCkKvbdTqROuVIN -DncKjvbdRXODcMID -DoDKjvbdkyTRsZHU -EPCjjvbdxnTIXrhc -EObjjvbdJzofXdAN -EOcKjvbdiBncFWpq -EObkKvbdYORAXuVt -DnbjjvbdiMEdNtby -EPDKjvbdVrOXbFMD -EPCkKvbdAMgxrwZx -DoCkKvbdtbbuXVoP -EPCjjvbdDoCkKwCd -DncLKvbdVBBpsRRy -DoDKjvbdemGWgMik -EObkKvbdeEnqbXDK -EPCjjvbdhanbdvqR -DnbkKvbdmaiwYOnV -DoCjjvbdcJMjLGXY -DnbkKvbdIryArlxM -EPCjjvbdtkwvaUAw -DnbkKvbdxZgefYFS -EPCkKvbderBWzlDP -EPCjjvbdNxPVzdOU -EPDKjvbdaSGDHsek -EOcKjvbdqcdhpOVa -EPCkKvbdxmsHxShc -DoDKjvbdDncKjwDE -DoCjjvbdYpmEhmFR -DncKjvbdaRfCgsfL -EObjjvbdegjurNpg -DnbkKvbdjhHMFenL -EPCjjvbdMfcPmQUk -EOcLKvbdACrYKZhp -DoDKjvbdffMZmgHA -DoCjjvbdaaVeGQQX -EOcKjvbdSCDdkiZL -EOcKjvbdqwPlCiYq -DoDKjvbdajlGPODA -DncLKvbdJYTbHkpp -DncLKvbdtcDVXWOo -EPCjjvbdEXxLtTsl -EPCjjvbdJuteceGi -DnbjjvbdDoCkLWbd -DoCkKvbduCbtwWOo -EPDLKvbdauBgYLTh -EPCjjvbdOXoVzcmt -DoCkKvbdRMxByOUz -DoCjjvbdqYoIGqDx -EPCjjvbdNGbpMpVL -DoCjjvbdJpzFOfNe -EOcKjvbdVAapsQrZ -DncKjvbdpxoIHQcx -EOcKjvbdRaceLiZL -DncLKvbdtcCuWvOo -EObjjvbdbBVeGPow -DnbjjvbdKyRKSzuG -EOcLKvbdFyVUaEYC -EPDKjvbdkCkkRHUg -EObkKvbdKaKfmBxR -DoDLKvbdbUbGwjsh -DnbjjvbdrovOjDVf -EPCjjvbdZsiIyDsO -EObjjvbdRDbaPqDr -EOcKjvbdnBivwnmu -EPCjjvbdYTMBMsoY -DoDLKvbdxKwEHzzG -EPCkKvbdqTsgRqkU -EPDKjvbdfMfWgNKL -DnbkKvbdznpREbkx -DncKjvbdJXtCHlRQ -EPDLKvbdGYuVBEXb -EPDKjvbdZLrEUOMN -EPDKjvbdtcCtvuoP -EObjjvbdXsLaNUPY -EPDLKvbdyOTIYSiD -EObjjvbdsrrTYyeD -EObjjvbdZisHpGaf -DoDLKvbdvOszqLOt -DncLKvbdaMjbSuNH -DncLKvbdYTMBMsoY -EPDKjvbdwzIGFxFS -EPDLKvbdmRyUyrci -DncLKvbdTkvPBWOi -EPCjjvbdNdcsiIjd -EPCkKvbdEzspdkbi -EObkKvbdrovOicVf -DoDKjvbdhbObeXQq -DncKjvbdZnnIeFZj -EObkKvbdRECaPpdS -EOcKjvbdnGeXlnHZ -EPCjjvbdauCGwjsh -EPCjjvbdczYpXyRC -EOcLKvbdDihJuxKA -EOcKjvbdkVwNcbXw -EObjjvbdbsCkTcia -DoCkKvbdfMewHNKL -DoCjjvbdxZgeexEr -EOcLKvbdiBoDEwQq -DnbkKvbdpstHSSKt -EOcKjvbdQvmdClHc -EPDKjvbdIxUBhLqQ -EObkKvbdZtJIyESn -EPCjjvbdtumwjQsA -DoCjjvbdNPxQunHT -EOcLKvbddndrkUTr -EObjjvbdCTBCsevr -EOcKjvbdiUzEwRuC -EPDKjvbdRyigrbvA -DoCjjvbdezvYeJTw -EOcLKvbdVgxVxGxz -DnbjjvbdZeXfzhIb -DncKjvbdxZgfFweS -DoCkKvbdKxqKSztf -DncLKvbdpyOggREY -EPDLKvbdXrlBNUOx -EPCkKvbdqwPkbiZR -EPDLKvbdbsCjscia -DoDKjvbdnGeYMmgZ -EOcLKvbdUsmTfLvK -DnbkKvbdjuwOEBxX -DnbjjvbdTAFJICPE -DncKjvbdEuxoomKF -EPDKjvbdeOdsLTsr -EObkKvbdZshiYdSn -DncKjvbdcTDKscjB -DncLKvbdvwMBWAvV -EOcKjvbdVwIwudFH -EPDLKvbdlZTSSxgU -EOcKjvbdMgColotk -EOcLKvbdZdxGzgiC -DnbjjvbdULuoBWOi -EObjjvbdiCObeXQq -EPDKjvbdNUsRkNAX -DoCjjvbdZxcjOClS -DncLKvbdiUzEwSVC -DoDLKvbdvlvAMceN -DoDLKvbdqcdhpOWB -EObkKvbdCSaDUGWr -DoCkKvbdssSTYydc -DoCkKvbdnGdxMmgZ -DoCkKvbdHELWJbKK -DoDKjvbdKefHbApu -EObkKvbdVqmwbFLc -DoCkKvbdUtNTekuj -EPDLKvbdTlWOaVni -DoCjjvbdDxXkstUM -EPCkKvbdpxoHfqEY -EPDKjvbdmSYtzTEJ -DoCjjvbdddnrCXDK -EPCkKvbdZjTHpGbG -DncLKvbdhzVGLqOG -EPCjjvbdZjSgogBf -EPDLKvbdkDLjqGuH -DncLKvbdxUmFRZLn -EPDLKvbdjhHMFfNk -EPCkKvbdZjTHpHBf -EObkKvbdegkVqnQg -EPDLKvbdGYttaEXb -EObjjvbdZdwfzhJC -DoCkKvbdGQASwHFy -EPDKjvbdkVvnDbXw -EObkKvbdJYTagkqQ -DoCjjvbdMSWlzVQz -DoCjjvbdnGeYMmfy -DoDLKvbdADRxKZiQ -EObkKvbdZLqdTmkm -EPCkKvbdFeirOItR -EPCkKvbdRjyGVGjs -DncLKvbdiMFDnUcZ -EObkKvbdVAaqSpqy -EPCkKvbdULunaVni -DnbkKvbdcImKKevx -DoCjjvbduaDyTPFI -EPDKjvbdKQydoFnF -EPCjjvbdozmcjwoA -DoDLKvbdZLqdUNlN -DoDKjvbdJXsbHkpp -DoCkKvbdelfXHNJk -EObjjvbdeFOqavcK -EPDLKvbdqlyjZMIJ -DoCjjvbdUtMsekvK -DoCkKvbdIxUBhMQp -EOcKjvbdemGWgMjL -DoCkKvbdwuMeQyLn -DncKjvbdkClKpgVH -DoDKjvbdfNFvflik -DncKjvbdhkdcmuCy -DoDLKvbdCJKakIfK -DnbkKvbdSQTgJfEX -DnbkKvbdkIGlGFmk -DoDKjvbdySmhlqbH -DoCjjvbdGdLVibJj -EPCjjvbdSLZGUfkT -EPDLKvbdSKxfVHKs -DoDKjvbdGLFSbhMu -DoCkKvbdqFcdtWAh -EOcLKvbdbVBfxLUI -DoDKjvbdcScKsdKB -DnbkKvbdVwJYWEFH -EPCjjvbdGQASwHFy -DnbjjvbdqUTfrRjt -EPDLKvbdEYYMTtUM -DoDLKvbdfNFwHNKL -EObkKvbdsQWPJbvG -EOcKjvbdIsYaSmYM -EPDKjvbdBdQAuilf -DnbkKvbdrounibvG -EObkKvbdiCPCdvqR -EOcLKvbdBsAbsfXS -DoCjjvbduDDVWuoP -EPCkKvbdbsCjtEJa -EOcKjvbdcTDLTdKB -DoCjjvbdXGYytAPT -DnbjjvbdePFTLTsr -EObkKvbddoErjssr -EPCkKvbdcTDKsdJa -EPDKjvbdjgflGFnL -EObjjvbddeOqbWcK -EObkKvbdACqwizJQ -EObjjvbdHgGyyXxH -DoCjjvbdqlzKZMHi -DnbjjvbdhfibxvJu -DoDKjvbdSCEFLiZL -EPCjjvbdSCEFLiYk -EObkKvbdiLdcmuDZ -EObkKvbdzGyMAMeX -EPDKjvbdVYhTzKoO -EPCkKvbdxrmiNRag -DoDLKvbdjKGHilxS -EOcKjvbdhWyAzzAJ -EPDLKvbdMfcQNQVL -DncKjvbdYkqdTmlN -DoDLKvbdjJfIJlwr -EOcLKvbdZeYGzghb -DncLKvbdJuuFceGi -EPCkKvbdhzUelRNf -DnbkKvbdBhkCKhej -DoDLKvbdhbObeXRR -DnbkKvbdzHZMAMdw -DoDKjvbdZxcjNblS -DoCjjvbdDwwksstM -DoCkKvbdUVkpJtAq -DoDLKvbdaaWEepPw -DncLKvbdGdKvJbKK -DoDLKvbdTulQJtBR -DoDKjvbdqceJPnVa -DnbkKvbdvAdZTOeI -EOcKjvbdVAbRSqRy -EPCkKvbdTqQnuVHm -DoCjjvbdwNWANDeN -DnbkKvbdZtIiYdSn -EPCjjvbdPIAXyAZB -EPCjjvbdZoOIeEzK -DoDLKvbdmJETqUrB -DoCjjvbdOFDtIiKd -DnbkKvbdqvolDIxq -DnbjjvbdmgFYNNfy -DncLKvbdieLHUoAO -EPCkKvbdDnbkLWcE -DoCjjvbdmJETpuSB -DncLKvbdiiegjNXr -EPDKjvbdZQldiMeR -EOcKjvbdZHXEAPTJ -EObkKvbdWHwvXfxz -DnbkKvbdxUleRZLn -DnbkKvbdtvNxKQsA -DoDKjvbdOStWHEuQ -DnbkKvbdsBellHLZ -DoDKjvbdsCFllGkZ -EPDKjvbdjhGlGGOL -DncKjvbdxxJKBoyk -DncKjvbdrXPkcJYq -DoCkKvbduVnXipsA -DoDKjvbdjKGHjMwr -DoDKjvbdbBWEfPpX -EOcKjvbdznoqEcMY -DoCkKvbdySnJMqbH -DoCjjvbdlrZVZsDi -EPDLKvbdKfFgbApu -DoDLKvbdZRMdiNFR -EObjjvbdpeceUWAh -EObkKvbdRotHKFcw -DncKjvbdiZuFkpmf -DoDKjvbdnGdwmNgZ -DoDKjvbdMoxRVnGs -DoDLKvbdiVZeXRtb -EOcKjvbdGAoRYizm -DoDKjvbdJJdAJpGd -DoDKjvbdwMvANEFN -DnbjjvbdaaWFFpQX -DnbjjvbdqlzKZMIJ -EPDLKvbdxnShXsJD -DncLKvbdMfcPlotk -DncLKvbdURRPVUhN -DnbkKvbdHgGzZXxH -EOcLKvbdYlRctOMN -DncKjvbdnHEwlnGy -DoDKjvbdlYsSTZGt -EOcKjvbdZxcjNcLr -EObjjvbdmttyjjSG -EObkKvbdffLynHHA -DnbkKvbdmpZxvLZC -DncLKvbdBhjakJGK -DoCkKvbdpstHSRkU -EPDLKvbdiLddOVCy -EOcKjvbdxUleQyLn -EPCkKvbdTukpKTaR -EOcLKvbdjvXOECYX -EObjjvbdRWnEDLgc -EObkKvbdbhljLGWx -EPCkKvbdZoOJEdyj -DnbkKvbdqrVKnLAm -DoDKjvbdVAbRTRRy -DnbkKvbdhfjDZWKV -EOcLKvbdkWXOECYX -DnbkKvbdYTLaMsnx -EObjjvbdZRNFImFR -DncLKvbdCWzdIdpW -EOcLKvbdpyPIGqDx -DoDLKvbdiCOcFWpq -EPCjjvbdhtzFXSUb -Dnbjjvbdlqxtyrci -DoCkKvbdiZtelROG -EPCkKvbdVUNUFkvK -DnbkKvbdNddUJJLE -DoCkKvbdNdctIhjd -DnbkKvbdcyyQYZQb -EObkKvbdQmYByNtz -DoDLKvbdVrNxBeMD -EPCjjvbdCTBCsevr -DncLKvbdtSrTYyeD -DnbjjvbdRyigsDWA -DncLKvbdJYUBglQp -DoDKjvbdSPsfiedX -DoCkKvbdADRxKZiQ -EPDLKvbdrEFJPmvB -DnbjjvbdvAcyTOdh -EOcKjvbdaMjasUmH -DoDKjvbdZjSgogBf -DnbkKvbdnGeXmOGy -DnbjjvbdMgComPuL -EPCkKvbdxKvcgzzG -DncKjvbdwtldpyMO -DoDKjvbdbhlikGXY -EPCkKvbdpyPIHREY -DoDLKvbdkClLRHUg -EPDKjvbdqFdFUWBI -EOcLKvbdkxrqrxgU -DoDLKvbdTvLoitAq -DoCjjvbdJuuFcdfi -EPCjjvbdrykpTAhO -EPCjjvbdiZuFkqNf -EObjjvbdEuxpQNKF -EPCjjvbdGGKSOJUR -EPCkKvbdcyxowxqC -DnbjjvbdjhGkeemk -EPDKjvbdijGIJmYS -DnbkKvbdypnliKXA -EOcKjvbdRadFLhyL -EPCjjvbdxwiKCPyk -DoCkKvbdfILVqnQg -DoDLKvbdkNCLzEgP -DoCkKvbdGKdrbglu -DnbkKvbdJcJcRJcY -DoDLKvbdIwsahMRQ -DnbkKvbdNddUIhjd -EPCkKvbdJuuGDdgJ -EPDLKvbdjKGHjMwr -EObkKvbdGdKvKCJj -DncKjvbdNUrqkNAX -DoDLKvbdTqQoVVHm -DoDKjvbdNddTiIkE -EPCkKvbduaEZTPFI -DnbjjvbdFWYopMie -EObjjvbdyXhiaozL -EPCjjvbdhaoDFWpq -DncKjvbdJJdAKQHE -DoDKjvbdegkVrOQg -DnbjjvbdwuMdqYlO -EPCkKvbdLKaHvAJy -DoDKjvbdRbEFLiYk -DoDKjvbdSxLMNzjx -DnbkKvbdGKdsChMu -DncKjvbdACrYJzJQ -DoCjjvbdbUafwkUI -DncKjvbdzjVPpDrt -DnbjjvbdFfKSOJTq -EPDKjvbdHffyyXxH -EOcLKvbdRkZFtgLT -EOcKjvbdXsMAmToY -EOcLKvbdNPwqWNfs -DoCjjvbdEuxpPljF -DncLKvbdjJfIJlxS -DoCjjvbdhgJbxuiu -EPCkKvbdrDdhpOWB -DnbkKvbdwWlBWAuu -EObjjvbdySmiMrCH -EPCjjvbduWOXjRTA -DncLKvbdRDbaPqES -EPCkKvbdjEkHVPAO -EPDLKvbddiiqvUzn -EPDKjvbdyYJKCPyk -DncKjvbdNeEThiKd -DncKjvbdrbGMlGkZ -EOcKjvbdOTTvHEuQ -EObjjvbdFyVUaEYC -EPCkKvbdbiMikFwY -EPDKjvbduaDxsPFI -DncLKvbdozmckYPA -DoDLKvbdVYgsykPO -DoCjjvbdQvnDbkgc -DncKjvbdZLrDtNkm -DoDKjvbdHfgZyYXg -DoDKjvbdauCGwkUI -DoDKjvbdmJDsqVSB -EOcKjvbdhgJbyWKV -EPCjjvbdrouoKDWG -DoDKjvbdQmYCYnUz -DoDLKvbdfHkVqmpg -DoCjjvbdZjShPfaf -DoCkKvbdIGfzYxYH -EPDKjvbdZRMeJNFR -EPCjjvbdRpTgKFdX -EPCkKvbdEYYMUUUM -DncLKvbdwuMdqZLn -EOcKjvbdmuVZkJqf -DncKjvbdhgJbyWJu -DnbjjvbdKVuFcdfi -EPCkKvbdRadElIxk -EPCkKvbdYlSDsmkm -DoDKjvbdhlFEOVDZ -DoCjjvbdIsZBSlwl -DoDKjvbdLAkGmCXq -DoDLKvbdqwQMCiYq -EPDKjvbdURROtuIN -DoCjjvbdpxoHgREY -DncKjvbdwXLaWAuu -EObjjvbdrpWPJcWG -EPDLKvbdmozYvLYb -EPCkKvbdMowpunGs -DnbkKvbdANHySvzY -DncLKvbdZyDinDLr -DoCjjvbdziuPpESt -EPDKjvbdiVZeXRuC -EPDLKvbdDncKkWbd -EOcLKvbdFVxopNJe -DncLKvbdACqxJzIp -DncKjvbdaMkCTUlg -DoCkKvbdhyuGMQnG -EObjjvbdbBWFFpPw -EObkKvbdTAEiICPE -DoDKjvbdbUagXjtI -DoDLKvbdGZUuAcwb -DoDKjvbdnGdwlmgZ -DoDLKvbdVBCRSpqy -DnbjjvbdfIKvRnRH -EObkKvbdaRebgsek -DnbjjvbdNVSrLNAX -EPDKjvbdrJAKEmPF -DnbkKvbdBdQBWKNG -DoCjjvbdePFTLUUS -EPCkKvbdRDcAoqDr -DncLKvbdrNZiyLhJ -DoCkKvbdLqwNZtpz -EPDLKvbdlqxtzTEJ -DnbkKvbdrRtjmkBN -EPCkKvbdZRMeJNEq -DnbkKvbdZsiJYdTO -EObjjvbdUtMtGLvK -EOcLKvbdnCJwYOnV -DncLKvbdUMWPAuni -EOcKjvbdJcJbpjDY -DoCkKvbdcImKLGXY -EObkKvbdYSlAmTnx -DncLKvbdCTBCtFvr -EObjjvbdqlyjYlIJ -DoCkKvbdmSZUzSci -DoDKjvbdjEjfuPAO -EPCjjvbdWfYzUAPT -DnbjjvbdzROmJJwA -EObjjvbdnQZyVjyC -DncKjvbdjAQGaPgK -EObkKvbdtTSTZZeD -DoDLKvbdZLrETnLm -DncKjvbdCDpAujNG -DncKjvbdUyHsykOn -EPDLKvbdeXystRez -EPCjjvbdlrZUyrci -EPDKjvbdwjvcgzzG -EPDKjvbdnHExNOGy -EOcKjvbdZLqdTmlN -EPCkKvbdEuxopMjF -EObjjvbdJYTaglRQ -EPCjjvbdrWpLbiZR -EPCjjvbdNxOuzcnU -DoDLKvbdijFhKNXr -DnbkKvbdKWVGEFHJ -DnbkKvbdKCicQjCx -DoCkKvbdcScLTdKB -EOcKjvbdKWUecdfi -DoCjjvbdiLeDmuDZ -DncKjvbdySnJNSCH -EPDLKvbdZshhyDrn -DnbkKvbdssSSxydc -EOcLKvbdqrUjnLBN -EPDKjvbdGdLWKCKK -EObjjvbdsQWPJbuf -DoDLKvbdJcKDRJcY -DoCjjvbdZoNiEeZj -DnbkKvbdGFjSOJTq -EPDLKvbdxxJKBozL -DoDKjvbdBraDUGXS -EPDKjvbdJbjCpicY -DoCjjvbdVqmwbEkc -EPDKjvbdijFhKMwr -EPDLKvbdrSVLNkBN -DoCkKvbdiUzEvquC -EPCjjvbdWIYVxGxz -DnbkKvbdZoOIdeZj -DncLKvbdZRMeJNEq -EObjjvbdZMSDtOMN -DnbjjvbdRWnDcLgc -DoDLKvbdmRxtzTDi -EOcKjvbdJmADygUa -EOcKjvbdxUmFQyMO -EOcLKvbdOTUWHEtp -DoDLKvbdZRNFJMeR -EOcLKvbdxmsHxShc -EPCkKvbdUxhTykPO -DoCkKvbdelfWfljL -EPDLKvbdFejSOJTq -EPCkKvbdKefIBaRV -DncKjvbddeOqbXDK -EOcKjvbdhlEcnUcZ -DoCkKvbdZtJJZETO -DnbjjvbdSPtHJfDw -DncLKvbdOFDtIhkE -EPDLKvbdFyVVAcwb -DoCjjvbdqTtGqqjt -EOcLKvbdyTOIlrCH -DnbjjvbdACrYKZiQ -DoDLKvbdvmWAMceN -DoDKjvbdLBLHNCYR -EPCkKvbdIxUCHlQp -EPDLKvbdQmXayNtz -DoCjjvbdKRZdoFme -DncLKvbdZoNiEdyj -DoDKjvbdqqtkOLBN -EPCkKvbdiZuFkpmf -DncKjvbdEPCjkXCd -DoDKjvbdbVBgXjsh -DoCjjvbdmRyUzSdJ -EObjjvbdMJCLpxAS -DoCjjvbdwWlBWAvV -EPDKjvbdNHCpMouL -DncKjvbdEOcLKwDE -DoCjjvbdwjvcgzzG -DnbkKvbdNGbpNPtk -DoDLKvbdZGwEAOri -EObjjvbdaRfDITfL -DoDKjvbdVvhwudEg -EPCjjvbdHgGyxwwg -DncKjvbdcJMikFwY -EObjjvbdwMvAMdEm -EOcKjvbduMYXBUAw -EPDLKvbdpfDeTuaI -DoDKjvbdssSSxzEc -DnbjjvbdjblLRHUg -EOcLKvbdVwIxWDeH -EPCkKvbdLGFgaaQu -EPDKjvbdBiKakIfK -DoDLKvbdEOcKjwDE -EOcKjvbddijRvUzn -DoCjjvbdmaivxPOV -DnbkKvbdMfcQNPuL -DncLKvbdZtIiZDsO -DoDLKvbdhlEcmuDZ -EOcKjvbdIGfzYxYH -DncLKvbdICLydzAD -EPDLKvbdMfcPmPuL -DnbjjvbdrRuKmjaN -DnbkKvbdbsDKscjB -DoCkKvbdhkddNtcZ -EOcLKvbdNQXqVnGs -DoDLKvbdrEFIonVa -DoCjjvbdQvnDcMID -EPCjjvbdjlalZeGo -EPCkKvbdjJfIKNYS -EObjjvbdREDBPqES -EPCjjvbdiZtfMRNf -DoDKjvbdADRxJyiQ -DncLKvbdYkqcsnMN -DncLKvbdZshiZDsO -DoDLKvbdRNXayNtz -DncLKvbdqcdiPmvB -EPCkKvbdrNZixlHi -EPCjjvbdwtmFRYlO -EObkKvbdJTZBTNXl -EOcLKvbdWRnXadkc -DoDLKvbdvwMBVaVu -DoDKjvbdlZSrTYgU -EPDLKvbdQcbaQRDr -DoCjjvbdhuZdvrUb -DnbkKvbdZxdKOClS -DncKjvbdJzoexEAN -EOcLKvbdQvmdDLhD -DncLKvbdunszpkPU -EOcKjvbdiZuGMQnG -DncKjvbdVZIUZkOn -DoDLKvbdkxsRsYgU -EPCjjvbdGQASwGey -DncKjvbdnBivwoNu -EPDLKvbdsBelkfjy -DoDLKvbdddoRbWbj -EPCjjvbdhancFXQq -EObkKvbdJvUfEEfi -EPDLKvbdIidAKPfd -DoDLKvbdxVMdpxkn -DoCjjvbdaNLCTVNH -DnbkKvbdZyDinDMS -DoDLKvbdrMzJyLhJ -EPDLKvbdyXhiaozL -DoCjjvbdGKeTDHlu -DncKjvbdwzIGFxFS -EObjjvbdJvUedEfi -DncLKvbdIjEAJpGd -DncKjvbdyTNiNRbH -EOcKjvbdidkGuPAO -DoDLKvbdkVvmcbXw -DoCjjvbdJYTbHkpp -DoDLKvbdFyVVBEYC -EPDLKvbdmoyyVjyC -EOcKjvbdcTDKtDjB -EPCjjvbdEvYpPmJe -DoCjjvbdCJLCKhej -DoCjjvbdSKxfUgLT -DoDLKvbdFjeTDINV -DncLKvbdEXxMUTtM -EOcKjvbdWRnXaeMD -DoCjjvbdrMzJyLgi -DoCkKvbdcSbkUEKB -DnbkKvbdyzeOSIIh -DncLKvbdpstGqrKt -EPDKjvbdCJLBkJGK -EOcLKvbdJcJcQjDY -EPDLKvbdbLLfPNcA -DnbjjvbdEASImZwX -DnbjjvbdtumwiqTA -DnbkKvbdxKvdHzyf -DoCjjvbdVwIxWDeH -DncLKvbdYzcFqjVy -EPDKjvbdqiAJeMoF -DoDLKvbdNQXqVmfs -EPDLKvbdFjdsChNV -DoCkKvbdOTUWGdtp -EOcKjvbdOEdUIiKd -EOcLKvbduaEZSoFI -EOcLKvbdxsNhlrBg -EObkKvbdcIlijfXY -DoDLKvbdLqvlytpz -DoDKjvbdIryBTNXl -EObjjvbdQwOECkhD -DoCjjvbdLFegaaQu -EObkKvbdFkFTChNV -DnbjjvbdyzeOSHiI -EObjjvbdLAkHNCYR -DnbkKvbdZyDimcMS -DncKjvbdkMbLzEgP -DnbjjvbdRbEEkhyL -EOcKjvbdLrXMzVQz -EOcKjvbdVBBqTRRy -EObjjvbdyNsHxTIc -EPCjjvbdMuTRkNAX -DoCkKvbdUaCQrprZ -EPCjjvbdjmCLydfo -DoCjjvbdFyVVAcxC -EPCjjvbdQvnDblID -DnbjjvbdLhbLqYAS -DncLKvbdFxuVBEYC -DncKjvbdGLFScIMu -DncKjvbdBvzcheQW -EPDLKvbdSPsfjFcw -DnbkKvbdsQWOibvG -DnbkKvbdaSGChTfL -EPDLKvbdjmBkzFGo -DoDLKvbdqAiFAWhE -EPDLKvbdkVwNcaww -DoCkKvbdKRZePGOF -EOcLKvbdJXtCIMRQ -EPCkKvbdaNLCTUmH -EPDLKvbdliDtRUrB -EOcLKvbdKfGHbApu -EObkKvbdDwwlTstM -DoDLKvbdmgExMmfy -EOcLKvbdKWUfEFHJ -EPCjjvbdkxrqrxft -DncLKvbdkClKqHUg -DoDKjvbdVqnXadlD -DoDLKvbdULvPBWPJ -DoDKjvbdUslsfMWK -EOcLKvbdJvVFdFGi -DncKjvbdiifHilxS -EPCkKvbdRaceMJYk -DoCkKvbddwytTrFz -EPDLKvbdYkrETnLm -DoCjjvbdiMEdOUby -DoCkKvbdxVMeQyLn -EPCkKvbdwuMdpxlO -EPDLKvbdNPxQumfs -DncKjvbdYpleJNEq -DncKjvbdTAEhhCPE -EOcLKvbdUGznLwVe -EOcKjvbdNPwpunHT -EPDLKvbdKaLHNBwq -EOcLKvbdFfKRmhtR -EObkKvbdYlRcsmlN -DoDLKvbdWSOXadlD -EOcLKvbdWWiXucdg -DoCkKvbdZsiIxcsO -DoDLKvbdbhlikFvx -EOcKjvbdtlYXAsaX -EOcLKvbdUtNTelVj -DoDKjvbdhaoDFXRR -DoDLKvbdEuxoomJe -DoDLKvbdEYYLtTsl -DncLKvbdbhmJkGWx -EPDLKvbdqwPkbhxq -DnbjjvbdlrYuZsEJ -DncLKvbdeKKSWUzn -DnbkKvbdyTNiNSCH -DncKjvbddwzTsqez -DncLKvbdTXkMNzjx -DoDKjvbdJmAEZgUa -DncKjvbdeEnqavbj -EPDLKvbdcJNJjfWx -DncLKvbdPyNAGsRj -DoCjjvbdLGGHbAqV -DncKjvbdddoRbWcK -DoDLKvbdZjTHogBf -EPDLKvbdRkZFuHKs -EOcLKvbdEuyPoljF -EPDKjvbdEYYMTtUM -DncKjvbdDxXlTssl -DnbkKvbdQvmcblID -EObkKvbdjmBkydgP -DoCkKvbdOAJTUKSA -DncKjvbdhgJbxvJu -DoDKjvbdVvhxVceH -DoCkKvbdjvXODaww -EPDKjvbdemFvflik -DoDKjvbdkCkkRGtg -DoCjjvbdDigjVxKA -DncLKvbdLAjgNCYR -EPDKjvbdbUbGwkTh -EObjjvbdmuUzLJrG -DnbjjvbdmgFXlnGy -DoCkKvbdFxttaDwb -EPCjjvbdJcKDRKCx -DoCkKvbdpfDeUWAh -EPDLKvbdADSYJyhp -DoCjjvbdHkazmvqL -DnbkKvbduLxWaUBX -EPCkKvbdQdCaPpdS -EOcLKvbdZdwfzhIb -EPDKjvbdKWUeceGi -EPDKjvbdSCDeMJZL -DoDKjvbdyOShYShc -EObjjvbdliEURVSB -DncLKvbdmgEwlnGy -DnbkKvbdsBemMHKy -DoDKjvbdYzcGSJvZ -EObkKvbdGcjvKBjK -EOcLKvbdJuuGDdgJ -EPCjjvbdOStWGeUp -EOcLKvbdGLEsChMu -EOcLKvbdeATqNYJf -DncLKvbdxxIjCQZk -EObkKvbddZyQXyQb -DoDKjvbdVBCRTRRy -EPCjjvbduDDVWuoP -EOcKjvbdVZHtZkOn -EPCjjvbdZQmEhmFR -DnbkKvbdZyDimcLr -EPDLKvbdjblKqHVH -EOcLKvbdZtIiZDsO -DnbkKvbdRWmcbkhD -EPCjjvbddneSjtTr -DoCkKvbdZQmFJMdq -DoDLKvbdLFegbBRV -EOcKjvbdSwkMNzjx -DoCjjvbdFjeTDHlu -EPCjjvbdtSqrxydc -DncLKvbdSPtHKFcw -DncLKvbdyYJJapZk -EOcKjvbddxZssrFz -EObjjvbdfekzOGgA -EPDKjvbdrylQSaHn -DnbjjvbdZisHofbG -EObjjvbdrbGNMHKy -DnbkKvbdLBKfmBxR -DncKjvbdACqxJyhp -DncLKvbddijRutzn -EPDLKvbdMpYRVmfs -DncLKvbdmttzKiqf -DnbkKvbdZnmhdeZj -EPCkKvbdjKFgjNYS -DnbjjvbdxnTHxShc -EPCjjvbdlZTSTYgU -DoCjjvbdqlyjYkgi -EObkKvbdxVMeQyMO -EPDLKvbdSPtHJecw -EPDLKvbdrpWOibvG -EObkKvbdRbEFLhyL -DoCkKvbdYNqAYUvU -DoCkKvbdnCKXXnnV -EObkKvbdddoSBvbj -DncKjvbdNGcPlpUk -DnbkKvbdmajXXnmu -DoCjjvbdJXsbHlQp -DncLKvbdNGcPlouL -DoCkKvbdTAFJHaoE -EPCjjvbdnPyxvKyC -EPCkKvbdRyihTDWA -DncLKvbdQlxCZNtz -EObkKvbdJSyAsMwl -DoCjjvbdmttykJrG -EPCkKvbdfpBzwEXh -DoCjjvbdrzMQTBIO -EPDKjvbddZxowyRC -DncKjvbdaNKaruNH -DnbjjvbdaNKasVMg -DncKjvbdcbTNSATm -EPCkKvbdiLdcnVDZ -EObjjvbdYTLaMtOx -EOcKjvbdEASIlzWw -DnbjjvbdziuPodTU -EOcLKvbdqUUHRqkU -DnbkKvbdyNsHxSiD -EObjjvbdhkeDnUcZ -EOcKjvbdNHCpNQUk -EPDLKvbdIryBSmYM -DnbkKvbdfekynGgA -EOcLKvbdiHKCyWJu -EObkKvbdrMzKYlIJ -DoCjjvbdsZkoraIO -EOcKjvbdQccAoqES -DoCjjvbdtTRrxzFD -EPCjjvbdJXtBhMRQ -DnbjjvbdsBfNMHKy -DnbkKvbdeEnrBwCj -DoDLKvbdTfzmkvvF -DoCjjvbdCJLCLIej -DnbjjvbdNUrrLNAX -DoCkKvbdxsNiNRag -EPCjjvbdtbcUwVoP -DoDKjvbdaogHDkzd -DncKjvbdpedFTuaI -DnbjjvbdqYngfpdY -DncKjvbdbiNJkGWx -DoCjjvbdGckVjBij -EObkKvbdqceIomvB -EPDLKvbdFWZQQNJe -EObkKvbdrRtkOLAm -DncKjvbdDwwktUTl -EObkKvbdwNWAMceN -DncKjvbdZMSDtOLm -EObjjvbdTkvPAuni -DoDLKvbdUxhTykPO -EOcLKvbdVBCQsQqy -EPDKjvbdZshhxcrn -DnbjjvbdqdEiQOWB -DoDKjvbdkWWmdBww -DoDLKvbdzQoMhiwA -DnbjjvbdUGzmlXWF -DncKjvbdJTYaTMwl -DoDKjvbdGLFScHmV -DoDKjvbdrWpLcJZR -EOcKjvbdwNWAMcdm -EObkKvbdmfeYNOGy -EObkKvbdtcDUwVoP -DnbjjvbdiZuGMQmf -EObjjvbdfMewGmJk -DnbjjvbdANIZTWyx -DncKjvbdtTSSxydc -DnbkKvbdsBfMkfjy -DoDKjvbdSLYfUgKs -DoDLKvbdZisHogCG -EObkKvbdVTlsfMVj -DncKjvbddZyPwxpb -DncLKvbdAMhYsXZx -DncLKvbdxwhjCPzL -EOcKjvbdKRZeOeme -DoCkKvbdunszqLOt -EPDKjvbdZRMdiMdq -DnbjjvbdEuxpPljF -EPDLKvbdGGJrOJUR -EPDKjvbdVviXudEg -DnbjjvbdpfDeTvBI -DncLKvbdRadElJYk -EPDKjvbdaMjbSuMg -EPDLKvbdTAEhhCOd -DncLKvbdTIyiqABM -EPCkKvbdBsBDUFvr -DoCjjvbdcSbkUEJa -EObjjvbdCIjbKhfK -DoDKjvbdauCHXjsh -DoCkKvbdpyPHfqEY -EOcLKvbdDwxMUUUM -DnbjjvbdGFjRmiUR -DoDLKvbdbQGgELzd -EOcKjvbdGGJqnItR -EPCjjvbdxrnJNRag -DoDLKvbdbhmJkFwY -EPDKjvbddoFSkTtS -DncKjvbdNUsSKmAX -EPCjjvbdfelZmfgA -DoCkKvbdjKGIJlwr -EPDLKvbdJYTaglQp -EPCkKvbdVrOXbFMD -EPDKjvbdTpqPUuIN -EPCjjvbdGckViaij -DnbjjvbdczZQYYqC -DoDKjvbdMtrqkNAX -EObkKvbdaNKartmH -EPDKjvbdmSZUysDi -EOcLKvbdlhdURVSB -DncKjvbdWRnXbEkc -DncLKvbdLBKfmBwq -EPDKjvbdZdwfzhIb -EPCkKvbdhancFXRR -EObkKvbdaSFbgtGL -DncLKvbdJXsaglQp -DncLKvbdUsltFlVj -DoDKjvbdLBKfmBwq -EPCkKvbdnVVZjirG -EObjjvbdiZuFlROG -EObkKvbdwygeeweS -EPCkKvbdwjvcgzyf -DnbkKvbdssRsYzFD -DnbjjvbdxwiJaoyk -EPCjjvbdVhYWYHYz -DncKjvbdhzVFkpnG -DncLKvbdeJjSVtzn -DncLKvbdyYIjCPyk -EPDLKvbdJpzEoGNe -DncKjvbdnBiwXoNu -EOcKjvbdVrOYCElD -EObkKvbdLBKgNCXq -EPDKjvbdTlWPBVni -EPDKjvbdFxuVBDxC -DncKjvbdnHFXlnGy -EPCjjvbdYkrDtOMN -DoCkKvbdUWMPjTaR -DoCjjvbdjSziSjiz -DnbjjvbdeOdsKtUS -EPCkKvbdmfdwmOHZ -EObjjvbdtSrTYydc -DnbkKvbdRjxeuGkT -EObkKvbdKeehCApu -EOcLKvbdpxoIGqEY -DncKjvbdbLMGOnDA -EPCkKvbdEXwktUUM -EObkKvbdiUzFWqtb -DoCjjvbdiHKCyViu -EObkKvbdvwLaWAuu -DoDLKvbdiCPDEvqR -EOcKjvbdWXJXvEEg -DoCkKvbdqTtGrSLU -DnbkKvbdtbbuXWOo -EObjjvbdgGLzOGgA -DncKjvbdTlVoBWPJ -DoCkKvbdeEoRbWcK -DoCkKvbdkWWmdCXw -DncKjvbdehLWRmpg -EPCkKvbdjFLGtoAO -DoDKjvbdGLFScIMu -EObjjvbdrRtkOKaN -EPCkKvbdczZQYYqC -DnbjjvbdfHkVqnRH -EOcLKvbdtvNxKRTA -EPCkKvbdADSYJyiQ -EOcKjvbdmJETptrB -EOcLKvbdURQoUtgm -DoDLKvbdZMSDtOMN -EPCjjvbdFfJqnIsq -EOcKjvbdcJNKKfWx -DnbjjvbdkySqrxft -DncLKvbdJpyePFme -DncKjvbduCcVXWPP -EOcLKvbdxKvcgzzG -DoDLKvbdpfEEsvAh -EObkKvbdZyDjNblS -EPCjjvbdhbPDEwRR -EPDLKvbdTqQoUthN -DoDKjvbdxnSgxShc -DoCkKvbdcTCjscjB -DoCkKvbdOTUVfeVQ -DncKjvbdkMbMZeHP -DncLKvbdEvYpPmKF -DncLKvbdJTZBTNYM -EObjjvbdIHGyxxYH -EOcKjvbdraemLfkZ -EOcKjvbdMpYRVmgT -DncKjvbdxZgfFxEr -DnbkKvbdpxoIGpcx -EPCkKvbdkIGlGFnL -DoDKjvbdUslselVj -DnbjjvbdZnnJEdzK -DncLKvbdehLVrORH -DoCjjvbdySmhlqbH -DoDLKvbdADSXiyhp -DoDKjvbdZtJJZDrn -DoCjjvbdezvZEiUX -EOcLKvbdqTtHSRkU -EPDKjvbdVgxWXgYz -DoCjjvbdGZUuBDwb -DncLKvbdhzUekpnG -EPCjjvbdZxcinDMS -EPCkKvbdOFEThiLE -DoDLKvbdhzVGLqOG -EObjjvbdkySqryGt -DoDKjvbdmpZyVkYb -DoCjjvbdnHFYMnGy -EObkKvbdRotGjFcw -EPDKjvbdjblKpgUg -EOcLKvbdWWiYVdFH -DoDLKvbdtbcVXVoP -EPDLKvbdqqtkOLAm -EPDLKvbdmRyUysEJ -DnbkKvbdxnShYTJD -DoDLKvbdGKeSbhMu -DoCkKvbdjuwODbXw -DncLKvbdaMkCSuMg -DncKjvbdtbcUvuno -DnbjjvbdiVZeWqtb -DoCjjvbdLBKgNBxR -EObkKvbdlZSqrxgU -EPCkKvbdULunaWOi -DoCkKvbdwzIGGYEr -EPCkKvbdnHExNOHZ -EObjjvbdpyOgfqEY -DnbjjvbdpedFUWAh -DoCkKvbdhaoDFXQq -DnbkKvbdYqMdhleR -DnbjjvbdsZkpSaIO -EPDKjvbdJcJbqJbx -EObjjvbdehKvRmqH -EOcLKvbdmIdURVSB -EPDLKvbdvOszqKoU -EOcLKvbdZisIQGbG -DnbjjvbdFyVUaDwb -EPCjjvbdTAEiIBoE -DncLKvbdRkZFtgKs -EOcLKvbdzdynzdyp -EOcLKvbdnUtykKSG -DoDKjvbdZQmEhldq -EOcKjvbdnBjWxOnV -EPCkKvbdqvpLbiZR -DoDKjvbdrykosBIO -EOcLKvbdBiKbLJGK -EPDLKvbdBvzciFPv -DoCjjvbdemFwGlik -EPDLKvbdqTsfqqjt -DncLKvbdptUHRrLU -EObkKvbdbUbGwjsh -DoCkKvbdHffyyXwg -EPCjjvbdgGMZnHHA -EPDKjvbdFejRmhsq -DoCkKvbdQvmdCkgc -DncLKvbdyNsHxShc -DoCkKvbdrDeIpOWB -EObkKvbdYzcGRiuy -DncKjvbdMowqWNfs -DoDLKvbdbsDLTcjB -EPCkKvbdZQmEiNEq -EObjjvbdNPwqWNfs -DoDLKvbddeOrBwDK -EObkKvbdrNZixkgi -DoDKjvbdtlXvaUBX -DncKjvbdtunYKRTA -EOcLKvbdfSBWzkcP -EObjjvbdVAbRTQrZ -DnbjjvbdcJNKLFvx -DncKjvbdssRsYyeD -DoDLKvbdqTsgSSLU -EPCkKvbdMowqVmgT -DoCjjvbdDnbjjvbd -EPCkKvbdlhdURUqa -DncKjvbdqrVLOLAm -DoDKjvbdNHDQNQUk -EPCkKvbdXsLaMtOx -EPCkKvbdRosgJfDw -DncLKvbdKVuFcdgJ -DoCjjvbdGGKRnItR -DnbkKvbdeEnrCWcK -EPDLKvbdlZSrTYgU -EPCjjvbdtSrTYyeD -DoCkKvbdZisHpHCG -DnbjjvbdbrbkUDia -DnbkKvbdhficYvKV -EOcKjvbdsBfMlHLZ -DoDKjvbdBdQBVjNG -DnbkKvbdTvLpKUAq -DoCjjvbdzaAPGgCM -EObjjvbdiVZeWrVC -EPCjjvbdZshiYcrn -EObjjvbdRNXbYnUz -EObkKvbdBcpBWJlf -DncKjvbdtbcUvuoP -DoCkKvbdmfeXmNgZ -DncLKvbdbPfgELzd -DncKjvbdZshiYdSn -EObkKvbdDjHiuwjA -DoDLKvbdfIKvRnRH -DnbjjvbdiLeDmtcZ -DoDLKvbdQwNcblID -EObkKvbdmRyUzSdJ -DnbkKvbdnHFYMnHZ -EOcLKvbdfHjvSORH -DncLKvbdlZSrSyHU -EObkKvbdtSrSxzFD -EObjjvbdZyEKNcLr -EObkKvbdRkYeuHLT -EOcKjvbdTkuoAuoJ -DnbjjvbdEPDKkXCd -EPCkKvbdnCJwXoOV -EObjjvbdxrmiMqbH -DoDLKvbdRaceMIyL -EPDKjvbdRosgKFdX -DoCjjvbdzoQQeDMY -DncKjvbdZyEJmcMS -DoDLKvbdOFDshiLE -EPDKjvbdSQUGiedX -EPCkKvbdTIyjRAAl -EObjjvbdxUmFRYkn -DncKjvbdmpZyWLYb -DoCkKvbdygZMANEw -DoDLKvbdhuZeWquC -EObkKvbdFyUuAcxC -DoCkKvbdiCPCeXQq -DncKjvbdsCFlkfkZ -EPCjjvbdNPwpvOHT -DoCjjvbdSPtGjGDw -DncLKvbdAMhZSvyx -EPCkKvbdWXJYWDdg -EPDKjvbdaogHDkzd -DoDLKvbdRosgKFcw -EPDLKvbdrRtjnKaN -DncKjvbdvBEZSoEh -DoDLKvbdmajXYOmu -DnbjjvbdfNFwHMjL -EPCkKvbdezuyEhtX -DoCkKvbdHffzZYYH -EPCkKvbdvAdYsOdh -EPCjjvbdhlFDnVDZ -DncKjvbdbiNKLFvx -DoDLKvbdMIalQxAS -EPDLKvbdGckWKBjK -EOcKjvbdvOszqKnt -DoCkKvbdraelkgKy -EOcKjvbdMgComPtk -DoDKjvbdOSsugFVQ -DoCkKvbdyNrhYTJD -EPCjjvbduDDVXWOo -DncLKvbdiCPDFXRR -DncLKvbdiGibyWKV -EOcLKvbdfNGXHNJk -EObkKvbdBhjakIej -EPCjjvbdxmrhXriD -DnbkKvbdJbibqKDY -DnbkKvbdSCDdkhyL -EPCjjvbdGFirOIsq -DnbkKvbdKVtfDeHJ -DoDKjvbdGKdrbhMu -DncLKvbdZLrETmlN -EObjjvbdjuvmcbXw -DncKjvbdQdDApRDr -EObkKvbdeATplwjG -DoCjjvbdZMRdUNkm -DoDKjvbdTqQoVVIN -EPCkKvbdOTTufeVQ -EPDKjvbdWRnXadlD -DncKjvbdZsiJYdSn -DoCkKvbdZLrDsnMN -DoDKjvbdEKHiuwjA -EPDLKvbdnBivxPOV -EPCjjvbdddnrCWbj -EOcLKvbdpssgSRkU -EPCjjvbdzdzOzdyp -EPCjjvbdZxcinClS -DoDKjvbdvAcySoEh -DnbjjvbdWHxWXfxz -DoDLKvbdCWzdJEpW -DoCjjvbdehLVqnRH -EObjjvbdEXxLstTl -EObjjvbdkMakzEfo -EPCkKvbdKaKflbXq -EPDLKvbdijFgjNYS -DoCjjvbdZsiIxdSn -DncKjvbdeATqNXif -DncLKvbdzoPqEblY -EObkKvbdLAjgNBwq -DncKjvbdUxgsykPO -DoDKjvbdaogGckzd -DncKjvbdFVxpPmJe -EOcLKvbdZLrDtNlN -EObjjvbdYNqAXuWU -DoCkKvbdEYYLstUM -EObjjvbdeFPSBwDK -DncKjvbdePEsKssr -DncKjvbdZjTHogCG -EPCkKvbdjKGHjNXr -DoCkKvbdNrtVgFVQ -DncLKvbdaMjaruNH -DoDLKvbdwjwEHzzG -EOcLKvbdTIzJqABM -DoDLKvbdliETqVSB -DoDLKvbdNrtVfdtp -DnbjjvbdZxdKNcMS -EPDLKvbdbUafxKsh -DoCkKvbdVrNxCFMD -DoCkKvbdxZgefYEr -DoDKjvbdYTLaMsoY -DncKjvbdeAURMwif -EOcLKvbdNGcPmQVL -EPDKjvbdqceJQOVa -DncKjvbdRotHKGEX -DoCjjvbdwNWAMdFN -EPCkKvbdFyVVAcwb -DoDKjvbdmozYvKyC -DncKjvbdSPsgJecw -EPDKjvbdZtJJYcrn -EOcLKvbdGckWKCJj -DoDKjvbdkxrrSxft -DnbjjvbdRbDdlIxk -DncKjvbdyYJJbPyk -DnbjjvbdhgJcYvKV -EObkKvbdjcLjqHUg -EObkKvbdhgJbyWKV -EObjjvbdrovPKCvG -DoCkKvbdbBVdepQX -DnbjjvbdUVkojTaR -EPCkKvbdbUagYLUI -DoDLKvbdptUGqqkU -DoCjjvbdyTNhlqag -DncKjvbdEYXlTssl -EPCkKvbdXFxytAOs -EOcLKvbdNdctIhkE -EPDLKvbdkDMLRGuH -EPDLKvbdDihJuxKA -EOcLKvbdrafNMHLZ -EPDLKvbdbKlFoODA -DncLKvbdZLqcsnMN -DnbjjvbdznpRFDLx -DncLKvbdziuQPdSt -EPCkKvbdbrcKsdKB -DncLKvbdaMkCTUmH -EPDLKvbdYkqdUOLm -DoDKjvbdjhHLfGNk -DoDLKvbdZMSDtNlN -DnbjjvbdZjTHpHCG -DoCkKvbdemFvgNKL -DncKjvbdrRtkOLAm -EPCjjvbdyNrhXsIc -EObjjvbdgPazwDwh -DoDKjvbdRDcAoqDr -DoDKjvbdvvkaWBWV -EOcKjvbdZRMdiNFR -EPCkKvbddePRawCj -DoCkKvbdHDjvKBij -DnbkKvbdZirgpGbG -EOcKjvbdhbPCeWqR -DnbkKvbdNPwpvNfs -EPCjjvbdZirhPfbG -EOcLKvbdIGgZxwxH -EPCkKvbdrykosBHn -DoDKjvbdxnTIYShc -DnbjjvbdNsTvGduQ -DncLKvbdBcpAvJlf -DnbjjvbdlqxtysDi -DoCkKvbdOEdTiIjd -DncKjvbdfHkVrOQg -DoCkKvbdiHKDYvKV -DoDKjvbdOTUVgFUp -EObkKvbdaaVdfPow -DncLKvbdZHXEAPTJ -DnbkKvbdkIHLefNk -DnbkKvbdjEjfuPAO -EObjjvbdhtzFWqtb -DoDLKvbdSQTfjFdX -DncLKvbdHEKvKBjK -DncLKvbdHDkVjBij -EPDKjvbdRpTfiecw -DnbkKvbdiBncEwQq -EObkKvbdRadEkhyL -EPCkKvbdezvYdiTw -EOcKjvbdaMjasUlg -EObkKvbdczZPwyQb -EPCjjvbdTvMQJtAq -EPCjjvbdJXtCIMRQ -DoDLKvbdkDMKpftg -EPCjjvbdiVZdvqtb -DnbkKvbdtunXipsA -DoCjjvbdjJehKNYS -DnbjjvbdJvUeceHJ -DoDKjvbdKRZdoFme -DncLKvbdJcKCpjCx -EPDKjvbdmbKXYPNu -DnbjjvbdkIHLeenL -EPDLKvbdNPxQunHT -DnbjjvbdUtMtFkvK -EPDLKvbdsPvPJcWG -EObjjvbdMRvlzVQz -DoCkKvbdsQWOjDWG -DnbjjvbdXGZZtAPT -DnbjjvbdunszpkOt -DncKjvbdxZhFfXdr -DnbjjvbdRzJgsCvA -EPCkKvbdSCDdlIxk -EPDKjvbdREDBPqES -DnbjjvbdBvzdIdov -DoDLKvbdSLYetfkT -EObjjvbdKWVGDeHJ -DoCjjvbduDDUvuoP -EOcLKvbdWIYWXgYz -DoCjjvbdbhmJjfWx -EPDKjvbdIxUCILpp -EOcLKvbdeXzTsrFz -EPDLKvbdsBemLgKy -EPCkKvbdzjVPpDrt -DncLKvbdZyDimbkr -DnbjjvbdRNYBxmtz -EPCkKvbdvOszpkPU -EObkKvbdSQTfiedX -DncKjvbdZRNFIldq -DoDKjvbdbhlijfXY -EObkKvbdEzspeLcJ -EPCjjvbdKCicRJbx -EOcLKvbdOYOuzcnU -DoCkKvbdhkddOVDZ -DncKjvbdIxTahMQp -EOcLKvbdwygeexFS -EPCjjvbdKRZeOeme -EPDLKvbdgPazvcxI -DncKjvbdfNFwHMik -EOcLKvbdtkwvaTaX -EObjjvbdURQnuVIN -DnbkKvbdiBncFWqR -DncLKvbdaMkCStmH -EPCjjvbdZjSgogBf -DoDKjvbdMowpvOGs -EPCkKvbdsrqsZZdc -DnbkKvbdRpTfjFdX -EOcKjvbdaMjbTVMg -EOcLKvbdmgExMmfy -DncKjvbdCJLCLJGK -DoCkKvbdNeDshiKd -DnbkKvbdGLFSbgmV -EObjjvbdMtrrLNAX -EOcKjvbdpedEsvAh -DoDKjvbdcyxpXyQb -EObkKvbdxZhGGXdr -DoCkKvbdEztQdlCi -EObkKvbdijFgilxS -EPDLKvbdkHgMFenL -EOcLKvbdlrYtysDi -DncLKvbdjcLjpgVH -DoCjjvbdnVVZkKRf -EPDKjvbdFeirNhsq -DnbkKvbdjblLRGuH -EPDLKvbdtTSTZZeD -DoDKjvbdVBCRTRSZ -DncKjvbdTYLMNzjx -DoCkKvbdEztQdkcJ -EObjjvbdpfEFTuaI -DncLKvbdYSlAmUPY -DncKjvbdYpldiNFR -DncLKvbdWXIwvDdg -DoDLKvbdeXyssrFz -DncLKvbdqdEhonVa -EOcLKvbdNQYRVnGs -EObjjvbdRpTgKGDw -DoDKjvbdauCHXkUI -DoDLKvbdhficZViu -DnbjjvbdzoPpeCkx -DoCkKvbdJYTaglQp -DoDKjvbdnBiwYPNu -EOcLKvbdMJCLqYAS -EPCjjvbdYkrDsnMN -EPCkKvbdehKvRmqH -EObkKvbdVqmxCFMD -DncKjvbdrDeJPmvB -EPDLKvbdzaAOgHCM -EOcLKvbdNPxQvNfs -DncLKvbdFVxopMie -EPDKjvbdgQBzwDwh -EObjjvbdTfzmkvvF -EPDLKvbdUaBprpqy -DoCkKvbdnGdxNOGy -DncLKvbdfIKurOQg -EPCkKvbdKDJcRKCx -EPCjjvbdmJEUQuSB -DncLKvbdrafNMGjy -EOcKjvbdZxdKNbkr -DnbkKvbdJmADzGuB -EPCjjvbdQvmdDMID -DnbkKvbdemGWgNJk -DncKjvbdyfxlAMdw -EPCkKvbddtAUATNW -DncKjvbdcasMrATm -DoDKjvbdVhYVxHYz -EPCjjvbdhyuFkpmf -DoDLKvbdcbTMrATm -EPCkKvbdILaznXRL -DoDKjvbdRDbaQQcr -DncKjvbdijFgjNYS -EObkKvbdIMBznXRL -EPCjjvbdxVNEpyLn -DncLKvbdYkqctOMN -EOcKjvbdxrmiNSBg -EPDLKvbdtTRsYzFD -EOcKjvbdzjVQQDsU -EPCjjvbdZMRctNlN -DncKjvbdXrlAmTnx -EOcLKvbdbPgGdLzd -EPDLKvbdFfJqmhsq -EOcLKvbdyzdmqgiI -DoCjjvbduCbtvuoP -DncLKvbdNGcPlpVL -EPCjjvbdGBOpyJzm -EPCkKvbdRDcBPpcr -EOcLKvbdRbEFLhyL -EOcLKvbdePFTLTsr -EObkKvbdcTCkUDjB -DnbkKvbdrWokbhxq -DncLKvbdqUTfrRjt -EOcLKvbdRyihTDWA -EObkKvbdpxnhHQdY -DnbkKvbdrSUkOKaN -DoCjjvbdIGgZyYXg -DoDLKvbdMowqWNfs -DoDKjvbdUxgtZkOn -EObjjvbdUtNTelVj -EObjjvbdlqxtyrdJ -DncKjvbdkVvnDbYX -EObjjvbdePFTKssr -DoCkKvbdMuSrLNAX -EOcLKvbdnQZyWLZC -DoDKjvbdhgJcYujV -DoDLKvbdaMjasVMg -EPCjjvbdcScLUDia -DnbjjvbdbKkeoNcA -DnbkKvbdfpBzwEYI -DoCkKvbdBhkBjhej -DnbjjvbdkDMLRGtg -EObkKvbdeATqNXjG -EOcKjvbdFkFSbglu -DnbjjvbdznpQdcMY -DncLKvbdIidAJpHE -DoCjjvbdLZQirzuG -DnbjjvbdzjUopDrt -EOcLKvbdnUuZjiqf -DoDLKvbdwyhFeweS -DoCkKvbdaoffckzd -EObkKvbdzaAPGgCM -EObkKvbdEzspdkcJ -DnbjjvbdDjHiuxKA -DnbkKvbdVqmxBdlD -EOcLKvbdrJAKFMne -EOcKjvbdZjSgofbG -EPCjjvbdfMfWgNJk -DoCkKvbdTukpJsaR -DoCjjvbdySmiNSBg -DnbkKvbdzGyMANFX -EObkKvbduWNxKQsA -DoDKjvbdRkZFuHLT -DncLKvbdbKlGOmcA -DncLKvbdyNsIXsJD -DnbkKvbdMpXqWNfs -DoCkKvbdHEKujBjK -DncLKvbdDxXktTsl -EPCkKvbdACrYJyiQ -EOcKjvbdqUUHSRjt -DoDLKvbdOFDsiJLE -EObkKvbdrbGMlGjy -DoCjjvbdjblKpgUg -EPCkKvbdiHJcYujV -EPDKjvbdrDeJQNvB -EPDLKvbdbrbkTdJa -DnbkKvbdNeDtIhkE -DnbkKvbdcJNKKevx -EPCjjvbdxVNFQxkn -EObjjvbdhyuGLqOG -EOcKjvbdrafMkfkZ -EObkKvbdRkYetgKs -DnbjjvbdUWLoitBR -DoCjjvbdQvmcblID -EOcLKvbdDoDLLXCd -DncLKvbdzRPMiJwA -DoCkKvbdsZkoraHn -DoDKjvbdkHgMGFnL -EObkKvbdrbFmMGjy -DnbkKvbdRWnDbkhD -EPDKjvbdJbicRJbx -DncKjvbdGZUuAcwb -DoCjjvbdmfdwmNfy -DoDKjvbdBdQAujNG -EPDLKvbdwWlAuaVu -DncLKvbdxmrgxSiD -DoCkKvbdUsmUFkuj -EOcKjvbdcTDKsdKB -DnbjjvbdjcLkRHVH -DoDKjvbdbiMijewY -EPCjjvbdPyNAHSrK -DnbjjvbdFkErcINV -EPDKjvbdZQldhmFR -EPDKjvbdTJZjRABM -EOcKjvbdKaKgMaxR -DoCjjvbdwzHefYEr -DoDLKvbdDwxLtUUM -DoCkKvbdfILWRmpg -DoCkKvbdRyihTCvA -DoDKjvbdSQUGjFcw -DoCjjvbdEYXktUTl -EPCjjvbdoznEKxPA -EPDLKvbdSiZiqABM -EObkKvbdVUNUFkuj -DncKjvbdMfbpNQUk -DncLKvbdEvYopMie -DnbjjvbdMowpvNgT -DncLKvbdKjaHvAKZ -DoDKjvbdqmZjZMIJ -EObjjvbdGcjuibJj -DoDLKvbduLwvaTaX -DoCkKvbdHgHZyYYH -EObjjvbdEOcKjwCd -EPCjjvbdGckWKCKK -EObkKvbdEuyQQMie -DnbjjvbdHgGzZYYH -EObjjvbdVUMsekuj -EObkKvbdWWiXucdg -EPDKjvbdRWnECkgc -EPDKjvbdxZgefYFS -DnbkKvbdEuyPomKF -EPCjjvbddePSCXCj -DoDKjvbdUsltFlWK -DnbkKvbdbsDKtEJa -EObkKvbdmoyyWLZC -DoDKjvbdSCDeMJZL -DnbkKvbdwtleRYkn -EPDLKvbdJpzEnfNe -DncKjvbdZisIQGbG -DoCjjvbdiUzEwRtb -DncKjvbdrounicVf -DncLKvbdmIdURVRa -DoDKjvbdYSlBNUPY -DnbjjvbdKDKDQibx -DoDLKvbdnCJvwoOV -EPDKjvbdgFlZmfgA -DoDKjvbdTukojTaR -DnbjjvbdVAbQsQqy -EOcLKvbdtAHRIABS -DnbjjvbdmbJvwnnV -EOcKjvbdvBDxrneI -DnbjjvbdeJirWUzn -DnbjjvbdKeegaaQu -DnbjjvbdzQoMiKXA -DnbjjvbdxwiJbPyk -EPDLKvbdKNADzHUa -DoCkKvbdANHyTXZx -EObkKvbdxLXDgzyf -EOcKjvbdpxoHgQcx -DncKjvbdLBKflawq -EPDKjvbdhanbdwQq -DnbkKvbdEASIlyvw -EPCkKvbdwzHfGYEr -EOcLKvbdqZPHgQdY -EPDKjvbdqTtGqqjt -DoCjjvbdDxXksssl -DoDKjvbdQlwayNtz -EOcKjvbdTvLoitAq -DnbkKvbdirzhsKiz -EPDKjvbdyzeORghh -DncLKvbdmJDsqVRa -DncLKvbdKefICAqV -EOcLKvbdZnmheFZj -DoDKjvbdIxUCILpp -DncLKvbdxsOIlrBg -DoCkKvbdiVZdvqtb -EPDLKvbdbBWEfQPw -EObkKvbdsCFllGkZ -EObkKvbdNdctIiKd -EObjjvbdozmcjwoA -EPDLKvbdlhdTqUqa -EOcKjvbdbUagYKsh -DnbkKvbdJpydoGOF -DnbkKvbdnGeYMmfy -DncKjvbdtlXwBUAw -DncKjvbdqiAJdlne -EPCkKvbdMIakqYAS -DnbkKvbdCWzchdov -EObkKvbdelewHNJk -EPCjjvbdFpASvgFy -DoDLKvbdVrNxCFMD -DnbkKvbdMpYQvNfs -EPCkKvbdEObkKwDE -EPDLKvbdHDjuibJj -EPCjjvbdKaLHMaxR -DoDKjvbdakLfOmcA -EPDLKvbdMgDQNQVL -DoCjjvbdEvYpQNKF -EPDKjvbdrEEhpOVa -EOcLKvbdOFDsiIjd -DncKjvbdtTSTYyeD -EObjjvbdQvnDblHc -DoDKjvbdVrNwbElD -EPCjjvbdZMRdUNkm -DoCjjvbdhfibxujV -DnbjjvbdYpmFJMeR -DncLKvbdDihKVxKA -DoCjjvbdrNZjYkgi -EOcLKvbdYqNFImEq -DoDLKvbdJbjDQjCx -DoDKjvbdwygefXeS -DncLKvbdUyHsykPO -DncLKvbdJSyBTMxM -EPDKjvbdcImKKfXY -EPCjjvbddndsLTtS -DoDLKvbdEASIlzWw -EObjjvbdrylQTAgn -DoDKjvbdFkFTChMu -DncLKvbdUaCQrprZ -DnbjjvbdOFEThhjd -EObjjvbdlYsRrxgU -EPCkKvbdnGeYNOGy -DoDKjvbdwygefYEr -DoCjjvbdGckViajK -DoDKjvbdSZjITDWA -EObjjvbdkWXNdCXw -EPCkKvbdKjaIWAJy -EObkKvbdKkBIWAKZ -DoDLKvbdptTfqrLU -DoDKjvbdPxmAGsRj -EObkKvbdTvMPitBR -EPCkKvbdegjvSOQg -DoDKjvbdwNWANEEm -EOcLKvbdRNXbYmtz -DoDKjvbdEOcKjwDE -EPDLKvbdfMfXHMik -DoCkKvbdWHwvXfxz -EPCjjvbdelfWgNKL -EPCjjvbdqcdiQOVa -DncKjvbdkyTSTZGt -DoCkKvbdbAueFpPw -EOcKjvbdQwNdClHc -DnbjjvbdxmsIYSiD -EPDKjvbdCTAbtFwS -DncLKvbdJpzFOeme -EOcKjvbdiZuGLqOG -DncKjvbdKaLHMaxR -EPDLKvbdbiMjLFvx -EPCkKvbdjvXODaxX -EOcLKvbdOAJSsirA -EPDKjvbdqYnhHQdY -DoCkKvbdDwwlTtUM -DnbkKvbdRjxfVHKs -EObjjvbdzjUpPcrt -EOcLKvbdeUAUATNW -EObkKvbdQlwaxmtz -EObkKvbdEXxLtUUM -EObkKvbdYkrETmkm -DoCkKvbdxmsHwsIc -DoDKjvbdzjUoocrt -EPDKjvbdqGEFTuaI -EPCjjvbdbiMjLGXY -EPDKjvbdfpBzwEXh -DncKjvbdZeYGzhJC -DoCjjvbdFkEsCglu -DncKjvbdOFDshhjd -DncKjvbdZMRcsnMN -EPCkKvbdrEFJPnVa -DoCkKvbdcyyPxYpb -EPDLKvbdijGIKMwr -DoCjjvbdbAudepQX -DncLKvbdFejSOItR -EOcKjvbdSLZGVHLT -EPDKjvbdMJBkpxAS -DncKjvbdJXsaglQp -DnbkKvbdjcMLRHVH -DoCkKvbdFjeTCgmV -DnbjjvbdqUTfrRkU -DnbjjvbdznoqFCkx -EObkKvbdVqnYBeLc -DoDLKvbdaMjbTVMg -DoCkKvbdSQUHKFdX -DoCjjvbdrDdhomua -DncLKvbdcTCjsdJa -DoCkKvbdsCFlkgKy -EPCkKvbdmbKWwnmu -DoCjjvbdZQmFImEq -EPCkKvbdyXiKCPzL -EOcLKvbdKQzEnenF -EPCjjvbdrbGNMGjy -EPDKjvbdgGMZnHHA -EOcLKvbdfHjuqnRH -EOcLKvbdFeirNiUR -DoCjjvbduaEZSoFI -DncKjvbdbAudfPow -DoCkKvbdbiMikFwY -DoDLKvbdcyxpYYqC -DnbjjvbdpxoHfpdY -DncKjvbdqUTgRqjt -DoDKjvbdcImKKfWx -DnbjjvbdmfeYNNfy -EPCjjvbdIjEAJofd -EObjjvbdLBKgNCXq -EObjjvbduLxWaUAw -DnbjjvbdJTZBTNXl -DoCkKvbduaDyTOeI -EOcLKvbdUyIUZkPO -EOcLKvbddePRawCj -EPDKjvbdhbObeWqR -EOcKjvbdBdQAvJmG -EOcKjvbdkVwODaww -DnbkKvbdUVkoisaR -DnbkKvbdMoxQvNfs -EObjjvbdCJKbLIfK -DncKjvbdYpmFJNEq -DoCjjvbdjKFhKMxS -DnbjjvbdZLrEUNlN -EPDKjvbdwuNFRZMO -EObjjvbdjuvnECXw -EPCkKvbdlZTSTZGt -DoCjjvbdsQVoJcWG -DncLKvbdmJETqVSB -DnbjjvbdjggLfGOL -EObjjvbdxwiKBpZk -DoDLKvbdKDKCpjDY -EPCjjvbdzRPNIjXA -DoCkKvbdkaMoNALA -EPCkKvbdjvWnDaww -EPCkKvbdSBcdkiZL -DnbkKvbdbUbHXkUI -EOcKjvbdURROtuHm -DncLKvbdJmAEZgVB -DoDLKvbdDxYLsssl -DncKjvbdWRnXadlD -EPCjjvbdADSXiyhp -DnbkKvbdNGcPlouL -DnbjjvbdBsAcTevr -EObjjvbdWWhwvDeH -EOcLKvbdbUafxKsh -DoCkKvbdtcCuXWOo -EOcKjvbdbKkennDA -EPDLKvbdGcjujBjK -DoDKjvbdRWmdDMHc -EPCkKvbdmSZUyrdJ -DoCkKvbdLZRKSztf -DncKjvbdZQmFJNFR -EPDLKvbdjhGkefNk -DncKjvbdeATpmYJf -EPCkKvbdDjHivXjA -EObjjvbdFyVVBEXb -DncKjvbdIHHZxxXg -DnbjjvbdMoxQvNfs -EObjjvbdlYsRsZGt -EOcLKvbdZHWdAPTJ -DoCkKvbdoznDjwoA -EOcLKvbdYpmEiNEq -EOcLKvbdfMfWgNJk -DnbjjvbdjlalZeGo -EPDLKvbdVgxVxGxz -DoDKjvbdZRMdiMeR -DnbkKvbdNsUVgFUp -EObjjvbdNGcPmPuL -EPDLKvbdrSUjnKaN -DncKjvbdMgDPmQUk -DoDLKvbdRkZGUfkT -EOcLKvbdpxoIGqDx -DoCkKvbdVwIxVcdg -DoDKjvbdZQmFIleR -EPDKjvbdZshiZDrn -EPCkKvbdFWZPpNJe -DnbkKvbdcImKKfXY -DoCkKvbdiVZeWqtb -EPCkKvbdkxsSSyHU -EObkKvbdcSbkTdKB -EOcKjvbdFxttaEYC -EPCkKvbdhtzEwSVC -EOcKjvbdLAjgNBwq -DoCkKvbdZisHofbG -DoDLKvbdIsYaTNYM -EPDLKvbdADRxJzIp -DoDKjvbdTkuoAvOi -EOcLKvbdZRMeJMdq -EPDLKvbdWWiXvDdg -DnbjjvbdbsDKscjB -DnbkKvbdtlXwBUBX -EPCjjvbdmgFXlmgZ -EObkKvbdjmBlZeGo -EObkKvbdmgEwmOGy -DoCjjvbdtlXwBTaX -EPDKjvbdSiZiqABM -EPDLKvbdEXxMTssl -EPCkKvbdRWmccLhD -DncLKvbdrWpMDJZR -EPDLKvbdelfXGlik -EOcLKvbdFjdsChNV -EPCkKvbdVUMtFkuj -DoDLKvbdtkxXBUBX -DncLKvbdMgDQNPtk -DnbkKvbdMJCMQxAS -EOcLKvbduWOYJpsA -EPCjjvbdZxcimcMS -DoDKjvbdqrUjmkAm -EObjjvbdRzJgsCvA -EOcLKvbdiBoDFXRR -EPCjjvbdSPtHKFcw -DncKjvbdbBVeGPpX -DnbjjvbdRotGiedX -DoDKjvbdIHGzZYXg -DnbjjvbdiGjCyViu -EPCjjvbdSxKkmzjx -EPCjjvbdmajWwoOV -DnbjjvbdmbKWxPNu -EObkKvbdCTBCsfXS -DoCjjvbdKQzEnfOF -EPCkKvbddijRutzn -EObkKvbdFjeTCgmV -DnbjjvbdURQnuUhN -DnbkKvbdiCOcFXRR -EObkKvbdJutfEEfi -DncLKvbdhtydwRuC -DoCjjvbdcTCjsdJa -DnbjjvbdzoPqEcMY -DoDLKvbdSCDdlJZL -EOcKjvbdlhctQuSB -EPDKjvbdOFETiJKd -EObkKvbddZyQYZQb -EOcLKvbdrMyjYlHi -DoDLKvbdqrVLOLBN -DncKjvbdyNsHwriD -EObkKvbdQvnECkgc -DnbkKvbdznopeClY -DoCkKvbdCJLBjiGK -EOcLKvbdauCGxKtI -EPCjjvbdeFOrCWcK -DncLKvbdcSbjtDia -DnbkKvbdKWVGDdgJ -EPDKjvbdrDdiQNua -DncLKvbdqTtGqrKt -DoDKjvbdjJfIKMwr -DoCkKvbdkxsSTZHU -EObkKvbdFejSNhtR -DoDKjvbdnCKWxOmu -DoDLKvbdvBDySneI -DncKjvbddZxpXyRC -EPDKjvbddwzTsqez -DoDLKvbdLFfIBaQu -DncLKvbdwzHeewdr -DncLKvbdOFEUJJKd -DoDLKvbdEvZQQMie -EPDLKvbdWHxVwgYz -DoCjjvbdiGjCxujV -EPDKjvbdrovPJcWG -DoDLKvbdZxcjOCkr -DnbjjvbdRzJgsDWA -DoDLKvbdiZuGLpnG -DncLKvbdTukoitBR -DnbkKvbdnBiwXnnV -DoDKjvbdBvzdIdov -EObkKvbdRWnECkhD -DoCkKvbdRbDeMJZL -DncKjvbdiGjDYujV -EPCkKvbdNdctIiLE -EPCjjvbdKWUfDdfi -EOcKjvbdkIGlGGNk -EPDKjvbdGZVVBDxC -EObkKvbdXsMBNUOx -EObjjvbdANHxrvyx -EPDKjvbdZtIhyDrn -DoCkKvbdRWmdCkgc -EObkKvbdffLynGgA -DoDKjvbdIxTahMQp -DncKjvbdKQzFPGOF -DoDKjvbduDCtwWOo -EOcKjvbdnCJvxOmu -DoCjjvbdEJgivXjA -DncKjvbdemGWgMjL -DncKjvbdCDpBVjMf -DncLKvbdmoyxukZC -EOcLKvbdtkwwBTaX -DoCkKvbdLqwMzUpz -DncLKvbdqFdFUWBI -EPDLKvbdZyEJmblS -EOcKjvbdEzsqFMCi -DoCkKvbdcarmSATm -DncLKvbdFfJqmiTq -DncLKvbdKQzEoGNe -DoCjjvbdUaCRTRSZ -EOcLKvbdqZOhGqEY -DoCkKvbdZisIQGaf -DoCkKvbdeFOrBwCj -DoDLKvbdmIctQtqa -EObkKvbdxVMdqYkn -DncKjvbdwygfFxFS -DoCkKvbdRWnEDLhD -EOcKjvbdmRyUyrci -DoCkKvbdWXIwvDeH -EPDLKvbdRXODcLgc -DoDLKvbdBsBDUGWr -EOcKjvbdEvYopNJe -DoCjjvbdBvzdIdov -DoCkKvbdyzeNrIJI -EObkKvbdCJKbKhej -EObjjvbdQccBQQcr -DnbkKvbdxZgeewdr -DoDKjvbdqcdhpNua -DoCjjvbdeJjSVtzn -DncKjvbddneTKssr -DnbjjvbdZxcjNbkr -EPCjjvbdZisIPfaf -EPCkKvbdkyTRrxft -DncKjvbdVwIxVcdg -DncLKvbdIxTagkpp -EPCjjvbdbrbjtEJa -DncKjvbdkCkjqHUg -DoCkKvbdUxgsyjnn -EObjjvbdUaCRSprZ -DnbjjvbdMJCLpxAS -DncLKvbdliEUQuRa -EPCkKvbdANHxrvzY -EPCjjvbdeAURMwjG -EPDKjvbdZoOIeEzK -DoDKjvbdmuVZkJqf -DncLKvbdaNLCTUlg -DoCkKvbdnQZxvLYb -DncLKvbdhficZWJu -DncKjvbdatbHYLUI -DoCjjvbddndrjtUS -EOcLKvbdsBfMkgKy -DnbjjvbdBiKakIfK -DnbjjvbdSQTfjFcw -DoCjjvbdmoyxvKyC -DoCkKvbdGcjuibKK -DnbkKvbdZQldiMeR -EObkKvbdqquKnKaN -DoCjjvbdZRNEhldq -EPCjjvbdBiKbLJFj -EPCjjvbdyXhjCPyk -DncLKvbdtTSSxzEc -EPCjjvbdnCJwXnmu -DoDLKvbdbBWEfQPw -EOcLKvbdemGXHNKL -DoDLKvbdmfdxMnGy -EOcLKvbdTqQntthN -EOcLKvbdrMyixlIJ -EOcLKvbdVUMselWK -EOcLKvbdBvzchePv -DoCjjvbdbVCHXjsh -EPCjjvbdZRMdhleR -EOcLKvbdhbObeXRR -EPCkKvbdFWZPpMie -DncLKvbdXFyZtAOs -DnbkKvbdTqQoUuHm -EPCjjvbdCSaDUFvr -DoDKjvbdQZNAHTSK -EOcLKvbdmoyyVkZC -DoCkKvbdGLErbhMu -EOcLKvbdtvNwjRTA -EObkKvbdFjdsDINV -EOcKjvbdeOdsLUUS -DncKjvbdMtrrKmAX -EObkKvbdBsBCtGWr -EOcLKvbdVBCRTRSZ -DoDKjvbdKQydoFme -DncLKvbdnHFXmOGy -DnbkKvbdGAnqYizm -EOcLKvbdjlakzEfo -EOcKjvbdegkWSOQg -DoCjjvbdtkwwAsaX -EPCkKvbdeKKSWUzn -EObjjvbdrRtjnLBN -EPCkKvbdeATqMxKG -DnbkKvbdZMRdTmlN -DoDKjvbdNsUWGeVQ -EObjjvbdyXiKBpZk -EOcLKvbdJKEAJpHE -DoDKjvbdzQoNJJwA -DoCkKvbdwygeewdr -EObkKvbdsCGNMHKy -EOcLKvbdlhdUQuRa -EObjjvbdyNsHwsIc -DoDLKvbdWRnXbFLc -EObjjvbduCcUvvPP -EOcLKvbdrEEhonWB -EPCjjvbdRjyFtgKs -EPCjjvbdkNCLzFGo -DoCkKvbdRDbaPpcr -DoDKjvbdQdCaQQdS -DncKjvbdwyhFexFS -EPDLKvbdBhjakJGK -EPDKjvbdaNKaruMg -EObkKvbdzQnliJwA -DnbjjvbdptTfrSLU -DoDKjvbdFWZPpNJe -EObkKvbdZxcjOCkr -DoDKjvbdehLWRnQg -EOcLKvbdcSbkUEKB -EObjjvbdbUafxLTh -EObkKvbdBcpAvKNG -DoDLKvbdySmiNSBg -DncLKvbdmIdUQuRa -EPCkKvbduDDUvuoP -DoDLKvbdMtrqjmAX -DoDLKvbdVZHtZkOn -EOcLKvbdiZuGLpnG -EOcKjvbdxmrgxShc -DoCjjvbdMpYQvNfs -EOcKjvbdCIkCKiFj -EPDLKvbdaaVdepPw -EObkKvbdXFyZtAOs -EPDLKvbdbKlFnnDA -DncLKvbdqGEFTuaI -EOcKjvbdqFcdsvAh -EPCkKvbdcSbkUDjB -DncKjvbdrJAJeMoF -EObjjvbdZMRdUNkm -DncKjvbdCEPaVjNG -DnbjjvbdptUHSSLU -EPCkKvbdUtNTekuj -DoCkKvbdVqmwadlD -EObjjvbdCIkBjiFj -EOcLKvbdbVCGwkUI -EObjjvbdFfKSNiTq -EPDKjvbdJXtCHlRQ -EPDKjvbdTvMQJtBR -EPCjjvbdZMRdTnLm -EPCjjvbdemGXGljL -EPDKjvbdxmsHxTJD -EOcKjvbdiVZdvrVC -DnbkKvbdmSZUzSdJ -EPCkKvbdUaCRTRSZ -DncLKvbdoAKztIDn -EObjjvbdHffyyXxH -EPCkKvbdaMjbStmH -EObjjvbdZyDinDMS -DoDKjvbdjlbMZdgP -DncKjvbdQwOEDMHc -DncLKvbdGLFSbgmV -EPCkKvbdjvXOECXw -DoCkKvbdSBceLhyL -DoDLKvbdEvYpPmKF -EOcKjvbdrbFlkfkZ -EPDKjvbdTvMQJsaR -DncLKvbdjvXNcaxX -DnbkKvbdijGIKNXr -EOcLKvbdiHJcZViu -DoCjjvbdlqxuZsDi -DnbkKvbdhuZeXRtb -DncLKvbdACqxJzJQ -EObjjvbdjlbLydgP -EPDKjvbdxZgefXdr -EOcKjvbdSCEFLiYk -EObjjvbdKefICApu -EPDKjvbdjlbLyeGo -DncLKvbdbAvEepQX -EPCkKvbdrSVKnLAm -DncLKvbdZjTHpHBf -DnbkKvbdCWzdIdov -DoDLKvbdxUmFQyLn -DnbkKvbdxVNFRYkn -DoCkKvbdZisHpHCG -DoDKjvbdwkXEHzzG -DoCjjvbdSPtHJedX -EOcLKvbdBiLBkIej -DoCkKvbdiLdcnVCy -DnbkKvbdlhcsqUqa -EPCjjvbdwzIGFxEr -EPCkKvbdySmiNRag -DncLKvbdHEKujCKK -EPDLKvbddeOrCXDK -DoDLKvbdNGbolpUk -EOcLKvbdtlYXBTaX -EOcLKvbdqwQLcIyR -EObjjvbdIrxaSlxM -EObjjvbdbrcKtEKB -EOcKjvbdpxngfqDx -DoDLKvbdKfFhCApu -DoDLKvbdJvUfEEfi -DncKjvbdsQWOibuf -DoCjjvbdHgGyxxXg -DoCkKvbdZHWdAPTJ -DncKjvbdauBgYLTh -DoDLKvbdJYUCIMRQ -DncKjvbdbrbjtEJa -DnbjjvbdemFwHNJk -DnbkKvbdBvzcheQW -EPCkKvbdJqZePGNe -EPCkKvbdSKxeuGkT -EPDLKvbdIryBTMxM -EPCjjvbdwWlAuaVu -EOcLKvbdyTOJNRbH -EPCjjvbdQvmdClID -DnbjjvbdyTOJMqag -DncKjvbdrXQMDJYq -EPCkKvbdGdLVjBij -EOcLKvbdjJehJmXr -DnbkKvbdCJKakJGK -DoCjjvbdLrWlzUpz -EPCkKvbdhzVFlRNf -DoCjjvbdRDcApRES -EObkKvbdzROmJKXA -DncKjvbdxUmFRYlO -EPCkKvbdURQoVVIN -EPDLKvbdVZHtZkPO -DnbkKvbdatafwjsh -EObjjvbdNrtWGdtp -DoDLKvbdBiLCLJFj -EOcKjvbdmgFXmOHZ -EObjjvbdZRMeImEq -DoCjjvbdiMEdNtcZ -DnbjjvbdgFkzNfgA -DnbjjvbdGKdsDHmV -DncLKvbdIxUBhMRQ -DoDLKvbdjSzhrjiz -DoDLKvbdpyPHgRDx -DoDLKvbdqYoIGpdY -DoCkKvbdUQqPUuHm -EPCkKvbdBraDTfXS -DncKjvbdNrtWGeUp -DncKjvbdJqZdnenF -EPCjjvbdCWzdIePv -DoDKjvbdrXPlDIxq -EPDKjvbdauBgYLUI -EPCjjvbdQmXbYnUz -DoCjjvbdGGJqnJUR -EPDLKvbdkVvnEBww -EPCjjvbdTukoitBR -DoCjjvbdRkZFtgLT -DoDKjvbdEuyPpMie -EPCkKvbdSLYfUgLT -DnbjjvbdIwtBglQp -DnbkKvbdznpQeDMY -EOcKjvbdznpRFCkx -EPDLKvbdtumwjQsA -DoDLKvbdBhjajiGK -DoDKjvbdhlFDmuDZ -DnbkKvbdqquKnKaN -DncLKvbdMowqVmfs -EOcKjvbdqrUjnLAm -EObjjvbdqwQMDIyR -EPDKjvbdnCKXYPOV -DnbkKvbdHffyyXxH -DoCjjvbdlZSrTZGt -DoDLKvbdznpRFDMY -EPDKjvbdWWiXvDdg -DoDKjvbdRWnEClID -DnbjjvbdJcKCqKDY -EPDKjvbdJbjDQicY -DncLKvbdhaoDEwRR -DncLKvbdvAdZSoEh -DncLKvbdeEnrCWbj -DoDKjvbdVvhwvDeH -EOcKjvbdVAapsQqy -EPCkKvbdxnTIYSiD -EPCkKvbdrouoJbuf -EObjjvbdePEsKtUS -EPDLKvbdirziSkJz -DnbjjvbdhaoCdvqR -EPCkKvbdGZVVAdYC -DncKjvbdtbbuWuoP -DoCkKvbdLFehCBRV -DoDKjvbdLZRJrztf -EObkKvbdkHflGFmk -EOcKjvbdJYUCIMQp -EPDLKvbduCcVXWOo -EPCkKvbdptTfqqkU -DoDKjvbdGQATWgGZ -DncKjvbdEztQeMCi -EObkKvbdZtJJZETO -DoCjjvbdZsiIyETO -EObkKvbddndrjstS -EOcLKvbddeOqbXDK -DnbkKvbdCTBDUGXS -EPDKjvbdQlwayOUz -EPCjjvbdlqyUzTEJ -DoDLKvbdhtydvrUb -EOcKjvbdlZTSSyGt -EOcKjvbdmJDtQuSB -DnbjjvbdtSqsZZeD -DoDLKvbdUaBpsRSZ -EPDKjvbdLGFhBaRV -DnbkKvbdSBcdkhxk -DoCjjvbdDoDKkXDE -DoDKjvbdwyhFfYFS -EPDKjvbdOEctJIjd -EPCjjvbdEObjkWcE -EPDLKvbdhtzEvquC -EObkKvbdZjShQHCG -EPCjjvbdmIctQuRa -EPCkKvbdVwIwucdg -EOcLKvbdADRxJzJQ -EOcLKvbdWWiXvEEg -EPCjjvbdTAFIhBoE -EPDLKvbdZLqdTnMN -EPDLKvbdZQldhmEq -EOcKjvbdLLBIWAJy -DncLKvbdrMzKYlIJ -EPCjjvbdzitoodSt -EPDLKvbdLFehCAqV -DoCkKvbdrMyiyMHi -EPDKjvbdkVvmcaxX -EOcKjvbdmpZxvKxb -EPCkKvbdliDtRUrB -DncLKvbdkxsRsYft -EPDKjvbdTqROuVHm -EPCjjvbdSQTgJedX -EPDLKvbdHlBznXRL -DncKjvbdQdDBQRDr -EPDLKvbdliDsqVRa -DoDKjvbdjgflFfOL -EPDKjvbdeEoSCWbj -DnbkKvbdfSBWzkcP -EObkKvbdmIcspuSB -EPCjjvbdvAdZTPEh -DoCkKvbdIGfyxwxH -DnbjjvbdWWiYWDeH -EObkKvbdZQleImFR -DncLKvbdQwNdCkgc -EOcLKvbdQdDBPqES -DnbjjvbdrpWPJbuf -DoCkKvbdTulQKTaR -DoDLKvbdeUAUASlv -EPCjjvbdZQmFJNEq -DncLKvbdVBBqSqSZ -EOcKjvbdqceJPmvB -DncLKvbdZtIiYcrn -EOcLKvbdJSxaSmYM -DoCkKvbdqqtkOLBN -EObkKvbdgFkymfgA -DnbjjvbdVqmwadlD -DncLKvbdsBfNMGkZ -EPDKjvbdEPDKjwCd -EObjjvbdHDjvKBjK -DncLKvbdCTAbsevr -EObkKvbdFxuUaEXb -DoCjjvbdcyyQYZQb -EObjjvbdZsiIxdSn -EPDLKvbdZQmEhmEq -DnbkKvbdxnTIXriD -DncKjvbdfHkVrORH -EOcKjvbdddoSCXDK -EPCkKvbdhanbdvpq -EOcKjvbdRyihTDWA -DnbjjvbdajkeoODA -EOcLKvbdlhdTpuSB -EPDLKvbdhgJbxuiu -EPCjjvbdnHFXmNgZ -EPCkKvbdpecdsvAh -DnbkKvbdVZIUZjnn -DncKjvbdbAvFGPpX -DnbjjvbdkMalZeHP -EOcLKvbdYSlAmUOx -DoCjjvbdHDkWKCKK -EPDLKvbdaRecHsek -EPCjjvbdJXsagkqQ -EObjjvbdRMwbZNtz -EPCkKvbdrbGMlHKy -DncLKvbdKfGICApu -EPDLKvbdUtNTfLvK -EPCkKvbdMJCMRYAS -EOcLKvbdCJKbLJFj -DoDKjvbdfpBzvcxI -EObkKvbdYpldhmFR -EOcLKvbdSPsfiecw -DoCjjvbdHEKvKCKK -DnbjjvbdUGzmkwVe -DnbjjvbdfMfXGmJk -DnbkKvbdZoOIeEyj -EObkKvbdZnmhdeZj -EOcKjvbdTkuoBVoJ -EPCjjvbdGKdsChMu -DoDLKvbdJYTahLpp -EPCjjvbdbhmJkFwY -DoDLKvbdkIHMGGOL -EPDKjvbdZsiIxdSn -EPCjjvbdMgCpNQUk -DncLKvbdjblKqGtg -DncLKvbdOYOuzdNt -DncKjvbdTvMPjTaR -EPDLKvbdiiehKNXr -DoCjjvbdZdxGzghb -DoDLKvbdeOdsKssr -DoDLKvbddBsMrAUN -DoCkKvbdxxIjBozL -DoDKjvbddoErkUTr -EOcLKvbdwzIFeweS -DoDLKvbdREDBQRES -EObkKvbdhlEdOUby -DoCjjvbdNPxRWNgT -DoDLKvbdZLqctNlN -EObjjvbdbUbHXkUI -DnbkKvbdhtydwSVC -EPDKjvbdeUAUASmW -EObjjvbdhgKDYvJu -EOcLKvbdZnmhddyj -DoDLKvbdUVlQKUAq -DoDKjvbdDihJvXjA -DnbkKvbdZLrETmlN -EPCjjvbdxxJJbQZk -EPCkKvbdrounjDVf -DoCjjvbddiirVtzn -DoDLKvbdmttyjiqf -DncKjvbdfHjvSNpg -DoCjjvbdmRxuZsEJ -DoCkKvbdjAQGaQGj -DncLKvbdnVUzLJrG -EPCjjvbdLAjgNCXq -DoDLKvbdqmZixlHi -EPDLKvbdVUMsekvK -EPDKjvbdrMzKZMIJ -EPCkKvbdKDKCpicY -EOcLKvbdwtmEqZMO -EPDLKvbdmgFXlnGy -DncKjvbdyTNhlqbH -DncKjvbdnHFXlnHZ -DoDLKvbdTqROuUgm -DoDKjvbdRMwbZOUz -EPDKjvbdRMwbYmtz -DoDKjvbdZnmheEyj -EPCkKvbdbBWEfPow -DoDKjvbdQwNccLgc -DoCjjvbdhtzFWqtb -DoDKjvbdRotHKGEX -DncKjvbdZsiJZETO -EObjjvbdaNKbStlg -DoCkKvbdsZlQTAhO -EObjjvbdjhGlGGNk -EObkKvbdQdDBQQcr -DoDKjvbdMtrrLNAX -EPCjjvbdRotHKGDw -EPCjjvbdqZPIGqDx -EOcLKvbdiGicZViu -DnbjjvbdJvVGEFGi -DoCkKvbdKNAEZfuB -EPDLKvbdLZRJrzuG -DnbkKvbdhytfLpnG -EPDKjvbdRbEEkiYk -EOcLKvbdcJMjLFvx -DncKjvbdFfKRnItR -DoDLKvbdegjurORH -DnbjjvbdEPDKjvcE -EPCjjvbdkHgLeenL -DncLKvbdZnmheEzK -DncKjvbdZjSgpHCG -DoCkKvbdbBVdeoow -DoDLKvbdZQmEhleR -EPDLKvbdpxoHfpcx -EPCkKvbdSPtGjGEX -DncKjvbdRbDeLhxk -EObkKvbdrpWOibvG -DnbjjvbdfIKurNpg -EPDLKvbdZyEKNbkr -DoDLKvbdwXMAvBWV -EOcLKvbdWWiXvDdg -EOcKjvbdelfWfljL -DncLKvbdjuvnEBxX -DncLKvbdliDspuRa -EObjjvbdVTlsekuj -DoCjjvbderAvzlDP -EPDKjvbdNeDtIhkE -Dnbjjvbddwyssqez -EObkKvbdGGKRnItR -DoCkKvbdHbLzEzAD -EPCkKvbdTvMPjUBR -EObjjvbdTAEiIBoE -DoCjjvbdRjxfUgLT -DnbkKvbdnUuZkKRf -EPDLKvbdjmBkydgP -EObkKvbdNeDsiIjd -DncKjvbdrounjDWG -DnbjjvbdrWokbhxq -DoDLKvbdsPvPKDWG -DncKjvbdZdwfzgiC -EOcLKvbdZLqdUNlN -DoCjjvbdkDMLRHVH -EPDKjvbdirziSjiz -EObkKvbduDDUvuno -DoDLKvbdkHgMGGOL -DncLKvbdhkdcmuCy -EObkKvbdCJLCLIej -DnbkKvbdeFPRawCj -DncKjvbdsQVoKDVf -EPDLKvbdRXNccLhD -EObkKvbdFxttaDxC -EObkKvbdqrVKnKaN -EPCjjvbddoEsKtUS -EObjjvbdzaAOffbM -DoCjjvbdWSNxBdlD -EPCjjvbdqlzKYlIJ -EOcLKvbdQdDApRDr -DncKjvbdczZPwyRC -EOcLKvbdtlXwBUBX -EOcKjvbdmgFYNOGy -DoCjjvbdKVtfEFGi -EObkKvbdrNZjZLgi -EOcKjvbdliETqVSB -EOcKjvbdbVBgXkUI -DncLKvbdNHDPmPtk -DnbjjvbdjlakzEfo -EOcKjvbdVUNTfLvK -EPDKjvbdTXjkmzjx -DncLKvbdrylQTBIO -EPCkKvbdJpzEoGOF -DncKjvbdFeiqmhtR -DncLKvbdZnnJFFZj -EPDLKvbdlrZUzTEJ -EPDKjvbdLFfICBRV -EPCjjvbdcyxpXyRC -DoDLKvbdQdCaQQcr -DncLKvbdZsiJZDsO -EObjjvbdzQoNIjXA -DncLKvbdVqmxBdlD -DoDKjvbdRjxfUgLT -EObjjvbdWIYVxHYz -DoCkKvbdIGfzZXxH -DncKjvbdxsNhlqag -DoDKjvbdFWYopNJe -EPDKjvbdVBCRTRSZ -EPDKjvbdwyhFfXeS -DoCjjvbdziuPocsU -EPDKjvbdYSkaNUPY -EObjjvbdznopdcLx -EOcLKvbduMYWaUBX -EPDKjvbdnPzZWKyC -EObkKvbdZxcimbkr -EObkKvbdBhjbKiFj -EOcLKvbdjuwNdBww -EPDKjvbdmbKWxOnV -DoCkKvbdnHFYNNgZ -DoDLKvbdrMzKYkhJ -EOcLKvbdqdFIpNvB -EPDKjvbdcScKtDjB -EOcLKvbdygZMAMdw -EOcLKvbdsCGNLgLZ -DoDLKvbdaMkBsUlg -DncKjvbdlZSqsYft -DnbkKvbdnVUzLKRf -DoCkKvbdnHFXlmgZ -EPDKjvbdxZgfGYFS -DoCkKvbdxwiKCPzL -DnbkKvbdBcpAvKMf -DoCjjvbddZyQXxpb -DncLKvbdzQnmIjXA -EPDKjvbdFWZQQMjF -DnbjjvbdMgDQMpUk -DncLKvbdOFDtIiKd -DoDKjvbdKNAEZfta -EOcKjvbdhyuGMQmf -DnbjjvbdZnmhdeZj -DncLKvbdhbOcFXRR -EOcLKvbdvBEZSoEh -EOcKjvbdYkrEUOLm -EPCkKvbdNrtWGduQ -EPDKjvbdZjSgpHCG -EObkKvbdyzdmrHhh -DoDLKvbdznpQdblY -DncLKvbdZshhyDrn -DnbkKvbdjvWmdCYX -EOcLKvbdAMgxsWzY -DnbjjvbdwzIGGXdr -EPDKjvbdrNZixlIJ -DoDKjvbdsQWOicVf -DoDKjvbdjuvmdBxX -EObkKvbdzHZMANFX -DoDLKvbddjJqutzn -EOcKjvbdwNWAMdFN -DnbkKvbdTqRPUtgm -EOcKjvbdVYgtZkOn -EPDKjvbdNGcPlotk -DnbjjvbdJbjDRJcY -EPDLKvbdZtJIyESn -DoDKjvbdtcCuXVoP -DoCjjvbdZMSETmlN -DoCjjvbdgGLzNfgA -EPDKjvbdxKvcgzyf -EObjjvbdrMzKZMIJ -DncLKvbdMoxQumfs -EPCjjvbdbhlikFvx -DoDLKvbdRadFMJYk -DnbjjvbdHgGzYxYH -EObjjvbdVZHtZkOn -DnbkKvbdakLfPNcA -DoCjjvbdmfeXmOGy -DoDLKvbdrRtjmjaN -DnbjjvbdUxgsyjoO -DnbjjvbdbhlikFvx -EPDLKvbdRbEFMJYk -EOcKjvbdRXNcblHc -DnbkKvbdqmZixlHi -DoCjjvbdrzLpTBIO -DoCjjvbdILaznXRL -EPDLKvbdRjyGVGkT -EOcLKvbdehKurOQg -DncLKvbdYkrDsnLm -DoDKjvbdZisHpGaf -DncLKvbdpyPIGpcx -EOcLKvbdijFhKNYS -EOcKjvbdMuSqkNAX -EObjjvbdajlFnnDA -EOcKjvbduLxXAsaX -DnbjjvbdiiegjMwr -EPCkKvbdiMEdNuCy -EPCkKvbdqTtHSRkU -EPCkKvbdIryBTNXl -DncLKvbdFjdrcHlu -EPDKjvbdZoOIeFZj -DncLKvbdcbTNSATm -DoDKjvbddePSCWcK -DoDKjvbdZsiJYcsO -DoDKjvbdpeceTuaI -EOcKjvbdjhHMGFnL -EOcLKvbdjcLkRGtg -DnbjjvbdCJLCKiFj -EPDLKvbdZsiIxdSn -EObkKvbdVTlsekvK -EObkKvbdCTAcTewS -DoDLKvbdOYOuzcnU -EPCkKvbdiUydwRuC -DncLKvbdGQATXGey -EPDLKvbdDjIJvXjA -DncKjvbdpxoIHQdY -EObkKvbdZMSDsmkm -EOcLKvbdBvzchdov -EOcLKvbdKRZeOenF -DnbkKvbdwzIFfYEr -DnbkKvbdSKyFuHKs -EPDKjvbddCSlrATm -EObkKvbdSCDeMIyL -EPCjjvbdsCFllGjy -DnbjjvbdHgGyyYYH -DncKjvbdjKFgilwr -DncLKvbdEvYoomJe -EObkKvbdlhdTpuSB -DoDKjvbdWWiYVceH -DnbjjvbdLGGHbBQu -EObkKvbdOXoVzcnU -DnbjjvbdbsCjtDjB -DnbjjvbdQwOECkhD -DnbjjvbdMgComQVL -DoCjjvbdRotGjFcw -DnbjjvbdmajWxOmu -EPCkKvbdbPfgDkzd -Dnbjjvbdpxngfpcx -DoCkKvbdBraCtGWr -DncKjvbduDCtwWPP -EPDLKvbdYzcFrKVy -EObjjvbdbVBgXkTh -DnbkKvbdyYIibPyk -DncLKvbdUVlPitAq -EObkKvbdbKlGOnDA -DnbjjvbdrJAKFNPF -EPDLKvbdLAjgMbYR -DoCjjvbdSxLLmzjx -DncKjvbdeEnqawCj -EObkKvbdFWZQPmKF -EOcKjvbdGdKvJbJj -DnbkKvbdjcLjqHUg -EPCjjvbdQvnDcLgc -EPCkKvbddoFTLTtS -DnbkKvbdZtIhyDrn -EPDKjvbdBvzdIdpW -EObjjvbdEYYLstUM -EPCkKvbdyzdnSHiI -EObjjvbdZLqdTmlN -EPDLKvbdIHHZyXwg -DoCkKvbdbVBfxKtI -DnbkKvbdMpYRWOGs -EOcKjvbdczYoxYqC -EPCjjvbddwytTqez -EPCjjvbduaDySoEh -EObkKvbdTJZiqAAl -EObjjvbdmoyyWLYb -EPDKjvbdnPyxukZC -EObjjvbdrWolDJZR -DoCkKvbduCbtvvPP -EPDLKvbdJbicQibx -DncLKvbdHELVibJj -DnbjjvbdKefHbAqV -DncLKvbdsZkpTBHn -DoDKjvbduCcVXWOo -DnbkKvbdidkGtoAO -DnbjjvbdrEFIonWB -EPCkKvbdfpBzwEYI -DncLKvbdwuNFRZMO -EPDLKvbdrounjCvG -DncLKvbdxxJJaoyk -EPCjjvbdJmADzHUa -EPDLKvbdqGEFTvBI -EPDLKvbdyOShYTJD -EPCjjvbdJutecdfi -EPDLKvbdIMBznXQk -DncKjvbdmoyxvKyC -EPDLKvbdrXQMChyR -DoCkKvbddwytUSFz -DncKjvbdZjTHofbG -EPDKjvbdGcjujCJj -EPCkKvbdvBEYsOeI -DncKjvbdCTAcUGWr -EPCkKvbdmbKWwnnV -DnbjjvbdpxnhHREY -EObjjvbdlZTRsYft -DoCjjvbdhkdcmtcZ -EObjjvbdMfcPmPtk -EPCkKvbdJXtCHkpp -DnbjjvbdrSUjmkBN -EOcLKvbdYSlBMtOx -EObjjvbdznopdbkx -DncLKvbdddoSCXDK -DoCjjvbdOXnuzcnU -EPCkKvbdZGwEAOsJ -EOcKjvbdauCGwjtI -EPDLKvbdNHDPmPuL -EOcLKvbdNHCpMpUk -DoCjjvbdmSYtysDi -DncKjvbdFjeTDINV -DncKjvbdNrtWHFUp -EPCjjvbdmJETqUqa -DncKjvbdEzsqEkcJ -EOcLKvbdmoyyVjyC -EOcLKvbdZMSETnMN -EOcLKvbdBsAbtFvr -EPCjjvbdJutfEFHJ -DoCkKvbdiBoDEwRR -EPDLKvbdZQmFImFR -EPDLKvbdpfDdsuaI -DnbkKvbdmbKXYPNu -EObjjvbdjKGHjNXr -EOcLKvbdpssgSRjt -DoDLKvbdKRZePGOF -DnbkKvbdfekymgHA -DoDLKvbdiCOcFWqR -DnbjjvbdiHJbyWKV -DoDKjvbdsCGNMHKy -DoCjjvbdGKeSbgmV -DoDLKvbdkIGkfFnL -DncKjvbdfILWRnRH -DoDKjvbdGLEsChNV -EPCjjvbdVrNxBeMD -EPDKjvbdSLZGVHKs -EPDLKvbdQlxByOUz -EOcLKvbdMgDQNQVL -DoDLKvbdrRtjnLAm -EObjjvbdCIkBjhfK -DncKjvbdDwwlTssl -DoDLKvbdANIYsWzY -DnbjjvbdxVMdqYkn -DoCkKvbdzdynzdzQ -DnbjjvbdxsNhmRag -EObjjvbdzjVQPcrt -DoCkKvbdbBWFFopX -EPDKjvbdhfibxvKV -DnbkKvbdegjvRmqH -EPCjjvbdkNCMZdgP -EOcLKvbdmtuZkJqf -EObjjvbdemFvfljL -DncLKvbdyYIibPyk -EObjjvbdieKftoAO -DncKjvbdvOszqKoU -DncLKvbdVUNTelWK -EOcKjvbdCDoaWKMf -EPCkKvbdbsDKtDjB -EPDLKvbdmSYuZsDi -DncLKvbdwWlBWBWV -EObjjvbdkVwOEBww -EObkKvbdWSNwbFLc -DnbjjvbdZRNFImEq -DoDKjvbdrounjDVf -EPDKjvbdCJKbKhej -DncKjvbdsrrTYyeD -DoCjjvbdQvnEDMHc -DoCkKvbdGQASwGfZ -EOcLKvbdfSBWzkbo -DoDLKvbdRkZGVGkT -EOcKjvbdyXhjCPzL -EPCkKvbdbrbkTdJa -EPDLKvbdsQVnibvG -DnbjjvbdpyOgfpdY -DoDLKvbdtunXiqTA -EPDKjvbdqGDdsvAh -DncKjvbdjEkHUoAO -EPCjjvbdGQATXGfZ -EOcKjvbdKDJcRKCx -DncKjvbdhyuGMQnG -DoCkKvbdYkrDsnMN -DoCjjvbdaNKbSuMg -EOcLKvbdrykpTAhO -DnbkKvbdrSUkNkAm -EPCjjvbdwzHeeweS -DoDLKvbdSBdFMJYk -DnbjjvbdqUUGrRjt -DoDKjvbdzitoocrt -EPDKjvbdxnShXriD -DoCkKvbdVviXvEEg -EObkKvbdFxuUaDxC -EObkKvbdygZMAMeX -DnbjjvbdiifHilxS -EPDKjvbdZxcjODMS -DoDLKvbdWWhxWEFH -EPCjjvbdzoQQeClY -EOcLKvbdptUHRqjt -DoDKjvbdVviXudEg -EPDLKvbdUQpnuVHm -EPCjjvbdwzHfFweS -EOcLKvbdZxcjNbkr -EObkKvbdZnmhddyj -DoDLKvbdvlvANDdm -EOcKjvbdMfbolpVL -EObjjvbdbAvFFpQX -EOcKjvbdBdPaWJlf -DncKjvbdqceIonWB -DoCkKvbdtcDVWvOo -DoCkKvbddoFTKssr -DoDKjvbdaMkBruMg -EPCjjvbdEuyPolie -DnbkKvbdOEcsiJLE -DncKjvbdHlBznWqL -EPDKjvbdbhlijewY -EObjjvbdfoazwDwh -EOcLKvbdaNKbStlg -DoCkKvbdqdEiQOWB -DoCkKvbdTvLpKUBR -DncKjvbdkNBkzFHP -EObkKvbdFkErcHlu -DoCkKvbdZshiYcrn -EObjjvbdEJhJvYKA -DnbkKvbdOTUWHFUp -DoDLKvbdVhXvXfxz -EPDLKvbdBdPaWKMf -EObjjvbdFejRnJTq -EPDLKvbdULvPBVoJ -EPDKjvbdJzpFwdAN -EPDKjvbdqwPkbiZR -EPDLKvbdrEFIomua -EOcLKvbdijFhJlxS -DnbkKvbdYkrEUOLm -DnbkKvbdIMBznXQk -DncKjvbdZisHpHCG -EPDLKvbdzjUopESt -DnbjjvbdzjUpPcrt -EPDKjvbdqZOgfpdY -DoDKjvbduLxXAsaX -EObkKvbdrMyiyMHi -EPCkKvbdqTsfqrKt -DoDKjvbdTfznMXVe -EObkKvbddoErkUTr -EOcLKvbdHELWKCJj -DncLKvbdUVkpJtAq -EPCjjvbdRMxBxmtz -EPDKjvbdjEjftoAO -EOcLKvbdYkrDsmkm -DoDLKvbdajlFoNcA -DoCjjvbdmJDtRUqa -EPDKjvbdTqQoUuIN -DnbkKvbdtcDUvvPP -DncLKvbdrbGMlHLZ -DnbkKvbdKfGHbApu -DncLKvbdGFjRnIsq -EPDLKvbdJzpGYEAN -DoCjjvbdkySrSyHU -EObjjvbdKVtfDdfi -EPDKjvbdNrsugFUp -DoCkKvbdNxOuzcmt -DoDLKvbdDihJuxKA -DnbkKvbdzdzOzdzQ -DncKjvbdmSYuZrci -EOcLKvbdptTfqqkU -EPCkKvbdVUNTfLvK -DoCkKvbdGdKujBjK -DoCjjvbdzitopETU -DoDKjvbdqvokbiYq -EPDLKvbdGFjSOJTq -DoDKjvbdliETqUrB -DoDKjvbdZisIQGbG -DoCjjvbdnQZyWLZC -EOcLKvbdGdKujCJj -EPCkKvbdaRfDIUGL -EOcKjvbdauCHXjtI -DnbkKvbdbQHHDkzd -DoCjjvbddZxpYYpb -EObkKvbdbBWEepPw -DncKjvbdSLYfVGkT -EObkKvbdVgxVxHYz -DoCjjvbdfpBzwEYI -DoDKjvbdmfdxMmfy -DncKjvbdhancEwRR -DnbkKvbdEASJMzXX -EObjjvbdmfdwmNfy -DnbjjvbdhbOcFXQq -DoCjjvbdVgxVxGxz -EPCkKvbdQcbaQQdS -EPCjjvbdhbObeXRR -EPDKjvbdePFSkUTr -EPDLKvbdMoxQumgT -DoCkKvbdIBkydzAD -EOcLKvbdcasMrAUN -DoCkKvbdUQqOttgm -DnbkKvbdelevfljL -EObjjvbdZeXfzgiC -EPCjjvbdQYmAGrrK -EObjjvbdxZhGFxFS -EObjjvbdJuuGEEgJ -DoDLKvbdEARhlyvw -EPDKjvbdZdxGzhJC -DoCkKvbdzRPMhiwA -DoCkKvbdZxcinClS -EOcKjvbdFyVVBEYC -EOcLKvbdtbcUwVoP -DncLKvbdlZSrTYft -EObkKvbdaaVeGPow -DncLKvbdEKIJvXjA -DncLKvbdbhljKfWx -EObkKvbdVhYVxGxz -EPDKjvbdmpZxukZC -DoDLKvbdnBivxOnV -EObjjvbdRbEEkiZL -EPCkKvbdZRNFIleR -DoDLKvbdZyEJmblS -DncKjvbdkIGkefNk -EPDKjvbdRkZGVGjs -DnbkKvbdiHJbyVjV -EPDLKvbdFjeSbglu -DncLKvbdqFcdtVaI -EOcKjvbdGYuVAdYC -DoCjjvbduaEZSneI -DnbjjvbdKWVFdFHJ -EObjjvbdGdLVjCJj -DnbkKvbdpssgSSKt -DoCjjvbdssRryZdc -EPDKjvbdZisIQHCG -EOcKjvbdCIjajhfK -DoDKjvbdrafNMGjy -EObkKvbdgQBzwEXh -DnbjjvbdgQBzwDwh -DncKjvbdCEQAvKMf -EPCkKvbdiCOcFWpq -EPDLKvbdLFfHbBQu -EPCjjvbdJTYaSmXl -EPCjjvbdRjyFuGkT -DoCkKvbdjFKftoAO -DncKjvbdmaiwXoNu -DoCjjvbdVZITyjnn -DoDLKvbdDxYLtUTl -DnbjjvbdqvpLcJYq -EOcLKvbdlqxuZsDi -DoDKjvbdZshhyDsO -DoCjjvbdGFjSOIsq -DnbkKvbdcScKtEKB -EPCjjvbdMpXqVmfs -EPCjjvbduoTzpjoU -DoDLKvbdYkqctNkm -EObkKvbddoErjstS -DnbjjvbduLxWaUAw -DoCkKvbdRXODbkgc -DoCjjvbdwzIGFweS -DoCkKvbdZyEKOClS -EObjjvbdiGjCxvJu -EObkKvbdbiMijewY -DoDKjvbdqrVKmkBN -DoCkKvbdFyUuBEYC -DoDLKvbdNsTufduQ -DoDLKvbdEPCkKvcE -DoDLKvbdNQYRWNgT -DnbjjvbdNrtWGeUp -DoCjjvbdPxmAGrqj -EPDKjvbdKNAEZgVB -EPDKjvbdmttzKjSG -EPDKjvbdssSSxydc -DoCjjvbdTlWPAuni -EObjjvbdDHLegAzc -EObjjvbdXnRAXtvU -EObkKvbdKfFgaaQu -EOcKjvbdhtzFXSUb -EPCkKvbdJTZAsMwl -EOcKjvbdQYmAGsSK -DoCkKvbdjhHLeemk -EOcLKvbdiifIJmYS -EPDKjvbdLrWlzVQz -DoCjjvbdxsOIlrBg -EPDLKvbdNPxQvNfs -DnbkKvbdIGfyxwxH -DoCjjvbdjKFhKMwr -DnbjjvbddjKSVtzn -DoCjjvbdZoNiFEzK -EPCjjvbdeFOqavcK -DoDLKvbdEuxpQMie -EObjjvbdZjShQHCG -DoDLKvbdZMSDsmkm -DoDLKvbdGYtuBEYC -EPCjjvbdUaBprqRy -EOcLKvbdmozZWLZC -DncLKvbdUWLpKUBR -EPCjjvbdqYnhHQcx -DoDLKvbdUaBprpqy -EPDKjvbdrzMQSaHn -DnbjjvbdGdLWKCJj -EObkKvbdfILVrNqH -EPCjjvbdehKvRmqH -EPDKjvbdOSsvGeVQ -DncLKvbdxxJJaozL -EPCjjvbdZLqctNkm -EOcLKvbdZxcinCkr -DncLKvbdkWWmcbXw -DoDLKvbduCcVXWPP -DncLKvbdyTNhlqbH -DncKjvbdYTMAlsoY -DoCkKvbdRosfjFcw -EPDLKvbdDwxLsstM -EOcKjvbdlZTRryHU -DoCjjvbdNGbpMpVL -EOcLKvbdYgWdAOri -DoCjjvbdDxYLstTl -EObjjvbdIwtBglRQ -EOcKjvbdvPTzpkPU -DoCjjvbduLxXAtBX -DoCjjvbdiLeENuCy -DnbjjvbdUaCRSqRy -DnbjjvbdYpmEhleR -EObjjvbdsPvOjDWG -DoCkKvbdLFfICApu -DncKjvbddxZstRez -EPCkKvbdFyVVAdXb -DoCjjvbdFyVVBDxC -DoDLKvbdFeirNiTq -EPCjjvbdxnSgxTIc -EOcKjvbdAMgySwZx -EObkKvbdkyTRryHU -DoCkKvbdMRwMzUpz -DnbjjvbdCWzdJEov -DoCkKvbdUyITzLPO -EPCkKvbdcSbjsdKB -DoCkKvbdqceIonVa -DoCkKvbdjmCMZeGo -DncKjvbdfMewGljL -EObkKvbdpfEEtVaI -DoDLKvbdczZQYYqC -DoDLKvbdRNXbYmtz -EObjjvbdTvLojUBR -EPCkKvbdtbcVXWPP -DncLKvbdmSYuZrdJ -DoDLKvbdTukpKUBR -EPDLKvbdsQVoKCvG -EPDLKvbdBraCtFvr -EPDLKvbdZQmEiNEq -EPCjjvbdrzLosAgn -EPCjjvbdssRsZZdc -DncKjvbdbAudepQX -DncKjvbdcTDKscia -DncLKvbdlqyVZsEJ -EOcLKvbdbVCHXkTh -EObkKvbdYTMBMsnx -DnbjjvbdULvPAuoJ -DoCjjvbddtAUASlv -DoDKjvbdxUmEpxkn -DncKjvbdQwOEDLgc -DoCkKvbdSPsgKGDw -DncKjvbdiCOcFXQq -EPDKjvbdRkYfUfkT -EObkKvbdKCjDRJcY -DoCjjvbdZLqctOMN -EPCjjvbdUWLpKTaR -EPCjjvbdLqwMzVQz -DnbjjvbdnBivxPNu -EObkKvbdRpUHKFdX -EPCjjvbdeATqNXif -DoCjjvbdfILVrOQg -DoDKjvbdNrtVfeUp -EOcLKvbdNUrrKmAX -EPCjjvbdrbFllHLZ -DncKjvbdkDMLQgUg -DoCkKvbdVvhwvDeH -DnbjjvbdKeegaaRV -DoDKjvbdcJMjKfXY -DnbjjvbdZtJJYcrn -DoDLKvbdyqOliJwA -DoDLKvbdMgDPmPuL -DoCkKvbdHffzZXxH -DoCjjvbdZxdKNblS -EPDKjvbdkDLjqGtg -EPDKjvbdYzbeqjVy -DncLKvbdTppnttgm -EObkKvbdVYgtZjnn -EPCjjvbdzaAOgHCM -EOcKjvbdcyxoxZRC -EPDLKvbdxnSgxTJD -EObkKvbdfMfXHNJk -EPDKjvbdunszpjoU -EObkKvbdFfKRmhsq -EOcLKvbdhtydwRtb -DoDLKvbdYkrDsnLm -EPDLKvbdGGKSOItR -EPCkKvbduDCuXVno -EPDLKvbdrEFJQOVa -EPDLKvbdIjEAKQGd -EObjjvbdIryArmYM -DoDLKvbdYkqctOMN -EPCkKvbdiZtekqOG -DncKjvbdzdzOzeZp -DoDLKvbdbiNKLFwY -DnbkKvbdlhcsqUrB -DnbkKvbdKyRJrzuG -DoDKjvbdOFDtIiKd -DnbjjvbdvvlBWBVu -DnbkKvbdlrZUyrdJ -EObkKvbdxZgeewdr -DncKjvbdegkVrNpg -DoCjjvbdrJAJeNPF -EObjjvbdmfeXmOHZ -DoCjjvbdNPwqVmfs -DnbjjvbdnPzYvLZC -EPDKjvbdZshiYcrn -EOcLKvbdhgJcYvJu -DoDLKvbdXrlAmToY -DnbkKvbdwWlAvBVu -DnbkKvbdjvWnEBww -DoDLKvbdTYLLmzjx -EOcKjvbdDihJuxKA -DncLKvbdTfznLvue -DoCjjvbdVgwvXgYz -EObjjvbdsBfMkgKy -EPCjjvbdUaBqTQrZ -DnbjjvbdbhmJkGWx -EPCjjvbdLBLGmCYR -DoDKjvbdwjwEHzyf -EPDLKvbdegkVrNpg -DoCkKvbdJpzEnfOF -EPCkKvbdFejSOItR -DnbjjvbdTqQnuUhN -EOcLKvbdUMVoAvOi -EPCkKvbdSCEFLiZL -EPCkKvbdnCKXYPNu -EPDLKvbdZyEKNbkr -DncLKvbdZisIQGaf -EObjjvbdGLEsDHmV -DoCjjvbdBcpAujNG -EObjjvbdZRNFIleR -DnbjjvbdVrOXaeLc -EPCjjvbdHELViaij -EOcLKvbdqcdhpNvB -EPCkKvbdiZuFkqOG -DoCkKvbdOSsufeVQ -DoDLKvbduoTzpjnt -EOcLKvbdTqRPUuHm -DoDLKvbdCDpAuilf -EOcKjvbdZMSDsnMN -DoDLKvbdYqNFJMeR -DnbkKvbdbAvFFpPw -EOcKjvbdVqmwaeMD -EPCkKvbdUyHsyjnn -EPCjjvbdKeehBaQu -DoCjjvbdZshiYdTO -EObkKvbdTvMQJsaR -EPCjjvbdjblKqHUg -DnbkKvbdYlSDtOMN -EObkKvbdrWpMCiZR -EOcKjvbdUGzmlWue -DncKjvbdFyUuAcwb -EPCkKvbdLZQjSztf -EPCjjvbdfjfzbfAE -DncKjvbdFWZQQMie -DoCjjvbdVgxVxHYz -EOcKjvbdWWhxWEFH -DoDLKvbdUWLoitAq -DoDLKvbdzaAOffbM -EOcLKvbdrXPkbiYq -DoCkKvbdYzberKVy -DncLKvbdIMBznWpk -EPCkKvbdEPCkKwDE -DnbkKvbdWWiYVcdg -DoCkKvbdCWzchdpW -EOcLKvbdjvXNcbYX -EPDLKvbdSxLMNzjx -DnbjjvbdhficYuiu -DncLKvbdvmWAMdEm -EObjjvbduaDyTOdh -DncKjvbdwWlAvBWV -DoDKjvbdVviYWDeH -EOcKjvbdNsUWGdtp -DoCjjvbdzjVPodTU -EPCkKvbdmIcsptqa -EPDLKvbdIHHZxxYH -EPDLKvbdUyIUZkPO -EObkKvbdCDpBWJlf -EPDKjvbdWSNwaeMD -DoCjjvbdACrXjZhp -EPDLKvbdwuMdqYlO -DnbjjvbdHlBznWpk -DnbjjvbduaDyTPEh -DnbjjvbdwuNFRZLn -EObjjvbdajkfOnDA -DnbkKvbdWWiYWEEg -EPDLKvbdffLymgHA -EOcLKvbdkDMKpfuH -EPDLKvbdMoxQvOHT -DnbkKvbdbKkenmcA -DoCjjvbdhytfMRNf -DoCjjvbdIsZAsNXl -DoDKjvbdLiBkqYAS -DncLKvbdyzdmrHiI -DnbjjvbdemFvfmJk -EOcLKvbdSCEEkiYk -DoDKjvbdbiNKKevx -DoDLKvbdaaVdeoow -DnbjjvbdNGcQNPuL -DncLKvbdQYmAGrrK -EPDKjvbdrbGMkfjy -EPCjjvbdZjShPfbG -DnbjjvbdJmADyfuB -DnbjjvbdhtzFWquC -DnbjjvbdQvmdDMID -DncLKvbdjvWnEBww -EPCjjvbdxZgfGXdr -EObkKvbdDihKWXjA -EPCkKvbdZMSETnLm -EPDKjvbdZLqcsnMN -EObkKvbdqwPlDJZR -DoDKjvbdZisIQGaf -EObjjvbdjlalZeGo -DncKjvbdxsOJMqag -DoDKjvbdOFEUIhkE -DoCkKvbdzitoodSt -DncLKvbdVrNwaeMD -DoCjjvbdezuyEiTw -EPDKjvbdiCOcEvpq -DoCjjvbdvvlAvAvV -DnbjjvbdJuuFceHJ -DoCjjvbdlYrrSyGt -EPCkKvbdfILVrNqH -DoDLKvbdxsOJNRbH -DncKjvbdIwtBgkpp -DnbkKvbdOTUWHEtp -EPDKjvbdFejRnIsq -DnbjjvbdVBCRTQrZ -EPCjjvbdiMEcnUcZ -EObkKvbdiZuGMRNf -EOcKjvbdatbHYLTh -DoCkKvbdmSZVZrdJ -DoDKjvbdqTsgRqjt -DoDLKvbdCEQBWKNG -DnbjjvbdZtJJZESn -DncLKvbdIHGzZXwg -EPDLKvbdwtmFRZMO -DoCjjvbdKDJbqJcY -EObkKvbdatbHXkUI -DnbkKvbdYqNEhleR -EObjjvbdNHColotk -EPDKjvbdegkWSNpg -DoDLKvbdRjyFtfjs -DoCjjvbddoEsKtUS -EOcLKvbdsQWOjCvG -DoCkKvbdvAcxsOeI -EObjjvbdbAueGQQX -EOcLKvbdxKwEHzzG -DoDKjvbdqTtHSRkU -EOcKjvbdOAIsUKSA -EPCjjvbdWSNxCElD -EPDLKvbdnCKWwoNu -DncLKvbdEARiMzXX -DoCkKvbdbAvEeoow -EOcKjvbdhgJcYvJu -DnbjjvbdTulPisaR -DnbjjvbdIidAKQGd -EPDKjvbdyOTIXrhc -EPCkKvbdrbFmLgLZ -EPCjjvbddeOqbXDK -DncKjvbdRacdlJZL -EOcLKvbdbsDKtDjB -EPCjjvbdUyHtZkOn -EObkKvbdyTOImSBg -DncKjvbdtbbtwWPP -EPDKjvbdKDKDRJcY -EObjjvbdhanbeXQq -EOcLKvbdvvlAuaWV -EPDLKvbdVYgsyjoO -EPDLKvbdKaKflawq -EOcLKvbdCIjajiFj -EObkKvbdUsmUGMWK -EPDLKvbdIjEAJofd -EOcLKvbdqBJFAWhE -EPCkKvbdEJgivXjA -DnbkKvbdYkqdTmkm -EPCkKvbdliDsqUrB -EObjjvbdKVtfEEfi -EObkKvbdmgFYMmgZ -EObjjvbdEARhlyvw -DncKjvbdaRecHtGL -DnbjjvbdNQYRVmfs -EOcLKvbdFfKRnJTq -DncLKvbdMgDQNQUk -EObkKvbdHgGyyXwg -EPCkKvbdCJKbKiFj -EPCkKvbdBraDUGXS -EPDLKvbdiMEcnVCy -DoDLKvbdkCkkQfuH -EOcLKvbdwtmFRZLn -EPDKjvbdKefHbApu -DnbkKvbdkxrqsZGt -EPCkKvbdfIKvRmqH -EOcKjvbdDnbkLWbd -EPDLKvbdaRebhTek -DoDLKvbdjuwODaxX -DnbjjvbdREDBPpdS -DncLKvbdjuwNcaww -EOcKjvbdbiMjKevx -EPDKjvbdqvpLcIyR -EPCjjvbdijGIKMxS -EPDLKvbdQmYCZNtz -EObjjvbdCDpAvKMf -EOcLKvbdJJdAKPgE -DoDKjvbdUxgszLOn -DnbjjvbdOEcshhjd -DoCjjvbdUaCRSprZ -EPCkKvbdxmrhYTJD -EPDKjvbdICLydzAD -EPCjjvbdKRZdoFme -EObkKvbdNdctJIjd -EPCjjvbdKVuFdEgJ -EObjjvbdrXPlDIyR -DoCkKvbdfMewGmKL -DnbkKvbdIwsahMQp -EOcLKvbdRaceMIxk -EPCkKvbdcyxoxZQb -EObjjvbdRkYeuGkT -DncLKvbdbVBfwkTh -EObjjvbdTppoVUhN -EPCjjvbdhytfMROG -EOcKjvbdUxgszKoO -DoCjjvbdGLEsDHlu -EObkKvbdegkVqmqH -DncKjvbdkMbLyeGo -DncKjvbdyzdmqghh -EPCkKvbdGFiqnIsq -EPDKjvbdpstGqqjt -EPDKjvbdYkrDsmkm -EPCkKvbdKaLGlbXq -DoCkKvbdxwiJbPyk -EPCkKvbdJcKDQibx -EPCkKvbduDCuXWPP -DnbjjvbdiGicZWKV -DoCkKvbdsPunicWG -DnbjjvbdKNAEZgVB -EPDLKvbdnPyxujyC -EObkKvbdJXsagkpp -EObkKvbdNddUIiKd -DnbjjvbdQwOEClID -DnbkKvbdFVxpQMie -EPCkKvbdVrNxBeLc -EPCjjvbdUsmUGLuj -EPDLKvbdGZVVBDwb -DoCjjvbdmRyUyrdJ -DncKjvbddZxoxZQb -DnbjjvbdGKdsDINV -EObjjvbdrafNLgKy -DoCjjvbdJbjCqJbx -DnbjjvbdlYsSTYgU -DoCkKvbdQvnDblID -DoDKjvbdssSTYzFD -DncKjvbdmozZVkZC -EPDKjvbdjbkkRGuH -DoDLKvbdxmrgwriD -DoDKjvbdfHkVrORH -EPCkKvbdJuuFceHJ -DoDKjvbdcbSlrATm -EPCkKvbdeATpmXif -DncLKvbdBiKajhej -EPCkKvbdrNZixlIJ -EPDLKvbdKVteceGi -EObkKvbdzjVPodTU -DoDLKvbdWSNxCEkc -EOcKjvbdZxcimcLr -EOcKjvbdZnnIeEyj -DnbkKvbdmbKWxPOV -EPCkKvbdZLrETmkm -EPDKjvbdnUtyjiqf -DoCkKvbdrWpLcJZR -DoCkKvbdaMkCStmH -DncLKvbdFVxpQMie -EPCjjvbdrpWOicWG -EOcKjvbdyOTIYShc -EObkKvbdqrVLNkBN -EOcLKvbdQvnDbkhD -EOcLKvbdDigiuxKA -DncLKvbddoErkTtS -DoDKjvbdRWmdDLgc -EPCjjvbdiHKDZVjV -DnbkKvbdADSYKZiQ -DnbkKvbdsPunibuf -DoCjjvbdSPsfiedX -EPDKjvbdJmAEZfta -EOcKjvbdZMRcsnLm -DoCkKvbdiLddOUcZ -EObkKvbdqqtkOLAm -DoDLKvbdYpmFImFR -EObjjvbdVhYWXfxz -DnbjjvbdMowqWNfs -EObkKvbdVgwuwgYz -DoDKjvbdDxYLsssl -DnbjjvbdZtIiYcsO -DnbkKvbdxwiKBpZk -DoDKjvbdEuxpPmKF -EOcKjvbdJcKDRKCx -EObkKvbdUtNUFlWK -EOcKjvbdjhHLfFnL -DoCkKvbdSQTgKGDw -DncLKvbdQccBQRDr -DncLKvbdILazmwRL -DoDKjvbdYTMBNUPY -DoDLKvbdKaKfmCXq -EPCjjvbdkIHMGGOL -DnbjjvbdCIjbKhfK -DnbkKvbdVgwuwfxz -EPCjjvbdwtmFQxkn -EPDLKvbdcyyQYZRC -DoDKjvbdPyNAGsRj -EObjjvbdSLYetgLT -DoDLKvbdMRwNZuQz -DncKjvbdFjdrcHlu -DoCjjvbdZyDimbkr -DnbkKvbdRXNdClID -EObjjvbdEYYLtUTl -EObkKvbdVqmxBdlD -DoDLKvbdptTgRqkU -EOcLKvbdBdPaWKMf -EPCjjvbdiBncEvpq -DoDLKvbdzQoNJKXA -DoDKjvbdUQpoUtgm -DnbkKvbdrzLpTBHn -DoCjjvbdunszpkPU -EPDLKvbdSZjHsCvA -DncKjvbdRotHJfDw -DnbkKvbdFejSOItR -EOcKjvbdeFOrBwCj -DoDLKvbdkVwNdCXw -EPCkKvbdeOdrjtTr -EPCjjvbdhuZdwRuC -DnbkKvbdfILVqmqH -DncKjvbdnPzYvLYb -DncKjvbdHgGzZYXg -DncKjvbdkVwNcaxX -DoDLKvbdOAJSsjSA -DncKjvbdOFDtJIjd -EOcLKvbdVgwvYGxz -EObkKvbdsQVnjDWG -DoCjjvbdZjShQHCG -DncKjvbdzoPpeCkx -DoDLKvbdSLZFtfjs -DnbkKvbdBsBCtFvr -EOcLKvbdFyUuAcwb -DnbjjvbdqUTfqrKt -DoCjjvbdZxdJmcLr -DncLKvbdmbJwYPOV -EObjjvbdEObjkXDE -EOcKjvbdaSFcIUGL -EPCkKvbdqYoIHQcx -EOcKjvbdfNGWgMjL -DoCjjvbdbrcKtEKB -EPCkKvbdvBDxsOdh -DnbjjvbdtcCuXVoP -DnbjjvbdrpWPKDVf -EOcKjvbdwyhFfYFS -EPCjjvbdnPyyWLZC -EPDLKvbduMYXBUAw -DoDKjvbduaDySoFI -DoCjjvbdyXiKCPzL -DncLKvbdGFjSOIsq -DoDLKvbdeEoRbXDK -DncLKvbdcTCjtDia -DnbjjvbdnUuZjiqf -DnbjjvbdjlakzFHP -EOcLKvbdwWlBWAvV -DnbkKvbdWWiXuceH -EObkKvbdemGWfmKL -EObkKvbdmuUykJrG -DoCkKvbdmozYvKxb -DncKjvbdQZNAGsSK -EObjjvbdjblKpgUg -DncKjvbdSZigsDWA -EOcLKvbdZyEJmblS -DoCjjvbdnCJwYOmu -EPDKjvbdtkxWaTaX -EPDKjvbdGZUuAcwb -DoCkKvbdyfxlANEw -EPCkKvbdTAFJIBnd -DncKjvbdZLqctOMN -DncKjvbdUMWPBWPJ -EPCkKvbdDwwksstM -EPDKjvbdEObjjvbd -EObjjvbdWXJYWEEg -DnbjjvbdpaIeAXIE -DoCjjvbdqYoIHREY -DnbjjvbdvmWAMceN -EObkKvbdLFfHaaQu -EOcLKvbdpaIeAWgd -EPDLKvbdkCkkQgUg -DnbjjvbdePErkTtS -DnbkKvbdNGbomQVL -DoDLKvbdEPCjkWcE -DoCkKvbdehLWRnRH -EOcKjvbdyXhibQZk -EOcLKvbdZyEKOCkr -DoCjjvbdkDLkRGtg -DoDLKvbdkaNPNALA -EObkKvbdrWpLbiYq -DoDLKvbdfHkVqmqH -DoDLKvbdEOcLKwCd -DoDKjvbdrykpTBHn -DncKjvbdxZgefYFS -DnbkKvbdJpzFPFnF -DoCkKvbdNGcPmPtk -EPCjjvbdhzUelRNf -EObkKvbdVTltFlWK -DoCkKvbduaDxrneI -EObkKvbdSQTgJfEX -EOcKjvbdVhYVxHYz -EOcKjvbdkCkkQgUg -EObkKvbdqUUHSSLU -EOcLKvbduLwwAtAw -EPDKjvbdZLrETnMN -EObkKvbdmttyjjRf -DoDKjvbdYqMdiMdq -DoCkKvbdkNBkzEfo -DncKjvbdiLeDnUcZ -DoDKjvbdZLrDsnLm -EPCkKvbduVnYKRTA -EPCjjvbdCIkCLJFj -EPDKjvbdssRrxyeD -DncKjvbdQwOEClHc -EPCkKvbdwXLaWAuu -EPCkKvbdUyHszKoO -EPCkKvbdJYTagkqQ -DoCkKvbdwuNFRYlO -EPCjjvbdfHkWRmqH -EOcKjvbddeOqbXCj -EObkKvbdhficYujV -EPCkKvbdmSYtzTEJ -EPCjjvbdtkxWaTaX -EPDLKvbdwygfGYEr -EPDKjvbdmpZxvKyC -DoCjjvbdpstGrSLU -EPDKjvbdUtMtGLuj -EOcKjvbdjlbLzFGo -EObkKvbdkyTSTZGt -EOcLKvbdLYpjSzuG -EPDLKvbdyXhibQZk -DncKjvbdptUHSRkU -DnbjjvbdFfKRmhtR -DoCjjvbdtbcUwVoP -EPDKjvbdhyuFkpnG -EPDLKvbdFpASwHFy -EPCjjvbdRbDeLiYk -DncLKvbdXmqAYUut -EObjjvbdqlyjZLgi -DoCjjvbdssSTYydc -DnbkKvbdTIzJqABM -EPCkKvbdxsOJNRag -EPCjjvbdlhcspuSB -EObkKvbdqUTgSRjt -EOcKjvbdOEcshhkE -EObjjvbdzjUpPdTU -DnbkKvbdvwLaVaWV -EPCjjvbdmoyyVkYb -DoCkKvbdOFETiJKd -EPCjjvbdeEnqawCj -EObjjvbdmuUzKjRf -EPDLKvbdVvhxVdFH -EPCkKvbdaSGDHsek -EPCjjvbdkySrTZHU -EObjjvbdtAGqIABS -EObkKvbdZyEJmblS -DncKjvbdyTOJMrCH -DncLKvbdFWYoolie -DoDLKvbdTvMPjUAq -EObjjvbdZLqctOLm -DnbkKvbdmIctQuSB -DoCkKvbdZGvdAPTJ -DoCjjvbdkDMLRGuH -DoDLKvbdnVUykKSG -DoDKjvbdLGFhBaRV -DncLKvbdxwiKBozL -DncLKvbdWIYWXgYz -DncLKvbdFkFSbglu -DoDKjvbdIGgZxxXg -DnbjjvbdEztRFMDJ -DoDLKvbdZQldiNEq -EOcLKvbdwWkaWAvV -DoDKjvbdLBLHMawq -DoDLKvbdkMbLzFGo -EPDKjvbdREDAopcr -DoCkKvbdZoNiEdyj -EPDLKvbddneSkUUS -DnbkKvbdSQUHJecw -DoCjjvbdZshhxcrn -DnbjjvbdRkZFuHLT -EPDKjvbdwuNEqYkn -DoDLKvbdemGXGmJk -EOcLKvbdKWVGDeGi -DoCkKvbdWSOXadkc -EObjjvbdVTmTelWK -DncKjvbdhkeDmuDZ -EPCkKvbdRWnEDMID -DnbjjvbdNQYRVnGs -DnbkKvbdTfzmlWvF -DoCkKvbdFpASvgGZ -DoCjjvbdqTsfqqkU -EObkKvbdUVkpKUAq -DoDLKvbdrRtkNjaN -EPCkKvbdrJAKEmOe -DncKjvbdIGfyyYXg -DnbjjvbdZLrDtNkm -EObjjvbdiMEcmuCy -DncKjvbdkyTSTZHU -DncLKvbdBsAbtFvr -DnbkKvbdrpWPKDWG -DncKjvbdbBWFFoow -DoDLKvbdxmsIXsJD -DnbkKvbdehLWRnRH -EObkKvbdiVZeXRuC -DnbkKvbdOTUVfduQ -DncLKvbdZjTIQHCG -DoDLKvbdOSsugFVQ -DoCjjvbdrafNLgKy -EPDLKvbdNPxRVmgT -EPDKjvbdHlBznXQk -EPCkKvbdCEQBWKMf -EObjjvbdtcDUwWOo -DoCjjvbdZMSDtNlN -DoDLKvbdvAcxrneI -EObjjvbdIxUCILpp -EOcKjvbdfSBWzkbo -EObkKvbdShzKRAAl -DnbjjvbdGZUuBDxC -EObkKvbdqlzKYkhJ -EPDKjvbdZyEKNbkr -DoDLKvbdsrrTYzFD -DoCkKvbdfSAvzkcP -DnbjjvbdqlzKYlHi -EPDKjvbdYTLaNToY -EPCjjvbdjEjgUoAO -EOcKjvbdTJZjRABM -EObkKvbdYORAXtvU -DoDLKvbdGKdrcHmV -DoDLKvbdbrcLUEJa -DncLKvbdqvpLcJZR -DnbkKvbdFeiqnIsq -EPDKjvbdZnnIeEzK -EPCjjvbdnUtzLKRf -DoDLKvbdDxXlUUTl -DoDKjvbdiMEcnUby -EObkKvbdYzbeqjWZ -DncKjvbdTvLojUAq -EOcLKvbdjuvmdBxX -DnbjjvbdzoPpdcMY -DoDKjvbdrovOibuf -DoDKjvbdFWZPomJe -DoDKjvbdqGDeUWBI -DoCkKvbdWWiYVdEg -EObkKvbdtvOXiqTA -DnbjjvbdqZPIGpdY -EObkKvbdLBKgNCYR -DoCjjvbdLBKgNCYR -EObjjvbdZsiJZESn -DoCkKvbdTqROtuIN -EPCjjvbdyfyMAMdw -EOcLKvbdptTgSSLU -DncLKvbdPxmAHTSK -DnbjjvbdRkZFtfkT -EPDLKvbdtlXvaUAw -EPCkKvbdqBJFAWhE -EPCkKvbdIidAJogE -EPDLKvbdKQydoGOF -EObkKvbdauCGwkTh -EPCjjvbdNddUIiKd -DoDLKvbdFfKRmhsq -EPCkKvbdeEnqbXCj -EObkKvbdJvVGDdfi -DoDKjvbdWRmwaeLc -EObkKvbdSCDeLiZL -EPDKjvbdDoDLLWcE -EPDLKvbdiMEcnUby -DnbjjvbdLBLGmBxR -EPCjjvbdZnmiEdyj -EObjjvbdVhXuwgYz -DncLKvbdUtNTfMVj -EPDLKvbdKaKgMaxR -DncKjvbdJcJbpicY -DnbkKvbdSKyGVHLT -DoDKjvbdzROlhjXA -DnbkKvbdlrZUysEJ -DoCkKvbdnQZyWLYb -DoCjjvbdeFOqbWbj -EOcLKvbdjgfkfGOL -EObkKvbdiHJbyWKV -DnbkKvbdGdLVibJj -DoDKjvbdGLErcINV -EPCjjvbdNGcPlpUk -EOcKjvbdjFLGtoAO -EOcKjvbdsBfMlGkZ -EObjjvbdhtydvquC -DoCjjvbdznpRFCkx -DncLKvbdYSkaNUOx -DoCjjvbdVvhxVdFH -EPDLKvbdNeETiJLE -DoDKjvbdcScLTdJa -EOcLKvbdQwNdDLgc -DoDLKvbdUMWPBWPJ -DncKjvbdqFdEtVaI -EObjjvbdhbPCeXRR -DoCjjvbdKeehCApu -DncKjvbdYNqAXuVt -DoDLKvbdjmCLzFGo -DoCkKvbdtlXwBUAw -EObkKvbdwtmEqYlO -EObjjvbdrovOjCvG -EObkKvbdqrVLOLBN -DoCjjvbdSBcdkhxk -DncLKvbdrEEhomua -EObkKvbdtbbtvuno -EPDLKvbdZjShQGaf -EPCjjvbdTAFJHbPE -DnbjjvbdcScLTcia -EObkKvbdbsDLUDia -DnbkKvbdkyTSTYgU -DncKjvbdySmhmSCH -DoCjjvbdnBivxPNu -DncKjvbdEXxLtTtM -EObjjvbdZshhyESn -DoDKjvbdkMbLzEfo -EObjjvbdssRrxyeD -DoDKjvbdcSbkTdKB -EPDLKvbdHDjvJbKK -DncLKvbdsQVnjCvG -DnbjjvbdJSyBTMwl -EOcLKvbddZxpYYqC -EPCjjvbdrXQLcJZR -DoCkKvbdnHEwlmfy -EOcKjvbdGZUuBDwb -EObjjvbdvOszqKnt -EOcLKvbdRosgKFdX -EPCjjvbdMpXqWNfs -EPCkKvbdJbibqJcY -DncKjvbdJvVFdEgJ -EObkKvbdqwPkcIyR -DnbkKvbdDwxMUTtM -DncKjvbdtcDVXVno -EPDLKvbdlZSrSxft -DoCkKvbdKeehCApu -EPDLKvbdQlxCYmtz -EOcLKvbdYqNFJNFR -DoCkKvbdnCKWwoOV -EObjjvbdwzIFfYEr -EOcKjvbdkDMLQfuH -EPCjjvbdrSUjnLBN -EPCkKvbdTfznMXVe -EPCkKvbdZxdKNcMS -DoCjjvbdJXsaglRQ -DoCjjvbdNPwqWNgT -DoCjjvbdLqwMzUpz -EOcKjvbdCDoaWJlf -DnbjjvbdlYsRsZGt -DncKjvbdeOdsLUUS -EOcKjvbdEvZQPmJe -DoCkKvbdqBJFAXHd -DnbjjvbdtkwwBUBX -EObjjvbdLFfHaaQu -DoDLKvbdbLMFoNcA -EPDLKvbdiLdcnUby -DnbkKvbdUQqPVUgm -EOcLKvbdEOcLLXDE -DoDKjvbdrEEhpOWB -DncKjvbdkCkkQftg -DncLKvbdMfbpNQUk -DnbjjvbdTulQKUAq -DoDLKvbdUtNUFkvK -DncKjvbddndsKtTr -EPDKjvbdliDsqVSB -EPCkKvbdhbOcEvqR -DoCkKvbdqceJQNua -DoCkKvbdrWpLcIyR -DncKjvbdrSVLNkAm -DoDLKvbdyOShYTJD -DncKjvbdyYJKBoyk -DnbjjvbdZQldiNFR -EPDLKvbdePEsKstS -EPCjjvbdcScKtDia -DncLKvbdxsOJNRbH -EObjjvbdEYXlUUTl -DoCkKvbdxUldqZMO -EOcKjvbdRjxeuGkT -EOcLKvbdqrVLNjaN -DoCkKvbdDwwktUUM -EOcLKvbdZQmEiNFR -EPCkKvbdMSXMytpz -DnbkKvbdnUtzKiqf -DoCjjvbdREDAoqDr -EPCjjvbdZyDinDMS -EPCjjvbdiCPDEwRR -EPCkKvbdmSZUzSci -DoDKjvbdkWWmdCXw -DnbkKvbdmJDsqVRa -EPDKjvbdhzVGLpnG -DoCkKvbdsPuoKDWG -DoDLKvbdrylPsAgn -EPCjjvbdsPuoJbuf -EOcKjvbdrEFJQOVa -EPCjjvbdEPDLLXCd -DncKjvbdkVwOEBxX -EPCkKvbdqGEFUWAh -DncLKvbdtbcUvuno -EOcKjvbdWIYWYGxz -EPDLKvbdZLqcsmkm -DoDKjvbdmaivwnnV -DoCkKvbdOYPVzcmt -DoCjjvbdVwIwvDeH -DoCjjvbdYkrETmkm -DoDKjvbdLFfHbAqV -EObjjvbdkIHLefOL -EPDKjvbdZjShPfaf -DoCjjvbdehLWSORH -DncLKvbdKfFgbBQu -EObkKvbdsPunjDVf -DncKjvbdiMEdNuCy -DncKjvbdFfKSNhtR -EOcKjvbdFVxpQNKF -DncLKvbdfHkVrORH -EObjjvbdKefIBaQu -EPDKjvbduCbtvuoP -EPCkKvbdGdLWKCKK -DncLKvbdLAkGmBwq -DncLKvbdZshiZESn -DnbjjvbdySmhmSCH -DoDKjvbdACqxJyiQ -DncLKvbdmajXYOmu -DnbjjvbdxVNFRZMO -DnbjjvbdVqmxBdlD -DnbkKvbdIGgZyYXg -DncKjvbdddnrBvcK -EPCjjvbdUGzmkwVe -DncLKvbdaNLCTVNH -DoCkKvbdWWhwucdg -DncKjvbdkWWmcaxX -DoDKjvbdaRfChUGL -EPDLKvbdOEcsiJKd -DoDLKvbdGLFTChMu -EObjjvbdjmBkzFHP -DncLKvbdrWokcJYq -EObjjvbdDHMGHAzc -EObkKvbdRyjITCvA -DnbjjvbdWRnXbElD -DoCjjvbdEARiNZvw -DnbkKvbdRjyFtfjs -DoCkKvbdMgDQNQVL -DoDKjvbdCEPaWJmG -DoCkKvbdUtNTfLuj -DoDKjvbdNGcQMpVL -DoDKjvbdZQmFImEq -EObjjvbdyYIibPyk -DoDLKvbdcSbjtDjB -EPCjjvbdPxmAGsSK -EPCjjvbdnUuZjirG -EPCkKvbddijSVtzn -EOcKjvbdxUmEqYlO -EOcKjvbdxrmiNRag -EPCkKvbdjmBlZeHP -EOcKjvbdvBDySndh -EObjjvbdliDsqVSB -EOcKjvbdTvMQKUBR -DncLKvbdRNXbYnUz -DnbjjvbdyYIiaozL -DoCkKvbdhbPDEwRR -EPDKjvbdptUGrSLU -DoDKjvbdFjeTChMu -DnbkKvbdFVxoomJe -EObkKvbdlYrrSyGt -EPDLKvbdVZHszKnn -DncLKvbdDwwktUUM -DncLKvbdDnbkKvcE -EPCkKvbdjJfHjMwr -EPDKjvbdUtNTfMWK -EObjjvbdbhlikGWx -DncLKvbdKfFhCBQu -DoDKjvbdVgwvXgYz -EPDLKvbdiBoCdwRR -EPDLKvbdzdzOzeZp -EObkKvbdMoxRWNgT -EPDKjvbdjvXNdBww -EObkKvbdUtMsfLuj -EOcLKvbdnUuZjjRf -DnbkKvbduCbtwVoP -EPDLKvbdGGKRmhsq -EObkKvbdePEsLTtS -DoCjjvbdSKyGUgLT -EOcLKvbdRbDdlIyL -DoDLKvbdNxPVzcnU -EObjjvbdkCkkRGtg -DncKjvbdVTmUFkvK -DncKjvbdUsltFkuj -EPDKjvbdSCEElJZL -EOcKjvbdZxcjNcMS -DoCjjvbdEJgjWYKA -DncLKvbdREDBQRDr -DncKjvbddoErjtUS -EPDLKvbdADSYJyiQ -EPDKjvbdatafxKsh -EPDLKvbdkIGkeemk -DoDLKvbdmRxtzSci -DnbkKvbdTlWPAvPJ -DncKjvbdjJegjMwr -DoCkKvbdqTtHSSKt -EOcKjvbdkMakzFHP -DncLKvbddZyPwxpb -DnbkKvbdTppnuUgm -EObkKvbdnPyxukZC -DoDKjvbdbiNJjewY -EPDKjvbdJSyArlwl -EPDLKvbdvvlBVaVu -EOcLKvbdjJfIKMxS -EPDLKvbdliETqVRa -DoCkKvbdWXJXvEFH -DncLKvbdiHKDZWKV -EObkKvbdEXwktUUM -EOcKjvbdRWnDcMID -EPDLKvbdbhljKfWx -DnbkKvbdVTlsfMVj -DnbjjvbdZoOIdeZj -DoDKjvbdDxYLtUTl -EObjjvbdmIdTqUqa -EPCjjvbdiZtekqNf -DoDLKvbdMfcPmPtk -EPDLKvbdKxpirztf -DnbkKvbdEARhlzWw -EOcKjvbdqiAJeMne -DnbjjvbdUsltGMWK -DnbkKvbdMoxRWNfs -EPCjjvbdTqQntuIN -EPDKjvbdLFfHbApu -EOcLKvbdANIZSwZx -DoCjjvbdSLZGUfjs -DoDLKvbdJSyArlxM -EOcLKvbddZxoxZRC -DoDLKvbdRpTfjFcw -EObjjvbdKefHbBRV -EPCkKvbdjlakyeGo -DoDLKvbdiBncFXRR -EObkKvbdkHfkefOL -DnbjjvbdfILVrORH -DnbjjvbdbsDKtDia -DoCjjvbdqiAKElne -EObkKvbdEXxMTtUM -DncKjvbdHfgZxxXg -EPDKjvbdQvnDcMID -DoDKjvbdCSaCsewS -DncLKvbdSZigsDWA -DnbkKvbdiUyeXSUb -DnbkKvbdZRNFJMeR -EPDKjvbdDxXlTstM -EPCjjvbdkNBlZdfo -DnbkKvbdhuZdvqtb -DncLKvbdHDkWJajK -EOcKjvbdhficZWKV -DoDLKvbdxwiKCPyk -EPDLKvbdZQleJMeR -DoDLKvbdLrXMytpz -DncKjvbdcTCjtEJa -DnbkKvbdUMVnaWPJ -DoCjjvbdnBjXYPOV -EObjjvbduWNwjQsA -DoCjjvbdRpUHJecw -DnbkKvbdJYUBglQp -EOcLKvbduoTzqKoU -EObjjvbdZMRctNlN -EObkKvbdziuPpESt -DoDLKvbduLxWaTaX -EOcLKvbdhgKDZWKV -DnbkKvbdZQldhmFR -EOcLKvbdcyyPxZQb -EOcKjvbdRWnDcLgc -DncLKvbdxZgfFweS -EPCkKvbdyqOliJwA -DnbjjvbdsPvPKCuf -DoCjjvbdMgCpNQVL -DncLKvbdOEdTiJKd -EPDKjvbdEARiMyvw -EOcLKvbdJbibqKDY -DoCkKvbdeEnrCWbj -DoCkKvbdGKdrcIMu -DnbkKvbdUMWOaVoJ -DoCkKvbdKaKgNCXq -DnbkKvbdoAKztHdO -EPDKjvbdDxXlUUTl -EOcLKvbdFVxoomJe -EOcKjvbdpyPHfpdY -EPCjjvbdxwiJaoyk -DoCkKvbdlqxtyrci -EOcKjvbdfHkWRmpg -DoCjjvbdkMalZdfo -EPCjjvbdJpyePGOF -DncLKvbdqUUHRqjt -DoDLKvbdziuQPdSt -DoDKjvbdBhjajiGK -EPDKjvbdjcLjpftg -EPDKjvbdVwJYWEFH -DnbjjvbdNdcsiJLE -DoCjjvbdQwODcLgc -EOcLKvbdtkxXAtAw -EPDKjvbdwMvANEEm -DoCjjvbdqFdEsuaI -EObjjvbdrSUjmjaN -DoDLKvbdnGeYMnGy -EOcLKvbdPyNAHTSK -DnbkKvbdMowpvNgT -DoCjjvbdGdLVibKK -DoDLKvbdtcDVXVno -EObkKvbdtlXwBUAw -DoCjjvbdSPsgKGEX -EPCjjvbdURQntuHm -DncLKvbdrMyjZLgi -EPDKjvbdwXMAvBVu -EOcLKvbdRjxfUfkT -DnbkKvbdGFjRnJTq -DoCkKvbdbUbHYLTh -EPDKjvbdoznEKxPA -EPCjjvbdLiBlQxAS -DncKjvbdfVzxPizs -DnbjjvbdSKyFtgLT -EPDKjvbdrXPlCiZR -DncLKvbdhzVGLpnG -EObjjvbdVwJYVdFH -EPDKjvbdwXLaWBVu -EPCjjvbdjhHMGFmk -EObkKvbdKyQjSzuG -DoCjjvbdmfeYNOHZ -DoDLKvbdZirgofaf -EOcLKvbdZoOIdeZj -EPCkKvbdLFfHbApu -EPCkKvbdjvWnEBww -DoDKjvbdcScLUEKB -DoCkKvbdkCkjqHUg -DoDKjvbdyTNhmSBg -DoCkKvbdkHgLfFnL -EPCjjvbdzoQQdcLx -DoCjjvbdOTTvHEtp -EPCkKvbdznopeDLx -EPCkKvbdGFjRmhtR -EPCkKvbdUaCQrpqy -EOcKjvbdnGeXmOHZ -DoDKjvbdiCPDEwRR -DoCjjvbdRbEFLiYk -DncKjvbdRXOECkgc -EPCjjvbdKWUedEgJ -DncKjvbdDjIJvYKA -DoDKjvbdyTOJNRbH -DoCjjvbdePFTKtTr -DoDKjvbdhtyeWrVC -EPCkKvbdqvolCiZR -DoDLKvbdapHHELzd -EObjjvbdlhdUQtrB -EOcKjvbdptUGrRkU -EPCjjvbdqUTfqrLU -EPCkKvbdcJMikGWx -DoDKjvbdlhctRVRa -EOcLKvbdANHyTXZx -EPDKjvbdpssfqrKt -EPCkKvbdFeiqnJTq -DoCkKvbdxZgfGXdr -EOcLKvbdRWmcblHc -DncLKvbdjggMFemk -DoDKjvbdKeegbBQu diff --git a/hotspot/test/runtime/7158804/Test7158804.sh b/hotspot/test/runtime/7158804/Test7158804.sh new file mode 100644 index 00000000000..bce5197dfbe --- /dev/null +++ b/hotspot/test/runtime/7158804/Test7158804.sh @@ -0,0 +1,30 @@ +#!/bin/sh +# +# Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# + +## +## @test Test7158804.sh +## @bug 7158804 +## @summary Improve config file parsing +## @run shell Test7158804.sh +## + +if [ "${TESTJAVA}" = "" ] +then + echo "TESTJAVA not set. Test cannot execute. Failed." + exit 1 +fi +echo "TESTJAVA=${TESTJAVA}" + +rm -f .hotspotrc +echo -XX:+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa >.hotspotrc +${TESTJAVA}/bin/java ${TESTVMOPTS} -XX:+IgnoreUnrecognizedVMOptions -XX:Flags=.hotspotrc -version +if [ $? -ne 0 ] +then + echo "Test Failed" + exit 1 +fi +rm -f .hotspotrc +exit 0 diff --git a/jaxp/.hgtags b/jaxp/.hgtags index 5c329132e45..38c1f7d7db2 100644 --- a/jaxp/.hgtags +++ b/jaxp/.hgtags @@ -183,3 +183,5 @@ f19d63b2119a0092f016203981ffef5cc31bc3c5 jdk8-b56 af9e8b0f1900b631a8a0fcccff9f1514fe58c808 jdk8-b59 2d1dff5310daaf226421a8c92823cb8afcf35f31 jdk8-b60 6b1db0b41d2f6e2a7b3bdbc8a8db823b47752906 jdk8-b61 +5d0fa0108d028c05753a47bcf2a598357dabf0c0 jdk8-b62 +192d8a244bc36427757866e9fb3a08938c0e674c jdk8-b63 diff --git a/jaxp/makefiles/BuildJaxp.gmk b/jaxp/makefiles/BuildJaxp.gmk new file mode 100644 index 00000000000..85649849f2b --- /dev/null +++ b/jaxp/makefiles/BuildJaxp.gmk @@ -0,0 +1,61 @@ +# +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This must be the first rule +default: all + +-include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk + +JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ + -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar +DISABLE_JAXP_WARNINGS:=-Xlint:all,-deprecation,-unchecked,-rawtypes,-cast,-serial,-dep-ann,-static,-fallthrough + +# The generate new bytecode uses the new compiler for to generate bytecode +# for the new jdk that is being built. The code compiled by this setup +# cannot necessarily be run with the boot jdk. +$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ + JVM:=$(JAVA),\ + JAVAC:=$(JAVAC_JARS),\ + FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXP_WARNINGS) -g,\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + +$(eval $(call SetupJavaCompilation,BUILD_JAXP,\ + SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ + SRC:=$(JAXP_TOPDIR)/src,\ + CLEAN:=.properties,\ + BIN:=$(JAXP_OUTPUTDIR)/classes,\ + SRCZIP:=$(JAXP_OUTPUTDIR)/dist/lib/src.zip)) + +$(eval $(call SetupArchive,ARCHIVE_JAXP,$(BUILD_JAXP),\ + SRCS:=$(JAXP_OUTPUTDIR)/classes,\ + SUFFIXES:=.class .properties,\ + JAR:=$(JAXP_OUTPUTDIR)/dist/lib/classes.jar)) + +all: $(JAXP_OUTPUTDIR)/dist/lib/classes.jar $(JAXP_OUTPUTDIR)/dist/lib/src.zip + +.PHONY: default all diff --git a/jaxp/makefiles/Makefile b/jaxp/makefiles/Makefile index 85649849f2b..9539fe0e255 100644 --- a/jaxp/makefiles/Makefile +++ b/jaxp/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,39 +23,27 @@ # questions. # -# This must be the first rule -default: all +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) +endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) --include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) -JAVAC_JARS ?= "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar -DISABLE_JAXP_WARNINGS:=-Xlint:all,-deprecation,-unchecked,-rawtypes,-cast,-serial,-dep-ann,-static,-fallthrough +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) +endif -# The generate new bytecode uses the new compiler for to generate bytecode -# for the new jdk that is being built. The code compiled by this setup -# cannot necessarily be run with the boot jdk. -$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXP_WARNINGS) -g,\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -$(eval $(call SetupJavaCompilation,BUILD_JAXP,\ - SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ - SRC:=$(JAXP_TOPDIR)/src,\ - CLEAN:=.properties,\ - BIN:=$(JAXP_OUTPUTDIR)/classes,\ - SRCZIP:=$(JAXP_OUTPUTDIR)/dist/lib/src.zip)) - -$(eval $(call SetupArchive,ARCHIVE_JAXP,$(BUILD_JAXP),\ - SRCS:=$(JAXP_OUTPUTDIR)/classes,\ - SUFFIXES:=.class .properties,\ - JAR:=$(JAXP_OUTPUTDIR)/dist/lib/classes.jar)) - -all: $(JAXP_OUTPUTDIR)/dist/lib/classes.jar $(JAXP_OUTPUTDIR)/dist/lib/src.zip - -.PHONY: default all +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) diff --git a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java index d6680eceb05..8a2b5948c3f 100644 --- a/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java +++ b/jaxp/src/com/sun/org/apache/xerces/internal/impl/XMLDocumentFragmentScannerImpl.java @@ -806,6 +806,7 @@ public class XMLDocumentFragmentScannerImpl * where the entity encoding is not auto-detected (e.g. * internal entities or a document entity that is * parsed from a java.io.Reader). + * @param augs Additional information that may include infoset augmentations * * @throws XNIException Thrown by handler to signal an error. */ @@ -833,7 +834,7 @@ public class XMLDocumentFragmentScannerImpl // call handler if (fDocumentHandler != null && !fScanningAttribute) { if (!name.equals("[xml]")) { - fDocumentHandler.startGeneralEntity(name, identifier, encoding, null); + fDocumentHandler.startGeneralEntity(name, identifier, encoding, augs); } } @@ -845,6 +846,7 @@ public class XMLDocumentFragmentScannerImpl * are just specified by their name. * * @param name The name of the entity. + * @param augs Additional information that may include infoset augmentations * * @throws XNIException Thrown by handler to signal an error. */ @@ -869,7 +871,7 @@ public class XMLDocumentFragmentScannerImpl // call handler if (fDocumentHandler != null && !fScanningAttribute) { if (!name.equals("[xml]")) { - fDocumentHandler.endGeneralEntity(name, null); + fDocumentHandler.endGeneralEntity(name, augs); } } diff --git a/jaxws/.hgtags b/jaxws/.hgtags index 7d6a6df637a..bc75165561c 100644 --- a/jaxws/.hgtags +++ b/jaxws/.hgtags @@ -183,3 +183,5 @@ cac4c393706343df778a13dc6c84cad0f8c237c9 jdk8-b58 ae107401be116f9e384d3a23192f543828e03da5 jdk8-b59 5c5a65ad5291b7cefcdc308f627cf2b195cf2b69 jdk8-b60 97e5e74e2a341d9142ce28043912a3c255e28e03 jdk8-b61 +d265b9b4c0f55c23a1c9fda02a8052fd9df2eec5 jdk8-b62 +86989f702267debe16d13720d5ae7ae9839796f4 jdk8-b63 diff --git a/jaxws/makefiles/BuildJaxws.gmk b/jaxws/makefiles/BuildJaxws.gmk new file mode 100644 index 00000000000..a745ec8041e --- /dev/null +++ b/jaxws/makefiles/BuildJaxws.gmk @@ -0,0 +1,92 @@ +# +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This must be the first rule +default: all + +include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk + +JAVAC_JARS ?= -Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ + -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar +DISABLE_JAXWS_WARNINGS:=-Xlint:all,-varargs,-rawtypes,-deprecation,-unchecked,-serial,-dep-ann,-cast,-fallthrough,-static + +# The generate new bytecode uses the new compiler for to generate bytecode +# for the new jdk that is being built. The code compiled by this setup +# cannot necessarily be run with the boot jdk. +$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ + JVM:=$(JAVA),\ + JAVAC:=$(JAVAC_JARS),\ + FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXWS_WARNINGS) -g,\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + +# Dummy here is needed to trigger copying of META-INF +$(eval $(call SetupJavaCompilation,BUILD_JAF,\ + SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ + SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes,\ + CLEAN:=.properties,\ + COPY:="dummy",\ + BIN:=$(JAXWS_OUTPUTDIR)/jaf_classes)) + +$(eval $(call SetupJavaCompilation,BUILD_JAXWS,\ + SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ + SRC:=$(JAXWS_TOPDIR)/src/share/jaxws_classes,\ + CLEAN:=.properties,\ + BIN:=$(JAXWS_OUTPUTDIR)/jaxws_classes,\ + COPY:=.xsd,\ + COPY_FILES:=$(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/JAXBContextFactory.java \ + $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/ZeroOneBooleanAdapter.java,\ + ADD_JAVAC_FLAGS=-cp $(OUTPUT_ROOT)/jaxp/dist/lib/classes.jar)) + +$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin: \ + $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin + mkdir -p $(@D) + cp $< $@ + +$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin: \ + $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.xjc.Plugin + mkdir -p $(@D) + cp $< $@ + +# There are two META-INF services files that are needed, add these to the list of goals +BUILD_JAXWS += $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin \ + $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin + +$(eval $(call SetupArchive,ARCHIVE_JAXWS,$(BUILD_JAXWS) $(BUILD_JAF),\ + SRCS:=$(JAXWS_OUTPUTDIR)/jaxws_classes $(JAXWS_OUTPUTDIR)/jaf_classes,\ + SUFFIXES:=.class .properties .xsd .java \ + com.sun.mirror.apt.AnnotationProcessorFactory \ + com.sun.tools.internal.xjc.Plugin,\ + JAR:=$(JAXWS_OUTPUTDIR)/dist/lib/classes.jar)) + +$(eval $(call SetupZipArchive,ZIP_JAXWS_SOURCES,\ + SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes $(JAXWS_TOPDIR)/src/share/jaxws_classes,\ + ZIP:=$(JAXWS_OUTPUTDIR)/dist/lib/src.zip)) + +all: $(JAXWS_OUTPUTDIR)/dist/lib/classes.jar $(JAXWS_OUTPUTDIR)/dist/lib/src.zip + +.PHONY: default all diff --git a/jaxws/makefiles/Makefile b/jaxws/makefiles/Makefile index a745ec8041e..9539fe0e255 100644 --- a/jaxws/makefiles/Makefile +++ b/jaxws/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,70 +23,27 @@ # questions. # -# This must be the first rule -default: all +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) +endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) -include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) -JAVAC_JARS ?= -Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar -DISABLE_JAXWS_WARNINGS:=-Xlint:all,-varargs,-rawtypes,-deprecation,-unchecked,-serial,-dep-ann,-cast,-fallthrough,-static +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) +endif -# The generate new bytecode uses the new compiler for to generate bytecode -# for the new jdk that is being built. The code compiled by this setup -# cannot necessarily be run with the boot jdk. -$(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE_DEBUG,\ - JVM:=$(JAVA),\ - JAVAC:=$(JAVAC_JARS),\ - FLAGS:=-XDignore.symbol.file=true $(DISABLE_JAXWS_WARNINGS) -g,\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - -# Dummy here is needed to trigger copying of META-INF -$(eval $(call SetupJavaCompilation,BUILD_JAF,\ - SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ - SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes,\ - CLEAN:=.properties,\ - COPY:="dummy",\ - BIN:=$(JAXWS_OUTPUTDIR)/jaf_classes)) - -$(eval $(call SetupJavaCompilation,BUILD_JAXWS,\ - SETUP:=GENERATE_NEWBYTECODE_DEBUG,\ - SRC:=$(JAXWS_TOPDIR)/src/share/jaxws_classes,\ - CLEAN:=.properties,\ - BIN:=$(JAXWS_OUTPUTDIR)/jaxws_classes,\ - COPY:=.xsd,\ - COPY_FILES:=$(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/JAXBContextFactory.java \ - $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/internal/xjc/runtime/ZeroOneBooleanAdapter.java,\ - ADD_JAVAC_FLAGS=-cp $(OUTPUT_ROOT)/jaxp/dist/lib/classes.jar)) - -$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin: \ - $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin - mkdir -p $(@D) - cp $< $@ - -$(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin: \ - $(JAXWS_TOPDIR)/src/share/jaxws_classes/com/sun/tools/etc/META-INF/services/com.sun.tools.internal.xjc.Plugin - mkdir -p $(@D) - cp $< $@ - -# There are two META-INF services files that are needed, add these to the list of goals -BUILD_JAXWS += $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.ws.wscompile.Plugin \ - $(JAXWS_OUTPUTDIR)/jaxws_classes/META-INF/services/com.sun.tools.internal.xjc.Plugin - -$(eval $(call SetupArchive,ARCHIVE_JAXWS,$(BUILD_JAXWS) $(BUILD_JAF),\ - SRCS:=$(JAXWS_OUTPUTDIR)/jaxws_classes $(JAXWS_OUTPUTDIR)/jaf_classes,\ - SUFFIXES:=.class .properties .xsd .java \ - com.sun.mirror.apt.AnnotationProcessorFactory \ - com.sun.tools.internal.xjc.Plugin,\ - JAR:=$(JAXWS_OUTPUTDIR)/dist/lib/classes.jar)) - -$(eval $(call SetupZipArchive,ZIP_JAXWS_SOURCES,\ - SRC:=$(JAXWS_TOPDIR)/src/share/jaf_classes $(JAXWS_TOPDIR)/src/share/jaxws_classes,\ - ZIP:=$(JAXWS_OUTPUTDIR)/dist/lib/src.zip)) - -all: $(JAXWS_OUTPUTDIR)/dist/lib/classes.jar $(JAXWS_OUTPUTDIR)/dist/lib/src.zip - -.PHONY: default all +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) diff --git a/jdk/.hgtags b/jdk/.hgtags index c0a4c320b0f..0bdb92a90b7 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -183,3 +183,5 @@ d94613ac03d8de375ef60493e2bb76dbd30d875d jdk8-b58 abad1f417bd3df4296631fc943cd3b7f5062c88a jdk8-b59 cec8fa02f15634acd7d02d04b0b2d8c044cdbaaa jdk8-b60 61ddb3fd000a09ab05bff1940b0ac211661e94cf jdk8-b61 +50b8b17449d200c66bfd68fb4f3a9197432c9e2b jdk8-b62 +f117a3e06f78a258074674ad17601f99bcb1ce0d jdk8-b63 diff --git a/jdk/THIRD_PARTY_README b/jdk/THIRD_PARTY_README index 759733bfceb..6dc1b331638 100644 --- a/jdk/THIRD_PARTY_README +++ b/jdk/THIRD_PARTY_README @@ -2,11 +2,11 @@ DO NOT TRANSLATE OR LOCALIZE. ----------------------------- %% This notice is provided with respect to ASM Bytecode Manipulation -Framework v3.1, which is included with JRE 7, JDK 7, and OpenJDK 7. +Framework v4.0, which is included with JRE 8, and JDK 8. --- begin of LICENSE --- -Copyright (c) 2000-2005 INRIA, France Telecom +Copyright (c) 2000-2011 France Télécom All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/jdk/make/Makefile b/jdk/make/Makefile index 2e5032d0f15..ceb1492bb4e 100644 --- a/jdk/make/Makefile +++ b/jdk/make/Makefile @@ -233,7 +233,7 @@ import_product: all build:: sanity-all post-sanity-all -SUBDIRS = tools java javax sun com +SUBDIRS = tools java javax sun com jdk ifeq ($(PLATFORM), macosx) SUBDIRS += apple endif diff --git a/jdk/make/apple/Makefile b/jdk/make/apple/Makefile index 4dd03dd50eb..aa60f86d35b 100644 --- a/jdk/make/apple/Makefile +++ b/jdk/make/apple/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/apple/applescript/Makefile b/jdk/make/apple/applescript/Makefile index 6d0bc798c38..a9a2a3d8c42 100644 --- a/jdk/make/apple/applescript/Makefile +++ b/jdk/make/apple/applescript/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/Makefile b/jdk/make/com/Makefile index 6f45213d2c7..ab6a499657e 100644 --- a/jdk/make/com/Makefile +++ b/jdk/make/com/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/apple/Makefile b/jdk/make/com/apple/Makefile index c336c610990..b961f28c533 100644 --- a/jdk/make/com/apple/Makefile +++ b/jdk/make/com/apple/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/apple/osx/Makefile b/jdk/make/com/apple/osx/Makefile index bf0ef9c99dc..a98b9222da6 100644 --- a/jdk/make/com/apple/osx/Makefile +++ b/jdk/make/com/apple/osx/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/apple/osxui/Makefile b/jdk/make/com/apple/osxui/Makefile index 0970061d1f7..286cbe0df68 100644 --- a/jdk/make/com/apple/osxui/Makefile +++ b/jdk/make/com/apple/osxui/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/oracle/jfr/Makefile b/jdk/make/com/oracle/jfr/Makefile index 5fd5e53039f..23332615f6f 100644 --- a/jdk/make/com/oracle/jfr/Makefile +++ b/jdk/make/com/oracle/jfr/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/oracle/security/ucrypto/Makefile b/jdk/make/com/oracle/security/ucrypto/Makefile index f6545e89828..f779bf47170 100644 --- a/jdk/make/com/oracle/security/ucrypto/Makefile +++ b/jdk/make/com/oracle/security/ucrypto/Makefile @@ -198,9 +198,9 @@ ifndef OPENJDK # # Build ucrypto.jar. # - $(UNSIGNED_DIR)/ucrypto.jar: build + $(UNSIGNED_DIR)/ucrypto.jar: build $(JCE_MANIFEST_FILE) $(prep-target) - $(BOOT_JAR_CMD) cf $@ $(JAR_DIRS) \ + $(BOOT_JAR_CMD) cmf $(JCE_MANIFEST_FILE) $@ $(JAR_DIRS) \ $(BOOT_JAR_JFLAGS) @$(java-vm-cleanup) diff --git a/jdk/make/com/sun/Makefile b/jdk/make/com/sun/Makefile index 7c436af52d1..8b9d9dbe25b 100644 --- a/jdk/make/com/sun/Makefile +++ b/jdk/make/com/sun/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/demo/jvmti/hprof/Makefile b/jdk/make/com/sun/demo/jvmti/hprof/Makefile index 7611541e7c4..c9006b06047 100644 --- a/jdk/make/com/sun/demo/jvmti/hprof/Makefile +++ b/jdk/make/com/sun/demo/jvmti/hprof/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/make/com/sun/java/browser/net/Makefile b/jdk/make/com/sun/java/browser/net/Makefile index b2f55fcc72e..6e281dd82d2 100644 --- a/jdk/make/com/sun/java/browser/net/Makefile +++ b/jdk/make/com/sun/java/browser/net/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/java/pack/Makefile b/jdk/make/com/sun/java/pack/Makefile index e8c256d3e9b..d51a142c778 100644 --- a/jdk/make/com/sun/java/pack/Makefile +++ b/jdk/make/com/sun/java/pack/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/net/ssl/Makefile b/jdk/make/com/sun/net/ssl/Makefile index b5c291ec2e6..47539d742e6 100644 --- a/jdk/make/com/sun/net/ssl/Makefile +++ b/jdk/make/com/sun/net/ssl/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/nio/Makefile b/jdk/make/com/sun/nio/Makefile index ebca563122c..6fccab2b8dd 100644 --- a/jdk/make/com/sun/nio/Makefile +++ b/jdk/make/com/sun/nio/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/nio/sctp/Exportedfiles.gmk b/jdk/make/com/sun/nio/sctp/Exportedfiles.gmk index f2f6970a827..f8ec6fb0960 100644 --- a/jdk/make/com/sun/nio/sctp/Exportedfiles.gmk +++ b/jdk/make/com/sun/nio/sctp/Exportedfiles.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/nio/sctp/FILES_java.gmk b/jdk/make/com/sun/nio/sctp/FILES_java.gmk index 667af33277b..aa59a78b0c7 100644 --- a/jdk/make/com/sun/nio/sctp/FILES_java.gmk +++ b/jdk/make/com/sun/nio/sctp/FILES_java.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/nio/sctp/Makefile b/jdk/make/com/sun/nio/sctp/Makefile index 158077b78d1..47fcfa8d5eb 100644 --- a/jdk/make/com/sun/nio/sctp/Makefile +++ b/jdk/make/com/sun/nio/sctp/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/nio/sctp/mapfile-vers b/jdk/make/com/sun/nio/sctp/mapfile-vers index ceb27dab972..4cd4c06e472 100644 --- a/jdk/make/com/sun/nio/sctp/mapfile-vers +++ b/jdk/make/com/sun/nio/sctp/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/security/auth/module/Makefile b/jdk/make/com/sun/security/auth/module/Makefile index e6957124b56..7a2343b4d6f 100644 --- a/jdk/make/com/sun/security/auth/module/Makefile +++ b/jdk/make/com/sun/security/auth/module/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/tools/Makefile b/jdk/make/com/sun/tools/Makefile index 8f824ef924a..85f2b288e9e 100644 --- a/jdk/make/com/sun/tools/Makefile +++ b/jdk/make/com/sun/tools/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/tools/attach/Exportedfiles.gmk b/jdk/make/com/sun/tools/attach/Exportedfiles.gmk index 8852c76e6b7..915786d4c9f 100644 --- a/jdk/make/com/sun/tools/attach/Exportedfiles.gmk +++ b/jdk/make/com/sun/tools/attach/Exportedfiles.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/tools/attach/FILES_c.gmk b/jdk/make/com/sun/tools/attach/FILES_c.gmk index 8a5baec0994..4684731eb3b 100644 --- a/jdk/make/com/sun/tools/attach/FILES_c.gmk +++ b/jdk/make/com/sun/tools/attach/FILES_c.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/tools/attach/FILES_java.gmk b/jdk/make/com/sun/tools/attach/FILES_java.gmk index 6e11f8c6224..ac18cc29946 100644 --- a/jdk/make/com/sun/tools/attach/FILES_java.gmk +++ b/jdk/make/com/sun/tools/attach/FILES_java.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/tools/attach/mapfile-bsd b/jdk/make/com/sun/tools/attach/mapfile-bsd index 86515d535a1..9d82d9ca456 100644 --- a/jdk/make/com/sun/tools/attach/mapfile-bsd +++ b/jdk/make/com/sun/tools/attach/mapfile-bsd @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/tracing/Makefile b/jdk/make/com/sun/tracing/Makefile index f9aa28c23d4..f00ab69b9cd 100644 --- a/jdk/make/com/sun/tracing/Makefile +++ b/jdk/make/com/sun/tracing/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/com/sun/tracing/dtrace/Makefile b/jdk/make/com/sun/tracing/dtrace/Makefile index 5abe7395a8a..1a036eba941 100644 --- a/jdk/make/com/sun/tracing/dtrace/Makefile +++ b/jdk/make/com/sun/tracing/dtrace/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/Demo.gmk b/jdk/make/common/Demo.gmk index 9163cf76513..90bcf9a5be7 100644 --- a/jdk/make/common/Demo.gmk +++ b/jdk/make/common/Demo.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/Mapfile-vers.gmk b/jdk/make/common/Mapfile-vers.gmk index 15c8ccd519a..67ac0cd61b7 100644 --- a/jdk/make/common/Mapfile-vers.gmk +++ b/jdk/make/common/Mapfile-vers.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1998, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/Release-macosx.gmk b/jdk/make/common/Release-macosx.gmk index f56370f3ca1..be29f78944e 100644 --- a/jdk/make/common/Release-macosx.gmk +++ b/jdk/make/common/Release-macosx.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/Release.gmk b/jdk/make/common/Release.gmk index 2f2b1693384..15aa7c96c6c 100644 --- a/jdk/make/common/Release.gmk +++ b/jdk/make/common/Release.gmk @@ -348,15 +348,15 @@ TOOLS = \ sun/tools/serialver \ sun/tools/tree \ sun/tools/util \ - sun/security/tools/JarBASE64Encoder.class \ - sun/security/tools/JarSigner.class \ - sun/security/tools/JarSignerParameters.class \ - sun/security/tools/JarSignerResources.class \ - sun/security/tools/JarSignerResources_ja.class \ - sun/security/tools/JarSignerResources_zh_CN.class \ - sun/security/tools/SignatureFile\$$Block.class \ - sun/security/tools/SignatureFile.class \ - sun/security/tools/TimestampedSigner.class \ + sun/security/tools/jarsigner/JarBASE64Encoder.class \ + sun/security/tools/jarsigner/Main.class \ + sun/security/tools/jarsigner/JarSignerParameters.class \ + sun/security/tools/jarsigner/Resources.class \ + sun/security/tools/jarsigner/Resources_ja.class \ + sun/security/tools/jarsigner/Resources_zh_CN.class \ + sun/security/tools/jarsigner/SignatureFile\$$Block.class \ + sun/security/tools/jarsigner/SignatureFile.class \ + sun/security/tools/jarsigner/TimestampedSigner.class \ sun/rmi/rmic \ sun/applet \ sun/jvmstat \ @@ -572,15 +572,15 @@ $(NOT_RT_JAR_LIST): FRC $(ECHO) "sun/tools/serialver/" >> $@ $(ECHO) "sun/tools/tree/" >> $@ $(ECHO) "sun/tools/util/" >> $@ - $(ECHO) "sun/security/tools/JarBASE64Encoder.class" >> $@ - $(ECHO) "sun/security/tools/JarSigner.class" >> $@ - $(ECHO) "sun/security/tools/JarSignerParameters.class" >> $@ - $(ECHO) "sun/security/tools/JarSignerResources.class" >> $@ - $(ECHO) "sun/security/tools/JarSignerResources_ja.class" >> $@ - $(ECHO) "sun/security/tools/JarSignerResources_zh_CN.class" >> $@ - $(ECHO) "sun/security/tools/SignatureFile\$$Block.class" >> $@ - $(ECHO) "sun/security/tools/SignatureFile.class" >> $@ - $(ECHO) "sun/security/tools/TimestampedSigner.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/JarBASE64Encoder.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/Main.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/JarSignerParameters.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/Resources.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/Resources_ja.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/Resources_zh_CN.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/SignatureFile\$$Block.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/SignatureFile.class" >> $@ + $(ECHO) "sun/security/tools/jarsigner/TimestampedSigner.class" >> $@ $(ECHO) "sun/security/provider/Sun.class" >> $@ $(ECHO) "sun/security/rsa/SunRsaSign.class" >> $@ $(ECHO) "sun/security/ssl/" >> $@ diff --git a/jdk/make/common/Rules.gmk b/jdk/make/common/Rules.gmk index 6da2f505062..4136a5dff3c 100644 --- a/jdk/make/common/Rules.gmk +++ b/jdk/make/common/Rules.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/Sanity.gmk b/jdk/make/common/Sanity.gmk index 27fe5bdfa16..25f5fa7bfe8 100644 --- a/jdk/make/common/Sanity.gmk +++ b/jdk/make/common/Sanity.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -64,7 +64,6 @@ sanity-base: pre-sanity \ sane-math_iso \ sane-libCrun \ sane-unixccs_path \ - sane-odbcdir \ sane-msdevtools_path \ sane-dxsdk \ sane-compiler \ diff --git a/jdk/make/common/internal/Defs-jaxws.gmk b/jdk/make/common/internal/Defs-jaxws.gmk index f0ba12b292a..8424551876b 100644 --- a/jdk/make/common/internal/Defs-jaxws.gmk +++ b/jdk/make/common/internal/Defs-jaxws.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,10 @@ IMPORT_RT_PACKAGES += \ javax/xml/ws \ javax/jws \ javax/annotation \ + com/sun/org/glassfish \ + com/sun/istack/internal \ + com/sun/istack/internal/localization \ + com/sun/istack/internal/logging \ com/sun/xml/internal/bind \ com/sun/xml/internal/fastinfoset \ com/sun/xml/internal/messaging \ diff --git a/jdk/make/common/internal/NativeCompileRules.gmk b/jdk/make/common/internal/NativeCompileRules.gmk index 5379ef3c289..e6569da5c6a 100644 --- a/jdk/make/common/internal/NativeCompileRules.gmk +++ b/jdk/make/common/internal/NativeCompileRules.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/internal/Resources.gmk b/jdk/make/common/internal/Resources.gmk index fccfe273c63..bae72bce8a1 100644 --- a/jdk/make/common/internal/Resources.gmk +++ b/jdk/make/common/internal/Resources.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Compiler-gcc.gmk b/jdk/make/common/shared/Compiler-gcc.gmk index 9dde0bae387..023faf6cf2c 100644 --- a/jdk/make/common/shared/Compiler-gcc.gmk +++ b/jdk/make/common/shared/Compiler-gcc.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Compiler-llvm.gmk b/jdk/make/common/shared/Compiler-llvm.gmk index 0b26a08cd24..606a061b5f8 100644 --- a/jdk/make/common/shared/Compiler-llvm.gmk +++ b/jdk/make/common/shared/Compiler-llvm.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Compiler-sun.gmk b/jdk/make/common/shared/Compiler-sun.gmk index fc0e9df6e3a..c9181dccdf4 100644 --- a/jdk/make/common/shared/Compiler-sun.gmk +++ b/jdk/make/common/shared/Compiler-sun.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs-linux.gmk b/jdk/make/common/shared/Defs-linux.gmk index 32388050d42..722ff0c7b40 100644 --- a/jdk/make/common/shared/Defs-linux.gmk +++ b/jdk/make/common/shared/Defs-linux.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs-macosx.gmk b/jdk/make/common/shared/Defs-macosx.gmk index 1bd9b92b5f1..e858344fdd0 100644 --- a/jdk/make/common/shared/Defs-macosx.gmk +++ b/jdk/make/common/shared/Defs-macosx.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs-solaris.gmk b/jdk/make/common/shared/Defs-solaris.gmk index ec1dd148f13..4bbc5b77a8c 100644 --- a/jdk/make/common/shared/Defs-solaris.gmk +++ b/jdk/make/common/shared/Defs-solaris.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -206,13 +206,12 @@ MAPFILE_WARNING=$(MAPFILE_WARNING-$(VARIANT)) # libjdgaSUNWffb.so # libjdgaSUNWm64.so # libxinerama.so -# The library libJdbcOdbc.so has also been given an exception. # The JNI/JVMTI demo libraries are also missing mapfiles, no exceptions yet. ifeq ($(ARCH_FAMILY),sparc) MAPFILE_EXCEPTIONS = \ - (libJdbcOdbc|libjdgaSUNWafb|libjdgaSUNWcg6|libjdgaSUNWffb|libjdgaSUNWm64|libxinerama) + (libjdgaSUNWafb|libjdgaSUNWcg6|libjdgaSUNWffb|libjdgaSUNWm64|libxinerama) else - MAPFILE_EXCEPTIONS = (libJdbcOdbc) + MAPFILE_EXCEPTIONS = () endif # Macro to check it's input file for banned dependencies and verify the diff --git a/jdk/make/common/shared/Defs-utils.gmk b/jdk/make/common/shared/Defs-utils.gmk index 573f7ccaa80..2d3104ddcbb 100644 --- a/jdk/make/common/shared/Defs-utils.gmk +++ b/jdk/make/common/shared/Defs-utils.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs-versions.gmk b/jdk/make/common/shared/Defs-versions.gmk index fba70370ba2..8a60563c122 100644 --- a/jdk/make/common/shared/Defs-versions.gmk +++ b/jdk/make/common/shared/Defs-versions.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs-windows.gmk b/jdk/make/common/shared/Defs-windows.gmk index c4ccdbca4ea..36424056f23 100644 --- a/jdk/make/common/shared/Defs-windows.gmk +++ b/jdk/make/common/shared/Defs-windows.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Defs.gmk b/jdk/make/common/shared/Defs.gmk index f88b41c6bb5..37bd371aaaa 100644 --- a/jdk/make/common/shared/Defs.gmk +++ b/jdk/make/common/shared/Defs.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Sanity-Settings.gmk b/jdk/make/common/shared/Sanity-Settings.gmk index b6b0fdcf19d..ea32eeadcaa 100644 --- a/jdk/make/common/shared/Sanity-Settings.gmk +++ b/jdk/make/common/shared/Sanity-Settings.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/common/shared/Sanity.gmk b/jdk/make/common/shared/Sanity.gmk index 845418bcecc..c73a3b755d6 100644 --- a/jdk/make/common/shared/Sanity.gmk +++ b/jdk/make/common/shared/Sanity.gmk @@ -208,7 +208,6 @@ include $(JDK_MAKE_SHARED_DIR)/Sanity-Settings.gmk sane-docs_import \ sane-math_iso \ sane-libCrun \ - sane-odbcdir \ sane-msdevtools_path \ sane-hotspot_binaries \ sane-hotspot_import \ diff --git a/jdk/make/docs/CORE_PKGS.gmk b/jdk/make/docs/CORE_PKGS.gmk index e292869f951..cdef9ebbc97 100644 --- a/jdk/make/docs/CORE_PKGS.gmk +++ b/jdk/make/docs/CORE_PKGS.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/Makefile b/jdk/make/java/Makefile index 664861aeceb..67f735fcb1d 100644 --- a/jdk/make/java/Makefile +++ b/jdk/make/java/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/awt/Makefile b/jdk/make/java/awt/Makefile index 2bc9e76a943..20b5774ea3a 100644 --- a/jdk/make/java/awt/Makefile +++ b/jdk/make/java/awt/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/fdlibm/FILES_c.gmk b/jdk/make/java/fdlibm/FILES_c.gmk index cc7a1ad06d1..667242433a8 100644 --- a/jdk/make/java/fdlibm/FILES_c.gmk +++ b/jdk/make/java/fdlibm/FILES_c.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/java/Exportedfiles.gmk b/jdk/make/java/java/Exportedfiles.gmk index 3a7c8b3ff10..f6d3c3ae1de 100644 --- a/jdk/make/java/java/Exportedfiles.gmk +++ b/jdk/make/java/java/Exportedfiles.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -66,6 +66,7 @@ FILES_export = \ java/util/prefs/FileSystemPreferences.java \ java/io/Console.java \ java/io/FileDescriptor.java \ + java/io/DefaultFileSystem.java \ java/io/InputStream.java \ java/io/FileInputStream.java \ java/io/FileOutputStream.java \ @@ -142,6 +143,7 @@ FILES_export = \ java/io/Console.java \ java/io/FileSystem.java \ java/io/FileDescriptor.java \ + java/io/DefaultFileSystem.java \ java/io/InputStream.java \ java/io/FileInputStream.java \ java/io/FileOutputStream.java \ diff --git a/jdk/make/java/java/FILES_c.gmk b/jdk/make/java/java/FILES_c.gmk index be698cd70b0..aa48464771b 100644 --- a/jdk/make/java/java/FILES_c.gmk +++ b/jdk/make/java/java/FILES_c.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,6 @@ FILES_c = \ Compiler.c \ Console_md.c \ Double.c \ - FileSystem_md.c \ FileDescriptor_md.c \ FileInputStream.c \ FileInputStream_md.c \ diff --git a/jdk/make/java/java/FILES_java.gmk b/jdk/make/java/java/FILES_java.gmk index efbf73b744d..246acf3e3aa 100644 --- a/jdk/make/java/java/FILES_java.gmk +++ b/jdk/make/java/java/FILES_java.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -438,6 +438,7 @@ JAVA_JAVA_java = \ java/io/File.java \ java/io/FileSystem.java \ java/io/FileDescriptor.java \ + java/io/DefaultFileSystem.java \ java/io/FilenameFilter.java \ java/io/FileFilter.java \ java/io/FilePermission.java \ diff --git a/jdk/make/java/java/Makefile b/jdk/make/java/java/Makefile index 6693a8224b7..b2d1c5ab091 100644 --- a/jdk/make/java/java/Makefile +++ b/jdk/make/java/java/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -64,13 +64,11 @@ include FILES_java.gmk include Exportedfiles.gmk ifeq ($(PLATFORM),windows) -FILES_java += java/io/Win32FileSystem.java \ - java/io/WinNTFileSystem.java \ +FILES_java += java/io/WinNTFileSystem.java \ java/util/prefs/WindowsPreferences.java \ java/util/prefs/WindowsPreferencesFactory.java FILES_c += ProcessImpl_md.c \ - Win32FileSystem_md.c \ WinNTFileSystem_md.c \ canonicalize_md.c \ dirent_md.c \ diff --git a/jdk/make/java/java/genlocales.gmk b/jdk/make/java/java/genlocales.gmk index d08fa1abe13..6d35b8e734d 100644 --- a/jdk/make/java/java/genlocales.gmk +++ b/jdk/make/java/java/genlocales.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -38,31 +38,31 @@ FILES_compiled_properties_orig := $(FILES_compiled_properties) # only FILES_java and FILES_compiled_properties variables will be picked up # # $(BUILDDIR)/java/util/FILES_java.gmk & $(BUILDDIR)/java/util/FILES_properties.gmk -# contain "sun.util.resources" for European language support +# contain "sun.util.resources" for US language support include $(BUILDDIR)/java/util/FILES_java.gmk include $(BUILDDIR)/java/util/FILES_properties.gmk -Euro_Resources_java := $(FILES_java) -Euro_Resources_properties := $(FILES_compiled_properties) +US_Resources_java := $(FILES_java) +US_Resources_properties := $(FILES_compiled_properties) # $(BUILDDIR)/java/text/FILES_java.gmk contains the "sun.text.resources" for -# European language support +# US language support include $(BUILDDIR)/java/text/base/FILES_java.gmk -Euro_Resources_java += $(FILES_java) +US_Resources_java += $(FILES_java) FILES_compiled_properties= # $(BUILDDIR)/sun/text/FILES_java.gmk & $(BUILDDIR)/sun/text/FILES_properties.gmk -# contain both resources for Non-European language support +# contain both resources for Non-US language support include $(BUILDDIR)/sun/text/FILES_java.gmk include $(BUILDDIR)/sun/text/FILES_properties.gmk -NonEuro_Resources_java := $(FILES_java) -NonEuro_Resources_properties := $(FILES_compiled_properties) +NonUS_Resources_java := $(FILES_java) +NonUS_Resources_properties := $(FILES_compiled_properties) # Restore the orignal FILES_java & FILES_compiled_properties variables FILES_java := $(FILES_java_orig) @@ -80,30 +80,30 @@ RESOURCE_NAMES="FormatData CollationData TimeZoneNames LocaleNames CurrencyNames ifeq ($(PLATFORM), macosx) $(LocaleDataMetaInfo_Dest):$(LocaleDataMetaInfo_Src) $(LOCALEGEN_SH) - @$(RM) $@.tmp.euro $@.tmp.noneuro; + @$(RM) $@.tmp.us $@.tmp.nonus; @$(prep-target) - @$(ECHO) $(Euro_Resources_properties) | $(NAWK) 'gsub(/.properties/,"\n") {print}' > $@.tmp.euro; - @$(ECHO) $(Euro_Resources_java) | $(NAWK) 'gsub(/.java/,"\n") {print}' >> $@.tmp.euro; - @$(ECHO) $(NonEuro_Resources_properties) | $(NAWK) 'gsub(/.properties/,"\n") {print}' > $@.tmp.noneuro; - @$(ECHO) $(NonEuro_Resources_java) | $(NAWK) 'gsub(/.java/,"\n") {print}' >> $@.tmp.noneuro; + @$(ECHO) $(US_Resources_properties) | $(NAWK) 'gsub(/.properties/,"\n") {print}' > $@.tmp.us; + @$(ECHO) $(US_Resources_java) | $(NAWK) 'gsub(/.java/,"\n") {print}' >> $@.tmp.us; + @$(ECHO) $(NonUS_Resources_properties) | $(NAWK) 'gsub(/.properties/,"\n") {print}' > $@.tmp.nonus; + @$(ECHO) $(NonUS_Resources_java) | $(NAWK) 'gsub(/.java/,"\n") {print}' >> $@.tmp.nonus; NAWK="$(NAWK)" SED="$(SED)" SORT="$(SORT)" \ - $(SH) $(LOCALEGEN_SH) $(RESOURCE_NAMES) $@.tmp.euro \ - $@.tmp.noneuro $< $@ - @$(RM) $@.tmp.euro $@.tmp.noneuro; + $(SH) $(LOCALEGEN_SH) $(RESOURCE_NAMES) $@.tmp.us \ + $@.tmp.nonus $< $@ + @$(RM) $@.tmp.us $@.tmp.nonus; else $(LocaleDataMetaInfo_Dest):$(LocaleDataMetaInfo_Src) $(LOCALEGEN_SH) - @$(RM) $@.tmp.euro $@.tmp.noneuro; + @$(RM) $@.tmp.us $@.tmp.nonus; @$(prep-target) - @$(ECHO) $(subst .properties,'\n',$(Euro_Resources_properties)) > $@.tmp.euro; - @$(ECHO) $(subst .java,'\n',$(Euro_Resources_java)) >> $@.tmp.euro; - @$(ECHO) $(subst .properties,'\n',$(NonEuro_Resources_properties)) > $@.tmp.noneuro; - @$(ECHO) $(subst .java,'\n',$(NonEuro_Resources_java)) >> $@.tmp.noneuro; + @$(ECHO) $(subst .properties,'\n',$(US_Resources_properties)) > $@.tmp.us; + @$(ECHO) $(subst .java,'\n',$(US_Resources_java)) >> $@.tmp.us; + @$(ECHO) $(subst .properties,'\n',$(NonUS_Resources_properties)) > $@.tmp.nonus; + @$(ECHO) $(subst .java,'\n',$(NonUS_Resources_java)) >> $@.tmp.nonus; NAWK="$(NAWK)" SED="$(SED)" SORT="$(SORT)" \ - $(SH) $(LOCALEGEN_SH) $(RESOURCE_NAMES) $@.tmp.euro \ - $@.tmp.noneuro $< $@ - @$(RM) $@.tmp.euro $@.tmp.noneuro; + $(SH) $(LOCALEGEN_SH) $(RESOURCE_NAMES) $@.tmp.us \ + $@.tmp.nonus $< $@ + @$(RM) $@.tmp.us $@.tmp.nonus; endif genlocales : $(LocaleDataMetaInfo_Dest) diff --git a/jdk/make/java/java/localegen.sh b/jdk/make/java/java/localegen.sh index 8a0c96e1c79..8fad25ef534 100644 --- a/jdk/make/java/java/localegen.sh +++ b/jdk/make/java/java/localegen.sh @@ -35,11 +35,11 @@ # A list of resource base name list; RESOURCE_NAMES=$1 -# A list of European resources; -EURO_FILES_LIST=$2 +# A list of US resources; +US_FILES_LIST=$2 -# A list of non-European resources; -NONEURO_FILES_LIST=$3 +# A list of non-US resources; +NONUS_FILES_LIST=$3 INPUT_FILE=$4 OUTPUT_FILE=$5 @@ -53,23 +53,23 @@ getlocalelist() { sed_script="$SED -e \"s@^#warn .*@// -- This file was mechanically generated: Do not edit! -- //@\" " # ja-JP-JP and th-TH-TH need to be manually added, as they don't have any resource files. -noneuroall=" ja-JP-JP th-TH-TH " +nonusall=" ja-JP-JP th-TH-TH " for FILE in $RESOURCE_NAMES do - getlocalelist $FILE $EURO_FILES_LIST - sed_script=$sed_script"-e \"s@#"$FILE"_EuroLocales#@$localelist@g\" " - euroall=$euroall" "$localelist - getlocalelist $FILE $NONEURO_FILES_LIST - sed_script=$sed_script"-e \"s@#"$FILE"_NonEuroLocales#@$localelist@g\" " - noneuroall=$noneuroall" "$localelist + getlocalelist $FILE $US_FILES_LIST + sed_script=$sed_script"-e \"s@#"$FILE"_USLocales#@$localelist@g\" " + usall=$usall" "$localelist + getlocalelist $FILE $NONUS_FILES_LIST + sed_script=$sed_script"-e \"s@#"$FILE"_NonUSLocales#@$localelist@g\" " + nonusall=$nonusall" "$localelist done -euroall=`(for LOC in $euroall; do echo $LOC;done) |$SORT -u` -noneuroall=`(for LOC in $noneuroall; do echo $LOC;done) |$SORT -u` +usall=`(for LOC in $usall; do echo $LOC;done) |$SORT -u` +nonusall=`(for LOC in $nonusall; do echo $LOC;done) |$SORT -u` -sed_script=$sed_script"-e \"s@#AvailableLocales_EuroLocales#@$euroall@g\" " -sed_script=$sed_script"-e \"s@#AvailableLocales_NonEuroLocales#@$noneuroall@g\" " +sed_script=$sed_script"-e \"s@#AvailableLocales_USLocales#@$usall@g\" " +sed_script=$sed_script"-e \"s@#AvailableLocales_NonUSLocales#@$nonusall@g\" " sed_script=$sed_script"$INPUT_FILE > $OUTPUT_FILE" eval $sed_script diff --git a/jdk/make/java/java/mapfile-vers b/jdk/make/java/java/mapfile-vers index 42ec3ca7277..97938361c99 100644 --- a/jdk/make/java/java/mapfile-vers +++ b/jdk/make/java/java/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -87,7 +87,6 @@ SUNWprivate_1.1 { Java_java_io_FileOutputStream_open; Java_java_io_FileOutputStream_write; Java_java_io_FileOutputStream_writeBytes; - Java_java_io_FileSystem_getFileSystem; Java_java_io_ObjectInputStream_bytesToDoubles; Java_java_io_ObjectInputStream_bytesToFloats; Java_java_io_ObjectOutputStream_doublesToBytes; diff --git a/jdk/make/java/java/reflect/Makefile b/jdk/make/java/java/reflect/Makefile index 6dfceb8bd5e..0412a0e70ff 100644 --- a/jdk/make/java/java/reflect/Makefile +++ b/jdk/make/java/java/reflect/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/jobjc/Makefile b/jdk/make/java/jobjc/Makefile index c4aee8d7255..808e5b976ef 100644 --- a/jdk/make/java/jobjc/Makefile +++ b/jdk/make/java/jobjc/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/jvm/Makefile b/jdk/make/java/jvm/Makefile index 060724221ba..b35c3d9bc29 100644 --- a/jdk/make/java/jvm/Makefile +++ b/jdk/make/java/jvm/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/management/mapfile-vers b/jdk/make/java/management/mapfile-vers index 21b92d45f9e..2e87b707463 100644 --- a/jdk/make/java/management/mapfile-vers +++ b/jdk/make/java/management/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/net/FILES_c.gmk b/jdk/make/java/net/FILES_c.gmk index a4bbb409328..93b7562e1e9 100644 --- a/jdk/make/java/net/FILES_c.gmk +++ b/jdk/make/java/net/FILES_c.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/net/Makefile b/jdk/make/java/net/Makefile index ba15900fc3f..60f83869f74 100644 --- a/jdk/make/java/net/Makefile +++ b/jdk/make/java/net/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1995, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/nio/FILES_java.gmk b/jdk/make/java/nio/FILES_java.gmk index f3b277f050a..1725842061b 100644 --- a/jdk/make/java/nio/FILES_java.gmk +++ b/jdk/make/java/nio/FILES_java.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/nio/Makefile b/jdk/make/java/nio/Makefile index f288e1ec9c0..94a50dc4bcb 100644 --- a/jdk/make/java/nio/Makefile +++ b/jdk/make/java/nio/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/nio/mapfile-bsd b/jdk/make/java/nio/mapfile-bsd index 45b23ab8652..4093a002329 100644 --- a/jdk/make/java/nio/mapfile-bsd +++ b/jdk/make/java/nio/mapfile-bsd @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/nio/mapfile-linux b/jdk/make/java/nio/mapfile-linux index 37999cb7e3b..d78a74400b3 100644 --- a/jdk/make/java/nio/mapfile-linux +++ b/jdk/make/java/nio/mapfile-linux @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/nio/mapfile-solaris b/jdk/make/java/nio/mapfile-solaris index beb13e25d6f..98deb510dcb 100644 --- a/jdk/make/java/nio/mapfile-solaris +++ b/jdk/make/java/nio/mapfile-solaris @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/rmi/Makefile b/jdk/make/java/rmi/Makefile index 1520a63c05e..0e496da7bdd 100644 --- a/jdk/make/java/rmi/Makefile +++ b/jdk/make/java/rmi/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/security/Makefile b/jdk/make/java/security/Makefile index e52fcaa6b16..d68d0a03510 100644 --- a/jdk/make/java/security/Makefile +++ b/jdk/make/java/security/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/sun_nio/FILES_java.gmk b/jdk/make/java/sun_nio/FILES_java.gmk index d07474d4348..395ab2557e5 100644 --- a/jdk/make/java/sun_nio/FILES_java.gmk +++ b/jdk/make/java/sun_nio/FILES_java.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/text/base/FILES_java.gmk b/jdk/make/java/text/base/FILES_java.gmk index c6bf5ffcc6c..dc1d9df0b45 100644 --- a/jdk/make/java/text/base/FILES_java.gmk +++ b/jdk/make/java/text/base/FILES_java.gmk @@ -103,150 +103,7 @@ FILES_java = \ sun/text/resources/BreakIteratorInfo.java \ \ sun/text/resources/CollationData.java \ - sun/text/resources/be/CollationData_be.java \ - sun/text/resources/bg/CollationData_bg.java \ - sun/text/resources/ca/CollationData_ca.java \ - sun/text/resources/cs/CollationData_cs.java \ - sun/text/resources/da/CollationData_da.java \ - sun/text/resources/el/CollationData_el.java \ - sun/text/resources/es/CollationData_es.java \ - sun/text/resources/et/CollationData_et.java \ - sun/text/resources/fi/CollationData_fi.java \ - sun/text/resources/fr/CollationData_fr.java \ - sun/text/resources/hr/CollationData_hr.java \ - sun/text/resources/hu/CollationData_hu.java \ - sun/text/resources/is/CollationData_is.java \ - sun/text/resources/lt/CollationData_lt.java \ - sun/text/resources/lv/CollationData_lv.java \ - sun/text/resources/mk/CollationData_mk.java \ - sun/text/resources/no/CollationData_no.java \ - sun/text/resources/pl/CollationData_pl.java \ - sun/text/resources/ro/CollationData_ro.java \ - sun/text/resources/ru/CollationData_ru.java \ - sun/text/resources/sk/CollationData_sk.java \ - sun/text/resources/sl/CollationData_sl.java \ - sun/text/resources/sq/CollationData_sq.java \ - sun/text/resources/sr/CollationData_sr.java \ - sun/text/resources/sr/CollationData_sr_Latn.java \ - sun/text/resources/sv/CollationData_sv.java \ - sun/text/resources/tr/CollationData_tr.java \ - sun/text/resources/uk/CollationData_uk.java \ \ sun/text/resources/FormatData.java \ - sun/text/resources/be/FormatData_be.java \ - sun/text/resources/be/FormatData_be_BY.java \ - sun/text/resources/bg/FormatData_bg.java \ - sun/text/resources/bg/FormatData_bg_BG.java \ - sun/text/resources/ca/FormatData_ca.java \ - sun/text/resources/ca/FormatData_ca_ES.java \ - sun/text/resources/cs/FormatData_cs.java \ - sun/text/resources/cs/FormatData_cs_CZ.java \ - sun/text/resources/da/FormatData_da.java \ - sun/text/resources/da/FormatData_da_DK.java \ - sun/text/resources/de/FormatData_de.java \ - sun/text/resources/de/FormatData_de_AT.java \ - sun/text/resources/de/FormatData_de_CH.java \ - sun/text/resources/de/FormatData_de_DE.java \ - sun/text/resources/de/FormatData_de_LU.java \ - sun/text/resources/el/FormatData_el.java \ - sun/text/resources/el/FormatData_el_CY.java \ - sun/text/resources/el/FormatData_el_GR.java \ sun/text/resources/en/FormatData_en.java \ - sun/text/resources/en/FormatData_en_US.java \ - sun/text/resources/en/FormatData_en_AU.java \ - sun/text/resources/en/FormatData_en_CA.java \ - sun/text/resources/en/FormatData_en_GB.java \ - sun/text/resources/en/FormatData_en_IE.java \ - sun/text/resources/en/FormatData_en_IN.java \ - sun/text/resources/en/FormatData_en_MT.java \ - sun/text/resources/en/FormatData_en_NZ.java \ - sun/text/resources/en/FormatData_en_PH.java \ - sun/text/resources/en/FormatData_en_SG.java \ - sun/text/resources/en/FormatData_en_ZA.java \ - sun/text/resources/es/FormatData_es.java \ - sun/text/resources/es/FormatData_es_BO.java \ - sun/text/resources/es/FormatData_es_AR.java \ - sun/text/resources/es/FormatData_es_CL.java \ - sun/text/resources/es/FormatData_es_CO.java \ - sun/text/resources/es/FormatData_es_CR.java \ - sun/text/resources/es/FormatData_es_DO.java \ - sun/text/resources/es/FormatData_es_EC.java \ - sun/text/resources/es/FormatData_es_ES.java \ - sun/text/resources/es/FormatData_es_GT.java \ - sun/text/resources/es/FormatData_es_HN.java \ - sun/text/resources/es/FormatData_es_MX.java \ - sun/text/resources/es/FormatData_es_NI.java \ - sun/text/resources/es/FormatData_es_PA.java \ - sun/text/resources/es/FormatData_es_PE.java \ - sun/text/resources/es/FormatData_es_PR.java \ - sun/text/resources/es/FormatData_es_PY.java \ - sun/text/resources/es/FormatData_es_SV.java \ - sun/text/resources/es/FormatData_es_US.java \ - sun/text/resources/es/FormatData_es_UY.java \ - sun/text/resources/es/FormatData_es_VE.java \ - sun/text/resources/et/FormatData_et.java \ - sun/text/resources/et/FormatData_et_EE.java \ - sun/text/resources/fi/FormatData_fi.java \ - sun/text/resources/fi/FormatData_fi_FI.java \ - sun/text/resources/fr/FormatData_fr.java \ - sun/text/resources/fr/FormatData_fr_BE.java \ - sun/text/resources/fr/FormatData_fr_CA.java \ - sun/text/resources/fr/FormatData_fr_CH.java \ - sun/text/resources/fr/FormatData_fr_FR.java \ - sun/text/resources/ga/FormatData_ga.java \ - sun/text/resources/ga/FormatData_ga_IE.java \ - sun/text/resources/hr/FormatData_hr.java \ - sun/text/resources/hr/FormatData_hr_HR.java \ - sun/text/resources/hu/FormatData_hu.java \ - sun/text/resources/hu/FormatData_hu_HU.java \ - sun/text/resources/in/FormatData_in.java \ - sun/text/resources/in/FormatData_in_ID.java \ - sun/text/resources/is/FormatData_is.java \ - sun/text/resources/is/FormatData_is_IS.java \ - sun/text/resources/it/FormatData_it.java \ - sun/text/resources/it/FormatData_it_CH.java \ - sun/text/resources/it/FormatData_it_IT.java \ - sun/text/resources/lt/FormatData_lt.java \ - sun/text/resources/lt/FormatData_lt_LT.java \ - sun/text/resources/lv/FormatData_lv.java \ - sun/text/resources/lv/FormatData_lv_LV.java \ - sun/text/resources/mk/FormatData_mk.java \ - sun/text/resources/mk/FormatData_mk_MK.java \ - sun/text/resources/ms/FormatData_ms.java \ - sun/text/resources/ms/FormatData_ms_MY.java \ - sun/text/resources/mt/FormatData_mt.java \ - sun/text/resources/mt/FormatData_mt_MT.java \ - sun/text/resources/nl/FormatData_nl.java \ - sun/text/resources/nl/FormatData_nl_BE.java \ - sun/text/resources/nl/FormatData_nl_NL.java \ - sun/text/resources/no/FormatData_no.java \ - sun/text/resources/no/FormatData_no_NO.java \ - sun/text/resources/no/FormatData_no_NO_NY.java \ - sun/text/resources/pl/FormatData_pl.java \ - sun/text/resources/pl/FormatData_pl_PL.java \ - sun/text/resources/pt/FormatData_pt.java \ - sun/text/resources/pt/FormatData_pt_BR.java \ - sun/text/resources/pt/FormatData_pt_PT.java \ - sun/text/resources/ro/FormatData_ro.java \ - sun/text/resources/ro/FormatData_ro_RO.java \ - sun/text/resources/ru/FormatData_ru.java \ - sun/text/resources/ru/FormatData_ru_RU.java \ - sun/text/resources/sk/FormatData_sk.java \ - sun/text/resources/sk/FormatData_sk_SK.java \ - sun/text/resources/sl/FormatData_sl.java \ - sun/text/resources/sl/FormatData_sl_SI.java \ - sun/text/resources/sq/FormatData_sq.java \ - sun/text/resources/sq/FormatData_sq_AL.java \ - sun/text/resources/sr/FormatData_sr.java \ - sun/text/resources/sr/FormatData_sr_BA.java \ - sun/text/resources/sr/FormatData_sr_CS.java \ - sun/text/resources/sr/FormatData_sr_ME.java \ - sun/text/resources/sr/FormatData_sr_RS.java \ - sun/text/resources/sr/FormatData_sr_Latn.java \ - sun/text/resources/sr/FormatData_sr_Latn_ME.java \ - sun/text/resources/sv/FormatData_sv.java \ - sun/text/resources/sv/FormatData_sv_SE.java \ - sun/text/resources/tr/FormatData_tr.java \ - sun/text/resources/tr/FormatData_tr_TR.java \ - sun/text/resources/uk/FormatData_uk.java \ - sun/text/resources/uk/FormatData_uk_UA.java + sun/text/resources/en/FormatData_en_US.java diff --git a/jdk/make/java/text/bidi/Makefile b/jdk/make/java/text/bidi/Makefile index cc3dfd59d02..d5775a5d86f 100644 --- a/jdk/make/java/text/bidi/Makefile +++ b/jdk/make/java/text/bidi/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/util/FILES_java.gmk b/jdk/make/java/util/FILES_java.gmk index e392a626c05..9b0209a80db 100644 --- a/jdk/make/java/util/FILES_java.gmk +++ b/jdk/make/java/util/FILES_java.gmk @@ -29,13 +29,4 @@ FILES_java = \ sun/util/resources/LocaleNamesBundle.java \ sun/util/resources/TimeZoneNamesBundle.java \ sun/util/resources/TimeZoneNames.java \ - sun/util/resources/de/TimeZoneNames_de.java \ - sun/util/resources/en/TimeZoneNames_en.java \ - sun/util/resources/en/TimeZoneNames_en_CA.java \ - sun/util/resources/en/TimeZoneNames_en_GB.java \ - sun/util/resources/en/TimeZoneNames_en_IE.java \ - sun/util/resources/es/TimeZoneNames_es.java \ - sun/util/resources/fr/TimeZoneNames_fr.java \ - sun/util/resources/it/TimeZoneNames_it.java \ - sun/util/resources/pt/TimeZoneNames_pt_BR.java \ - sun/util/resources/sv/TimeZoneNames_sv.java + sun/util/resources/en/TimeZoneNames_en.java diff --git a/jdk/make/java/util/FILES_properties.gmk b/jdk/make/java/util/FILES_properties.gmk index 2bd81043642..4b777c5f2d8 100644 --- a/jdk/make/java/util/FILES_properties.gmk +++ b/jdk/make/java/util/FILES_properties.gmk @@ -25,189 +25,10 @@ FILES_compiled_properties = \ sun/util/resources/LocaleNames.properties \ - sun/util/resources/be/LocaleNames_be.properties \ - sun/util/resources/bg/LocaleNames_bg.properties \ - sun/util/resources/ca/LocaleNames_ca.properties \ - sun/util/resources/cs/LocaleNames_cs.properties \ - sun/util/resources/da/LocaleNames_da.properties \ - sun/util/resources/de/LocaleNames_de.properties \ - sun/util/resources/el/LocaleNames_el.properties \ - sun/util/resources/el/LocaleNames_el_CY.properties \ sun/util/resources/en/LocaleNames_en.properties \ - sun/util/resources/en/LocaleNames_en_MT.properties \ - sun/util/resources/en/LocaleNames_en_PH.properties \ - sun/util/resources/en/LocaleNames_en_SG.properties \ - sun/util/resources/es/LocaleNames_es.properties \ - sun/util/resources/es/LocaleNames_es_US.properties \ - sun/util/resources/et/LocaleNames_et.properties \ - sun/util/resources/fi/LocaleNames_fi.properties \ - sun/util/resources/fr/LocaleNames_fr.properties \ - sun/util/resources/ga/LocaleNames_ga.properties \ - sun/util/resources/hr/LocaleNames_hr.properties \ - sun/util/resources/hu/LocaleNames_hu.properties \ - sun/util/resources/in/LocaleNames_in.properties \ - sun/util/resources/is/LocaleNames_is.properties \ - sun/util/resources/it/LocaleNames_it.properties \ - sun/util/resources/lt/LocaleNames_lt.properties \ - sun/util/resources/lv/LocaleNames_lv.properties \ - sun/util/resources/mk/LocaleNames_mk.properties \ - sun/util/resources/ms/LocaleNames_ms.properties \ - sun/util/resources/mt/LocaleNames_mt.properties \ - sun/util/resources/nl/LocaleNames_nl.properties \ - sun/util/resources/no/LocaleNames_no.properties \ - sun/util/resources/no/LocaleNames_no_NO_NY.properties \ - sun/util/resources/pl/LocaleNames_pl.properties \ - sun/util/resources/pt/LocaleNames_pt.properties \ - sun/util/resources/pt/LocaleNames_pt_BR.properties \ - sun/util/resources/pt/LocaleNames_pt_PT.properties \ - sun/util/resources/ro/LocaleNames_ro.properties \ - sun/util/resources/ru/LocaleNames_ru.properties \ - sun/util/resources/sk/LocaleNames_sk.properties \ - sun/util/resources/sl/LocaleNames_sl.properties \ - sun/util/resources/sq/LocaleNames_sq.properties \ - sun/util/resources/sr/LocaleNames_sr.properties \ - sun/util/resources/sr/LocaleNames_sr_Latn.properties \ - sun/util/resources/sv/LocaleNames_sv.properties \ - sun/util/resources/tr/LocaleNames_tr.properties \ - sun/util/resources/uk/LocaleNames_uk.properties \ \ sun/util/resources/CalendarData.properties \ - sun/util/resources/be/CalendarData_be.properties \ - sun/util/resources/bg/CalendarData_bg.properties \ - sun/util/resources/ca/CalendarData_ca.properties \ - sun/util/resources/cs/CalendarData_cs.properties \ - sun/util/resources/da/CalendarData_da.properties \ - sun/util/resources/de/CalendarData_de.properties \ - sun/util/resources/el/CalendarData_el.properties \ - sun/util/resources/el/CalendarData_el_CY.properties \ sun/util/resources/en/CalendarData_en.properties \ - sun/util/resources/en/CalendarData_en_GB.properties \ - sun/util/resources/en/CalendarData_en_IE.properties \ - sun/util/resources/en/CalendarData_en_MT.properties \ - sun/util/resources/es/CalendarData_es.properties \ - sun/util/resources/es/CalendarData_es_ES.properties \ - sun/util/resources/es/CalendarData_es_US.properties \ - sun/util/resources/et/CalendarData_et.properties \ - sun/util/resources/fi/CalendarData_fi.properties \ - sun/util/resources/fr/CalendarData_fr.properties \ - sun/util/resources/fr/CalendarData_fr_CA.properties \ - sun/util/resources/hr/CalendarData_hr.properties \ - sun/util/resources/hu/CalendarData_hu.properties \ - sun/util/resources/in/CalendarData_in_ID.properties \ - sun/util/resources/is/CalendarData_is.properties \ - sun/util/resources/it/CalendarData_it.properties \ - sun/util/resources/lt/CalendarData_lt.properties \ - sun/util/resources/lv/CalendarData_lv.properties \ - sun/util/resources/mk/CalendarData_mk.properties \ - sun/util/resources/ms/CalendarData_ms_MY.properties \ - sun/util/resources/mt/CalendarData_mt.properties \ - sun/util/resources/mt/CalendarData_mt_MT.properties \ - sun/util/resources/nl/CalendarData_nl.properties \ - sun/util/resources/no/CalendarData_no.properties \ - sun/util/resources/pl/CalendarData_pl.properties \ - sun/util/resources/pt/CalendarData_pt.properties \ - sun/util/resources/pt/CalendarData_pt_PT.properties \ - sun/util/resources/ro/CalendarData_ro.properties \ - sun/util/resources/ru/CalendarData_ru.properties \ - sun/util/resources/sk/CalendarData_sk.properties \ - sun/util/resources/sl/CalendarData_sl.properties \ - sun/util/resources/sq/CalendarData_sq.properties \ - sun/util/resources/sr/CalendarData_sr.properties \ - sun/util/resources/sr/CalendarData_sr_Latn_BA.properties \ - sun/util/resources/sr/CalendarData_sr_Latn_ME.properties \ - sun/util/resources/sr/CalendarData_sr_Latn_RS.properties \ - sun/util/resources/sv/CalendarData_sv.properties \ - sun/util/resources/tr/CalendarData_tr.properties \ - sun/util/resources/uk/CalendarData_uk.properties \ \ sun/util/resources/CurrencyNames.properties \ - sun/util/resources/be/CurrencyNames_be_BY.properties \ - sun/util/resources/bg/CurrencyNames_bg_BG.properties \ - sun/util/resources/ca/CurrencyNames_ca_ES.properties \ - sun/util/resources/cs/CurrencyNames_cs_CZ.properties \ - sun/util/resources/da/CurrencyNames_da_DK.properties \ - sun/util/resources/de/CurrencyNames_de.properties \ - sun/util/resources/de/CurrencyNames_de_AT.properties \ - sun/util/resources/de/CurrencyNames_de_CH.properties \ - sun/util/resources/de/CurrencyNames_de_DE.properties \ - sun/util/resources/de/CurrencyNames_de_GR.properties \ - sun/util/resources/de/CurrencyNames_de_LU.properties \ - sun/util/resources/el/CurrencyNames_el_CY.properties \ - sun/util/resources/el/CurrencyNames_el_GR.properties \ - sun/util/resources/en/CurrencyNames_en_AU.properties \ - sun/util/resources/en/CurrencyNames_en_CA.properties \ - sun/util/resources/en/CurrencyNames_en_GB.properties \ - sun/util/resources/en/CurrencyNames_en_IE.properties \ - sun/util/resources/en/CurrencyNames_en_IN.properties \ - sun/util/resources/en/CurrencyNames_en_MT.properties \ - sun/util/resources/en/CurrencyNames_en_NZ.properties \ - sun/util/resources/en/CurrencyNames_en_PH.properties \ - sun/util/resources/en/CurrencyNames_en_SG.properties \ - sun/util/resources/en/CurrencyNames_en_US.properties \ - sun/util/resources/en/CurrencyNames_en_ZA.properties \ - sun/util/resources/es/CurrencyNames_es.properties \ - sun/util/resources/es/CurrencyNames_es_AR.properties \ - sun/util/resources/es/CurrencyNames_es_BO.properties \ - sun/util/resources/es/CurrencyNames_es_CL.properties \ - sun/util/resources/es/CurrencyNames_es_CO.properties \ - sun/util/resources/es/CurrencyNames_es_CR.properties \ - sun/util/resources/es/CurrencyNames_es_CU.properties \ - sun/util/resources/es/CurrencyNames_es_DO.properties \ - sun/util/resources/es/CurrencyNames_es_EC.properties \ - sun/util/resources/es/CurrencyNames_es_ES.properties \ - sun/util/resources/es/CurrencyNames_es_GT.properties \ - sun/util/resources/es/CurrencyNames_es_HN.properties \ - sun/util/resources/es/CurrencyNames_es_MX.properties \ - sun/util/resources/es/CurrencyNames_es_NI.properties \ - sun/util/resources/es/CurrencyNames_es_PA.properties \ - sun/util/resources/es/CurrencyNames_es_PE.properties \ - sun/util/resources/es/CurrencyNames_es_PR.properties \ - sun/util/resources/es/CurrencyNames_es_PY.properties \ - sun/util/resources/es/CurrencyNames_es_SV.properties \ - sun/util/resources/es/CurrencyNames_es_US.properties \ - sun/util/resources/es/CurrencyNames_es_UY.properties \ - sun/util/resources/es/CurrencyNames_es_VE.properties \ - sun/util/resources/et/CurrencyNames_et_EE.properties \ - sun/util/resources/fi/CurrencyNames_fi_FI.properties \ - sun/util/resources/fr/CurrencyNames_fr.properties \ - sun/util/resources/fr/CurrencyNames_fr_BE.properties \ - sun/util/resources/fr/CurrencyNames_fr_CA.properties \ - sun/util/resources/fr/CurrencyNames_fr_CH.properties \ - sun/util/resources/fr/CurrencyNames_fr_FR.properties \ - sun/util/resources/fr/CurrencyNames_fr_LU.properties \ - sun/util/resources/ga/CurrencyNames_ga_IE.properties \ - sun/util/resources/hr/CurrencyNames_hr_HR.properties \ - sun/util/resources/hu/CurrencyNames_hu_HU.properties \ - sun/util/resources/in/CurrencyNames_in_ID.properties \ - sun/util/resources/is/CurrencyNames_is_IS.properties \ - sun/util/resources/it/CurrencyNames_it.properties \ - sun/util/resources/it/CurrencyNames_it_CH.properties \ - sun/util/resources/it/CurrencyNames_it_IT.properties \ - sun/util/resources/lt/CurrencyNames_lt_LT.properties \ - sun/util/resources/lv/CurrencyNames_lv_LV.properties \ - sun/util/resources/mk/CurrencyNames_mk_MK.properties \ - sun/util/resources/ms/CurrencyNames_ms_MY.properties \ - sun/util/resources/mt/CurrencyNames_mt_MT.properties \ - sun/util/resources/nl/CurrencyNames_nl_BE.properties \ - sun/util/resources/nl/CurrencyNames_nl_NL.properties \ - sun/util/resources/no/CurrencyNames_no_NO.properties \ - sun/util/resources/pl/CurrencyNames_pl_PL.properties \ - sun/util/resources/pt/CurrencyNames_pt.properties \ - sun/util/resources/pt/CurrencyNames_pt_BR.properties \ - sun/util/resources/pt/CurrencyNames_pt_PT.properties \ - sun/util/resources/ro/CurrencyNames_ro_RO.properties \ - sun/util/resources/ru/CurrencyNames_ru_RU.properties \ - sun/util/resources/sk/CurrencyNames_sk_SK.properties \ - sun/util/resources/sl/CurrencyNames_sl_SI.properties \ - sun/util/resources/sq/CurrencyNames_sq_AL.properties \ - sun/util/resources/sr/CurrencyNames_sr_BA.properties \ - sun/util/resources/sr/CurrencyNames_sr_CS.properties \ - sun/util/resources/sr/CurrencyNames_sr_ME.properties \ - sun/util/resources/sr/CurrencyNames_sr_RS.properties \ - sun/util/resources/sr/CurrencyNames_sr_Latn_BA.properties \ - sun/util/resources/sr/CurrencyNames_sr_Latn_ME.properties \ - sun/util/resources/sr/CurrencyNames_sr_Latn_RS.properties \ - sun/util/resources/sv/CurrencyNames_sv.properties \ - sun/util/resources/sv/CurrencyNames_sv_SE.properties \ - sun/util/resources/tr/CurrencyNames_tr_TR.properties \ - sun/util/resources/uk/CurrencyNames_uk_UA.properties + sun/util/resources/en/CurrencyNames_en_US.properties diff --git a/jdk/make/java/zip/FILES_c.gmk b/jdk/make/java/zip/FILES_c.gmk index b6496b99270..4e9889bfbeb 100644 --- a/jdk/make/java/zip/FILES_c.gmk +++ b/jdk/make/java/zip/FILES_c.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/zip/Makefile b/jdk/make/java/zip/Makefile index e1d3c5b7e59..67a8557de0b 100644 --- a/jdk/make/java/zip/Makefile +++ b/jdk/make/java/zip/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/java/zip/mapfile-vers b/jdk/make/java/zip/mapfile-vers index 367e9058dc6..ba6490cc328 100644 --- a/jdk/make/java/zip/mapfile-vers +++ b/jdk/make/java/zip/mapfile-vers @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/javax/accessibility/Makefile b/jdk/make/javax/accessibility/Makefile index 4908ffbb15b..577567640be 100644 --- a/jdk/make/javax/accessibility/Makefile +++ b/jdk/make/javax/accessibility/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/javax/crypto/Defs-jce.gmk b/jdk/make/javax/crypto/Defs-jce.gmk index 7aecdc0a754..6203129b17b 100644 --- a/jdk/make/javax/crypto/Defs-jce.gmk +++ b/jdk/make/javax/crypto/Defs-jce.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ include $(BUILDDIR)/common/Release.gmk JCE_MANIFEST_FILE = $(TEMPDIR)/manifest.mf $(JCE_MANIFEST_FILE): $(MAINMANIFEST) $(prep-target) - $(SED) -e "s#@@RELEASE@@#$(RELEASE)#" \ + $(SED) -e "s#@@RELEASE@@#$(JDK_VERSION)#" \ -e "s#@@COMPANY_NAME@@#$(COMPANY_NAME)#" \ $(MAINMANIFEST) >> $@ $(ECHO) "Extension-Name: javax.crypto" >> $@ diff --git a/jdk/make/javax/crypto/Makefile b/jdk/make/javax/crypto/Makefile index e446e46406f..26af4323411 100644 --- a/jdk/make/javax/crypto/Makefile +++ b/jdk/make/javax/crypto/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/javax/sound/FILES_c.gmk b/jdk/make/javax/sound/FILES_c.gmk index 364639367cf..aa5d257d0d0 100644 --- a/jdk/make/javax/sound/FILES_c.gmk +++ b/jdk/make/javax/sound/FILES_c.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/javax/sound/SoundDefs.gmk b/jdk/make/javax/sound/SoundDefs.gmk index 06c0af8722e..26ec37655fb 100644 --- a/jdk/make/javax/sound/SoundDefs.gmk +++ b/jdk/make/javax/sound/SoundDefs.gmk @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/javax/sound/jsoundalsa/Makefile b/jdk/make/javax/sound/jsoundalsa/Makefile index 5fa0124cc68..79974bfe524 100644 --- a/jdk/make/javax/sound/jsoundalsa/Makefile +++ b/jdk/make/javax/sound/jsoundalsa/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/makefiles/mapfiles/launchers/mapfile-amd64 b/jdk/make/jdk/Makefile similarity index 74% rename from jdk/makefiles/mapfiles/launchers/mapfile-amd64 rename to jdk/make/jdk/Makefile index 760fcc1a90a..b8ac7422749 100644 --- a/jdk/makefiles/mapfiles/launchers/mapfile-amd64 +++ b/jdk/make/jdk/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -22,18 +22,17 @@ # or visit www.oracle.com if you need additional information or have any # questions. # + # -# Specify what global symbols we export. Note that we're not really -# interested in declaring a version, simply scoping the file is sufficient. +# Makefile for building all of java # -SUNWprivate_1.1 { - global: - main; # Provides basic adb symbol offsets - environ; # Public symbols and required by Java run time - _environ; - __environ_lock; +BUILDDIR = .. +PRODUCT = jdk +include $(BUILDDIR)/common/Defs.gmk - local: - *; -}; +SUBDIRS = asm +include $(BUILDDIR)/common/Subdirs.gmk + +all build clean clobber:: + $(SUBDIRS-loop) diff --git a/jdk/makefiles/mapfiles/launchers/mapfile-i586 b/jdk/make/jdk/asm/Makefile similarity index 62% rename from jdk/makefiles/mapfiles/launchers/mapfile-i586 rename to jdk/make/jdk/asm/Makefile index 48061dd8e90..48b8f609644 100644 --- a/jdk/makefiles/mapfiles/launchers/mapfile-i586 +++ b/jdk/make/jdk/asm/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1995, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -22,27 +22,19 @@ # or visit www.oracle.com if you need additional information or have any # questions. # -# -# Specify what global symbols we export. Note that we're not really -# interested in declaring a version, simply scoping the file is sufficient. -# -SUNWprivate_1.1 { - global: - main; # Provides basic adb symbol offsets - environ; # Public symbols and required by Java run time - _environ; - __environ_lock; - ___Argv; # The following are private, but as they are - _start; # exported from ctr1/crtn, the clever hacker - _init; # might know about them. However note, that - _fini; # their use is strictly not supported. - _lib_version; -# _mcount; - __fsr; - __fsr_init_value; - __longdouble_used; +BUILDDIR = ../.. +PACKAGE = jdk.internal.org.objectweb.asm +PRODUCT = jdk +JAVAC_LINT_OPTIONS=-Xlint:all +include $(BUILDDIR)/common/Defs.gmk - local: - *; -}; +# +# Files to compile +# +AUTO_FILES_JAVA_DIRS = jdk/internal/org/objectweb/asm + +# +# Rules +# +include $(BUILDDIR)/common/Classes.gmk diff --git a/jdk/make/jdk_generic_profile.sh b/jdk/make/jdk_generic_profile.sh index 6836d8bd0b8..28705393a33 100644 --- a/jdk/make/jdk_generic_profile.sh +++ b/jdk/make/jdk_generic_profile.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/jpda/back/Makefile b/jdk/make/jpda/back/Makefile index b2d7e2246c0..2095c4cf7dc 100644 --- a/jdk/make/jpda/back/Makefile +++ b/jdk/make/jpda/back/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/jpda/jdwp/jdwp.spec b/jdk/make/jpda/jdwp/jdwp.spec index 3f28a918ef4..0080c501a7f 100644 --- a/jdk/make/jpda/jdwp/jdwp.spec +++ b/jdk/make/jpda/jdwp/jdwp.spec @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/jprt.properties b/jdk/make/jprt.properties index f41a227d30e..cbf8540e02f 100644 --- a/jdk/make/jprt.properties +++ b/jdk/make/jprt.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -77,20 +77,18 @@ jprt.make.rule.core.test.targets= \ ${jprt.my.test.target.set:TESTNAME=jdk_util}, \ ${jprt.my.test.target.set:TESTNAME=jdk_io}, \ ${jprt.my.test.target.set:TESTNAME=jdk_net}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_nio1}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_nio2}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_nio3}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_nio}, \ ${jprt.my.test.target.set:TESTNAME=jdk_security1}, \ ${jprt.my.test.target.set:TESTNAME=jdk_security2}, \ ${jprt.my.test.target.set:TESTNAME=jdk_security3}, \ ${jprt.my.test.target.set:TESTNAME=jdk_rmi}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_management1}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_management2}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_management}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_jmx}, \ ${jprt.my.test.target.set:TESTNAME=jdk_text}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_tools1}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_tools2}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_tools}, \ + ${jprt.my.test.target.set:TESTNAME=jdk_jdi}, \ ${jprt.my.test.target.set:TESTNAME=jdk_jfr}, \ - ${jprt.my.test.target.set:TESTNAME=jdk_misc} + ${jprt.my.test.target.set:TESTNAME=jdk_other} # All vm test targets (testset=all) jprt.vm.all.test.targets= \ diff --git a/jdk/make/launchers/Makefile b/jdk/make/launchers/Makefile index 9979d973b39..3d9511408b0 100644 --- a/jdk/make/launchers/Makefile +++ b/jdk/make/launchers/Makefile @@ -58,7 +58,7 @@ $(make-appletviewer) $(call make-launcher, extcheck, com.sun.tools.extcheck.Main, , ) $(call make-launcher, idlj, com.sun.tools.corba.se.idl.toJavaPortable.Compile, , ) $(call make-launcher, jar, sun.tools.jar.Main, , ) -$(call make-launcher, jarsigner, sun.security.tools.JarSigner, , ) +$(call make-launcher, jarsigner, sun.security.tools.jarsigner.Main, , ) $(call make-launcher, javac, com.sun.tools.javac.Main, , ) $(call make-launcher, javadoc, com.sun.tools.javadoc.Main, , ) $(call make-launcher, javah, com.sun.tools.javah.Main, , ) diff --git a/jdk/make/mksample/Makefile b/jdk/make/mksample/Makefile index aa0f7481afd..b1c93daa56d 100644 --- a/jdk/make/mksample/Makefile +++ b/jdk/make/mksample/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/make/netbeans/common/architectures/name-Bsd.properties b/jdk/make/netbeans/common/architectures/name-Bsd.properties index 587e749e340..e09f9404df3 100644 --- a/jdk/make/netbeans/common/architectures/name-Bsd.properties +++ b/jdk/make/netbeans/common/architectures/name-Bsd.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/make/netbeans/common/closed-share-view.ent b/jdk/make/netbeans/common/closed-share-view.ent index 82fe0cab525..c03b53caeee 100644 --- a/jdk/make/netbeans/common/closed-share-view.ent +++ b/jdk/make/netbeans/common/closed-share-view.ent @@ -1,7 +1,7 @@ SERVER) used with @@ -192,26 +193,38 @@ final class RSAClientKeyExchange extends HandshakeMessage { "unable to get the plaintext of the premaster secret"); } - // We are not always able to get the encoded key of the - // premaster secret. Pass the cheking to master secret + int keySize = KeyLength.getKeySize(secretKey); + if (keySize > 0 && keySize != 384) { // 384 = 48 * 8 + if (debug != null && Debug.isOn("handshake")) { + System.out.println( + "incorrect length of premaster secret: " + + (keySize/8)); + } + + return generateDummySecret(clientHelloVersion); + } + + // The key size is exactly 48 bytes or not accessible. + // + // Conservatively, pass the checking to master secret // calculation. return secretKey; } else if (encoded.length == 48) { // check the version if (clientHelloVersion.major == encoded[0] && clientHelloVersion.minor == encoded[1]) { + return secretKey; - } else if (clientHelloVersion.v <= ProtocolVersion.TLS10.v) { + } else if (clientHelloVersion.v <= ProtocolVersion.TLS10.v && + currentVersion.major == encoded[0] && + currentVersion.minor == encoded[1]) { /* - * we never checked the client_version in server side - * for TLS v1.0 and SSL v3.0. For compatibility, we - * maintain this behavior. + * For compatibility, we maintain the behavior that the + * version in pre_master_secret can be the negotiated + * version for TLS v1.0 and SSL v3.0. */ - if (currentVersion.major == encoded[0] && - currentVersion.minor == encoded[1]) { - this.protocolVersion = currentVersion; - return secretKey; - } + this.protocolVersion = currentVersion; + return secretKey; } if (debug != null && Debug.isOn("handshake")) { @@ -220,22 +233,23 @@ final class RSAClientKeyExchange extends HandshakeMessage { ", while PreMasterSecret.client_version is " + ProtocolVersion.valueOf(encoded[0], encoded[1])); } + + return generateDummySecret(clientHelloVersion); } else { if (debug != null && Debug.isOn("handshake")) { System.out.println( "incorrect length of premaster secret: " + encoded.length); } + + return generateDummySecret(clientHelloVersion); } } - if (debug != null && Debug.isOn("handshake")) { - if (failoverException != null) { - System.out.println("Error decrypting premaster secret:"); - failoverException.printStackTrace(System.out); - } - - System.out.println("Generating random secret"); + if (debug != null && Debug.isOn("handshake") && + failoverException != null) { + System.out.println("Error decrypting premaster secret:"); + failoverException.printStackTrace(System.out); } return generateDummySecret(clientHelloVersion); @@ -243,6 +257,10 @@ final class RSAClientKeyExchange extends HandshakeMessage { // generate a premaster secret with the specified version number static SecretKey generateDummySecret(ProtocolVersion version) { + if (debug != null && Debug.isOn("handshake")) { + System.out.println("Generating a random fake premaster secret"); + } + try { String s = ((version.v >= ProtocolVersion.TLS12.v) ? "SunTls12RsaPremasterSecret" : "SunTlsRsaPremasterSecret"); diff --git a/jdk/src/share/classes/sun/security/ssl/RenegotiationInfoExtension.java b/jdk/src/share/classes/sun/security/ssl/RenegotiationInfoExtension.java new file mode 100644 index 00000000000..df13c3ec11a --- /dev/null +++ b/jdk/src/share/classes/sun/security/ssl/RenegotiationInfoExtension.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.io.IOException; + +import javax.net.ssl.SSLProtocolException; + +/* + * For secure renegotiation, RFC5746 defines a new TLS extension, + * "renegotiation_info" (with extension type 0xff01), which contains a + * cryptographic binding to the enclosing TLS connection (if any) for + * which the renegotiation is being performed. The "extension data" + * field of this extension contains a "RenegotiationInfo" structure: + * + * struct { + * opaque renegotiated_connection<0..255>; + * } RenegotiationInfo; + */ +final class RenegotiationInfoExtension extends HelloExtension { + private final byte[] renegotiated_connection; + + RenegotiationInfoExtension(byte[] clientVerifyData, + byte[] serverVerifyData) { + super(ExtensionType.EXT_RENEGOTIATION_INFO); + + if (clientVerifyData.length != 0) { + renegotiated_connection = + new byte[clientVerifyData.length + serverVerifyData.length]; + System.arraycopy(clientVerifyData, 0, renegotiated_connection, + 0, clientVerifyData.length); + + if (serverVerifyData.length != 0) { + System.arraycopy(serverVerifyData, 0, renegotiated_connection, + clientVerifyData.length, serverVerifyData.length); + } + } else { + // ignore both the client and server verify data. + renegotiated_connection = new byte[0]; + } + } + + RenegotiationInfoExtension(HandshakeInStream s, int len) + throws IOException { + super(ExtensionType.EXT_RENEGOTIATION_INFO); + + // check the extension length + if (len < 1) { + throw new SSLProtocolException("Invalid " + type + " extension"); + } + + int renegoInfoDataLen = s.getInt8(); + if (renegoInfoDataLen + 1 != len) { // + 1 = the byte we just read + throw new SSLProtocolException("Invalid " + type + " extension"); + } + + renegotiated_connection = new byte[renegoInfoDataLen]; + if (renegoInfoDataLen != 0) { + s.read(renegotiated_connection, 0, renegoInfoDataLen); + } + } + + + // Length of the encoded extension, including the type and length fields + int length() { + return 5 + renegotiated_connection.length; + } + + void send(HandshakeOutStream s) throws IOException { + s.putInt16(type.id); + s.putInt16(renegotiated_connection.length + 1); + s.putBytes8(renegotiated_connection); + } + + boolean isEmpty() { + return renegotiated_connection.length == 0; + } + + byte[] getRenegotiatedConnection() { + return renegotiated_connection; + } + + public String toString() { + return "Extension " + type + ", renegotiated_connection: " + + (renegotiated_connection.length == 0 ? "" : + Debug.toString(renegotiated_connection)); + } + +} diff --git a/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java index a396bf7c13f..267bd55722b 100644 --- a/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/SSLEngineImpl.java @@ -27,6 +27,7 @@ package sun.security.ssl; import java.io.*; import java.nio.*; +import java.util.*; import java.security.*; import javax.crypto.BadPaddingException; @@ -34,7 +35,6 @@ import javax.crypto.BadPaddingException; import javax.net.ssl.*; import javax.net.ssl.SSLEngineResult.*; - /** * Implementation of an non-blocking SSLEngine. * @@ -253,6 +253,12 @@ final public class SSLEngineImpl extends SSLEngine { // The cryptographic algorithm constraints private AlgorithmConstraints algorithmConstraints = null; + // The server name indication and matchers + List serverNames = + Collections.emptyList(); + Collection sniMatchers = + Collections.emptyList(); + // Have we been told whether we're client or server? private boolean serverModeSet = false; private boolean roleIsServer; @@ -361,6 +367,10 @@ final public class SSLEngineImpl extends SSLEngine { roleIsServer = true; connectionState = cs_START; + // default server name indication + serverNames = + Utilities.addToSNIServerNameList(serverNames, getPeerHost()); + /* * default read and write side cipher and MAC support * @@ -459,11 +469,13 @@ final public class SSLEngineImpl extends SSLEngine { enabledProtocols, doClientAuth, protocolVersion, connectionState == cs_HANDSHAKE, secureRenegotiation, clientVerifyData, serverVerifyData); + handshaker.setSNIMatchers(sniMatchers); } else { handshaker = new ClientHandshaker(this, sslContext, enabledProtocols, protocolVersion, connectionState == cs_HANDSHAKE, secureRenegotiation, clientVerifyData, serverVerifyData); + handshaker.setSNIServerNames(serverNames); } handshaker.setEnabledCipherSuites(enabledCipherSuites); handshaker.setEnableSessionCreation(enableSessionCreation); @@ -1100,7 +1112,7 @@ final public class SSLEngineImpl extends SSLEngine { // TLS requires that unrecognized records be ignored. // if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", Received record type: " + inputRecord.contentType()); } @@ -1384,7 +1396,7 @@ final public class SSLEngineImpl extends SSLEngine { * for handshaking and bad_record_mac for other records. */ if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", sequence number extremely close to overflow " + "(2^64-1 packets). Closing connection."); } @@ -1402,7 +1414,8 @@ final public class SSLEngineImpl extends SSLEngine { */ if ((type != Record.ct_handshake) && mac.seqNumIsHuge()) { if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + ", request renegotiation " + + System.out.println(Thread.currentThread().getName() + + ", request renegotiation " + "to avoid sequence number overflow"); } @@ -1420,7 +1433,8 @@ final public class SSLEngineImpl extends SSLEngine { private void closeOutboundInternal() { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + ", closeOutboundInternal()"); + System.out.println(Thread.currentThread().getName() + + ", closeOutboundInternal()"); } /* @@ -1467,7 +1481,8 @@ final public class SSLEngineImpl extends SSLEngine { * Dump out a close_notify to the remote side */ if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + ", called closeOutbound()"); + System.out.println(Thread.currentThread().getName() + + ", called closeOutbound()"); } closeOutboundInternal(); @@ -1487,7 +1502,8 @@ final public class SSLEngineImpl extends SSLEngine { private void closeInboundInternal() { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + ", closeInboundInternal()"); + System.out.println(Thread.currentThread().getName() + + ", closeInboundInternal()"); } /* @@ -1519,7 +1535,8 @@ final public class SSLEngineImpl extends SSLEngine { * someday in the future. */ if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + ", called closeInbound()"); + System.out.println(Thread.currentThread().getName() + + ", called closeInbound()"); } /* @@ -1642,7 +1659,7 @@ final public class SSLEngineImpl extends SSLEngine { */ if (closeReason != null) { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", fatal: engine already closed. Rethrowing " + cause.toString()); } @@ -1656,7 +1673,7 @@ final public class SSLEngineImpl extends SSLEngine { } if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + System.out.println(Thread.currentThread().getName() + ", fatal error: " + description + ": " + diagnostic + "\n" + cause.toString()); } @@ -1723,7 +1740,7 @@ final public class SSLEngineImpl extends SSLEngine { if (debug != null && (Debug.isOn("record") || Debug.isOn("handshake"))) { synchronized (System.out) { - System.out.print(threadName()); + System.out.print(Thread.currentThread().getName()); System.out.print(", RECV " + protocolVersion + " ALERT: "); if (level == Alerts.alert_fatal) { System.out.print("fatal, "); @@ -1790,7 +1807,7 @@ final public class SSLEngineImpl extends SSLEngine { boolean useDebug = debug != null && Debug.isOn("ssl"); if (useDebug) { synchronized (System.out) { - System.out.print(threadName()); + System.out.print(Thread.currentThread().getName()); System.out.print(", SEND " + protocolVersion + " ALERT: "); if (level == Alerts.alert_fatal) { System.out.print("fatal, "); @@ -1810,7 +1827,7 @@ final public class SSLEngineImpl extends SSLEngine { writeRecord(r); } catch (IOException e) { if (useDebug) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", Exception sending alert: " + e); } } @@ -1948,7 +1965,7 @@ final public class SSLEngineImpl extends SSLEngine { default: if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", setUseClientMode() invoked in state = " + connectionState); } @@ -2050,6 +2067,8 @@ final public class SSLEngineImpl extends SSLEngine { // the super implementation does not handle the following parameters params.setEndpointIdentificationAlgorithm(identificationProtocol); params.setAlgorithmConstraints(algorithmConstraints); + params.setSNIMatchers(sniMatchers); + params.setServerNames(serverNames); return params; } @@ -2063,19 +2082,28 @@ final public class SSLEngineImpl extends SSLEngine { // the super implementation does not handle the following parameters identificationProtocol = params.getEndpointIdentificationAlgorithm(); algorithmConstraints = params.getAlgorithmConstraints(); + + List sniNames = params.getServerNames(); + if (sniNames != null) { + serverNames = sniNames; + } + + Collection matchers = params.getSNIMatchers(); + if (matchers != null) { + sniMatchers = matchers; + } + if ((handshaker != null) && !handshaker.started()) { handshaker.setIdentificationProtocol(identificationProtocol); handshaker.setAlgorithmConstraints(algorithmConstraints); + if (roleIsServer) { + handshaker.setSNIMatchers(sniMatchers); + } else { + handshaker.setSNIServerNames(serverNames); + } } } - /** - * Return the name of the current thread. Utility method. - */ - private static String threadName() { - return Thread.currentThread().getName(); - } - /** * Returns a printable representation of this end of the connection. */ diff --git a/jdk/src/share/classes/sun/security/ssl/SSLServerSocketImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLServerSocketImpl.java index c2098c1db19..0dcf2cd3ce4 100644 --- a/jdk/src/share/classes/sun/security/ssl/SSLServerSocketImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/SSLServerSocketImpl.java @@ -39,6 +39,7 @@ import javax.net.ServerSocketFactory; import javax.net.ssl.SSLException; import javax.net.ssl.SSLServerSocket; import javax.net.ssl.SSLParameters; +import javax.net.ssl.SNIMatcher; /** @@ -92,6 +93,10 @@ class SSLServerSocketImpl extends SSLServerSocket // The cryptographic algorithm constraints private AlgorithmConstraints algorithmConstraints = null; + // The server name indication + Collection sniMatchers = + Collections.emptyList(); + /** * Create an SSL server socket on a port, using a non-default * authentication context and a specified connection backlog. @@ -289,6 +294,7 @@ class SSLServerSocketImpl extends SSLServerSocket // the super implementation does not handle the following parameters params.setEndpointIdentificationAlgorithm(identificationProtocol); params.setAlgorithmConstraints(algorithmConstraints); + params.setSNIMatchers(sniMatchers); return params; } @@ -302,6 +308,10 @@ class SSLServerSocketImpl extends SSLServerSocket // the super implementation does not handle the following parameters identificationProtocol = params.getEndpointIdentificationAlgorithm(); algorithmConstraints = params.getAlgorithmConstraints(); + Collection matchers = params.getSNIMatchers(); + if (matchers != null) { + sniMatchers = params.getSNIMatchers(); + } } /** @@ -312,7 +322,8 @@ class SSLServerSocketImpl extends SSLServerSocket public Socket accept() throws IOException { SSLSocketImpl s = new SSLSocketImpl(sslContext, useServerMode, enabledCipherSuites, doClientAuth, enableSessionCreation, - enabledProtocols, identificationProtocol, algorithmConstraints); + enabledProtocols, identificationProtocol, algorithmConstraints, + sniMatchers); implAccept(s); s.doneConnect(); diff --git a/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java index 110fc9ccaee..1c4575f8b0d 100644 --- a/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/SSLSessionImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,9 @@ import java.util.Hashtable; import java.util.Vector; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.ArrayList; import java.security.Principal; import java.security.PrivateKey; @@ -51,6 +54,7 @@ import javax.net.ssl.SSLSession; import javax.net.ssl.SSLPermission; import javax.net.ssl.SSLException; import javax.net.ssl.ExtendedSSLSession; +import javax.net.ssl.SNIServerName; import javax.security.auth.x500.X500Principal; @@ -111,6 +115,8 @@ final class SSLSessionImpl extends ExtendedSSLSession { private PrivateKey localPrivateKey; private String[] localSupportedSignAlgs; private String[] peerSupportedSignAlgs; + private List requestedServerNames; + // Principals for non-certificate based cipher suites private Principal peerPrincipal; @@ -212,6 +218,10 @@ final class SSLSessionImpl extends ExtendedSSLSession { SignatureAndHashAlgorithm.getAlgorithmNames(algorithms); } + void setRequestedServerNames(List requestedServerNames) { + this.requestedServerNames = new ArrayList<>(requestedServerNames); + } + /** * Set the peer principal. */ @@ -748,6 +758,7 @@ final class SSLSessionImpl extends ExtendedSSLSession { * Gets an array of supported signature algorithms that the local side is * willing to verify. */ + @Override public String[] getLocalSupportedSignatureAlgorithms() { if (localSupportedSignAlgs != null) { return localSupportedSignAlgs.clone(); @@ -760,6 +771,7 @@ final class SSLSessionImpl extends ExtendedSSLSession { * Gets an array of supported signature algorithms that the peer is * able to verify. */ + @Override public String[] getPeerSupportedSignatureAlgorithms() { if (peerSupportedSignAlgs != null) { return peerSupportedSignAlgs.clone(); @@ -768,6 +780,20 @@ final class SSLSessionImpl extends ExtendedSSLSession { return new String[0]; } + /** + * Obtains a List containing all {@link SNIServerName}s + * of the requested Server Name Indication (SNI) extension. + */ + @Override + public List getRequestedServerNames() { + if (requestedServerNames != null && !requestedServerNames.isEmpty()) { + return Collections.unmodifiableList( + requestedServerNames); + } + + return Collections.emptyList(); + } + /** Returns a string representation of this SSL session */ public String toString() { return "[Session-" + sessionCount diff --git a/jdk/src/share/classes/sun/security/ssl/SSLSocketFactoryImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLSocketFactoryImpl.java index 135b46205e8..dc61b7b15ea 100644 --- a/jdk/src/share/classes/sun/security/ssl/SSLSocketFactoryImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/SSLSocketFactoryImpl.java @@ -109,6 +109,16 @@ final public class SSLSocketFactoryImpl extends SSLSocketFactory { return new SSLSocketImpl(context, s, host, port, autoClose); } + @Override + public Socket createSocket(Socket s, InputStream consumed, + boolean autoClose) throws IOException { + if (s == null) { + throw new NullPointerException( + "the existing socket cannot be null"); + } + + return new SSLSocketImpl(context, s, consumed, autoClose); + } /** * Constructs an SSL connection to a server at a specified address diff --git a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java index 49ab309ce0c..2e27d627b7d 100644 --- a/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/SSLSocketImpl.java @@ -36,9 +36,9 @@ import java.security.AlgorithmConstraints; import java.util.*; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantLock; +import java.nio.charset.StandardCharsets; import javax.crypto.BadPaddingException; - import javax.net.ssl.*; /** @@ -198,14 +198,6 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { private boolean autoClose = true; private AccessControlContext acc; - /* - * We cannot use the hostname resolved from name services. For - * virtual hosting, multiple hostnames may be bound to the same IP - * address, so the hostname resolved from name services is not - * reliable. - */ - private String rawHostname; - // The cipher suites enabled for use on this connection. private CipherSuiteList enabledCipherSuites; @@ -215,6 +207,12 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { // The cryptographic algorithm constraints private AlgorithmConstraints algorithmConstraints = null; + // The server name indication and matchers + List serverNames = + Collections.emptyList(); + Collection sniMatchers = + Collections.emptyList(); + /* * READ ME * READ ME * READ ME * READ ME * READ ME * READ ME * * IMPORTANT STUFF TO UNDERSTANDING THE SYNCHRONIZATION ISSUES. @@ -397,7 +395,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { throws IOException, UnknownHostException { super(); this.host = host; - this.rawHostname = host; + this.serverNames = + Utilities.addToSNIServerNameList(this.serverNames, this.host); init(context, false); SocketAddress socketAddress = host != null ? new InetSocketAddress(host, port) : @@ -440,7 +439,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { throws IOException, UnknownHostException { super(); this.host = host; - this.rawHostname = host; + this.serverNames = + Utilities.addToSNIServerNameList(this.serverNames, this.host); init(context, false); bind(new InetSocketAddress(localAddr, localPort)); SocketAddress socketAddress = @@ -482,13 +482,15 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { CipherSuiteList suites, byte clientAuth, boolean sessionCreation, ProtocolList protocols, String identificationProtocol, - AlgorithmConstraints algorithmConstraints) throws IOException { + AlgorithmConstraints algorithmConstraints, + Collection sniMatchers) throws IOException { super(); doClientAuth = clientAuth; enableSessionCreation = sessionCreation; this.identificationProtocol = identificationProtocol; this.algorithmConstraints = algorithmConstraints; + this.sniMatchers = sniMatchers; init(context, serverMode); /* @@ -535,12 +537,35 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { throw new SocketException("Underlying socket is not connected"); } this.host = host; - this.rawHostname = host; + this.serverNames = + Utilities.addToSNIServerNameList(this.serverNames, this.host); init(context, false); this.autoClose = autoClose; doneConnect(); } + /** + * Creates a server mode {@link Socket} layered over an + * existing connected socket, and is able to read data which has + * already been consumed/removed from the {@link Socket}'s + * underlying {@link InputStream}. + */ + SSLSocketImpl(SSLContextImpl context, Socket sock, + InputStream consumed, boolean autoClose) throws IOException { + super(sock, consumed); + // We always layer over a connected socket + if (!sock.isConnected()) { + throw new SocketException("Underlying socket is not connected"); + } + + // In server mode, it is not necessary to set host and serverNames. + // Otherwise, would require a reverse DNS lookup to get the hostname. + + init(context, true); + this.autoClose = autoClose; + doneConnect(); + } + /** * Initializes the client socket. */ @@ -604,7 +629,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { public void connect(SocketAddress endpoint, int timeout) throws IOException { - if (self != this) { + if (isLayered()) { throw new SocketException("Already connected"); } @@ -628,13 +653,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { * java.net actually connects using the socket "self", else * we get some pretty bizarre failure modes. */ - if (self == this) { - sockInput = super.getInputStream(); - sockOutput = super.getOutputStream(); - } else { - sockInput = self.getInputStream(); - sockOutput = self.getOutputStream(); - } + sockInput = super.getInputStream(); + sockOutput = super.getOutputStream(); /* * Move to handshaking state, with pending session initialized @@ -761,13 +781,14 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { // For layered, non-autoclose sockets, we are not // able to bring them into a usable state, so we // treat it as fatal error. - if (self != this && !autoClose) { + if (isLayered() && !autoClose) { // Note that the alert description is // specified as -1, so no message will be send // to peer anymore. fatal((byte)(-1), ssle); } else if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println( + Thread.currentThread().getName() + ", received Exception: " + ssle); } @@ -935,7 +956,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { boolean handshaking = (getConnectionState() <= cs_HANDSHAKE); boolean rethrow = requireCloseNotify || handshaking; if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", received EOFException: " + (rethrow ? "error" : "ignored")); } @@ -1119,7 +1140,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { // TLS requires that unrecognized records be ignored. // if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", Received record type: " + r.contentType()); } @@ -1183,7 +1204,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { * for handshaking and bad_record_mac for other records. */ if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", sequence number extremely close to overflow " + "(2^64-1 packets). Closing connection."); @@ -1200,7 +1221,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { */ if ((type != Record.ct_handshake) && mac.seqNumIsHuge()) { if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + ", request renegotiation " + + System.out.println(Thread.currentThread().getName() + + ", request renegotiation " + "to avoid sequence number overflow"); } @@ -1278,11 +1300,13 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { enabledProtocols, doClientAuth, protocolVersion, connectionState == cs_HANDSHAKE, secureRenegotiation, clientVerifyData, serverVerifyData); + handshaker.setSNIMatchers(sniMatchers); } else { handshaker = new ClientHandshaker(this, sslContext, enabledProtocols, protocolVersion, connectionState == cs_HANDSHAKE, secureRenegotiation, clientVerifyData, serverVerifyData); + handshaker.setSNIServerNames(serverNames); } handshaker.setEnabledCipherSuites(enabledCipherSuites); handshaker.setEnableSessionCreation(enableSessionCreation); @@ -1509,24 +1533,20 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { protected void closeSocket() throws IOException { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + ", called closeSocket()"); - } - if (self == this) { - super.close(); - } else { - self.close(); + System.out.println(Thread.currentThread().getName() + + ", called closeSocket()"); } + + super.close(); } private void closeSocket(boolean selfInitiated) throws IOException { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", called closeSocket(" + selfInitiated + ")"); } - if (self == this) { + if (!isLayered() || autoClose) { super.close(); - } else if (autoClose) { - self.close(); } else if (selfInitiated) { // layered && non-autoclose // read close_notify alert to clear input stream @@ -1549,7 +1569,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { */ public void close() throws IOException { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + ", called close()"); + System.out.println(Thread.currentThread().getName() + + ", called close()"); } closeInternal(true); // caller is initiating close setConnectionState(cs_APP_CLOSED); @@ -1567,8 +1588,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { */ private void closeInternal(boolean selfInitiated) throws IOException { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + ", called closeInternal(" - + selfInitiated + ")"); + System.out.println(Thread.currentThread().getName() + + ", called closeInternal(" + selfInitiated + ")"); } int state = getConnectionState(); @@ -1630,7 +1651,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { // closing since it is already in progress. if (state == cs_SENT_CLOSE) { if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", close invoked again; state = " + getConnectionState()); } @@ -1653,7 +1674,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { } } if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", after primary close; state = " + getConnectionState()); } @@ -1701,7 +1722,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { */ void waitForClose(boolean rethrow) throws IOException { if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", waiting for close_notify or alert: state " + getConnectionState()); } @@ -1726,7 +1747,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { inrec = null; } catch (IOException e) { if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", Exception while waiting for close " +e); } if (rethrow) { @@ -1788,8 +1809,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { synchronized private void handleException(Exception e, boolean resumable) throws IOException { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() - + ", handling exception: " + e.toString()); + System.out.println(Thread.currentThread().getName() + + ", handling exception: " + e.toString()); } // don't close the Socket in case of timeouts or interrupts if @@ -1935,7 +1956,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { if (debug != null && (Debug.isOn("record") || Debug.isOn("handshake"))) { synchronized (System.out) { - System.out.print(threadName()); + System.out.print(Thread.currentThread().getName()); System.out.print(", RECV " + protocolVersion + " ALERT: "); if (level == Alerts.alert_fatal) { System.out.print("fatal, "); @@ -2001,7 +2022,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { boolean useDebug = debug != null && Debug.isOn("ssl"); if (useDebug) { synchronized (System.out) { - System.out.print(threadName()); + System.out.print(Thread.currentThread().getName()); System.out.print(", SEND " + protocolVersion + " ALERT: "); if (level == Alerts.alert_fatal) { System.out.print("fatal, "); @@ -2021,7 +2042,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { writeRecord(r); } catch (IOException e) { if (useDebug) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", Exception sending alert: " + e); } } @@ -2118,14 +2139,15 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { return host; } - synchronized String getRawHostname() { - return rawHostname; - } - // ONLY used by HttpsClient to setup the URI specified hostname + // + // Please NOTE that this method MUST be called before calling to + // SSLSocket.setSSLParameters(). Otherwise, the {@code host} parameter + // may override SNIHostName in the customized server name indication. synchronized public void setHost(String host) { this.host = host; - this.rawHostname = host; + this.serverNames = + Utilities.addToSNIServerNameList(this.serverNames, this.host); } /** @@ -2186,7 +2208,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { } catch (IOException e) { // handshake failed. log and return a nullSession if (debug != null && Debug.isOn("handshake")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", IOException in getSession(): " + e); } } @@ -2328,7 +2350,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { default: if (debug != null && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", setUseClientMode() invoked in state = " + connectionState); } @@ -2422,14 +2444,11 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { */ public void setSoTimeout(int timeout) throws SocketException { if ((debug != null) && Debug.isOn("ssl")) { - System.out.println(threadName() + + System.out.println(Thread.currentThread().getName() + ", setSoTimeout(" + timeout + ") called"); } - if (self == this) { - super.setSoTimeout(timeout); - } else { - self.setSoTimeout(timeout); - } + + super.setSoTimeout(timeout); } /** @@ -2474,6 +2493,8 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { // the super implementation does not handle the following parameters params.setEndpointIdentificationAlgorithm(identificationProtocol); params.setAlgorithmConstraints(algorithmConstraints); + params.setSNIMatchers(sniMatchers); + params.setServerNames(serverNames); return params; } @@ -2487,9 +2508,25 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { // the super implementation does not handle the following parameters identificationProtocol = params.getEndpointIdentificationAlgorithm(); algorithmConstraints = params.getAlgorithmConstraints(); + + List sniNames = params.getServerNames(); + if (sniNames != null) { + serverNames = sniNames; + } + + Collection matchers = params.getSNIMatchers(); + if (matchers != null) { + sniMatchers = matchers; + } + if ((handshaker != null) && !handshaker.started()) { handshaker.setIdentificationProtocol(identificationProtocol); handshaker.setAlgorithmConstraints(algorithmConstraints); + if (roleIsServer) { + handshaker.setSNIMatchers(sniMatchers); + } else { + handshaker.setSNIServerNames(serverNames); + } } } @@ -2530,13 +2567,6 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { } } - /** - * Return the name of the current thread. Utility method. - */ - private static String threadName() { - return Thread.currentThread().getName(); - } - /** * Returns a printable representation of this end of the connection. */ @@ -2548,11 +2578,7 @@ final public class SSLSocketImpl extends BaseSSLSocketImpl { retval.append(sess.getCipherSuite()); retval.append(": "); - if (self == this) { - retval.append(super.toString()); - } else { - retval.append(self.toString()); - } + retval.append(super.toString()); retval.append("]"); return retval.toString(); diff --git a/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java b/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java index 8b10f8a9499..475746e9fb7 100644 --- a/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java +++ b/jdk/src/share/classes/sun/security/ssl/ServerHandshaker.java @@ -276,6 +276,18 @@ final class ServerHandshaker extends Handshaker { mesg.print(System.out); } + // check the server name indication if required + ServerNameExtension clientHelloSNIExt = (ServerNameExtension) + mesg.extensions.get(ExtensionType.EXT_SERVER_NAME); + if (!sniMatchers.isEmpty()) { + // we do not reject client without SNI extension + if (clientHelloSNIExt != null && + !clientHelloSNIExt.isMatched(sniMatchers)) { + fatalSE(Alerts.alert_unrecognized_name, + "Unrecognized server name indication"); + } + } + // Does the message include security renegotiation indication? boolean renegotiationIndicated = false; @@ -474,6 +486,26 @@ final class ServerHandshaker extends Handshaker { } } + // cannot resume session with different server name indication + if (resumingSession) { + List oldServerNames = + previous.getRequestedServerNames(); + if (clientHelloSNIExt != null) { + if (!clientHelloSNIExt.isIdentical(oldServerNames)) { + resumingSession = false; + } + } else if (!oldServerNames.isEmpty()) { + resumingSession = false; + } + + if (!resumingSession && + debug != null && Debug.isOn("handshake")) { + System.out.println( + "The requested server name indication " + + "is not identical to the previous one"); + } + } + if (resumingSession && (doClientAuth == SSLEngineImpl.clauth_required)) { try { @@ -613,6 +645,14 @@ final class ServerHandshaker extends Handshaker { // algorithms in chooseCipherSuite() } + // set the server name indication in the session + List clientHelloSNI = + Collections.emptyList(); + if (clientHelloSNIExt != null) { + clientHelloSNI = clientHelloSNIExt.getServerNames(); + } + session.setRequestedServerNames(clientHelloSNI); + // set the handshake session setHandshakeSessionSE(session); @@ -654,6 +694,15 @@ final class ServerHandshaker extends Handshaker { m1.extensions.add(serverHelloRI); } + if (!sniMatchers.isEmpty() && clientHelloSNIExt != null) { + // When resuming a session, the server MUST NOT include a + // server_name extension in the server hello. + if (!resumingSession) { + ServerNameExtension serverHelloSNI = new ServerNameExtension(); + m1.extensions.add(serverHelloSNI); + } + } + if (debug != null && Debug.isOn("handshake")) { m1.print(System.out); System.out.println("Cipher suite: " + session.getSuite()); diff --git a/jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java b/jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java new file mode 100644 index 00000000000..e99f592b901 --- /dev/null +++ b/jdk/src/share/classes/sun/security/ssl/ServerNameExtension.java @@ -0,0 +1,280 @@ +/* + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.LinkedHashMap; +import java.util.Map; + +import javax.net.ssl.SNIHostName; +import javax.net.ssl.SNIMatcher; +import javax.net.ssl.SNIServerName; +import javax.net.ssl.SSLProtocolException; +import javax.net.ssl.StandardConstants; + +/* + * [RFC 4366/6066] To facilitate secure connections to servers that host + * multiple 'virtual' servers at a single underlying network address, clients + * MAY include an extension of type "server_name" in the (extended) client + * hello. The "extension_data" field of this extension SHALL contain + * "ServerNameList" where: + * + * struct { + * NameType name_type; + * select (name_type) { + * case host_name: HostName; + * } name; + * } ServerName; + * + * enum { + * host_name(0), (255) + * } NameType; + * + * opaque HostName<1..2^16-1>; + * + * struct { + * ServerName server_name_list<1..2^16-1> + * } ServerNameList; + */ +final class ServerNameExtension extends HelloExtension { + + // For backward compatibility, all future data structures associated with + // new NameTypes MUST begin with a 16-bit length field. + final static int NAME_HEADER_LENGTH = 3; // NameType: 1 byte + // Name length: 2 bytes + private Map sniMap; + private int listLength; // ServerNameList length + + // constructor for ServerHello + ServerNameExtension() throws IOException { + super(ExtensionType.EXT_SERVER_NAME); + + listLength = 0; + sniMap = Collections.emptyMap(); + } + + // constructor for ClientHello + ServerNameExtension(List serverNames) + throws IOException { + super(ExtensionType.EXT_SERVER_NAME); + + listLength = 0; + sniMap = new LinkedHashMap<>(); + for (SNIServerName serverName : serverNames) { + // check for duplicated server name type + if (sniMap.put(serverName.getType(), serverName) != null) { + // unlikely to happen, but in case ... + throw new RuntimeException( + "Duplicated server name of type " + serverName.getType()); + } + + listLength += serverName.getEncoded().length + NAME_HEADER_LENGTH; + } + + // This constructor is used for ClientHello only. Empty list is + // not allowed in client mode. + if (listLength == 0) { + throw new RuntimeException("The ServerNameList cannot be empty"); + } + } + + // constructor for ServerHello for parsing SNI extension + ServerNameExtension(HandshakeInStream s, int len) + throws IOException { + super(ExtensionType.EXT_SERVER_NAME); + + int remains = len; + if (len >= 2) { // "server_name" extension in ClientHello + listLength = s.getInt16(); // ServerNameList length + if (listLength == 0 || listLength + 2 != len) { + throw new SSLProtocolException( + "Invalid " + type + " extension"); + } + + remains -= 2; + sniMap = new LinkedHashMap<>(); + while (remains > 0) { + int code = s.getInt8(); // NameType + + // HostName (length read in getBytes16); + byte[] encoded = s.getBytes16(); + SNIServerName serverName; + switch (code) { + case StandardConstants.SNI_HOST_NAME: + if (encoded.length == 0) { + throw new SSLProtocolException( + "Empty HostName in server name indication"); + } + try { + serverName = new SNIHostName(encoded); + } catch (IllegalArgumentException iae) { + SSLProtocolException spe = new SSLProtocolException( + "Illegal server name, type=host_name(" + + code + "), name=" + + (new String(encoded, StandardCharsets.UTF_8)) + + ", value=" + Debug.toString(encoded)); + spe.initCause(iae); + throw spe; + } + break; + default: + try { + serverName = new UnknownServerName(code, encoded); + } catch (IllegalArgumentException iae) { + SSLProtocolException spe = new SSLProtocolException( + "Illegal server name, type=(" + code + + "), value=" + Debug.toString(encoded)); + spe.initCause(iae); + throw spe; + } + } + // check for duplicated server name type + if (sniMap.put(serverName.getType(), serverName) != null) { + throw new SSLProtocolException( + "Duplicated server name of type " + + serverName.getType()); + } + + remains -= encoded.length + NAME_HEADER_LENGTH; + } + } else if (len == 0) { // "server_name" extension in ServerHello + listLength = 0; + sniMap = Collections.emptyMap(); + } + + if (remains != 0) { + throw new SSLProtocolException("Invalid server_name extension"); + } + } + + List getServerNames() { + if (sniMap != null && !sniMap.isEmpty()) { + return Collections.unmodifiableList( + new ArrayList<>(sniMap.values())); + } + + return Collections.emptyList(); + } + + /* + * Is the extension recognized by the corresponding matcher? + * + * This method is used to check whether the server name indication can + * be recognized by the server name matchers. + * + * Per RFC 6066, if the server understood the ClientHello extension but + * does not recognize the server name, the server SHOULD take one of two + * actions: either abort the handshake by sending a fatal-level + * unrecognized_name(112) alert or continue the handshake. + * + * If there is an instance of SNIMatcher defined for a particular name + * type, it must be used to perform match operations on the server name. + */ + boolean isMatched(Collection matchers) { + if (sniMap != null && !sniMap.isEmpty()) { + for (SNIMatcher matcher : matchers) { + SNIServerName sniName = sniMap.get(matcher.getType()); + if (sniName != null && (!matcher.matches(sniName))) { + return false; + } + } + } + + return true; + } + + /* + * Is the extension is identical to a server name list? + * + * This method is used to check the server name indication during session + * resumption. + * + * Per RFC 6066, when the server is deciding whether or not to accept a + * request to resume a session, the contents of a server_name extension + * MAY be used in the lookup of the session in the session cache. The + * client SHOULD include the same server_name extension in the session + * resumption request as it did in the full handshake that established + * the session. A server that implements this extension MUST NOT accept + * the request to resume the session if the server_name extension contains + * a different name. Instead, it proceeds with a full handshake to + * establish a new session. When resuming a session, the server MUST NOT + * include a server_name extension in the server hello. + */ + boolean isIdentical(List other) { + if (other.size() == sniMap.size()) { + for(SNIServerName sniInOther : other) { + SNIServerName sniName = sniMap.get(sniInOther.getType()); + if (sniName == null || !sniInOther.equals(sniName)) { + return false; + } + } + + return true; + } + + return false; + } + + int length() { + return listLength == 0 ? 4 : 6 + listLength; + } + + void send(HandshakeOutStream s) throws IOException { + s.putInt16(type.id); + if (listLength == 0) { + s.putInt16(listLength); // in ServerHello, empty extension_data + } else { + s.putInt16(listLength + 2); // length of extension_data + s.putInt16(listLength); // length of ServerNameList + + for (SNIServerName sniName : sniMap.values()) { + s.putInt8(sniName.getType()); // server name type + s.putBytes16(sniName.getEncoded()); // server name value + } + } + } + + public String toString() { + StringBuffer buffer = new StringBuffer(); + for (SNIServerName sniName : sniMap.values()) { + buffer.append("[" + sniName + "]"); + } + + return "Extension " + type + ", server_name: " + buffer; + } + + private static class UnknownServerName extends SNIServerName { + UnknownServerName(int code, byte[] encoded) { + super(code, encoded); + } + } + +} diff --git a/jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java b/jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java new file mode 100644 index 00000000000..f45720e0cde --- /dev/null +++ b/jdk/src/share/classes/sun/security/ssl/SignatureAlgorithmsExtension.java @@ -0,0 +1,135 @@ +/* + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collection; + +import javax.net.ssl.SSLProtocolException; + +/* + * [RFC5246] The client uses the "signature_algorithms" extension to + * indicate to the server which signature/hash algorithm pairs may be + * used in digital signatures. The "extension_data" field of this + * extension contains a "supported_signature_algorithms" value. + * + * enum { + * none(0), md5(1), sha1(2), sha224(3), sha256(4), sha384(5), + * sha512(6), (255) + * } HashAlgorithm; + * + * enum { anonymous(0), rsa(1), dsa(2), ecdsa(3), (255) } + * SignatureAlgorithm; + * + * struct { + * HashAlgorithm hash; + * SignatureAlgorithm signature; + * } SignatureAndHashAlgorithm; + * + * SignatureAndHashAlgorithm + * supported_signature_algorithms<2..2^16-2>; + */ +final class SignatureAlgorithmsExtension extends HelloExtension { + + private Collection algorithms; + private int algorithmsLen; // length of supported_signature_algorithms + + SignatureAlgorithmsExtension( + Collection signAlgs) { + + super(ExtensionType.EXT_SIGNATURE_ALGORITHMS); + + algorithms = new ArrayList(signAlgs); + algorithmsLen = + SignatureAndHashAlgorithm.sizeInRecord() * algorithms.size(); + } + + SignatureAlgorithmsExtension(HandshakeInStream s, int len) + throws IOException { + super(ExtensionType.EXT_SIGNATURE_ALGORITHMS); + + algorithmsLen = s.getInt16(); + if (algorithmsLen == 0 || algorithmsLen + 2 != len) { + throw new SSLProtocolException("Invalid " + type + " extension"); + } + + algorithms = new ArrayList(); + int remains = algorithmsLen; + int sequence = 0; + while (remains > 1) { // needs at least two bytes + int hash = s.getInt8(); // hash algorithm + int signature = s.getInt8(); // signature algorithm + + SignatureAndHashAlgorithm algorithm = + SignatureAndHashAlgorithm.valueOf(hash, signature, ++sequence); + algorithms.add(algorithm); + remains -= 2; // one byte for hash, one byte for signature + } + + if (remains != 0) { + throw new SSLProtocolException("Invalid server_name extension"); + } + } + + Collection getSignAlgorithms() { + return algorithms; + } + + @Override + int length() { + return 6 + algorithmsLen; + } + + @Override + void send(HandshakeOutStream s) throws IOException { + s.putInt16(type.id); + s.putInt16(algorithmsLen + 2); + s.putInt16(algorithmsLen); + + for (SignatureAndHashAlgorithm algorithm : algorithms) { + s.putInt8(algorithm.getHashValue()); // HashAlgorithm + s.putInt8(algorithm.getSignatureValue()); // SignatureAlgorithm + } + } + + @Override + public String toString() { + StringBuffer buffer = new StringBuffer(); + boolean opened = false; + for (SignatureAndHashAlgorithm signAlg : algorithms) { + if (opened) { + buffer.append(", " + signAlg.getAlgorithmName()); + } else { + buffer.append(signAlg.getAlgorithmName()); + opened = true; + } + } + + return "Extension " + type + ", signature_algorithms: " + buffer; + } +} + diff --git a/jdk/src/share/classes/sun/security/ssl/SunJSSE.java b/jdk/src/share/classes/sun/security/ssl/SunJSSE.java index 16cb35cd42e..6946063077d 100644 --- a/jdk/src/share/classes/sun/security/ssl/SunJSSE.java +++ b/jdk/src/share/classes/sun/security/ssl/SunJSSE.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -103,7 +103,7 @@ public abstract class SunJSSE extends java.security.Provider { // standard constructor protected SunJSSE() { - super("SunJSSE", 1.7d, info); + super("SunJSSE", 1.8d, info); subclassCheck(); if (Boolean.TRUE.equals(fips)) { throw new ProviderException diff --git a/jdk/src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java b/jdk/src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java new file mode 100644 index 00000000000..bcbb7419533 --- /dev/null +++ b/jdk/src/share/classes/sun/security/ssl/SupportedEllipticCurvesExtension.java @@ -0,0 +1,215 @@ +/* + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.io.IOException; +import java.security.spec.ECParameterSpec; +import java.util.HashMap; +import java.util.Map; + +import javax.net.ssl.SSLProtocolException; + +final class SupportedEllipticCurvesExtension extends HelloExtension { + + // the extension value to send in the ClientHello message + static final SupportedEllipticCurvesExtension DEFAULT; + + private static final boolean fips; + + static { + int[] ids; + fips = SunJSSE.isFIPS(); + if (fips == false) { + ids = new int[] { + // NIST curves first + // prefer NIST P-256, rest in order of increasing key length + 23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14, + // non-NIST curves + 15, 16, 17, 2, 18, 4, 5, 20, 8, 22, + }; + } else { + ids = new int[] { + // same as above, but allow only NIST curves in FIPS mode + 23, 1, 3, 19, 21, 6, 7, 9, 10, 24, 11, 12, 25, 13, 14, + }; + } + DEFAULT = new SupportedEllipticCurvesExtension(ids); + } + + private final int[] curveIds; + + private SupportedEllipticCurvesExtension(int[] curveIds) { + super(ExtensionType.EXT_ELLIPTIC_CURVES); + this.curveIds = curveIds; + } + + SupportedEllipticCurvesExtension(HandshakeInStream s, int len) + throws IOException { + super(ExtensionType.EXT_ELLIPTIC_CURVES); + int k = s.getInt16(); + if (((len & 1) != 0) || (k + 2 != len)) { + throw new SSLProtocolException("Invalid " + type + " extension"); + } + curveIds = new int[k >> 1]; + for (int i = 0; i < curveIds.length; i++) { + curveIds[i] = s.getInt16(); + } + } + + boolean contains(int index) { + for (int curveId : curveIds) { + if (index == curveId) { + return true; + } + } + return false; + } + + // Return a reference to the internal curveIds array. + // The caller must NOT modify the contents. + int[] curveIds() { + return curveIds; + } + + int length() { + return 6 + (curveIds.length << 1); + } + + void send(HandshakeOutStream s) throws IOException { + s.putInt16(type.id); + int k = curveIds.length << 1; + s.putInt16(k + 2); + s.putInt16(k); + for (int curveId : curveIds) { + s.putInt16(curveId); + } + } + + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("Extension " + type + ", curve names: {"); + boolean first = true; + for (int curveId : curveIds) { + if (first) { + first = false; + } else { + sb.append(", "); + } + // first check if it is a known named curve, then try other cases. + String oid = getCurveOid(curveId); + if (oid != null) { + ECParameterSpec spec = JsseJce.getECParameterSpec(oid); + // this toString() output will look nice for the current + // implementation of the ECParameterSpec class in the Sun + // provider, but may not look good for other implementations. + if (spec != null) { + sb.append(spec.toString().split(" ")[0]); + } else { + sb.append(oid); + } + } else if (curveId == ARBITRARY_PRIME) { + sb.append("arbitrary_explicit_prime_curves"); + } else if (curveId == ARBITRARY_CHAR2) { + sb.append("arbitrary_explicit_char2_curves"); + } else { + sb.append("unknown curve " + curveId); + } + } + sb.append("}"); + return sb.toString(); + } + + // Test whether we support the curve with the given index. + static boolean isSupported(int index) { + if ((index <= 0) || (index >= NAMED_CURVE_OID_TABLE.length)) { + return false; + } + if (fips == false) { + // in non-FIPS mode, we support all valid indices + return true; + } + return DEFAULT.contains(index); + } + + static int getCurveIndex(ECParameterSpec params) { + String oid = JsseJce.getNamedCurveOid(params); + if (oid == null) { + return -1; + } + Integer n = curveIndices.get(oid); + return (n == null) ? -1 : n; + } + + static String getCurveOid(int index) { + if ((index > 0) && (index < NAMED_CURVE_OID_TABLE.length)) { + return NAMED_CURVE_OID_TABLE[index]; + } + return null; + } + + private final static int ARBITRARY_PRIME = 0xff01; + private final static int ARBITRARY_CHAR2 = 0xff02; + + // See sun.security.ec.NamedCurve for the OIDs + private final static String[] NAMED_CURVE_OID_TABLE = new String[] { + null, // (0) unused + "1.3.132.0.1", // (1) sect163k1, NIST K-163 + "1.3.132.0.2", // (2) sect163r1 + "1.3.132.0.15", // (3) sect163r2, NIST B-163 + "1.3.132.0.24", // (4) sect193r1 + "1.3.132.0.25", // (5) sect193r2 + "1.3.132.0.26", // (6) sect233k1, NIST K-233 + "1.3.132.0.27", // (7) sect233r1, NIST B-233 + "1.3.132.0.3", // (8) sect239k1 + "1.3.132.0.16", // (9) sect283k1, NIST K-283 + "1.3.132.0.17", // (10) sect283r1, NIST B-283 + "1.3.132.0.36", // (11) sect409k1, NIST K-409 + "1.3.132.0.37", // (12) sect409r1, NIST B-409 + "1.3.132.0.38", // (13) sect571k1, NIST K-571 + "1.3.132.0.39", // (14) sect571r1, NIST B-571 + "1.3.132.0.9", // (15) secp160k1 + "1.3.132.0.8", // (16) secp160r1 + "1.3.132.0.30", // (17) secp160r2 + "1.3.132.0.31", // (18) secp192k1 + "1.2.840.10045.3.1.1", // (19) secp192r1, NIST P-192 + "1.3.132.0.32", // (20) secp224k1 + "1.3.132.0.33", // (21) secp224r1, NIST P-224 + "1.3.132.0.10", // (22) secp256k1 + "1.2.840.10045.3.1.7", // (23) secp256r1, NIST P-256 + "1.3.132.0.34", // (24) secp384r1, NIST P-384 + "1.3.132.0.35", // (25) secp521r1, NIST P-521 + }; + + private final static Map curveIndices; + + static { + curveIndices = new HashMap(); + for (int i = 1; i < NAMED_CURVE_OID_TABLE.length; i++) { + curveIndices.put(NAMED_CURVE_OID_TABLE[i], i); + } + } + +} diff --git a/jdk/src/share/classes/sun/security/ssl/SupportedEllipticPointFormatsExtension.java b/jdk/src/share/classes/sun/security/ssl/SupportedEllipticPointFormatsExtension.java new file mode 100644 index 00000000000..86000238a88 --- /dev/null +++ b/jdk/src/share/classes/sun/security/ssl/SupportedEllipticPointFormatsExtension.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.net.ssl.SSLProtocolException; + +final class SupportedEllipticPointFormatsExtension extends HelloExtension { + + final static int FMT_UNCOMPRESSED = 0; + final static int FMT_ANSIX962_COMPRESSED_PRIME = 1; + final static int FMT_ANSIX962_COMPRESSED_CHAR2 = 2; + + static final HelloExtension DEFAULT = + new SupportedEllipticPointFormatsExtension( + new byte[] {FMT_UNCOMPRESSED}); + + private final byte[] formats; + + private SupportedEllipticPointFormatsExtension(byte[] formats) { + super(ExtensionType.EXT_EC_POINT_FORMATS); + this.formats = formats; + } + + SupportedEllipticPointFormatsExtension(HandshakeInStream s, int len) + throws IOException { + super(ExtensionType.EXT_EC_POINT_FORMATS); + formats = s.getBytes8(); + // RFC 4492 says uncompressed points must always be supported. + // Check just to make sure. + boolean uncompressed = false; + for (int format : formats) { + if (format == FMT_UNCOMPRESSED) { + uncompressed = true; + break; + } + } + if (uncompressed == false) { + throw new SSLProtocolException + ("Peer does not support uncompressed points"); + } + } + + int length() { + return 5 + formats.length; + } + + void send(HandshakeOutStream s) throws IOException { + s.putInt16(type.id); + s.putInt16(formats.length + 1); + s.putBytes8(formats); + } + + private static String toString(byte format) { + int f = format & 0xff; + switch (f) { + case FMT_UNCOMPRESSED: + return "uncompressed"; + case FMT_ANSIX962_COMPRESSED_PRIME: + return "ansiX962_compressed_prime"; + case FMT_ANSIX962_COMPRESSED_CHAR2: + return "ansiX962_compressed_char2"; + default: + return "unknown-" + f; + } + } + + public String toString() { + List list = new ArrayList(); + for (byte format : formats) { + list.add(toString(format)); + } + return "Extension " + type + ", formats: " + list; + } +} diff --git a/jdk/src/share/classes/sun/security/ssl/UnknownExtension.java b/jdk/src/share/classes/sun/security/ssl/UnknownExtension.java new file mode 100644 index 00000000000..0f59f45dbc7 --- /dev/null +++ b/jdk/src/share/classes/sun/security/ssl/UnknownExtension.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import java.io.IOException; + +final class UnknownExtension extends HelloExtension { + + private final byte[] data; + + UnknownExtension(HandshakeInStream s, int len, ExtensionType type) + throws IOException { + super(type); + data = new byte[len]; + // s.read() does not handle 0-length arrays. + if (len != 0) { + s.read(data); + } + } + + int length() { + return 4 + data.length; + } + + void send(HandshakeOutStream s) throws IOException { + s.putInt16(type.id); + s.putBytes16(data); + } + + public String toString() { + return "Unsupported extension " + type + ", data: " + + Debug.toString(data); + } +} diff --git a/jdk/src/share/classes/sun/security/ssl/Utilities.java b/jdk/src/share/classes/sun/security/ssl/Utilities.java new file mode 100644 index 00000000000..aefb02c9a19 --- /dev/null +++ b/jdk/src/share/classes/sun/security/ssl/Utilities.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.ssl; + +import javax.net.ssl.*; +import java.util.*; +import sun.net.util.IPAddressUtil; + +/** + * A utility class to share the static methods. + */ +final class Utilities { + /** + * Puts {@code hostname} into the {@code serverNames} list. + *

+ * If the {@code serverNames} does not look like a legal FQDN, it will + * not be put into the returned list. + *

+ * Note that the returned list does not allow duplicated name type. + * + * @return a list of {@link SNIServerName} + */ + static List addToSNIServerNameList( + List serverNames, String hostname) { + + SNIHostName sniHostName = rawToSNIHostName(hostname); + if (sniHostName == null) { + return serverNames; + } + + int size = serverNames.size(); + List sniList = (size != 0) ? + new ArrayList(serverNames) : + new ArrayList(1); + + boolean reset = false; + for (int i = 0; i < size; i++) { + SNIServerName serverName = sniList.get(i); + if (serverName.getType() == StandardConstants.SNI_HOST_NAME) { + sniList.set(i, sniHostName); + if (Debug.isOn("ssl")) { + System.out.println(Thread.currentThread().getName() + + ", the previous server name in SNI (" + serverName + + ") was replaced with (" + sniHostName + ")"); + } + reset = true; + break; + } + } + + if (!reset) { + sniList.add(sniHostName); + } + + return Collections.unmodifiableList(sniList); + } + + /** + * Converts string hostname to {@code SNIHostName}. + *

+ * Note that to check whether a hostname is a valid domain name, we cannot + * use the hostname resolved from name services. For virtual hosting, + * multiple hostnames may be bound to the same IP address, so the hostname + * resolved from name services is not always reliable. + * + * @param hostname + * the raw hostname + * @return an instance of {@link SNIHostName}, or null if the hostname does + * not look like a FQDN + */ + private static SNIHostName rawToSNIHostName(String hostname) { + SNIHostName sniHostName = null; + if (hostname != null && hostname.indexOf('.') > 0 && + !hostname.endsWith(".") && + !IPAddressUtil.isIPv4LiteralAddress(hostname) && + !IPAddressUtil.isIPv6LiteralAddress(hostname)) { + + try { + sniHostName = new SNIHostName(hostname); + } catch (IllegalArgumentException iae) { + // don't bother to handle illegal host_name + if (Debug.isOn("ssl")) { + System.out.println(Thread.currentThread().getName() + + ", \"" + hostname + "\" " + + "is not a legal HostName for server name indication"); + } + } + } + + return sniHostName; + } +} diff --git a/jdk/src/share/classes/sun/security/ssl/X509KeyManagerImpl.java b/jdk/src/share/classes/sun/security/ssl/X509KeyManagerImpl.java index 45e6c997586..4b8a101f529 100644 --- a/jdk/src/share/classes/sun/security/ssl/X509KeyManagerImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/X509KeyManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -128,13 +128,35 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager public String chooseServerAlias(String keyType, Principal[] issuers, Socket socket) { return chooseAlias(getKeyTypes(keyType), issuers, CheckType.SERVER, - getAlgorithmConstraints(socket)); + getAlgorithmConstraints(socket), + X509TrustManagerImpl.getRequestedServerNames(socket), + "HTTPS"); // The SNI HostName is a fully qualified domain name. + // The certificate selection scheme for SNI HostName + // is similar to HTTPS endpoint identification scheme + // implemented in this provider. + // + // Using HTTPS endpoint identification scheme to guide + // the selection of an appropriate authentication + // certificate according to requested SNI extension. + // + // It is not a really HTTPS endpoint identification. } public String chooseEngineServerAlias(String keyType, Principal[] issuers, SSLEngine engine) { return chooseAlias(getKeyTypes(keyType), issuers, CheckType.SERVER, - getAlgorithmConstraints(engine)); + getAlgorithmConstraints(engine), + X509TrustManagerImpl.getRequestedServerNames(engine), + "HTTPS"); // The SNI HostName is a fully qualified domain name. + // The certificate selection scheme for SNI HostName + // is similar to HTTPS endpoint identification scheme + // implemented in this provider. + // + // Using HTTPS endpoint identification scheme to guide + // the selection of an appropriate authentication + // certificate according to requested SNI extension. + // + // It is not a really HTTPS endpoint identification. } public String[] getClientAliases(String keyType, Principal[] issuers) { @@ -321,8 +343,8 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager * The algorithm we use is: * . scan through all the aliases in all builders in order * . as soon as we find a perfect match, return - * (i.e. a match with a cert that has appropriate key usage - * and is not expired). + * (i.e. a match with a cert that has appropriate key usage, + * qualified endpoint identity, and is not expired). * . if we do not find a perfect match, keep looping and remember * the imperfect matches * . at the end, sort the imperfect matches. we prefer expired certs @@ -331,6 +353,15 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager */ private String chooseAlias(List keyTypeList, Principal[] issuers, CheckType checkType, AlgorithmConstraints constraints) { + + return chooseAlias(keyTypeList, issuers, + checkType, constraints, null, null); + } + + private String chooseAlias(List keyTypeList, Principal[] issuers, + CheckType checkType, AlgorithmConstraints constraints, + List requestedServerNames, String idAlgorithm) { + if (keyTypeList == null || keyTypeList.isEmpty()) { return null; } @@ -340,7 +371,8 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager for (int i = 0, n = builders.size(); i < n; i++) { try { List results = getAliases(i, keyTypeList, - issuerSet, false, checkType, constraints); + issuerSet, false, checkType, constraints, + requestedServerNames, idAlgorithm); if (results != null) { // the results will either be a single perfect match // or 1 or more imperfect matches @@ -394,7 +426,8 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager for (int i = 0, n = builders.size(); i < n; i++) { try { List results = getAliases(i, keyTypeList, - issuerSet, true, checkType, constraints); + issuerSet, true, checkType, constraints, + null, null); if (results != null) { if (allResults == null) { allResults = new ArrayList(); @@ -504,7 +537,9 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager // first check extensions, if they match, check expiration // note: we may want to move this code into the sun.security.validator // package - CheckResult check(X509Certificate cert, Date date) { + CheckResult check(X509Certificate cert, Date date, + List serverNames, String idAlgorithm) { + if (this == NONE) { return CheckResult.OK; } @@ -553,11 +588,11 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager return CheckResult.EXTENSION_MISMATCH; } // For servers, also require key agreement. - // This is not totally accurate as the keyAgreement bit - // is only necessary for static ECDH key exchange and - // not ephemeral ECDH. We leave it in for now until - // there are signs that this check causes problems - // for real world EC certificates. + // This is not totally accurate as the keyAgreement + // bit is only necessary for static ECDH key + // exchange and not ephemeral ECDH. We leave it in + // for now until there are signs that this check + // causes problems for real world EC certificates. if ((this == SERVER) && (getBit(ku, 4) == false)) { return CheckResult.EXTENSION_MISMATCH; } @@ -571,10 +606,50 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager try { cert.checkValidity(date); - return CheckResult.OK; } catch (CertificateException e) { return CheckResult.EXPIRED; } + + if (serverNames != null && !serverNames.isEmpty()) { + for (SNIServerName serverName : serverNames) { + if (serverName.getType() == + StandardConstants.SNI_HOST_NAME) { + if (!(serverName instanceof SNIHostName)) { + try { + serverName = + new SNIHostName(serverName.getEncoded()); + } catch (IllegalArgumentException iae) { + // unlikely to happen, just in case ... + if (useDebug) { + debug.println( + "Illegal server name: " + serverName); + } + + return CheckResult.INSENSITIVE; + } + } + String hostname = + ((SNIHostName)serverName).getAsciiName(); + + try { + X509TrustManagerImpl.checkIdentity(hostname, + cert, idAlgorithm); + } catch (CertificateException e) { + if (useDebug) { + debug.println( + "Certificate identity does not match " + + "Server Name Inidication (SNI): " + + hostname); + } + return CheckResult.INSENSITIVE; + } + + break; + } + } + } + + return CheckResult.OK; } } @@ -583,6 +658,7 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager // for sorting, i.e. OK is best, followed by EXPIRED and EXTENSION_MISMATCH private static enum CheckResult { OK, // ok or not checked + INSENSITIVE, // server name indication insensitive EXPIRED, // extensions valid but cert expired EXTENSION_MISMATCH, // extensions invalid (expiration not checked) } @@ -616,7 +692,10 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager private List getAliases(int builderIndex, List keyTypes, Set issuerSet, boolean findAll, CheckType checkType, - AlgorithmConstraints constraints) throws Exception { + AlgorithmConstraints constraints, + List requestedServerNames, + String idAlgorithm) throws Exception { + Builder builder = builders.get(builderIndex); KeyStore ks = builder.getKeyStore(); List results = null; @@ -699,7 +778,8 @@ final class X509KeyManagerImpl extends X509ExtendedKeyManager date = new Date(); } CheckResult checkResult = - checkType.check((X509Certificate)chain[0], date); + checkType.check((X509Certificate)chain[0], date, + requestedServerNames, idAlgorithm); EntryStatus status = new EntryStatus(builderIndex, keyIndex, alias, chain, checkResult); diff --git a/jdk/src/share/classes/sun/security/ssl/X509TrustManagerImpl.java b/jdk/src/share/classes/sun/security/ssl/X509TrustManagerImpl.java index d38e727010c..13bbb18b8de 100644 --- a/jdk/src/share/classes/sun/security/ssl/X509TrustManagerImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/X509TrustManagerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,15 +28,14 @@ package sun.security.ssl; import java.net.Socket; import javax.net.ssl.SSLSession; +import java.nio.charset.StandardCharsets; import java.util.*; import java.security.*; import java.security.cert.*; - import javax.net.ssl.*; import sun.security.validator.*; - import sun.security.util.HostnameChecker; /** @@ -199,8 +198,8 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager String identityAlg = sslSocket.getSSLParameters(). getEndpointIdentificationAlgorithm(); if (identityAlg != null && identityAlg.length() != 0) { - String hostname = session.getPeerHost(); - checkIdentity(hostname, chain[0], identityAlg); + checkIdentity(session, chain[0], identityAlg, isClient, + getRequestedServerNames(socket)); } // create the algorithm constraints @@ -251,8 +250,8 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager String identityAlg = engine.getSSLParameters(). getEndpointIdentificationAlgorithm(); if (identityAlg != null && identityAlg.length() != 0) { - String hostname = session.getPeerHost(); - checkIdentity(hostname, chain[0], identityAlg); + checkIdentity(session, chain[0], identityAlg, isClient, + getRequestedServerNames(engine)); } // create the algorithm constraints @@ -329,6 +328,117 @@ final class X509TrustManagerImpl extends X509ExtendedTrustManager } } + // Get string representation of HostName from a list of server names. + // + // We are only accepting host_name name type in the list. + private static String getHostNameInSNI(List sniNames) { + + SNIHostName hostname = null; + for (SNIServerName sniName : sniNames) { + if (sniName.getType() != StandardConstants.SNI_HOST_NAME) { + continue; + } + + if (sniName instanceof SNIHostName) { + hostname = (SNIHostName)sniName; + } else { + try { + hostname = new SNIHostName(sniName.getEncoded()); + } catch (IllegalArgumentException iae) { + // unlikely to happen, just in case ... + if ((debug != null) && Debug.isOn("trustmanager")) { + byte[] encoded = hostname.getEncoded(); + System.out.println("Illegal server name: " + sniName); + } + } + } + + // no more than server name of the same name type + break; + } + + if (hostname != null) { + return hostname.getAsciiName(); + } + + return null; + } + + // Also used by X509KeyManagerImpl + static List getRequestedServerNames(Socket socket) { + if (socket != null && socket.isConnected() && + socket instanceof SSLSocket) { + + SSLSocket sslSocket = (SSLSocket)socket; + SSLSession session = sslSocket.getHandshakeSession(); + + if (session != null && (session instanceof ExtendedSSLSession)) { + ExtendedSSLSession extSession = (ExtendedSSLSession)session; + return extSession.getRequestedServerNames(); + } + } + + return Collections.emptyList(); + } + + // Also used by X509KeyManagerImpl + static List getRequestedServerNames(SSLEngine engine) { + if (engine != null) { + SSLSession session = engine.getHandshakeSession(); + + if (session != null && (session instanceof ExtendedSSLSession)) { + ExtendedSSLSession extSession = (ExtendedSSLSession)session; + return extSession.getRequestedServerNames(); + } + } + + return Collections.emptyList(); + } + + /* + * Per RFC 6066, if an application negotiates a server name using an + * application protocol and then upgrades to TLS, and if a server_name + * extension is sent, then the extension SHOULD contain the same name + * that was negotiated in the application protocol. If the server_name + * is established in the TLS session handshake, the client SHOULD NOT + * attempt to request a different server name at the application layer. + * + * According to the above spec, we only need to check either the identity + * in server_name extension or the peer host of the connection. Peer host + * is not always a reliable fully qualified domain name. The HostName in + * server_name extension is more reliable than peer host. So we prefer + * the identity checking aginst the server_name extension if present, and + * may failove to peer host checking. + */ + private static void checkIdentity(SSLSession session, + X509Certificate cert, + String algorithm, + boolean isClient, + List sniNames) throws CertificateException { + + boolean identifiable = false; + String peerHost = session.getPeerHost(); + if (isClient) { + String hostname = getHostNameInSNI(sniNames); + if (hostname != null) { + try { + checkIdentity(hostname, cert, algorithm); + identifiable = true; + } catch (CertificateException ce) { + if (hostname.equalsIgnoreCase(peerHost)) { + throw ce; + } + + // otherwisw, failover to check peer host + } + } + } + + if (!identifiable) { + checkIdentity(peerHost, cert, algorithm); + } + } + /* * Identify the peer by its certificate and hostname. * diff --git a/jdk/src/share/classes/sun/security/ssl/krb5/KerberosClientKeyExchangeImpl.java b/jdk/src/share/classes/sun/security/ssl/krb5/KerberosClientKeyExchangeImpl.java index cde473fcf1d..623c8efddd3 100644 --- a/jdk/src/share/classes/sun/security/ssl/krb5/KerberosClientKeyExchangeImpl.java +++ b/jdk/src/share/classes/sun/security/ssl/krb5/KerberosClientKeyExchangeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java b/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java index 679a24739fa..ecfba5feee2 100644 --- a/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java +++ b/jdk/src/share/classes/sun/security/tools/KeyStoreUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,18 @@ package sun.security.tools; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +import java.net.URL; + +import java.security.KeyStore; + +import java.text.Collator; + import java.util.Locale; /** @@ -34,18 +46,17 @@ import java.util.Locale; */ public class KeyStoreUtil { - // Class and methods marked as public so that they can be - // accessed by JarSigner, which although lies in a package - // with the same name, but bundled in tools.jar and loaded - // by another class loader, hence in a different *runtime* - // package. - // - // See JVM Spec, 5.3 and 5.4.4 - private KeyStoreUtil() { // this class is not meant to be instantiated } + private static final String JKS = "jks"; + + private static final Collator collator = Collator.getInstance(); + static { + // this is for case insensitive string comparisons + collator.setStrength(Collator.PRIMARY); + }; /** * Returns true if KeyStore has a password. This is true except for @@ -68,4 +79,76 @@ public class KeyStoreUtil { return storetype.toUpperCase(Locale.ENGLISH); } } + + /** + * Returns the keystore with the configured CA certificates. + */ + public static KeyStore getCacertsKeyStore() + throws Exception + { + String sep = File.separator; + File file = new File(System.getProperty("java.home") + sep + + "lib" + sep + "security" + sep + + "cacerts"); + if (!file.exists()) { + return null; + } + KeyStore caks = null; + try (FileInputStream fis = new FileInputStream(file)) { + caks = KeyStore.getInstance(JKS); + caks.load(fis, null); + } + return caks; + } + + public static char[] getPassWithModifier(String modifier, String arg, + java.util.ResourceBundle rb) { + if (modifier == null) { + return arg.toCharArray(); + } else if (collator.compare(modifier, "env") == 0) { + String value = System.getenv(arg); + if (value == null) { + System.err.println(rb.getString( + "Cannot.find.environment.variable.") + arg); + return null; + } else { + return value.toCharArray(); + } + } else if (collator.compare(modifier, "file") == 0) { + try { + URL url = null; + try { + url = new URL(arg); + } catch (java.net.MalformedURLException mue) { + File f = new File(arg); + if (f.exists()) { + url = f.toURI().toURL(); + } else { + System.err.println(rb.getString( + "Cannot.find.file.") + arg); + return null; + } + } + + try (BufferedReader br = + new BufferedReader(new InputStreamReader( + url.openStream()))) { + String value = br.readLine(); + + if (value == null) { + return new char[0]; + } + + return value.toCharArray(); + } + } catch (IOException ioe) { + System.err.println(ioe); + return null; + } + } else { + System.err.println(rb.getString("Unknown.password.type.") + + modifier); + return null; + } + } } diff --git a/jdk/src/share/classes/sun/security/tools/JarSigner.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java similarity index 99% rename from jdk/src/share/classes/sun/security/tools/JarSigner.java rename to jdk/src/share/classes/sun/security/tools/jarsigner/Main.java index 31dfbcebf4e..98f3ec28a20 100644 --- a/jdk/src/share/classes/sun/security/tools/JarSigner.java +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ * questions. */ -package sun.security.tools; +package sun.security.tools.jarsigner; import java.io.*; import java.util.*; @@ -53,6 +53,8 @@ import java.security.cert.CertificateNotYetValidException; import java.security.cert.PKIXParameters; import java.security.cert.TrustAnchor; import java.util.Map.Entry; +import sun.security.tools.KeyStoreUtil; +import sun.security.tools.PathList; import sun.security.x509.*; import sun.security.util.*; import sun.misc.BASE64Encoder; @@ -74,12 +76,12 @@ import sun.misc.BASE64Encoder; * @author Jan Luehe */ -public class JarSigner { +public class Main { // for i18n private static final java.util.ResourceBundle rb = java.util.ResourceBundle.getBundle - ("sun.security.tools.JarSignerResources"); + ("sun.security.tools.jarsigner.Resources"); private static final Collator collator = Collator.getInstance(); static { // this is for case insensitive string comparisions @@ -101,7 +103,7 @@ public class JarSigner { // Attention: // This is the entry that get launched by the security tool jarsigner. public static void main(String args[]) throws Exception { - JarSigner js = new JarSigner(); + Main js = new Main(); js.run(args); } @@ -461,7 +463,7 @@ public class JarSigner { } static char[] getPass(String modifier, String arg) { - char[] output = KeyTool.getPassWithModifier(modifier, arg); + char[] output = KeyStoreUtil.getPassWithModifier(modifier, arg, rb); if (output != null) return output; usage(); return null; // Useless, usage() already exit @@ -1579,7 +1581,7 @@ public class JarSigner { validator = CertPathValidator.getInstance("PKIX"); Set tas = new HashSet<>(); try { - KeyStore caks = KeyTool.getCacertsKeyStore(); + KeyStore caks = KeyStoreUtil.getCacertsKeyStore(); if (caks != null) { Enumeration aliases = caks.aliases(); while (aliases.hasMoreElements()) { diff --git a/jdk/src/share/classes/sun/security/tools/JarSignerResources.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources.java similarity index 97% rename from jdk/src/share/classes/sun/security/tools/JarSignerResources.java rename to jdk/src/share/classes/sun/security/tools/jarsigner/Resources.java index cea8b253927..9c59b5085c8 100644 --- a/jdk/src/share/classes/sun/security/tools/JarSignerResources.java +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,14 +23,14 @@ * questions. */ -package sun.security.tools; +package sun.security.tools.jarsigner; /** *

This class represents the ResourceBundle * for JarSigner. * */ -public class JarSignerResources extends java.util.ListResourceBundle { +public class Resources extends java.util.ListResourceBundle { private static final Object[][] contents = { @@ -227,6 +227,10 @@ public class JarSignerResources extends java.util.ListResourceBundle { "The signer's certificate chain is not validated."}, {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.", "This jar contains entries whose certificate chain is not validated."}, + {"Unknown.password.type.", "Unknown password type: "}, + {"Cannot.find.environment.variable.", + "Cannot find environment variable: "}, + {"Cannot.find.file.", "Cannot find file: "}, }; /** @@ -236,6 +240,7 @@ public class JarSignerResources extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/tools/JarSignerResources_ja.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java similarity index 97% rename from jdk/src/share/classes/sun/security/tools/JarSignerResources_ja.java rename to jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java index 05bf83c2da4..ef68a72ccac 100644 --- a/jdk/src/share/classes/sun/security/tools/JarSignerResources_ja.java +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_ja.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,14 +23,14 @@ * questions. */ -package sun.security.tools; +package sun.security.tools.jarsigner; /** *

This class represents the ResourceBundle * for JarSigner. * */ -public class JarSignerResources_ja extends java.util.ListResourceBundle { +public class Resources_ja extends java.util.ListResourceBundle { private static final Object[][] contents = { @@ -225,6 +225,10 @@ public class JarSignerResources_ja extends java.util.ListResourceBundle { "\u7F72\u540D\u8005\u306E\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u307E\u3060\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002"}, {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.", "\u3053\u306Ejar\u306B\u306F\u3001\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u304C\u307E\u3060\u691C\u8A3C\u3055\u308C\u3066\u3044\u306A\u3044\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u3066\u3044\u307E\u3059\u3002"}, + {"Unknown.password.type.", "\u4E0D\u660E\u306A\u30D1\u30B9\u30EF\u30FC\u30C9\u30FB\u30BF\u30A4\u30D7: "}, + {"Cannot.find.environment.variable.", + "\u74B0\u5883\u5909\u6570\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "}, + {"Cannot.find.file.", "\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "}, }; /** @@ -234,6 +238,7 @@ public class JarSignerResources_ja extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/tools/JarSignerResources_zh_CN.java b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java similarity index 96% rename from jdk/src/share/classes/sun/security/tools/JarSignerResources_zh_CN.java rename to jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java index 48b6c7303dd..50e22a516d8 100644 --- a/jdk/src/share/classes/sun/security/tools/JarSignerResources_zh_CN.java +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/Resources_zh_CN.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,14 +23,14 @@ * questions. */ -package sun.security.tools; +package sun.security.tools.jarsigner; /** *

This class represents the ResourceBundle * for JarSigner. * */ -public class JarSignerResources_zh_CN extends java.util.ListResourceBundle { +public class Resources_zh_CN extends java.util.ListResourceBundle { private static final Object[][] contents = { @@ -225,6 +225,11 @@ public class JarSignerResources_zh_CN extends java.util.ListResourceBundle { "\u7B7E\u540D\u8005\u7684\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1\u3002"}, {"This.jar.contains.entries.whose.certificate.chain.is.not.validated.", "\u6B64 jar \u5305\u542B\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1\u7684\u6761\u76EE\u3002"}, + {"Unknown.password.type.", "\u672A\u77E5\u53E3\u4EE4\u7C7B\u578B: "}, + {"Cannot.find.environment.variable.", + "\u627E\u4E0D\u5230\u73AF\u5883\u53D8\u91CF: "}, + {"Cannot.find.file.", "\u627E\u4E0D\u5230\u6587\u4EF6: "}, + {"Command.option.flag.needs.an.argument.", "\u547D\u4EE4\u9009\u9879{0}\u9700\u8981\u4E00\u4E2A\u53C2\u6570\u3002"}, }; /** @@ -234,6 +239,7 @@ public class JarSignerResources_zh_CN extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/tools/TimestampedSigner.java b/jdk/src/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java similarity index 98% rename from jdk/src/share/classes/sun/security/tools/TimestampedSigner.java rename to jdk/src/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java index 4848a40dcbc..4b952de1d5b 100644 --- a/jdk/src/share/classes/sun/security/tools/TimestampedSigner.java +++ b/jdk/src/share/classes/sun/security/tools/jarsigner/TimestampedSigner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ * questions. */ -package sun.security.tools; +package sun.security.tools.jarsigner; import java.io.IOException; import java.net.URI; diff --git a/jdk/src/share/classes/sun/security/tools/CertAndKeyGen.java b/jdk/src/share/classes/sun/security/tools/keytool/CertAndKeyGen.java similarity index 99% rename from jdk/src/share/classes/sun/security/tools/CertAndKeyGen.java rename to jdk/src/share/classes/sun/security/tools/keytool/CertAndKeyGen.java index fad412e9f9a..6f557b67a65 100644 --- a/jdk/src/share/classes/sun/security/tools/CertAndKeyGen.java +++ b/jdk/src/share/classes/sun/security/tools/keytool/CertAndKeyGen.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ * questions. */ -package sun.security.tools; +package sun.security.tools.keytool; import java.io.IOException; import java.security.cert.X509Certificate; diff --git a/jdk/src/share/classes/sun/security/tools/KeyTool.java b/jdk/src/share/classes/sun/security/tools/keytool/Main.java similarity index 98% rename from jdk/src/share/classes/sun/security/tools/KeyTool.java rename to jdk/src/share/classes/sun/security/tools/keytool/Main.java index 44fb40d5d5b..fd399fca63a 100644 --- a/jdk/src/share/classes/sun/security/tools/KeyTool.java +++ b/jdk/src/share/classes/sun/security/tools/keytool/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ * questions. */ -package sun.security.tools; +package sun.security.tools.keytool; import java.io.*; import java.security.CodeSigner; @@ -75,12 +75,14 @@ import javax.crypto.SecretKey; import sun.misc.BASE64Decoder; import sun.security.pkcs.PKCS9Attribute; +import sun.security.tools.KeyStoreUtil; +import sun.security.tools.PathList; import sun.security.util.DerValue; import sun.security.x509.*; import static java.security.KeyStore.*; -import static sun.security.tools.KeyTool.Command.*; -import static sun.security.tools.KeyTool.Option.*; +import static sun.security.tools.keytool.Main.Command.*; +import static sun.security.tools.keytool.Main.Option.*; /** * This tool manages keystores. @@ -94,7 +96,7 @@ import static sun.security.tools.KeyTool.Option.*; * * @since 1.2 */ -public final class KeyTool { +public final class Main { private boolean debug = false; private Command command = null; @@ -304,7 +306,6 @@ public final class KeyTool { private static final Class[] PARAM_STRING = { String.class }; - private static final String JKS = "jks"; private static final String NONE = "NONE"; private static final String P11KEYSTORE = "PKCS11"; private static final String P12KEYSTORE = "PKCS12"; @@ -312,17 +313,18 @@ public final class KeyTool { // for i18n private static final java.util.ResourceBundle rb = - java.util.ResourceBundle.getBundle("sun.security.util.Resources"); + java.util.ResourceBundle.getBundle( + "sun.security.tools.keytool.Resources"); private static final Collator collator = Collator.getInstance(); static { // this is for case insensitive string comparisons collator.setStrength(Collator.PRIMARY); }; - private KeyTool() { } + private Main() { } public static void main(String[] args) throws Exception { - KeyTool kt = new KeyTool(); + Main kt = new Main(); kt.run(args, System.out); } @@ -907,7 +909,7 @@ public final class KeyTool { } if (trustcacerts) { - caks = getCacertsKeyStore(); + caks = KeyStoreUtil.getCacertsKeyStore(); } // Perform the specified command @@ -2076,7 +2078,7 @@ public final class KeyTool { for (GeneralName name: names.names()) { if (name.getType() == GeneralNameInterface.NAME_URI) { URIName uriName = (URIName)name.getName(); - for (CRL crl: KeyTool.loadCRLs(uriName.getName())) { + for (CRL crl: loadCRLs(uriName.getName())) { if (crl instanceof X509CRL) { crls.add((X509CRL)crl); } @@ -3370,27 +3372,6 @@ public final class KeyTool { return reply; } - /** - * Returns the keystore with the configured CA certificates. - */ - public static KeyStore getCacertsKeyStore() - throws Exception - { - String sep = File.separator; - File file = new File(System.getProperty("java.home") + sep - + "lib" + sep + "security" + sep - + "cacerts"); - if (!file.exists()) { - return null; - } - KeyStore caks = null; - try (FileInputStream fis = new FileInputStream(file)) { - caks = KeyStore.getInstance(JKS); - caks.load(fis, null); - } - return caks; - } - /** * Stores the (leaf) certificates of a keystore in a hashtable. * All certs belonging to the same CA are stored in a vector that @@ -4056,59 +4037,11 @@ public final class KeyTool { } private char[] getPass(String modifier, String arg) { - char[] output = getPassWithModifier(modifier, arg); + char[] output = KeyStoreUtil.getPassWithModifier(modifier, arg, rb); if (output != null) return output; tinyHelp(); return null; // Useless, tinyHelp() already exits. } - - // This method also used by JarSigner - public static char[] getPassWithModifier(String modifier, String arg) { - if (modifier == null) { - return arg.toCharArray(); - } else if (collator.compare(modifier, "env") == 0) { - String value = System.getenv(arg); - if (value == null) { - System.err.println(rb.getString( - "Cannot.find.environment.variable.") + arg); - return null; - } else { - return value.toCharArray(); - } - } else if (collator.compare(modifier, "file") == 0) { - try { - URL url = null; - try { - url = new URL(arg); - } catch (java.net.MalformedURLException mue) { - File f = new File(arg); - if (f.exists()) { - url = f.toURI().toURL(); - } else { - System.err.println(rb.getString( - "Cannot.find.file.") + arg); - return null; - } - } - BufferedReader br = new BufferedReader(new InputStreamReader( - url.openStream())); - String value = br.readLine(); - br.close(); - if (value == null) { - return new char[0]; - } else { - return value.toCharArray(); - } - } catch (IOException ioe) { - System.err.println(ioe); - return null; - } - } else { - System.err.println(rb.getString("Unknown.password.type.") + - modifier); - return null; - } - } } // This class is exactly the same as com.sun.tools.javac.util.Pair, diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources.java new file mode 100644 index 00000000000..262fe20ea4a --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources.java @@ -0,0 +1,438 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part + {".OPTION.", " [OPTION]..."}, + {"Options.", "Options:"}, + {"Use.keytool.help.for.all.available.commands", + "Use \"keytool -help\" for all available commands"}, + {"Key.and.Certificate.Management.Tool", + "Key and Certificate Management Tool"}, + {"Commands.", "Commands:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "Use \"keytool -command_name -help\" for usage of command_name"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "Generates a certificate request"}, //-certreq + {"Changes.an.entry.s.alias", + "Changes an entry's alias"}, //-changealias + {"Deletes.an.entry", + "Deletes an entry"}, //-delete + {"Exports.certificate", + "Exports certificate"}, //-exportcert + {"Generates.a.key.pair", + "Generates a key pair"}, //-genkeypair + {"Generates.a.secret.key", + "Generates a secret key"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "Generates certificate from a certificate request"}, //-gencert + {"Generates.CRL", "Generates CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Imports entries from a JDK 1.1.x-style identity database"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "Imports a certificate or a certificate chain"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "Imports one or all entries from another keystore"}, //-importkeystore + {"Clones.a.key.entry", + "Clones a key entry"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "Changes the key password of an entry"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "Lists entries in a keystore"}, //-list + {"Prints.the.content.of.a.certificate", + "Prints the content of a certificate"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "Prints the content of a certificate request"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "Prints the content of a CRL file"}, //-printcrl + {"Generates.a.self.signed.certificate", + "Generates a self-signed certificate"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "Changes the store password of a keystore"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "alias name of the entry to process"}, //-alias + {"destination.alias", + "destination alias"}, //-destalias + {"destination.key.password", + "destination key password"}, //-destkeypass + {"destination.keystore.name", + "destination keystore name"}, //-destkeystore + {"destination.keystore.password.protected", + "destination keystore password protected"}, //-destprotected + {"destination.keystore.provider.name", + "destination keystore provider name"}, //-destprovidername + {"destination.keystore.password", + "destination keystore password"}, //-deststorepass + {"destination.keystore.type", + "destination keystore type"}, //-deststoretype + {"distinguished.name", + "distinguished name"}, //-dname + {"X.509.extension", + "X.509 extension"}, //-ext + {"output.file.name", + "output file name"}, //-file and -outfile + {"input.file.name", + "input file name"}, //-file and -infile + {"key.algorithm.name", + "key algorithm name"}, //-keyalg + {"key.password", + "key password"}, //-keypass + {"key.bit.size", + "key bit size"}, //-keysize + {"keystore.name", + "keystore name"}, //-keystore + {"new.password", + "new password"}, //-new + {"do.not.prompt", + "do not prompt"}, //-noprompt + {"password.through.protected.mechanism", + "password through protected mechanism"}, //-protected + {"provider.argument", + "provider argument"}, //-providerarg + {"provider.class.name", + "provider class name"}, //-providerclass + {"provider.name", + "provider name"}, //-providername + {"provider.classpath", + "provider classpath"}, //-providerpath + {"output.in.RFC.style", + "output in RFC style"}, //-rfc + {"signature.algorithm.name", + "signature algorithm name"}, //-sigalg + {"source.alias", + "source alias"}, //-srcalias + {"source.key.password", + "source key password"}, //-srckeypass + {"source.keystore.name", + "source keystore name"}, //-srckeystore + {"source.keystore.password.protected", + "source keystore password protected"}, //-srcprotected + {"source.keystore.provider.name", + "source keystore provider name"}, //-srcprovidername + {"source.keystore.password", + "source keystore password"}, //-srcstorepass + {"source.keystore.type", + "source keystore type"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL server host and port"}, //-sslserver + {"signed.jar.file", + "signed jar file"}, //=jarfile + {"certificate.validity.start.date.time", + "certificate validity start date/time"}, //-startdate + {"keystore.password", + "keystore password"}, //-storepass + {"keystore.type", + "keystore type"}, //-storetype + {"trust.certificates.from.cacerts", + "trust certificates from cacerts"}, //-trustcacerts + {"verbose.output", + "verbose output"}, //-v + {"validity.number.of.days", + "validity number of days"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "Serial ID of cert to revoke"}, //-id + // keytool: Running part + {"keytool.error.", "keytool error: "}, + {"Illegal.option.", "Illegal option: "}, + {"Illegal.value.", "Illegal value: "}, + {"Unknown.password.type.", "Unknown password type: "}, + {"Cannot.find.environment.variable.", + "Cannot find environment variable: "}, + {"Cannot.find.file.", "Cannot find file: "}, + {"Command.option.flag.needs.an.argument.", "Command option {0} needs an argument."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified {0} value."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-keystore must be NONE if -storetype is {0}"}, + {"Too.many.retries.program.terminated", + "Too many retries, program terminated"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "-storepasswd and -keypasswd commands not supported if -storetype is {0}"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "-keypasswd commands not supported if -storetype is PKCS12"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "-keypass and -new can not be specified if -storetype is {0}"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "if -protected is specified, then -storepass, -keypass, and -new must not be specified"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "if -srcprotected is specified, then -srcstorepass and -srckeypass must not be specified"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "if keystore is not password protected, then -storepass, -keypass, and -new must not be specified"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "if source keystore is not password protected, then -srcstorepass and -srckeypass must not be specified"}, + {"Illegal.startdate.value", "Illegal startdate value"}, + {"Validity.must.be.greater.than.zero", + "Validity must be greater than zero"}, + {"provName.not.a.provider", "{0} not a provider"}, + {"Usage.error.no.command.provided", "Usage error: no command provided"}, + {"Source.keystore.file.exists.but.is.empty.", "Source keystore file exists, but is empty: "}, + {"Please.specify.srckeystore", "Please specify -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "Must not specify both -v and -rfc with 'list' command"}, + {"Key.password.must.be.at.least.6.characters", + "Key password must be at least 6 characters"}, + {"New.password.must.be.at.least.6.characters", + "New password must be at least 6 characters"}, + {"Keystore.file.exists.but.is.empty.", + "Keystore file exists, but is empty: "}, + {"Keystore.file.does.not.exist.", + "Keystore file does not exist: "}, + {"Must.specify.destination.alias", "Must specify destination alias"}, + {"Must.specify.alias", "Must specify alias"}, + {"Keystore.password.must.be.at.least.6.characters", + "Keystore password must be at least 6 characters"}, + {"Enter.keystore.password.", "Enter keystore password: "}, + {"Enter.source.keystore.password.", "Enter source keystore password: "}, + {"Enter.destination.keystore.password.", "Enter destination keystore password: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "Keystore password is too short - must be at least 6 characters"}, + {"Unknown.Entry.Type", "Unknown Entry Type"}, + {"Too.many.failures.Alias.not.changed", "Too many failures. Alias not changed"}, + {"Entry.for.alias.alias.successfully.imported.", + "Entry for alias {0} successfully imported."}, + {"Entry.for.alias.alias.not.imported.", "Entry for alias {0} not imported."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "Problem importing entry for alias {0}: {1}.\nEntry for alias {0} not imported."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "Import command completed: {0} entries successfully imported, {1} entries failed or cancelled"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "Warning: Overwriting existing alias {0} in destination keystore"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "Existing entry alias {0} exists, overwrite? [no]: "}, + {"Too.many.failures.try.later", "Too many failures - try later"}, + {"Certification.request.stored.in.file.filename.", + "Certification request stored in file <{0}>"}, + {"Submit.this.to.your.CA", "Submit this to your CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "if alias not specified, destalias, srckeypass, and destkeypass must not be specified"}, + {"Certificate.stored.in.file.filename.", + "Certificate stored in file <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "Certificate reply was installed in keystore"}, + {"Certificate.reply.was.not.installed.in.keystore", + "Certificate reply was not installed in keystore"}, + {"Certificate.was.added.to.keystore", + "Certificate was added to keystore"}, + {"Certificate.was.not.added.to.keystore", + "Certificate was not added to keystore"}, + {".Storing.ksfname.", "[Storing {0}]"}, + {"alias.has.no.public.key.certificate.", + "{0} has no public key (certificate)"}, + {"Cannot.derive.signature.algorithm", + "Cannot derive signature algorithm"}, + {"Alias.alias.does.not.exist", + "Alias <{0}> does not exist"}, + {"Alias.alias.has.no.certificate", + "Alias <{0}> has no certificate"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "Key pair not generated, alias <{0}> already exists"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "Generating {0} bit {1} key pair and self-signed certificate ({2}) with a validity of {3} days\n\tfor: {4}"}, + {"Enter.key.password.for.alias.", "Enter key password for <{0}>"}, + {".RETURN.if.same.as.keystore.password.", + "\t(RETURN if same as keystore password): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "Key password is too short - must be at least 6 characters"}, + {"Too.many.failures.key.not.added.to.keystore", + "Too many failures - key not added to keystore"}, + {"Destination.alias.dest.already.exists", + "Destination alias <{0}> already exists"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "Password is too short - must be at least 6 characters"}, + {"Too.many.failures.Key.entry.not.cloned", + "Too many failures. Key entry not cloned"}, + {"key.password.for.alias.", "key password for <{0}>"}, + {"Keystore.entry.for.id.getName.already.exists", + "Keystore entry for <{0}> already exists"}, + {"Creating.keystore.entry.for.id.getName.", + "Creating keystore entry for <{0}> ..."}, + {"No.entries.from.identity.database.added", + "No entries from identity database added"}, + {"Alias.name.alias", "Alias name: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "Creation date: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Entry type: {0}"}, + {"Certificate.chain.length.", "Certificate chain length: "}, + {"Certificate.i.1.", "Certificate[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Certificate fingerprint (SHA1): "}, + {"Keystore.type.", "Keystore type: "}, + {"Keystore.provider.", "Keystore provider: "}, + {"Your.keystore.contains.keyStore.size.entry", + "Your keystore contains {0,number,integer} entry"}, + {"Your.keystore.contains.keyStore.size.entries", + "Your keystore contains {0,number,integer} entries"}, + {"Failed.to.parse.input", "Failed to parse input"}, + {"Empty.input", "Empty input"}, + {"Not.X.509.certificate", "Not X.509 certificate"}, + {"alias.has.no.public.key", "{0} has no public key"}, + {"alias.has.no.X.509.certificate", "{0} has no X.509 certificate"}, + {"New.certificate.self.signed.", "New certificate (self-signed):"}, + {"Reply.has.no.certificates", "Reply has no certificates"}, + {"Certificate.not.imported.alias.alias.already.exists", + "Certificate not imported, alias <{0}> already exists"}, + {"Input.not.an.X.509.certificate", "Input not an X.509 certificate"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "Certificate already exists in keystore under alias <{0}>"}, + {"Do.you.still.want.to.add.it.no.", + "Do you still want to add it? [no]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "Certificate already exists in system-wide CA keystore under alias <{0}>"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "Do you still want to add it to your own keystore? [no]: "}, + {"Trust.this.certificate.no.", "Trust this certificate? [no]: "}, + {"YES", "YES"}, + {"New.prompt.", "New {0}: "}, + {"Passwords.must.differ", "Passwords must differ"}, + {"Re.enter.new.prompt.", "Re-enter new {0}: "}, + {"Re.enter.new.password.", "Re-enter new password: "}, + {"They.don.t.match.Try.again", "They don't match. Try again"}, + {"Enter.prompt.alias.name.", "Enter {0} alias name: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "Enter new alias name\t(RETURN to cancel import for this entry): "}, + {"Enter.alias.name.", "Enter alias name: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(RETURN if same as for <{0}>)"}, + {".PATTERN.printX509Cert", + "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signature algorithm name: {8}\n\t Version: {9}"}, + {"What.is.your.first.and.last.name.", + "What is your first and last name?"}, + {"What.is.the.name.of.your.organizational.unit.", + "What is the name of your organizational unit?"}, + {"What.is.the.name.of.your.organization.", + "What is the name of your organization?"}, + {"What.is.the.name.of.your.City.or.Locality.", + "What is the name of your City or Locality?"}, + {"What.is.the.name.of.your.State.or.Province.", + "What is the name of your State or Province?"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "What is the two-letter country code for this unit?"}, + {"Is.name.correct.", "Is {0} correct?"}, + {"no", "no"}, + {"yes", "yes"}, + {"y", "y"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "Alias <{0}> has no key"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "Alias <{0}> references an entry type that is not a private key entry. The -keyclone command only supports cloning of private key entries"}, + + {".WARNING.WARNING.WARNING.", + "***************** WARNING WARNING WARNING *****************"}, + {"Signer.d.", "Signer #%d:"}, + {"Timestamp.", "Timestamp:"}, + {"Signature.", "Signature:"}, + {"CRLs.", "CRLs:"}, + {"Certificate.owner.", "Certificate owner: "}, + {"Not.a.signed.jar.file", "Not a signed jar file"}, + {"No.certificate.from.the.SSL.server", + "No certificate from the SSL server"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* The integrity of the information stored in your keystore *\n" + + "* has NOT been verified! In order to verify its integrity, *\n" + + "* you must provide your keystore password. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* The integrity of the information stored in the srckeystore*\n" + + "* has NOT been verified! In order to verify its integrity, *\n" + + "* you must provide the srckeystore password. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "Certificate reply does not contain public key for <{0}>"}, + {"Incomplete.certificate.chain.in.reply", + "Incomplete certificate chain in reply"}, + {"Certificate.chain.in.reply.does.not.verify.", + "Certificate chain in reply does not verify: "}, + {"Top.level.certificate.in.reply.", + "Top-level certificate in reply:\n"}, + {".is.not.trusted.", "... is not trusted. "}, + {"Install.reply.anyway.no.", "Install reply anyway? [no]: "}, + {"NO", "NO"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "Public keys in reply and keystore don't match"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "Certificate reply and certificate in keystore are identical"}, + {"Failed.to.establish.chain.from.reply", + "Failed to establish chain from reply"}, + {"n", "n"}, + {"Wrong.answer.try.again", "Wrong answer, try again"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "Secret Key not generated, alias <{0}> already exists"}, + {"Please.provide.keysize.for.secret.key.generation", + "Please provide -keysize for secret key generation"}, + + {"verified.by.s.in.s", "Verified by %s in %s"}, + {"warning.not.verified.make.sure.keystore.is.correct", + "WARNING: not verified. Make sure -keystore is correct."}, + + {"Extensions.", "Extensions: "}, + {".Empty.value.", "(Empty value)"}, + {"Extension.Request.", "Extension Request:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10 Certificate Request (Version 1.0)\n" + + "Subject: %s\nPublic Key: %s format %s key\n"}, + {"Unknown.keyUsage.type.", "Unknown keyUsage type: "}, + {"Unknown.extendedkeyUsage.type.", "Unknown extendedkeyUsage type: "}, + {"Unknown.AccessDescription.type.", "Unknown AccessDescription type: "}, + {"Unrecognized.GeneralName.type.", "Unrecognized GeneralName type: "}, + {"This.extension.cannot.be.marked.as.critical.", + "This extension cannot be marked as critical. "}, + {"Odd.number.of.hex.digits.found.", "Odd number of hex digits found: "}, + {"Unknown.extension.type.", "Unknown extension type: "}, + {"command.{0}.is.ambiguous.", "command {0} is ambiguous:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java new file mode 100644 index 00000000000..087362c7cec --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_de.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_de extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [Option]..."}, + {"Options.", "Optionen:"}, + {"Use.keytool.help.for.all.available.commands", + "\"keytool -help\" f\u00FCr alle verf\u00FCgbaren Befehle verwenden"}, + {"Key.and.Certificate.Management.Tool", + "Schl\u00FCssel- und Zertifikatsverwaltungstool"}, + {"Commands.", "Befehle:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "\"keytool -command_name -help\" f\u00FCr Verwendung von command_name verwenden"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "Generiert eine Zertifikatanforderung"}, //-certreq + {"Changes.an.entry.s.alias", + "\u00C4ndert den Alias eines Eintrags"}, //-changealias + {"Deletes.an.entry", + "L\u00F6scht einen Eintrag"}, //-delete + {"Exports.certificate", + "Exportiert ein Zertifikat"}, //-exportcert + {"Generates.a.key.pair", + "Generiert ein Schl\u00FCsselpaar"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "Generiert einen Secret Key"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "Generiert ein Zertifikat aus einer Zertifikatanforderung"}, //-gencert + {"Generates.CRL", "Generiert eine CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Importiert Eintr\u00E4ge aus einer Identity-Datenbank im JDK 1.1.x-Stil"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "Importiert ein Zertifikat oder eine Zertifikatkette"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "Importiert einen oder alle Eintr\u00E4ge aus einem anderen Keystore"}, //-importkeystore + {"Clones.a.key.entry", + "Clont einen Schl\u00FCsseleintrag"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "\u00C4ndert das Schl\u00FCsselkennwort eines Eintrags"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "Listet die Eintr\u00E4ge in einem Keystore auf"}, //-list + {"Prints.the.content.of.a.certificate", + "Druckt den Content eines Zertifikats"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "Druckt den Content einer Zertifikatanforderung"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "Druckt den Content einer CRL-Datei"}, //-printcrl + {"Generates.a.self.signed.certificate", + "Generiert ein selbst signiertes Zertifikat"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "\u00C4ndert das Speicherkennwort eines Keystores"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "Aliasname des zu verarbeitenden Eintrags"}, //-alias + {"destination.alias", + "Zielalias"}, //-destalias + {"destination.key.password", + "Zielschl\u00FCssel-Kennwort"}, //-destkeypass + {"destination.keystore.name", + "Ziel-Keystore-Name"}, //-destkeystore + {"destination.keystore.password.protected", + "Ziel-Keystore kennwortgesch\u00FCtzt"}, //-destprotected + {"destination.keystore.provider.name", + "Ziel-Keystore-Providername"}, //-destprovidername + {"destination.keystore.password", + "Ziel-Keystore-Kennwort"}, //-deststorepass + {"destination.keystore.type", + "Ziel-Keystore-Typ"}, //-deststoretype + {"distinguished.name", + "Distinguished Name"}, //-dname + {"X.509.extension", + "X.509-Erweiterung"}, //-ext + {"output.file.name", + "Ausgabedateiname"}, //-file and -outfile + {"input.file.name", + "Eingabedateiname"}, //-file and -infile + {"key.algorithm.name", + "Schl\u00FCsselalgorithmusname"}, //-keyalg + {"key.password", + "Schl\u00FCsselkennwort"}, //-keypass + {"key.bit.size", + "Schl\u00FCsselbitgr\u00F6\u00DFe"}, //-keysize + {"keystore.name", + "Keystore-Name"}, //-keystore + {"new.password", + "Neues Kennwort"}, //-new + {"do.not.prompt", + "Kein Prompt"}, //-noprompt + {"password.through.protected.mechanism", + "Kennwort \u00FCber gesch\u00FCtzten Mechanismus"}, //-protected + {"provider.argument", + "Providerargument"}, //-providerarg + {"provider.class.name", + "Providerklassenname"}, //-providerclass + {"provider.name", + "Providername"}, //-providername + {"provider.classpath", + "Provider-Classpath"}, //-providerpath + {"output.in.RFC.style", + "Ausgabe in RFC-Stil"}, //-rfc + {"signature.algorithm.name", + "Signaturalgorithmusname"}, //-sigalg + {"source.alias", + "Quellalias"}, //-srcalias + {"source.key.password", + "Quellschl\u00FCssel-Kennwort"}, //-srckeypass + {"source.keystore.name", + "Quell-Keystore-Name"}, //-srckeystore + {"source.keystore.password.protected", + "Quell-Keystore kennwortgesch\u00FCtzt"}, //-srcprotected + {"source.keystore.provider.name", + "Quell-Keystore-Providername"}, //-srcprovidername + {"source.keystore.password", + "Quell-Keystore-Kennwort"}, //-srcstorepass + {"source.keystore.type", + "Quell-Keystore-Typ"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL-Serverhost und -port"}, //-sslserver + {"signed.jar.file", + "Signierte JAR-Datei"}, //=jarfile + {"certificate.validity.start.date.time", + "Anfangsdatum/-zeit f\u00FCr Zertifikatsg\u00FCltigkeit"}, //-startdate + {"keystore.password", + "Keystore-Kennwort"}, //-storepass + {"keystore.type", + "Keystore-Typ"}, //-storetype + {"trust.certificates.from.cacerts", + "Zertifikaten aus cacerts vertrauen"}, //-trustcacerts + {"verbose.output", + "Verbose-Ausgabe"}, //-v + {"validity.number.of.days", + "G\u00FCltigkeitsdauer (Tage)"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "Serielle ID des zu entziehenden Certs"}, //-id + // keytool: Running part + {"keytool.error.", "Keytool-Fehler: "}, + {"Illegal.option.", "Ung\u00FCltige Option: "}, + {"Illegal.value.", "Ung\u00FCltiger Wert: "}, + {"Unknown.password.type.", "Unbekannter Kennworttyp: "}, + {"Cannot.find.environment.variable.", + "Umgebungsvariable kann nicht gefunden werden: "}, + {"Cannot.find.file.", "Datei kann nicht gefunden werden: "}, + {"Command.option.flag.needs.an.argument.", "Befehlsoption {0} ben\u00F6tigt ein Argument."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "Warnung: Keine Unterst\u00FCtzung f\u00FCr unterschiedliche Speicher- und Schl\u00FCsselkennw\u00F6rter bei PKCS12 KeyStores. Der benutzerdefinierte Wert {0} wird ignoriert."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-keystore muss NONE sein, wenn -storetype {0} ist"}, + {"Too.many.retries.program.terminated", + "Zu viele erneute Versuche. Programm wird beendet"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "Befehle -storepasswd und -keypasswd werden nicht unterst\u00FCtzt, wenn -storetype {0} ist"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "Befehle des Typs -keypasswd werden nicht unterst\u00FCtzt, wenn -storetype PKCS12 ist"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "-keypass und -new k\u00F6nnen nicht angegeben werden, wenn -storetype {0} ist"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "Wenn -protected angegeben ist, d\u00FCrfen -storepass, -keypass und -new nicht angegeben werden"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Wenn -srcprotected angegeben ist, d\u00FCrfen -srcstorepass und -srckeypass nicht angegeben werden"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "Wenn der Keystore nicht kennwortgesch\u00FCtzt ist, d\u00FCrfen -storepass, -keypass und -new nicht angegeben werden"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Wenn der Quell-Keystore nicht kennwortgesch\u00FCtzt ist, d\u00FCrfen -srcstorepass und -srckeypass nicht angegeben werden"}, + {"Illegal.startdate.value", "Ung\u00FCltiger Wert f\u00FCr Anfangsdatum"}, + {"Validity.must.be.greater.than.zero", + "G\u00FCltigkeit muss gr\u00F6\u00DFer als null sein"}, + {"provName.not.a.provider", "{0} kein Provider"}, + {"Usage.error.no.command.provided", "Verwendungsfehler: Kein Befehl angegeben"}, + {"Source.keystore.file.exists.but.is.empty.", "Quell-Keystore-Datei ist zwar vorhanden, ist aber leer: "}, + {"Please.specify.srckeystore", "Geben Sie -srckeystore an"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "-v und -rfc d\u00FCrfen bei Befehl \"list\" nicht beide angegeben werden"}, + {"Key.password.must.be.at.least.6.characters", + "Schl\u00FCsselkennwort muss mindestens sechs Zeichen lang sein"}, + {"New.password.must.be.at.least.6.characters", + "Neues Kennwort muss mindestens sechs Zeichen lang sein"}, + {"Keystore.file.exists.but.is.empty.", + "Keystore-Datei ist vorhanden, ist aber leer: "}, + {"Keystore.file.does.not.exist.", + "Keystore-Datei ist nicht vorhanden: "}, + {"Must.specify.destination.alias", "Sie m\u00FCssen einen Zielalias angeben"}, + {"Must.specify.alias", "Sie m\u00FCssen einen Alias angeben"}, + {"Keystore.password.must.be.at.least.6.characters", + "Keystore-Kennwort muss mindestens sechs Zeichen lang sein"}, + {"Enter.keystore.password.", "Keystore-Kennwort eingeben: "}, + {"Enter.source.keystore.password.", "Quell-Keystore-Kennwort eingeben: "}, + {"Enter.destination.keystore.password.", "Ziel-Keystore-Kennwort eingeben: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "Keystore-Kennwort ist zu kurz. Es muss mindestens sechs Zeichen lang sein"}, + {"Unknown.Entry.Type", "Unbekannter Eintragstyp"}, + {"Too.many.failures.Alias.not.changed", "Zu viele Fehler. Alias nicht ge\u00E4ndert"}, + {"Entry.for.alias.alias.successfully.imported.", + "Eintrag f\u00FCr Alias {0} erfolgreich importiert."}, + {"Entry.for.alias.alias.not.imported.", "Eintrag f\u00FCr Alias {0} nicht importiert."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "Problem beim Importieren des Eintrags f\u00FCr Alias {0}: {1}.\nEintrag f\u00FCr Alias {0} nicht importiert."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "Importbefehl abgeschlossen: {0} Eintr\u00E4ge erfolgreich importiert, {1} Eintr\u00E4ge nicht erfolgreich oder abgebrochen"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "Warnung: Vorhandener Alias {0} in Ziel-Keystore wird \u00FCberschrieben"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "Eintragsalias {0} ist bereits vorhanden. \u00DCberschreiben? [Nein]: "}, + {"Too.many.failures.try.later", "Zu viele Fehler. Versuchen Sie es sp\u00E4ter erneut"}, + {"Certification.request.stored.in.file.filename.", + "Zertifizierungsanforderung in Datei <{0}> gespeichert"}, + {"Submit.this.to.your.CA", "Leiten Sie dies an die CA weiter"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "Wenn kein Alias angegeben ist, d\u00FCrfen destalias, srckeypass und destkeypass nicht angegeben werden"}, + {"Certificate.stored.in.file.filename.", + "Zertifikat in Datei <{0}> gespeichert"}, + {"Certificate.reply.was.installed.in.keystore", + "Zertifikatantwort wurde in Keystore installiert"}, + {"Certificate.reply.was.not.installed.in.keystore", + "Zertifikatantwort wurde nicht in Keystore installiert"}, + {"Certificate.was.added.to.keystore", + "Zertifikat wurde Keystore hinzugef\u00FCgt"}, + {"Certificate.was.not.added.to.keystore", + "Zertifikat wurde nicht zu Keystore hinzugef\u00FCgt"}, + {".Storing.ksfname.", "[{0} wird gesichert]"}, + {"alias.has.no.public.key.certificate.", + "{0} hat keinen Public Key (Zertifikat)"}, + {"Cannot.derive.signature.algorithm", + "Signaturalgorithmus kann nicht abgeleitet werden"}, + {"Alias.alias.does.not.exist", + "Alias <{0}> ist nicht vorhanden"}, + {"Alias.alias.has.no.certificate", + "Alias <{0}> hat kein Zertifikat"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "Schl\u00FCsselpaar wurde nicht generiert. Alias <{0}> ist bereits vorhanden"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "Generieren von Schl\u00FCsselpaar (Typ {1}, {0} Bit) und selbst signiertem Zertifikat ({2}) mit einer G\u00FCltigkeit von {3} Tagen\n\tf\u00FCr: {4}"}, + {"Enter.key.password.for.alias.", "Schl\u00FCsselkennwort f\u00FCr <{0}> eingeben"}, + {".RETURN.if.same.as.keystore.password.", + "\t(RETURN, wenn identisch mit Keystore-Kennwort): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "Schl\u00FCsselkennwort ist zu kurz. Es muss mindestens sechs Zeichen lang sein"}, + {"Too.many.failures.key.not.added.to.keystore", + "Zu viele Fehler. Schl\u00FCssel wurde nicht zu Keystore hinzugef\u00FCgt"}, + {"Destination.alias.dest.already.exists", + "Zielalias <{0}> bereits vorhanden"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "Kennwort ist zu kurz. Es muss mindestens sechs Zeichen lang sein"}, + {"Too.many.failures.Key.entry.not.cloned", + "Zu viele Fehler. Schl\u00FCsseleintrag wurde nicht geclont"}, + {"key.password.for.alias.", "Schl\u00FCsselkennwort f\u00FCr <{0}>"}, + {"Keystore.entry.for.id.getName.already.exists", + "Keystore-Eintrag f\u00FCr <{0}> bereits vorhanden"}, + {"Creating.keystore.entry.for.id.getName.", + "Keystore-Eintrag f\u00FCr <{0}> wird erstellt..."}, + {"No.entries.from.identity.database.added", + "Keine Eintr\u00E4ge aus Identity-Datenbank hinzugef\u00FCgt"}, + {"Alias.name.alias", "Aliasname: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "Erstellungsdatum: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Eintragstyp: {0}"}, + {"Certificate.chain.length.", "Zertifikatkettenl\u00E4nge: "}, + {"Certificate.i.1.", "Zertifikat[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Zertifikat-Fingerprint (SHA1): "}, + {"Keystore.type.", "Keystore-Typ: "}, + {"Keystore.provider.", "Keystore-Provider: "}, + {"Your.keystore.contains.keyStore.size.entry", + "Keystore enth\u00E4lt {0,number,integer} Eintrag"}, + {"Your.keystore.contains.keyStore.size.entries", + "Keystore enth\u00E4lt {0,number,integer} Eintr\u00E4ge"}, + {"Failed.to.parse.input", "Eingabe konnte nicht geparst werden"}, + {"Empty.input", "Leere Eingabe"}, + {"Not.X.509.certificate", "Kein X.509-Zertifikat"}, + {"alias.has.no.public.key", "{0} hat keinen Public Key"}, + {"alias.has.no.X.509.certificate", "{0} hat kein X.509-Zertifikat"}, + {"New.certificate.self.signed.", "Neues Zertifikat (selbst signiert):"}, + {"Reply.has.no.certificates", "Antwort hat keine Zertifikate"}, + {"Certificate.not.imported.alias.alias.already.exists", + "Zertifikat nicht importiert. Alias <{0}> ist bereits vorhanden"}, + {"Input.not.an.X.509.certificate", "Eingabe kein X.509-Zertifikat"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "Zertifikat ist bereits unter Alias <{0}> im Keystore vorhanden"}, + {"Do.you.still.want.to.add.it.no.", + "M\u00F6chten Sie es trotzdem hinzuf\u00FCgen? [Nein]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "Zertifikat ist bereits unter Alias <{0}> im systemweiten CA-Keystore vorhanden"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "M\u00F6chten Sie es trotzdem zu Ihrem eigenen Keystore hinzuf\u00FCgen? [Nein]: "}, + {"Trust.this.certificate.no.", "Diesem Zertifikat vertrauen? [Nein]: "}, + {"YES", "Ja"}, + {"New.prompt.", "Neues {0}: "}, + {"Passwords.must.differ", "Kennw\u00F6rter m\u00FCssen sich unterscheiden"}, + {"Re.enter.new.prompt.", "Neues {0} erneut eingeben: "}, + {"Re.enter.new.password.", "Neues Kennwort erneut eingeben: "}, + {"They.don.t.match.Try.again", "Keine \u00DCbereinstimmung. Wiederholen Sie den Vorgang"}, + {"Enter.prompt.alias.name.", "{0}-Aliasnamen eingeben: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "Geben Sie einen neuen Aliasnamen ein\t(RETURN, um den Import dieses Eintrags abzubrechen): "}, + {"Enter.alias.name.", "Aliasnamen eingeben: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(RETURN, wenn identisch mit <{0}>)"}, + {".PATTERN.printX509Cert", + "Eigent\u00FCmer: {0}\nAussteller: {1}\nSeriennummer: {2}\nG\u00FCltig von: {3} bis: {4}\nZertifikat-Fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signaturalgorithmusname: {8}\n\t Version: {9}"}, + {"What.is.your.first.and.last.name.", + "Wie lautet Ihr Vor- und Nachname?"}, + {"What.is.the.name.of.your.organizational.unit.", + "Wie lautet der Name Ihrer organisatorischen Einheit?"}, + {"What.is.the.name.of.your.organization.", + "Wie lautet der Name Ihrer Organisation?"}, + {"What.is.the.name.of.your.City.or.Locality.", + "Wie lautet der Name Ihrer Stadt oder Gemeinde?"}, + {"What.is.the.name.of.your.State.or.Province.", + "Wie lautet der Name Ihres Bundeslands?"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "Wie lautet der L\u00E4ndercode (zwei Buchstaben) f\u00FCr diese Einheit?"}, + {"Is.name.correct.", "Ist {0} richtig?"}, + {"no", "Nein"}, + {"yes", "Ja"}, + {"y", "J"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "Alias <{0}> verf\u00FCgt \u00FCber keinen Schl\u00FCssel"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "Alias <{0}> verweist auf einen Eintragstyp, der kein Private Key-Eintrag ist. Der Befehl -keyclone unterst\u00FCtzt nur das Clonen von Private Key-Eintr\u00E4gen"}, + + {".WARNING.WARNING.WARNING.", + "***************** Warnung Warnung Warnung *****************"}, + {"Signer.d.", "Signaturgeber #%d:"}, + {"Timestamp.", "Zeitstempel:"}, + {"Signature.", "Signatur:"}, + {"CRLs.", "CRLs:"}, + {"Certificate.owner.", "Zertifikateigent\u00FCmer: "}, + {"Not.a.signed.jar.file", "Keine signierte JAR-Datei"}, + {"No.certificate.from.the.SSL.server", + "Kein Zertifikat vom SSL-Server"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* Die Integrit\u00E4t der Informationen, die in Ihrem Keystore gespeichert sind, *\n* wurde NICHT gepr\u00FCft. Um die Integrit\u00E4t zu pr\u00FCfen, *\n* m\u00FCssen Sie Ihr Keystore-Kennwort angeben. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* Die Integrit\u00E4t der Informationen, die in Ihrem Srckeystore gespeichert sind, *\n* wurde NICHT gepr\u00FCft. Um die Integrit\u00E4t zu pr\u00FCfen, *\n* m\u00FCssen Sie Ihr Srckeystore-Kennwort angeben. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "Zertifikatantwort enth\u00E4lt keinen Public Key f\u00FCr <{0}>"}, + {"Incomplete.certificate.chain.in.reply", + "Unvollst\u00E4ndige Zertifikatkette in Antwort"}, + {"Certificate.chain.in.reply.does.not.verify.", + "Zertifikatkette in Antwort verifiziert nicht: "}, + {"Top.level.certificate.in.reply.", + "Zertifikat der obersten Ebene in Antwort:\n"}, + {".is.not.trusted.", "... ist nicht vertrauensw\u00FCrdig. "}, + {"Install.reply.anyway.no.", "Antwort trotzdem installieren? [Nein]: "}, + {"NO", "Nein"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "Public Keys in Antwort und Keystore stimmen nicht \u00FCberein"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "Zertifikatantwort und Zertifikat in Keystore sind identisch"}, + {"Failed.to.establish.chain.from.reply", + "Kette konnte der Antwort nicht entnommen werden"}, + {"n", "N"}, + {"Wrong.answer.try.again", "Falsche Antwort. Wiederholen Sie den Vorgang"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "Secret Key wurde nicht generiert. Alias <{0}> ist bereits vorhanden"}, + {"Please.provide.keysize.for.secret.key.generation", + "Geben Sie -keysize zum Erstellen eines Secret Keys an"}, + + {"Extensions.", "Erweiterungen: "}, + {".Empty.value.", "(Leerer Wert)"}, + {"Extension.Request.", "Erweiterungsanforderung:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10-Zertifikatanforderung (Version 1.0)\nSubjekt: %s\nPublic Key: %s Format %s Schl\u00FCssel\n"}, + {"Unknown.keyUsage.type.", "Unbekannter keyUsage-Typ: "}, + {"Unknown.extendedkeyUsage.type.", "Unbekannter extendedkeyUsage-Typ: "}, + {"Unknown.AccessDescription.type.", "Unbekannter AccessDescription-Typ: "}, + {"Unrecognized.GeneralName.type.", "Unbekannter GeneralName-Typ: "}, + {"This.extension.cannot.be.marked.as.critical.", + "Erweiterung kann nicht als \"Kritisch\" markiert werden. "}, + {"Odd.number.of.hex.digits.found.", "Ungerade Anzahl hexadezimaler Ziffern gefunden: "}, + {"Unknown.extension.type.", "Unbekannter Erweiterungstyp: "}, + {"command.{0}.is.ambiguous.", "Befehl {0} ist mehrdeutig:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_es.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_es.java new file mode 100644 index 00000000000..942c0ecf086 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_es.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_es extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [Opci\u00F3n]..."}, + {"Options.", "Opciones:"}, + {"Use.keytool.help.for.all.available.commands", + "Utilice\"keytool -help\" para todos los comandos disponibles"}, + {"Key.and.Certificate.Management.Tool", + "Herramienta de Gesti\u00F3n de Certificados y Claves"}, + {"Commands.", "Comandos:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "Utilice \"keytool -command_name -help\" para la sintaxis de nombre_comando"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "Genera una solicitud de certificado"}, //-certreq + {"Changes.an.entry.s.alias", + "Cambia un alias de entrada"}, //-changealias + {"Deletes.an.entry", + "Suprime una entrada"}, //-delete + {"Exports.certificate", + "Exporta el certificado"}, //-exportcert + {"Generates.a.key.pair", + "Genera un par de claves"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "Genera un clave secreta"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "Genera un certificado a partir de una solicitud de certificado"}, //-gencert + {"Generates.CRL", "Genera CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Importa entradas desde una base de datos de identidades JDK 1.1.x-style"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "Importa un certificado o una cadena de certificados"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "Importa una o todas las entradas desde otro almac\u00E9n de claves"}, //-importkeystore + {"Clones.a.key.entry", + "Clona una entrada de clave"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "Cambia la contrase\u00F1a de clave de una entrada"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "Enumera las entradas de un almac\u00E9n de claves"}, //-list + {"Prints.the.content.of.a.certificate", + "Imprime el contenido de un certificado"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "Imprime el contenido de una solicitud de certificado"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "Imprime el contenido de un archivo CRL"}, //-printcrl + {"Generates.a.self.signed.certificate", + "Genera un certificado autofirmado"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "Cambia la contrase\u00F1a de almac\u00E9n de un almac\u00E9n de claves"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "nombre de alias de la entrada que se va a procesar"}, //-alias + {"destination.alias", + "alias de destino"}, //-destalias + {"destination.key.password", + "contrase\u00F1a de clave de destino"}, //-destkeypass + {"destination.keystore.name", + "nombre de almac\u00E9n de claves de destino"}, //-destkeystore + {"destination.keystore.password.protected", + "almac\u00E9n de claves de destino protegido por contrase\u00F1a"}, //-destprotected + {"destination.keystore.provider.name", + "nombre de proveedor de almac\u00E9n de claves de destino"}, //-destprovidername + {"destination.keystore.password", + "contrase\u00F1a de almac\u00E9n de claves de destino"}, //-deststorepass + {"destination.keystore.type", + "tipo de almac\u00E9n de claves de destino"}, //-deststoretype + {"distinguished.name", + "nombre distintivo"}, //-dname + {"X.509.extension", + "extensi\u00F3n X.509"}, //-ext + {"output.file.name", + "nombre de archivo de salida"}, //-file and -outfile + {"input.file.name", + "nombre de archivo de entrada"}, //-file and -infile + {"key.algorithm.name", + "nombre de algoritmo de clave"}, //-keyalg + {"key.password", + "contrase\u00F1a de clave"}, //-keypass + {"key.bit.size", + "tama\u00F1o de bit de clave"}, //-keysize + {"keystore.name", + "nombre de almac\u00E9n de claves"}, //-keystore + {"new.password", + "nueva contrase\u00F1a"}, //-new + {"do.not.prompt", + "no solicitar"}, //-noprompt + {"password.through.protected.mechanism", + "contrase\u00F1a a trav\u00E9s de mecanismo protegido"}, //-protected + {"provider.argument", + "argumento del proveedor"}, //-providerarg + {"provider.class.name", + "nombre de clase del proveedor"}, //-providerclass + {"provider.name", + "nombre del proveedor"}, //-providername + {"provider.classpath", + "classpath de proveedor"}, //-providerpath + {"output.in.RFC.style", + "salida en estilo RFC"}, //-rfc + {"signature.algorithm.name", + "nombre de algoritmo de firma"}, //-sigalg + {"source.alias", + "alias de origen"}, //-srcalias + {"source.key.password", + "contrase\u00F1a de clave de origen"}, //-srckeypass + {"source.keystore.name", + "nombre de almac\u00E9n de claves de origen"}, //-srckeystore + {"source.keystore.password.protected", + "almac\u00E9n de claves de origen protegido por contrase\u00F1a"}, //-srcprotected + {"source.keystore.provider.name", + "nombre de proveedor de almac\u00E9n de claves de origen"}, //-srcprovidername + {"source.keystore.password", + "contrase\u00F1a de almac\u00E9n de claves de origen"}, //-srcstorepass + {"source.keystore.type", + "tipo de almac\u00E9n de claves de origen"}, //-srcstoretype + {"SSL.server.host.and.port", + "puerto y host del servidor SSL"}, //-sslserver + {"signed.jar.file", + "archivo jar firmado"}, //=jarfile + {"certificate.validity.start.date.time", + "fecha/hora de inicio de validez del certificado"}, //-startdate + {"keystore.password", + "contrase\u00F1a de almac\u00E9n de claves"}, //-storepass + {"keystore.type", + "tipo de almac\u00E9n de claves"}, //-storetype + {"trust.certificates.from.cacerts", + "certificados de protecci\u00F3n de cacerts"}, //-trustcacerts + {"verbose.output", + "salida detallada"}, //-v + {"validity.number.of.days", + "n\u00FAmero de validez de d\u00EDas"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "identificador de serie del certificado que se va a revocar"}, //-id + // keytool: Running part + {"keytool.error.", "error de herramienta de claves: "}, + {"Illegal.option.", "Opci\u00F3n no permitida: "}, + {"Illegal.value.", "Valor no permitido: "}, + {"Unknown.password.type.", "Tipo de contrase\u00F1a desconocido: "}, + {"Cannot.find.environment.variable.", + "No se ha encontrado la variable del entorno: "}, + {"Cannot.find.file.", "No se ha encontrado el archivo: "}, + {"Command.option.flag.needs.an.argument.", "La opci\u00F3n de comando {0} necesita un argumento."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "Advertencia: los almacenes de claves en formato PKCS12 no admiten contrase\u00F1as de clave y almacenamiento distintas. Se ignorar\u00E1 el valor especificado por el usuario, {0}."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-keystore debe ser NONE si -storetype es {0}"}, + {"Too.many.retries.program.terminated", + "Ha habido demasiados intentos, se ha cerrado el programa"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "Los comandos -storepasswd y -keypasswd no est\u00E1n soportados si -storetype es {0}"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "Los comandos -keypasswd no est\u00E1n soportados si -storetype es PKCS12"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "-keypass y -new no se pueden especificar si -storetype es {0}"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "si se especifica -protected, no deben especificarse -storepass, -keypass ni -new"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Si se especifica -srcprotected, no se puede especificar -srcstorepass ni -srckeypass"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "Si keystore no est\u00E1 protegido por contrase\u00F1a, no se deben especificar -storepass, -keypass ni -new"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Si el almac\u00E9n de claves de origen no est\u00E1 protegido por contrase\u00F1a, no se deben especificar -srcstorepass ni -srckeypass"}, + {"Illegal.startdate.value", "Valor de fecha de inicio no permitido"}, + {"Validity.must.be.greater.than.zero", + "La validez debe ser mayor que cero"}, + {"provName.not.a.provider", "{0} no es un proveedor"}, + {"Usage.error.no.command.provided", "Error de sintaxis: no se ha proporcionado ning\u00FAn comando"}, + {"Source.keystore.file.exists.but.is.empty.", "El archivo de almac\u00E9n de claves de origen existe, pero est\u00E1 vac\u00EDo: "}, + {"Please.specify.srckeystore", "Especifique -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "No se deben especificar -v y -rfc simult\u00E1neamente con el comando 'list'"}, + {"Key.password.must.be.at.least.6.characters", + "La contrase\u00F1a de clave debe tener al menos 6 caracteres"}, + {"New.password.must.be.at.least.6.characters", + "La nueva contrase\u00F1a debe tener al menos 6 caracteres"}, + {"Keystore.file.exists.but.is.empty.", + "El archivo de almac\u00E9n de claves existe, pero est\u00E1 vac\u00EDo: "}, + {"Keystore.file.does.not.exist.", + "El archivo de almac\u00E9n de claves no existe: "}, + {"Must.specify.destination.alias", "Se debe especificar un alias de destino"}, + {"Must.specify.alias", "Se debe especificar un alias"}, + {"Keystore.password.must.be.at.least.6.characters", + "La contrase\u00F1a del almac\u00E9n de claves debe tener al menos 6 caracteres"}, + {"Enter.keystore.password.", "Introduzca la contrase\u00F1a del almac\u00E9n de claves: "}, + {"Enter.source.keystore.password.", "Introduzca la contrase\u00F1a de almac\u00E9n de claves de origen: "}, + {"Enter.destination.keystore.password.", "Introduzca la contrase\u00F1a de almac\u00E9n de claves de destino: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "La contrase\u00F1a del almac\u00E9n de claves es demasiado corta, debe tener al menos 6 caracteres"}, + {"Unknown.Entry.Type", "Tipo de Entrada Desconocido"}, + {"Too.many.failures.Alias.not.changed", "Demasiados fallos. No se ha cambiado el alias"}, + {"Entry.for.alias.alias.successfully.imported.", + "La entrada del alias {0} se ha importado correctamente."}, + {"Entry.for.alias.alias.not.imported.", "La entrada del alias {0} no se ha importado."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "Problema al importar la entrada del alias {0}: {1}.\nNo se ha importado la entrada del alias {0}."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "Comando de importaci\u00F3n completado: {0} entradas importadas correctamente, {1} entradas incorrectas o canceladas"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "Advertencia: se sobrescribir\u00E1 el alias {0} en el almac\u00E9n de claves de destino"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "El alias de entrada existente {0} ya existe, \u00BFdesea sobrescribirlo? [no]: "}, + {"Too.many.failures.try.later", "Demasiados fallos; int\u00E9ntelo m\u00E1s adelante"}, + {"Certification.request.stored.in.file.filename.", + "Solicitud de certificaci\u00F3n almacenada en el archivo <{0}>"}, + {"Submit.this.to.your.CA", "Enviar a la CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "si no se especifica el alias, no se puede especificar destalias, srckeypass ni destkeypass"}, + {"Certificate.stored.in.file.filename.", + "Certificado almacenado en el archivo <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "Se ha instalado la respuesta del certificado en el almac\u00E9n de claves"}, + {"Certificate.reply.was.not.installed.in.keystore", + "No se ha instalado la respuesta del certificado en el almac\u00E9n de claves"}, + {"Certificate.was.added.to.keystore", + "Se ha agregado el certificado al almac\u00E9n de claves"}, + {"Certificate.was.not.added.to.keystore", + "No se ha agregado el certificado al almac\u00E9n de claves"}, + {".Storing.ksfname.", "[Almacenando {0}]"}, + {"alias.has.no.public.key.certificate.", + "{0} no tiene clave p\u00FAblica (certificado)"}, + {"Cannot.derive.signature.algorithm", + "No se puede derivar el algoritmo de firma"}, + {"Alias.alias.does.not.exist", + "El alias <{0}> no existe"}, + {"Alias.alias.has.no.certificate", + "El alias <{0}> no tiene certificado"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "No se ha generado el par de claves, el alias <{0}> ya existe"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "Generando par de claves {1} de {0} bits para certificado autofirmado ({2}) con una validez de {3} d\u00EDas\n\tpara: {4}"}, + {"Enter.key.password.for.alias.", "Introduzca la contrase\u00F1a de clave para <{0}>"}, + {".RETURN.if.same.as.keystore.password.", + "\t(INTRO si es la misma contrase\u00F1a que la del almac\u00E9n de claves): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "La contrase\u00F1a de clave es demasiado corta; debe tener al menos 6 caracteres"}, + {"Too.many.failures.key.not.added.to.keystore", + "Demasiados fallos; no se ha agregado la clave al almac\u00E9n de claves"}, + {"Destination.alias.dest.already.exists", + "El alias de destino <{0}> ya existe"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "La contrase\u00F1a es demasiado corta; debe tener al menos 6 caracteres"}, + {"Too.many.failures.Key.entry.not.cloned", + "Demasiados fallos. No se ha clonado la entrada de clave"}, + {"key.password.for.alias.", "contrase\u00F1a de clave para <{0}>"}, + {"Keystore.entry.for.id.getName.already.exists", + "La entrada de almac\u00E9n de claves para <{0}> ya existe"}, + {"Creating.keystore.entry.for.id.getName.", + "Creando entrada de almac\u00E9n de claves para <{0}> ..."}, + {"No.entries.from.identity.database.added", + "No se han agregado entradas de la base de datos de identidades"}, + {"Alias.name.alias", "Nombre de Alias: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "Fecha de Creaci\u00F3n: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Tipo de Entrada: {0}"}, + {"Certificate.chain.length.", "Longitud de la Cadena de Certificado: "}, + {"Certificate.i.1.", "Certificado[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Huella Digital de Certificado (SHA1): "}, + {"Keystore.type.", "Tipo de Almac\u00E9n de Claves: "}, + {"Keystore.provider.", "Proveedor de Almac\u00E9n de Claves: "}, + {"Your.keystore.contains.keyStore.size.entry", + "Su almac\u00E9n de claves contiene {0,number,integer} entrada"}, + {"Your.keystore.contains.keyStore.size.entries", + "Su almac\u00E9n de claves contiene {0,number,integer} entradas"}, + {"Failed.to.parse.input", "Fallo al analizar la entrada"}, + {"Empty.input", "Entrada vac\u00EDa"}, + {"Not.X.509.certificate", "No es un certificado X.509"}, + {"alias.has.no.public.key", "{0} no tiene clave p\u00FAblica"}, + {"alias.has.no.X.509.certificate", "{0} no tiene certificado X.509"}, + {"New.certificate.self.signed.", "Nuevo Certificado (Autofirmado):"}, + {"Reply.has.no.certificates", "La respuesta no tiene certificados"}, + {"Certificate.not.imported.alias.alias.already.exists", + "Certificado no importado, el alias <{0}> ya existe"}, + {"Input.not.an.X.509.certificate", "La entrada no es un certificado X.509"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "El certificado ya existe en el almac\u00E9n de claves con el alias <{0}>"}, + {"Do.you.still.want.to.add.it.no.", + "\u00BFA\u00FAn desea agregarlo? [no]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "El certificado ya existe en el almac\u00E9n de claves de la CA del sistema, con el alias <{0}>"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "\u00BFA\u00FAn desea agregarlo a su propio almac\u00E9n de claves? [no]: "}, + {"Trust.this.certificate.no.", "\u00BFConfiar en este certificado? [no]: "}, + {"YES", "S\u00ED"}, + {"New.prompt.", "Nuevo {0}: "}, + {"Passwords.must.differ", "Las contrase\u00F1as deben ser distintas"}, + {"Re.enter.new.prompt.", "Vuelva a escribir el nuevo {0}: "}, + {"Re.enter.new.password.", "Volver a escribir la contrase\u00F1a nueva: "}, + {"They.don.t.match.Try.again", "No coinciden. Int\u00E9ntelo de nuevo"}, + {"Enter.prompt.alias.name.", "Escriba el nombre de alias de {0}: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "Indique el nuevo nombre de alias\t(INTRO para cancelar la importaci\u00F3n de esta entrada): "}, + {"Enter.alias.name.", "Introduzca el nombre de alias: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(INTRO si es el mismo que para <{0}>)"}, + {".PATTERN.printX509Cert", + "Propietario: {0}\nEmisor: {1}\nN\u00FAmero de serie: {2}\nV\u00E1lido desde: {3} hasta: {4}\nHuellas digitales del Certificado:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Nombre del Algoritmo de Firma: {8}\n\t Versi\u00F3n: {9}"}, + {"What.is.your.first.and.last.name.", + "\u00BFCu\u00E1les son su nombre y su apellido?"}, + {"What.is.the.name.of.your.organizational.unit.", + "\u00BFCu\u00E1l es el nombre de su unidad de organizaci\u00F3n?"}, + {"What.is.the.name.of.your.organization.", + "\u00BFCu\u00E1l es el nombre de su organizaci\u00F3n?"}, + {"What.is.the.name.of.your.City.or.Locality.", + "\u00BFCu\u00E1l es el nombre de su ciudad o localidad?"}, + {"What.is.the.name.of.your.State.or.Province.", + "\u00BFCu\u00E1l es el nombre de su estado o provincia?"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "\u00BFCu\u00E1l es el c\u00F3digo de pa\u00EDs de dos letras de la unidad?"}, + {"Is.name.correct.", "\u00BFEs correcto {0}?"}, + {"no", "no"}, + {"yes", "s\u00ED"}, + {"y", "s"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "El alias <{0}> no tiene clave"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "El alias <{0}> hace referencia a un tipo de entrada que no es una clave privada. El comando -keyclone s\u00F3lo permite la clonaci\u00F3n de entradas de claves privadas"}, + + {".WARNING.WARNING.WARNING.", + "***************** Advertencia Advertencia Advertencia *****************"}, + {"Signer.d.", "#%d de Firmante:"}, + {"Timestamp.", "Registro de Hora:"}, + {"Signature.", "Firma:"}, + {"CRLs.", "CRL:"}, + {"Certificate.owner.", "Propietario del Certificado: "}, + {"Not.a.signed.jar.file", "No es un archivo jar firmado"}, + {"No.certificate.from.the.SSL.server", + "Ning\u00FAn certificado del servidor SSL"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* La integridad de la informaci\u00F3n almacenada en el almac\u00E9n de claves *\n* NO se ha comprobado. Para comprobar dicha integridad, *\n* debe proporcionar la contrase\u00F1a del almac\u00E9n de claves. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* La integridad de la informaci\u00F3n almacenada en srckeystore*\n* NO se ha comprobado. Para comprobar dicha integridad, *\n* debe proporcionar la contrase\u00F1a de srckeystore. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "La respuesta de certificado no contiene una clave p\u00FAblica para <{0}>"}, + {"Incomplete.certificate.chain.in.reply", + "Cadena de certificado incompleta en la respuesta"}, + {"Certificate.chain.in.reply.does.not.verify.", + "La cadena de certificado de la respuesta no verifica: "}, + {"Top.level.certificate.in.reply.", + "Certificado de nivel superior en la respuesta:\n"}, + {".is.not.trusted.", "... no es de confianza. "}, + {"Install.reply.anyway.no.", "\u00BFInstalar respuesta de todos modos? [no]: "}, + {"NO", "No"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "Las claves p\u00FAblicas en la respuesta y en el almac\u00E9n de claves no coinciden"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "La respuesta del certificado y el certificado en el almac\u00E9n de claves son id\u00E9nticos"}, + {"Failed.to.establish.chain.from.reply", + "No se ha podido definir una cadena a partir de la respuesta"}, + {"n", "n"}, + {"Wrong.answer.try.again", "Respuesta incorrecta, vuelva a intentarlo"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "No se ha generado la clave secreta, el alias <{0}> ya existe"}, + {"Please.provide.keysize.for.secret.key.generation", + "Proporcione el valor de -keysize para la generaci\u00F3n de claves secretas"}, + + {"Extensions.", "Extensiones: "}, + {".Empty.value.", "(Valor vac\u00EDo)"}, + {"Extension.Request.", "Solicitud de Extensi\u00F3n:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "Solicitud de Certificado PKCS #10 (Versi\u00F3n 1.0)\nAsunto: %s\nClave P\u00FAblica: %s formato %s clave\n"}, + {"Unknown.keyUsage.type.", "Tipo de uso de clave desconocido: "}, + {"Unknown.extendedkeyUsage.type.", "Tipo de uso de clave extendida desconocido: "}, + {"Unknown.AccessDescription.type.", "Tipo de descripci\u00F3n de acceso desconocido: "}, + {"Unrecognized.GeneralName.type.", "Tipo de nombre general no reconocido: "}, + {"This.extension.cannot.be.marked.as.critical.", + "Esta extensi\u00F3n no se puede marcar como cr\u00EDtica. "}, + {"Odd.number.of.hex.digits.found.", "Se ha encontrado un n\u00FAmero impar de d\u00EDgitos hexadecimales: "}, + {"Unknown.extension.type.", "Tipo de extensi\u00F3n desconocida: "}, + {"command.{0}.is.ambiguous.", "El comando {0} es ambiguo:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_fr.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_fr.java new file mode 100644 index 00000000000..2ae14764d79 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_fr.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_fr extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [Option]..."}, + {"Options.", "Options :"}, + {"Use.keytool.help.for.all.available.commands", + "Utiliser \"keytool -help\" pour toutes les commandes disponibles"}, + {"Key.and.Certificate.Management.Tool", + "Outil de gestion de certificats et de cl\u00E9s"}, + {"Commands.", "Commandes :"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "Utiliser \"keytool -command_name -help\" pour la syntaxe de command_name"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "G\u00E9n\u00E8re une demande de certificat"}, //-certreq + {"Changes.an.entry.s.alias", + "Modifie l'alias d'une entr\u00E9e"}, //-changealias + {"Deletes.an.entry", + "Supprime une entr\u00E9e"}, //-delete + {"Exports.certificate", + "Exporte le certificat"}, //-exportcert + {"Generates.a.key.pair", + "G\u00E9n\u00E8re une paire de cl\u00E9s"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "G\u00E9n\u00E8re une cl\u00E9 secr\u00E8te"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "G\u00E9n\u00E8re le certificat \u00E0 partir d'une demande de certificat"}, //-gencert + {"Generates.CRL", "G\u00E9n\u00E8re la liste des certificats r\u00E9voqu\u00E9s (CRL)"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Importe les entr\u00E9es \u00E0 partir d'une base de donn\u00E9es d'identit\u00E9s de type JDK 1.1.x"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "Importe un certificat ou une cha\u00EEne de certificat"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "Importe une entr\u00E9e ou la totalit\u00E9 des entr\u00E9es depuis un autre fichier de cl\u00E9s"}, //-importkeystore + {"Clones.a.key.entry", + "Clone une entr\u00E9e de cl\u00E9"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "Modifie le mot de passe de cl\u00E9 d'une entr\u00E9e"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "R\u00E9pertorie les entr\u00E9es d'un fichier de cl\u00E9s"}, //-list + {"Prints.the.content.of.a.certificate", + "Imprime le contenu d'un certificat"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "Imprime le contenu d'une demande de certificat"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "Imprime le contenu d'un fichier de liste des certificats r\u00E9voqu\u00E9s (CRL)"}, //-printcrl + {"Generates.a.self.signed.certificate", + "G\u00E9n\u00E8re un certificat auto-sign\u00E9"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "Modifie le mot de passe de banque d'un fichier de cl\u00E9s"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "nom d'alias de l'entr\u00E9e \u00E0 traiter"}, //-alias + {"destination.alias", + "alias de destination"}, //-destalias + {"destination.key.password", + "mot de passe de la cl\u00E9 de destination"}, //-destkeypass + {"destination.keystore.name", + "nom du fichier de cl\u00E9s de destination"}, //-destkeystore + {"destination.keystore.password.protected", + "mot de passe du fichier de cl\u00E9s de destination prot\u00E9g\u00E9"}, //-destprotected + {"destination.keystore.provider.name", + "nom du fournisseur du fichier de cl\u00E9s de destination"}, //-destprovidername + {"destination.keystore.password", + "mot de passe du fichier de cl\u00E9s de destination"}, //-deststorepass + {"destination.keystore.type", + "type du fichier de cl\u00E9s de destination"}, //-deststoretype + {"distinguished.name", + "nom distinctif"}, //-dname + {"X.509.extension", + "extension X.509"}, //-ext + {"output.file.name", + "nom du fichier de sortie"}, //-file and -outfile + {"input.file.name", + "nom du fichier d'entr\u00E9e"}, //-file and -infile + {"key.algorithm.name", + "nom de l'algorithme de cl\u00E9"}, //-keyalg + {"key.password", + "mot de passe de la cl\u00E9"}, //-keypass + {"key.bit.size", + "taille en bits de la cl\u00E9"}, //-keysize + {"keystore.name", + "nom du fichier de cl\u00E9s"}, //-keystore + {"new.password", + "nouveau mot de passe"}, //-new + {"do.not.prompt", + "ne pas inviter"}, //-noprompt + {"password.through.protected.mechanism", + "mot de passe via m\u00E9canisme prot\u00E9g\u00E9"}, //-protected + {"provider.argument", + "argument du fournisseur"}, //-providerarg + {"provider.class.name", + "nom de la classe de fournisseur"}, //-providerclass + {"provider.name", + "nom du fournisseur"}, //-providername + {"provider.classpath", + "variable d'environnement CLASSPATH du fournisseur"}, //-providerpath + {"output.in.RFC.style", + "sortie au style RFC"}, //-rfc + {"signature.algorithm.name", + "nom de l'algorithme de signature"}, //-sigalg + {"source.alias", + "alias source"}, //-srcalias + {"source.key.password", + "mot de passe de la cl\u00E9 source"}, //-srckeypass + {"source.keystore.name", + "nom du fichier de cl\u00E9s source"}, //-srckeystore + {"source.keystore.password.protected", + "mot de passe du fichier de cl\u00E9s source prot\u00E9g\u00E9"}, //-srcprotected + {"source.keystore.provider.name", + "nom du fournisseur du fichier de cl\u00E9s source"}, //-srcprovidername + {"source.keystore.password", + "mot de passe du fichier de cl\u00E9s source"}, //-srcstorepass + {"source.keystore.type", + "type du fichier de cl\u00E9s source"}, //-srcstoretype + {"SSL.server.host.and.port", + "Port et h\u00F4te du serveur SSL"}, //-sslserver + {"signed.jar.file", + "fichier JAR sign\u00E9"}, //=jarfile + {"certificate.validity.start.date.time", + "date/heure de d\u00E9but de validit\u00E9 du certificat"}, //-startdate + {"keystore.password", + "mot de passe du fichier de cl\u00E9s"}, //-storepass + {"keystore.type", + "type du fichier de cl\u00E9s"}, //-storetype + {"trust.certificates.from.cacerts", + "certificats s\u00E9curis\u00E9s issus de certificats CA"}, //-trustcacerts + {"verbose.output", + "sortie en mode verbose"}, //-v + {"validity.number.of.days", + "nombre de jours de validit\u00E9"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "ID de s\u00E9rie du certificat \u00E0 r\u00E9voquer"}, //-id + // keytool: Running part + {"keytool.error.", "erreur keytool : "}, + {"Illegal.option.", "Option non admise : "}, + {"Illegal.value.", "Valeur non admise : "}, + {"Unknown.password.type.", "Type de mot de passe inconnu : "}, + {"Cannot.find.environment.variable.", + "Variable d'environnement introuvable : "}, + {"Cannot.find.file.", "Fichier introuvable : "}, + {"Command.option.flag.needs.an.argument.", "L''option de commande {0} requiert un argument."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "Avertissement\u00A0: les mots de passe de cl\u00E9 et de banque distincts ne sont pas pris en charge pour les fichiers de cl\u00E9s d''acc\u00E8s PKCS12. La valeur {0} sp\u00E9cifi\u00E9e par l''utilisateur est ignor\u00E9e."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-keystore doit \u00EAtre d\u00E9fini sur NONE si -storetype est {0}"}, + {"Too.many.retries.program.terminated", + "Trop de tentatives, fin du programme"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "Les commandes -storepasswd et -keypasswd ne sont pas prises en charge si -storetype est d\u00E9fini sur {0}"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "Les commandes -keypasswd ne sont pas prises en charge si -storetype est d\u00E9fini sur PKCS12"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "Les commandes -keypass et -new ne peuvent pas \u00EAtre sp\u00E9cifi\u00E9es si -storetype est d\u00E9fini sur {0}"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "si -protected est sp\u00E9cifi\u00E9, -storepass, -keypass et -new ne doivent pas \u00EAtre indiqu\u00E9s"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Si -srcprotected est indiqu\u00E9, les commandes -srcstorepass et -srckeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9es"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "Si le fichier de cl\u00E9s n'est pas prot\u00E9g\u00E9 par un mot de passe, les commandes -storepass, -keypass et -new ne doivent pas \u00EAtre sp\u00E9cifi\u00E9es"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Si le fichier de cl\u00E9s source n'est pas prot\u00E9g\u00E9 par un mot de passe, les commandes -srcstorepass et -srckeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9es"}, + {"Illegal.startdate.value", "Valeur de date de d\u00E9but non admise"}, + {"Validity.must.be.greater.than.zero", + "La validit\u00E9 doit \u00EAtre sup\u00E9rieure \u00E0 z\u00E9ro"}, + {"provName.not.a.provider", "{0} n''est pas un fournisseur"}, + {"Usage.error.no.command.provided", "Erreur de syntaxe\u00A0: aucune commande fournie"}, + {"Source.keystore.file.exists.but.is.empty.", "Le fichier de cl\u00E9s source existe mais il est vide : "}, + {"Please.specify.srckeystore", "Indiquez -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "-v et -rfc ne doivent pas \u00EAtre sp\u00E9cifi\u00E9s avec la commande 'list'"}, + {"Key.password.must.be.at.least.6.characters", + "Un mot de passe de cl\u00E9 doit comporter au moins 6 caract\u00E8res"}, + {"New.password.must.be.at.least.6.characters", + "Le nouveau mot de passe doit comporter au moins 6 caract\u00E8res"}, + {"Keystore.file.exists.but.is.empty.", + "Fichier de cl\u00E9s existant mais vide : "}, + {"Keystore.file.does.not.exist.", + "Le fichier de cl\u00E9s n'existe pas : "}, + {"Must.specify.destination.alias", "L'alias de destination doit \u00EAtre sp\u00E9cifi\u00E9"}, + {"Must.specify.alias", "L'alias doit \u00EAtre sp\u00E9cifi\u00E9"}, + {"Keystore.password.must.be.at.least.6.characters", + "Un mot de passe de fichier de cl\u00E9s doit comporter au moins 6 caract\u00E8res"}, + {"Enter.keystore.password.", "Entrez le mot de passe du fichier de cl\u00E9s : "}, + {"Enter.source.keystore.password.", "Entrez le mot de passe du fichier de cl\u00E9s source\u00A0: "}, + {"Enter.destination.keystore.password.", "Entrez le mot de passe du fichier de cl\u00E9s de destination\u00A0: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "Le mot de passe du fichier de cl\u00E9s est trop court : il doit comporter au moins 6 caract\u00E8res"}, + {"Unknown.Entry.Type", "Type d'entr\u00E9e inconnu"}, + {"Too.many.failures.Alias.not.changed", "Trop d'erreurs. Alias non modifi\u00E9"}, + {"Entry.for.alias.alias.successfully.imported.", + "L''entr\u00E9e de l''alias {0} a \u00E9t\u00E9 import\u00E9e."}, + {"Entry.for.alias.alias.not.imported.", "L''entr\u00E9e de l''alias {0} n''a pas \u00E9t\u00E9 import\u00E9e."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "Probl\u00E8me lors de l''import de l''entr\u00E9e de l''alias {0}\u00A0: {1}.\nL''entr\u00E9e de l''alias {0} n''a pas \u00E9t\u00E9 import\u00E9e."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "Commande d''import ex\u00E9cut\u00E9e\u00A0: {0} entr\u00E9es import\u00E9es, \u00E9chec ou annulation de {1} entr\u00E9es"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "Avertissement\u00A0: l''alias {0} existant sera remplac\u00E9 dans le fichier de cl\u00E9s d''acc\u00E8s de destination"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "L''alias d''entr\u00E9e {0} existe d\u00E9j\u00E0. Voulez-vous le remplacer ? [non]\u00A0: "}, + {"Too.many.failures.try.later", "Trop d'erreurs. R\u00E9essayez plus tard"}, + {"Certification.request.stored.in.file.filename.", + "Demande de certification stock\u00E9e dans le fichier <{0}>"}, + {"Submit.this.to.your.CA", "Soumettre \u00E0 votre CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "si l'alias n'est pas sp\u00E9cifi\u00E9, destalias, srckeypass et destkeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9s"}, + {"Certificate.stored.in.file.filename.", + "Certificat stock\u00E9 dans le fichier <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "R\u00E9ponse de certificat install\u00E9e dans le fichier de cl\u00E9s"}, + {"Certificate.reply.was.not.installed.in.keystore", + "R\u00E9ponse de certificat non install\u00E9e dans le fichier de cl\u00E9s"}, + {"Certificate.was.added.to.keystore", + "Certificat ajout\u00E9 au fichier de cl\u00E9s"}, + {"Certificate.was.not.added.to.keystore", + "Certificat non ajout\u00E9 au fichier de cl\u00E9s"}, + {".Storing.ksfname.", "[Stockage de {0}]"}, + {"alias.has.no.public.key.certificate.", + "{0} ne poss\u00E8de pas de cl\u00E9 publique (certificat)"}, + {"Cannot.derive.signature.algorithm", + "Impossible de d\u00E9duire l'algorithme de signature"}, + {"Alias.alias.does.not.exist", + "L''alias <{0}> n''existe pas"}, + {"Alias.alias.has.no.certificate", + "L''alias <{0}> ne poss\u00E8de pas de certificat"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "Paire de cl\u00E9s non g\u00E9n\u00E9r\u00E9e, l''alias <{0}> existe d\u00E9j\u00E0"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "G\u00E9n\u00E9ration d''une paire de cl\u00E9s {1} de {0} bits et d''un certificat auto-sign\u00E9 ({2}) d''une validit\u00E9 de {3} jours\n\tpour : {4}"}, + {"Enter.key.password.for.alias.", "Entrez le mot de passe de la cl\u00E9 pour <{0}>"}, + {".RETURN.if.same.as.keystore.password.", + "\t(appuyez sur Entr\u00E9e s'il s'agit du mot de passe du fichier de cl\u00E9s) : "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "Le mot de passe de la cl\u00E9 est trop court : il doit comporter au moins 6 caract\u00E8res"}, + {"Too.many.failures.key.not.added.to.keystore", + "Trop d'erreurs. Cl\u00E9 non ajout\u00E9e au fichier de cl\u00E9s"}, + {"Destination.alias.dest.already.exists", + "L''alias de la destination <{0}> existe d\u00E9j\u00E0"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "Le mot de passe est trop court : il doit comporter au moins 6 caract\u00E8res"}, + {"Too.many.failures.Key.entry.not.cloned", + "Trop d'erreurs. Entr\u00E9e de cl\u00E9 non clon\u00E9e"}, + {"key.password.for.alias.", "mot de passe de cl\u00E9 pour <{0}>"}, + {"Keystore.entry.for.id.getName.already.exists", + "L''entr\u00E9e de fichier de cl\u00E9s d''acc\u00E8s pour <{0}> existe d\u00E9j\u00E0"}, + {"Creating.keystore.entry.for.id.getName.", + "Cr\u00E9ation d''une entr\u00E9e de fichier de cl\u00E9s d''acc\u00E8s pour <{0}>..."}, + {"No.entries.from.identity.database.added", + "Aucune entr\u00E9e ajout\u00E9e \u00E0 partir de la base de donn\u00E9es d'identit\u00E9s"}, + {"Alias.name.alias", "Nom d''alias : {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "Date de cr\u00E9ation : {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Type d''entr\u00E9e\u00A0: {0}"}, + {"Certificate.chain.length.", "Longueur de cha\u00EEne du certificat : "}, + {"Certificate.i.1.", "Certificat[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Empreinte du certificat (SHA1) : "}, + {"Keystore.type.", "Type de fichier de cl\u00E9s : "}, + {"Keystore.provider.", "Fournisseur de fichier de cl\u00E9s : "}, + {"Your.keystore.contains.keyStore.size.entry", + "Votre fichier de cl\u00E9s d''acc\u00E8s contient {0,number,integer} entr\u00E9e"}, + {"Your.keystore.contains.keyStore.size.entries", + "Votre fichier de cl\u00E9s d''acc\u00E8s contient {0,number,integer} entr\u00E9es"}, + {"Failed.to.parse.input", "L'analyse de l'entr\u00E9e a \u00E9chou\u00E9"}, + {"Empty.input", "Entr\u00E9e vide"}, + {"Not.X.509.certificate", "Pas un certificat X.509"}, + {"alias.has.no.public.key", "{0} ne poss\u00E8de pas de cl\u00E9 publique"}, + {"alias.has.no.X.509.certificate", "{0} ne poss\u00E8de pas de certificat X.509"}, + {"New.certificate.self.signed.", "Nouveau certificat (auto-sign\u00E9) :"}, + {"Reply.has.no.certificates", "La r\u00E9ponse n'a pas de certificat"}, + {"Certificate.not.imported.alias.alias.already.exists", + "Certificat non import\u00E9, l''alias <{0}> existe d\u00E9j\u00E0"}, + {"Input.not.an.X.509.certificate", "L'entr\u00E9e n'est pas un certificat X.509"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "Le certificat existe d\u00E9j\u00E0 dans le fichier de cl\u00E9s d''acc\u00E8s sous l''alias <{0}>"}, + {"Do.you.still.want.to.add.it.no.", + "Voulez-vous toujours l'ajouter ? [non] : "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "Le certificat existe d\u00E9j\u00E0 dans le fichier de cl\u00E9s d''acc\u00E8s CA syst\u00E8me sous l''alias <{0}>"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "Voulez-vous toujours l'ajouter \u00E0 votre fichier de cl\u00E9s ? [non] : "}, + {"Trust.this.certificate.no.", "Faire confiance \u00E0 ce certificat ? [non] : "}, + {"YES", "Oui"}, + {"New.prompt.", "Nouveau {0} : "}, + {"Passwords.must.differ", "Les mots de passe doivent diff\u00E9rer"}, + {"Re.enter.new.prompt.", "Indiquez encore le nouveau {0} : "}, + {"Re.enter.new.password.", "Ressaisissez le nouveau mot de passe : "}, + {"They.don.t.match.Try.again", "Ils sont diff\u00E9rents. R\u00E9essayez."}, + {"Enter.prompt.alias.name.", "Indiquez le nom d''alias {0} : "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "Saisissez le nom du nouvel alias\t(ou appuyez sur Entr\u00E9e pour annuler l'import de cette entr\u00E9e)\u00A0: "}, + {"Enter.alias.name.", "Indiquez le nom d'alias : "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(appuyez sur Entr\u00E9e si le r\u00E9sultat est identique \u00E0 <{0}>)"}, + {".PATTERN.printX509Cert", + "Propri\u00E9taire : {0}\nEmetteur : {1}\nNum\u00E9ro de s\u00E9rie : {2}\nValide du : {3} au : {4}\nEmpreintes du certificat :\n\t MD5: {5}\n\t SHA1 : {6}\n\t SHA256 : {7}\n\t Nom de l''algorithme de signature : {8}\n\t Version : {9}"}, + {"What.is.your.first.and.last.name.", + "Quels sont vos nom et pr\u00E9nom ?"}, + {"What.is.the.name.of.your.organizational.unit.", + "Quel est le nom de votre unit\u00E9 organisationnelle ?"}, + {"What.is.the.name.of.your.organization.", + "Quel est le nom de votre entreprise ?"}, + {"What.is.the.name.of.your.City.or.Locality.", + "Quel est le nom de votre ville de r\u00E9sidence ?"}, + {"What.is.the.name.of.your.State.or.Province.", + "Quel est le nom de votre \u00E9tat ou province ?"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "Quel est le code pays \u00E0 deux lettres pour cette unit\u00E9 ?"}, + {"Is.name.correct.", "Est-ce {0} ?"}, + {"no", "non"}, + {"yes", "oui"}, + {"y", "o"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "L''alias <{0}> n''est associ\u00E9 \u00E0 aucune cl\u00E9"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "L''entr\u00E9e \u00E0 laquelle l''alias <{0}> fait r\u00E9f\u00E9rence n''est pas une entr\u00E9e de type cl\u00E9 priv\u00E9e. La commande -keyclone prend uniquement en charge le clonage des cl\u00E9s priv\u00E9es"}, + + {".WARNING.WARNING.WARNING.", + "***************** Avertissement Avertissement Avertissement *****************"}, + {"Signer.d.", "Signataire n\u00B0%d :"}, + {"Timestamp.", "Horodatage :"}, + {"Signature.", "Signature :"}, + {"CRLs.", "Listes des certificats r\u00E9voqu\u00E9s (CRL) :"}, + {"Certificate.owner.", "Propri\u00E9taire du certificat : "}, + {"Not.a.signed.jar.file", "Fichier JAR non sign\u00E9"}, + {"No.certificate.from.the.SSL.server", + "Aucun certificat du serveur SSL"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* L'int\u00E9grit\u00E9 des informations stock\u00E9es dans votre fichier de cl\u00E9s *\n* n'a PAS \u00E9t\u00E9 v\u00E9rifi\u00E9e. Pour cela, *\n* vous devez fournir le mot de passe de votre fichier de cl\u00E9s. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* L'int\u00E9grit\u00E9 des informations stock\u00E9es dans le fichier de cl\u00E9s source *\n* n'a PAS \u00E9t\u00E9 v\u00E9rifi\u00E9e. Pour cela, *\n* vous devez fournir le mot de passe de votre fichier de cl\u00E9s source. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "La r\u00E9ponse au certificat ne contient pas de cl\u00E9 publique pour <{0}>"}, + {"Incomplete.certificate.chain.in.reply", + "Cha\u00EEne de certificat incompl\u00E8te dans la r\u00E9ponse"}, + {"Certificate.chain.in.reply.does.not.verify.", + "La cha\u00EEne de certificat de la r\u00E9ponse ne concorde pas : "}, + {"Top.level.certificate.in.reply.", + "Certificat de niveau sup\u00E9rieur dans la r\u00E9ponse :\n"}, + {".is.not.trusted.", "... non s\u00E9curis\u00E9. "}, + {"Install.reply.anyway.no.", "Installer la r\u00E9ponse quand m\u00EAme ? [non] : "}, + {"NO", "Non"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "Les cl\u00E9s publiques de la r\u00E9ponse et du fichier de cl\u00E9s ne concordent pas"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "La r\u00E9ponse au certificat et le certificat du fichier de cl\u00E9s sont identiques"}, + {"Failed.to.establish.chain.from.reply", + "Impossible de cr\u00E9er une cha\u00EEne \u00E0 partir de la r\u00E9ponse"}, + {"n", "n"}, + {"Wrong.answer.try.again", "R\u00E9ponse incorrecte, recommencez"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "Cl\u00E9 secr\u00E8te non g\u00E9n\u00E9r\u00E9e, l''alias <{0}> existe d\u00E9j\u00E0"}, + {"Please.provide.keysize.for.secret.key.generation", + "Indiquez -keysize pour la g\u00E9n\u00E9ration de la cl\u00E9 secr\u00E8te"}, + + {"Extensions.", "Extensions\u00A0: "}, + {".Empty.value.", "(Valeur vide)"}, + {"Extension.Request.", "Demande d'extension :"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "Demande de certificat PKCS #10 (version 1.0)\nSujet : %s\nCl\u00E9 publique : format %s pour la cl\u00E9 %s\n"}, + {"Unknown.keyUsage.type.", "Type keyUsage inconnu : "}, + {"Unknown.extendedkeyUsage.type.", "Type extendedkeyUsage inconnu : "}, + {"Unknown.AccessDescription.type.", "Type AccessDescription inconnu : "}, + {"Unrecognized.GeneralName.type.", "Type GeneralName non reconnu : "}, + {"This.extension.cannot.be.marked.as.critical.", + "Cette extension ne peut pas \u00EAtre marqu\u00E9e comme critique. "}, + {"Odd.number.of.hex.digits.found.", "Nombre impair de chiffres hexad\u00E9cimaux trouv\u00E9 : "}, + {"Unknown.extension.type.", "Type d'extension inconnu : "}, + {"command.{0}.is.ambiguous.", "commande {0} ambigu\u00EB :"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_it.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_it.java new file mode 100644 index 00000000000..0557fdc0943 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_it.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_it extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [Opzione]..."}, + {"Options.", "Opzioni:"}, + {"Use.keytool.help.for.all.available.commands", + "Utilizzare \"keytool -help\" per visualizzare tutti i comandi disponibili"}, + {"Key.and.Certificate.Management.Tool", + "Strumento di gestione di chiavi e certificati"}, + {"Commands.", "Comandi:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "Utilizzare \"keytool -command_name -help\" per informazioni sull'uso di command_name"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "Genera una richiesta di certificato"}, //-certreq + {"Changes.an.entry.s.alias", + "Modifica l'alias di una voce"}, //-changealias + {"Deletes.an.entry", + "Elimina una voce"}, //-delete + {"Exports.certificate", + "Esporta il certificato"}, //-exportcert + {"Generates.a.key.pair", + "Genera una coppia di chiavi"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "Genera una chiave segreta"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "Genera un certificato da una richiesta di certificato"}, //-gencert + {"Generates.CRL", "Genera CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Importa le voci da un database delle identit\u00E0 di tipo JDK 1.1.x"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "Importa un certificato o una catena di certificati"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "Importa una o tutte le voci da un altro keystore"}, //-importkeystore + {"Clones.a.key.entry", + "Duplica una voce di chiave"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "Modifica la password della chiave per una voce"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "Elenca le voci in un keystore"}, //-list + {"Prints.the.content.of.a.certificate", + "Visualizza i contenuti di un certificato"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "Visualizza i contenuti di una richiesta di certificato"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "Visualizza i contenuti di un file CRL"}, //-printcrl + {"Generates.a.self.signed.certificate", + "Genera certificato con firma automatica"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "Modifica la password di area di memorizzazione di un keystore"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "nome alias della voce da elaborare"}, //-alias + {"destination.alias", + "alias di destinazione"}, //-destalias + {"destination.key.password", + "password chiave di destinazione"}, //-destkeypass + {"destination.keystore.name", + "nome keystore di destinazione"}, //-destkeystore + {"destination.keystore.password.protected", + "password keystore di destinazione protetta"}, //-destprotected + {"destination.keystore.provider.name", + "nome provider keystore di destinazione"}, //-destprovidername + {"destination.keystore.password", + "password keystore di destinazione"}, //-deststorepass + {"destination.keystore.type", + "tipo keystore di destinazione"}, //-deststoretype + {"distinguished.name", + "nome distinto"}, //-dname + {"X.509.extension", + "estensione X.509"}, //-ext + {"output.file.name", + "nome file di output"}, //-file and -outfile + {"input.file.name", + "nome file di input"}, //-file and -infile + {"key.algorithm.name", + "nome algoritmo chiave"}, //-keyalg + {"key.password", + "password chiave"}, //-keypass + {"key.bit.size", + "dimensione bit chiave"}, //-keysize + {"keystore.name", + "nome keystore"}, //-keystore + {"new.password", + "nuova password"}, //-new + {"do.not.prompt", + "non richiedere"}, //-noprompt + {"password.through.protected.mechanism", + "password mediante meccanismo protetto"}, //-protected + {"provider.argument", + "argomento provider"}, //-providerarg + {"provider.class.name", + "nome classe provider"}, //-providerclass + {"provider.name", + "nome provider"}, //-providername + {"provider.classpath", + "classpath provider"}, //-providerpath + {"output.in.RFC.style", + "output in stile RFC"}, //-rfc + {"signature.algorithm.name", + "nome algoritmo firma"}, //-sigalg + {"source.alias", + "alias origine"}, //-srcalias + {"source.key.password", + "password chiave di origine"}, //-srckeypass + {"source.keystore.name", + "nome keystore di origine"}, //-srckeystore + {"source.keystore.password.protected", + "password keystore di origine protetta"}, //-srcprotected + {"source.keystore.provider.name", + "nome provider keystore di origine"}, //-srcprovidername + {"source.keystore.password", + "password keystore di origine"}, //-srcstorepass + {"source.keystore.type", + "tipo keystore di origine"}, //-srcstoretype + {"SSL.server.host.and.port", + "host e porta server SSL"}, //-sslserver + {"signed.jar.file", + "file jar firmato"}, //=jarfile + {"certificate.validity.start.date.time", + "data/ora di inizio validit\u00E0 certificato"}, //-startdate + {"keystore.password", + "password keystore"}, //-storepass + {"keystore.type", + "tipo keystore"}, //-storetype + {"trust.certificates.from.cacerts", + "considera sicuri i certificati da cacerts"}, //-trustcacerts + {"verbose.output", + "output descrittivo"}, //-v + {"validity.number.of.days", + "numero di giorni di validit\u00E0"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "ID seriale del certificato da revocare"}, //-id + // keytool: Running part + {"keytool.error.", "Errore keytool: "}, + {"Illegal.option.", "Opzione non valida: "}, + {"Illegal.value.", "Valore non valido: "}, + {"Unknown.password.type.", "Tipo di password sconosciuto: "}, + {"Cannot.find.environment.variable.", + "Impossibile trovare la variabile di ambiente: "}, + {"Cannot.find.file.", "Impossibile trovare il file: "}, + {"Command.option.flag.needs.an.argument.", "\u00C8 necessario specificare un argomento per l''opzione di comando {0}."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "Avvertenza: non sono supportate password diverse di chiave e di archivio per i keystore PKCS12. Il valore {0} specificato dall''utente verr\u00E0 ignorato."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "Se -storetype \u00E8 impostato su {0}, -keystore deve essere impostato su NONE"}, + {"Too.many.retries.program.terminated", + "Il numero dei tentativi consentiti \u00E8 stato superato. Il programma verr\u00E0 terminato."}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "Se -storetype \u00E8 impostato su {0}, i comandi -storepasswd e -keypasswd non sono supportati"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "Se -storetype \u00E8 impostato su PKCS12 i comandi -keypasswd non vengono supportati"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "Se -storetype \u00E8 impostato su {0}, non \u00E8 possibile specificare un valore per -keypass e -new"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "Se \u00E8 specificata l'opzione -protected, le opzioni -storepass, -keypass e -new non possono essere specificate"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Se viene specificato -srcprotected, -srcstorepass e -srckeypass non dovranno essere specificati"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "Se il file keystore non \u00E8 protetto da password, non deve essere specificato alcun valore per -storepass, -keypass e -new"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "Se il file keystore non \u00E8 protetto da password, non deve essere specificato alcun valore per -srcstorepass e -srckeypass"}, + {"Illegal.startdate.value", "Valore di data di inizio non valido"}, + {"Validity.must.be.greater.than.zero", + "La validit\u00E0 deve essere maggiore di zero"}, + {"provName.not.a.provider", "{0} non \u00E8 un provider"}, + {"Usage.error.no.command.provided", "Errore di utilizzo: nessun comando specificato"}, + {"Source.keystore.file.exists.but.is.empty.", "Il file keystore di origine esiste, ma \u00E8 vuoto: "}, + {"Please.specify.srckeystore", "Specificare -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "Impossibile specificare sia -v sia -rfc con il comando 'list'"}, + {"Key.password.must.be.at.least.6.characters", + "La password della chiave deve contenere almeno 6 caratteri"}, + {"New.password.must.be.at.least.6.characters", + "La nuova password deve contenere almeno 6 caratteri"}, + {"Keystore.file.exists.but.is.empty.", + "Il file keystore esiste ma \u00E8 vuoto: "}, + {"Keystore.file.does.not.exist.", + "Il file keystore non esiste: "}, + {"Must.specify.destination.alias", "\u00C8 necessario specificare l'alias di destinazione"}, + {"Must.specify.alias", "\u00C8 necessario specificare l'alias"}, + {"Keystore.password.must.be.at.least.6.characters", + "La password del keystore deve contenere almeno 6 caratteri"}, + {"Enter.keystore.password.", "Immettere la password del keystore: "}, + {"Enter.source.keystore.password.", "Immettere la password del keystore di origine: "}, + {"Enter.destination.keystore.password.", "Immettere la password del keystore di destinazione: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "La password del keystore \u00E8 troppo corta - deve contenere almeno 6 caratteri"}, + {"Unknown.Entry.Type", "Tipo di voce sconosciuto"}, + {"Too.many.failures.Alias.not.changed", "Numero eccessivo di errori. L'alias non \u00E8 stato modificato."}, + {"Entry.for.alias.alias.successfully.imported.", + "La voce dell''alias {0} \u00E8 stata importata."}, + {"Entry.for.alias.alias.not.imported.", "La voce dell''alias {0} non \u00E8 stata importata."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "Si \u00E8 verificato un problema durante l''importazione della voce dell''alias {0}: {1}.\nLa voce dell''alias {0} non \u00E8 stata importata."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "Comando di importazione completato: {0} voce/i importata/e, {1} voce/i non importata/e o annullata/e"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "Avvertenza: sovrascrittura in corso dell''alias {0} nel file keystore di destinazione"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "La voce dell''alias {0} esiste gi\u00E0. Sovrascrivere? [no]: "}, + {"Too.many.failures.try.later", "Troppi errori - riprovare"}, + {"Certification.request.stored.in.file.filename.", + "La richiesta di certificazione \u00E8 memorizzata nel file <{0}>"}, + {"Submit.this.to.your.CA", "Sottomettere alla propria CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "Se l'alias non \u00E8 specificato, destalias, srckeypass e destkeypass non dovranno essere specificati"}, + {"Certificate.stored.in.file.filename.", + "Il certificato \u00E8 memorizzato nel file <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "La risposta del certificato \u00E8 stata installata nel keystore"}, + {"Certificate.reply.was.not.installed.in.keystore", + "La risposta del certificato non \u00E8 stata installata nel keystore"}, + {"Certificate.was.added.to.keystore", + "Il certificato \u00E8 stato aggiunto al keystore"}, + {"Certificate.was.not.added.to.keystore", + "Il certificato non \u00E8 stato aggiunto al keystore"}, + {".Storing.ksfname.", "[Memorizzazione di {0}] in corso"}, + {"alias.has.no.public.key.certificate.", + "{0} non dispone di chiave pubblica (certificato)"}, + {"Cannot.derive.signature.algorithm", + "Impossibile derivare l'algoritmo di firma"}, + {"Alias.alias.does.not.exist", + "L''alias <{0}> non esiste"}, + {"Alias.alias.has.no.certificate", + "L''alias <{0}> non dispone di certificato"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "Non \u00E8 stata generata la coppia di chiavi, l''alias <{0}> \u00E8 gi\u00E0 esistente"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "Generazione in corso di una coppia di chiavi {1} da {0} bit e di un certificato autofirmato ({2}) con una validit\u00E0 di {3} giorni\n\tper: {4}"}, + {"Enter.key.password.for.alias.", "Immettere la password della chiave per <{0}>"}, + {".RETURN.if.same.as.keystore.password.", + "\t(INVIO se corrisponde alla password del keystore): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "La password della chiave \u00E8 troppo corta - deve contenere almeno 6 caratteri"}, + {"Too.many.failures.key.not.added.to.keystore", + "Troppi errori - la chiave non \u00E8 stata aggiunta al keystore"}, + {"Destination.alias.dest.already.exists", + "L''alias di destinazione <{0}> \u00E8 gi\u00E0 esistente"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "La password \u00E8 troppo corta - deve contenere almeno 6 caratteri"}, + {"Too.many.failures.Key.entry.not.cloned", + "Numero eccessivo di errori. Il valore della chiave non \u00E8 stato copiato."}, + {"key.password.for.alias.", "password della chiave per <{0}>"}, + {"Keystore.entry.for.id.getName.already.exists", + "La voce del keystore per <{0}> esiste gi\u00E0"}, + {"Creating.keystore.entry.for.id.getName.", + "Creazione della voce del keystore per <{0}> in corso..."}, + {"No.entries.from.identity.database.added", + "Nessuna voce aggiunta dal database delle identit\u00E0"}, + {"Alias.name.alias", "Nome alias: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "Data di creazione: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Tipo di voce: {0}"}, + {"Certificate.chain.length.", "Lunghezza catena certificati: "}, + {"Certificate.i.1.", "Certificato[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Impronta digitale certificato (SHA1): "}, + {"Keystore.type.", "Tipo keystore: "}, + {"Keystore.provider.", "Provider keystore: "}, + {"Your.keystore.contains.keyStore.size.entry", + "Il keystore contiene {0,number,integer} voce"}, + {"Your.keystore.contains.keyStore.size.entries", + "Il keystore contiene {0,number,integer} voci"}, + {"Failed.to.parse.input", "Impossibile analizzare l'input"}, + {"Empty.input", "Input vuoto"}, + {"Not.X.509.certificate", "Il certificato non \u00E8 X.509"}, + {"alias.has.no.public.key", "{0} non dispone di chiave pubblica"}, + {"alias.has.no.X.509.certificate", "{0} non dispone di certificato X.509"}, + {"New.certificate.self.signed.", "Nuovo certificato (autofirmato):"}, + {"Reply.has.no.certificates", "La risposta non dispone di certificati"}, + {"Certificate.not.imported.alias.alias.already.exists", + "Impossibile importare il certificato, l''alias <{0}> \u00E8 gi\u00E0 esistente"}, + {"Input.not.an.X.509.certificate", "L'input non \u00E8 un certificato X.509"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "Il certificato esiste gi\u00E0 nel keystore con alias <{0}>"}, + {"Do.you.still.want.to.add.it.no.", + "Aggiungerlo ugualmente? [no]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "Il certificato esiste gi\u00E0 nel keystore CA con alias <{0}>"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "Aggiungerlo al proprio keystore? [no]: "}, + {"Trust.this.certificate.no.", "Considerare sicuro questo certificato? [no]: "}, + {"YES", "S\u00EC"}, + {"New.prompt.", "Nuova {0}: "}, + {"Passwords.must.differ", "Le password non devono coincidere"}, + {"Re.enter.new.prompt.", "Reimmettere un nuovo valore per {0}: "}, + {"Re.enter.new.password.", "Immettere nuovamente la nuova password: "}, + {"They.don.t.match.Try.again", "Non corrispondono. Riprovare."}, + {"Enter.prompt.alias.name.", "Immettere nome alias {0}: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "Immettere un nuovo nome alias\t(premere INVIO per annullare l'importazione della voce): "}, + {"Enter.alias.name.", "Immettere nome alias: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(INVIO se corrisponde al nome di <{0}>"}, + {".PATTERN.printX509Cert", + "Proprietario: {0}\nAutorit\u00E0 emittente: {1}\nNumero di serie: {2}\nValido da: {3} a: {4}\nImpronte digitali certificato:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Nome algoritmo firma: {8}\n\t Versione: {9}"}, + {"What.is.your.first.and.last.name.", + "Specificare nome e cognome"}, + {"What.is.the.name.of.your.organizational.unit.", + "Specificare il nome dell'unit\u00E0 organizzativa"}, + {"What.is.the.name.of.your.organization.", + "Specificare il nome dell'organizzazione"}, + {"What.is.the.name.of.your.City.or.Locality.", + "Specificare la localit\u00E0"}, + {"What.is.the.name.of.your.State.or.Province.", + "Specificare la provincia"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "Specificare il codice a due lettere del paese in cui si trova l'unit\u00E0"}, + {"Is.name.correct.", "Il dato {0} \u00E8 corretto?"}, + {"no", "no"}, + {"yes", "s\u00EC"}, + {"y", "s"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "All''alias <{0}> non \u00E8 associata alcuna chiave"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "L''alias <{0}> fa riferimento a un tipo di voce che non \u00E8 una voce di chiave privata. Il comando -keyclone supporta solo la copia delle voci di chiave private."}, + + {".WARNING.WARNING.WARNING.", + "***************** Avvertenza Avvertenza Avvertenza *****************"}, + {"Signer.d.", "Firmatario #%d:"}, + {"Timestamp.", "Indicatore orario:"}, + {"Signature.", "Firma:"}, + {"CRLs.", "CRL:"}, + {"Certificate.owner.", "Proprietario certificato: "}, + {"Not.a.signed.jar.file", "Non \u00E8 un file jar firmato"}, + {"No.certificate.from.the.SSL.server", + "Nessun certificato dal server SSL"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* L'integrit\u00E0 delle informazioni memorizzate nel keystore *\n* NON \u00E8 stata verificata. Per verificarne l'integrit\u00E0 *\n* \u00E8 necessario fornire la password del keystore. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* L'integrit\u00E0 delle informazioni memorizzate nel srckeystore *\n* NON \u00E8 stata verificata. Per verificarne l'integrit\u00E0 *\n* \u00E8 necessario fornire la password del srckeystore. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "La risposta del certificato non contiene la chiave pubblica per <{0}>"}, + {"Incomplete.certificate.chain.in.reply", + "Catena dei certificati incompleta nella risposta"}, + {"Certificate.chain.in.reply.does.not.verify.", + "La catena dei certificati nella risposta non verifica: "}, + {"Top.level.certificate.in.reply.", + "Certificato di primo livello nella risposta:\n"}, + {".is.not.trusted.", "...non \u00E8 considerato sicuro. "}, + {"Install.reply.anyway.no.", "Installare la risposta? [no]: "}, + {"NO", "No"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "Le chiavi pubbliche nella risposta e nel keystore non corrispondono"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "La risposta del certificato e il certificato nel keystore sono identici"}, + {"Failed.to.establish.chain.from.reply", + "Impossibile stabilire la catena dalla risposta"}, + {"n", "n"}, + {"Wrong.answer.try.again", "Risposta errata, riprovare"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "La chiave segreta non \u00E8 stata generata; l''alias <{0}> esiste gi\u00E0"}, + {"Please.provide.keysize.for.secret.key.generation", + "Specificare il valore -keysize per la generazione della chiave segreta"}, + + {"Extensions.", "Estensioni: "}, + {".Empty.value.", "(valore vuoto)"}, + {"Extension.Request.", "Richiesta di estensione:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "Richiesta di certificato PKCS #10 (versione 1.0)\nOggetto: %s\nChiave pubblica: %s formato %s chiave\n"}, + {"Unknown.keyUsage.type.", "Tipo keyUsage sconosciuto: "}, + {"Unknown.extendedkeyUsage.type.", "Tipo extendedkeyUsage sconosciuto: "}, + {"Unknown.AccessDescription.type.", "Tipo AccessDescription sconosciuto: "}, + {"Unrecognized.GeneralName.type.", "Tipo GeneralName non riconosciuto: "}, + {"This.extension.cannot.be.marked.as.critical.", + "Impossibile contrassegnare questa estensione come critica. "}, + {"Odd.number.of.hex.digits.found.", "\u00C8 stato trovato un numero dispari di cifre esadecimali: "}, + {"Unknown.extension.type.", "Tipo di estensione sconosciuto: "}, + {"command.{0}.is.ambiguous.", "il comando {0} \u00E8 ambiguo:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_ja.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_ja.java new file mode 100644 index 00000000000..9b6e6be1cf6 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_ja.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_ja extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [\u30AA\u30D7\u30B7\u30E7\u30F3]..."}, + {"Options.", "\u30AA\u30D7\u30B7\u30E7\u30F3:"}, + {"Use.keytool.help.for.all.available.commands", + "\u4F7F\u7528\u53EF\u80FD\u306A\u3059\u3079\u3066\u306E\u30B3\u30DE\u30F3\u30C9\u306B\u3064\u3044\u3066\u306F\"keytool -help\"\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Key.and.Certificate.Management.Tool", + "\u30AD\u30FC\u304A\u3088\u3073\u8A3C\u660E\u66F8\u7BA1\u7406\u30C4\u30FC\u30EB"}, + {"Commands.", "\u30B3\u30DE\u30F3\u30C9:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "command_name\u306E\u4F7F\u7528\u65B9\u6CD5\u306B\u3064\u3044\u3066\u306F\"keytool -command_name -help\"\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u751F\u6210\u3057\u307E\u3059"}, //-certreq + {"Changes.an.entry.s.alias", + "\u30A8\u30F3\u30C8\u30EA\u306E\u5225\u540D\u3092\u5909\u66F4\u3057\u307E\u3059"}, //-changealias + {"Deletes.an.entry", + "\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059"}, //-delete + {"Exports.certificate", + "\u8A3C\u660E\u66F8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-exportcert + {"Generates.a.key.pair", + "\u9375\u30DA\u30A2\u3092\u751F\u6210\u3057\u307E\u3059"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "\u79D8\u5BC6\u9375\u3092\u751F\u6210\u3057\u307E\u3059"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u304B\u3089\u8A3C\u660E\u66F8\u3092\u751F\u6210\u3057\u307E\u3059"}, //-gencert + {"Generates.CRL", "CRL\u3092\u751F\u6210\u3057\u307E\u3059"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "JDK 1.1.x-style\u30A2\u30A4\u30C7\u30F3\u30C6\u30A3\u30C6\u30A3\u30FB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u30A8\u30F3\u30C8\u30EA\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "\u8A3C\u660E\u66F8\u307E\u305F\u306F\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "\u5225\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u304B\u30891\u3064\u307E\u305F\u306F\u3059\u3079\u3066\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-importkeystore + {"Clones.a.key.entry", + "\u9375\u30A8\u30F3\u30C8\u30EA\u306E\u30AF\u30ED\u30FC\u30F3\u3092\u4F5C\u6210\u3057\u307E\u3059"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "\u30A8\u30F3\u30C8\u30EA\u306E\u9375\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5909\u66F4\u3057\u307E\u3059"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u30EA\u30B9\u30C8\u3057\u307E\u3059"}, //-list + {"Prints.the.content.of.a.certificate", + "\u8A3C\u660E\u66F8\u306E\u5185\u5BB9\u3092\u51FA\u529B\u3057\u307E\u3059"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u5185\u5BB9\u3092\u51FA\u529B\u3057\u307E\u3059"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "CRL\u30D5\u30A1\u30A4\u30EB\u306E\u5185\u5BB9\u3092\u51FA\u529B\u3057\u307E\u3059"}, //-printcrl + {"Generates.a.self.signed.certificate", + "\u81EA\u5DF1\u7F72\u540D\u578B\u8A3C\u660E\u66F8\u3092\u751F\u6210\u3057\u307E\u3059"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30B9\u30C8\u30A2\u30FB\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5909\u66F4\u3057\u307E\u3059"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "\u51E6\u7406\u3059\u308B\u30A8\u30F3\u30C8\u30EA\u306E\u5225\u540D"}, //-alias + {"destination.alias", + "\u51FA\u529B\u5148\u306E\u5225\u540D"}, //-destalias + {"destination.key.password", + "\u51FA\u529B\u5148\u30AD\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-destkeypass + {"destination.keystore.name", + "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u540D"}, //-destkeystore + {"destination.keystore.password.protected", + "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u4FDD\u8B77\u5BFE\u8C61\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-destprotected + {"destination.keystore.provider.name", + "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"}, //-destprovidername + {"destination.keystore.password", + "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-deststorepass + {"destination.keystore.type", + "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7"}, //-deststoretype + {"distinguished.name", + "\u8B58\u5225\u540D"}, //-dname + {"X.509.extension", + "X.509\u62E1\u5F35"}, //-ext + {"output.file.name", + "\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u540D"}, //-file and -outfile + {"input.file.name", + "\u5165\u529B\u30D5\u30A1\u30A4\u30EB\u540D"}, //-file and -infile + {"key.algorithm.name", + "\u9375\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u540D"}, //-keyalg + {"key.password", + "\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-keypass + {"key.bit.size", + "\u9375\u306E\u30D3\u30C3\u30C8\u30FB\u30B5\u30A4\u30BA"}, //-keysize + {"keystore.name", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u540D"}, //-keystore + {"new.password", + "\u65B0\u898F\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-new + {"do.not.prompt", + "\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u8868\u793A\u3057\u306A\u3044"}, //-noprompt + {"password.through.protected.mechanism", + "\u4FDD\u8B77\u30E1\u30AB\u30CB\u30BA\u30E0\u306B\u3088\u308B\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-protected + {"provider.argument", + "\u30D7\u30ED\u30D0\u30A4\u30C0\u5F15\u6570"}, //-providerarg + {"provider.class.name", + "\u30D7\u30ED\u30D0\u30A4\u30C0\u30FB\u30AF\u30E9\u30B9\u540D"}, //-providerclass + {"provider.name", + "\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"}, //-providername + {"provider.classpath", + "\u30D7\u30ED\u30D0\u30A4\u30C0\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9"}, //-providerpath + {"output.in.RFC.style", + "RFC\u30B9\u30BF\u30A4\u30EB\u306E\u51FA\u529B"}, //-rfc + {"signature.algorithm.name", + "\u7F72\u540D\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u540D"}, //-sigalg + {"source.alias", + "\u30BD\u30FC\u30B9\u5225\u540D"}, //-srcalias + {"source.key.password", + "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-srckeypass + {"source.keystore.name", + "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u540D"}, //-srckeystore + {"source.keystore.password.protected", + "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u4FDD\u8B77\u5BFE\u8C61\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-srcprotected + {"source.keystore.provider.name", + "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"}, //-srcprovidername + {"source.keystore.password", + "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-srcstorepass + {"source.keystore.type", + "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL\u30B5\u30FC\u30D0\u30FC\u306E\u30DB\u30B9\u30C8\u3068\u30DD\u30FC\u30C8"}, //-sslserver + {"signed.jar.file", + "\u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB"}, //=jarfile + {"certificate.validity.start.date.time", + "\u8A3C\u660E\u66F8\u306E\u6709\u52B9\u958B\u59CB\u65E5\u6642"}, //-startdate + {"keystore.password", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-storepass + {"keystore.type", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7"}, //-storetype + {"trust.certificates.from.cacerts", + "cacerts\u304B\u3089\u306E\u8A3C\u660E\u66F8\u3092\u4FE1\u983C\u3059\u308B"}, //-trustcacerts + {"verbose.output", + "\u8A73\u7D30\u51FA\u529B"}, //-v + {"validity.number.of.days", + "\u59A5\u5F53\u6027\u65E5\u6570"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "\u5931\u52B9\u3059\u308B\u8A3C\u660E\u66F8\u306E\u30B7\u30EA\u30A2\u30EBID"}, //-id + // keytool: Running part + {"keytool.error.", "keytool\u30A8\u30E9\u30FC: "}, + {"Illegal.option.", "\u4E0D\u6B63\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: "}, + {"Illegal.value.", "\u4E0D\u6B63\u306A\u5024: "}, + {"Unknown.password.type.", "\u4E0D\u660E\u306A\u30D1\u30B9\u30EF\u30FC\u30C9\u30FB\u30BF\u30A4\u30D7: "}, + {"Cannot.find.environment.variable.", + "\u74B0\u5883\u5909\u6570\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "}, + {"Cannot.find.file.", "\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "}, + {"Command.option.flag.needs.an.argument.", "\u30B3\u30DE\u30F3\u30C9\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306B\u306F\u5F15\u6570\u304C\u5FC5\u8981\u3067\u3059\u3002"}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "\u8B66\u544A: PKCS12\u30AD\u30FC\u30B9\u30C8\u30A2\u3067\u306F\u3001\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u7570\u306A\u308B\u72B6\u6CC1\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3002\u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F{0}\u306E\u5024\u306F\u7121\u8996\u3057\u307E\u3059\u3002"}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-storetype\u304C{0}\u306E\u5834\u5408\u3001-keystore\u306FNONE\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"Too.many.retries.program.terminated", + "\u518D\u8A66\u884C\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u30D7\u30ED\u30B0\u30E9\u30E0\u304C\u7D42\u4E86\u3057\u307E\u3057\u305F"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "-storetype\u304C{0}\u306E\u5834\u5408\u3001-storepasswd\u30B3\u30DE\u30F3\u30C9\u304A\u3088\u3073-keypasswd\u30B3\u30DE\u30F3\u30C9\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "-storetype\u304CPKCS12\u306E\u5834\u5408\u3001-keypasswd\u30B3\u30DE\u30F3\u30C9\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "-storetype\u304C{0}\u306E\u5834\u5408\u3001-keypass\u3068-new\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "-protected\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001-storepass\u3001-keypass\u304A\u3088\u3073-new\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "-srcprotected\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001-srcstorepass\u304A\u3088\u3073-srckeypass\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u4FDD\u8B77\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3001-storepass\u3001-keypass\u304A\u3088\u3073-new\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u4FDD\u8B77\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3001-srcstorepass\u304A\u3088\u3073-srckeypass\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, + {"Illegal.startdate.value", "startdate\u5024\u304C\u7121\u52B9\u3067\u3059"}, + {"Validity.must.be.greater.than.zero", + "\u59A5\u5F53\u6027\u306F\u30BC\u30ED\u3088\u308A\u5927\u304D\u3044\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"provName.not.a.provider", "{0}\u306F\u30D7\u30ED\u30D0\u30A4\u30C0\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, + {"Usage.error.no.command.provided", "\u4F7F\u7528\u30A8\u30E9\u30FC: \u30B3\u30DE\u30F3\u30C9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, + {"Source.keystore.file.exists.but.is.empty.", "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u3001\u5B58\u5728\u3057\u307E\u3059\u304C\u7A7A\u3067\u3059: "}, + {"Please.specify.srckeystore", "-srckeystore\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "'list'\u30B3\u30DE\u30F3\u30C9\u306B-v\u3068-rfc\u306E\u4E21\u65B9\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093"}, + {"Key.password.must.be.at.least.6.characters", + "\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F6\u6587\u5B57\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"New.password.must.be.at.least.6.characters", + "\u65B0\u898F\u30D1\u30B9\u30EF\u30FC\u30C9\u306F6\u6587\u5B57\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"Keystore.file.exists.but.is.empty.", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u5B58\u5728\u3057\u307E\u3059\u304C\u3001\u7A7A\u3067\u3059: "}, + {"Keystore.file.does.not.exist.", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u5B58\u5728\u3057\u307E\u305B\u3093: "}, + {"Must.specify.destination.alias", "\u51FA\u529B\u5148\u306E\u5225\u540D\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"Must.specify.alias", "\u5225\u540D\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"Keystore.password.must.be.at.least.6.characters", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F6\u6587\u5B57\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"Enter.keystore.password.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, + {"Enter.source.keystore.password.", "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, + {"Enter.destination.keystore.password.", "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u77ED\u3059\u304E\u307E\u3059 - 6\u6587\u5B57\u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Unknown.Entry.Type", "\u4E0D\u660E\u306A\u30A8\u30F3\u30C8\u30EA\u30FB\u30BF\u30A4\u30D7"}, + {"Too.many.failures.Alias.not.changed", "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u5225\u540D\u306F\u5909\u66F4\u3055\u308C\u307E\u305B\u3093"}, + {"Entry.for.alias.alias.successfully.imported.", + "\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u306B\u6210\u529F\u3057\u307E\u3057\u305F\u3002"}, + {"Entry.for.alias.alias.not.imported.", "\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306F\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002"}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u4E2D\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1}\u3002\n\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306F\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002"}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "\u30A4\u30F3\u30DD\u30FC\u30C8\u30FB\u30B3\u30DE\u30F3\u30C9\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F: {0}\u4EF6\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u304C\u6210\u529F\u3057\u307E\u3057\u305F\u3002{1}\u4EF6\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u304C\u5931\u6557\u3057\u305F\u304B\u53D6\u308A\u6D88\u3055\u308C\u307E\u3057\u305F"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "\u8B66\u544A: \u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306E\u65E2\u5B58\u306E\u5225\u540D{0}\u3092\u4E0A\u66F8\u304D\u3057\u3066\u3044\u307E\u3059"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "\u65E2\u5B58\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u5225\u540D{0}\u304C\u5B58\u5728\u3057\u3066\u3044\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\u3002[\u3044\u3044\u3048]: "}, + {"Too.many.failures.try.later", "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059 - \u5F8C\u3067\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Certification.request.stored.in.file.filename.", + "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30D5\u30A1\u30A4\u30EB<{0}>\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F"}, + {"Submit.this.to.your.CA", "\u3053\u308C\u3092CA\u306B\u63D0\u51FA\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "\u5225\u540D\u3092\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u3001\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u5225\u540D\u3001\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304A\u3088\u3073\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, + {"Certificate.stored.in.file.filename.", + "\u8A3C\u660E\u66F8\u304C\u30D5\u30A1\u30A4\u30EB<{0}>\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F"}, + {"Certificate.reply.was.installed.in.keystore", + "\u8A3C\u660E\u66F8\u5FDC\u7B54\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u307E\u3057\u305F"}, + {"Certificate.reply.was.not.installed.in.keystore", + "\u8A3C\u660E\u66F8\u5FDC\u7B54\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, + {"Certificate.was.added.to.keystore", + "\u8A3C\u660E\u66F8\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F"}, + {"Certificate.was.not.added.to.keystore", + "\u8A3C\u660E\u66F8\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, + {".Storing.ksfname.", "[{0}\u3092\u683C\u7D0D\u4E2D]"}, + {"alias.has.no.public.key.certificate.", + "{0}\u306B\u306F\u516C\u958B\u9375(\u8A3C\u660E\u66F8)\u304C\u3042\u308A\u307E\u305B\u3093"}, + {"Cannot.derive.signature.algorithm", + "\u7F72\u540D\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093"}, + {"Alias.alias.does.not.exist", + "\u5225\u540D<{0}>\u306F\u5B58\u5728\u3057\u307E\u305B\u3093"}, + {"Alias.alias.has.no.certificate", + "\u5225\u540D<{0}>\u306B\u306F\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "\u9375\u30DA\u30A2\u306F\u751F\u6210\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "{3}\u65E5\u9593\u6709\u52B9\u306A{0}\u30D3\u30C3\u30C8\u306E{1}\u306E\u9375\u30DA\u30A2\u3068\u81EA\u5DF1\u7F72\u540D\u578B\u8A3C\u660E\u66F8({2})\u3092\u751F\u6210\u3057\u3066\u3044\u307E\u3059\n\t\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u540D: {4}"}, + {"Enter.key.password.for.alias.", "<{0}>\u306E\u9375\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"}, + {".RETURN.if.same.as.keystore.password.", + "\t(\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u540C\u3058\u5834\u5408\u306FRETURN\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u77ED\u3059\u304E\u307E\u3059 - 6\u6587\u5B57\u4EE5\u4E0A\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Too.many.failures.key.not.added.to.keystore", + "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059 - \u9375\u306F\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, + {"Destination.alias.dest.already.exists", + "\u51FA\u529B\u5148\u306E\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u77ED\u3059\u304E\u307E\u3059 - 6\u6587\u5B57\u4EE5\u4E0A\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Too.many.failures.Key.entry.not.cloned", + "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u9375\u30A8\u30F3\u30C8\u30EA\u306E\u30AF\u30ED\u30FC\u30F3\u306F\u4F5C\u6210\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, + {"key.password.for.alias.", "<{0}>\u306E\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, + {"Keystore.entry.for.id.getName.already.exists", + "<{0}>\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30A8\u30F3\u30C8\u30EA\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, + {"Creating.keystore.entry.for.id.getName.", + "<{0}>\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u4E2D..."}, + {"No.entries.from.identity.database.added", + "\u30A2\u30A4\u30C7\u30F3\u30C6\u30A3\u30C6\u30A3\u30FB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u8FFD\u52A0\u3055\u308C\u305F\u30A8\u30F3\u30C8\u30EA\u306F\u3042\u308A\u307E\u305B\u3093"}, + {"Alias.name.alias", "\u5225\u540D: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "\u4F5C\u6210\u65E5: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0},{1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "\u30A8\u30F3\u30C8\u30EA\u30FB\u30BF\u30A4\u30D7: {0}"}, + {"Certificate.chain.length.", "\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u306E\u9577\u3055: "}, + {"Certificate.i.1.", "\u8A3C\u660E\u66F8[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "\u8A3C\u660E\u66F8\u306E\u30D5\u30A3\u30F3\u30AC\u30D7\u30EA\u30F3\u30C8(SHA1): "}, + {"Keystore.type.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7: "}, + {"Keystore.provider.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0: "}, + {"Your.keystore.contains.keyStore.size.entry", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u306F{0,number,integer}\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u307E\u3059"}, + {"Your.keystore.contains.keyStore.size.entries", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u306F{0,number,integer}\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u307E\u3059"}, + {"Failed.to.parse.input", "\u5165\u529B\u306E\u69CB\u6587\u89E3\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F"}, + {"Empty.input", "\u5165\u529B\u304C\u3042\u308A\u307E\u305B\u3093"}, + {"Not.X.509.certificate", "X.509\u8A3C\u660E\u66F8\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, + {"alias.has.no.public.key", "{0}\u306B\u306F\u516C\u958B\u9375\u304C\u3042\u308A\u307E\u305B\u3093"}, + {"alias.has.no.X.509.certificate", "{0}\u306B\u306FX.509\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, + {"New.certificate.self.signed.", "\u65B0\u3057\u3044\u8A3C\u660E\u66F8(\u81EA\u5DF1\u7F72\u540D\u578B):"}, + {"Reply.has.no.certificates", "\u5FDC\u7B54\u306B\u306F\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, + {"Certificate.not.imported.alias.alias.already.exists", + "\u8A3C\u660E\u66F8\u306F\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, + {"Input.not.an.X.509.certificate", "\u5165\u529B\u306FX.509\u8A3C\u660E\u66F8\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "\u8A3C\u660E\u66F8\u306F\u3001\u5225\u540D<{0}>\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, + {"Do.you.still.want.to.add.it.no.", + "\u8FFD\u52A0\u3057\u307E\u3059\u304B\u3002[\u3044\u3044\u3048]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "\u8A3C\u660E\u66F8\u306F\u3001\u5225\u540D<{0}>\u306E\u30B7\u30B9\u30C6\u30E0\u898F\u6A21\u306ECA\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306B\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3057\u307E\u3059\u304B\u3002 [\u3044\u3044\u3048]: "}, + {"Trust.this.certificate.no.", "\u3053\u306E\u8A3C\u660E\u66F8\u3092\u4FE1\u983C\u3057\u307E\u3059\u304B\u3002 [\u3044\u3044\u3048]: "}, + {"YES", "\u306F\u3044"}, + {"New.prompt.", "\u65B0\u898F{0}: "}, + {"Passwords.must.differ", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u7570\u306A\u3063\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"Re.enter.new.prompt.", "\u65B0\u898F{0}\u3092\u518D\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, + {"Re.enter.new.password.", "\u65B0\u898F\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u518D\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, + {"They.don.t.match.Try.again", "\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002\u3082\u3046\u4E00\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Enter.prompt.alias.name.", "{0}\u306E\u5225\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "\u65B0\u3057\u3044\u5225\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\t(\u3053\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u53D6\u308A\u6D88\u3059\u5834\u5408\u306FRETURN\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044): "}, + {"Enter.alias.name.", "\u5225\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(<{0}>\u3068\u540C\u3058\u5834\u5408\u306FRETURN\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044)"}, + {".PATTERN.printX509Cert", + "\u6240\u6709\u8005: {0}\n\u767A\u884C\u8005: {1}\n\u30B7\u30EA\u30A2\u30EB\u756A\u53F7: {2}\n\u6709\u52B9\u671F\u9593\u306E\u958B\u59CB\u65E5: {3}\u7D42\u4E86\u65E5: {4}\n\u8A3C\u660E\u66F8\u306E\u30D5\u30A3\u30F3\u30AC\u30D7\u30EA\u30F3\u30C8:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7F72\u540D\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u540D: {8}\n\t \u30D0\u30FC\u30B8\u30E7\u30F3: {9}"}, + {"What.is.your.first.and.last.name.", + "\u59D3\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"What.is.the.name.of.your.organizational.unit.", + "\u7D44\u7E54\u5358\u4F4D\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"What.is.the.name.of.your.organization.", + "\u7D44\u7E54\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"What.is.the.name.of.your.City.or.Locality.", + "\u90FD\u5E02\u540D\u307E\u305F\u306F\u5730\u57DF\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"What.is.the.name.of.your.State.or.Province.", + "\u90FD\u9053\u5E9C\u770C\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "\u3053\u306E\u5358\u4F4D\u306B\u8A72\u5F53\u3059\u308B2\u6587\u5B57\u306E\u56FD\u30B3\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"Is.name.correct.", "{0}\u3067\u3088\u308D\u3057\u3044\u3067\u3059\u304B\u3002"}, + {"no", "\u3044\u3044\u3048"}, + {"yes", "\u306F\u3044"}, + {"y", "y"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "\u5225\u540D<{0}>\u306B\u306F\u9375\u304C\u3042\u308A\u307E\u305B\u3093"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "\u5225\u540D<{0}>\u304C\u53C2\u7167\u3057\u3066\u3044\u308B\u30A8\u30F3\u30C8\u30EA\u30FB\u30BF\u30A4\u30D7\u306F\u79D8\u5BC6\u9375\u30A8\u30F3\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002-keyclone\u30B3\u30DE\u30F3\u30C9\u306F\u79D8\u5BC6\u9375\u30A8\u30F3\u30C8\u30EA\u306E\u30AF\u30ED\u30FC\u30F3\u4F5C\u6210\u306E\u307F\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, + + {".WARNING.WARNING.WARNING.", + "*****************\u8B66\u544A \u8B66\u544A \u8B66\u544A*****************"}, + {"Signer.d.", "\u7F72\u540D\u8005\u756A\u53F7%d:"}, + {"Timestamp.", "\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7:"}, + {"Signature.", "\u7F72\u540D:"}, + {"CRLs.", "CRL:"}, + {"Certificate.owner.", "\u8A3C\u660E\u66F8\u306E\u6240\u6709\u8005: "}, + {"Not.a.signed.jar.file", "\u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, + {"No.certificate.from.the.SSL.server", + "SSL\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u306E\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "*\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u4FDD\u5B58\u3055\u308C\u305F\u60C5\u5831\u306E\u6574\u5408\u6027\u306F*\n*\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u6574\u5408\u6027\u3092\u691C\u8A3C\u3059\u308B\u306B\u306F*\n*\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002*"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "*\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u4FDD\u5B58\u3055\u308C\u305F\u60C5\u5831\u306E\u6574\u5408\u6027\u306F*\n*\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u6574\u5408\u6027\u3092\u691C\u8A3C\u3059\u308B\u306B\u306F*\n*\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002*"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "\u8A3C\u660E\u66F8\u5FDC\u7B54\u306B\u306F\u3001<{0}>\u306E\u516C\u958B\u9375\u306F\u542B\u307E\u308C\u307E\u305B\u3093"}, + {"Incomplete.certificate.chain.in.reply", + "\u5FDC\u7B54\u3057\u305F\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u306F\u4E0D\u5B8C\u5168\u3067\u3059"}, + {"Certificate.chain.in.reply.does.not.verify.", + "\u5FDC\u7B54\u3057\u305F\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u306F\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093: "}, + {"Top.level.certificate.in.reply.", + "\u5FDC\u7B54\u3057\u305F\u30C8\u30C3\u30D7\u30EC\u30D9\u30EB\u306E\u8A3C\u660E\u66F8:\n"}, + {".is.not.trusted.", "... \u306F\u4FE1\u983C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 "}, + {"Install.reply.anyway.no.", "\u5FDC\u7B54\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3059\u304B\u3002[\u3044\u3044\u3048]: "}, + {"NO", "\u3044\u3044\u3048"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "\u5FDC\u7B54\u3057\u305F\u516C\u958B\u9375\u3068\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "\u8A3C\u660E\u66F8\u5FDC\u7B54\u3068\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306E\u8A3C\u660E\u66F8\u304C\u540C\u3058\u3067\u3059"}, + {"Failed.to.establish.chain.from.reply", + "\u5FDC\u7B54\u304B\u3089\u9023\u9396\u3092\u78BA\u7ACB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F"}, + {"n", "n"}, + {"Wrong.answer.try.again", "\u5FDC\u7B54\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059\u3002\u3082\u3046\u4E00\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "\u79D8\u5BC6\u9375\u306F\u751F\u6210\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, + {"Please.provide.keysize.for.secret.key.generation", + "\u79D8\u5BC6\u9375\u306E\u751F\u6210\u6642\u306B\u306F -keysize\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, + + {"Extensions.", "\u62E1\u5F35: "}, + {".Empty.value.", "(\u7A7A\u306E\u5024)"}, + {"Extension.Request.", "\u62E1\u5F35\u30EA\u30AF\u30A8\u30B9\u30C8:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8(\u30D0\u30FC\u30B8\u30E7\u30F31.0)\n\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8: %s\n\u516C\u958B\u9375: %s \u30D5\u30A9\u30FC\u30DE\u30C3\u30C8 %s \u30AD\u30FC\n"}, + {"Unknown.keyUsage.type.", "\u4E0D\u660E\u306AkeyUsage\u30BF\u30A4\u30D7: "}, + {"Unknown.extendedkeyUsage.type.", "\u4E0D\u660E\u306AextendedkeyUsage\u30BF\u30A4\u30D7: "}, + {"Unknown.AccessDescription.type.", "\u4E0D\u660E\u306AAccessDescription\u30BF\u30A4\u30D7: "}, + {"Unrecognized.GeneralName.type.", "\u8A8D\u8B58\u3055\u308C\u306A\u3044GeneralName\u30BF\u30A4\u30D7: "}, + {"This.extension.cannot.be.marked.as.critical.", + "\u3053\u306E\u62E1\u5F35\u306F\u30AF\u30EA\u30C6\u30A3\u30AB\u30EB\u3068\u3057\u3066\u30DE\u30FC\u30AF\u4ED8\u3051\u3067\u304D\u307E\u305B\u3093\u3002 "}, + {"Odd.number.of.hex.digits.found.", "\u5947\u6570\u306E16\u9032\u6570\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F: "}, + {"Unknown.extension.type.", "\u4E0D\u660E\u306A\u62E1\u5F35\u30BF\u30A4\u30D7: "}, + {"command.{0}.is.ambiguous.", "\u30B3\u30DE\u30F3\u30C9{0}\u306F\u3042\u3044\u307E\u3044\u3067\u3059:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_ko.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_ko.java new file mode 100644 index 00000000000..9f3f70f5024 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_ko.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_ko extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [\uC635\uC158]..."}, + {"Options.", "\uC635\uC158:"}, + {"Use.keytool.help.for.all.available.commands", + "\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uBAA8\uB4E0 \uBA85\uB839\uC5D0 \"keytool -help\" \uC0AC\uC6A9"}, + {"Key.and.Certificate.Management.Tool", + "\uD0A4 \uBC0F \uC778\uC99D\uC11C \uAD00\uB9AC \uD234"}, + {"Commands.", "\uBA85\uB839:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "command_name \uC0AC\uC6A9\uBC95\uC5D0 \"keytool -command_name -help\" \uC0AC\uC6A9"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "\uC778\uC99D\uC11C \uC694\uCCAD\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-certreq + {"Changes.an.entry.s.alias", + "\uD56D\uBAA9\uC758 \uBCC4\uCE6D\uC744 \uBCC0\uACBD\uD569\uB2C8\uB2E4."}, //-changealias + {"Deletes.an.entry", + "\uD56D\uBAA9\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4."}, //-delete + {"Exports.certificate", + "\uC778\uC99D\uC11C\uB97C \uC775\uC2A4\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-exportcert + {"Generates.a.key.pair", + "\uD0A4 \uC30D\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "\uBCF4\uC548 \uD0A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "\uC778\uC99D\uC11C \uC694\uCCAD\uC5D0\uC11C \uC778\uC99D\uC11C\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-gencert + {"Generates.CRL", "CRL\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "JDK 1.1.x \uC2A4\uD0C0\uC77C ID \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uD56D\uBAA9\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "\uC778\uC99D\uC11C \uB610\uB294 \uC778\uC99D\uC11C \uCCB4\uC778\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "\uB2E4\uB978 \uD0A4 \uC800\uC7A5\uC18C\uC5D0\uC11C \uD558\uB098 \uB610\uB294 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-importkeystore + {"Clones.a.key.entry", + "\uD0A4 \uD56D\uBAA9\uC744 \uBCF5\uC81C\uD569\uB2C8\uB2E4."}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "\uD56D\uBAA9\uC758 \uD0A4 \uBE44\uBC00\uBC88\uD638\uB97C \uBCC0\uACBD\uD569\uB2C8\uB2E4."}, //-keypasswd + {"Lists.entries.in.a.keystore", + "\uD0A4 \uC800\uC7A5\uC18C\uC758 \uD56D\uBAA9\uC744 \uB098\uC5F4\uD569\uB2C8\uB2E4."}, //-list + {"Prints.the.content.of.a.certificate", + "\uC778\uC99D\uC11C\uC758 \uCF58\uD150\uCE20\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4."}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "\uC778\uC99D\uC11C \uC694\uCCAD\uC758 \uCF58\uD150\uCE20\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4."}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "CRL \uD30C\uC77C\uC758 \uCF58\uD150\uCE20\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4."}, //-printcrl + {"Generates.a.self.signed.certificate", + "\uC790\uCCB4 \uC11C\uBA85\uB41C \uC778\uC99D\uC11C\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "\uD0A4 \uC800\uC7A5\uC18C\uC758 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB97C \uBCC0\uACBD\uD569\uB2C8\uB2E4."}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "\uCC98\uB9AC\uD560 \uD56D\uBAA9\uC758 \uBCC4\uCE6D \uC774\uB984"}, //-alias + {"destination.alias", + "\uB300\uC0C1 \uBCC4\uCE6D"}, //-destalias + {"destination.key.password", + "\uB300\uC0C1 \uD0A4 \uBE44\uBC00\uBC88\uD638"}, //-destkeypass + {"destination.keystore.name", + "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uC774\uB984"}, //-destkeystore + {"destination.keystore.password.protected", + "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB428"}, //-destprotected + {"destination.keystore.provider.name", + "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790 \uC774\uB984"}, //-destprovidername + {"destination.keystore.password", + "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638"}, //-deststorepass + {"destination.keystore.type", + "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uC720\uD615"}, //-deststoretype + {"distinguished.name", + "\uC2DD\uBCC4 \uC774\uB984"}, //-dname + {"X.509.extension", + "X.509 \uD655\uC7A5"}, //-ext + {"output.file.name", + "\uCD9C\uB825 \uD30C\uC77C \uC774\uB984"}, //-file and -outfile + {"input.file.name", + "\uC785\uB825 \uD30C\uC77C \uC774\uB984"}, //-file and -infile + {"key.algorithm.name", + "\uD0A4 \uC54C\uACE0\uB9AC\uC998 \uC774\uB984"}, //-keyalg + {"key.password", + "\uD0A4 \uBE44\uBC00\uBC88\uD638"}, //-keypass + {"key.bit.size", + "\uD0A4 \uBE44\uD2B8 \uD06C\uAE30"}, //-keysize + {"keystore.name", + "\uD0A4 \uC800\uC7A5\uC18C \uC774\uB984"}, //-keystore + {"new.password", + "\uC0C8 \uBE44\uBC00\uBC88\uD638"}, //-new + {"do.not.prompt", + "\uD655\uC778\uD558\uC9C0 \uC54A\uC74C"}, //-noprompt + {"password.through.protected.mechanism", + "\uBCF4\uD638\uB418\uB294 \uBA54\uCEE4\uB2C8\uC998\uC744 \uD1B5\uD55C \uBE44\uBC00\uBC88\uD638"}, //-protected + {"provider.argument", + "\uC81C\uACF5\uC790 \uC778\uC218"}, //-providerarg + {"provider.class.name", + "\uC81C\uACF5\uC790 \uD074\uB798\uC2A4 \uC774\uB984"}, //-providerclass + {"provider.name", + "\uC81C\uACF5\uC790 \uC774\uB984"}, //-providername + {"provider.classpath", + "\uC81C\uACF5\uC790 \uD074\uB798\uC2A4 \uACBD\uB85C"}, //-providerpath + {"output.in.RFC.style", + "RFC \uC2A4\uD0C0\uC77C\uC758 \uCD9C\uB825"}, //-rfc + {"signature.algorithm.name", + "\uC11C\uBA85 \uC54C\uACE0\uB9AC\uC998 \uC774\uB984"}, //-sigalg + {"source.alias", + "\uC18C\uC2A4 \uBCC4\uCE6D"}, //-srcalias + {"source.key.password", + "\uC18C\uC2A4 \uD0A4 \uBE44\uBC00\uBC88\uD638"}, //-srckeypass + {"source.keystore.name", + "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uC774\uB984"}, //-srckeystore + {"source.keystore.password.protected", + "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB428"}, //-srcprotected + {"source.keystore.provider.name", + "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790 \uC774\uB984"}, //-srcprovidername + {"source.keystore.password", + "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638"}, //-srcstorepass + {"source.keystore.type", + "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uC720\uD615"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL \uC11C\uBC84 \uD638\uC2A4\uD2B8 \uBC0F \uD3EC\uD2B8"}, //-sslserver + {"signed.jar.file", + "\uC11C\uBA85\uB41C jar \uD30C\uC77C"}, //=jarfile + {"certificate.validity.start.date.time", + "\uC778\uC99D\uC11C \uC720\uD6A8 \uAE30\uAC04 \uC2DC\uC791 \uB0A0\uC9DC/\uC2DC\uAC04"}, //-startdate + {"keystore.password", + "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638"}, //-storepass + {"keystore.type", + "\uD0A4 \uC800\uC7A5\uC18C \uC720\uD615"}, //-storetype + {"trust.certificates.from.cacerts", + "cacerts\uC758 \uBCF4\uC548 \uC778\uC99D\uC11C"}, //-trustcacerts + {"verbose.output", + "\uC0C1\uC138 \uC815\uBCF4 \uCD9C\uB825"}, //-v + {"validity.number.of.days", + "\uC720\uD6A8 \uAE30\uAC04 \uC77C \uC218"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "\uCCA0\uD68C\uD560 \uC778\uC99D\uC11C\uC758 \uC77C\uB828 ID"}, //-id + // keytool: Running part + {"keytool.error.", "keytool \uC624\uB958: "}, + {"Illegal.option.", "\uC798\uBABB\uB41C \uC635\uC158: "}, + {"Illegal.value.", "\uC798\uBABB\uB41C \uAC12: "}, + {"Unknown.password.type.", "\uC54C \uC218 \uC5C6\uB294 \uBE44\uBC00\uBC88\uD638 \uC720\uD615: "}, + {"Cannot.find.environment.variable.", + "\uD658\uACBD \uBCC0\uC218\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C: "}, + {"Cannot.find.file.", "\uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C: "}, + {"Command.option.flag.needs.an.argument.", "\uBA85\uB839 \uC635\uC158 {0}\uC5D0 \uC778\uC218\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "\uACBD\uACE0: \uB2E4\uB978 \uC800\uC7A5\uC18C \uBC0F \uD0A4 \uBE44\uBC00\uBC88\uD638\uB294 PKCS12 KeyStores\uC5D0 \uB300\uD574 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 \uC9C0\uC815\uD55C {0} \uAC12\uC744 \uBB34\uC2DC\uD558\uB294 \uC911\uC785\uB2C8\uB2E4."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-storetype\uC774 {0}\uC778 \uACBD\uC6B0 -keystore\uB294 NONE\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"Too.many.retries.program.terminated", + "\uC7AC\uC2DC\uB3C4 \uD69F\uC218\uAC00 \uB108\uBB34 \uB9CE\uC544 \uD504\uB85C\uADF8\uB7A8\uC774 \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "-storetype\uC774 {0}\uC778 \uACBD\uC6B0 -storepasswd \uBC0F -keypasswd \uBA85\uB839\uC774 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "-storetype\uC774 PKCS12\uC778 \uACBD\uC6B0 -keypasswd \uBA85\uB839\uC774 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "-storetype\uC774 {0}\uC778 \uACBD\uC6B0 -keypass \uBC0F -new\uB97C \uC9C0\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "-protected\uB97C \uC9C0\uC815\uD55C \uACBD\uC6B0 -storepass, -keypass \uBC0F -new\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "-srcprotected\uB97C \uC9C0\uC815\uD55C \uACBD\uC6B0 -srcstorepass \uBC0F -srckeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "\uD0A4 \uC800\uC7A5\uC18C\uAC00 \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB418\uC9C0 \uC54A\uB294 \uACBD\uC6B0 -storepass, -keypass \uBC0F -new\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C\uAC00 \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB418\uC9C0 \uC54A\uB294 \uACBD\uC6B0 -srcstorepass \uBC0F -srckeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, + {"Illegal.startdate.value", "startdate \uAC12\uC774 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, + {"Validity.must.be.greater.than.zero", + "\uC720\uD6A8 \uAE30\uAC04\uC740 0\uBCF4\uB2E4 \uCEE4\uC57C \uD569\uB2C8\uB2E4."}, + {"provName.not.a.provider", "{0}\uC740(\uB294) \uC81C\uACF5\uC790\uAC00 \uC544\uB2D9\uB2C8\uB2E4."}, + {"Usage.error.no.command.provided", "\uC0AC\uC6A9\uBC95 \uC624\uB958: \uBA85\uB839\uC744 \uC785\uB825\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {"Source.keystore.file.exists.but.is.empty.", "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uD30C\uC77C\uC774 \uC874\uC7AC\uD558\uC9C0\uB9CC \uBE44\uC5B4 \uC788\uC74C: "}, + {"Please.specify.srckeystore", "-srckeystore\uB97C \uC9C0\uC815\uD558\uC2ED\uC2DC\uC624."}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "'list' \uBA85\uB839\uC5D0 -v\uC640 -rfc\uB97C \uD568\uAED8 \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, + {"Key.password.must.be.at.least.6.characters", + "\uD0A4 \uBE44\uBC00\uBC88\uD638\uB294 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"New.password.must.be.at.least.6.characters", + "\uC0C8 \uBE44\uBC00\uBC88\uD638\uB294 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"Keystore.file.exists.but.is.empty.", + "\uD0A4 \uC800\uC7A5\uC18C \uD30C\uC77C\uC774 \uC874\uC7AC\uD558\uC9C0\uB9CC \uBE44\uC5B4 \uC788\uC74C: "}, + {"Keystore.file.does.not.exist.", + "\uD0A4 \uC800\uC7A5\uC18C \uD30C\uC77C\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC74C: "}, + {"Must.specify.destination.alias", "\uB300\uC0C1 \uBCC4\uCE6D\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4."}, + {"Must.specify.alias", "\uBCC4\uCE6D\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4."}, + {"Keystore.password.must.be.at.least.6.characters", + "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB294 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"Enter.keystore.password.", "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 \uC785\uB825: "}, + {"Enter.source.keystore.password.", "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 \uC785\uB825: "}, + {"Enter.destination.keystore.password.", "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 \uC785\uB825: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uAC00 \uB108\uBB34 \uC9E7\uC74C - 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"Unknown.Entry.Type", "\uC54C \uC218 \uC5C6\uB294 \uD56D\uBAA9 \uC720\uD615"}, + {"Too.many.failures.Alias.not.changed", "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4. \uBCC4\uCE6D\uC774 \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {"Entry.for.alias.alias.successfully.imported.", + "{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uC784\uD3EC\uD2B8\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, + {"Entry.for.alias.alias.not.imported.", "{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC774 \uC784\uD3EC\uD2B8\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC744 \uC784\uD3EC\uD2B8\uD558\uB294 \uC911 \uBB38\uC81C \uBC1C\uC0DD: {1}.\n{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC774 \uC784\uD3EC\uD2B8\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "\uC784\uD3EC\uD2B8 \uBA85\uB839 \uC644\uB8CC: \uC131\uACF5\uC801\uC73C\uB85C \uC784\uD3EC\uD2B8\uB41C \uD56D\uBAA9\uC740 {0}\uAC1C, \uC2E4\uD328\uD558\uAC70\uB098 \uCDE8\uC18C\uB41C \uD56D\uBAA9\uC740 {1}\uAC1C\uC785\uB2C8\uB2E4."}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "\uACBD\uACE0: \uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C\uC5D0\uC11C \uAE30\uC874 \uBCC4\uCE6D {0}\uC744(\uB97C) \uACB9\uCCD0 \uC4F0\uB294 \uC911"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "\uAE30\uC874 \uD56D\uBAA9 \uBCC4\uCE6D {0}\uC774(\uAC00) \uC874\uC7AC\uD569\uB2C8\uB2E4. \uACB9\uCCD0 \uC4F0\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, + {"Too.many.failures.try.later", "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC74C - \uB098\uC911\uC5D0 \uC2DC\uB3C4\uD558\uC2ED\uC2DC\uC624."}, + {"Certification.request.stored.in.file.filename.", + "\uC778\uC99D \uC694\uCCAD\uC774 <{0}> \uD30C\uC77C\uC5D0 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, + {"Submit.this.to.your.CA", "CA\uC5D0\uAC8C \uC81C\uCD9C\uD558\uC2ED\uC2DC\uC624."}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "\uBCC4\uCE6D\uC744 \uC9C0\uC815\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 destalias, srckeypass \uBC0F destkeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, + {"Certificate.stored.in.file.filename.", + "\uC778\uC99D\uC11C\uAC00 <{0}> \uD30C\uC77C\uC5D0 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, + {"Certificate.reply.was.installed.in.keystore", + "\uC778\uC99D\uC11C \uD68C\uC2E0\uC774 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC124\uCE58\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, + {"Certificate.reply.was.not.installed.in.keystore", + "\uC778\uC99D\uC11C \uD68C\uC2E0\uC774 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC124\uCE58\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {"Certificate.was.added.to.keystore", + "\uC778\uC99D\uC11C\uAC00 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, + {"Certificate.was.not.added.to.keystore", + "\uC778\uC99D\uC11C\uAC00 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uCD94\uAC00\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {".Storing.ksfname.", "[{0}\uC744(\uB97C) \uC800\uC7A5\uD558\uB294 \uC911]"}, + {"alias.has.no.public.key.certificate.", + "{0}\uC5D0 \uACF5\uC6A9 \uD0A4(\uC778\uC99D\uC11C)\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Cannot.derive.signature.algorithm", + "\uC11C\uBA85 \uC54C\uACE0\uB9AC\uC998\uC744 \uD30C\uC0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Alias.alias.does.not.exist", + "<{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, + {"Alias.alias.has.no.certificate", + "<{0}> \uBCC4\uCE6D\uC5D0 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Key.pair.not.generated.alias.alias.already.exists", + "\uD0A4 \uC30D\uC774 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC558\uC73C\uBA70 <{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "\uB2E4\uC74C\uC5D0 \uB300\uD574 \uC720\uD6A8 \uAE30\uAC04\uC774 {3}\uC77C\uC778 {0}\uBE44\uD2B8 {1} \uD0A4 \uC30D \uBC0F \uC790\uCCB4 \uC11C\uBA85\uB41C \uC778\uC99D\uC11C({2})\uB97C \uC0DD\uC131\uD558\uB294 \uC911\n\t: {4}"}, + {"Enter.key.password.for.alias.", "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, + {".RETURN.if.same.as.keystore.password.", + "\t(\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uC640 \uB3D9\uC77C\uD55C \uACBD\uC6B0 Enter \uD0A4\uB97C \uB204\uB984): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "\uD0A4 \uBE44\uBC00\uBC88\uD638\uAC00 \uB108\uBB34 \uC9E7\uC74C - 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"Too.many.failures.key.not.added.to.keystore", + "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC74C - \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uD0A4\uAC00 \uCD94\uAC00\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {"Destination.alias.dest.already.exists", + "\uB300\uC0C1 \uBCC4\uCE6D <{0}>\uC774(\uAC00) \uC874\uC7AC\uD569\uB2C8\uB2E4."}, + {"Password.is.too.short.must.be.at.least.6.characters", + "\uBE44\uBC00\uBC88\uD638\uAC00 \uB108\uBB34 \uC9E7\uC74C - 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"Too.many.failures.Key.entry.not.cloned", + "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4. \uD0A4 \uD56D\uBAA9\uC774 \uBCF5\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, + {"key.password.for.alias.", "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uBE44\uBC00\uBC88\uD638"}, + {"Keystore.entry.for.id.getName.already.exists", + "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uC800\uC7A5\uC18C \uD56D\uBAA9\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, + {"Creating.keystore.entry.for.id.getName.", + "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uC800\uC7A5\uC18C \uD56D\uBAA9\uC744 \uC0DD\uC131\uD558\uB294 \uC911..."}, + {"No.entries.from.identity.database.added", + "ID \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uCD94\uAC00\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Alias.name.alias", "\uBCC4\uCE6D \uC774\uB984: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "\uC0DD\uC131 \uB0A0\uC9DC: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "\uD56D\uBAA9 \uC720\uD615: {0}"}, + {"Certificate.chain.length.", "\uC778\uC99D\uC11C \uCCB4\uC778 \uAE38\uC774: "}, + {"Certificate.i.1.", "\uC778\uC99D\uC11C[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "\uC778\uC99D\uC11C \uC9C0\uBB38(SHA1): "}, + {"Keystore.type.", "\uD0A4 \uC800\uC7A5\uC18C \uC720\uD615: "}, + {"Keystore.provider.", "\uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790: "}, + {"Your.keystore.contains.keyStore.size.entry", + "\uD0A4 \uC800\uC7A5\uC18C\uC5D0 {0,number,integer}\uAC1C\uC758 \uD56D\uBAA9\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."}, + {"Your.keystore.contains.keyStore.size.entries", + "\uD0A4 \uC800\uC7A5\uC18C\uC5D0 {0,number,integer}\uAC1C\uC758 \uD56D\uBAA9\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."}, + {"Failed.to.parse.input", "\uC785\uB825\uAC12\uC758 \uAD6C\uBB38 \uBD84\uC11D\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."}, + {"Empty.input", "\uC785\uB825\uAC12\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."}, + {"Not.X.509.certificate", "X.509 \uC778\uC99D\uC11C\uAC00 \uC544\uB2D9\uB2C8\uB2E4."}, + {"alias.has.no.public.key", "{0}\uC5D0 \uACF5\uC6A9 \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"alias.has.no.X.509.certificate", "{0}\uC5D0 X.509 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"New.certificate.self.signed.", "\uC0C8 \uC778\uC99D\uC11C(\uC790\uCCB4 \uC11C\uBA85):"}, + {"Reply.has.no.certificates", "\uD68C\uC2E0\uC5D0 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Certificate.not.imported.alias.alias.already.exists", + "\uC778\uC99D\uC11C\uAC00 \uC784\uD3EC\uD2B8\uB418\uC9C0 \uC54A\uC558\uC73C\uBA70 <{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, + {"Input.not.an.X.509.certificate", "\uC785\uB825\uC774 X.509 \uC778\uC99D\uC11C\uAC00 \uC544\uB2D9\uB2C8\uB2E4."}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "\uC778\uC99D\uC11C\uAC00 <{0}> \uBCC4\uCE6D \uC544\uB798\uC758 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, + {"Do.you.still.want.to.add.it.no.", + "\uCD94\uAC00\uD558\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "\uC778\uC99D\uC11C\uAC00 <{0}> \uBCC4\uCE6D \uC544\uB798\uC5D0 \uC788\uB294 \uC2DC\uC2A4\uD15C \uCC28\uC6D0\uC758 CA \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "\uACE0\uC720\uD55C \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uCD94\uAC00\uD558\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, + {"Trust.this.certificate.no.", "\uC774 \uC778\uC99D\uC11C\uB97C \uC2E0\uB8B0\uD569\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, + {"YES", "\uC608"}, + {"New.prompt.", "\uC0C8 {0}: "}, + {"Passwords.must.differ", "\uBE44\uBC00\uBC88\uD638\uB294 \uB2EC\uB77C\uC57C \uD569\uB2C8\uB2E4."}, + {"Re.enter.new.prompt.", "\uC0C8 {0} \uB2E4\uC2DC \uC785\uB825: "}, + {"Re.enter.new.password.", "\uC0C8 \uBE44\uBC00\uBC88\uD638 \uB2E4\uC2DC \uC785\uB825: "}, + {"They.don.t.match.Try.again", "\uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC2ED\uC2DC\uC624."}, + {"Enter.prompt.alias.name.", "{0} \uBCC4\uCE6D \uC774\uB984 \uC785\uB825: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "\uC0C8 \uBCC4\uCE6D \uC774\uB984 \uC785\uB825\t(\uC774 \uD56D\uBAA9\uC5D0 \uB300\uD55C \uC784\uD3EC\uD2B8\uB97C \uCDE8\uC18C\uD558\uB824\uBA74 Enter \uD0A4\uB97C \uB204\uB984): "}, + {"Enter.alias.name.", "\uBCC4\uCE6D \uC774\uB984 \uC785\uB825: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(<{0}>\uACFC(\uC640) \uB3D9\uC77C\uD55C \uACBD\uC6B0 Enter \uD0A4\uB97C \uB204\uB984)"}, + {".PATTERN.printX509Cert", + "\uC18C\uC720\uC790: {0}\n\uBC1C\uD589\uC790: {1}\n\uC77C\uB828 \uBC88\uD638: {2}\n\uC801\uD569\uD55C \uC2DC\uC791 \uB0A0\uC9DC: {3}, \uC885\uB8CC \uB0A0\uC9DC: {4}\n\uC778\uC99D\uC11C \uC9C0\uBB38:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \uC11C\uBA85 \uC54C\uACE0\uB9AC\uC998 \uC774\uB984: {8}\n\t \uBC84\uC804: {9}"}, + {"What.is.your.first.and.last.name.", + "\uC774\uB984\uACFC \uC131\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, + {"What.is.the.name.of.your.organizational.unit.", + "\uC870\uC9C1 \uB2E8\uC704 \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, + {"What.is.the.name.of.your.organization.", + "\uC870\uC9C1 \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, + {"What.is.the.name.of.your.City.or.Locality.", + "\uAD6C/\uAD70/\uC2DC \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624?"}, + {"What.is.the.name.of.your.State.or.Province.", + "\uC2DC/\uB3C4 \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "\uC774 \uC870\uC9C1\uC758 \uB450 \uC790\uB9AC \uAD6D\uAC00 \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, + {"Is.name.correct.", "{0}\uC774(\uAC00) \uB9DE\uC2B5\uB2C8\uAE4C?"}, + {"no", "\uC544\uB2C8\uC624"}, + {"yes", "\uC608"}, + {"y", "y"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "<{0}> \uBCC4\uCE6D\uC5D0 \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "<{0}> \uBCC4\uCE6D\uC740 \uC804\uC6A9 \uD0A4 \uD56D\uBAA9\uC774 \uC544\uB2CC \uD56D\uBAA9 \uC720\uD615\uC744 \uCC38\uC870\uD569\uB2C8\uB2E4. -keyclone \uBA85\uB839\uC740 \uC804\uC6A9 \uD0A4 \uD56D\uBAA9\uC758 \uBCF5\uC81C\uB9CC \uC9C0\uC6D0\uD569\uB2C8\uB2E4."}, + + {".WARNING.WARNING.WARNING.", + "***************** \uACBD\uACE0 \uACBD\uACE0 \uACBD\uACE0 *****************"}, + {"Signer.d.", "\uC11C\uBA85\uC790 #%d:"}, + {"Timestamp.", "\uC2DC\uAC04 \uAE30\uB85D:"}, + {"Signature.", "\uC11C\uBA85:"}, + {"CRLs.", "CRL:"}, + {"Certificate.owner.", "\uC778\uC99D\uC11C \uC18C\uC720\uC790: "}, + {"Not.a.signed.jar.file", "\uC11C\uBA85\uB41C jar \uD30C\uC77C\uC774 \uC544\uB2D9\uB2C8\uB2E4."}, + {"No.certificate.from.the.SSL.server", + "SSL \uC11C\uBC84\uC5D0\uC11C \uAC00\uC838\uC628 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC800\uC7A5\uB41C \uC815\uBCF4\uC758 \uBB34\uACB0\uC131\uC774 *\n* \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4! \uBB34\uACB0\uC131\uC744 \uD655\uC778\uD558\uB824\uBA74, *\n* \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB97C \uC81C\uACF5\uD574\uC57C \uD569\uB2C8\uB2E4. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* srckeystore\uC5D0 \uC800\uC7A5\uB41C \uC815\uBCF4\uC758 \uBB34\uACB0\uC131\uC774 *\n* \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4! \uBB34\uACB0\uC131\uC744 \uD655\uC778\uD558\uB824\uBA74, *\n* srckeystore \uBE44\uBC00\uBC88\uD638\uB97C \uC81C\uACF5\uD574\uC57C \uD569\uB2C8\uB2E4. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "\uC778\uC99D\uC11C \uD68C\uC2E0\uC5D0 <{0}>\uC5D0 \uB300\uD55C \uACF5\uC6A9 \uD0A4\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, + {"Incomplete.certificate.chain.in.reply", + "\uD68C\uC2E0\uC5D0 \uBD88\uC644\uC804\uD55C \uC778\uC99D\uC11C \uCCB4\uC778\uC774 \uC788\uC2B5\uB2C8\uB2E4."}, + {"Certificate.chain.in.reply.does.not.verify.", + "\uD68C\uC2E0\uC758 \uC778\uC99D\uC11C \uCCB4\uC778\uC774 \uD655\uC778\uB418\uC9C0 \uC54A\uC74C: "}, + {"Top.level.certificate.in.reply.", + "\uD68C\uC2E0\uC5D0 \uCD5C\uC0C1\uC704 \uB808\uBCA8 \uC778\uC99D\uC11C\uAC00 \uC788\uC74C:\n"}, + {".is.not.trusted.", "...\uC744(\uB97C) \uC2E0\uB8B0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. "}, + {"Install.reply.anyway.no.", "\uD68C\uC2E0\uC744 \uC124\uCE58\uD558\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, + {"NO", "\uC544\uB2C8\uC624"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "\uD68C\uC2E0\uACFC \uD0A4 \uC800\uC7A5\uC18C\uC758 \uACF5\uC6A9 \uD0A4\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "\uD68C\uC2E0\uACFC \uD0A4 \uC800\uC7A5\uC18C\uC758 \uC778\uC99D\uC11C\uAC00 \uB3D9\uC77C\uD569\uB2C8\uB2E4."}, + {"Failed.to.establish.chain.from.reply", + "\uD68C\uC2E0\uC758 \uCCB4\uC778 \uC124\uC815\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."}, + {"n", "n"}, + {"Wrong.answer.try.again", "\uC798\uBABB\uB41C \uC751\uB2F5\uC785\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC2ED\uC2DC\uC624."}, + {"Secret.key.not.generated.alias.alias.already.exists", + "\uBCF4\uC548 \uD0A4\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC558\uC73C\uBA70 <{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, + {"Please.provide.keysize.for.secret.key.generation", + "\uBCF4\uC548 \uD0A4\uB97C \uC0DD\uC131\uD558\uB824\uBA74 -keysize\uB97C \uC81C\uACF5\uD558\uC2ED\uC2DC\uC624."}, + + {"Extensions.", "\uD655\uC7A5: "}, + {".Empty.value.", "(\uBE44\uC5B4 \uC788\uB294 \uAC12)"}, + {"Extension.Request.", "\uD655\uC7A5 \uC694\uCCAD:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10 \uC778\uC99D\uC11C \uC694\uCCAD(1.0 \uBC84\uC804)\n\uC81C\uBAA9: %s\n\uACF5\uC6A9 \uD0A4: %s \uD615\uC2DD %s \uD0A4\n"}, + {"Unknown.keyUsage.type.", "\uC54C \uC218 \uC5C6\uB294 keyUsage \uC720\uD615: "}, + {"Unknown.extendedkeyUsage.type.", "\uC54C \uC218 \uC5C6\uB294 extendedkeyUsage \uC720\uD615: "}, + {"Unknown.AccessDescription.type.", "\uC54C \uC218 \uC5C6\uB294 AccessDescription \uC720\uD615: "}, + {"Unrecognized.GeneralName.type.", "\uC54C \uC218 \uC5C6\uB294 GeneralName \uC720\uD615: "}, + {"This.extension.cannot.be.marked.as.critical.", + "\uC774 \uD655\uC7A5\uC740 \uC911\uC694\uD55C \uAC83\uC73C\uB85C \uD45C\uC2DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. "}, + {"Odd.number.of.hex.digits.found.", "\uD640\uC218 \uAC1C\uC758 16\uC9C4\uC218\uAC00 \uBC1C\uACAC\uB428: "}, + {"Unknown.extension.type.", "\uC54C \uC218 \uC5C6\uB294 \uD655\uC7A5 \uC720\uD615: "}, + {"command.{0}.is.ambiguous.", "{0} \uBA85\uB839\uC774 \uBAA8\uD638\uD568:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_pt_BR.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_pt_BR.java new file mode 100644 index 00000000000..50b4d26067e --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_pt_BR.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_pt_BR extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [Op\u00E7\u00E3o]..."}, + {"Options.", "Op\u00E7\u00F5es:"}, + {"Use.keytool.help.for.all.available.commands", + "Use \"keytool -help\" para todos os comandos dispon\u00EDveis"}, + {"Key.and.Certificate.Management.Tool", + "Ferramenta de Gerenciamento de Chave e Certificado"}, + {"Commands.", "Comandos:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "Use \"keytool -command_name -help\" para uso de command_name"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "Gera uma solicita\u00E7\u00E3o de certificado"}, //-certreq + {"Changes.an.entry.s.alias", + "Altera um alias de entrada"}, //-changealias + {"Deletes.an.entry", + "Deleta uma entrada"}, //-delete + {"Exports.certificate", + "Exporta o certificado"}, //-exportcert + {"Generates.a.key.pair", + "Gera um par de chaves"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "Gera uma chave Secreta"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "Gera um certificado de uma solicita\u00E7\u00E3o de certificado"}, //-gencert + {"Generates.CRL", "Gera CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Importa entradas de um banco de dados de identidade JDK 1.1.x-style"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "Importa um certificado ou uma cadeia de certificados"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "Importa uma ou todas as entradas de outra \u00E1rea de armazenamento de chaves"}, //-importkeystore + {"Clones.a.key.entry", + "Clona uma entrada de chave"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "Altera a senha da chave de uma entrada"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "Lista entradas em uma \u00E1rea de armazenamento de chaves"}, //-list + {"Prints.the.content.of.a.certificate", + "Imprime o conte\u00FAdo de um certificado"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "Imprime o conte\u00FAdo de uma solicita\u00E7\u00E3o de certificado"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "Imprime o conte\u00FAdo de um arquivo CRL"}, //-printcrl + {"Generates.a.self.signed.certificate", + "Gera um certificado autoassinado"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "Altera a senha de armazenamento de uma \u00E1rea de armazenamento de chaves"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "nome do alias da entrada a ser processada"}, //-alias + {"destination.alias", + "alias de destino"}, //-destalias + {"destination.key.password", + "senha da chave de destino"}, //-destkeypass + {"destination.keystore.name", + "nome da \u00E1rea de armazenamento de chaves de destino"}, //-destkeystore + {"destination.keystore.password.protected", + "senha protegida da \u00E1rea de armazenamento de chaves de destino"}, //-destprotected + {"destination.keystore.provider.name", + "nome do fornecedor da \u00E1rea de armazenamento de chaves de destino"}, //-destprovidername + {"destination.keystore.password", + "senha da \u00E1rea de armazenamento de chaves de destino"}, //-deststorepass + {"destination.keystore.type", + "tipo de \u00E1rea de armazenamento de chaves de destino"}, //-deststoretype + {"distinguished.name", + "nome distinto"}, //-dname + {"X.509.extension", + "extens\u00E3o X.509"}, //-ext + {"output.file.name", + "nome do arquivo de sa\u00EDda"}, //-file and -outfile + {"input.file.name", + "nome do arquivo de entrada"}, //-file and -infile + {"key.algorithm.name", + "nome do algoritmo da chave"}, //-keyalg + {"key.password", + "senha da chave"}, //-keypass + {"key.bit.size", + "tamanho do bit da chave"}, //-keysize + {"keystore.name", + "nome da \u00E1rea de armazenamento de chaves"}, //-keystore + {"new.password", + "nova senha"}, //-new + {"do.not.prompt", + "n\u00E3o perguntar"}, //-noprompt + {"password.through.protected.mechanism", + "senha por meio de mecanismo protegido"}, //-protected + {"provider.argument", + "argumento do fornecedor"}, //-providerarg + {"provider.class.name", + "nome da classe do fornecedor"}, //-providerclass + {"provider.name", + "nome do fornecedor"}, //-providername + {"provider.classpath", + "classpath do fornecedor"}, //-providerpath + {"output.in.RFC.style", + "sa\u00EDda no estilo RFC"}, //-rfc + {"signature.algorithm.name", + "nome do algoritmo de assinatura"}, //-sigalg + {"source.alias", + "alias de origem"}, //-srcalias + {"source.key.password", + "senha da chave de origem"}, //-srckeypass + {"source.keystore.name", + "nome da \u00E1rea de armazenamento de chaves de origem"}, //-srckeystore + {"source.keystore.password.protected", + "senha protegida da \u00E1rea de armazenamento de chaves de origem"}, //-srcprotected + {"source.keystore.provider.name", + "nome do fornecedor da \u00E1rea de armazenamento de chaves de origem"}, //-srcprovidername + {"source.keystore.password", + "senha da \u00E1rea de armazenamento de chaves de origem"}, //-srcstorepass + {"source.keystore.type", + "tipo de \u00E1rea de armazenamento de chaves de origem"}, //-srcstoretype + {"SSL.server.host.and.port", + "porta e host do servidor SSL"}, //-sslserver + {"signed.jar.file", + "arquivo jar assinado"}, //=jarfile + {"certificate.validity.start.date.time", + "data/hora inicial de validade do certificado"}, //-startdate + {"keystore.password", + "senha da \u00E1rea de armazenamento de chaves"}, //-storepass + {"keystore.type", + "tipo de \u00E1rea de armazenamento de chaves"}, //-storetype + {"trust.certificates.from.cacerts", + "certificados confi\u00E1veis do cacerts"}, //-trustcacerts + {"verbose.output", + "sa\u00EDda detalhada"}, //-v + {"validity.number.of.days", + "n\u00FAmero de dias da validade"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "ID de s\u00E9rie do certificado a ser revogado"}, //-id + // keytool: Running part + {"keytool.error.", "erro de keytool: "}, + {"Illegal.option.", "Op\u00E7\u00E3o inv\u00E1lida: "}, + {"Illegal.value.", "Valor inv\u00E1lido: "}, + {"Unknown.password.type.", "Tipo de senha desconhecido: "}, + {"Cannot.find.environment.variable.", + "N\u00E3o \u00E9 poss\u00EDvel localizar a vari\u00E1vel do ambiente: "}, + {"Cannot.find.file.", "N\u00E3o \u00E9 poss\u00EDvel localizar o arquivo: "}, + {"Command.option.flag.needs.an.argument.", "A op\u00E7\u00E3o de comando {0} precisa de um argumento."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "Advert\u00EAncia: Senhas de chave e de armazenamento diferentes n\u00E3o suportadas para KeyStores PKCS12. Ignorando valor {0} especificado pelo usu\u00E1rio."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-keystore deve ser NONE se -storetype for {0}"}, + {"Too.many.retries.program.terminated", + "Excesso de tentativas de repeti\u00E7\u00E3o; programa finalizado"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "comandos -storepasswd e -keypasswd n\u00E3o suportados se -storetype for {0}"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "comandos -keypasswd n\u00E3o suportados se -storetype for PKCS12"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "-keypass e -new n\u00E3o podem ser especificados se -storetype for {0}"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "se -protected for especificado, ent\u00E3o -storepass, -keypass e -new n\u00E3o dever\u00E3o ser especificados"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "se -srcprotected for especificado, ent\u00E3o -srcstorepass e -srckeypass n\u00E3o dever\u00E3o ser especificados"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "se a \u00E1rea de armazenamento de chaves n\u00E3o estiver protegida por senha, ent\u00E3o -storepass, -keypass e -new n\u00E3o dever\u00E3o ser especificados"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "se a \u00E1rea de armazenamento de chaves de origem n\u00E3o estiver protegida por senha, ent\u00E3o -srcstorepass e -srckeypass n\u00E3o dever\u00E3o ser especificados"}, + {"Illegal.startdate.value", "valor da data inicial inv\u00E1lido"}, + {"Validity.must.be.greater.than.zero", + "A validade deve ser maior do que zero"}, + {"provName.not.a.provider", "{0} n\u00E3o \u00E9 um fornecedor"}, + {"Usage.error.no.command.provided", "Erro de uso: nenhum comando fornecido"}, + {"Source.keystore.file.exists.but.is.empty.", "O arquivo da \u00E1rea de armazenamento de chaves de origem existe, mas est\u00E1 vazio: "}, + {"Please.specify.srckeystore", "Especifique -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "N\u00E3o devem ser especificados -v e -rfc com o comando 'list'"}, + {"Key.password.must.be.at.least.6.characters", + "A senha da chave deve ter, no m\u00EDnimo, 6 caracteres"}, + {"New.password.must.be.at.least.6.characters", + "A nova senha deve ter, no m\u00EDnimo, 6 caracteres"}, + {"Keystore.file.exists.but.is.empty.", + "O arquivo da \u00E1rea de armazenamento de chaves existe, mas est\u00E1 vazio: "}, + {"Keystore.file.does.not.exist.", + "O arquivo da \u00E1rea de armazenamento de chaves n\u00E3o existe. "}, + {"Must.specify.destination.alias", "Deve ser especificado um alias de destino"}, + {"Must.specify.alias", "Deve ser especificado um alias"}, + {"Keystore.password.must.be.at.least.6.characters", + "A senha da \u00E1rea de armazenamento de chaves deve ter, no m\u00EDnimo, 6 caracteres"}, + {"Enter.keystore.password.", "Informe a senha da \u00E1rea de armazenamento de chaves: "}, + {"Enter.source.keystore.password.", "Informe a senha da \u00E1rea de armazenamento de chaves de origem: "}, + {"Enter.destination.keystore.password.", "Informe a senha da \u00E1rea de armazenamento de chaves de destino: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "A senha da \u00E1rea de armazenamento de chaves \u00E9 muito curta - ela deve ter, no m\u00EDnimo, 6 caracteres"}, + {"Unknown.Entry.Type", "Tipo de Entrada Desconhecido"}, + {"Too.many.failures.Alias.not.changed", "Excesso de falhas. Alias n\u00E3o alterado"}, + {"Entry.for.alias.alias.successfully.imported.", + "Entrada do alias {0} importada com \u00EAxito."}, + {"Entry.for.alias.alias.not.imported.", "Entrada do alias {0} n\u00E3o importada."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "Problema ao importar a entrada do alias {0}: {1}.\nEntrada do alias {0} n\u00E3o importada."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "Comando de importa\u00E7\u00E3o conclu\u00EDdo: {0} entradas importadas com \u00EAxito, {1} entradas falharam ou foram canceladas"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "Advert\u00EAncia: Substitui\u00E7\u00E3o do alias {0} existente na \u00E1rea de armazenamento de chaves de destino"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "Entrada j\u00E1 existente no alias {0}, substituir? [n\u00E3o]: "}, + {"Too.many.failures.try.later", "Excesso de falhas - tente mais tarde"}, + {"Certification.request.stored.in.file.filename.", + "Solicita\u00E7\u00E3o de certificado armazenada no arquivo <{0}>"}, + {"Submit.this.to.your.CA", "Submeter \u00E0 CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "se o alias n\u00E3o estiver especificado, destalias, srckeypass e destkeypass n\u00E3o dever\u00E3o ser especificados"}, + {"Certificate.stored.in.file.filename.", + "Certificado armazenado no arquivo <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "A resposta do certificado foi instalada na \u00E1rea de armazenamento de chaves"}, + {"Certificate.reply.was.not.installed.in.keystore", + "A resposta do certificado n\u00E3o foi instalada na \u00E1rea de armazenamento de chaves"}, + {"Certificate.was.added.to.keystore", + "O certificado foi adicionado \u00E0 \u00E1rea de armazenamento de chaves"}, + {"Certificate.was.not.added.to.keystore", + "O certificado n\u00E3o foi adicionado \u00E0 \u00E1rea de armazenamento de chaves"}, + {".Storing.ksfname.", "[Armazenando {0}]"}, + {"alias.has.no.public.key.certificate.", + "{0} n\u00E3o tem chave p\u00FAblica (certificado)"}, + {"Cannot.derive.signature.algorithm", + "N\u00E3o \u00E9 poss\u00EDvel obter um algoritmo de assinatura"}, + {"Alias.alias.does.not.exist", + "O alias <{0}> n\u00E3o existe"}, + {"Alias.alias.has.no.certificate", + "O alias <{0}> n\u00E3o tem certificado"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "Par de chaves n\u00E3o gerado; o alias <{0}> j\u00E1 existe"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "Gerando o par de chaves {1} de {0} bit e o certificado autoassinado ({2}) com uma validade de {3} dias\n\tpara: {4}"}, + {"Enter.key.password.for.alias.", "Informar a senha da chave de <{0}>"}, + {".RETURN.if.same.as.keystore.password.", + "\t(RETURN se for igual \u00E0 senha da \u00E1rea do armazenamento de chaves): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "A senha da chave \u00E9 muito curta - deve ter, no m\u00EDnimo, 6 caracteres"}, + {"Too.many.failures.key.not.added.to.keystore", + "Excesso de falhas - chave n\u00E3o adicionada a \u00E1rea de armazenamento de chaves"}, + {"Destination.alias.dest.already.exists", + "O alias de destino <{0}> j\u00E1 existe"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "A senha \u00E9 muito curta - deve ter, no m\u00EDnimo, 6 caracteres"}, + {"Too.many.failures.Key.entry.not.cloned", + "Excesso de falhas. Entrada da chave n\u00E3o clonada"}, + {"key.password.for.alias.", "senha da chave de <{0}>"}, + {"Keystore.entry.for.id.getName.already.exists", + "A entrada da \u00E1rea do armazenamento de chaves de <{0}> j\u00E1 existe"}, + {"Creating.keystore.entry.for.id.getName.", + "Criando entrada da \u00E1rea do armazenamento de chaves para <{0}> ..."}, + {"No.entries.from.identity.database.added", + "Nenhuma entrada adicionada do banco de dados de identidades"}, + {"Alias.name.alias", "Nome do alias: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "Data de cria\u00E7\u00E3o: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Tipo de entrada: {0}"}, + {"Certificate.chain.length.", "Comprimento da cadeia de certificados: "}, + {"Certificate.i.1.", "Certificado[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Fingerprint (MD5) do certificado: "}, + {"Keystore.type.", "Tipo de \u00E1rea de armazenamento de chaves: "}, + {"Keystore.provider.", "Fornecedor da \u00E1rea de armazenamento de chaves: "}, + {"Your.keystore.contains.keyStore.size.entry", + "Sua \u00E1rea de armazenamento de chaves cont\u00E9m {0,number,integer} entrada"}, + {"Your.keystore.contains.keyStore.size.entries", + "Sua \u00E1rea de armazenamento de chaves cont\u00E9m {0,number,integer} entradas"}, + {"Failed.to.parse.input", "Falha durante o parse da entrada"}, + {"Empty.input", "Entrada vazia"}, + {"Not.X.509.certificate", "N\u00E3o \u00E9 um certificado X.509"}, + {"alias.has.no.public.key", "{0} n\u00E3o tem chave p\u00FAblica"}, + {"alias.has.no.X.509.certificate", "{0} n\u00E3o tem certificado X.509"}, + {"New.certificate.self.signed.", "Novo certificado (autoassinado):"}, + {"Reply.has.no.certificates", "A resposta n\u00E3o tem certificado"}, + {"Certificate.not.imported.alias.alias.already.exists", + "Certificado n\u00E3o importado, o alias <{0}> j\u00E1 existe"}, + {"Input.not.an.X.509.certificate", "A entrada n\u00E3o \u00E9 um certificado X.509"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "O certificado j\u00E1 existe no armazenamento de chaves no alias <{0}>"}, + {"Do.you.still.want.to.add.it.no.", + "Ainda deseja adicion\u00E1-lo? [n\u00E3o]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "O certificado j\u00E1 existe na \u00E1rea de armazenamento de chaves da CA em todo o sistema no alias <{0}>"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "Ainda deseja adicion\u00E1-lo \u00E0 sua \u00E1rea de armazenamento de chaves? [n\u00E3o]: "}, + {"Trust.this.certificate.no.", "Confiar neste certificado? [n\u00E3o]: "}, + {"YES", "Sim"}, + {"New.prompt.", "Nova {0}: "}, + {"Passwords.must.differ", "As senhas devem ser diferentes"}, + {"Re.enter.new.prompt.", "Informe novamente a nova {0}: "}, + {"Re.enter.new.password.", "Informe novamente a nova senha: "}, + {"They.don.t.match.Try.again", "Elas n\u00E3o correspondem. Tente novamente"}, + {"Enter.prompt.alias.name.", "Informe o nome do alias {0}: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "Informe o novo nome do alias\t(RETURN para cancelar a importa\u00E7\u00E3o desta entrada): "}, + {"Enter.alias.name.", "Informe o nome do alias: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(RETURN se for igual ao de <{0}>)"}, + {".PATTERN.printX509Cert", + "Propriet\u00E1rio: {0}\nEmissor: {1}\nN\u00FAmero de s\u00E9rie: {2}\nV\u00E1lido de: {3} a: {4}\nFingerprints do certificado:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Nome do algoritmo de assinatura: {8}\n\t Vers\u00E3o: {9}"}, + {"What.is.your.first.and.last.name.", + "Qual \u00E9 o seu nome e o seu sobrenome?"}, + {"What.is.the.name.of.your.organizational.unit.", + "Qual \u00E9 o nome da sua unidade organizacional?"}, + {"What.is.the.name.of.your.organization.", + "Qual \u00E9 o nome da sua empresa?"}, + {"What.is.the.name.of.your.City.or.Locality.", + "Qual \u00E9 o nome da sua Cidade ou Localidade?"}, + {"What.is.the.name.of.your.State.or.Province.", + "Qual \u00E9 o nome do seu Estado ou Munic\u00EDpio?"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "Quais s\u00E3o as duas letras do c\u00F3digo do pa\u00EDs desta unidade?"}, + {"Is.name.correct.", "{0} Est\u00E1 correto?"}, + {"no", "n\u00E3o"}, + {"yes", "sim"}, + {"y", "s"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "O alias <{0}> n\u00E3o tem chave"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "O alias <{0}> faz refer\u00EAncia a um tipo de entrada que n\u00E3o \u00E9 uma entrada de chave privada. O comando -keyclone oferece suporte somente \u00E0 clonagem de entradas de chave privada"}, + + {".WARNING.WARNING.WARNING.", + "***************** Advert\u00EAncia Advert\u00EAncia Advert\u00EAncia *****************"}, + {"Signer.d.", "Signat\u00E1rio #%d:"}, + {"Timestamp.", "Timestamp:"}, + {"Signature.", "Assinatura:"}, + {"CRLs.", "CRLs:"}, + {"Certificate.owner.", "Propriet\u00E1rio do certificado: "}, + {"Not.a.signed.jar.file", "N\u00E3o \u00E9 um arquivo jar assinado"}, + {"No.certificate.from.the.SSL.server", + "N\u00E3o \u00E9 um certificado do servidor SSL"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* A integridade das informa\u00E7\u00F5es armazenadas na sua \u00E1rea de armazenamento de chaves *\n* N\u00C3O foi verificada! Para que seja poss\u00EDvel verificar sua integridade, *\n* voc\u00EA deve fornecer a senha da \u00E1rea de armazenamento de chaves. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* A integridade das informa\u00E7\u00F5es armazenadas no srckeystore *\n* N\u00C3O foi verificada! Para que seja poss\u00EDvel verificar sua integridade, *\n* voc\u00EA deve fornecer a senha do srckeystore. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "A resposta do certificado n\u00E3o cont\u00E9m a chave p\u00FAblica de <{0}>"}, + {"Incomplete.certificate.chain.in.reply", + "Cadeia de certificados incompleta na resposta"}, + {"Certificate.chain.in.reply.does.not.verify.", + "A cadeia de certificados da resposta n\u00E3o verifica: "}, + {"Top.level.certificate.in.reply.", + "Certificado de n\u00EDvel superior na resposta:\n"}, + {".is.not.trusted.", "... n\u00E3o \u00E9 confi\u00E1vel. "}, + {"Install.reply.anyway.no.", "Instalar resposta assim mesmo? [n\u00E3o]: "}, + {"NO", "N\u00E3o"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "As chaves p\u00FAblicas da resposta e da \u00E1rea de armazenamento de chaves n\u00E3o correspondem"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "O certificado da resposta e o certificado da \u00E1rea de armazenamento de chaves s\u00E3o id\u00EAnticos"}, + {"Failed.to.establish.chain.from.reply", + "Falha ao estabelecer a cadeia a partir da resposta"}, + {"n", "n"}, + {"Wrong.answer.try.again", "Resposta errada; tente novamente"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "Chave secreta n\u00E3o gerada; o alias <{0}> j\u00E1 existe"}, + {"Please.provide.keysize.for.secret.key.generation", + "Forne\u00E7a o -keysize para a gera\u00E7\u00E3o da chave secreta"}, + + {"Extensions.", "Extens\u00F5es: "}, + {".Empty.value.", "(Valor vazio)"}, + {"Extension.Request.", "Solicita\u00E7\u00E3o de Extens\u00E3o:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "Solicita\u00E7\u00E3o do Certificado PKCS #10 (Vers\u00E3o 1.0)\nAssunto: %s\nChave P\u00FAblica: %s formato %s chave\n"}, + {"Unknown.keyUsage.type.", "Tipo de keyUsage desconhecido: "}, + {"Unknown.extendedkeyUsage.type.", "Tipo de extendedkeyUsage desconhecido: "}, + {"Unknown.AccessDescription.type.", "Tipo de AccessDescription desconhecido: "}, + {"Unrecognized.GeneralName.type.", "Tipo de GeneralName n\u00E3o reconhecido: "}, + {"This.extension.cannot.be.marked.as.critical.", + "Esta extens\u00E3o n\u00E3o pode ser marcada como cr\u00EDtica. "}, + {"Odd.number.of.hex.digits.found.", "Encontrado n\u00FAmero \u00EDmpar de seis d\u00EDgitos: "}, + {"Unknown.extension.type.", "Tipo de extens\u00E3o desconhecido: "}, + {"command.{0}.is.ambiguous.", "o comando {0} \u00E9 amb\u00EDguo:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_sv.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_sv.java new file mode 100644 index 00000000000..a4727e64c88 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_sv.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_sv extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [Alternativ]..."}, + {"Options.", "Alternativ:"}, + {"Use.keytool.help.for.all.available.commands", + "L\u00E4s \"Hj\u00E4lp - Nyckelverktyg\" f\u00F6r alla tillg\u00E4ngliga kommandon"}, + {"Key.and.Certificate.Management.Tool", + "Hanteringsverktyg f\u00F6r nycklar och certifikat"}, + {"Commands.", "Kommandon:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "L\u00E4s \"Hj\u00E4lp - Nyckelverktyg - command_name\" om anv\u00E4ndning av command_name"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "Genererar certifikatbeg\u00E4ran"}, //-certreq + {"Changes.an.entry.s.alias", + "\u00C4ndrar postalias"}, //-changealias + {"Deletes.an.entry", + "Tar bort post"}, //-delete + {"Exports.certificate", + "Exporterar certifikat"}, //-exportcert + {"Generates.a.key.pair", + "Genererar nyckelpar"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "Genererar hemlig nyckel"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "Genererar certifikat fr\u00E5n certifikatbeg\u00E4ran"}, //-gencert + {"Generates.CRL", "Genererar CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "Importerar poster fr\u00E5n identitetsdatabas i JDK 1.1.x-format"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "Importerar ett certifikat eller en certifikatkedja"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "Importerar en eller alla poster fr\u00E5n annat nyckellager"}, //-importkeystore + {"Clones.a.key.entry", + "Klonar en nyckelpost"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "\u00C4ndrar nyckell\u00F6senordet f\u00F6r en post"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "Visar lista \u00F6ver poster i nyckellager"}, //-list + {"Prints.the.content.of.a.certificate", + "Skriver ut inneh\u00E5llet i ett certifikat"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "Skriver ut inneh\u00E5llet i en certifikatbeg\u00E4ran"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "Skriver ut inneh\u00E5llet i en CRL-fil"}, //-printcrl + {"Generates.a.self.signed.certificate", + "Genererar ett sj\u00E4lvsignerat certifikat"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "\u00C4ndrar lagerl\u00F6senordet f\u00F6r ett nyckellager"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "aliasnamn f\u00F6r post som ska bearbetas"}, //-alias + {"destination.alias", + "destinationsalias"}, //-destalias + {"destination.key.password", + "l\u00F6senord f\u00F6r destinationsnyckel"}, //-destkeypass + {"destination.keystore.name", + "namn p\u00E5 destinationsnyckellager"}, //-destkeystore + {"destination.keystore.password.protected", + "skyddat l\u00F6senord f\u00F6r destinationsnyckellager"}, //-destprotected + {"destination.keystore.provider.name", + "leverant\u00F6rsnamn f\u00F6r destinationsnyckellager"}, //-destprovidername + {"destination.keystore.password", + "l\u00F6senord f\u00F6r destinationsnyckellager"}, //-deststorepass + {"destination.keystore.type", + "typ av destinationsnyckellager"}, //-deststoretype + {"distinguished.name", + "unikt namn"}, //-dname + {"X.509.extension", + "X.509-till\u00E4gg"}, //-ext + {"output.file.name", + "namn p\u00E5 utdatafil"}, //-file and -outfile + {"input.file.name", + "namn p\u00E5 indatafil"}, //-file and -infile + {"key.algorithm.name", + "namn p\u00E5 nyckelalgoritm"}, //-keyalg + {"key.password", + "nyckell\u00F6senord"}, //-keypass + {"key.bit.size", + "nyckelbitstorlek"}, //-keysize + {"keystore.name", + "namn p\u00E5 nyckellager"}, //-keystore + {"new.password", + "nytt l\u00F6senord"}, //-new + {"do.not.prompt", + "fr\u00E5ga inte"}, //-noprompt + {"password.through.protected.mechanism", + "l\u00F6senord med skyddad mekanism"}, //-protected + {"provider.argument", + "leverant\u00F6rsargument"}, //-providerarg + {"provider.class.name", + "namn p\u00E5 leverant\u00F6rsklass"}, //-providerclass + {"provider.name", + "leverant\u00F6rsnamn"}, //-providername + {"provider.classpath", + "leverant\u00F6rsklass\u00F6kv\u00E4g"}, //-providerpath + {"output.in.RFC.style", + "utdata i RFC-format"}, //-rfc + {"signature.algorithm.name", + "namn p\u00E5 signaturalgoritm"}, //-sigalg + {"source.alias", + "k\u00E4llalias"}, //-srcalias + {"source.key.password", + "l\u00F6senord f\u00F6r k\u00E4llnyckel"}, //-srckeypass + {"source.keystore.name", + "namn p\u00E5 k\u00E4llnyckellager"}, //-srckeystore + {"source.keystore.password.protected", + "skyddat l\u00F6senord f\u00F6r k\u00E4llnyckellager"}, //-srcprotected + {"source.keystore.provider.name", + "leverant\u00F6rsnamn f\u00F6r k\u00E4llnyckellager"}, //-srcprovidername + {"source.keystore.password", + "l\u00F6senord f\u00F6r k\u00E4llnyckellager"}, //-srcstorepass + {"source.keystore.type", + "typ av k\u00E4llnyckellager"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL-serverv\u00E4rd och -port"}, //-sslserver + {"signed.jar.file", + "signerad jar-fil"}, //=jarfile + {"certificate.validity.start.date.time", + "startdatum/-tid f\u00F6r certifikatets giltighet"}, //-startdate + {"keystore.password", + "l\u00F6senord f\u00F6r nyckellager"}, //-storepass + {"keystore.type", + "nyckellagertyp"}, //-storetype + {"trust.certificates.from.cacerts", + "tillf\u00F6rlitliga certifikat fr\u00E5n cacerts"}, //-trustcacerts + {"verbose.output", + "utf\u00F6rliga utdata"}, //-v + {"validity.number.of.days", + "antal dagar f\u00F6r giltighet"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "Seriellt ID f\u00F6r certifikat som ska \u00E5terkallas"}, //-id + // keytool: Running part + {"keytool.error.", "nyckelverktygsfel: "}, + {"Illegal.option.", "Otill\u00E5tet alternativ: "}, + {"Illegal.value.", "Otill\u00E5tet v\u00E4rde: "}, + {"Unknown.password.type.", "Ok\u00E4nd l\u00F6senordstyp: "}, + {"Cannot.find.environment.variable.", + "Kan inte hitta milj\u00F6variabel: "}, + {"Cannot.find.file.", "Hittar inte fil: "}, + {"Command.option.flag.needs.an.argument.", "Kommandoalternativet {0} beh\u00F6ver ett argument."}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "Varning! PKCS12-nyckellager har inte st\u00F6d f\u00F6r olika l\u00F6senord f\u00F6r lagret och nyckeln. Det anv\u00E4ndarspecificerade {0}-v\u00E4rdet ignoreras."}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "-keystore m\u00E5ste vara NONE om -storetype \u00E4r {0}"}, + {"Too.many.retries.program.terminated", + "F\u00F6r m\u00E5nga f\u00F6rs\u00F6k. Programmet avslutas"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "-storepasswd- och -keypasswd-kommandon st\u00F6ds inte om -storetype \u00E4r {0}"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "-keypasswd-kommandon st\u00F6ds inte om -storetype \u00E4r PKCS12"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "-keypass och -new kan inte anges om -storetype \u00E4r {0}"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "om -protected har angetts f\u00E5r inte -storepass, -keypass och -new anges"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "om -srcprotected anges f\u00E5r -srcstorepass och -srckeypass inte anges"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "om nyckellagret inte \u00E4r l\u00F6senordsskyddat f\u00E5r -storepass, -keypass och -new inte anges"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "om k\u00E4llnyckellagret inte \u00E4r l\u00F6senordsskyddat f\u00E5r -srcstorepass och -srckeypass inte anges"}, + {"Illegal.startdate.value", "Otill\u00E5tet v\u00E4rde f\u00F6r startdatum"}, + {"Validity.must.be.greater.than.zero", + "Giltigheten m\u00E5ste vara st\u00F6rre \u00E4n noll"}, + {"provName.not.a.provider", "{0} \u00E4r inte en leverant\u00F6r"}, + {"Usage.error.no.command.provided", "Syntaxfel: inget kommando angivet"}, + {"Source.keystore.file.exists.but.is.empty.", "Nyckellagrets k\u00E4llfil finns, men \u00E4r tom: "}, + {"Please.specify.srckeystore", "Ange -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "Kan inte specificera b\u00E5de -v och -rfc med 'list'-kommandot"}, + {"Key.password.must.be.at.least.6.characters", + "Nyckell\u00F6senordet m\u00E5ste inneh\u00E5lla minst 6 tecken"}, + {"New.password.must.be.at.least.6.characters", + "Det nya l\u00F6senordet m\u00E5ste inneh\u00E5lla minst 6 tecken"}, + {"Keystore.file.exists.but.is.empty.", + "Nyckellagerfilen finns, men \u00E4r tom: "}, + {"Keystore.file.does.not.exist.", + "Nyckellagerfilen finns inte: "}, + {"Must.specify.destination.alias", "Du m\u00E5ste ange destinationsalias"}, + {"Must.specify.alias", "Du m\u00E5ste ange alias"}, + {"Keystore.password.must.be.at.least.6.characters", + "Nyckellagerl\u00F6senordet m\u00E5ste inneh\u00E5lla minst 6 tecken"}, + {"Enter.keystore.password.", "Ange nyckellagerl\u00F6senord: "}, + {"Enter.source.keystore.password.", "Ange l\u00F6senord f\u00F6r k\u00E4llnyckellagret: "}, + {"Enter.destination.keystore.password.", "Ange nyckellagerl\u00F6senord f\u00F6r destination: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "Nyckellagerl\u00F6senordet \u00E4r f\u00F6r kort - det m\u00E5ste inneh\u00E5lla minst 6 tecken"}, + {"Unknown.Entry.Type", "Ok\u00E4nd posttyp"}, + {"Too.many.failures.Alias.not.changed", "F\u00F6r m\u00E5nga fel. Alias har inte \u00E4ndrats"}, + {"Entry.for.alias.alias.successfully.imported.", + "Posten f\u00F6r alias {0} har importerats."}, + {"Entry.for.alias.alias.not.imported.", "Posten f\u00F6r alias {0} har inte importerats."}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "Ett problem uppstod vid importen av posten f\u00F6r alias {0}: {1}.\nPosten {0} har inte importerats."}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "Kommandoimporten slutf\u00F6rd: {0} poster har importerats, {1} poster var felaktiga eller annullerades"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "Varning! Det befintliga aliaset {0} i destinationsnyckellagret skrivs \u00F6ver"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "Aliaset {0} finns redan. Vill du skriva \u00F6ver det? [nej]: "}, + {"Too.many.failures.try.later", "F\u00F6r m\u00E5nga fel - f\u00F6rs\u00F6k igen senare"}, + {"Certification.request.stored.in.file.filename.", + "Certifikatbeg\u00E4ran har lagrats i filen <{0}>"}, + {"Submit.this.to.your.CA", "Skicka detta till certifikatutf\u00E4rdaren"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "om n\u00E5got alias inte anges f\u00E5r destalias, srckeypass och destkeypass inte anges"}, + {"Certificate.stored.in.file.filename.", + "Certifikatet har lagrats i filen <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "Certifikatsvaret har installerats i nyckellagret"}, + {"Certificate.reply.was.not.installed.in.keystore", + "Certifikatsvaret har inte installerats i nyckellagret"}, + {"Certificate.was.added.to.keystore", + "Certifikatet har lagts till i nyckellagret"}, + {"Certificate.was.not.added.to.keystore", + "Certifikatet har inte lagts till i nyckellagret"}, + {".Storing.ksfname.", "[Lagrar {0}]"}, + {"alias.has.no.public.key.certificate.", + "{0} saknar offentlig nyckel (certifikat)"}, + {"Cannot.derive.signature.algorithm", + "Kan inte h\u00E4rleda signaturalgoritm"}, + {"Alias.alias.does.not.exist", + "Aliaset <{0}> finns inte"}, + {"Alias.alias.has.no.certificate", + "Aliaset <{0}> saknar certifikat"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "Nyckelparet genererades inte. Aliaset <{0}> finns redan"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "Genererar {0} bitars {1}-nyckelpar och sj\u00E4lvsignerat certifikat ({2}) med en giltighet p\u00E5 {3} dagar\n\tf\u00F6r: {4}"}, + {"Enter.key.password.for.alias.", "Ange nyckell\u00F6senord f\u00F6r <{0}>"}, + {".RETURN.if.same.as.keystore.password.", + "\t(RETURN om det \u00E4r identiskt med nyckellagerl\u00F6senordet): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "Nyckell\u00F6senordet \u00E4r f\u00F6r kort - det m\u00E5ste inneh\u00E5lla minst 6 tecken"}, + {"Too.many.failures.key.not.added.to.keystore", + "F\u00F6r m\u00E5nga fel - nyckeln lades inte till i nyckellagret"}, + {"Destination.alias.dest.already.exists", + "Destinationsaliaset <{0}> finns redan"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "L\u00F6senordet \u00E4r f\u00F6r kort - det m\u00E5ste inneh\u00E5lla minst 6 tecken"}, + {"Too.many.failures.Key.entry.not.cloned", + "F\u00F6r m\u00E5nga fel. Nyckelposten har inte klonats"}, + {"key.password.for.alias.", "nyckell\u00F6senord f\u00F6r <{0}>"}, + {"Keystore.entry.for.id.getName.already.exists", + "Nyckellagerpost f\u00F6r <{0}> finns redan"}, + {"Creating.keystore.entry.for.id.getName.", + "Skapar nyckellagerpost f\u00F6r <{0}> ..."}, + {"No.entries.from.identity.database.added", + "Inga poster fr\u00E5n identitetsdatabasen har lagts till"}, + {"Alias.name.alias", "Aliasnamn: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "Skapat den: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "Posttyp: {0}"}, + {"Certificate.chain.length.", "L\u00E4ngd p\u00E5 certifikatskedja: "}, + {"Certificate.i.1.", "Certifikat[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "Certifikatets fingeravtryck (SHA1): "}, + {"Keystore.type.", "Nyckellagertyp: "}, + {"Keystore.provider.", "Nyckellagerleverant\u00F6r: "}, + {"Your.keystore.contains.keyStore.size.entry", + "Nyckellagret inneh\u00E5ller {0,number,integer} post"}, + {"Your.keystore.contains.keyStore.size.entries", + "Nyckellagret inneh\u00E5ller {0,number,integer} poster"}, + {"Failed.to.parse.input", "Kunde inte tolka indata"}, + {"Empty.input", "Inga indata"}, + {"Not.X.509.certificate", "Inte ett X.509-certifikat"}, + {"alias.has.no.public.key", "{0} saknar offentlig nyckel"}, + {"alias.has.no.X.509.certificate", "{0} saknar X.509-certifikat"}, + {"New.certificate.self.signed.", "Nytt certifikat (sj\u00E4lvsignerat):"}, + {"Reply.has.no.certificates", "Svaret saknar certifikat"}, + {"Certificate.not.imported.alias.alias.already.exists", + "Certifikatet importerades inte. Aliaset <{0}> finns redan"}, + {"Input.not.an.X.509.certificate", "Indata \u00E4r inte ett X.509-certifikat"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "Certifikatet finns redan i nyckellagerfilen under aliaset <{0}>"}, + {"Do.you.still.want.to.add.it.no.", + "Vill du fortfarande l\u00E4gga till det? [nej]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "Certifikatet finns redan i den systemomsp\u00E4nnande CA-nyckellagerfilen under aliaset <{0}>"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "Vill du fortfarande l\u00E4gga till det i ditt eget nyckellagret? [nej]: "}, + {"Trust.this.certificate.no.", "Litar du p\u00E5 det h\u00E4r certifikatet? [nej]: "}, + {"YES", "Ja"}, + {"New.prompt.", "Nytt {0}: "}, + {"Passwords.must.differ", "L\u00F6senorden m\u00E5ste vara olika"}, + {"Re.enter.new.prompt.", "Ange nytt {0} igen: "}, + {"Re.enter.new.password.", "Ange det nya l\u00F6senordet igen: "}, + {"They.don.t.match.Try.again", "De matchar inte. F\u00F6rs\u00F6k igen"}, + {"Enter.prompt.alias.name.", "Ange aliasnamn f\u00F6r {0}: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "Ange ett nytt aliasnamn\t(skriv RETURN f\u00F6r att avbryta importen av denna post): "}, + {"Enter.alias.name.", "Ange aliasnamn: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(RETURN om det \u00E4r det samma som f\u00F6r <{0}>)"}, + {".PATTERN.printX509Cert", + "\u00C4gare: {0}\nUtf\u00E4rdare: {1}\nSerienummer: {2}\nGiltigt fr\u00E5n den: {3} till: {4}\nCertifikatets fingeravtryck:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Namn p\u00E5 signaturalgoritm: {8}\n\t Version: {9}"}, + {"What.is.your.first.and.last.name.", + "Vad heter du i f\u00F6r- och efternamn?"}, + {"What.is.the.name.of.your.organizational.unit.", + "Vad heter din avdelning inom organisationen?"}, + {"What.is.the.name.of.your.organization.", + "Vad heter din organisation?"}, + {"What.is.the.name.of.your.City.or.Locality.", + "Vad heter din ort eller plats?"}, + {"What.is.the.name.of.your.State.or.Province.", + "Vad heter ditt land eller din provins?"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "Vilken \u00E4r den tv\u00E5st\u00E4lliga landskoden?"}, + {"Is.name.correct.", "\u00C4r {0} korrekt?"}, + {"no", "nej"}, + {"yes", "ja"}, + {"y", "j"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "Aliaset <{0}> saknar nyckel"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "Aliaset <{0}> refererar till en posttyp som inte \u00E4r n\u00E5gon privat nyckelpost. Kommandot -keyclone har endast st\u00F6d f\u00F6r kloning av privata nyckelposter"}, + + {".WARNING.WARNING.WARNING.", + "***************** Varning Varning Varning *****************"}, + {"Signer.d.", "Signerare #%d:"}, + {"Timestamp.", "Tidsst\u00E4mpel:"}, + {"Signature.", "Underskrift:"}, + {"CRLs.", "CRL:er:"}, + {"Certificate.owner.", "Certifikat\u00E4gare: "}, + {"Not.a.signed.jar.file", "Ingen signerad jar-fil"}, + {"No.certificate.from.the.SSL.server", + "Inget certifikat fr\u00E5n SSL-servern"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* Integriteten f\u00F6r den information som lagras i nyckellagerfilen *\n* har INTE verifierats! Om du vill verifiera dess integritet *\n* m\u00E5ste du ange l\u00F6senordet f\u00F6r nyckellagret. *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* Integriteten f\u00F6r den information som lagras i srckeystore*\n* har INTE verifierats! Om du vill verifiera dess integritet *\n* m\u00E5ste du ange l\u00F6senordet f\u00F6r srckeystore. *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "Certifikatsvaret inneh\u00E5ller inte n\u00E5gon offentlig nyckel f\u00F6r <{0}>"}, + {"Incomplete.certificate.chain.in.reply", + "Ofullst\u00E4ndig certifikatskedja i svaret"}, + {"Certificate.chain.in.reply.does.not.verify.", + "Certifikatskedjan i svaret g\u00E5r inte att verifiera: "}, + {"Top.level.certificate.in.reply.", + "Toppniv\u00E5certifikatet i svaret:\n"}, + {".is.not.trusted.", "... \u00E4r inte betrott. "}, + {"Install.reply.anyway.no.", "Vill du installera svaret \u00E4nd\u00E5? [nej]: "}, + {"NO", "Nej"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "De offentliga nycklarna i svaret och nyckellagret matchar inte varandra"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "Certifikatsvaret och certifikatet i nyckellagret \u00E4r identiska"}, + {"Failed.to.establish.chain.from.reply", + "Kunde inte uppr\u00E4tta kedja fr\u00E5n svaret"}, + {"n", "n"}, + {"Wrong.answer.try.again", "Fel svar. F\u00F6rs\u00F6k p\u00E5 nytt."}, + {"Secret.key.not.generated.alias.alias.already.exists", + "Den hemliga nyckeln har inte genererats eftersom aliaset <{0}> redan finns"}, + {"Please.provide.keysize.for.secret.key.generation", + "Ange -keysize f\u00F6r att skapa hemlig nyckel"}, + + {"Extensions.", "Till\u00E4gg: "}, + {".Empty.value.", "(Tomt v\u00E4rde)"}, + {"Extension.Request.", "Till\u00E4ggsbeg\u00E4ran:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10 certifikatbeg\u00E4ran (version 1.0)\n\u00C4mne: %s\nAllm\u00E4n nyckel: %s-format %s-nyckel\n"}, + {"Unknown.keyUsage.type.", "Ok\u00E4nd keyUsage-typ: "}, + {"Unknown.extendedkeyUsage.type.", "Ok\u00E4nd extendedkeyUsage-typ: "}, + {"Unknown.AccessDescription.type.", "Ok\u00E4nd AccessDescription-typ: "}, + {"Unrecognized.GeneralName.type.", "Ok\u00E4nd GeneralName-typ: "}, + {"This.extension.cannot.be.marked.as.critical.", + "Detta till\u00E4gg kan inte markeras som kritiskt. "}, + {"Odd.number.of.hex.digits.found.", "Udda antal hex-siffror p\u00E5tr\u00E4ffades: "}, + {"Unknown.extension.type.", "Ok\u00E4nd till\u00E4ggstyp: "}, + {"command.{0}.is.ambiguous.", "kommandot {0} \u00E4r tvetydigt:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_CN.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_CN.java new file mode 100644 index 00000000000..6836bd769f9 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_CN.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_zh_CN extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [\u9009\u9879]..."}, + {"Options.", "\u9009\u9879:"}, + {"Use.keytool.help.for.all.available.commands", + "\u4F7F\u7528 \"keytool -help\" \u83B7\u53D6\u6240\u6709\u53EF\u7528\u547D\u4EE4"}, + {"Key.and.Certificate.Management.Tool", + "\u5BC6\u94A5\u548C\u8BC1\u4E66\u7BA1\u7406\u5DE5\u5177"}, + {"Commands.", "\u547D\u4EE4:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "\u4F7F\u7528 \"keytool -command_name -help\" \u83B7\u53D6 command_name \u7684\u7528\u6CD5"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "\u751F\u6210\u8BC1\u4E66\u8BF7\u6C42"}, //-certreq + {"Changes.an.entry.s.alias", + "\u66F4\u6539\u6761\u76EE\u7684\u522B\u540D"}, //-changealias + {"Deletes.an.entry", + "\u5220\u9664\u6761\u76EE"}, //-delete + {"Exports.certificate", + "\u5BFC\u51FA\u8BC1\u4E66"}, //-exportcert + {"Generates.a.key.pair", + "\u751F\u6210\u5BC6\u94A5\u5BF9"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "\u751F\u6210\u5BF9\u79F0\u5BC6\u94A5"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "\u6839\u636E\u8BC1\u4E66\u8BF7\u6C42\u751F\u6210\u8BC1\u4E66"}, //-gencert + {"Generates.CRL", "\u751F\u6210 CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "\u4ECE JDK 1.1.x \u6837\u5F0F\u7684\u8EAB\u4EFD\u6570\u636E\u5E93\u5BFC\u5165\u6761\u76EE"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "\u5BFC\u5165\u8BC1\u4E66\u6216\u8BC1\u4E66\u94FE"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "\u4ECE\u5176\u4ED6\u5BC6\u94A5\u5E93\u5BFC\u5165\u4E00\u4E2A\u6216\u6240\u6709\u6761\u76EE"}, //-importkeystore + {"Clones.a.key.entry", + "\u514B\u9686\u5BC6\u94A5\u6761\u76EE"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "\u66F4\u6539\u6761\u76EE\u7684\u5BC6\u94A5\u53E3\u4EE4"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "\u5217\u51FA\u5BC6\u94A5\u5E93\u4E2D\u7684\u6761\u76EE"}, //-list + {"Prints.the.content.of.a.certificate", + "\u6253\u5370\u8BC1\u4E66\u5185\u5BB9"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "\u6253\u5370\u8BC1\u4E66\u8BF7\u6C42\u7684\u5185\u5BB9"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "\u6253\u5370 CRL \u6587\u4EF6\u7684\u5185\u5BB9"}, //-printcrl + {"Generates.a.self.signed.certificate", + "\u751F\u6210\u81EA\u7B7E\u540D\u8BC1\u4E66"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "\u66F4\u6539\u5BC6\u94A5\u5E93\u7684\u5B58\u50A8\u53E3\u4EE4"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "\u8981\u5904\u7406\u7684\u6761\u76EE\u7684\u522B\u540D"}, //-alias + {"destination.alias", + "\u76EE\u6807\u522B\u540D"}, //-destalias + {"destination.key.password", + "\u76EE\u6807\u5BC6\u94A5\u53E3\u4EE4"}, //-destkeypass + {"destination.keystore.name", + "\u76EE\u6807\u5BC6\u94A5\u5E93\u540D\u79F0"}, //-destkeystore + {"destination.keystore.password.protected", + "\u53D7\u4FDD\u62A4\u7684\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-destprotected + {"destination.keystore.provider.name", + "\u76EE\u6807\u5BC6\u94A5\u5E93\u63D0\u4F9B\u65B9\u540D\u79F0"}, //-destprovidername + {"destination.keystore.password", + "\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-deststorepass + {"destination.keystore.type", + "\u76EE\u6807\u5BC6\u94A5\u5E93\u7C7B\u578B"}, //-deststoretype + {"distinguished.name", + "\u552F\u4E00\u5224\u522B\u540D"}, //-dname + {"X.509.extension", + "X.509 \u6269\u5C55"}, //-ext + {"output.file.name", + "\u8F93\u51FA\u6587\u4EF6\u540D"}, //-file and -outfile + {"input.file.name", + "\u8F93\u5165\u6587\u4EF6\u540D"}, //-file and -infile + {"key.algorithm.name", + "\u5BC6\u94A5\u7B97\u6CD5\u540D\u79F0"}, //-keyalg + {"key.password", + "\u5BC6\u94A5\u53E3\u4EE4"}, //-keypass + {"key.bit.size", + "\u5BC6\u94A5\u4F4D\u5927\u5C0F"}, //-keysize + {"keystore.name", + "\u5BC6\u94A5\u5E93\u540D\u79F0"}, //-keystore + {"new.password", + "\u65B0\u53E3\u4EE4"}, //-new + {"do.not.prompt", + "\u4E0D\u63D0\u793A"}, //-noprompt + {"password.through.protected.mechanism", + "\u901A\u8FC7\u53D7\u4FDD\u62A4\u7684\u673A\u5236\u7684\u53E3\u4EE4"}, //-protected + {"provider.argument", + "\u63D0\u4F9B\u65B9\u53C2\u6570"}, //-providerarg + {"provider.class.name", + "\u63D0\u4F9B\u65B9\u7C7B\u540D"}, //-providerclass + {"provider.name", + "\u63D0\u4F9B\u65B9\u540D\u79F0"}, //-providername + {"provider.classpath", + "\u63D0\u4F9B\u65B9\u7C7B\u8DEF\u5F84"}, //-providerpath + {"output.in.RFC.style", + "\u4EE5 RFC \u6837\u5F0F\u8F93\u51FA"}, //-rfc + {"signature.algorithm.name", + "\u7B7E\u540D\u7B97\u6CD5\u540D\u79F0"}, //-sigalg + {"source.alias", + "\u6E90\u522B\u540D"}, //-srcalias + {"source.key.password", + "\u6E90\u5BC6\u94A5\u53E3\u4EE4"}, //-srckeypass + {"source.keystore.name", + "\u6E90\u5BC6\u94A5\u5E93\u540D\u79F0"}, //-srckeystore + {"source.keystore.password.protected", + "\u53D7\u4FDD\u62A4\u7684\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-srcprotected + {"source.keystore.provider.name", + "\u6E90\u5BC6\u94A5\u5E93\u63D0\u4F9B\u65B9\u540D\u79F0"}, //-srcprovidername + {"source.keystore.password", + "\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-srcstorepass + {"source.keystore.type", + "\u6E90\u5BC6\u94A5\u5E93\u7C7B\u578B"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL \u670D\u52A1\u5668\u4E3B\u673A\u548C\u7AEF\u53E3"}, //-sslserver + {"signed.jar.file", + "\u5DF2\u7B7E\u540D\u7684 jar \u6587\u4EF6"}, //=jarfile + {"certificate.validity.start.date.time", + "\u8BC1\u4E66\u6709\u6548\u671F\u5F00\u59CB\u65E5\u671F/\u65F6\u95F4"}, //-startdate + {"keystore.password", + "\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-storepass + {"keystore.type", + "\u5BC6\u94A5\u5E93\u7C7B\u578B"}, //-storetype + {"trust.certificates.from.cacerts", + "\u4FE1\u4EFB\u6765\u81EA cacerts \u7684\u8BC1\u4E66"}, //-trustcacerts + {"verbose.output", + "\u8BE6\u7EC6\u8F93\u51FA"}, //-v + {"validity.number.of.days", + "\u6709\u6548\u5929\u6570"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "\u8981\u64A4\u9500\u7684\u8BC1\u4E66\u7684\u5E8F\u5217 ID"}, //-id + // keytool: Running part + {"keytool.error.", "keytool \u9519\u8BEF: "}, + {"Illegal.option.", "\u975E\u6CD5\u9009\u9879: "}, + {"Illegal.value.", "\u975E\u6CD5\u503C: "}, + {"Unknown.password.type.", "\u672A\u77E5\u53E3\u4EE4\u7C7B\u578B: "}, + {"Cannot.find.environment.variable.", + "\u627E\u4E0D\u5230\u73AF\u5883\u53D8\u91CF: "}, + {"Cannot.find.file.", "\u627E\u4E0D\u5230\u6587\u4EF6: "}, + {"Command.option.flag.needs.an.argument.", "\u547D\u4EE4\u9009\u9879{0}\u9700\u8981\u4E00\u4E2A\u53C2\u6570\u3002"}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "\u8B66\u544A: PKCS12 KeyStore \u4E0D\u652F\u6301\u5176\u4ED6\u5B58\u50A8\u548C\u5BC6\u94A5\u53E3\u4EE4\u3002\u6B63\u5728\u5FFD\u7565\u7528\u6237\u6307\u5B9A\u7684{0}\u503C\u3002"}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "\u5982\u679C -storetype \u4E3A {0}, \u5219 -keystore \u5FC5\u987B\u4E3A NONE"}, + {"Too.many.retries.program.terminated", + "\u91CD\u8BD5\u6B21\u6570\u8FC7\u591A, \u7A0B\u5E8F\u5DF2\u7EC8\u6B62"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "\u5982\u679C -storetype \u4E3A {0}, \u5219\u4E0D\u652F\u6301 -storepasswd \u548C -keypasswd \u547D\u4EE4"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "\u5982\u679C -storetype \u4E3A PKCS12, \u5219\u4E0D\u652F\u6301 -keypasswd \u547D\u4EE4"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "\u5982\u679C -storetype \u4E3A {0}, \u5219\u4E0D\u80FD\u6307\u5B9A -keypass \u548C -new"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "\u5982\u679C\u6307\u5B9A\u4E86 -protected, \u5219\u4E0D\u80FD\u6307\u5B9A -storepass, -keypass \u548C -new"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\u5982\u679C\u6307\u5B9A\u4E86 -srcprotected, \u5219\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "\u5982\u679C\u5BC6\u94A5\u5E93\u672A\u53D7\u53E3\u4EE4\u4FDD\u62A4, \u5219\u4E0D\u80FD\u6307\u5B9A -storepass, -keypass \u548C -new"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\u5982\u679C\u6E90\u5BC6\u94A5\u5E93\u672A\u53D7\u53E3\u4EE4\u4FDD\u62A4, \u5219\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, + {"Illegal.startdate.value", "\u975E\u6CD5\u5F00\u59CB\u65E5\u671F\u503C"}, + {"Validity.must.be.greater.than.zero", + "\u6709\u6548\u671F\u5FC5\u987B\u5927\u4E8E\u96F6"}, + {"provName.not.a.provider", "{0}\u4E0D\u662F\u63D0\u4F9B\u65B9"}, + {"Usage.error.no.command.provided", "\u7528\u6CD5\u9519\u8BEF: \u6CA1\u6709\u63D0\u4F9B\u547D\u4EE4"}, + {"Source.keystore.file.exists.but.is.empty.", "\u6E90\u5BC6\u94A5\u5E93\u6587\u4EF6\u5B58\u5728, \u4F46\u4E3A\u7A7A: "}, + {"Please.specify.srckeystore", "\u8BF7\u6307\u5B9A -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + "'list' \u547D\u4EE4\u4E0D\u80FD\u540C\u65F6\u6307\u5B9A -v \u53CA -rfc"}, + {"Key.password.must.be.at.least.6.characters", + "\u5BC6\u94A5\u53E3\u4EE4\u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, + {"New.password.must.be.at.least.6.characters", + "\u65B0\u53E3\u4EE4\u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, + {"Keystore.file.exists.but.is.empty.", + "\u5BC6\u94A5\u5E93\u6587\u4EF6\u5B58\u5728, \u4F46\u4E3A\u7A7A: "}, + {"Keystore.file.does.not.exist.", + "\u5BC6\u94A5\u5E93\u6587\u4EF6\u4E0D\u5B58\u5728: "}, + {"Must.specify.destination.alias", "\u5FC5\u987B\u6307\u5B9A\u76EE\u6807\u522B\u540D"}, + {"Must.specify.alias", "\u5FC5\u987B\u6307\u5B9A\u522B\u540D"}, + {"Keystore.password.must.be.at.least.6.characters", + "\u5BC6\u94A5\u5E93\u53E3\u4EE4\u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, + {"Enter.keystore.password.", "\u8F93\u5165\u5BC6\u94A5\u5E93\u53E3\u4EE4: "}, + {"Enter.source.keystore.password.", "\u8F93\u5165\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4: "}, + {"Enter.destination.keystore.password.", "\u8F93\u5165\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "\u5BC6\u94A5\u5E93\u53E3\u4EE4\u592A\u77ED - \u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, + {"Unknown.Entry.Type", "\u672A\u77E5\u6761\u76EE\u7C7B\u578B"}, + {"Too.many.failures.Alias.not.changed", "\u6545\u969C\u592A\u591A\u3002\u672A\u66F4\u6539\u522B\u540D"}, + {"Entry.for.alias.alias.successfully.imported.", + "\u5DF2\u6210\u529F\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u3002"}, + {"Entry.for.alias.alias.not.imported.", "\u672A\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u3002"}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u65F6\u51FA\u73B0\u95EE\u9898: {1}\u3002\n\u672A\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u3002"}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "\u5DF2\u5B8C\u6210\u5BFC\u5165\u547D\u4EE4: {0} \u4E2A\u6761\u76EE\u6210\u529F\u5BFC\u5165, {1} \u4E2A\u6761\u76EE\u5931\u8D25\u6216\u53D6\u6D88"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "\u8B66\u544A: \u6B63\u5728\u8986\u76D6\u76EE\u6807\u5BC6\u94A5\u5E93\u4E2D\u7684\u73B0\u6709\u522B\u540D {0}"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "\u5B58\u5728\u73B0\u6709\u6761\u76EE\u522B\u540D {0}, \u662F\u5426\u8986\u76D6? [no]: "}, + {"Too.many.failures.try.later", "\u6545\u969C\u592A\u591A - \u8BF7\u7A0D\u540E\u518D\u8BD5"}, + {"Certification.request.stored.in.file.filename.", + "\u5B58\u50A8\u5728\u6587\u4EF6 <{0}> \u4E2D\u7684\u8BA4\u8BC1\u8BF7\u6C42"}, + {"Submit.this.to.your.CA", "\u5C06\u6B64\u63D0\u4EA4\u7ED9\u60A8\u7684 CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "\u5982\u679C\u6CA1\u6709\u6307\u5B9A\u522B\u540D, \u5219\u4E0D\u80FD\u6307\u5B9A\u76EE\u6807\u522B\u540D, \u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4\u548C\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, + {"Certificate.stored.in.file.filename.", + "\u5B58\u50A8\u5728\u6587\u4EF6 <{0}> \u4E2D\u7684\u8BC1\u4E66"}, + {"Certificate.reply.was.installed.in.keystore", + "\u8BC1\u4E66\u56DE\u590D\u5DF2\u5B89\u88C5\u5728\u5BC6\u94A5\u5E93\u4E2D"}, + {"Certificate.reply.was.not.installed.in.keystore", + "\u8BC1\u4E66\u56DE\u590D\u672A\u5B89\u88C5\u5728\u5BC6\u94A5\u5E93\u4E2D"}, + {"Certificate.was.added.to.keystore", + "\u8BC1\u4E66\u5DF2\u6DFB\u52A0\u5230\u5BC6\u94A5\u5E93\u4E2D"}, + {"Certificate.was.not.added.to.keystore", + "\u8BC1\u4E66\u672A\u6DFB\u52A0\u5230\u5BC6\u94A5\u5E93\u4E2D"}, + {".Storing.ksfname.", "[\u6B63\u5728\u5B58\u50A8{0}]"}, + {"alias.has.no.public.key.certificate.", + "{0}\u6CA1\u6709\u516C\u5171\u5BC6\u94A5 (\u8BC1\u4E66)"}, + {"Cannot.derive.signature.algorithm", + "\u65E0\u6CD5\u6D3E\u751F\u7B7E\u540D\u7B97\u6CD5"}, + {"Alias.alias.does.not.exist", + "\u522B\u540D <{0}> \u4E0D\u5B58\u5728"}, + {"Alias.alias.has.no.certificate", + "\u522B\u540D <{0}> \u6CA1\u6709\u8BC1\u4E66"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "\u672A\u751F\u6210\u5BC6\u94A5\u5BF9, \u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "\u6B63\u5728\u4E3A\u4EE5\u4E0B\u5BF9\u8C61\u751F\u6210 {0} \u4F4D{1}\u5BC6\u94A5\u5BF9\u548C\u81EA\u7B7E\u540D\u8BC1\u4E66 ({2}) (\u6709\u6548\u671F\u4E3A {3} \u5929):\n\t {4}"}, + {"Enter.key.password.for.alias.", "\u8F93\u5165 <{0}> \u7684\u5BC6\u94A5\u53E3\u4EE4"}, + {".RETURN.if.same.as.keystore.password.", + "\t(\u5982\u679C\u548C\u5BC6\u94A5\u5E93\u53E3\u4EE4\u76F8\u540C, \u6309\u56DE\u8F66): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "\u5BC6\u94A5\u53E3\u4EE4\u592A\u77ED - \u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, + {"Too.many.failures.key.not.added.to.keystore", + "\u6545\u969C\u592A\u591A - \u5BC6\u94A5\u672A\u6DFB\u52A0\u5230\u5BC6\u94A5\u5E93\u4E2D"}, + {"Destination.alias.dest.already.exists", + "\u76EE\u6807\u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "\u53E3\u4EE4\u592A\u77ED - \u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, + {"Too.many.failures.Key.entry.not.cloned", + "\u6545\u969C\u592A\u591A\u3002\u672A\u514B\u9686\u5BC6\u94A5\u6761\u76EE"}, + {"key.password.for.alias.", "<{0}> \u7684\u5BC6\u94A5\u53E3\u4EE4"}, + {"Keystore.entry.for.id.getName.already.exists", + "<{0}> \u7684\u5BC6\u94A5\u5E93\u6761\u76EE\u5DF2\u7ECF\u5B58\u5728"}, + {"Creating.keystore.entry.for.id.getName.", + "\u6B63\u5728\u521B\u5EFA <{0}> \u7684\u5BC6\u94A5\u5E93\u6761\u76EE..."}, + {"No.entries.from.identity.database.added", + "\u672A\u4ECE\u8EAB\u4EFD\u6570\u636E\u5E93\u4E2D\u6DFB\u52A0\u4EFB\u4F55\u6761\u76EE"}, + {"Alias.name.alias", "\u522B\u540D: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "\u521B\u5EFA\u65E5\u671F: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "\u6761\u76EE\u7C7B\u578B: {0}"}, + {"Certificate.chain.length.", "\u8BC1\u4E66\u94FE\u957F\u5EA6: "}, + {"Certificate.i.1.", "\u8BC1\u4E66[{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "\u8BC1\u4E66\u6307\u7EB9 (SHA1): "}, + {"Keystore.type.", "\u5BC6\u94A5\u5E93\u7C7B\u578B: "}, + {"Keystore.provider.", "\u5BC6\u94A5\u5E93\u63D0\u4F9B\u65B9: "}, + {"Your.keystore.contains.keyStore.size.entry", + "\u60A8\u7684\u5BC6\u94A5\u5E93\u5305\u542B {0,number,integer} \u4E2A\u6761\u76EE"}, + {"Your.keystore.contains.keyStore.size.entries", + "\u60A8\u7684\u5BC6\u94A5\u5E93\u5305\u542B {0,number,integer} \u4E2A\u6761\u76EE"}, + {"Failed.to.parse.input", "\u65E0\u6CD5\u5BF9\u8F93\u5165\u8FDB\u884C\u8BED\u6CD5\u5206\u6790"}, + {"Empty.input", "\u7A7A\u8F93\u5165"}, + {"Not.X.509.certificate", "\u975E X.509 \u8BC1\u4E66"}, + {"alias.has.no.public.key", "{0}\u6CA1\u6709\u516C\u5171\u5BC6\u94A5"}, + {"alias.has.no.X.509.certificate", "{0}\u6CA1\u6709 X.509 \u8BC1\u4E66"}, + {"New.certificate.self.signed.", "\u65B0\u8BC1\u4E66 (\u81EA\u7B7E\u540D):"}, + {"Reply.has.no.certificates", "\u56DE\u590D\u4E2D\u6CA1\u6709\u8BC1\u4E66"}, + {"Certificate.not.imported.alias.alias.already.exists", + "\u8BC1\u4E66\u672A\u5BFC\u5165, \u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, + {"Input.not.an.X.509.certificate", "\u6240\u8F93\u5165\u7684\u4E0D\u662F X.509 \u8BC1\u4E66"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "\u5728\u522B\u540D <{0}> \u4E4B\u4E0B, \u8BC1\u4E66\u5DF2\u7ECF\u5B58\u5728\u4E8E\u5BC6\u94A5\u5E93\u4E2D"}, + {"Do.you.still.want.to.add.it.no.", + "\u662F\u5426\u4ECD\u8981\u6DFB\u52A0? [no]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "\u5728\u522B\u540D <{0}> \u4E4B\u4E0B, \u8BC1\u4E66\u5DF2\u7ECF\u5B58\u5728\u4E8E\u7CFB\u7EDF\u8303\u56F4\u7684 CA \u5BC6\u94A5\u5E93\u4E2D"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "\u662F\u5426\u4ECD\u8981\u5C06\u5B83\u6DFB\u52A0\u5230\u81EA\u5DF1\u7684\u5BC6\u94A5\u5E93? [no]: "}, + {"Trust.this.certificate.no.", "\u662F\u5426\u4FE1\u4EFB\u6B64\u8BC1\u4E66? [no]: "}, + {"YES", "\u662F"}, + {"New.prompt.", "\u65B0{0}: "}, + {"Passwords.must.differ", "\u53E3\u4EE4\u4E0D\u80FD\u76F8\u540C"}, + {"Re.enter.new.prompt.", "\u91CD\u65B0\u8F93\u5165\u65B0{0}: "}, + {"Re.enter.new.password.", "\u518D\u6B21\u8F93\u5165\u65B0\u53E3\u4EE4: "}, + {"They.don.t.match.Try.again", "\u5B83\u4EEC\u4E0D\u5339\u914D\u3002\u8BF7\u91CD\u8BD5"}, + {"Enter.prompt.alias.name.", "\u8F93\u5165{0}\u522B\u540D: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "\u8F93\u5165\u65B0\u7684\u522B\u540D\t(\u6309\u56DE\u8F66\u4EE5\u53D6\u6D88\u5BF9\u6B64\u6761\u76EE\u7684\u5BFC\u5165): "}, + {"Enter.alias.name.", "\u8F93\u5165\u522B\u540D: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(\u5982\u679C\u548C <{0}> \u76F8\u540C, \u5219\u6309\u56DE\u8F66)"}, + {".PATTERN.printX509Cert", + "\u6240\u6709\u8005: {0}\n\u53D1\u5E03\u8005: {1}\n\u5E8F\u5217\u53F7: {2}\n\u6709\u6548\u671F\u5F00\u59CB\u65E5\u671F: {3}, \u622A\u6B62\u65E5\u671F: {4}\n\u8BC1\u4E66\u6307\u7EB9:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7B7E\u540D\u7B97\u6CD5\u540D\u79F0: {8}\n\t \u7248\u672C: {9}"}, + {"What.is.your.first.and.last.name.", + "\u60A8\u7684\u540D\u5B57\u4E0E\u59D3\u6C0F\u662F\u4EC0\u4E48?"}, + {"What.is.the.name.of.your.organizational.unit.", + "\u60A8\u7684\u7EC4\u7EC7\u5355\u4F4D\u540D\u79F0\u662F\u4EC0\u4E48?"}, + {"What.is.the.name.of.your.organization.", + "\u60A8\u7684\u7EC4\u7EC7\u540D\u79F0\u662F\u4EC0\u4E48?"}, + {"What.is.the.name.of.your.City.or.Locality.", + "\u60A8\u6240\u5728\u7684\u57CE\u5E02\u6216\u533A\u57DF\u540D\u79F0\u662F\u4EC0\u4E48?"}, + {"What.is.the.name.of.your.State.or.Province.", + "\u60A8\u6240\u5728\u7684\u7701/\u5E02/\u81EA\u6CBB\u533A\u540D\u79F0\u662F\u4EC0\u4E48?"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "\u8BE5\u5355\u4F4D\u7684\u53CC\u5B57\u6BCD\u56FD\u5BB6/\u5730\u533A\u4EE3\u7801\u662F\u4EC0\u4E48?"}, + {"Is.name.correct.", "{0}\u662F\u5426\u6B63\u786E?"}, + {"no", "\u5426"}, + {"yes", "\u662F"}, + {"y", "y"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "\u522B\u540D <{0}> \u6CA1\u6709\u5BC6\u94A5"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "\u522B\u540D <{0}> \u5F15\u7528\u4E86\u4E0D\u5C5E\u4E8E\u79C1\u6709\u5BC6\u94A5\u6761\u76EE\u7684\u6761\u76EE\u7C7B\u578B\u3002-keyclone \u547D\u4EE4\u4EC5\u652F\u6301\u5BF9\u79C1\u6709\u5BC6\u94A5\u6761\u76EE\u7684\u514B\u9686"}, + + {".WARNING.WARNING.WARNING.", + "***************** \u8B66\u544A \u8B66\u544A \u8B66\u544A *****************"}, + {"Signer.d.", "\u7B7E\u540D\u8005 #%d:"}, + {"Timestamp.", "\u65F6\u95F4\u6233:"}, + {"Signature.", "\u7B7E\u540D:"}, + {"CRLs.", "CRL:"}, + {"Certificate.owner.", "\u8BC1\u4E66\u6240\u6709\u8005: "}, + {"Not.a.signed.jar.file", "\u4E0D\u662F\u5DF2\u7B7E\u540D\u7684 jar \u6587\u4EF6"}, + {"No.certificate.from.the.SSL.server", + "\u6CA1\u6709\u6765\u81EA SSL \u670D\u52A1\u5668\u7684\u8BC1\u4E66"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* \u5B58\u50A8\u5728\u60A8\u7684\u5BC6\u94A5\u5E93\u4E2D\u7684\u4FE1\u606F\u7684\u5B8C\u6574\u6027 *\n* \u5C1A\u672A\u7ECF\u8FC7\u9A8C\u8BC1! \u4E3A\u4E86\u9A8C\u8BC1\u5176\u5B8C\u6574\u6027, *\n* \u5FC5\u987B\u63D0\u4F9B\u5BC6\u94A5\u5E93\u53E3\u4EE4\u3002 *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* \u5B58\u50A8\u5728 srckeystore \u4E2D\u7684\u4FE1\u606F\u7684\u5B8C\u6574\u6027*\n* \u5C1A\u672A\u7ECF\u8FC7\u9A8C\u8BC1! \u4E3A\u4E86\u9A8C\u8BC1\u5176\u5B8C\u6574\u6027, *\n* \u5FC5\u987B\u63D0\u4F9B\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4\u3002 *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "\u8BC1\u4E66\u56DE\u590D\u4E2D\u4E0D\u5305\u542B <{0}> \u7684\u516C\u5171\u5BC6\u94A5"}, + {"Incomplete.certificate.chain.in.reply", + "\u56DE\u590D\u4E2D\u7684\u8BC1\u4E66\u94FE\u4E0D\u5B8C\u6574"}, + {"Certificate.chain.in.reply.does.not.verify.", + "\u56DE\u590D\u4E2D\u7684\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1: "}, + {"Top.level.certificate.in.reply.", + "\u56DE\u590D\u4E2D\u7684\u9876\u7EA7\u8BC1\u4E66:\n"}, + {".is.not.trusted.", "... \u662F\u4E0D\u53EF\u4FE1\u7684\u3002"}, + {"Install.reply.anyway.no.", "\u662F\u5426\u4ECD\u8981\u5B89\u88C5\u56DE\u590D? [no]: "}, + {"NO", "\u5426"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "\u56DE\u590D\u4E2D\u7684\u516C\u5171\u5BC6\u94A5\u4E0E\u5BC6\u94A5\u5E93\u4E0D\u5339\u914D"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "\u8BC1\u4E66\u56DE\u590D\u4E0E\u5BC6\u94A5\u5E93\u4E2D\u7684\u8BC1\u4E66\u662F\u76F8\u540C\u7684"}, + {"Failed.to.establish.chain.from.reply", + "\u65E0\u6CD5\u4ECE\u56DE\u590D\u4E2D\u5EFA\u7ACB\u94FE"}, + {"n", "n"}, + {"Wrong.answer.try.again", "\u9519\u8BEF\u7684\u7B54\u6848, \u8BF7\u518D\u8BD5\u4E00\u6B21"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "\u6CA1\u6709\u751F\u6210\u5BC6\u94A5, \u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, + {"Please.provide.keysize.for.secret.key.generation", + "\u8BF7\u63D0\u4F9B -keysize \u4EE5\u751F\u6210\u5BF9\u79F0\u5BC6\u94A5"}, + + {"Extensions.", "\u6269\u5C55: "}, + {".Empty.value.", "(\u7A7A\u503C)"}, + {"Extension.Request.", "\u6269\u5C55\u8BF7\u6C42:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10 \u8BC1\u4E66\u8BF7\u6C42 (\u7248\u672C 1.0)\n\u4E3B\u9898: %s\n\u516C\u5171\u5BC6\u94A5: %s \u683C\u5F0F %s \u5BC6\u94A5\n"}, + {"Unknown.keyUsage.type.", "\u672A\u77E5 keyUsage \u7C7B\u578B: "}, + {"Unknown.extendedkeyUsage.type.", "\u672A\u77E5 extendedkeyUsage \u7C7B\u578B: "}, + {"Unknown.AccessDescription.type.", "\u672A\u77E5 AccessDescription \u7C7B\u578B: "}, + {"Unrecognized.GeneralName.type.", "\u65E0\u6CD5\u8BC6\u522B\u7684 GeneralName \u7C7B\u578B: "}, + {"This.extension.cannot.be.marked.as.critical.", + "\u65E0\u6CD5\u5C06\u6B64\u6269\u5C55\u6807\u8BB0\u4E3A\u201C\u4E25\u91CD\u201D\u3002"}, + {"Odd.number.of.hex.digits.found.", "\u627E\u5230\u5947\u6570\u4E2A\u5341\u516D\u8FDB\u5236\u6570\u5B57: "}, + {"Unknown.extension.type.", "\u672A\u77E5\u6269\u5C55\u7C7B\u578B: "}, + {"command.{0}.is.ambiguous.", "\u547D\u4EE4{0}\u4E0D\u660E\u786E:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_HK.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_HK.java new file mode 100644 index 00000000000..90cb13f86cd --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_HK.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_zh_HK extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [\u9078\u9805]..."}, + {"Options.", "\u9078\u9805:"}, + {"Use.keytool.help.for.all.available.commands", + "\u4F7F\u7528 \"keytool -help\" \u53D6\u5F97\u6240\u6709\u53EF\u7528\u7684\u547D\u4EE4"}, + {"Key.and.Certificate.Management.Tool", + "\u91D1\u9470\u8207\u6191\u8B49\u7BA1\u7406\u5DE5\u5177"}, + {"Commands.", "\u547D\u4EE4:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "\u4F7F\u7528 \"keytool -command_name -help\" \u53D6\u5F97 command_name \u7684\u7528\u6CD5"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "\u7522\u751F\u6191\u8B49\u8981\u6C42"}, //-certreq + {"Changes.an.entry.s.alias", + "\u8B8A\u66F4\u9805\u76EE\u7684\u5225\u540D"}, //-changealias + {"Deletes.an.entry", + "\u522A\u9664\u9805\u76EE"}, //-delete + {"Exports.certificate", + "\u532F\u51FA\u6191\u8B49"}, //-exportcert + {"Generates.a.key.pair", + "\u7522\u751F\u91D1\u9470\u7D44"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "\u7522\u751F\u79D8\u5BC6\u91D1\u9470"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "\u5F9E\u6191\u8B49\u8981\u6C42\u7522\u751F\u6191\u8B49"}, //-gencert + {"Generates.CRL", "\u7522\u751F CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "\u5F9E JDK 1.1.x-style \u8B58\u5225\u8CC7\u6599\u5EAB\u532F\u5165\u9805\u76EE"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "\u532F\u5165\u6191\u8B49\u6216\u6191\u8B49\u93C8"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "\u5F9E\u5176\u4ED6\u91D1\u9470\u5132\u5B58\u5EAB\u532F\u5165\u4E00\u500B\u6216\u5168\u90E8\u9805\u76EE"}, //-importkeystore + {"Clones.a.key.entry", + "\u8907\u88FD\u91D1\u9470\u9805\u76EE"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "\u8B8A\u66F4\u9805\u76EE\u7684\u91D1\u9470\u5BC6\u78BC"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "\u5217\u793A\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u9805\u76EE"}, //-list + {"Prints.the.content.of.a.certificate", + "\u5217\u5370\u6191\u8B49\u7684\u5167\u5BB9"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "\u5217\u5370\u6191\u8B49\u8981\u6C42\u7684\u5167\u5BB9"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "\u5217\u5370 CRL \u6A94\u6848\u7684\u5167\u5BB9"}, //-printcrl + {"Generates.a.self.signed.certificate", + "\u7522\u751F\u81EA\u884C\u7C3D\u7F72\u7684\u6191\u8B49"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "\u8B8A\u66F4\u91D1\u9470\u5132\u5B58\u5EAB\u7684\u5132\u5B58\u5BC6\u78BC"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "\u8981\u8655\u7406\u9805\u76EE\u7684\u5225\u540D\u540D\u7A31"}, //-alias + {"destination.alias", + "\u76EE\u7684\u5730\u5225\u540D"}, //-destalias + {"destination.key.password", + "\u76EE\u7684\u5730\u91D1\u9470\u5BC6\u78BC"}, //-destkeypass + {"destination.keystore.name", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-destkeystore + {"destination.keystore.password.protected", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u4FDD\u8B77"}, //-destprotected + {"destination.keystore.provider.name", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005\u540D\u7A31"}, //-destprovidername + {"destination.keystore.password", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-deststorepass + {"destination.keystore.type", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-deststoretype + {"distinguished.name", + "\u8FA8\u5225\u540D\u7A31"}, //-dname + {"X.509.extension", + "X.509 \u64F4\u5145\u5957\u4EF6"}, //-ext + {"output.file.name", + "\u8F38\u51FA\u6A94\u6848\u540D\u7A31"}, //-file and -outfile + {"input.file.name", + "\u8F38\u5165\u6A94\u6848\u540D\u7A31"}, //-file and -infile + {"key.algorithm.name", + "\u91D1\u9470\u6F14\u7B97\u6CD5\u540D\u7A31"}, //-keyalg + {"key.password", + "\u91D1\u9470\u5BC6\u78BC"}, //-keypass + {"key.bit.size", + "\u91D1\u9470\u4F4D\u5143\u5927\u5C0F"}, //-keysize + {"keystore.name", + "\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-keystore + {"new.password", + "\u65B0\u5BC6\u78BC"}, //-new + {"do.not.prompt", + "\u4E0D\u8981\u63D0\u793A"}, //-noprompt + {"password.through.protected.mechanism", + "\u7D93\u7531\u4FDD\u8B77\u6A5F\u5236\u7684\u5BC6\u78BC"}, //-protected + {"provider.argument", + "\u63D0\u4F9B\u8005\u5F15\u6578"}, //-providerarg + {"provider.class.name", + "\u63D0\u4F9B\u8005\u985E\u5225\u540D\u7A31"}, //-providerclass + {"provider.name", + "\u63D0\u4F9B\u8005\u540D\u7A31"}, //-providername + {"provider.classpath", + "\u63D0\u4F9B\u8005\u985E\u5225\u8DEF\u5F91"}, //-providerpath + {"output.in.RFC.style", + "\u4EE5 RFC \u6A23\u5F0F\u8F38\u51FA"}, //-rfc + {"signature.algorithm.name", + "\u7C3D\u7AE0\u6F14\u7B97\u6CD5\u540D\u7A31"}, //-sigalg + {"source.alias", + "\u4F86\u6E90\u5225\u540D"}, //-srcalias + {"source.key.password", + "\u4F86\u6E90\u91D1\u9470\u5BC6\u78BC"}, //-srckeypass + {"source.keystore.name", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-srckeystore + {"source.keystore.password.protected", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u4FDD\u8B77"}, //-srcprotected + {"source.keystore.provider.name", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005\u540D\u7A31"}, //-srcprovidername + {"source.keystore.password", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-srcstorepass + {"source.keystore.type", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL \u4F3A\u670D\u5668\u4E3B\u6A5F\u8207\u9023\u63A5\u57E0"}, //-sslserver + {"signed.jar.file", + "\u7C3D\u7F72\u7684 jar \u6A94\u6848"}, //=jarfile + {"certificate.validity.start.date.time", + "\u6191\u8B49\u6709\u6548\u6027\u958B\u59CB\u65E5\u671F/\u6642\u9593"}, //-startdate + {"keystore.password", + "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-storepass + {"keystore.type", + "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-storetype + {"trust.certificates.from.cacerts", + "\u4F86\u81EA cacerts \u7684\u4FE1\u4EFB\u6191\u8B49"}, //-trustcacerts + {"verbose.output", + "\u8A73\u7D30\u8CC7\u8A0A\u8F38\u51FA"}, //-v + {"validity.number.of.days", + "\u6709\u6548\u6027\u65E5\u6578"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "\u8981\u64A4\u92B7\u6191\u8B49\u7684\u5E8F\u5217 ID"}, //-id + // keytool: Running part + {"keytool.error.", "\u91D1\u9470\u5DE5\u5177\u932F\u8AA4: "}, + {"Illegal.option.", "\u7121\u6548\u7684\u9078\u9805:"}, + {"Illegal.value.", "\u7121\u6548\u503C: "}, + {"Unknown.password.type.", "\u4E0D\u660E\u7684\u5BC6\u78BC\u985E\u578B: "}, + {"Cannot.find.environment.variable.", + "\u627E\u4E0D\u5230\u74B0\u5883\u8B8A\u6578: "}, + {"Cannot.find.file.", "\u627E\u4E0D\u5230\u6A94\u6848: "}, + {"Command.option.flag.needs.an.argument.", "\u547D\u4EE4\u9078\u9805 {0} \u9700\u8981\u5F15\u6578\u3002"}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "\u8B66\u544A: PKCS12 \u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u652F\u63F4\u4E0D\u540C\u7684\u5132\u5B58\u5EAB\u548C\u91D1\u9470\u5BC6\u78BC\u3002\u5FFD\u7565\u4F7F\u7528\u8005\u6307\u5B9A\u7684 {0} \u503C\u3002"}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247 -keystore \u5FC5\u9808\u70BA NONE"}, + {"Too.many.retries.program.terminated", + "\u91CD\u8A66\u6B21\u6578\u592A\u591A\uFF0C\u7A0B\u5F0F\u5DF2\u7D42\u6B62"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247\u4E0D\u652F\u63F4 -storepasswd \u548C -keypasswd \u547D\u4EE4"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "\u5982\u679C -storetype \u70BA PKCS12\uFF0C\u5247\u4E0D\u652F\u63F4 -keypasswd \u547D\u4EE4"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -keypass \u548C -new"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "\u5982\u679C\u6307\u5B9A -protected\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -storepass\u3001-keypass \u548C -new"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\u5982\u679C\u6307\u5B9A -srcprotected\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "\u5982\u679C\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u53D7\u5BC6\u78BC\u4FDD\u8B77\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -storepass\u3001-keypass \u548C -new"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\u5982\u679C\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u53D7\u5BC6\u78BC\u4FDD\u8B77\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, + {"Illegal.startdate.value", "\u7121\u6548\u7684 startdate \u503C"}, + {"Validity.must.be.greater.than.zero", + "\u6709\u6548\u6027\u5FC5\u9808\u5927\u65BC\u96F6"}, + {"provName.not.a.provider", "{0} \u4E0D\u662F\u4E00\u500B\u63D0\u4F9B\u8005"}, + {"Usage.error.no.command.provided", "\u7528\u6CD5\u932F\u8AA4: \u672A\u63D0\u4F9B\u547D\u4EE4"}, + {"Source.keystore.file.exists.but.is.empty.", "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u5B58\u5728\uFF0C\u4F46\u70BA\u7A7A: "}, + {"Please.specify.srckeystore", "\u8ACB\u6307\u5B9A -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + " 'list' \u547D\u4EE4\u4E0D\u80FD\u540C\u6642\u6307\u5B9A -v \u53CA -rfc"}, + {"Key.password.must.be.at.least.6.characters", + "\u91D1\u9470\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"New.password.must.be.at.least.6.characters", + "\u65B0\u7684\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Keystore.file.exists.but.is.empty.", + "\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u5B58\u5728\uFF0C\u4F46\u70BA\u7A7A\u767D: "}, + {"Keystore.file.does.not.exist.", + "\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u4E0D\u5B58\u5728: "}, + {"Must.specify.destination.alias", "\u5FC5\u9808\u6307\u5B9A\u76EE\u7684\u5730\u5225\u540D"}, + {"Must.specify.alias", "\u5FC5\u9808\u6307\u5B9A\u5225\u540D"}, + {"Keystore.password.must.be.at.least.6.characters", + "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Enter.keystore.password.", "\u8F38\u5165\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, + {"Enter.source.keystore.password.", "\u8ACB\u8F38\u5165\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, + {"Enter.destination.keystore.password.", "\u8ACB\u8F38\u5165\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Unknown.Entry.Type", "\u4E0D\u660E\u7684\u9805\u76EE\u985E\u578B"}, + {"Too.many.failures.Alias.not.changed", "\u592A\u591A\u932F\u8AA4\u3002\u672A\u8B8A\u66F4\u5225\u540D"}, + {"Entry.for.alias.alias.successfully.imported.", + "\u5DF2\u6210\u529F\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, + {"Entry.for.alias.alias.not.imported.", "\u672A\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u6642\u51FA\u73FE\u554F\u984C: {1}\u3002\n\u672A\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "\u5DF2\u5B8C\u6210\u532F\u5165\u547D\u4EE4: \u6210\u529F\u532F\u5165 {0} \u500B\u9805\u76EE\uFF0C{1} \u500B\u9805\u76EE\u5931\u6557\u6216\u5DF2\u53D6\u6D88"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "\u8B66\u544A: \u6B63\u5728\u8986\u5BEB\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u73FE\u6709\u5225\u540D {0}"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "\u73FE\u6709\u9805\u76EE\u5225\u540D {0} \u5B58\u5728\uFF0C\u662F\u5426\u8986\u5BEB\uFF1F[\u5426]: "}, + {"Too.many.failures.try.later", "\u592A\u591A\u932F\u8AA4 - \u8ACB\u7A0D\u5F8C\u518D\u8A66"}, + {"Certification.request.stored.in.file.filename.", + "\u8A8D\u8B49\u8981\u6C42\u5132\u5B58\u5728\u6A94\u6848 <{0}>"}, + {"Submit.this.to.your.CA", "\u5C07\u6B64\u9001\u51FA\u81F3\u60A8\u7684 CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "\u5982\u679C\u672A\u6307\u5B9A\u5225\u540D\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A destalias\u3001srckeypass \u53CA destkeypass"}, + {"Certificate.stored.in.file.filename.", + "\u6191\u8B49\u5132\u5B58\u5728\u6A94\u6848 <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "\u6191\u8B49\u56DE\u8986\u5DF2\u5B89\u88DD\u5728\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {"Certificate.reply.was.not.installed.in.keystore", + "\u6191\u8B49\u56DE\u8986\u672A\u5B89\u88DD\u5728\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {"Certificate.was.added.to.keystore", + "\u6191\u8B49\u5DF2\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {"Certificate.was.not.added.to.keystore", + "\u6191\u8B49\u672A\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {".Storing.ksfname.", "[\u5132\u5B58 {0}]"}, + {"alias.has.no.public.key.certificate.", + "{0} \u6C92\u6709\u516C\u958B\u91D1\u9470 (\u6191\u8B49)"}, + {"Cannot.derive.signature.algorithm", + "\u7121\u6CD5\u53D6\u5F97\u7C3D\u7AE0\u6F14\u7B97\u6CD5"}, + {"Alias.alias.does.not.exist", + "\u5225\u540D <{0}> \u4E0D\u5B58\u5728"}, + {"Alias.alias.has.no.certificate", + "\u5225\u540D <{0}> \u6C92\u6709\u6191\u8B49"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "\u6C92\u6709\u5EFA\u7ACB\u91D1\u9470\u7D44\uFF0C\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "\u91DD\u5C0D {4} \u7522\u751F\u6709\u6548\u671F {3} \u5929\u7684 {0} \u4F4D\u5143 {1} \u91D1\u9470\u7D44\u4EE5\u53CA\u81EA\u6211\u7C3D\u7F72\u6191\u8B49 ({2})\n\t"}, + {"Enter.key.password.for.alias.", "\u8F38\u5165 <{0}> \u7684\u91D1\u9470\u5BC6\u78BC"}, + {".RETURN.if.same.as.keystore.password.", + "\t(RETURN \u5982\u679C\u548C\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u76F8\u540C): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "\u91D1\u9470\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Too.many.failures.key.not.added.to.keystore", + "\u592A\u591A\u932F\u8AA4 - \u91D1\u9470\u672A\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB"}, + {"Destination.alias.dest.already.exists", + "\u76EE\u7684\u5730\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Too.many.failures.Key.entry.not.cloned", + "\u592A\u591A\u932F\u8AA4\u3002\u672A\u8907\u88FD\u91D1\u9470\u9805\u76EE"}, + {"key.password.for.alias.", "<{0}> \u7684\u91D1\u9470\u5BC6\u78BC"}, + {"Keystore.entry.for.id.getName.already.exists", + "<{0}> \u7684\u91D1\u9470\u5132\u5B58\u5EAB\u9805\u76EE\u5DF2\u7D93\u5B58\u5728"}, + {"Creating.keystore.entry.for.id.getName.", + "\u5EFA\u7ACB <{0}> \u7684\u91D1\u9470\u5132\u5B58\u5EAB\u9805\u76EE..."}, + {"No.entries.from.identity.database.added", + "\u6C92\u6709\u65B0\u589E\u4F86\u81EA\u8B58\u5225\u8CC7\u6599\u5EAB\u7684\u9805\u76EE"}, + {"Alias.name.alias", "\u5225\u540D\u540D\u7A31: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "\u5EFA\u7ACB\u65E5\u671F: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "\u9805\u76EE\u985E\u578B: {0}"}, + {"Certificate.chain.length.", "\u6191\u8B49\u93C8\u9577\u5EA6: "}, + {"Certificate.i.1.", "\u6191\u8B49 [{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "\u6191\u8B49\u6307\u7D0B (SHA1): "}, + {"Keystore.type.", "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B: "}, + {"Keystore.provider.", "\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005: "}, + {"Your.keystore.contains.keyStore.size.entry", + "\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5305\u542B {0,number,integer} \u9805\u76EE"}, + {"Your.keystore.contains.keyStore.size.entries", + "\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5305\u542B {0,number,integer} \u9805\u76EE"}, + {"Failed.to.parse.input", "\u7121\u6CD5\u5256\u6790\u8F38\u5165"}, + {"Empty.input", "\u7A7A\u8F38\u5165"}, + {"Not.X.509.certificate", "\u975E X.509 \u6191\u8B49"}, + {"alias.has.no.public.key", "{0} \u7121\u516C\u958B\u91D1\u9470"}, + {"alias.has.no.X.509.certificate", "{0} \u7121 X.509 \u6191\u8B49"}, + {"New.certificate.self.signed.", "\u65B0\u6191\u8B49 (\u81EA\u6211\u7C3D\u7F72): "}, + {"Reply.has.no.certificates", "\u56DE\u8986\u4E0D\u542B\u6191\u8B49"}, + {"Certificate.not.imported.alias.alias.already.exists", + "\u6191\u8B49\u672A\u8F38\u5165\uFF0C\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, + {"Input.not.an.X.509.certificate", "\u8F38\u5165\u7684\u4E0D\u662F X.509 \u6191\u8B49"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684 <{0}> \u5225\u540D\u4E4B\u4E0B\uFF0C\u6191\u8B49\u5DF2\u7D93\u5B58\u5728"}, + {"Do.you.still.want.to.add.it.no.", + "\u60A8\u4ECD\u7136\u60F3\u8981\u5C07\u4E4B\u65B0\u589E\u55CE\uFF1F [\u5426]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "\u6574\u500B\u7CFB\u7D71 CA \u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684 <{0}> \u5225\u540D\u4E4B\u4E0B\uFF0C\u6191\u8B49\u5DF2\u7D93\u5B58\u5728"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "\u60A8\u4ECD\u7136\u60F3\u8981\u5C07\u4E4B\u65B0\u589E\u81F3\u81EA\u5DF1\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u55CE\uFF1F [\u5426]: "}, + {"Trust.this.certificate.no.", "\u4FE1\u4EFB\u9019\u500B\u6191\u8B49\uFF1F [\u5426]: "}, + {"YES", "\u662F"}, + {"New.prompt.", "\u65B0 {0}: "}, + {"Passwords.must.differ", "\u5FC5\u9808\u662F\u4E0D\u540C\u7684\u5BC6\u78BC"}, + {"Re.enter.new.prompt.", "\u91CD\u65B0\u8F38\u5165\u65B0 {0}: "}, + {"Re.enter.new.password.", "\u91CD\u65B0\u8F38\u5165\u65B0\u5BC6\u78BC: "}, + {"They.don.t.match.Try.again", "\u5B83\u5011\u4E0D\u76F8\u7B26\u3002\u8ACB\u91CD\u8A66"}, + {"Enter.prompt.alias.name.", "\u8F38\u5165 {0} \u5225\u540D\u540D\u7A31: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "\u8ACB\u8F38\u5165\u65B0\u7684\u5225\u540D\u540D\u7A31\t(RETURN \u4EE5\u53D6\u6D88\u532F\u5165\u6B64\u9805\u76EE):"}, + {"Enter.alias.name.", "\u8F38\u5165\u5225\u540D\u540D\u7A31: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(RETURN \u5982\u679C\u548C <{0}> \u7684\u76F8\u540C)"}, + {".PATTERN.printX509Cert", + "\u64C1\u6709\u8005: {0}\n\u767C\u51FA\u8005: {1}\n\u5E8F\u865F: {2}\n\u6709\u6548\u671F\u81EA: {3} \u5230: {4}\n\u6191\u8B49\u6307\u7D0B:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7C3D\u7AE0\u6F14\u7B97\u6CD5\u540D\u7A31: {8}\n\t \u7248\u672C: {9}"}, + {"What.is.your.first.and.last.name.", + "\u60A8\u7684\u540D\u5B57\u8207\u59D3\u6C0F\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.organizational.unit.", + "\u60A8\u7684\u7D44\u7E54\u55AE\u4F4D\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.organization.", + "\u60A8\u7684\u7D44\u7E54\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.City.or.Locality.", + "\u60A8\u6240\u5728\u7684\u57CE\u5E02\u6216\u5730\u5340\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.State.or.Province.", + "\u60A8\u6240\u5728\u7684\u5DDE\u53CA\u7701\u4EFD\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "\u6B64\u55AE\u4F4D\u7684\u5169\u500B\u5B57\u6BCD\u570B\u5225\u4EE3\u78BC\u70BA\u4F55\uFF1F"}, + {"Is.name.correct.", "{0} \u6B63\u78BA\u55CE\uFF1F"}, + {"no", "\u5426"}, + {"yes", "\u662F"}, + {"y", "y"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "\u5225\u540D <{0}> \u6C92\u6709\u91D1\u9470"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "\u5225\u540D <{0}> \u6240\u53C3\u7167\u7684\u9805\u76EE\u4E0D\u662F\u79C1\u5BC6\u91D1\u9470\u985E\u578B\u3002-keyclone \u547D\u4EE4\u50C5\u652F\u63F4\u79C1\u5BC6\u91D1\u9470\u9805\u76EE\u7684\u8907\u88FD"}, + + {".WARNING.WARNING.WARNING.", + "***************** \u8B66\u544A \u8B66\u544A \u8B66\u544A *****************"}, + {"Signer.d.", "\u7C3D\u7F72\u8005 #%d:"}, + {"Timestamp.", "\u6642\u6233:"}, + {"Signature.", "\u7C3D\u7AE0:"}, + {"CRLs.", "CRL:"}, + {"Certificate.owner.", "\u6191\u8B49\u64C1\u6709\u8005: "}, + {"Not.a.signed.jar.file", "\u4E0D\u662F\u7C3D\u7F72\u7684 jar \u6A94\u6848"}, + {"No.certificate.from.the.SSL.server", + "\u6C92\u6709\u4F86\u81EA SSL \u4F3A\u670D\u5668\u7684\u6191\u8B49"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* \u5C1A\u672A\u9A57\u8B49\u5132\u5B58\u65BC\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u8CC7\u8A0A *\n* \u7684\u5B8C\u6574\u6027\uFF01\u82E5\u8981\u9A57\u8B49\u5176\u5B8C\u6574\u6027\uFF0C*\n* \u60A8\u5FC5\u9808\u63D0\u4F9B\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u3002 *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* \u5C1A\u672A\u9A57\u8B49\u5132\u5B58\u65BC srckeystore \u4E2D\u8CC7\u8A0A*\n* \u7684\u5B8C\u6574\u6027\uFF01\u82E5\u8981\u9A57\u8B49\u5176\u5B8C\u6574\u6027\uFF0C\u60A8\u5FC5\u9808 *\n* \u63D0\u4F9B srckeystore \u5BC6\u78BC\u3002 *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "\u6191\u8B49\u56DE\u8986\u4E26\u672A\u5305\u542B <{0}> \u7684\u516C\u958B\u91D1\u9470"}, + {"Incomplete.certificate.chain.in.reply", + "\u56DE\u8986\u6642\u7684\u6191\u8B49\u93C8\u4E0D\u5B8C\u6574"}, + {"Certificate.chain.in.reply.does.not.verify.", + "\u56DE\u8986\u6642\u7684\u6191\u8B49\u93C8\u672A\u9A57\u8B49: "}, + {"Top.level.certificate.in.reply.", + "\u56DE\u8986\u6642\u7684\u6700\u9AD8\u7D1A\u6191\u8B49:\\n"}, + {".is.not.trusted.", "... \u662F\u4E0D\u88AB\u4FE1\u4EFB\u7684\u3002"}, + {"Install.reply.anyway.no.", "\u9084\u662F\u8981\u5B89\u88DD\u56DE\u8986\uFF1F [\u5426]: "}, + {"NO", "\u5426"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "\u56DE\u8986\u6642\u7684\u516C\u958B\u91D1\u9470\u8207\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u7B26"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "\u6191\u8B49\u56DE\u8986\u8207\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u6191\u8B49\u662F\u76F8\u540C\u7684"}, + {"Failed.to.establish.chain.from.reply", + "\u7121\u6CD5\u5F9E\u56DE\u8986\u4E2D\u5C07\u93C8\u5EFA\u7ACB\u8D77\u4F86"}, + {"n", "n"}, + {"Wrong.answer.try.again", "\u932F\u8AA4\u7684\u7B54\u6848\uFF0C\u8ACB\u518D\u8A66\u4E00\u6B21"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "\u672A\u7522\u751F\u79D8\u5BC6\u91D1\u9470\uFF0C\u5225\u540D <{0}> \u5DF2\u5B58\u5728"}, + {"Please.provide.keysize.for.secret.key.generation", + "\u8ACB\u63D0\u4F9B -keysize \u4EE5\u7522\u751F\u79D8\u5BC6\u91D1\u9470"}, + + {"Extensions.", "\u64F4\u5145\u5957\u4EF6: "}, + {".Empty.value.", "(\u7A7A\u767D\u503C)"}, + {"Extension.Request.", "\u64F4\u5145\u5957\u4EF6\u8981\u6C42:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10 \u6191\u8B49\u8981\u6C42 (\u7248\u672C 1.0)\n\u4E3B\u9AD4: %s\n\u516C\u7528\u91D1\u9470: %s \u683C\u5F0F %s \u91D1\u9470\n"}, + {"Unknown.keyUsage.type.", "\u4E0D\u660E\u7684 keyUsage \u985E\u578B: "}, + {"Unknown.extendedkeyUsage.type.", "\u4E0D\u660E\u7684 extendedkeyUsage \u985E\u578B: "}, + {"Unknown.AccessDescription.type.", "\u4E0D\u660E\u7684 AccessDescription \u985E\u578B: "}, + {"Unrecognized.GeneralName.type.", "\u7121\u6CD5\u8FA8\u8B58\u7684 GeneralName \u985E\u578B: "}, + {"This.extension.cannot.be.marked.as.critical.", + "\u6B64\u64F4\u5145\u5957\u4EF6\u7121\u6CD5\u6A19\u793A\u70BA\u95DC\u9375\u3002"}, + {"Odd.number.of.hex.digits.found.", "\u627E\u5230\u5341\u516D\u9032\u4F4D\u6578\u5B57\u7684\u5947\u6578: "}, + {"Unknown.extension.type.", "\u4E0D\u660E\u7684\u64F4\u5145\u5957\u4EF6\u985E\u578B: "}, + {"command.{0}.is.ambiguous.", "\u547D\u4EE4 {0} \u4E0D\u660E\u78BA:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_TW.java b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_TW.java new file mode 100644 index 00000000000..2c7bdf5e1b7 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/keytool/Resources_zh_TW.java @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.keytool; + +/** + *

This class represents the ResourceBundle + * for the keytool. + * + */ +public class Resources_zh_TW extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"STAR", + "*******************************************"}, + {"STARNN", + "*******************************************\n\n"}, + + // keytool: Help part +// "Option" should be translated. + {".OPTION.", " [\u9078\u9805]..."}, + {"Options.", "\u9078\u9805:"}, + {"Use.keytool.help.for.all.available.commands", + "\u4F7F\u7528 \"keytool -help\" \u53D6\u5F97\u6240\u6709\u53EF\u7528\u7684\u547D\u4EE4"}, + {"Key.and.Certificate.Management.Tool", + "\u91D1\u9470\u8207\u6191\u8B49\u7BA1\u7406\u5DE5\u5177"}, + {"Commands.", "\u547D\u4EE4:"}, + {"Use.keytool.command.name.help.for.usage.of.command.name", + "\u4F7F\u7528 \"keytool -command_name -help\" \u53D6\u5F97 command_name \u7684\u7528\u6CD5"}, + // keytool: help: commands + {"Generates.a.certificate.request", + "\u7522\u751F\u6191\u8B49\u8981\u6C42"}, //-certreq + {"Changes.an.entry.s.alias", + "\u8B8A\u66F4\u9805\u76EE\u7684\u5225\u540D"}, //-changealias + {"Deletes.an.entry", + "\u522A\u9664\u9805\u76EE"}, //-delete + {"Exports.certificate", + "\u532F\u51FA\u6191\u8B49"}, //-exportcert + {"Generates.a.key.pair", + "\u7522\u751F\u91D1\u9470\u7D44"}, //-genkeypair +// translation of "secret" key should be different to "private" key. + {"Generates.a.secret.key", + "\u7522\u751F\u79D8\u5BC6\u91D1\u9470"}, //-genseckey + {"Generates.certificate.from.a.certificate.request", + "\u5F9E\u6191\u8B49\u8981\u6C42\u7522\u751F\u6191\u8B49"}, //-gencert + {"Generates.CRL", "\u7522\u751F CRL"}, //-gencrl + {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", + "\u5F9E JDK 1.1.x-style \u8B58\u5225\u8CC7\u6599\u5EAB\u532F\u5165\u9805\u76EE"}, //-identitydb + {"Imports.a.certificate.or.a.certificate.chain", + "\u532F\u5165\u6191\u8B49\u6216\u6191\u8B49\u93C8"}, //-importcert + {"Imports.one.or.all.entries.from.another.keystore", + "\u5F9E\u5176\u4ED6\u91D1\u9470\u5132\u5B58\u5EAB\u532F\u5165\u4E00\u500B\u6216\u5168\u90E8\u9805\u76EE"}, //-importkeystore + {"Clones.a.key.entry", + "\u8907\u88FD\u91D1\u9470\u9805\u76EE"}, //-keyclone + {"Changes.the.key.password.of.an.entry", + "\u8B8A\u66F4\u9805\u76EE\u7684\u91D1\u9470\u5BC6\u78BC"}, //-keypasswd + {"Lists.entries.in.a.keystore", + "\u5217\u793A\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u9805\u76EE"}, //-list + {"Prints.the.content.of.a.certificate", + "\u5217\u5370\u6191\u8B49\u7684\u5167\u5BB9"}, //-printcert + {"Prints.the.content.of.a.certificate.request", + "\u5217\u5370\u6191\u8B49\u8981\u6C42\u7684\u5167\u5BB9"}, //-printcertreq + {"Prints.the.content.of.a.CRL.file", + "\u5217\u5370 CRL \u6A94\u6848\u7684\u5167\u5BB9"}, //-printcrl + {"Generates.a.self.signed.certificate", + "\u7522\u751F\u81EA\u884C\u7C3D\u7F72\u7684\u6191\u8B49"}, //-selfcert + {"Changes.the.store.password.of.a.keystore", + "\u8B8A\u66F4\u91D1\u9470\u5132\u5B58\u5EAB\u7684\u5132\u5B58\u5BC6\u78BC"}, //-storepasswd + // keytool: help: options + {"alias.name.of.the.entry.to.process", + "\u8981\u8655\u7406\u9805\u76EE\u7684\u5225\u540D\u540D\u7A31"}, //-alias + {"destination.alias", + "\u76EE\u7684\u5730\u5225\u540D"}, //-destalias + {"destination.key.password", + "\u76EE\u7684\u5730\u91D1\u9470\u5BC6\u78BC"}, //-destkeypass + {"destination.keystore.name", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-destkeystore + {"destination.keystore.password.protected", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u4FDD\u8B77"}, //-destprotected + {"destination.keystore.provider.name", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005\u540D\u7A31"}, //-destprovidername + {"destination.keystore.password", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-deststorepass + {"destination.keystore.type", + "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-deststoretype + {"distinguished.name", + "\u8FA8\u5225\u540D\u7A31"}, //-dname + {"X.509.extension", + "X.509 \u64F4\u5145\u5957\u4EF6"}, //-ext + {"output.file.name", + "\u8F38\u51FA\u6A94\u6848\u540D\u7A31"}, //-file and -outfile + {"input.file.name", + "\u8F38\u5165\u6A94\u6848\u540D\u7A31"}, //-file and -infile + {"key.algorithm.name", + "\u91D1\u9470\u6F14\u7B97\u6CD5\u540D\u7A31"}, //-keyalg + {"key.password", + "\u91D1\u9470\u5BC6\u78BC"}, //-keypass + {"key.bit.size", + "\u91D1\u9470\u4F4D\u5143\u5927\u5C0F"}, //-keysize + {"keystore.name", + "\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-keystore + {"new.password", + "\u65B0\u5BC6\u78BC"}, //-new + {"do.not.prompt", + "\u4E0D\u8981\u63D0\u793A"}, //-noprompt + {"password.through.protected.mechanism", + "\u7D93\u7531\u4FDD\u8B77\u6A5F\u5236\u7684\u5BC6\u78BC"}, //-protected + {"provider.argument", + "\u63D0\u4F9B\u8005\u5F15\u6578"}, //-providerarg + {"provider.class.name", + "\u63D0\u4F9B\u8005\u985E\u5225\u540D\u7A31"}, //-providerclass + {"provider.name", + "\u63D0\u4F9B\u8005\u540D\u7A31"}, //-providername + {"provider.classpath", + "\u63D0\u4F9B\u8005\u985E\u5225\u8DEF\u5F91"}, //-providerpath + {"output.in.RFC.style", + "\u4EE5 RFC \u6A23\u5F0F\u8F38\u51FA"}, //-rfc + {"signature.algorithm.name", + "\u7C3D\u7AE0\u6F14\u7B97\u6CD5\u540D\u7A31"}, //-sigalg + {"source.alias", + "\u4F86\u6E90\u5225\u540D"}, //-srcalias + {"source.key.password", + "\u4F86\u6E90\u91D1\u9470\u5BC6\u78BC"}, //-srckeypass + {"source.keystore.name", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-srckeystore + {"source.keystore.password.protected", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u4FDD\u8B77"}, //-srcprotected + {"source.keystore.provider.name", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005\u540D\u7A31"}, //-srcprovidername + {"source.keystore.password", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-srcstorepass + {"source.keystore.type", + "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-srcstoretype + {"SSL.server.host.and.port", + "SSL \u4F3A\u670D\u5668\u4E3B\u6A5F\u8207\u9023\u63A5\u57E0"}, //-sslserver + {"signed.jar.file", + "\u7C3D\u7F72\u7684 jar \u6A94\u6848"}, //=jarfile + {"certificate.validity.start.date.time", + "\u6191\u8B49\u6709\u6548\u6027\u958B\u59CB\u65E5\u671F/\u6642\u9593"}, //-startdate + {"keystore.password", + "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-storepass + {"keystore.type", + "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-storetype + {"trust.certificates.from.cacerts", + "\u4F86\u81EA cacerts \u7684\u4FE1\u4EFB\u6191\u8B49"}, //-trustcacerts + {"verbose.output", + "\u8A73\u7D30\u8CC7\u8A0A\u8F38\u51FA"}, //-v + {"validity.number.of.days", + "\u6709\u6548\u6027\u65E5\u6578"}, //-validity + {"Serial.ID.of.cert.to.revoke", + "\u8981\u64A4\u92B7\u6191\u8B49\u7684\u5E8F\u5217 ID"}, //-id + // keytool: Running part + {"keytool.error.", "\u91D1\u9470\u5DE5\u5177\u932F\u8AA4: "}, + {"Illegal.option.", "\u7121\u6548\u7684\u9078\u9805:"}, + {"Illegal.value.", "\u7121\u6548\u503C: "}, + {"Unknown.password.type.", "\u4E0D\u660E\u7684\u5BC6\u78BC\u985E\u578B: "}, + {"Cannot.find.environment.variable.", + "\u627E\u4E0D\u5230\u74B0\u5883\u8B8A\u6578: "}, + {"Cannot.find.file.", "\u627E\u4E0D\u5230\u6A94\u6848: "}, + {"Command.option.flag.needs.an.argument.", "\u547D\u4EE4\u9078\u9805 {0} \u9700\u8981\u5F15\u6578\u3002"}, + {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", + "\u8B66\u544A: PKCS12 \u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u652F\u63F4\u4E0D\u540C\u7684\u5132\u5B58\u5EAB\u548C\u91D1\u9470\u5BC6\u78BC\u3002\u5FFD\u7565\u4F7F\u7528\u8005\u6307\u5B9A\u7684 {0} \u503C\u3002"}, + {".keystore.must.be.NONE.if.storetype.is.{0}", + "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247 -keystore \u5FC5\u9808\u70BA NONE"}, + {"Too.many.retries.program.terminated", + "\u91CD\u8A66\u6B21\u6578\u592A\u591A\uFF0C\u7A0B\u5F0F\u5DF2\u7D42\u6B62"}, + {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", + "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247\u4E0D\u652F\u63F4 -storepasswd \u548C -keypasswd \u547D\u4EE4"}, + {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", + "\u5982\u679C -storetype \u70BA PKCS12\uFF0C\u5247\u4E0D\u652F\u63F4 -keypasswd \u547D\u4EE4"}, + {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", + "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -keypass \u548C -new"}, + {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", + "\u5982\u679C\u6307\u5B9A -protected\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -storepass\u3001-keypass \u548C -new"}, + {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\u5982\u679C\u6307\u5B9A -srcprotected\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, + {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", + "\u5982\u679C\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u53D7\u5BC6\u78BC\u4FDD\u8B77\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -storepass\u3001-keypass \u548C -new"}, + {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", + "\u5982\u679C\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u53D7\u5BC6\u78BC\u4FDD\u8B77\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, + {"Illegal.startdate.value", "\u7121\u6548\u7684 startdate \u503C"}, + {"Validity.must.be.greater.than.zero", + "\u6709\u6548\u6027\u5FC5\u9808\u5927\u65BC\u96F6"}, + {"provName.not.a.provider", "{0} \u4E0D\u662F\u4E00\u500B\u63D0\u4F9B\u8005"}, + {"Usage.error.no.command.provided", "\u7528\u6CD5\u932F\u8AA4: \u672A\u63D0\u4F9B\u547D\u4EE4"}, + {"Source.keystore.file.exists.but.is.empty.", "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u5B58\u5728\uFF0C\u4F46\u70BA\u7A7A: "}, + {"Please.specify.srckeystore", "\u8ACB\u6307\u5B9A -srckeystore"}, + {"Must.not.specify.both.v.and.rfc.with.list.command", + " 'list' \u547D\u4EE4\u4E0D\u80FD\u540C\u6642\u6307\u5B9A -v \u53CA -rfc"}, + {"Key.password.must.be.at.least.6.characters", + "\u91D1\u9470\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"New.password.must.be.at.least.6.characters", + "\u65B0\u7684\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Keystore.file.exists.but.is.empty.", + "\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u5B58\u5728\uFF0C\u4F46\u70BA\u7A7A\u767D: "}, + {"Keystore.file.does.not.exist.", + "\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u4E0D\u5B58\u5728: "}, + {"Must.specify.destination.alias", "\u5FC5\u9808\u6307\u5B9A\u76EE\u7684\u5730\u5225\u540D"}, + {"Must.specify.alias", "\u5FC5\u9808\u6307\u5B9A\u5225\u540D"}, + {"Keystore.password.must.be.at.least.6.characters", + "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Enter.keystore.password.", "\u8F38\u5165\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, + {"Enter.source.keystore.password.", "\u8ACB\u8F38\u5165\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, + {"Enter.destination.keystore.password.", "\u8ACB\u8F38\u5165\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, + {"Keystore.password.is.too.short.must.be.at.least.6.characters", + "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Unknown.Entry.Type", "\u4E0D\u660E\u7684\u9805\u76EE\u985E\u578B"}, + {"Too.many.failures.Alias.not.changed", "\u592A\u591A\u932F\u8AA4\u3002\u672A\u8B8A\u66F4\u5225\u540D"}, + {"Entry.for.alias.alias.successfully.imported.", + "\u5DF2\u6210\u529F\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, + {"Entry.for.alias.alias.not.imported.", "\u672A\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, + {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", + "\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u6642\u51FA\u73FE\u554F\u984C: {1}\u3002\n\u672A\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, + {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", + "\u5DF2\u5B8C\u6210\u532F\u5165\u547D\u4EE4: \u6210\u529F\u532F\u5165 {0} \u500B\u9805\u76EE\uFF0C{1} \u500B\u9805\u76EE\u5931\u6557\u6216\u5DF2\u53D6\u6D88"}, + {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", + "\u8B66\u544A: \u6B63\u5728\u8986\u5BEB\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u73FE\u6709\u5225\u540D {0}"}, + {"Existing.entry.alias.alias.exists.overwrite.no.", + "\u73FE\u6709\u9805\u76EE\u5225\u540D {0} \u5B58\u5728\uFF0C\u662F\u5426\u8986\u5BEB\uFF1F[\u5426]: "}, + {"Too.many.failures.try.later", "\u592A\u591A\u932F\u8AA4 - \u8ACB\u7A0D\u5F8C\u518D\u8A66"}, + {"Certification.request.stored.in.file.filename.", + "\u8A8D\u8B49\u8981\u6C42\u5132\u5B58\u5728\u6A94\u6848 <{0}>"}, + {"Submit.this.to.your.CA", "\u5C07\u6B64\u9001\u51FA\u81F3\u60A8\u7684 CA"}, + {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", + "\u5982\u679C\u672A\u6307\u5B9A\u5225\u540D\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A destalias\u3001srckeypass \u53CA destkeypass"}, + {"Certificate.stored.in.file.filename.", + "\u6191\u8B49\u5132\u5B58\u5728\u6A94\u6848 <{0}>"}, + {"Certificate.reply.was.installed.in.keystore", + "\u6191\u8B49\u56DE\u8986\u5DF2\u5B89\u88DD\u5728\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {"Certificate.reply.was.not.installed.in.keystore", + "\u6191\u8B49\u56DE\u8986\u672A\u5B89\u88DD\u5728\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {"Certificate.was.added.to.keystore", + "\u6191\u8B49\u5DF2\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {"Certificate.was.not.added.to.keystore", + "\u6191\u8B49\u672A\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, + {".Storing.ksfname.", "[\u5132\u5B58 {0}]"}, + {"alias.has.no.public.key.certificate.", + "{0} \u6C92\u6709\u516C\u958B\u91D1\u9470 (\u6191\u8B49)"}, + {"Cannot.derive.signature.algorithm", + "\u7121\u6CD5\u53D6\u5F97\u7C3D\u7AE0\u6F14\u7B97\u6CD5"}, + {"Alias.alias.does.not.exist", + "\u5225\u540D <{0}> \u4E0D\u5B58\u5728"}, + {"Alias.alias.has.no.certificate", + "\u5225\u540D <{0}> \u6C92\u6709\u6191\u8B49"}, + {"Key.pair.not.generated.alias.alias.already.exists", + "\u6C92\u6709\u5EFA\u7ACB\u91D1\u9470\u7D44\uFF0C\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, + {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", + "\u91DD\u5C0D {4} \u7522\u751F\u6709\u6548\u671F {3} \u5929\u7684 {0} \u4F4D\u5143 {1} \u91D1\u9470\u7D44\u4EE5\u53CA\u81EA\u6211\u7C3D\u7F72\u6191\u8B49 ({2})\n\t"}, + {"Enter.key.password.for.alias.", "\u8F38\u5165 <{0}> \u7684\u91D1\u9470\u5BC6\u78BC"}, + {".RETURN.if.same.as.keystore.password.", + "\t(RETURN \u5982\u679C\u548C\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u76F8\u540C): "}, + {"Key.password.is.too.short.must.be.at.least.6.characters", + "\u91D1\u9470\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Too.many.failures.key.not.added.to.keystore", + "\u592A\u591A\u932F\u8AA4 - \u91D1\u9470\u672A\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB"}, + {"Destination.alias.dest.already.exists", + "\u76EE\u7684\u5730\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, + {"Password.is.too.short.must.be.at.least.6.characters", + "\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, + {"Too.many.failures.Key.entry.not.cloned", + "\u592A\u591A\u932F\u8AA4\u3002\u672A\u8907\u88FD\u91D1\u9470\u9805\u76EE"}, + {"key.password.for.alias.", "<{0}> \u7684\u91D1\u9470\u5BC6\u78BC"}, + {"Keystore.entry.for.id.getName.already.exists", + "<{0}> \u7684\u91D1\u9470\u5132\u5B58\u5EAB\u9805\u76EE\u5DF2\u7D93\u5B58\u5728"}, + {"Creating.keystore.entry.for.id.getName.", + "\u5EFA\u7ACB <{0}> \u7684\u91D1\u9470\u5132\u5B58\u5EAB\u9805\u76EE..."}, + {"No.entries.from.identity.database.added", + "\u6C92\u6709\u65B0\u589E\u4F86\u81EA\u8B58\u5225\u8CC7\u6599\u5EAB\u7684\u9805\u76EE"}, + {"Alias.name.alias", "\u5225\u540D\u540D\u7A31: {0}"}, + {"Creation.date.keyStore.getCreationDate.alias.", + "\u5EFA\u7ACB\u65E5\u671F: {0,date}"}, + {"alias.keyStore.getCreationDate.alias.", + "{0}, {1,date}, "}, + {"alias.", "{0}, "}, + {"Entry.type.type.", "\u9805\u76EE\u985E\u578B: {0}"}, + {"Certificate.chain.length.", "\u6191\u8B49\u93C8\u9577\u5EA6: "}, + {"Certificate.i.1.", "\u6191\u8B49 [{0,number,integer}]:"}, + {"Certificate.fingerprint.SHA1.", "\u6191\u8B49\u6307\u7D0B (SHA1): "}, + {"Keystore.type.", "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B: "}, + {"Keystore.provider.", "\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005: "}, + {"Your.keystore.contains.keyStore.size.entry", + "\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5305\u542B {0,number,integer} \u9805\u76EE"}, + {"Your.keystore.contains.keyStore.size.entries", + "\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5305\u542B {0,number,integer} \u9805\u76EE"}, + {"Failed.to.parse.input", "\u7121\u6CD5\u5256\u6790\u8F38\u5165"}, + {"Empty.input", "\u7A7A\u8F38\u5165"}, + {"Not.X.509.certificate", "\u975E X.509 \u6191\u8B49"}, + {"alias.has.no.public.key", "{0} \u7121\u516C\u958B\u91D1\u9470"}, + {"alias.has.no.X.509.certificate", "{0} \u7121 X.509 \u6191\u8B49"}, + {"New.certificate.self.signed.", "\u65B0\u6191\u8B49 (\u81EA\u6211\u7C3D\u7F72): "}, + {"Reply.has.no.certificates", "\u56DE\u8986\u4E0D\u542B\u6191\u8B49"}, + {"Certificate.not.imported.alias.alias.already.exists", + "\u6191\u8B49\u672A\u8F38\u5165\uFF0C\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, + {"Input.not.an.X.509.certificate", "\u8F38\u5165\u7684\u4E0D\u662F X.509 \u6191\u8B49"}, + {"Certificate.already.exists.in.keystore.under.alias.trustalias.", + "\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684 <{0}> \u5225\u540D\u4E4B\u4E0B\uFF0C\u6191\u8B49\u5DF2\u7D93\u5B58\u5728"}, + {"Do.you.still.want.to.add.it.no.", + "\u60A8\u4ECD\u7136\u60F3\u8981\u5C07\u4E4B\u65B0\u589E\u55CE\uFF1F [\u5426]: "}, + {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", + "\u6574\u500B\u7CFB\u7D71 CA \u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684 <{0}> \u5225\u540D\u4E4B\u4E0B\uFF0C\u6191\u8B49\u5DF2\u7D93\u5B58\u5728"}, + {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", + "\u60A8\u4ECD\u7136\u60F3\u8981\u5C07\u4E4B\u65B0\u589E\u81F3\u81EA\u5DF1\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u55CE\uFF1F [\u5426]: "}, + {"Trust.this.certificate.no.", "\u4FE1\u4EFB\u9019\u500B\u6191\u8B49\uFF1F [\u5426]: "}, + {"YES", "\u662F"}, + {"New.prompt.", "\u65B0 {0}: "}, + {"Passwords.must.differ", "\u5FC5\u9808\u662F\u4E0D\u540C\u7684\u5BC6\u78BC"}, + {"Re.enter.new.prompt.", "\u91CD\u65B0\u8F38\u5165\u65B0 {0}: "}, + {"Re.enter.new.password.", "\u91CD\u65B0\u8F38\u5165\u65B0\u5BC6\u78BC: "}, + {"They.don.t.match.Try.again", "\u5B83\u5011\u4E0D\u76F8\u7B26\u3002\u8ACB\u91CD\u8A66"}, + {"Enter.prompt.alias.name.", "\u8F38\u5165 {0} \u5225\u540D\u540D\u7A31: "}, + {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", + "\u8ACB\u8F38\u5165\u65B0\u7684\u5225\u540D\u540D\u7A31\t(RETURN \u4EE5\u53D6\u6D88\u532F\u5165\u6B64\u9805\u76EE):"}, + {"Enter.alias.name.", "\u8F38\u5165\u5225\u540D\u540D\u7A31: "}, + {".RETURN.if.same.as.for.otherAlias.", + "\t(RETURN \u5982\u679C\u548C <{0}> \u7684\u76F8\u540C)"}, + {".PATTERN.printX509Cert", + "\u64C1\u6709\u8005: {0}\n\u767C\u51FA\u8005: {1}\n\u5E8F\u865F: {2}\n\u6709\u6548\u671F\u81EA: {3} \u5230: {4}\n\u6191\u8B49\u6307\u7D0B:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7C3D\u7AE0\u6F14\u7B97\u6CD5\u540D\u7A31: {8}\n\t \u7248\u672C: {9}"}, + {"What.is.your.first.and.last.name.", + "\u60A8\u7684\u540D\u5B57\u8207\u59D3\u6C0F\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.organizational.unit.", + "\u60A8\u7684\u7D44\u7E54\u55AE\u4F4D\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.organization.", + "\u60A8\u7684\u7D44\u7E54\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.City.or.Locality.", + "\u60A8\u6240\u5728\u7684\u57CE\u5E02\u6216\u5730\u5340\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.name.of.your.State.or.Province.", + "\u60A8\u6240\u5728\u7684\u5DDE\u53CA\u7701\u4EFD\u540D\u7A31\u70BA\u4F55\uFF1F"}, + {"What.is.the.two.letter.country.code.for.this.unit.", + "\u6B64\u55AE\u4F4D\u7684\u5169\u500B\u5B57\u6BCD\u570B\u5225\u4EE3\u78BC\u70BA\u4F55\uFF1F"}, + {"Is.name.correct.", "{0} \u6B63\u78BA\u55CE\uFF1F"}, + {"no", "\u5426"}, + {"yes", "\u662F"}, + {"y", "y"}, + {".defaultValue.", " [{0}]: "}, + {"Alias.alias.has.no.key", + "\u5225\u540D <{0}> \u6C92\u6709\u91D1\u9470"}, + {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", + "\u5225\u540D <{0}> \u6240\u53C3\u7167\u7684\u9805\u76EE\u4E0D\u662F\u79C1\u5BC6\u91D1\u9470\u985E\u578B\u3002-keyclone \u547D\u4EE4\u50C5\u652F\u63F4\u79C1\u5BC6\u91D1\u9470\u9805\u76EE\u7684\u8907\u88FD"}, + + {".WARNING.WARNING.WARNING.", + "***************** \u8B66\u544A \u8B66\u544A \u8B66\u544A *****************"}, + {"Signer.d.", "\u7C3D\u7F72\u8005 #%d:"}, + {"Timestamp.", "\u6642\u6233:"}, + {"Signature.", "\u7C3D\u7AE0:"}, + {"CRLs.", "CRL:"}, + {"Certificate.owner.", "\u6191\u8B49\u64C1\u6709\u8005: "}, + {"Not.a.signed.jar.file", "\u4E0D\u662F\u7C3D\u7F72\u7684 jar \u6A94\u6848"}, + {"No.certificate.from.the.SSL.server", + "\u6C92\u6709\u4F86\u81EA SSL \u4F3A\u670D\u5668\u7684\u6191\u8B49"}, + + {".The.integrity.of.the.information.stored.in.your.keystore.", + "* \u5C1A\u672A\u9A57\u8B49\u5132\u5B58\u65BC\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u8CC7\u8A0A *\n* \u7684\u5B8C\u6574\u6027\uFF01\u82E5\u8981\u9A57\u8B49\u5176\u5B8C\u6574\u6027\uFF0C*\n* \u60A8\u5FC5\u9808\u63D0\u4F9B\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u3002 *"}, + {".The.integrity.of.the.information.stored.in.the.srckeystore.", + "* \u5C1A\u672A\u9A57\u8B49\u5132\u5B58\u65BC srckeystore \u4E2D\u8CC7\u8A0A*\n* \u7684\u5B8C\u6574\u6027\uFF01\u82E5\u8981\u9A57\u8B49\u5176\u5B8C\u6574\u6027\uFF0C\u60A8\u5FC5\u9808 *\n* \u63D0\u4F9B srckeystore \u5BC6\u78BC\u3002 *"}, + + {"Certificate.reply.does.not.contain.public.key.for.alias.", + "\u6191\u8B49\u56DE\u8986\u4E26\u672A\u5305\u542B <{0}> \u7684\u516C\u958B\u91D1\u9470"}, + {"Incomplete.certificate.chain.in.reply", + "\u56DE\u8986\u6642\u7684\u6191\u8B49\u93C8\u4E0D\u5B8C\u6574"}, + {"Certificate.chain.in.reply.does.not.verify.", + "\u56DE\u8986\u6642\u7684\u6191\u8B49\u93C8\u672A\u9A57\u8B49: "}, + {"Top.level.certificate.in.reply.", + "\u56DE\u8986\u6642\u7684\u6700\u9AD8\u7D1A\u6191\u8B49:\\n"}, + {".is.not.trusted.", "... \u662F\u4E0D\u88AB\u4FE1\u4EFB\u7684\u3002"}, + {"Install.reply.anyway.no.", "\u9084\u662F\u8981\u5B89\u88DD\u56DE\u8986\uFF1F [\u5426]: "}, + {"NO", "\u5426"}, + {"Public.keys.in.reply.and.keystore.don.t.match", + "\u56DE\u8986\u6642\u7684\u516C\u958B\u91D1\u9470\u8207\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u7B26"}, + {"Certificate.reply.and.certificate.in.keystore.are.identical", + "\u6191\u8B49\u56DE\u8986\u8207\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u6191\u8B49\u662F\u76F8\u540C\u7684"}, + {"Failed.to.establish.chain.from.reply", + "\u7121\u6CD5\u5F9E\u56DE\u8986\u4E2D\u5C07\u93C8\u5EFA\u7ACB\u8D77\u4F86"}, + {"n", "n"}, + {"Wrong.answer.try.again", "\u932F\u8AA4\u7684\u7B54\u6848\uFF0C\u8ACB\u518D\u8A66\u4E00\u6B21"}, + {"Secret.key.not.generated.alias.alias.already.exists", + "\u672A\u7522\u751F\u79D8\u5BC6\u91D1\u9470\uFF0C\u5225\u540D <{0}> \u5DF2\u5B58\u5728"}, + {"Please.provide.keysize.for.secret.key.generation", + "\u8ACB\u63D0\u4F9B -keysize \u4EE5\u7522\u751F\u79D8\u5BC6\u91D1\u9470"}, + + {"Extensions.", "\u64F4\u5145\u5957\u4EF6: "}, + {".Empty.value.", "(\u7A7A\u767D\u503C)"}, + {"Extension.Request.", "\u64F4\u5145\u5957\u4EF6\u8981\u6C42:"}, + {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", + "PKCS #10 \u6191\u8B49\u8981\u6C42 (\u7248\u672C 1.0)\n\u4E3B\u9AD4: %s\n\u516C\u7528\u91D1\u9470: %s \u683C\u5F0F %s \u91D1\u9470\n"}, + {"Unknown.keyUsage.type.", "\u4E0D\u660E\u7684 keyUsage \u985E\u578B: "}, + {"Unknown.extendedkeyUsage.type.", "\u4E0D\u660E\u7684 extendedkeyUsage \u985E\u578B: "}, + {"Unknown.AccessDescription.type.", "\u4E0D\u660E\u7684 AccessDescription \u985E\u578B: "}, + {"Unrecognized.GeneralName.type.", "\u7121\u6CD5\u8FA8\u8B58\u7684 GeneralName \u985E\u578B: "}, + {"This.extension.cannot.be.marked.as.critical.", + "\u6B64\u64F4\u5145\u5957\u4EF6\u7121\u6CD5\u6A19\u793A\u70BA\u95DC\u9375\u3002"}, + {"Odd.number.of.hex.digits.found.", "\u627E\u5230\u5341\u516D\u9032\u4F4D\u6578\u5B57\u7684\u5947\u6578: "}, + {"Unknown.extension.type.", "\u4E0D\u660E\u7684\u64F4\u5145\u5957\u4EF6\u985E\u578B: "}, + {"command.{0}.is.ambiguous.", "\u547D\u4EE4 {0} \u4E0D\u660E\u78BA:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java b/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java index 267cc0132b9..5835ce995bf 100644 --- a/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java +++ b/jdk/src/share/classes/sun/security/tools/policytool/PolicyTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,8 @@ public class PolicyTool { // for i18n static final java.util.ResourceBundle rb = - java.util.ResourceBundle.getBundle("sun.security.util.Resources"); + java.util.ResourceBundle.getBundle( + "sun.security.tools.policytool.Resources"); static final Collator collator = Collator.getInstance(); static { // this is for case insensitive string comparisons diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources.java new file mode 100644 index 00000000000..c155dcea92b --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources.java @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "Warning: A public key for alias {0} does not exist. Make sure a KeyStore is properly configured."}, + {"Warning.Class.not.found.class", "Warning: Class not found: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "Warning: Invalid argument(s) for constructor: {0}"}, + {"Illegal.Principal.Type.type", "Illegal Principal Type: {0}"}, + {"Illegal.option.option", "Illegal option: {0}"}, + {"Usage.policytool.options.", "Usage: policytool [options]"}, + {".file.file.policy.file.location", + " [-file ] policy file location"}, + {"New", "New"}, + {"Open", "Open"}, + {"Save", "Save"}, + {"Save.As", "Save As"}, + {"View.Warning.Log", "View Warning Log"}, + {"Exit", "Exit"}, + {"Add.Policy.Entry", "Add Policy Entry"}, + {"Edit.Policy.Entry", "Edit Policy Entry"}, + {"Remove.Policy.Entry", "Remove Policy Entry"}, + {"Edit", "Edit"}, + {"Retain", "Retain"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "Warning: File name may include escaped backslash characters. " + + "It is not necessary to escape backslash characters " + + "(the tool escapes characters as necessary when writing " + + "the policy contents to the persistent store).\n\n" + + "Click on Retain to retain the entered name, or click on " + + "Edit to edit the name."}, + + {"Add.Public.Key.Alias", "Add Public Key Alias"}, + {"Remove.Public.Key.Alias", "Remove Public Key Alias"}, + {"File", "File"}, + {"KeyStore", "KeyStore"}, + {"Policy.File.", "Policy File:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "Could not open policy file: {0}: {1}"}, + {"Policy.Tool", "Policy Tool"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "Errors have occurred while opening the policy configuration. View the Warning Log for more information."}, + {"Error", "Error"}, + {"OK", "OK"}, + {"Status", "Status"}, + {"Warning", "Warning"}, + {"Permission.", + "Permission: "}, + {"Principal.Type.", "Principal Type:"}, + {"Principal.Name.", "Principal Name:"}, + {"Target.Name.", + "Target Name: "}, + {"Actions.", + "Actions: "}, + {"OK.to.overwrite.existing.file.filename.", + "OK to overwrite existing file {0}?"}, + {"Cancel", "Cancel"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "Add Principal"}, + {"Edit.Principal", "Edit Principal"}, + {"Remove.Principal", "Remove Principal"}, + {"Principals.", "Principals:"}, + {".Add.Permission", " Add Permission"}, + {".Edit.Permission", " Edit Permission"}, + {"Remove.Permission", "Remove Permission"}, + {"Done", "Done"}, + {"KeyStore.URL.", "KeyStore URL:"}, + {"KeyStore.Type.", "KeyStore Type:"}, + {"KeyStore.Provider.", "KeyStore Provider:"}, + {"KeyStore.Password.URL.", "KeyStore Password URL:"}, + {"Principals", "Principals"}, + {".Edit.Principal.", " Edit Principal:"}, + {".Add.New.Principal.", " Add New Principal:"}, + {"Permissions", "Permissions"}, + {".Edit.Permission.", " Edit Permission:"}, + {".Add.New.Permission.", " Add New Permission:"}, + {"Signed.By.", "Signed By:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "Cannot Specify Principal with a Wildcard Class without a Wildcard Name"}, + {"Cannot.Specify.Principal.without.a.Name", + "Cannot Specify Principal without a Name"}, + {"Permission.and.Target.Name.must.have.a.value", + "Permission and Target Name must have a value"}, + {"Remove.this.Policy.Entry.", "Remove this Policy Entry?"}, + {"Overwrite.File", "Overwrite File"}, + {"Policy.successfully.written.to.filename", + "Policy successfully written to {0}"}, + {"null.filename", "null filename"}, + {"Save.changes.", "Save changes?"}, + {"Yes", "Yes"}, + {"No", "No"}, + {"Policy.Entry", "Policy Entry"}, + {"Save.Changes", "Save Changes"}, + {"No.Policy.Entry.selected", "No Policy Entry selected"}, + {"Unable.to.open.KeyStore.ex.toString.", + "Unable to open KeyStore: {0}"}, + {"No.principal.selected", "No principal selected"}, + {"No.permission.selected", "No permission selected"}, + {"name", "name"}, + {"configuration.type", "configuration type"}, + {"environment.variable.name", "environment variable name"}, + {"library.name", "library name"}, + {"package.name", "package name"}, + {"policy.type", "policy type"}, + {"property.name", "property name"}, + {"provider.name", "provider name"}, + {"Principal.List", "Principal List"}, + {"Permission.List", "Permission List"}, + {"Code.Base", "Code Base"}, + {"KeyStore.U.R.L.", "KeyStore U R L:"}, + {"KeyStore.Password.U.R.L.", "KeyStore Password U R L:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java new file mode 100644 index 00000000000..4ca4c7e3394 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_de.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_de extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "Warnung: Kein Public Key f\u00FCr Alias {0} vorhanden. Vergewissern Sie sich, dass der KeyStore ordnungsgem\u00E4\u00DF konfiguriert ist."}, + {"Warning.Class.not.found.class", "Warnung: Klasse nicht gefunden: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "Warnung: Ung\u00FCltige(s) Argument(e) f\u00FCr Constructor: {0}"}, + {"Illegal.Principal.Type.type", "Ung\u00FCltiger Principal-Typ: {0}"}, + {"Illegal.option.option", "Ung\u00FCltige Option: {0}"}, + {"Usage.policytool.options.", "Verwendung: policytool [Optionen]"}, + {".file.file.policy.file.location", + " [-file ] Policy-Dateiverzeichnis"}, + {"New", "Neu"}, + {"Open", "\u00D6ffnen"}, + {"Save", "Speichern"}, + {"Save.As", "Speichern unter"}, + {"View.Warning.Log", "Warnungslog anzeigen"}, + {"Exit", "Beenden"}, + {"Add.Policy.Entry", "Policy-Eintrag hinzuf\u00FCgen"}, + {"Edit.Policy.Entry", "Policy-Eintrag bearbeiten"}, + {"Remove.Policy.Entry", "Policy-Eintrag entfernen"}, + {"Edit", "Bearbeiten"}, + {"Retain", "Beibehalten"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "Warnung: M\u00F6glicherweise enth\u00E4lt der Dateiname Escape-Zeichen mit Backslash. Es ist nicht notwendig, Backslash-Zeichen zu escapen (das Tool f\u00FChrt dies automatisch beim Schreiben des Policy-Contents in den persistenten Speicher aus).\n\nKlicken Sie auf \"Beibehalten\", um den eingegebenen Namen beizubehalten oder auf \"Bearbeiten\", um den Namen zu bearbeiten."}, + + {"Add.Public.Key.Alias", "Public Key-Alias hinzuf\u00FCgen"}, + {"Remove.Public.Key.Alias", "Public Key-Alias entfernen"}, + {"File", "Datei"}, + {"KeyStore", "KeyStore"}, + {"Policy.File.", "Policy-Datei:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "Policy-Datei konnte nicht ge\u00F6ffnet werden: {0}: {1}"}, + {"Policy.Tool", "Policy-Tool"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "Beim \u00D6ffnen der Policy-Konfiguration sind Fehler aufgetreten. Weitere Informationen finden Sie im Warnungslog."}, + {"Error", "Fehler"}, + {"OK", "OK"}, + {"Status", "Status"}, + {"Warning", "Warnung"}, + {"Permission.", + "Berechtigung: "}, + {"Principal.Type.", "Principal-Typ:"}, + {"Principal.Name.", "Principal-Name:"}, + {"Target.Name.", + "Zielname: "}, + {"Actions.", + "Aktionen: "}, + {"OK.to.overwrite.existing.file.filename.", + "Vorhandene Datei {0} \u00FCberschreiben?"}, + {"Cancel", "Abbrechen"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "Principal hinzuf\u00FCgen"}, + {"Edit.Principal", "Principal bearbeiten"}, + {"Remove.Principal", "Principal entfernen"}, + {"Principals.", "Principals:"}, + {".Add.Permission", " Berechtigung hinzuf\u00FCgen"}, + {".Edit.Permission", " Berechtigung bearbeiten"}, + {"Remove.Permission", "Berechtigung entfernen"}, + {"Done", "Fertig"}, + {"KeyStore.URL.", "KeyStore-URL:"}, + {"KeyStore.Type.", "KeyStore-Typ:"}, + {"KeyStore.Provider.", "KeyStore-Provider:"}, + {"KeyStore.Password.URL.", "KeyStore-Kennwort-URL:"}, + {"Principals", "Principals"}, + {".Edit.Principal.", " Principal bearbeiten:"}, + {".Add.New.Principal.", " Neuen Principal hinzuf\u00FCgen:"}, + {"Permissions", "Berechtigungen"}, + {".Edit.Permission.", " Berechtigung bearbeiten:"}, + {".Add.New.Permission.", " Neue Berechtigung hinzuf\u00FCgen:"}, + {"Signed.By.", "Signiert von:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "Principal kann nicht mit einer Platzhalterklasse ohne Platzhalternamen angegeben werden"}, + {"Cannot.Specify.Principal.without.a.Name", + "Principal kann nicht ohne einen Namen angegeben werden"}, + {"Permission.and.Target.Name.must.have.a.value", + "Berechtigung und Zielname m\u00FCssen einen Wert haben"}, + {"Remove.this.Policy.Entry.", "Diesen Policy-Eintrag entfernen?"}, + {"Overwrite.File", "Datei \u00FCberschreiben"}, + {"Policy.successfully.written.to.filename", + "Policy erfolgreich in {0} geschrieben"}, + {"null.filename", "Null-Dateiname"}, + {"Save.changes.", "\u00C4nderungen speichern?"}, + {"Yes", "Ja"}, + {"No", "Nein"}, + {"Policy.Entry", "Policy-Eintrag"}, + {"Save.Changes", "\u00C4nderungen speichern"}, + {"No.Policy.Entry.selected", "Kein Policy-Eintrag ausgew\u00E4hlt"}, + {"Unable.to.open.KeyStore.ex.toString.", + "KeyStore kann nicht ge\u00F6ffnet werden: {0}"}, + {"No.principal.selected", "Kein Principal ausgew\u00E4hlt"}, + {"No.permission.selected", "Keine Berechtigung ausgew\u00E4hlt"}, + {"name", "Name"}, + {"configuration.type", "Konfigurationstyp"}, + {"environment.variable.name", "Umgebungsvariablenname"}, + {"library.name", "Library-Name"}, + {"package.name", "Packagename"}, + {"policy.type", "Policy-Typ"}, + {"property.name", "Eigenschaftsname"}, + {"provider.name", "Providername"}, + {"Principal.List", "Principal-Liste"}, + {"Permission.List", "Berechtigungsliste"}, + {"Code.Base", "Codebase"}, + {"KeyStore.U.R.L.", "KeyStore-URL:"}, + {"KeyStore.Password.U.R.L.", "KeyStore-Kennwort-URL:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_es.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_es.java new file mode 100644 index 00000000000..142550094bd --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_es.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_es extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "Advertencia: no hay clave p\u00FAblica para el alias {0}. Aseg\u00FArese de que se ha configurado correctamente un almac\u00E9n de claves."}, + {"Warning.Class.not.found.class", "Advertencia: no se ha encontrado la clase: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "Advertencia: argumento(s) no v\u00E1lido(s) para el constructor: {0}"}, + {"Illegal.Principal.Type.type", "Tipo de principal no permitido: {0}"}, + {"Illegal.option.option", "Opci\u00F3n no permitida: {0}"}, + {"Usage.policytool.options.", "Sintaxis: policytool [opciones]"}, + {".file.file.policy.file.location", + " [-file ] ubicaci\u00F3n del archivo de normas"}, + {"New", "Nuevo"}, + {"Open", "Abrir"}, + {"Save", "Guardar"}, + {"Save.As", "Guardar como"}, + {"View.Warning.Log", "Ver Log de Advertencias"}, + {"Exit", "Salir"}, + {"Add.Policy.Entry", "Agregar Entrada de Pol\u00EDtica"}, + {"Edit.Policy.Entry", "Editar Entrada de Pol\u00EDtica"}, + {"Remove.Policy.Entry", "Eliminar Entrada de Pol\u00EDtica"}, + {"Edit", "Editar"}, + {"Retain", "Mantener"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "Advertencia: el nombre del archivo puede contener caracteres de barra invertida de escape. No es necesario utilizar barras invertidas de escape (la herramienta aplica caracteres de escape seg\u00FAn sea necesario al escribir el contenido de las pol\u00EDticas en el almac\u00E9n persistente).\n\nHaga clic en Mantener para conservar el nombre introducido o en Editar para modificarlo."}, + + {"Add.Public.Key.Alias", "Agregar Alias de Clave P\u00FAblico"}, + {"Remove.Public.Key.Alias", "Eliminar Alias de Clave P\u00FAblico"}, + {"File", "Archivo"}, + {"KeyStore", "Almac\u00E9n de Claves"}, + {"Policy.File.", "Archivo de Pol\u00EDtica:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "No se ha podido abrir el archivo de pol\u00EDtica: {0}: {1}"}, + {"Policy.Tool", "Herramienta de Pol\u00EDticas"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "Ha habido errores al abrir la configuraci\u00F3n de pol\u00EDticas. V\u00E9ase el log de advertencias para obtener m\u00E1s informaci\u00F3n."}, + {"Error", "Error"}, + {"OK", "Aceptar"}, + {"Status", "Estado"}, + {"Warning", "Advertencia"}, + {"Permission.", + "Permiso: "}, + {"Principal.Type.", "Tipo de Principal:"}, + {"Principal.Name.", "Nombre de Principal:"}, + {"Target.Name.", + "Nombre de Destino: "}, + {"Actions.", + "Acciones: "}, + {"OK.to.overwrite.existing.file.filename.", + "\u00BFSobrescribir el archivo existente {0}?"}, + {"Cancel", "Cancelar"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "Agregar Principal"}, + {"Edit.Principal", "Editar Principal"}, + {"Remove.Principal", "Eliminar Principal"}, + {"Principals.", "Principales:"}, + {".Add.Permission", " Agregar Permiso"}, + {".Edit.Permission", " Editar Permiso"}, + {"Remove.Permission", "Eliminar Permiso"}, + {"Done", "Listo"}, + {"KeyStore.URL.", "URL de Almac\u00E9n de Claves:"}, + {"KeyStore.Type.", "Tipo de Almac\u00E9n de Claves:"}, + {"KeyStore.Provider.", "Proveedor de Almac\u00E9n de Claves:"}, + {"KeyStore.Password.URL.", "URL de Contrase\u00F1a de Almac\u00E9n de Claves:"}, + {"Principals", "Principales"}, + {".Edit.Principal.", " Editar Principal:"}, + {".Add.New.Principal.", " Agregar Nuevo Principal:"}, + {"Permissions", "Permisos"}, + {".Edit.Permission.", " Editar Permiso:"}, + {".Add.New.Permission.", " Agregar Permiso Nuevo:"}, + {"Signed.By.", "Firmado Por:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "No se puede especificar un principal con una clase de comod\u00EDn sin un nombre de comod\u00EDn"}, + {"Cannot.Specify.Principal.without.a.Name", + "No se puede especificar el principal sin un nombre"}, + {"Permission.and.Target.Name.must.have.a.value", + "Permiso y Nombre de Destino deben tener un valor"}, + {"Remove.this.Policy.Entry.", "\u00BFEliminar esta entrada de pol\u00EDtica?"}, + {"Overwrite.File", "Sobrescribir Archivo"}, + {"Policy.successfully.written.to.filename", + "Pol\u00EDtica escrita correctamente en {0}"}, + {"null.filename", "nombre de archivo nulo"}, + {"Save.changes.", "\u00BFGuardar los cambios?"}, + {"Yes", "S\u00ED"}, + {"No", "No"}, + {"Policy.Entry", "Entrada de Pol\u00EDtica"}, + {"Save.Changes", "Guardar Cambios"}, + {"No.Policy.Entry.selected", "No se ha seleccionado la entrada de pol\u00EDtica"}, + {"Unable.to.open.KeyStore.ex.toString.", + "No se ha podido abrir el almac\u00E9n de claves: {0}"}, + {"No.principal.selected", "No se ha seleccionado un principal"}, + {"No.permission.selected", "No se ha seleccionado un permiso"}, + {"name", "nombre"}, + {"configuration.type", "tipo de configuraci\u00F3n"}, + {"environment.variable.name", "nombre de variable de entorno"}, + {"library.name", "nombre de la biblioteca"}, + {"package.name", "nombre del paquete"}, + {"policy.type", "tipo de pol\u00EDtica"}, + {"property.name", "nombre de la propiedad"}, + {"provider.name", "nombre del proveedor"}, + {"Principal.List", "Lista de Principales"}, + {"Permission.List", "Lista de Permisos"}, + {"Code.Base", "Base de C\u00F3digo"}, + {"KeyStore.U.R.L.", "URL de Almac\u00E9n de Claves:"}, + {"KeyStore.Password.U.R.L.", "URL de Contrase\u00F1a de Almac\u00E9n de Claves:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_fr.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_fr.java new file mode 100644 index 00000000000..898e9cc8c9b --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_fr.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_fr extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "Avertissement\u00A0: il n''existe pas de cl\u00E9 publique pour l''alias {0}. V\u00E9rifiez que le fichier de cl\u00E9s d''acc\u00E8s est correctement configur\u00E9."}, + {"Warning.Class.not.found.class", "Avertissement : classe introuvable - {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "Avertissement\u00A0: arguments non valides pour le constructeur\u00A0- {0}"}, + {"Illegal.Principal.Type.type", "Type de principal non admis : {0}"}, + {"Illegal.option.option", "Option non admise : {0}"}, + {"Usage.policytool.options.", "Syntaxe : policytool [options]"}, + {".file.file.policy.file.location", + " [-file ] emplacement du fichier de r\u00E8gles"}, + {"New", "Nouveau"}, + {"Open", "Ouvrir"}, + {"Save", "Enregistrer"}, + {"Save.As", "Enregistrer sous"}, + {"View.Warning.Log", "Afficher le journal des avertissements"}, + {"Exit", "Quitter"}, + {"Add.Policy.Entry", "Ajouter une r\u00E8gle"}, + {"Edit.Policy.Entry", "Modifier une r\u00E8gle"}, + {"Remove.Policy.Entry", "Enlever une r\u00E8gle"}, + {"Edit", "Modifier"}, + {"Retain", "Conserver"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "Avertissement : il se peut que le nom de fichier contienne des barres obliques inverses avec caract\u00E8re d'\u00E9chappement. Il n'est pas n\u00E9cessaire d'ajouter un caract\u00E8re d'\u00E9chappement aux barres obliques inverses. L'outil proc\u00E8de \u00E0 l'\u00E9chappement si n\u00E9cessaire lorsqu'il \u00E9crit le contenu des r\u00E8gles dans la zone de stockage persistant).\n\nCliquez sur Conserver pour garder le nom saisi ou sur Modifier pour le remplacer."}, + + {"Add.Public.Key.Alias", "Ajouter un alias de cl\u00E9 publique"}, + {"Remove.Public.Key.Alias", "Enlever un alias de cl\u00E9 publique"}, + {"File", "Fichier"}, + {"KeyStore", "Fichier de cl\u00E9s"}, + {"Policy.File.", "Fichier de r\u00E8gles :"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "Impossible d''ouvrir le fichier de r\u00E8gles\u00A0: {0}: {1}"}, + {"Policy.Tool", "Policy Tool"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "Des erreurs se sont produites \u00E0 l'ouverture de la configuration de r\u00E8gles. Pour plus d'informations, consultez le journal des avertissements."}, + {"Error", "Erreur"}, + {"OK", "OK"}, + {"Status", "Statut"}, + {"Warning", "Avertissement"}, + {"Permission.", + "Droit : "}, + {"Principal.Type.", "Type de principal :"}, + {"Principal.Name.", "Nom de principal :"}, + {"Target.Name.", + "Nom de cible : "}, + {"Actions.", + "Actions : "}, + {"OK.to.overwrite.existing.file.filename.", + "Remplacer le fichier existant {0} ?"}, + {"Cancel", "Annuler"}, + {"CodeBase.", "Base de code :"}, + {"SignedBy.", "Sign\u00E9 par :"}, + {"Add.Principal", "Ajouter un principal"}, + {"Edit.Principal", "Modifier un principal"}, + {"Remove.Principal", "Enlever un principal"}, + {"Principals.", "Principaux :"}, + {".Add.Permission", " Ajouter un droit"}, + {".Edit.Permission", " Modifier un droit"}, + {"Remove.Permission", "Enlever un droit"}, + {"Done", "Termin\u00E9"}, + {"KeyStore.URL.", "URL du fichier de cl\u00E9s :"}, + {"KeyStore.Type.", "Type du fichier de cl\u00E9s :"}, + {"KeyStore.Provider.", "Fournisseur du fichier de cl\u00E9s :"}, + {"KeyStore.Password.URL.", "URL du mot de passe du fichier de cl\u00E9s :"}, + {"Principals", "Principaux"}, + {".Edit.Principal.", " Modifier un principal :"}, + {".Add.New.Principal.", " Ajouter un principal :"}, + {"Permissions", "Droits"}, + {".Edit.Permission.", " Modifier un droit :"}, + {".Add.New.Permission.", " Ajouter un droit :"}, + {"Signed.By.", "Sign\u00E9 par :"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "Impossible de sp\u00E9cifier un principal avec une classe g\u00E9n\u00E9rique sans nom g\u00E9n\u00E9rique"}, + {"Cannot.Specify.Principal.without.a.Name", + "Impossible de sp\u00E9cifier un principal sans nom"}, + {"Permission.and.Target.Name.must.have.a.value", + "Le droit et le nom de cible doivent avoir une valeur"}, + {"Remove.this.Policy.Entry.", "Enlever cette r\u00E8gle ?"}, + {"Overwrite.File", "Remplacer le fichier"}, + {"Policy.successfully.written.to.filename", + "R\u00E8gle \u00E9crite dans {0}"}, + {"null.filename", "nom de fichier NULL"}, + {"Save.changes.", "Enregistrer les modifications ?"}, + {"Yes", "Oui"}, + {"No", "Non"}, + {"Policy.Entry", "R\u00E8gle"}, + {"Save.Changes", "Enregistrer les modifications"}, + {"No.Policy.Entry.selected", "Aucune r\u00E8gle s\u00E9lectionn\u00E9e"}, + {"Unable.to.open.KeyStore.ex.toString.", + "Impossible d''ouvrir le fichier de cl\u00E9s d''acc\u00E8s : {0}"}, + {"No.principal.selected", "Aucun principal s\u00E9lectionn\u00E9"}, + {"No.permission.selected", "Aucun droit s\u00E9lectionn\u00E9"}, + {"name", "nom"}, + {"configuration.type", "type de configuration"}, + {"environment.variable.name", "Nom de variable d'environnement"}, + {"library.name", "nom de biblioth\u00E8que"}, + {"package.name", "nom de package"}, + {"policy.type", "type de r\u00E8gle"}, + {"property.name", "nom de propri\u00E9t\u00E9"}, + {"provider.name", "nom du fournisseur"}, + {"Principal.List", "Liste de principaux"}, + {"Permission.List", "Liste de droits"}, + {"Code.Base", "Base de code"}, + {"KeyStore.U.R.L.", "URL du fichier de cl\u00E9s :"}, + {"KeyStore.Password.U.R.L.", "URL du mot de passe du fichier de cl\u00E9s :"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_it.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_it.java new file mode 100644 index 00000000000..3daf8616bee --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_it.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_it extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "Avvertenza: non esiste una chiave pubblica per l''alias {0}. Verificare che il keystore sia configurato correttamente."}, + {"Warning.Class.not.found.class", "Avvertenza: classe non trovata: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "Avvertenza: argomento o argomenti non validi per il costruttore {0}"}, + {"Illegal.Principal.Type.type", "Tipo principal non valido: {0}"}, + {"Illegal.option.option", "Opzione non valida: {0}"}, + {"Usage.policytool.options.", "Utilizzo: policytool [opzioni]"}, + {".file.file.policy.file.location", + " [-file ] posizione del file dei criteri"}, + {"New", "Nuovo"}, + {"Open", "Apri"}, + {"Save", "Salva"}, + {"Save.As", "Salva con nome"}, + {"View.Warning.Log", "Visualizza registro avvertenze"}, + {"Exit", "Esci"}, + {"Add.Policy.Entry", "Aggiungi voce dei criteri"}, + {"Edit.Policy.Entry", "Modifica voce dei criteri"}, + {"Remove.Policy.Entry", "Rimuovi voce dei criteri"}, + {"Edit", "Modifica"}, + {"Retain", "Mantieni"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "Avvertenza: il nome file pu\u00F2 includere barre rovesciate con escape. Non \u00E8 necessario eseguire l'escape delle barre rovesciate (se necessario lo strumento esegue l'escape dei caratteri al momento della scrittura del contenuto dei criteri nell'area di memorizzazione persistente).\n\nFare click su Mantieni per conservare il nome immesso, oppure su Modifica per modificare il nome."}, + + {"Add.Public.Key.Alias", "Aggiungi alias chiave pubblica"}, + {"Remove.Public.Key.Alias", "Rimuovi alias chiave pubblica"}, + {"File", "File"}, + {"KeyStore", "Keystore"}, + {"Policy.File.", "File dei criteri:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "Impossibile aprire il file di criteri {0}: {1}"}, + {"Policy.Tool", "Strumento criteri"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "Si sono verificati errori durante l'apertura della configurazione dei criteri. Consultare il registro delle avvertenze per ulteriori informazioni."}, + {"Error", "Errore"}, + {"OK", "OK"}, + {"Status", "Stato"}, + {"Warning", "Avvertenza"}, + {"Permission.", + "Autorizzazione: "}, + {"Principal.Type.", "Tipo principal:"}, + {"Principal.Name.", "Nome principal:"}, + {"Target.Name.", + "Nome destinazione: "}, + {"Actions.", + "Azioni: "}, + {"OK.to.overwrite.existing.file.filename.", + "OK per sovrascrivere il file {0}?"}, + {"Cancel", "Annulla"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "Aggiungi principal"}, + {"Edit.Principal", "Modifica principal"}, + {"Remove.Principal", "Rimuovi principal"}, + {"Principals.", "Principal:"}, + {".Add.Permission", " Aggiungi autorizzazione"}, + {".Edit.Permission", " Modifica autorizzazione"}, + {"Remove.Permission", "Rimuovi autorizzazione"}, + {"Done", "Fine"}, + {"KeyStore.URL.", "URL keystore:"}, + {"KeyStore.Type.", "Tipo keystore:"}, + {"KeyStore.Provider.", "Provider keystore:"}, + {"KeyStore.Password.URL.", "URL password keystore:"}, + {"Principals", "Principal:"}, + {".Edit.Principal.", " Modifica principal:"}, + {".Add.New.Principal.", " Aggiungi nuovo principal:"}, + {"Permissions", "Autorizzazioni"}, + {".Edit.Permission.", " Modifica autorizzazione:"}, + {".Add.New.Permission.", " Aggiungi nuova autorizzazione:"}, + {"Signed.By.", "Firmato da:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "Impossibile specificare principal con una classe carattere jolly senza un nome carattere jolly"}, + {"Cannot.Specify.Principal.without.a.Name", + "Impossibile specificare principal senza un nome"}, + {"Permission.and.Target.Name.must.have.a.value", + "L'autorizzazione e il nome destinazione non possono essere nulli"}, + {"Remove.this.Policy.Entry.", "Rimuovere questa voce dei criteri?"}, + {"Overwrite.File", "Sovrascrivi file"}, + {"Policy.successfully.written.to.filename", + "I criteri sono stati scritti in {0}"}, + {"null.filename", "nome file nullo"}, + {"Save.changes.", "Salvare le modifiche?"}, + {"Yes", "S\u00EC"}, + {"No", "No"}, + {"Policy.Entry", "Voce dei criteri"}, + {"Save.Changes", "Salva le modifiche"}, + {"No.Policy.Entry.selected", "Nessuna voce dei criteri selezionata"}, + {"Unable.to.open.KeyStore.ex.toString.", + "Impossibile aprire il keystore: {0}"}, + {"No.principal.selected", "Nessun principal selezionato"}, + {"No.permission.selected", "Nessuna autorizzazione selezionata"}, + {"name", "nome"}, + {"configuration.type", "tipo di configurazione"}, + {"environment.variable.name", "nome variabile ambiente"}, + {"library.name", "nome libreria"}, + {"package.name", "nome package"}, + {"policy.type", "tipo di criteri"}, + {"property.name", "nome propriet\u00E0"}, + {"provider.name", "nome provider"}, + {"Principal.List", "Lista principal"}, + {"Permission.List", "Lista autorizzazioni"}, + {"Code.Base", "Codebase"}, + {"KeyStore.U.R.L.", "URL keystore:"}, + {"KeyStore.Password.U.R.L.", "URL password keystore:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_ja.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_ja.java new file mode 100644 index 00000000000..a3f901aa8f5 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_ja.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_ja extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "\u8B66\u544A: \u5225\u540D{0}\u306E\u516C\u958B\u9375\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u6B63\u3057\u304F\u69CB\u6210\u3055\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"Warning.Class.not.found.class", "\u8B66\u544A: \u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "\u8B66\u544A: \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u306E\u5F15\u6570\u304C\u7121\u52B9\u3067\u3059: {0}"}, + {"Illegal.Principal.Type.type", "\u4E0D\u6B63\u306A\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u30BF\u30A4\u30D7: {0}"}, + {"Illegal.option.option", "\u4E0D\u6B63\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0}"}, + {"Usage.policytool.options.", "\u4F7F\u7528\u65B9\u6CD5: policytool [options]"}, + {".file.file.policy.file.location", + " [-file ] \u30DD\u30EA\u30B7\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240"}, + {"New", "\u65B0\u898F"}, + {"Open", "\u958B\u304F"}, + {"Save", "\u4FDD\u5B58"}, + {"Save.As", "\u5225\u540D\u4FDD\u5B58"}, + {"View.Warning.Log", "\u8B66\u544A\u30ED\u30B0\u306E\u8868\u793A"}, + {"Exit", "\u7D42\u4E86"}, + {"Add.Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306E\u8FFD\u52A0"}, + {"Edit.Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306E\u7DE8\u96C6"}, + {"Remove.Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306E\u524A\u9664"}, + {"Edit", "\u7DE8\u96C6"}, + {"Retain", "\u4FDD\u6301"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "\u8B66\u544A: \u30D5\u30A1\u30A4\u30EB\u540D\u306B\u30A8\u30B9\u30B1\u30FC\u30D7\u3055\u308C\u305F\u30D0\u30C3\u30AF\u30B9\u30E9\u30C3\u30B7\u30E5\u6587\u5B57\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u30D0\u30C3\u30AF\u30B9\u30E9\u30C3\u30B7\u30E5\u6587\u5B57\u3092\u30A8\u30B9\u30B1\u30FC\u30D7\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093(\u30C4\u30FC\u30EB\u306F\u30DD\u30EA\u30B7\u30FC\u5185\u5BB9\u3092\u6C38\u7D9A\u30B9\u30C8\u30A2\u306B\u66F8\u304D\u8FBC\u3080\u3068\u304D\u306B\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u6587\u5B57\u3092\u30A8\u30B9\u30B1\u30FC\u30D7\u3057\u307E\u3059)\u3002\n\n\u5165\u529B\u6E08\u306E\u540D\u524D\u3092\u4FDD\u6301\u3059\u308B\u306B\u306F\u300C\u4FDD\u6301\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3001\u540D\u524D\u3092\u7DE8\u96C6\u3059\u308B\u306B\u306F\u300C\u7DE8\u96C6\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + + {"Add.Public.Key.Alias", "\u516C\u958B\u9375\u306E\u5225\u540D\u306E\u8FFD\u52A0"}, + {"Remove.Public.Key.Alias", "\u516C\u958B\u9375\u306E\u5225\u540D\u3092\u524A\u9664"}, + {"File", "\u30D5\u30A1\u30A4\u30EB"}, + {"KeyStore", "\u30AD\u30FC\u30B9\u30C8\u30A2"}, + {"Policy.File.", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "\u30DD\u30EA\u30B7\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F: {0}: {1}"}, + {"Policy.Tool", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30C4\u30FC\u30EB"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "\u30DD\u30EA\u30B7\u30FC\u69CB\u6210\u3092\u958B\u304F\u3068\u304D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u8A73\u7D30\u306F\u8B66\u544A\u30ED\u30B0\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, + {"Error", "\u30A8\u30E9\u30FC"}, + {"OK", "OK"}, + {"Status", "\u72B6\u614B"}, + {"Warning", "\u8B66\u544A"}, + {"Permission.", + "\u30A2\u30AF\u30BB\u30B9\u6A29: "}, + {"Principal.Type.", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u30BF\u30A4\u30D7:"}, + {"Principal.Name.", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u540D\u524D:"}, + {"Target.Name.", + "\u30BF\u30FC\u30B2\u30C3\u30C8\u540D: "}, + {"Actions.", + "\u30A2\u30AF\u30B7\u30E7\u30F3: "}, + {"OK.to.overwrite.existing.file.filename.", + "\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB{0}\u306B\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\u3002"}, + {"Cancel", "\u53D6\u6D88"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u8FFD\u52A0"}, + {"Edit.Principal", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u7DE8\u96C6"}, + {"Remove.Principal", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u524A\u9664"}, + {"Principals.", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB:"}, + {".Add.Permission", " \u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u8FFD\u52A0"}, + {".Edit.Permission", " \u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u7DE8\u96C6"}, + {"Remove.Permission", "\u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u524A\u9664"}, + {"Done", "\u5B8C\u4E86"}, + {"KeyStore.URL.", "\u30AD\u30FC\u30B9\u30C8\u30A2URL:"}, + {"KeyStore.Type.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7:"}, + {"KeyStore.Provider.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0:"}, + {"KeyStore.Password.URL.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D1\u30B9\u30EF\u30FC\u30C9URL:"}, + {"Principals", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB"}, + {".Edit.Principal.", " \u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u7DE8\u96C6:"}, + {".Add.New.Principal.", " \u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u65B0\u898F\u8FFD\u52A0:"}, + {"Permissions", "\u30A2\u30AF\u30BB\u30B9\u6A29"}, + {".Edit.Permission.", " \u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u7DE8\u96C6:"}, + {".Add.New.Permission.", " \u65B0\u898F\u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u8FFD\u52A0:"}, + {"Signed.By.", "\u7F72\u540D\u8005:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "\u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u540D\u306E\u306A\u3044\u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u30FB\u30AF\u30E9\u30B9\u3092\u4F7F\u7528\u3057\u3066\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093"}, + {"Cannot.Specify.Principal.without.a.Name", + "\u540D\u524D\u3092\u4F7F\u7528\u305B\u305A\u306B\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093"}, + {"Permission.and.Target.Name.must.have.a.value", + "\u30A2\u30AF\u30BB\u30B9\u6A29\u3068\u30BF\u30FC\u30B2\u30C3\u30C8\u540D\u306F\u3001\u5024\u3092\u4FDD\u6301\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, + {"Remove.this.Policy.Entry.", "\u3053\u306E\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059\u304B\u3002"}, + {"Overwrite.File", "\u30D5\u30A1\u30A4\u30EB\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059"}, + {"Policy.successfully.written.to.filename", + "\u30DD\u30EA\u30B7\u30FC\u306E{0}\u3078\u306E\u66F8\u8FBC\u307F\u306B\u6210\u529F\u3057\u307E\u3057\u305F"}, + {"null.filename", "\u30D5\u30A1\u30A4\u30EB\u540D\u304Cnull\u3067\u3059"}, + {"Save.changes.", "\u5909\u66F4\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\u3002"}, + {"Yes", "\u306F\u3044"}, + {"No", "\u3044\u3044\u3048"}, + {"Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA"}, + {"Save.Changes", "\u5909\u66F4\u3092\u4FDD\u5B58\u3057\u307E\u3059"}, + {"No.Policy.Entry.selected", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, + {"Unable.to.open.KeyStore.ex.toString.", + "\u30AD\u30FC\u30B9\u30C8\u30A2{0}\u3092\u958B\u3051\u307E\u305B\u3093"}, + {"No.principal.selected", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, + {"No.permission.selected", "\u30A2\u30AF\u30BB\u30B9\u6A29\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, + {"name", "\u540D\u524D"}, + {"configuration.type", "\u69CB\u6210\u30BF\u30A4\u30D7"}, + {"environment.variable.name", "\u74B0\u5883\u5909\u6570\u540D"}, + {"library.name", "\u30E9\u30A4\u30D6\u30E9\u30EA\u540D"}, + {"package.name", "\u30D1\u30C3\u30B1\u30FC\u30B8\u540D"}, + {"policy.type", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30BF\u30A4\u30D7"}, + {"property.name", "\u30D7\u30ED\u30D1\u30C6\u30A3\u540D"}, + {"provider.name", "\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"}, + {"Principal.List", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u30EA\u30B9\u30C8"}, + {"Permission.List", "\u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u30EA\u30B9\u30C8"}, + {"Code.Base", "\u30B3\u30FC\u30C9\u30FB\u30D9\u30FC\u30B9"}, + {"KeyStore.U.R.L.", "\u30AD\u30FC\u30B9\u30C8\u30A2U R L:"}, + {"KeyStore.Password.U.R.L.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D1\u30B9\u30EF\u30FC\u30C9U R L:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_ko.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_ko.java new file mode 100644 index 00000000000..7797ec803a0 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_ko.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_ko extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "\uACBD\uACE0: {0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uACF5\uC6A9 \uD0A4\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uD0A4 \uC800\uC7A5\uC18C\uAC00 \uC81C\uB300\uB85C \uAD6C\uC131\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uC2ED\uC2DC\uC624."}, + {"Warning.Class.not.found.class", "\uACBD\uACE0: \uD074\uB798\uC2A4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "\uACBD\uACE0: \uC0DD\uC131\uC790\uC5D0 \uB300\uD574 \uBD80\uC801\uD569\uD55C \uC778\uC218: {0}"}, + {"Illegal.Principal.Type.type", "\uC798\uBABB\uB41C \uC8FC\uCCB4 \uC720\uD615: {0}"}, + {"Illegal.option.option", "\uC798\uBABB\uB41C \uC635\uC158: {0}"}, + {"Usage.policytool.options.", "\uC0AC\uC6A9\uBC95: policytool [options]"}, + {".file.file.policy.file.location", + " [-file ] \uC815\uCC45 \uD30C\uC77C \uC704\uCE58"}, + {"New", "\uC0C8\uB85C \uB9CC\uB4E4\uAE30"}, + {"Open", "\uC5F4\uAE30"}, + {"Save", "\uC800\uC7A5"}, + {"Save.As", "\uB2E4\uB978 \uC774\uB984\uC73C\uB85C \uC800\uC7A5"}, + {"View.Warning.Log", "\uACBD\uACE0 \uB85C\uADF8 \uBCF4\uAE30"}, + {"Exit", "\uC885\uB8CC"}, + {"Add.Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9 \uCD94\uAC00"}, + {"Edit.Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9 \uD3B8\uC9D1"}, + {"Remove.Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9 \uC81C\uAC70"}, + {"Edit", "\uD3B8\uC9D1"}, + {"Retain", "\uC720\uC9C0"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "\uACBD\uACE0: \uD30C\uC77C \uC774\uB984\uC5D0 \uC774\uC2A4\uCF00\uC774\uD504\uB41C \uBC31\uC2AC\uB798\uC2DC \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5C8\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBC31\uC2AC\uB798\uC2DC \uBB38\uC790\uB294 \uC774\uC2A4\uCF00\uC774\uD504\uD560 \uD544\uC694\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC601\uAD6C \uC800\uC7A5\uC18C\uC5D0 \uC815\uCC45 \uCF58\uD150\uCE20\uB97C \uC4F8 \uB54C \uD544\uC694\uC5D0 \uB530\uB77C \uC790\uB3D9\uC73C\uB85C \uBB38\uC790\uAC00 \uC774\uC2A4\uCF00\uC774\uD504\uB429\uB2C8\uB2E4.\n\n\uC785\uB825\uB41C \uC774\uB984\uC744 \uADF8\uB300\uB85C \uC720\uC9C0\uD558\uB824\uBA74 [\uC720\uC9C0]\uB97C \uB204\uB974\uACE0, \uC774\uB984\uC744 \uD3B8\uC9D1\uD558\uB824\uBA74 [\uD3B8\uC9D1]\uC744 \uB204\uB974\uC2ED\uC2DC\uC624."}, + + {"Add.Public.Key.Alias", "\uACF5\uC6A9 \uD0A4 \uBCC4\uCE6D \uCD94\uAC00"}, + {"Remove.Public.Key.Alias", "\uACF5\uC6A9 \uD0A4 \uBCC4\uCE6D \uC81C\uAC70"}, + {"File", "\uD30C\uC77C"}, + {"KeyStore", "\uD0A4 \uC800\uC7A5\uC18C"}, + {"Policy.File.", "\uC815\uCC45 \uD30C\uC77C:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "\uC815\uCC45 \uD30C\uC77C\uC744 \uC5F4 \uC218 \uC5C6\uC74C: {0}: {1}"}, + {"Policy.Tool", "\uC815\uCC45 \uD234"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "\uC815\uCC45 \uAD6C\uC131\uC744 \uC5EC\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uACBD\uACE0 \uB85C\uADF8\uB97C \uD655\uC778\uD558\uC2ED\uC2DC\uC624."}, + {"Error", "\uC624\uB958"}, + {"OK", "\uD655\uC778"}, + {"Status", "\uC0C1\uD0DC"}, + {"Warning", "\uACBD\uACE0"}, + {"Permission.", + "\uAD8C\uD55C: "}, + {"Principal.Type.", "\uC8FC\uCCB4 \uC720\uD615:"}, + {"Principal.Name.", "\uC8FC\uCCB4 \uC774\uB984:"}, + {"Target.Name.", + "\uB300\uC0C1 \uC774\uB984: "}, + {"Actions.", + "\uC791\uC5C5: "}, + {"OK.to.overwrite.existing.file.filename.", + "\uAE30\uC874 \uD30C\uC77C {0}\uC744(\uB97C) \uACB9\uCCD0 \uC4F0\uACA0\uC2B5\uB2C8\uAE4C?"}, + {"Cancel", "\uCDE8\uC18C"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "\uC8FC\uCCB4 \uCD94\uAC00"}, + {"Edit.Principal", "\uC8FC\uCCB4 \uD3B8\uC9D1"}, + {"Remove.Principal", "\uC8FC\uCCB4 \uC81C\uAC70"}, + {"Principals.", "\uC8FC\uCCB4:"}, + {".Add.Permission", " \uAD8C\uD55C \uCD94\uAC00"}, + {".Edit.Permission", " \uAD8C\uD55C \uD3B8\uC9D1"}, + {"Remove.Permission", "\uAD8C\uD55C \uC81C\uAC70"}, + {"Done", "\uC644\uB8CC"}, + {"KeyStore.URL.", "\uD0A4 \uC800\uC7A5\uC18C URL:"}, + {"KeyStore.Type.", "\uD0A4 \uC800\uC7A5\uC18C \uC720\uD615:"}, + {"KeyStore.Provider.", "\uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790:"}, + {"KeyStore.Password.URL.", "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 URL:"}, + {"Principals", "\uC8FC\uCCB4"}, + {".Edit.Principal.", " \uC8FC\uCCB4 \uD3B8\uC9D1:"}, + {".Add.New.Principal.", " \uC0C8 \uC8FC\uCCB4 \uCD94\uAC00:"}, + {"Permissions", "\uAD8C\uD55C"}, + {".Edit.Permission.", " \uAD8C\uD55C \uD3B8\uC9D1:"}, + {".Add.New.Permission.", " \uC0C8 \uAD8C\uD55C \uCD94\uAC00:"}, + {"Signed.By.", "\uC11C\uBA85\uC790:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "\uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790 \uC774\uB984 \uC5C6\uC774 \uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790 \uD074\uB798\uC2A4\uB97C \uC0AC\uC6A9\uD558\uB294 \uC8FC\uCCB4\uB97C \uC9C0\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Cannot.Specify.Principal.without.a.Name", + "\uC774\uB984 \uC5C6\uC774 \uC8FC\uCCB4\uB97C \uC9C0\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Permission.and.Target.Name.must.have.a.value", + "\uAD8C\uD55C\uACFC \uB300\uC0C1 \uC774\uB984\uC758 \uAC12\uC774 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, + {"Remove.this.Policy.Entry.", "\uC774 \uC815\uCC45 \uD56D\uBAA9\uC744 \uC81C\uAC70\uD558\uACA0\uC2B5\uB2C8\uAE4C?"}, + {"Overwrite.File", "\uD30C\uC77C \uACB9\uCCD0\uC4F0\uAE30"}, + {"Policy.successfully.written.to.filename", + "{0}\uC5D0 \uC131\uACF5\uC801\uC73C\uB85C \uC815\uCC45\uC744 \uC37C\uC2B5\uB2C8\uB2E4."}, + {"null.filename", "\uB110 \uD30C\uC77C \uC774\uB984"}, + {"Save.changes.", "\uBCC0\uACBD \uC0AC\uD56D\uC744 \uC800\uC7A5\uD558\uACA0\uC2B5\uB2C8\uAE4C?"}, + {"Yes", "\uC608"}, + {"No", "\uC544\uB2C8\uC624"}, + {"Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9"}, + {"Save.Changes", "\uBCC0\uACBD \uC0AC\uD56D \uC800\uC7A5"}, + {"No.Policy.Entry.selected", "\uC120\uD0DD\uB41C \uC815\uCC45 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"Unable.to.open.KeyStore.ex.toString.", + "\uD0A4 \uC800\uC7A5\uC18C\uB97C \uC5F4 \uC218 \uC5C6\uC74C: {0}"}, + {"No.principal.selected", "\uC120\uD0DD\uB41C \uC8FC\uCCB4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"No.permission.selected", "\uC120\uD0DD\uB41C \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."}, + {"name", "\uC774\uB984"}, + {"configuration.type", "\uAD6C\uC131 \uC720\uD615"}, + {"environment.variable.name", "\uD658\uACBD \uBCC0\uC218 \uC774\uB984"}, + {"library.name", "\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC774\uB984"}, + {"package.name", "\uD328\uD0A4\uC9C0 \uC774\uB984"}, + {"policy.type", "\uC815\uCC45 \uC720\uD615"}, + {"property.name", "\uC18D\uC131 \uC774\uB984"}, + {"provider.name", "\uC81C\uACF5\uC790 \uC774\uB984"}, + {"Principal.List", "\uC8FC\uCCB4 \uBAA9\uB85D"}, + {"Permission.List", "\uAD8C\uD55C \uBAA9\uB85D"}, + {"Code.Base", "\uCF54\uB4DC \uBCA0\uC774\uC2A4"}, + {"KeyStore.U.R.L.", "\uD0A4 \uC800\uC7A5\uC18C URL:"}, + {"KeyStore.Password.U.R.L.", "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 URL:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_pt_BR.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_pt_BR.java new file mode 100644 index 00000000000..9bd9808d0b5 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_pt_BR.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_pt_BR extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "Advert\u00EAncia: N\u00E3o existe uma chave p\u00FAblica para o alias {0}. Certifique-se de que um KeyStore esteja configurado adequadamente."}, + {"Warning.Class.not.found.class", "Advert\u00EAncia: Classe n\u00E3o encontrada: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "Advert\u00EAncia: Argumento(s) inv\u00E1lido(s) para o construtor: {0}"}, + {"Illegal.Principal.Type.type", "Tipo Principal Inv\u00E1lido: {0}"}, + {"Illegal.option.option", "Op\u00E7\u00E3o inv\u00E1lida: {0}"}, + {"Usage.policytool.options.", "Uso: policytool [op\u00E7\u00F5es]"}, + {".file.file.policy.file.location", + " [-file ] localiza\u00E7\u00E3o do arquivo de pol\u00EDtica"}, + {"New", "Novo"}, + {"Open", "Abrir"}, + {"Save", "Salvar"}, + {"Save.As", "Salvar Como"}, + {"View.Warning.Log", "Exibir Log de Advert\u00EAncias"}, + {"Exit", "Sair"}, + {"Add.Policy.Entry", "Adicionar Entrada de Pol\u00EDtica"}, + {"Edit.Policy.Entry", "Editar Entrada de Pol\u00EDtica"}, + {"Remove.Policy.Entry", "Remover Entrada de Pol\u00EDtica"}, + {"Edit", "Editar"}, + {"Retain", "Reter"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "Advert\u00EAncia: O nome do arquivo pode conter caracteres de escape barra invertida. N\u00E3o \u00E9 necess\u00E1rio fazer o escape dos caracteres de barra invertida (a ferramenta faz o escape dos caracteres conforme necess\u00E1rio ao gravar o conte\u00FAdo da pol\u00EDtica no armazenamento persistente).\n\nClique em Reter para reter o nome da entrada ou clique em Editar para edit\u00E1-lo."}, + + {"Add.Public.Key.Alias", "Adicionar Alias de Chave P\u00FAblica"}, + {"Remove.Public.Key.Alias", "Remover Alias de Chave P\u00FAblica"}, + {"File", "Arquivo"}, + {"KeyStore", "KeyStore"}, + {"Policy.File.", "Arquivo de Pol\u00EDtica:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "N\u00E3o foi poss\u00EDvel abrir o arquivo de pol\u00EDtica: {0}: {1}"}, + {"Policy.Tool", "Ferramenta de Pol\u00EDtica"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "Erros durante a abertura da configura\u00E7\u00E3o da pol\u00EDtica. Consulte o Log de Advert\u00EAncias para obter mais informa\u00E7\u00F5es."}, + {"Error", "Erro"}, + {"OK", "OK"}, + {"Status", "Status"}, + {"Warning", "Advert\u00EAncia"}, + {"Permission.", + "Permiss\u00E3o: "}, + {"Principal.Type.", "Tipo do Principal:"}, + {"Principal.Name.", "Nome do Principal:"}, + {"Target.Name.", + "Nome do Alvo: "}, + {"Actions.", + "A\u00E7\u00F5es: "}, + {"OK.to.overwrite.existing.file.filename.", + "Est\u00E1 correto substituir o arquivo existente {0}?"}, + {"Cancel", "Cancelar"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "Adicionar Principal"}, + {"Edit.Principal", "Editar Principal"}, + {"Remove.Principal", "Remover Principal"}, + {"Principals.", "Principais:"}, + {".Add.Permission", " Adicionar Permiss\u00E3o"}, + {".Edit.Permission", " Editar Permiss\u00E3o"}, + {"Remove.Permission", "Remover Permiss\u00E3o"}, + {"Done", "Conclu\u00EDdo"}, + {"KeyStore.URL.", "URL do KeyStore:"}, + {"KeyStore.Type.", "Tipo de KeyStore:"}, + {"KeyStore.Provider.", "Fornecedor de KeyStore:"}, + {"KeyStore.Password.URL.", "URL da Senha do KeyStore:"}, + {"Principals", "Principais"}, + {".Edit.Principal.", " Editar Principal:"}, + {".Add.New.Principal.", " Adicionar Novo Principal:"}, + {"Permissions", "Permiss\u00F5es"}, + {".Edit.Permission.", " Editar Permiss\u00E3o:"}, + {".Add.New.Permission.", " Adicionar Nova Permiss\u00E3o:"}, + {"Signed.By.", "Assinado por:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "N\u00E3o \u00E9 Poss\u00EDvel Especificar um Principal com uma Classe de Curinga sem um Nome de Curinga"}, + {"Cannot.Specify.Principal.without.a.Name", + "N\u00E3o \u00E9 Poss\u00EDvel Especificar um Principal sem um Nome"}, + {"Permission.and.Target.Name.must.have.a.value", + "O Nome de Destino e a Permiss\u00E3o devem ter um Valor"}, + {"Remove.this.Policy.Entry.", "Remover esta Entrada de Pol\u00EDtica?"}, + {"Overwrite.File", "Substituir Arquivo"}, + {"Policy.successfully.written.to.filename", + "Pol\u00EDtica gravada com \u00EAxito em {0}"}, + {"null.filename", "nome de arquivo nulo"}, + {"Save.changes.", "Salvar altera\u00E7\u00F5es?"}, + {"Yes", "Sim"}, + {"No", "N\u00E3o"}, + {"Policy.Entry", "Entrada de Pol\u00EDtica"}, + {"Save.Changes", "Salvar Altera\u00E7\u00F5es"}, + {"No.Policy.Entry.selected", "Nenhuma Entrada de Pol\u00EDtica Selecionada"}, + {"Unable.to.open.KeyStore.ex.toString.", + "N\u00E3o \u00E9 poss\u00EDvel abrir a KeyStore: {0}"}, + {"No.principal.selected", "Nenhum principal selecionado"}, + {"No.permission.selected", "Nenhuma permiss\u00E3o selecionada"}, + {"name", "nome"}, + {"configuration.type", "tipo de configura\u00E7\u00E3o"}, + {"environment.variable.name", "nome da vari\u00E1vel de ambiente"}, + {"library.name", "nome da biblioteca"}, + {"package.name", "nome do pacote"}, + {"policy.type", "tipo de pol\u00EDtica"}, + {"property.name", "nome da propriedade"}, + {"provider.name", "nome do fornecedor"}, + {"Principal.List", "Lista de Principais"}, + {"Permission.List", "Lista de Permiss\u00F5es"}, + {"Code.Base", "Base de C\u00F3digo"}, + {"KeyStore.U.R.L.", "U R L da KeyStore:"}, + {"KeyStore.Password.U.R.L.", "U R L da Senha do KeyStore:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_sv.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_sv.java new file mode 100644 index 00000000000..f0bf734ae40 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_sv.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_sv extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "Varning! Det finns ingen offentlig nyckel f\u00F6r aliaset {0}. Kontrollera att det aktuella nyckellagret \u00E4r korrekt konfigurerat."}, + {"Warning.Class.not.found.class", "Varning! Klassen hittades inte: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "Varning! Ogiltiga argument f\u00F6r konstruktor: {0}"}, + {"Illegal.Principal.Type.type", "Otill\u00E5ten identitetshavaretyp: {0}"}, + {"Illegal.option.option", "Otill\u00E5tet alternativ: {0}"}, + {"Usage.policytool.options.", "Syntax: policytool [alternativ]"}, + {".file.file.policy.file.location", + " [-file ] policyfilens plats"}, + {"New", "Nytt"}, + {"Open", "\u00D6ppna"}, + {"Save", "Spara"}, + {"Save.As", "Spara som"}, + {"View.Warning.Log", "Visa varningslogg"}, + {"Exit", "Avsluta"}, + {"Add.Policy.Entry", "L\u00E4gg till policypost"}, + {"Edit.Policy.Entry", "Redigera policypost"}, + {"Remove.Policy.Entry", "Ta bort policypost"}, + {"Edit", "Redigera"}, + {"Retain", "Beh\u00E5ll"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "Varning! Filnamnet kan inneh\u00E5lla omv\u00E4nda snedstreck inom citattecken. Citattecken kr\u00E4vs inte f\u00F6r omv\u00E4nda snedstreck (verktyget hanterar detta n\u00E4r policyinneh\u00E5llet skrivs till det best\u00E4ndiga lagret).\n\nKlicka p\u00E5 Beh\u00E5ll f\u00F6r att beh\u00E5lla det angivna namnet, eller klicka p\u00E5 Redigera f\u00F6r att \u00E4ndra det."}, + + {"Add.Public.Key.Alias", "L\u00E4gg till offentligt nyckelalias"}, + {"Remove.Public.Key.Alias", "Ta bort offentligt nyckelalias"}, + {"File", "Fil"}, + {"KeyStore", "Nyckellager"}, + {"Policy.File.", "Policyfil:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "Kan inte \u00F6ppna policyfilen: {0}: {1}"}, + {"Policy.Tool", "Policyverktyg"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "Det uppstod ett fel n\u00E4r policykonfigurationen skulle \u00F6ppnas. Se varningsloggen f\u00F6r mer information."}, + {"Error", "Fel"}, + {"OK", "OK"}, + {"Status", "Status"}, + {"Warning", "Varning"}, + {"Permission.", + "Beh\u00F6righet: "}, + {"Principal.Type.", "Identitetshavaretyp:"}, + {"Principal.Name.", "Identitetshavare:"}, + {"Target.Name.", + "M\u00E5l: "}, + {"Actions.", + "Funktioner: "}, + {"OK.to.overwrite.existing.file.filename.", + "Ska den befintliga filen {0} skrivas \u00F6ver?"}, + {"Cancel", "Avbryt"}, + {"CodeBase.", "Kodbas:"}, + {"SignedBy.", "Signerad av:"}, + {"Add.Principal", "L\u00E4gg till identitetshavare"}, + {"Edit.Principal", "Redigera identitetshavare"}, + {"Remove.Principal", "Ta bort identitetshavare"}, + {"Principals.", "Identitetshavare:"}, + {".Add.Permission", " L\u00E4gg till beh\u00F6righet"}, + {".Edit.Permission", " Redigera beh\u00F6righet"}, + {"Remove.Permission", "Ta bort beh\u00F6righet"}, + {"Done", "Utf\u00F6rd"}, + {"KeyStore.URL.", "URL f\u00F6r nyckellager:"}, + {"KeyStore.Type.", "Nyckellagertyp:"}, + {"KeyStore.Provider.", "Nyckellagerleverant\u00F6r:"}, + {"KeyStore.Password.URL.", "URL f\u00F6r l\u00F6senord till nyckellager:"}, + {"Principals", "Identitetshavare"}, + {".Edit.Principal.", " Redigera identitetshavare:"}, + {".Add.New.Principal.", " L\u00E4gg till ny identitetshavare:"}, + {"Permissions", "Beh\u00F6righet"}, + {".Edit.Permission.", " Redigera beh\u00F6righet:"}, + {".Add.New.Permission.", " L\u00E4gg till ny beh\u00F6righet:"}, + {"Signed.By.", "Signerad av:"}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "Kan inte specificera identitetshavare med jokerteckenklass utan jokerteckennamn"}, + {"Cannot.Specify.Principal.without.a.Name", + "Kan inte specificera identitetshavare utan namn"}, + {"Permission.and.Target.Name.must.have.a.value", + "Beh\u00F6righet och m\u00E5lnamn m\u00E5ste ha ett v\u00E4rde"}, + {"Remove.this.Policy.Entry.", "Vill du ta bort den h\u00E4r policyposten?"}, + {"Overwrite.File", "Skriv \u00F6ver fil"}, + {"Policy.successfully.written.to.filename", + "Policy har skrivits till {0}"}, + {"null.filename", "nullfilnamn"}, + {"Save.changes.", "Vill du spara \u00E4ndringarna?"}, + {"Yes", "Ja"}, + {"No", "Nej"}, + {"Policy.Entry", "Policyfel"}, + {"Save.Changes", "Spara \u00E4ndringar"}, + {"No.Policy.Entry.selected", "Ingen policypost har valts"}, + {"Unable.to.open.KeyStore.ex.toString.", + "Kan inte \u00F6ppna nyckellagret: {0}"}, + {"No.principal.selected", "Ingen identitetshavare har valts"}, + {"No.permission.selected", "Ingen beh\u00F6righet har valts"}, + {"name", "namn"}, + {"configuration.type", "konfigurationstyp"}, + {"environment.variable.name", "variabelnamn f\u00F6r milj\u00F6"}, + {"library.name", "biblioteksnamn"}, + {"package.name", "paketnamn"}, + {"policy.type", "policytyp"}, + {"property.name", "egenskapsnamn"}, + {"provider.name", "leverant\u00F6rsnamn"}, + {"Principal.List", "Lista \u00F6ver identitetshavare"}, + {"Permission.List", "Beh\u00F6righetslista"}, + {"Code.Base", "Kodbas"}, + {"KeyStore.U.R.L.", "URL f\u00F6r nyckellager:"}, + {"KeyStore.Password.U.R.L.", "URL f\u00F6r l\u00F6senord till nyckellager:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_CN.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_CN.java new file mode 100644 index 00000000000..fcf8e126d4c --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_CN.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_zh_CN extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "\u8B66\u544A: \u522B\u540D {0} \u7684\u516C\u5171\u5BC6\u94A5\u4E0D\u5B58\u5728\u3002\u8BF7\u786E\u4FDD\u5DF2\u6B63\u786E\u914D\u7F6E KeyStore\u3002"}, + {"Warning.Class.not.found.class", "\u8B66\u544A: \u627E\u4E0D\u5230\u7C7B: {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "\u8B66\u544A: \u6784\u9020\u5668\u7684\u53C2\u6570\u65E0\u6548: {0}"}, + {"Illegal.Principal.Type.type", "\u975E\u6CD5\u7684\u4E3B\u7528\u6237\u7C7B\u578B: {0}"}, + {"Illegal.option.option", "\u975E\u6CD5\u9009\u9879: {0}"}, + {"Usage.policytool.options.", "\u7528\u6CD5: policytool [\u9009\u9879]"}, + {".file.file.policy.file.location", + " [-file ] \u7B56\u7565\u6587\u4EF6\u4F4D\u7F6E"}, + {"New", "\u65B0\u5EFA"}, + {"Open", "\u6253\u5F00"}, + {"Save", "\u4FDD\u5B58"}, + {"Save.As", "\u53E6\u5B58\u4E3A"}, + {"View.Warning.Log", "\u67E5\u770B\u8B66\u544A\u65E5\u5FD7"}, + {"Exit", "\u9000\u51FA"}, + {"Add.Policy.Entry", "\u6DFB\u52A0\u7B56\u7565\u6761\u76EE"}, + {"Edit.Policy.Entry", "\u7F16\u8F91\u7B56\u7565\u6761\u76EE"}, + {"Remove.Policy.Entry", "\u5220\u9664\u7B56\u7565\u6761\u76EE"}, + {"Edit", "\u7F16\u8F91"}, + {"Retain", "\u4FDD\u7559"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "\u8B66\u544A: \u6587\u4EF6\u540D\u5305\u542B\u8F6C\u4E49\u7684\u53CD\u659C\u6760\u5B57\u7B26\u3002\u4E0D\u9700\u8981\u5BF9\u53CD\u659C\u6760\u5B57\u7B26\u8FDB\u884C\u8F6C\u4E49 (\u8BE5\u5DE5\u5177\u5728\u5C06\u7B56\u7565\u5185\u5BB9\u5199\u5165\u6C38\u4E45\u5B58\u50A8\u65F6\u4F1A\u6839\u636E\u9700\u8981\u5BF9\u5B57\u7B26\u8FDB\u884C\u8F6C\u4E49)\u3002\n\n\u5355\u51FB\u201C\u4FDD\u7559\u201D\u53EF\u4FDD\u7559\u8F93\u5165\u7684\u540D\u79F0, \u6216\u8005\u5355\u51FB\u201C\u7F16\u8F91\u201D\u53EF\u7F16\u8F91\u8BE5\u540D\u79F0\u3002"}, + + {"Add.Public.Key.Alias", "\u6DFB\u52A0\u516C\u5171\u5BC6\u94A5\u522B\u540D"}, + {"Remove.Public.Key.Alias", "\u5220\u9664\u516C\u5171\u5BC6\u94A5\u522B\u540D"}, + {"File", "\u6587\u4EF6"}, + {"KeyStore", "KeyStore"}, + {"Policy.File.", "\u7B56\u7565\u6587\u4EF6:"}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "\u65E0\u6CD5\u6253\u5F00\u7B56\u7565\u6587\u4EF6: {0}: {1}"}, + {"Policy.Tool", "\u7B56\u7565\u5DE5\u5177"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "\u6253\u5F00\u7B56\u7565\u914D\u7F6E\u65F6\u51FA\u9519\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u67E5\u770B\u8B66\u544A\u65E5\u5FD7\u3002"}, + {"Error", "\u9519\u8BEF"}, + {"OK", "\u786E\u5B9A"}, + {"Status", "\u72B6\u6001"}, + {"Warning", "\u8B66\u544A"}, + {"Permission.", + "\u6743\u9650: "}, + {"Principal.Type.", "\u4E3B\u7528\u6237\u7C7B\u578B:"}, + {"Principal.Name.", "\u4E3B\u7528\u6237\u540D\u79F0:"}, + {"Target.Name.", + "\u76EE\u6807\u540D\u79F0: "}, + {"Actions.", + "\u64CD\u4F5C: "}, + {"OK.to.overwrite.existing.file.filename.", + "\u786E\u8BA4\u8986\u76D6\u73B0\u6709\u7684\u6587\u4EF6{0}?"}, + {"Cancel", "\u53D6\u6D88"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "\u6DFB\u52A0\u4E3B\u7528\u6237"}, + {"Edit.Principal", "\u7F16\u8F91\u4E3B\u7528\u6237"}, + {"Remove.Principal", "\u5220\u9664\u4E3B\u7528\u6237"}, + {"Principals.", "\u4E3B\u7528\u6237:"}, + {".Add.Permission", " \u6DFB\u52A0\u6743\u9650"}, + {".Edit.Permission", " \u7F16\u8F91\u6743\u9650"}, + {"Remove.Permission", "\u5220\u9664\u6743\u9650"}, + {"Done", "\u5B8C\u6210"}, + {"KeyStore.URL.", "KeyStore URL:"}, + {"KeyStore.Type.", "KeyStore \u7C7B\u578B:"}, + {"KeyStore.Provider.", "KeyStore \u63D0\u4F9B\u65B9:"}, + {"KeyStore.Password.URL.", "KeyStore \u53E3\u4EE4 URL:"}, + {"Principals", "\u4E3B\u7528\u6237"}, + {".Edit.Principal.", " \u7F16\u8F91\u4E3B\u7528\u6237:"}, + {".Add.New.Principal.", " \u6DFB\u52A0\u65B0\u4E3B\u7528\u6237:"}, + {"Permissions", "\u6743\u9650"}, + {".Edit.Permission.", " \u7F16\u8F91\u6743\u9650:"}, + {".Add.New.Permission.", " \u52A0\u5165\u65B0\u7684\u6743\u9650:"}, + {"Signed.By.", "\u7B7E\u7F72\u4EBA: "}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "\u6CA1\u6709\u901A\u914D\u7B26\u540D\u79F0, \u65E0\u6CD5\u4F7F\u7528\u901A\u914D\u7B26\u7C7B\u6307\u5B9A\u4E3B\u7528\u6237"}, + {"Cannot.Specify.Principal.without.a.Name", + "\u6CA1\u6709\u540D\u79F0, \u65E0\u6CD5\u6307\u5B9A\u4E3B\u7528\u6237"}, + {"Permission.and.Target.Name.must.have.a.value", + "\u6743\u9650\u53CA\u76EE\u6807\u540D\u5FC5\u987B\u6709\u4E00\u4E2A\u503C"}, + {"Remove.this.Policy.Entry.", "\u662F\u5426\u5220\u9664\u6B64\u7B56\u7565\u6761\u76EE?"}, + {"Overwrite.File", "\u8986\u76D6\u6587\u4EF6"}, + {"Policy.successfully.written.to.filename", + "\u7B56\u7565\u5DF2\u6210\u529F\u5199\u5165\u5230{0}"}, + {"null.filename", "\u7A7A\u6587\u4EF6\u540D"}, + {"Save.changes.", "\u662F\u5426\u4FDD\u5B58\u6240\u505A\u7684\u66F4\u6539?"}, + {"Yes", "\u662F"}, + {"No", "\u5426"}, + {"Policy.Entry", "\u7B56\u7565\u6761\u76EE"}, + {"Save.Changes", "\u4FDD\u5B58\u66F4\u6539"}, + {"No.Policy.Entry.selected", "\u6CA1\u6709\u9009\u62E9\u7B56\u7565\u6761\u76EE"}, + {"Unable.to.open.KeyStore.ex.toString.", + "\u65E0\u6CD5\u6253\u5F00 KeyStore: {0}"}, + {"No.principal.selected", "\u672A\u9009\u62E9\u4E3B\u7528\u6237"}, + {"No.permission.selected", "\u6CA1\u6709\u9009\u62E9\u6743\u9650"}, + {"name", "\u540D\u79F0"}, + {"configuration.type", "\u914D\u7F6E\u7C7B\u578B"}, + {"environment.variable.name", "\u73AF\u5883\u53D8\u91CF\u540D"}, + {"library.name", "\u5E93\u540D\u79F0"}, + {"package.name", "\u7A0B\u5E8F\u5305\u540D\u79F0"}, + {"policy.type", "\u7B56\u7565\u7C7B\u578B"}, + {"property.name", "\u5C5E\u6027\u540D\u79F0"}, + {"provider.name", "\u63D0\u4F9B\u65B9\u540D\u79F0"}, + {"Principal.List", "\u4E3B\u7528\u6237\u5217\u8868"}, + {"Permission.List", "\u6743\u9650\u5217\u8868"}, + {"Code.Base", "\u4EE3\u7801\u5E93"}, + {"KeyStore.U.R.L.", "KeyStore URL:"}, + {"KeyStore.Password.U.R.L.", "KeyStore \u53E3\u4EE4 URL:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_HK.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_HK.java new file mode 100644 index 00000000000..a67441a4e9d --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_HK.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_zh_HK extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "\u8B66\u544A: \u5225\u540D {0} \u7684\u516C\u958B\u91D1\u9470\u4E0D\u5B58\u5728\u3002\u8ACB\u78BA\u5B9A\u91D1\u9470\u5132\u5B58\u5EAB\u914D\u7F6E\u6B63\u78BA\u3002"}, + {"Warning.Class.not.found.class", "\u8B66\u544A: \u627E\u4E0D\u5230\u985E\u5225 {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "\u8B66\u544A: \u7121\u6548\u7684\u5EFA\u69CB\u5B50\u5F15\u6578: {0}"}, + {"Illegal.Principal.Type.type", "\u7121\u6548\u7684 Principal \u985E\u578B: {0}"}, + {"Illegal.option.option", "\u7121\u6548\u7684\u9078\u9805: {0}"}, + {"Usage.policytool.options.", "\u7528\u6CD5: policytool [options]"}, + {".file.file.policy.file.location", + " [-file ] \u539F\u5247\u6A94\u6848\u4F4D\u7F6E"}, + {"New", "\u65B0\u589E"}, + {"Open", "\u958B\u555F"}, + {"Save", "\u5132\u5B58"}, + {"Save.As", "\u53E6\u5B58\u65B0\u6A94"}, + {"View.Warning.Log", "\u6AA2\u8996\u8B66\u544A\u8A18\u9304"}, + {"Exit", "\u7D50\u675F"}, + {"Add.Policy.Entry", "\u65B0\u589E\u539F\u5247\u9805\u76EE"}, + {"Edit.Policy.Entry", "\u7DE8\u8F2F\u539F\u5247\u9805\u76EE"}, + {"Remove.Policy.Entry", "\u79FB\u9664\u539F\u5247\u9805\u76EE"}, + {"Edit", "\u7DE8\u8F2F"}, + {"Retain", "\u4FDD\u7559"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "\u8B66\u544A: \u6A94\u6848\u540D\u7A31\u5305\u542B\u9041\u96E2\u53CD\u659C\u7DDA\u5B57\u5143\u3002\u4E0D\u9700\u8981\u9041\u96E2\u53CD\u659C\u7DDA\u5B57\u5143 (\u64B0\u5BEB\u539F\u5247\u5167\u5BB9\u81F3\u6C38\u4E45\u5B58\u653E\u5340\u6642\u9700\u8981\u5DE5\u5177\u9041\u96E2\u5B57\u5143)\u3002\n\n\u6309\u4E00\u4E0B\u300C\u4FDD\u7559\u300D\u4EE5\u4FDD\u7559\u8F38\u5165\u7684\u540D\u7A31\uFF0C\u6216\u6309\u4E00\u4E0B\u300C\u7DE8\u8F2F\u300D\u4EE5\u7DE8\u8F2F\u540D\u7A31\u3002"}, + + {"Add.Public.Key.Alias", "\u65B0\u589E\u516C\u958B\u91D1\u9470\u5225\u540D"}, + {"Remove.Public.Key.Alias", "\u79FB\u9664\u516C\u958B\u91D1\u9470\u5225\u540D"}, + {"File", "\u6A94\u6848"}, + {"KeyStore", "\u91D1\u9470\u5132\u5B58\u5EAB"}, + {"Policy.File.", "\u539F\u5247\u6A94\u6848: "}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "\u7121\u6CD5\u958B\u555F\u539F\u5247\u6A94\u6848: {0}: {1}"}, + {"Policy.Tool", "\u539F\u5247\u5DE5\u5177"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "\u958B\u555F\u539F\u5247\u8A18\u7F6E\u6642\u767C\u751F\u932F\u8AA4\u3002\u8ACB\u6AA2\u8996\u8B66\u544A\u8A18\u9304\u4EE5\u53D6\u5F97\u66F4\u591A\u7684\u8CC7\u8A0A"}, + {"Error", "\u932F\u8AA4"}, + {"OK", "\u78BA\u5B9A"}, + {"Status", "\u72C0\u614B"}, + {"Warning", "\u8B66\u544A"}, + {"Permission.", + "\u6B0A\u9650: "}, + {"Principal.Type.", "Principal \u985E\u578B: "}, + {"Principal.Name.", "Principal \u540D\u7A31: "}, + {"Target.Name.", + "\u76EE\u6A19\u540D\u7A31: "}, + {"Actions.", + "\u52D5\u4F5C: "}, + {"OK.to.overwrite.existing.file.filename.", + "\u78BA\u8A8D\u8986\u5BEB\u73FE\u5B58\u7684\u6A94\u6848 {0}\uFF1F"}, + {"Cancel", "\u53D6\u6D88"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "\u65B0\u589E Principal"}, + {"Edit.Principal", "\u7DE8\u8F2F Principal"}, + {"Remove.Principal", "\u79FB\u9664 Principal"}, + {"Principals.", "Principal:"}, + {".Add.Permission", " \u65B0\u589E\u6B0A\u9650"}, + {".Edit.Permission", " \u7DE8\u8F2F\u6B0A\u9650"}, + {"Remove.Permission", "\u79FB\u9664\u6B0A\u9650"}, + {"Done", "\u5B8C\u6210"}, + {"KeyStore.URL.", "\u91D1\u9470\u5132\u5B58\u5EAB URL: "}, + {"KeyStore.Type.", "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B:"}, + {"KeyStore.Provider.", "\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005:"}, + {"KeyStore.Password.URL.", "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC URL: "}, + {"Principals", "Principal"}, + {".Edit.Principal.", " \u7DE8\u8F2F Principal: "}, + {".Add.New.Principal.", " \u65B0\u589E Principal: "}, + {"Permissions", "\u6B0A\u9650"}, + {".Edit.Permission.", " \u7DE8\u8F2F\u6B0A\u9650:"}, + {".Add.New.Permission.", " \u65B0\u589E\u6B0A\u9650:"}, + {"Signed.By.", "\u7C3D\u7F72\u4EBA: "}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "\u6C92\u6709\u842C\u7528\u5B57\u5143\u540D\u7A31\uFF0C\u7121\u6CD5\u6307\u5B9A\u542B\u6709\u842C\u7528\u5B57\u5143\u985E\u5225\u7684 Principal"}, + {"Cannot.Specify.Principal.without.a.Name", + "\u6C92\u6709\u540D\u7A31\uFF0C\u7121\u6CD5\u6307\u5B9A Principal"}, + {"Permission.and.Target.Name.must.have.a.value", + "\u6B0A\u9650\u53CA\u76EE\u6A19\u540D\u7A31\u5FC5\u9808\u6709\u4E00\u500B\u503C\u3002"}, + {"Remove.this.Policy.Entry.", "\u79FB\u9664\u9019\u500B\u539F\u5247\u9805\u76EE\uFF1F"}, + {"Overwrite.File", "\u8986\u5BEB\u6A94\u6848"}, + {"Policy.successfully.written.to.filename", + "\u539F\u5247\u6210\u529F\u5BEB\u5165\u81F3 {0}"}, + {"null.filename", "\u7A7A\u503C\u6A94\u540D"}, + {"Save.changes.", "\u5132\u5B58\u8B8A\u66F4\uFF1F"}, + {"Yes", "\u662F"}, + {"No", "\u5426"}, + {"Policy.Entry", "\u539F\u5247\u9805\u76EE"}, + {"Save.Changes", "\u5132\u5B58\u8B8A\u66F4"}, + {"No.Policy.Entry.selected", "\u6C92\u6709\u9078\u53D6\u539F\u5247\u9805\u76EE"}, + {"Unable.to.open.KeyStore.ex.toString.", + "\u7121\u6CD5\u958B\u555F\u91D1\u9470\u5132\u5B58\u5EAB: {0}"}, + {"No.principal.selected", "\u672A\u9078\u53D6 Principal"}, + {"No.permission.selected", "\u6C92\u6709\u9078\u53D6\u6B0A\u9650"}, + {"name", "\u540D\u7A31"}, + {"configuration.type", "\u7D44\u614B\u985E\u578B"}, + {"environment.variable.name", "\u74B0\u5883\u8B8A\u6578\u540D\u7A31"}, + {"library.name", "\u7A0B\u5F0F\u5EAB\u540D\u7A31"}, + {"package.name", "\u5957\u88DD\u7A0B\u5F0F\u540D\u7A31"}, + {"policy.type", "\u539F\u5247\u985E\u578B"}, + {"property.name", "\u5C6C\u6027\u540D\u7A31"}, + {"provider.name", "\u63D0\u4F9B\u8005\u540D\u7A31"}, + {"Principal.List", "Principal \u6E05\u55AE"}, + {"Permission.List", "\u6B0A\u9650\u6E05\u55AE"}, + {"Code.Base", "\u4EE3\u78BC\u57FA\u6E96"}, + {"KeyStore.U.R.L.", "\u91D1\u9470\u5132\u5B58\u5EAB URL:"}, + {"KeyStore.Password.U.R.L.", "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC URL:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_TW.java b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_TW.java new file mode 100644 index 00000000000..1c241a6afa1 --- /dev/null +++ b/jdk/src/share/classes/sun/security/tools/policytool/Resources_zh_TW.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.security.tools.policytool; + +/** + *

This class represents the ResourceBundle + * for the policytool. + * + */ +public class Resources_zh_TW extends java.util.ListResourceBundle { + + private static final Object[][] contents = { + {"NEWLINE", "\n"}, + {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", + "\u8B66\u544A: \u5225\u540D {0} \u7684\u516C\u958B\u91D1\u9470\u4E0D\u5B58\u5728\u3002\u8ACB\u78BA\u5B9A\u91D1\u9470\u5132\u5B58\u5EAB\u914D\u7F6E\u6B63\u78BA\u3002"}, + {"Warning.Class.not.found.class", "\u8B66\u544A: \u627E\u4E0D\u5230\u985E\u5225 {0}"}, + {"Warning.Invalid.argument.s.for.constructor.arg", + "\u8B66\u544A: \u7121\u6548\u7684\u5EFA\u69CB\u5B50\u5F15\u6578: {0}"}, + {"Illegal.Principal.Type.type", "\u7121\u6548\u7684 Principal \u985E\u578B: {0}"}, + {"Illegal.option.option", "\u7121\u6548\u7684\u9078\u9805: {0}"}, + {"Usage.policytool.options.", "\u7528\u6CD5: policytool [options]"}, + {".file.file.policy.file.location", + " [-file ] \u539F\u5247\u6A94\u6848\u4F4D\u7F6E"}, + {"New", "\u65B0\u589E"}, + {"Open", "\u958B\u555F"}, + {"Save", "\u5132\u5B58"}, + {"Save.As", "\u53E6\u5B58\u65B0\u6A94"}, + {"View.Warning.Log", "\u6AA2\u8996\u8B66\u544A\u8A18\u9304"}, + {"Exit", "\u7D50\u675F"}, + {"Add.Policy.Entry", "\u65B0\u589E\u539F\u5247\u9805\u76EE"}, + {"Edit.Policy.Entry", "\u7DE8\u8F2F\u539F\u5247\u9805\u76EE"}, + {"Remove.Policy.Entry", "\u79FB\u9664\u539F\u5247\u9805\u76EE"}, + {"Edit", "\u7DE8\u8F2F"}, + {"Retain", "\u4FDD\u7559"}, + + {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", + "\u8B66\u544A: \u6A94\u6848\u540D\u7A31\u5305\u542B\u9041\u96E2\u53CD\u659C\u7DDA\u5B57\u5143\u3002\u4E0D\u9700\u8981\u9041\u96E2\u53CD\u659C\u7DDA\u5B57\u5143 (\u64B0\u5BEB\u539F\u5247\u5167\u5BB9\u81F3\u6C38\u4E45\u5B58\u653E\u5340\u6642\u9700\u8981\u5DE5\u5177\u9041\u96E2\u5B57\u5143)\u3002\n\n\u6309\u4E00\u4E0B\u300C\u4FDD\u7559\u300D\u4EE5\u4FDD\u7559\u8F38\u5165\u7684\u540D\u7A31\uFF0C\u6216\u6309\u4E00\u4E0B\u300C\u7DE8\u8F2F\u300D\u4EE5\u7DE8\u8F2F\u540D\u7A31\u3002"}, + + {"Add.Public.Key.Alias", "\u65B0\u589E\u516C\u958B\u91D1\u9470\u5225\u540D"}, + {"Remove.Public.Key.Alias", "\u79FB\u9664\u516C\u958B\u91D1\u9470\u5225\u540D"}, + {"File", "\u6A94\u6848"}, + {"KeyStore", "\u91D1\u9470\u5132\u5B58\u5EAB"}, + {"Policy.File.", "\u539F\u5247\u6A94\u6848: "}, + {"Could.not.open.policy.file.policyFile.e.toString.", + "\u7121\u6CD5\u958B\u555F\u539F\u5247\u6A94\u6848: {0}: {1}"}, + {"Policy.Tool", "\u539F\u5247\u5DE5\u5177"}, + {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", + "\u958B\u555F\u539F\u5247\u8A18\u7F6E\u6642\u767C\u751F\u932F\u8AA4\u3002\u8ACB\u6AA2\u8996\u8B66\u544A\u8A18\u9304\u4EE5\u53D6\u5F97\u66F4\u591A\u7684\u8CC7\u8A0A"}, + {"Error", "\u932F\u8AA4"}, + {"OK", "\u78BA\u5B9A"}, + {"Status", "\u72C0\u614B"}, + {"Warning", "\u8B66\u544A"}, + {"Permission.", + "\u6B0A\u9650: "}, + {"Principal.Type.", "Principal \u985E\u578B: "}, + {"Principal.Name.", "Principal \u540D\u7A31: "}, + {"Target.Name.", + "\u76EE\u6A19\u540D\u7A31: "}, + {"Actions.", + "\u52D5\u4F5C: "}, + {"OK.to.overwrite.existing.file.filename.", + "\u78BA\u8A8D\u8986\u5BEB\u73FE\u5B58\u7684\u6A94\u6848 {0}\uFF1F"}, + {"Cancel", "\u53D6\u6D88"}, + {"CodeBase.", "CodeBase:"}, + {"SignedBy.", "SignedBy:"}, + {"Add.Principal", "\u65B0\u589E Principal"}, + {"Edit.Principal", "\u7DE8\u8F2F Principal"}, + {"Remove.Principal", "\u79FB\u9664 Principal"}, + {"Principals.", "Principal:"}, + {".Add.Permission", " \u65B0\u589E\u6B0A\u9650"}, + {".Edit.Permission", " \u7DE8\u8F2F\u6B0A\u9650"}, + {"Remove.Permission", "\u79FB\u9664\u6B0A\u9650"}, + {"Done", "\u5B8C\u6210"}, + {"KeyStore.URL.", "\u91D1\u9470\u5132\u5B58\u5EAB URL: "}, + {"KeyStore.Type.", "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B:"}, + {"KeyStore.Provider.", "\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005:"}, + {"KeyStore.Password.URL.", "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC URL: "}, + {"Principals", "Principal"}, + {".Edit.Principal.", " \u7DE8\u8F2F Principal: "}, + {".Add.New.Principal.", " \u65B0\u589E Principal: "}, + {"Permissions", "\u6B0A\u9650"}, + {".Edit.Permission.", " \u7DE8\u8F2F\u6B0A\u9650:"}, + {".Add.New.Permission.", " \u65B0\u589E\u6B0A\u9650:"}, + {"Signed.By.", "\u7C3D\u7F72\u4EBA: "}, + {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", + "\u6C92\u6709\u842C\u7528\u5B57\u5143\u540D\u7A31\uFF0C\u7121\u6CD5\u6307\u5B9A\u542B\u6709\u842C\u7528\u5B57\u5143\u985E\u5225\u7684 Principal"}, + {"Cannot.Specify.Principal.without.a.Name", + "\u6C92\u6709\u540D\u7A31\uFF0C\u7121\u6CD5\u6307\u5B9A Principal"}, + {"Permission.and.Target.Name.must.have.a.value", + "\u6B0A\u9650\u53CA\u76EE\u6A19\u540D\u7A31\u5FC5\u9808\u6709\u4E00\u500B\u503C\u3002"}, + {"Remove.this.Policy.Entry.", "\u79FB\u9664\u9019\u500B\u539F\u5247\u9805\u76EE\uFF1F"}, + {"Overwrite.File", "\u8986\u5BEB\u6A94\u6848"}, + {"Policy.successfully.written.to.filename", + "\u539F\u5247\u6210\u529F\u5BEB\u5165\u81F3 {0}"}, + {"null.filename", "\u7A7A\u503C\u6A94\u540D"}, + {"Save.changes.", "\u5132\u5B58\u8B8A\u66F4\uFF1F"}, + {"Yes", "\u662F"}, + {"No", "\u5426"}, + {"Policy.Entry", "\u539F\u5247\u9805\u76EE"}, + {"Save.Changes", "\u5132\u5B58\u8B8A\u66F4"}, + {"No.Policy.Entry.selected", "\u6C92\u6709\u9078\u53D6\u539F\u5247\u9805\u76EE"}, + {"Unable.to.open.KeyStore.ex.toString.", + "\u7121\u6CD5\u958B\u555F\u91D1\u9470\u5132\u5B58\u5EAB: {0}"}, + {"No.principal.selected", "\u672A\u9078\u53D6 Principal"}, + {"No.permission.selected", "\u6C92\u6709\u9078\u53D6\u6B0A\u9650"}, + {"name", "\u540D\u7A31"}, + {"configuration.type", "\u7D44\u614B\u985E\u578B"}, + {"environment.variable.name", "\u74B0\u5883\u8B8A\u6578\u540D\u7A31"}, + {"library.name", "\u7A0B\u5F0F\u5EAB\u540D\u7A31"}, + {"package.name", "\u5957\u88DD\u7A0B\u5F0F\u540D\u7A31"}, + {"policy.type", "\u539F\u5247\u985E\u578B"}, + {"property.name", "\u5C6C\u6027\u540D\u7A31"}, + {"provider.name", "\u63D0\u4F9B\u8005\u540D\u7A31"}, + {"Principal.List", "Principal \u6E05\u55AE"}, + {"Permission.List", "\u6B0A\u9650\u6E05\u55AE"}, + {"Code.Base", "\u4EE3\u78BC\u57FA\u6E96"}, + {"KeyStore.U.R.L.", "\u91D1\u9470\u5132\u5B58\u5EAB URL:"}, + {"KeyStore.Password.U.R.L.", "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC URL:"} + }; + + + /** + * Returns the contents of this ResourceBundle. + * + *

+ * + * @return the contents of this ResourceBundle. + */ + @Override + public Object[][] getContents() { + return contents; + } +} diff --git a/jdk/src/share/classes/sun/security/util/Debug.java b/jdk/src/share/classes/sun/security/util/Debug.java index 5c666797036..f4005a470ab 100644 --- a/jdk/src/share/classes/sun/security/util/Debug.java +++ b/jdk/src/share/classes/sun/security/util/Debug.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/util/HostnameChecker.java b/jdk/src/share/classes/sun/security/util/HostnameChecker.java index 313ddb110bb..014695cbf8d 100644 --- a/jdk/src/share/classes/sun/security/util/HostnameChecker.java +++ b/jdk/src/share/classes/sun/security/util/HostnameChecker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/util/Resources.java b/jdk/src/share/classes/sun/security/util/Resources.java index a7ba9e2e36d..ef073b0a1fd 100644 --- a/jdk/src/share/classes/sun/security/util/Resources.java +++ b/jdk/src/share/classes/sun/security/util/Resources.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,513 +34,6 @@ public class Resources extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part - {".OPTION.", " [OPTION]..."}, - {"Options.", "Options:"}, - {"Use.keytool.help.for.all.available.commands", - "Use \"keytool -help\" for all available commands"}, - {"Key.and.Certificate.Management.Tool", - "Key and Certificate Management Tool"}, - {"Commands.", "Commands:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "Use \"keytool -command_name -help\" for usage of command_name"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "Generates a certificate request"}, //-certreq - {"Changes.an.entry.s.alias", - "Changes an entry's alias"}, //-changealias - {"Deletes.an.entry", - "Deletes an entry"}, //-delete - {"Exports.certificate", - "Exports certificate"}, //-exportcert - {"Generates.a.key.pair", - "Generates a key pair"}, //-genkeypair - {"Generates.a.secret.key", - "Generates a secret key"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "Generates certificate from a certificate request"}, //-gencert - {"Generates.CRL", "Generates CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "Imports entries from a JDK 1.1.x-style identity database"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "Imports a certificate or a certificate chain"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "Imports one or all entries from another keystore"}, //-importkeystore - {"Clones.a.key.entry", - "Clones a key entry"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "Changes the key password of an entry"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "Lists entries in a keystore"}, //-list - {"Prints.the.content.of.a.certificate", - "Prints the content of a certificate"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "Prints the content of a certificate request"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "Prints the content of a CRL file"}, //-printcrl - {"Generates.a.self.signed.certificate", - "Generates a self-signed certificate"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "Changes the store password of a keystore"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "alias name of the entry to process"}, //-alias - {"destination.alias", - "destination alias"}, //-destalias - {"destination.key.password", - "destination key password"}, //-destkeypass - {"destination.keystore.name", - "destination keystore name"}, //-destkeystore - {"destination.keystore.password.protected", - "destination keystore password protected"}, //-destprotected - {"destination.keystore.provider.name", - "destination keystore provider name"}, //-destprovidername - {"destination.keystore.password", - "destination keystore password"}, //-deststorepass - {"destination.keystore.type", - "destination keystore type"}, //-deststoretype - {"distinguished.name", - "distinguished name"}, //-dname - {"X.509.extension", - "X.509 extension"}, //-ext - {"output.file.name", - "output file name"}, //-file and -outfile - {"input.file.name", - "input file name"}, //-file and -infile - {"key.algorithm.name", - "key algorithm name"}, //-keyalg - {"key.password", - "key password"}, //-keypass - {"key.bit.size", - "key bit size"}, //-keysize - {"keystore.name", - "keystore name"}, //-keystore - {"new.password", - "new password"}, //-new - {"do.not.prompt", - "do not prompt"}, //-noprompt - {"password.through.protected.mechanism", - "password through protected mechanism"}, //-protected - {"provider.argument", - "provider argument"}, //-providerarg - {"provider.class.name", - "provider class name"}, //-providerclass - {"provider.name", - "provider name"}, //-providername - {"provider.classpath", - "provider classpath"}, //-providerpath - {"output.in.RFC.style", - "output in RFC style"}, //-rfc - {"signature.algorithm.name", - "signature algorithm name"}, //-sigalg - {"source.alias", - "source alias"}, //-srcalias - {"source.key.password", - "source key password"}, //-srckeypass - {"source.keystore.name", - "source keystore name"}, //-srckeystore - {"source.keystore.password.protected", - "source keystore password protected"}, //-srcprotected - {"source.keystore.provider.name", - "source keystore provider name"}, //-srcprovidername - {"source.keystore.password", - "source keystore password"}, //-srcstorepass - {"source.keystore.type", - "source keystore type"}, //-srcstoretype - {"SSL.server.host.and.port", - "SSL server host and port"}, //-sslserver - {"signed.jar.file", - "signed jar file"}, //=jarfile - {"certificate.validity.start.date.time", - "certificate validity start date/time"}, //-startdate - {"keystore.password", - "keystore password"}, //-storepass - {"keystore.type", - "keystore type"}, //-storetype - {"trust.certificates.from.cacerts", - "trust certificates from cacerts"}, //-trustcacerts - {"verbose.output", - "verbose output"}, //-v - {"validity.number.of.days", - "validity number of days"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "Serial ID of cert to revoke"}, //-id - // keytool: Running part - {"keytool.error.", "keytool error: "}, - {"Illegal.option.", "Illegal option: "}, - {"Illegal.value.", "Illegal value: "}, - {"Unknown.password.type.", "Unknown password type: "}, - {"Cannot.find.environment.variable.", - "Cannot find environment variable: "}, - {"Cannot.find.file.", "Cannot find file: "}, - {"Command.option.flag.needs.an.argument.", "Command option {0} needs an argument."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified {0} value."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-keystore must be NONE if -storetype is {0}"}, - {"Too.many.retries.program.terminated", - "Too many retries, program terminated"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "-storepasswd and -keypasswd commands not supported if -storetype is {0}"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "-keypasswd commands not supported if -storetype is PKCS12"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "-keypass and -new can not be specified if -storetype is {0}"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "if -protected is specified, then -storepass, -keypass, and -new must not be specified"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "if -srcprotected is specified, then -srcstorepass and -srckeypass must not be specified"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "if keystore is not password protected, then -storepass, -keypass, and -new must not be specified"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "if source keystore is not password protected, then -srcstorepass and -srckeypass must not be specified"}, - {"Illegal.startdate.value", "Illegal startdate value"}, - {"Validity.must.be.greater.than.zero", - "Validity must be greater than zero"}, - {"provName.not.a.provider", "{0} not a provider"}, - {"Usage.error.no.command.provided", "Usage error: no command provided"}, - {"Source.keystore.file.exists.but.is.empty.", "Source keystore file exists, but is empty: "}, - {"Please.specify.srckeystore", "Please specify -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "Must not specify both -v and -rfc with 'list' command"}, - {"Key.password.must.be.at.least.6.characters", - "Key password must be at least 6 characters"}, - {"New.password.must.be.at.least.6.characters", - "New password must be at least 6 characters"}, - {"Keystore.file.exists.but.is.empty.", - "Keystore file exists, but is empty: "}, - {"Keystore.file.does.not.exist.", - "Keystore file does not exist: "}, - {"Must.specify.destination.alias", "Must specify destination alias"}, - {"Must.specify.alias", "Must specify alias"}, - {"Keystore.password.must.be.at.least.6.characters", - "Keystore password must be at least 6 characters"}, - {"Enter.keystore.password.", "Enter keystore password: "}, - {"Enter.source.keystore.password.", "Enter source keystore password: "}, - {"Enter.destination.keystore.password.", "Enter destination keystore password: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "Keystore password is too short - must be at least 6 characters"}, - {"Unknown.Entry.Type", "Unknown Entry Type"}, - {"Too.many.failures.Alias.not.changed", "Too many failures. Alias not changed"}, - {"Entry.for.alias.alias.successfully.imported.", - "Entry for alias {0} successfully imported."}, - {"Entry.for.alias.alias.not.imported.", "Entry for alias {0} not imported."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "Problem importing entry for alias {0}: {1}.\nEntry for alias {0} not imported."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "Import command completed: {0} entries successfully imported, {1} entries failed or cancelled"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "Warning: Overwriting existing alias {0} in destination keystore"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "Existing entry alias {0} exists, overwrite? [no]: "}, - {"Too.many.failures.try.later", "Too many failures - try later"}, - {"Certification.request.stored.in.file.filename.", - "Certification request stored in file <{0}>"}, - {"Submit.this.to.your.CA", "Submit this to your CA"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "if alias not specified, destalias, srckeypass, and destkeypass must not be specified"}, - {"Certificate.stored.in.file.filename.", - "Certificate stored in file <{0}>"}, - {"Certificate.reply.was.installed.in.keystore", - "Certificate reply was installed in keystore"}, - {"Certificate.reply.was.not.installed.in.keystore", - "Certificate reply was not installed in keystore"}, - {"Certificate.was.added.to.keystore", - "Certificate was added to keystore"}, - {"Certificate.was.not.added.to.keystore", - "Certificate was not added to keystore"}, - {".Storing.ksfname.", "[Storing {0}]"}, - {"alias.has.no.public.key.certificate.", - "{0} has no public key (certificate)"}, - {"Cannot.derive.signature.algorithm", - "Cannot derive signature algorithm"}, - {"Alias.alias.does.not.exist", - "Alias <{0}> does not exist"}, - {"Alias.alias.has.no.certificate", - "Alias <{0}> has no certificate"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "Key pair not generated, alias <{0}> already exists"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "Generating {0} bit {1} key pair and self-signed certificate ({2}) with a validity of {3} days\n\tfor: {4}"}, - {"Enter.key.password.for.alias.", "Enter key password for <{0}>"}, - {".RETURN.if.same.as.keystore.password.", - "\t(RETURN if same as keystore password): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "Key password is too short - must be at least 6 characters"}, - {"Too.many.failures.key.not.added.to.keystore", - "Too many failures - key not added to keystore"}, - {"Destination.alias.dest.already.exists", - "Destination alias <{0}> already exists"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "Password is too short - must be at least 6 characters"}, - {"Too.many.failures.Key.entry.not.cloned", - "Too many failures. Key entry not cloned"}, - {"key.password.for.alias.", "key password for <{0}>"}, - {"Keystore.entry.for.id.getName.already.exists", - "Keystore entry for <{0}> already exists"}, - {"Creating.keystore.entry.for.id.getName.", - "Creating keystore entry for <{0}> ..."}, - {"No.entries.from.identity.database.added", - "No entries from identity database added"}, - {"Alias.name.alias", "Alias name: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "Creation date: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "Entry type: {0}"}, - {"Certificate.chain.length.", "Certificate chain length: "}, - {"Certificate.i.1.", "Certificate[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "Certificate fingerprint (SHA1): "}, - {"Keystore.type.", "Keystore type: "}, - {"Keystore.provider.", "Keystore provider: "}, - {"Your.keystore.contains.keyStore.size.entry", - "Your keystore contains {0,number,integer} entry"}, - {"Your.keystore.contains.keyStore.size.entries", - "Your keystore contains {0,number,integer} entries"}, - {"Failed.to.parse.input", "Failed to parse input"}, - {"Empty.input", "Empty input"}, - {"Not.X.509.certificate", "Not X.509 certificate"}, - {"alias.has.no.public.key", "{0} has no public key"}, - {"alias.has.no.X.509.certificate", "{0} has no X.509 certificate"}, - {"New.certificate.self.signed.", "New certificate (self-signed):"}, - {"Reply.has.no.certificates", "Reply has no certificates"}, - {"Certificate.not.imported.alias.alias.already.exists", - "Certificate not imported, alias <{0}> already exists"}, - {"Input.not.an.X.509.certificate", "Input not an X.509 certificate"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "Certificate already exists in keystore under alias <{0}>"}, - {"Do.you.still.want.to.add.it.no.", - "Do you still want to add it? [no]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "Certificate already exists in system-wide CA keystore under alias <{0}>"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "Do you still want to add it to your own keystore? [no]: "}, - {"Trust.this.certificate.no.", "Trust this certificate? [no]: "}, - {"YES", "YES"}, - {"New.prompt.", "New {0}: "}, - {"Passwords.must.differ", "Passwords must differ"}, - {"Re.enter.new.prompt.", "Re-enter new {0}: "}, - {"Re.enter.new.password.", "Re-enter new password: "}, - {"They.don.t.match.Try.again", "They don't match. Try again"}, - {"Enter.prompt.alias.name.", "Enter {0} alias name: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "Enter new alias name\t(RETURN to cancel import for this entry): "}, - {"Enter.alias.name.", "Enter alias name: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(RETURN if same as for <{0}>)"}, - {".PATTERN.printX509Cert", - "Owner: {0}\nIssuer: {1}\nSerial number: {2}\nValid from: {3} until: {4}\nCertificate fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signature algorithm name: {8}\n\t Version: {9}"}, - {"What.is.your.first.and.last.name.", - "What is your first and last name?"}, - {"What.is.the.name.of.your.organizational.unit.", - "What is the name of your organizational unit?"}, - {"What.is.the.name.of.your.organization.", - "What is the name of your organization?"}, - {"What.is.the.name.of.your.City.or.Locality.", - "What is the name of your City or Locality?"}, - {"What.is.the.name.of.your.State.or.Province.", - "What is the name of your State or Province?"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "What is the two-letter country code for this unit?"}, - {"Is.name.correct.", "Is {0} correct?"}, - {"no", "no"}, - {"yes", "yes"}, - {"y", "y"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "Alias <{0}> has no key"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "Alias <{0}> references an entry type that is not a private key entry. The -keyclone command only supports cloning of private key entries"}, - - {".WARNING.WARNING.WARNING.", - "***************** WARNING WARNING WARNING *****************"}, - {"Signer.d.", "Signer #%d:"}, - {"Timestamp.", "Timestamp:"}, - {"Signature.", "Signature:"}, - {"CRLs.", "CRLs:"}, - {"Certificate.owner.", "Certificate owner: "}, - {"Not.a.signed.jar.file", "Not a signed jar file"}, - {"No.certificate.from.the.SSL.server", - "No certificate from the SSL server"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* The integrity of the information stored in your keystore *\n" + - "* has NOT been verified! In order to verify its integrity, *\n" + - "* you must provide your keystore password. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* The integrity of the information stored in the srckeystore*\n" + - "* has NOT been verified! In order to verify its integrity, *\n" + - "* you must provide the srckeystore password. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "Certificate reply does not contain public key for <{0}>"}, - {"Incomplete.certificate.chain.in.reply", - "Incomplete certificate chain in reply"}, - {"Certificate.chain.in.reply.does.not.verify.", - "Certificate chain in reply does not verify: "}, - {"Top.level.certificate.in.reply.", - "Top-level certificate in reply:\n"}, - {".is.not.trusted.", "... is not trusted. "}, - {"Install.reply.anyway.no.", "Install reply anyway? [no]: "}, - {"NO", "NO"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "Public keys in reply and keystore don't match"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "Certificate reply and certificate in keystore are identical"}, - {"Failed.to.establish.chain.from.reply", - "Failed to establish chain from reply"}, - {"n", "n"}, - {"Wrong.answer.try.again", "Wrong answer, try again"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "Secret Key not generated, alias <{0}> already exists"}, - {"Please.provide.keysize.for.secret.key.generation", - "Please provide -keysize for secret key generation"}, - - {"verified.by.s.in.s", "Verified by %s in %s"}, - {"warning.not.verified.make.sure.keystore.is.correct", - "WARNING: not verified. Make sure -keystore is correct."}, - - {"Extensions.", "Extensions: "}, - {".Empty.value.", "(Empty value)"}, - {"Extension.Request.", "Extension Request:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "PKCS #10 Certificate Request (Version 1.0)\n" + - "Subject: %s\nPublic Key: %s format %s key\n"}, - {"Unknown.keyUsage.type.", "Unknown keyUsage type: "}, - {"Unknown.extendedkeyUsage.type.", "Unknown extendedkeyUsage type: "}, - {"Unknown.AccessDescription.type.", "Unknown AccessDescription type: "}, - {"Unrecognized.GeneralName.type.", "Unrecognized GeneralName type: "}, - {"This.extension.cannot.be.marked.as.critical.", - "This extension cannot be marked as critical. "}, - {"Odd.number.of.hex.digits.found.", "Odd number of hex digits found: "}, - {"Unknown.extension.type.", "Unknown extension type: "}, - {"command.{0}.is.ambiguous.", "command {0} is ambiguous:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "Warning: A public key for alias {0} does not exist. Make sure a KeyStore is properly configured."}, - {"Warning.Class.not.found.class", "Warning: Class not found: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "Warning: Invalid argument(s) for constructor: {0}"}, - {"Illegal.Principal.Type.type", "Illegal Principal Type: {0}"}, - {"Illegal.option.option", "Illegal option: {0}"}, - {"Usage.policytool.options.", "Usage: policytool [options]"}, - {".file.file.policy.file.location", - " [-file ] policy file location"}, - {"New", "New"}, - {"Open", "Open"}, - {"Save", "Save"}, - {"Save.As", "Save As"}, - {"View.Warning.Log", "View Warning Log"}, - {"Exit", "Exit"}, - {"Add.Policy.Entry", "Add Policy Entry"}, - {"Edit.Policy.Entry", "Edit Policy Entry"}, - {"Remove.Policy.Entry", "Remove Policy Entry"}, - {"Edit", "Edit"}, - {"Retain", "Retain"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "Warning: File name may include escaped backslash characters. " + - "It is not necessary to escape backslash characters " + - "(the tool escapes characters as necessary when writing " + - "the policy contents to the persistent store).\n\n" + - "Click on Retain to retain the entered name, or click on " + - "Edit to edit the name."}, - - {"Add.Public.Key.Alias", "Add Public Key Alias"}, - {"Remove.Public.Key.Alias", "Remove Public Key Alias"}, - {"File", "File"}, - {"KeyStore", "KeyStore"}, - {"Policy.File.", "Policy File:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "Could not open policy file: {0}: {1}"}, - {"Policy.Tool", "Policy Tool"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "Errors have occurred while opening the policy configuration. View the Warning Log for more information."}, - {"Error", "Error"}, - {"OK", "OK"}, - {"Status", "Status"}, - {"Warning", "Warning"}, - {"Permission.", - "Permission: "}, - {"Principal.Type.", "Principal Type:"}, - {"Principal.Name.", "Principal Name:"}, - {"Target.Name.", - "Target Name: "}, - {"Actions.", - "Actions: "}, - {"OK.to.overwrite.existing.file.filename.", - "OK to overwrite existing file {0}?"}, - {"Cancel", "Cancel"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "Add Principal"}, - {"Edit.Principal", "Edit Principal"}, - {"Remove.Principal", "Remove Principal"}, - {"Principals.", "Principals:"}, - {".Add.Permission", " Add Permission"}, - {".Edit.Permission", " Edit Permission"}, - {"Remove.Permission", "Remove Permission"}, - {"Done", "Done"}, - {"KeyStore.URL.", "KeyStore URL:"}, - {"KeyStore.Type.", "KeyStore Type:"}, - {"KeyStore.Provider.", "KeyStore Provider:"}, - {"KeyStore.Password.URL.", "KeyStore Password URL:"}, - {"Principals", "Principals"}, - {".Edit.Principal.", " Edit Principal:"}, - {".Add.New.Principal.", " Add New Principal:"}, - {"Permissions", "Permissions"}, - {".Edit.Permission.", " Edit Permission:"}, - {".Add.New.Permission.", " Add New Permission:"}, - {"Signed.By.", "Signed By:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "Cannot Specify Principal with a Wildcard Class without a Wildcard Name"}, - {"Cannot.Specify.Principal.without.a.Name", - "Cannot Specify Principal without a Name"}, - {"Permission.and.Target.Name.must.have.a.value", - "Permission and Target Name must have a value"}, - {"Remove.this.Policy.Entry.", "Remove this Policy Entry?"}, - {"Overwrite.File", "Overwrite File"}, - {"Policy.successfully.written.to.filename", - "Policy successfully written to {0}"}, - {"null.filename", "null filename"}, - {"Save.changes.", "Save changes?"}, - {"Yes", "Yes"}, - {"No", "No"}, - {"Policy.Entry", "Policy Entry"}, - {"Save.Changes", "Save Changes"}, - {"No.Policy.Entry.selected", "No Policy Entry selected"}, - {"Unable.to.open.KeyStore.ex.toString.", - "Unable to open KeyStore: {0}"}, - {"No.principal.selected", "No principal selected"}, - {"No.permission.selected", "No permission selected"}, - {"name", "name"}, - {"configuration.type", "configuration type"}, - {"environment.variable.name", "environment variable name"}, - {"library.name", "library name"}, - {"package.name", "package name"}, - {"policy.type", "policy type"}, - {"property.name", "property name"}, - {"Principal.List", "Principal List"}, - {"Permission.List", "Permission List"}, - {"Code.Base", "Code Base"}, - {"KeyStore.U.R.L.", "KeyStore U R L:"}, - {"KeyStore.Password.U.R.L.", "KeyStore Password U R L:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "invalid null input(s)"}, {"actions.can.only.be.read.", "actions can only be 'read'"}, @@ -565,6 +58,7 @@ public class Resources extends java.util.ListResourceBundle { {"provided.null.OID.map", "provided null OID map"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "invalid null AccessControlContext provided"}, {"invalid.null.action.provided", "invalid null action provided"}, @@ -668,6 +162,7 @@ public class Resources extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_de.java b/jdk/src/share/classes/sun/security/util/Resources_de.java index 26bd331166a..34a7d6dbd43 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_de.java +++ b/jdk/src/share/classes/sun/security/util/Resources_de.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_de extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [Option]..."}, - {"Options.", "Optionen:"}, - {"Use.keytool.help.for.all.available.commands", - "\"keytool -help\" f\u00FCr alle verf\u00FCgbaren Befehle verwenden"}, - {"Key.and.Certificate.Management.Tool", - "Schl\u00FCssel- und Zertifikatsverwaltungstool"}, - {"Commands.", "Befehle:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "\"keytool -command_name -help\" f\u00FCr Verwendung von command_name verwenden"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "Generiert eine Zertifikatanforderung"}, //-certreq - {"Changes.an.entry.s.alias", - "\u00C4ndert den Alias eines Eintrags"}, //-changealias - {"Deletes.an.entry", - "L\u00F6scht einen Eintrag"}, //-delete - {"Exports.certificate", - "Exportiert ein Zertifikat"}, //-exportcert - {"Generates.a.key.pair", - "Generiert ein Schl\u00FCsselpaar"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "Generiert einen Secret Key"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "Generiert ein Zertifikat aus einer Zertifikatanforderung"}, //-gencert - {"Generates.CRL", "Generiert eine CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "Importiert Eintr\u00E4ge aus einer Identity-Datenbank im JDK 1.1.x-Stil"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "Importiert ein Zertifikat oder eine Zertifikatkette"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "Importiert einen oder alle Eintr\u00E4ge aus einem anderen Keystore"}, //-importkeystore - {"Clones.a.key.entry", - "Clont einen Schl\u00FCsseleintrag"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "\u00C4ndert das Schl\u00FCsselkennwort eines Eintrags"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "Listet die Eintr\u00E4ge in einem Keystore auf"}, //-list - {"Prints.the.content.of.a.certificate", - "Druckt den Content eines Zertifikats"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "Druckt den Content einer Zertifikatanforderung"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "Druckt den Content einer CRL-Datei"}, //-printcrl - {"Generates.a.self.signed.certificate", - "Generiert ein selbst signiertes Zertifikat"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "\u00C4ndert das Speicherkennwort eines Keystores"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "Aliasname des zu verarbeitenden Eintrags"}, //-alias - {"destination.alias", - "Zielalias"}, //-destalias - {"destination.key.password", - "Zielschl\u00FCssel-Kennwort"}, //-destkeypass - {"destination.keystore.name", - "Ziel-Keystore-Name"}, //-destkeystore - {"destination.keystore.password.protected", - "Ziel-Keystore kennwortgesch\u00FCtzt"}, //-destprotected - {"destination.keystore.provider.name", - "Ziel-Keystore-Providername"}, //-destprovidername - {"destination.keystore.password", - "Ziel-Keystore-Kennwort"}, //-deststorepass - {"destination.keystore.type", - "Ziel-Keystore-Typ"}, //-deststoretype - {"distinguished.name", - "Distinguished Name"}, //-dname - {"X.509.extension", - "X.509-Erweiterung"}, //-ext - {"output.file.name", - "Ausgabedateiname"}, //-file and -outfile - {"input.file.name", - "Eingabedateiname"}, //-file and -infile - {"key.algorithm.name", - "Schl\u00FCsselalgorithmusname"}, //-keyalg - {"key.password", - "Schl\u00FCsselkennwort"}, //-keypass - {"key.bit.size", - "Schl\u00FCsselbitgr\u00F6\u00DFe"}, //-keysize - {"keystore.name", - "Keystore-Name"}, //-keystore - {"new.password", - "Neues Kennwort"}, //-new - {"do.not.prompt", - "Kein Prompt"}, //-noprompt - {"password.through.protected.mechanism", - "Kennwort \u00FCber gesch\u00FCtzten Mechanismus"}, //-protected - {"provider.argument", - "Providerargument"}, //-providerarg - {"provider.class.name", - "Providerklassenname"}, //-providerclass - {"provider.name", - "Providername"}, //-providername - {"provider.classpath", - "Provider-Classpath"}, //-providerpath - {"output.in.RFC.style", - "Ausgabe in RFC-Stil"}, //-rfc - {"signature.algorithm.name", - "Signaturalgorithmusname"}, //-sigalg - {"source.alias", - "Quellalias"}, //-srcalias - {"source.key.password", - "Quellschl\u00FCssel-Kennwort"}, //-srckeypass - {"source.keystore.name", - "Quell-Keystore-Name"}, //-srckeystore - {"source.keystore.password.protected", - "Quell-Keystore kennwortgesch\u00FCtzt"}, //-srcprotected - {"source.keystore.provider.name", - "Quell-Keystore-Providername"}, //-srcprovidername - {"source.keystore.password", - "Quell-Keystore-Kennwort"}, //-srcstorepass - {"source.keystore.type", - "Quell-Keystore-Typ"}, //-srcstoretype - {"SSL.server.host.and.port", - "SSL-Serverhost und -port"}, //-sslserver - {"signed.jar.file", - "Signierte JAR-Datei"}, //=jarfile - {"certificate.validity.start.date.time", - "Anfangsdatum/-zeit f\u00FCr Zertifikatsg\u00FCltigkeit"}, //-startdate - {"keystore.password", - "Keystore-Kennwort"}, //-storepass - {"keystore.type", - "Keystore-Typ"}, //-storetype - {"trust.certificates.from.cacerts", - "Zertifikaten aus cacerts vertrauen"}, //-trustcacerts - {"verbose.output", - "Verbose-Ausgabe"}, //-v - {"validity.number.of.days", - "G\u00FCltigkeitsdauer (Tage)"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "Serielle ID des zu entziehenden Certs"}, //-id - // keytool: Running part - {"keytool.error.", "Keytool-Fehler: "}, - {"Illegal.option.", "Ung\u00FCltige Option: "}, - {"Illegal.value.", "Ung\u00FCltiger Wert: "}, - {"Unknown.password.type.", "Unbekannter Kennworttyp: "}, - {"Cannot.find.environment.variable.", - "Umgebungsvariable kann nicht gefunden werden: "}, - {"Cannot.find.file.", "Datei kann nicht gefunden werden: "}, - {"Command.option.flag.needs.an.argument.", "Befehlsoption {0} ben\u00F6tigt ein Argument."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "Warnung: Keine Unterst\u00FCtzung f\u00FCr unterschiedliche Speicher- und Schl\u00FCsselkennw\u00F6rter bei PKCS12 KeyStores. Der benutzerdefinierte Wert {0} wird ignoriert."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-keystore muss NONE sein, wenn -storetype {0} ist"}, - {"Too.many.retries.program.terminated", - "Zu viele erneute Versuche. Programm wird beendet"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "Befehle -storepasswd und -keypasswd werden nicht unterst\u00FCtzt, wenn -storetype {0} ist"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "Befehle des Typs -keypasswd werden nicht unterst\u00FCtzt, wenn -storetype PKCS12 ist"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "-keypass und -new k\u00F6nnen nicht angegeben werden, wenn -storetype {0} ist"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "Wenn -protected angegeben ist, d\u00FCrfen -storepass, -keypass und -new nicht angegeben werden"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Wenn -srcprotected angegeben ist, d\u00FCrfen -srcstorepass und -srckeypass nicht angegeben werden"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "Wenn der Keystore nicht kennwortgesch\u00FCtzt ist, d\u00FCrfen -storepass, -keypass und -new nicht angegeben werden"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Wenn der Quell-Keystore nicht kennwortgesch\u00FCtzt ist, d\u00FCrfen -srcstorepass und -srckeypass nicht angegeben werden"}, - {"Illegal.startdate.value", "Ung\u00FCltiger Wert f\u00FCr Anfangsdatum"}, - {"Validity.must.be.greater.than.zero", - "G\u00FCltigkeit muss gr\u00F6\u00DFer als null sein"}, - {"provName.not.a.provider", "{0} kein Provider"}, - {"Usage.error.no.command.provided", "Verwendungsfehler: Kein Befehl angegeben"}, - {"Source.keystore.file.exists.but.is.empty.", "Quell-Keystore-Datei ist zwar vorhanden, ist aber leer: "}, - {"Please.specify.srckeystore", "Geben Sie -srckeystore an"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "-v und -rfc d\u00FCrfen bei Befehl \"list\" nicht beide angegeben werden"}, - {"Key.password.must.be.at.least.6.characters", - "Schl\u00FCsselkennwort muss mindestens sechs Zeichen lang sein"}, - {"New.password.must.be.at.least.6.characters", - "Neues Kennwort muss mindestens sechs Zeichen lang sein"}, - {"Keystore.file.exists.but.is.empty.", - "Keystore-Datei ist vorhanden, ist aber leer: "}, - {"Keystore.file.does.not.exist.", - "Keystore-Datei ist nicht vorhanden: "}, - {"Must.specify.destination.alias", "Sie m\u00FCssen einen Zielalias angeben"}, - {"Must.specify.alias", "Sie m\u00FCssen einen Alias angeben"}, - {"Keystore.password.must.be.at.least.6.characters", - "Keystore-Kennwort muss mindestens sechs Zeichen lang sein"}, - {"Enter.keystore.password.", "Keystore-Kennwort eingeben: "}, - {"Enter.source.keystore.password.", "Quell-Keystore-Kennwort eingeben: "}, - {"Enter.destination.keystore.password.", "Ziel-Keystore-Kennwort eingeben: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "Keystore-Kennwort ist zu kurz. Es muss mindestens sechs Zeichen lang sein"}, - {"Unknown.Entry.Type", "Unbekannter Eintragstyp"}, - {"Too.many.failures.Alias.not.changed", "Zu viele Fehler. Alias nicht ge\u00E4ndert"}, - {"Entry.for.alias.alias.successfully.imported.", - "Eintrag f\u00FCr Alias {0} erfolgreich importiert."}, - {"Entry.for.alias.alias.not.imported.", "Eintrag f\u00FCr Alias {0} nicht importiert."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "Problem beim Importieren des Eintrags f\u00FCr Alias {0}: {1}.\nEintrag f\u00FCr Alias {0} nicht importiert."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "Importbefehl abgeschlossen: {0} Eintr\u00E4ge erfolgreich importiert, {1} Eintr\u00E4ge nicht erfolgreich oder abgebrochen"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "Warnung: Vorhandener Alias {0} in Ziel-Keystore wird \u00FCberschrieben"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "Eintragsalias {0} ist bereits vorhanden. \u00DCberschreiben? [Nein]: "}, - {"Too.many.failures.try.later", "Zu viele Fehler. Versuchen Sie es sp\u00E4ter erneut"}, - {"Certification.request.stored.in.file.filename.", - "Zertifizierungsanforderung in Datei <{0}> gespeichert"}, - {"Submit.this.to.your.CA", "Leiten Sie dies an die CA weiter"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "Wenn kein Alias angegeben ist, d\u00FCrfen destalias, srckeypass und destkeypass nicht angegeben werden"}, - {"Certificate.stored.in.file.filename.", - "Zertifikat in Datei <{0}> gespeichert"}, - {"Certificate.reply.was.installed.in.keystore", - "Zertifikatantwort wurde in Keystore installiert"}, - {"Certificate.reply.was.not.installed.in.keystore", - "Zertifikatantwort wurde nicht in Keystore installiert"}, - {"Certificate.was.added.to.keystore", - "Zertifikat wurde Keystore hinzugef\u00FCgt"}, - {"Certificate.was.not.added.to.keystore", - "Zertifikat wurde nicht zu Keystore hinzugef\u00FCgt"}, - {".Storing.ksfname.", "[{0} wird gesichert]"}, - {"alias.has.no.public.key.certificate.", - "{0} hat keinen Public Key (Zertifikat)"}, - {"Cannot.derive.signature.algorithm", - "Signaturalgorithmus kann nicht abgeleitet werden"}, - {"Alias.alias.does.not.exist", - "Alias <{0}> ist nicht vorhanden"}, - {"Alias.alias.has.no.certificate", - "Alias <{0}> hat kein Zertifikat"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "Schl\u00FCsselpaar wurde nicht generiert. Alias <{0}> ist bereits vorhanden"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "Generieren von Schl\u00FCsselpaar (Typ {1}, {0} Bit) und selbst signiertem Zertifikat ({2}) mit einer G\u00FCltigkeit von {3} Tagen\n\tf\u00FCr: {4}"}, - {"Enter.key.password.for.alias.", "Schl\u00FCsselkennwort f\u00FCr <{0}> eingeben"}, - {".RETURN.if.same.as.keystore.password.", - "\t(RETURN, wenn identisch mit Keystore-Kennwort): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "Schl\u00FCsselkennwort ist zu kurz. Es muss mindestens sechs Zeichen lang sein"}, - {"Too.many.failures.key.not.added.to.keystore", - "Zu viele Fehler. Schl\u00FCssel wurde nicht zu Keystore hinzugef\u00FCgt"}, - {"Destination.alias.dest.already.exists", - "Zielalias <{0}> bereits vorhanden"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "Kennwort ist zu kurz. Es muss mindestens sechs Zeichen lang sein"}, - {"Too.many.failures.Key.entry.not.cloned", - "Zu viele Fehler. Schl\u00FCsseleintrag wurde nicht geclont"}, - {"key.password.for.alias.", "Schl\u00FCsselkennwort f\u00FCr <{0}>"}, - {"Keystore.entry.for.id.getName.already.exists", - "Keystore-Eintrag f\u00FCr <{0}> bereits vorhanden"}, - {"Creating.keystore.entry.for.id.getName.", - "Keystore-Eintrag f\u00FCr <{0}> wird erstellt..."}, - {"No.entries.from.identity.database.added", - "Keine Eintr\u00E4ge aus Identity-Datenbank hinzugef\u00FCgt"}, - {"Alias.name.alias", "Aliasname: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "Erstellungsdatum: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "Eintragstyp: {0}"}, - {"Certificate.chain.length.", "Zertifikatkettenl\u00E4nge: "}, - {"Certificate.i.1.", "Zertifikat[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "Zertifikat-Fingerprint (SHA1): "}, - {"Keystore.type.", "Keystore-Typ: "}, - {"Keystore.provider.", "Keystore-Provider: "}, - {"Your.keystore.contains.keyStore.size.entry", - "Keystore enth\u00E4lt {0,number,integer} Eintrag"}, - {"Your.keystore.contains.keyStore.size.entries", - "Keystore enth\u00E4lt {0,number,integer} Eintr\u00E4ge"}, - {"Failed.to.parse.input", "Eingabe konnte nicht geparst werden"}, - {"Empty.input", "Leere Eingabe"}, - {"Not.X.509.certificate", "Kein X.509-Zertifikat"}, - {"alias.has.no.public.key", "{0} hat keinen Public Key"}, - {"alias.has.no.X.509.certificate", "{0} hat kein X.509-Zertifikat"}, - {"New.certificate.self.signed.", "Neues Zertifikat (selbst signiert):"}, - {"Reply.has.no.certificates", "Antwort hat keine Zertifikate"}, - {"Certificate.not.imported.alias.alias.already.exists", - "Zertifikat nicht importiert. Alias <{0}> ist bereits vorhanden"}, - {"Input.not.an.X.509.certificate", "Eingabe kein X.509-Zertifikat"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "Zertifikat ist bereits unter Alias <{0}> im Keystore vorhanden"}, - {"Do.you.still.want.to.add.it.no.", - "M\u00F6chten Sie es trotzdem hinzuf\u00FCgen? [Nein]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "Zertifikat ist bereits unter Alias <{0}> im systemweiten CA-Keystore vorhanden"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "M\u00F6chten Sie es trotzdem zu Ihrem eigenen Keystore hinzuf\u00FCgen? [Nein]: "}, - {"Trust.this.certificate.no.", "Diesem Zertifikat vertrauen? [Nein]: "}, - {"YES", "Ja"}, - {"New.prompt.", "Neues {0}: "}, - {"Passwords.must.differ", "Kennw\u00F6rter m\u00FCssen sich unterscheiden"}, - {"Re.enter.new.prompt.", "Neues {0} erneut eingeben: "}, - {"Re.enter.new.password.", "Neues Kennwort erneut eingeben: "}, - {"They.don.t.match.Try.again", "Keine \u00DCbereinstimmung. Wiederholen Sie den Vorgang"}, - {"Enter.prompt.alias.name.", "{0}-Aliasnamen eingeben: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "Geben Sie einen neuen Aliasnamen ein\t(RETURN, um den Import dieses Eintrags abzubrechen): "}, - {"Enter.alias.name.", "Aliasnamen eingeben: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(RETURN, wenn identisch mit <{0}>)"}, - {".PATTERN.printX509Cert", - "Eigent\u00FCmer: {0}\nAussteller: {1}\nSeriennummer: {2}\nG\u00FCltig von: {3} bis: {4}\nZertifikat-Fingerprints:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Signaturalgorithmusname: {8}\n\t Version: {9}"}, - {"What.is.your.first.and.last.name.", - "Wie lautet Ihr Vor- und Nachname?"}, - {"What.is.the.name.of.your.organizational.unit.", - "Wie lautet der Name Ihrer organisatorischen Einheit?"}, - {"What.is.the.name.of.your.organization.", - "Wie lautet der Name Ihrer Organisation?"}, - {"What.is.the.name.of.your.City.or.Locality.", - "Wie lautet der Name Ihrer Stadt oder Gemeinde?"}, - {"What.is.the.name.of.your.State.or.Province.", - "Wie lautet der Name Ihres Bundeslands?"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "Wie lautet der L\u00E4ndercode (zwei Buchstaben) f\u00FCr diese Einheit?"}, - {"Is.name.correct.", "Ist {0} richtig?"}, - {"no", "Nein"}, - {"yes", "Ja"}, - {"y", "J"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "Alias <{0}> verf\u00FCgt \u00FCber keinen Schl\u00FCssel"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "Alias <{0}> verweist auf einen Eintragstyp, der kein Private Key-Eintrag ist. Der Befehl -keyclone unterst\u00FCtzt nur das Clonen von Private Key-Eintr\u00E4gen"}, - - {".WARNING.WARNING.WARNING.", - "***************** Warnung Warnung Warnung *****************"}, - {"Signer.d.", "Signaturgeber #%d:"}, - {"Timestamp.", "Zeitstempel:"}, - {"Signature.", "Signatur:"}, - {"CRLs.", "CRLs:"}, - {"Certificate.owner.", "Zertifikateigent\u00FCmer: "}, - {"Not.a.signed.jar.file", "Keine signierte JAR-Datei"}, - {"No.certificate.from.the.SSL.server", - "Kein Zertifikat vom SSL-Server"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* Die Integrit\u00E4t der Informationen, die in Ihrem Keystore gespeichert sind, *\n* wurde NICHT gepr\u00FCft. Um die Integrit\u00E4t zu pr\u00FCfen, *\n* m\u00FCssen Sie Ihr Keystore-Kennwort angeben. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* Die Integrit\u00E4t der Informationen, die in Ihrem Srckeystore gespeichert sind, *\n* wurde NICHT gepr\u00FCft. Um die Integrit\u00E4t zu pr\u00FCfen, *\n* m\u00FCssen Sie Ihr Srckeystore-Kennwort angeben. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "Zertifikatantwort enth\u00E4lt keinen Public Key f\u00FCr <{0}>"}, - {"Incomplete.certificate.chain.in.reply", - "Unvollst\u00E4ndige Zertifikatkette in Antwort"}, - {"Certificate.chain.in.reply.does.not.verify.", - "Zertifikatkette in Antwort verifiziert nicht: "}, - {"Top.level.certificate.in.reply.", - "Zertifikat der obersten Ebene in Antwort:\n"}, - {".is.not.trusted.", "... ist nicht vertrauensw\u00FCrdig. "}, - {"Install.reply.anyway.no.", "Antwort trotzdem installieren? [Nein]: "}, - {"NO", "Nein"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "Public Keys in Antwort und Keystore stimmen nicht \u00FCberein"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "Zertifikatantwort und Zertifikat in Keystore sind identisch"}, - {"Failed.to.establish.chain.from.reply", - "Kette konnte der Antwort nicht entnommen werden"}, - {"n", "N"}, - {"Wrong.answer.try.again", "Falsche Antwort. Wiederholen Sie den Vorgang"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "Secret Key wurde nicht generiert. Alias <{0}> ist bereits vorhanden"}, - {"Please.provide.keysize.for.secret.key.generation", - "Geben Sie -keysize zum Erstellen eines Secret Keys an"}, - - {"Extensions.", "Erweiterungen: "}, - {".Empty.value.", "(Leerer Wert)"}, - {"Extension.Request.", "Erweiterungsanforderung:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "PKCS #10-Zertifikatanforderung (Version 1.0)\nSubjekt: %s\nPublic Key: %s Format %s Schl\u00FCssel\n"}, - {"Unknown.keyUsage.type.", "Unbekannter keyUsage-Typ: "}, - {"Unknown.extendedkeyUsage.type.", "Unbekannter extendedkeyUsage-Typ: "}, - {"Unknown.AccessDescription.type.", "Unbekannter AccessDescription-Typ: "}, - {"Unrecognized.GeneralName.type.", "Unbekannter GeneralName-Typ: "}, - {"This.extension.cannot.be.marked.as.critical.", - "Erweiterung kann nicht als \"Kritisch\" markiert werden. "}, - {"Odd.number.of.hex.digits.found.", "Ungerade Anzahl hexadezimaler Ziffern gefunden: "}, - {"Unknown.extension.type.", "Unbekannter Erweiterungstyp: "}, - {"command.{0}.is.ambiguous.", "Befehl {0} ist mehrdeutig:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "Warnung: Kein Public Key f\u00FCr Alias {0} vorhanden. Vergewissern Sie sich, dass der KeyStore ordnungsgem\u00E4\u00DF konfiguriert ist."}, - {"Warning.Class.not.found.class", "Warnung: Klasse nicht gefunden: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "Warnung: Ung\u00FCltige(s) Argument(e) f\u00FCr Constructor: {0}"}, - {"Illegal.Principal.Type.type", "Ung\u00FCltiger Principal-Typ: {0}"}, - {"Illegal.option.option", "Ung\u00FCltige Option: {0}"}, - {"Usage.policytool.options.", "Verwendung: policytool [Optionen]"}, - {".file.file.policy.file.location", - " [-file ] Policy-Dateiverzeichnis"}, - {"New", "Neu"}, - {"Open", "\u00D6ffnen"}, - {"Save", "Speichern"}, - {"Save.As", "Speichern unter"}, - {"View.Warning.Log", "Warnungslog anzeigen"}, - {"Exit", "Beenden"}, - {"Add.Policy.Entry", "Policy-Eintrag hinzuf\u00FCgen"}, - {"Edit.Policy.Entry", "Policy-Eintrag bearbeiten"}, - {"Remove.Policy.Entry", "Policy-Eintrag entfernen"}, - {"Edit", "Bearbeiten"}, - {"Retain", "Beibehalten"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "Warnung: M\u00F6glicherweise enth\u00E4lt der Dateiname Escape-Zeichen mit Backslash. Es ist nicht notwendig, Backslash-Zeichen zu escapen (das Tool f\u00FChrt dies automatisch beim Schreiben des Policy-Contents in den persistenten Speicher aus).\n\nKlicken Sie auf \"Beibehalten\", um den eingegebenen Namen beizubehalten oder auf \"Bearbeiten\", um den Namen zu bearbeiten."}, - - {"Add.Public.Key.Alias", "Public Key-Alias hinzuf\u00FCgen"}, - {"Remove.Public.Key.Alias", "Public Key-Alias entfernen"}, - {"File", "Datei"}, - {"KeyStore", "KeyStore"}, - {"Policy.File.", "Policy-Datei:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "Policy-Datei konnte nicht ge\u00F6ffnet werden: {0}: {1}"}, - {"Policy.Tool", "Policy-Tool"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "Beim \u00D6ffnen der Policy-Konfiguration sind Fehler aufgetreten. Weitere Informationen finden Sie im Warnungslog."}, - {"Error", "Fehler"}, - {"OK", "OK"}, - {"Status", "Status"}, - {"Warning", "Warnung"}, - {"Permission.", - "Berechtigung: "}, - {"Principal.Type.", "Principal-Typ:"}, - {"Principal.Name.", "Principal-Name:"}, - {"Target.Name.", - "Zielname: "}, - {"Actions.", - "Aktionen: "}, - {"OK.to.overwrite.existing.file.filename.", - "Vorhandene Datei {0} \u00FCberschreiben?"}, - {"Cancel", "Abbrechen"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "Principal hinzuf\u00FCgen"}, - {"Edit.Principal", "Principal bearbeiten"}, - {"Remove.Principal", "Principal entfernen"}, - {"Principals.", "Principals:"}, - {".Add.Permission", " Berechtigung hinzuf\u00FCgen"}, - {".Edit.Permission", " Berechtigung bearbeiten"}, - {"Remove.Permission", "Berechtigung entfernen"}, - {"Done", "Fertig"}, - {"KeyStore.URL.", "KeyStore-URL:"}, - {"KeyStore.Type.", "KeyStore-Typ:"}, - {"KeyStore.Provider.", "KeyStore-Provider:"}, - {"KeyStore.Password.URL.", "KeyStore-Kennwort-URL:"}, - {"Principals", "Principals"}, - {".Edit.Principal.", " Principal bearbeiten:"}, - {".Add.New.Principal.", " Neuen Principal hinzuf\u00FCgen:"}, - {"Permissions", "Berechtigungen"}, - {".Edit.Permission.", " Berechtigung bearbeiten:"}, - {".Add.New.Permission.", " Neue Berechtigung hinzuf\u00FCgen:"}, - {"Signed.By.", "Signiert von:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "Principal kann nicht mit einer Platzhalterklasse ohne Platzhalternamen angegeben werden"}, - {"Cannot.Specify.Principal.without.a.Name", - "Principal kann nicht ohne einen Namen angegeben werden"}, - {"Permission.and.Target.Name.must.have.a.value", - "Berechtigung und Zielname m\u00FCssen einen Wert haben"}, - {"Remove.this.Policy.Entry.", "Diesen Policy-Eintrag entfernen?"}, - {"Overwrite.File", "Datei \u00FCberschreiben"}, - {"Policy.successfully.written.to.filename", - "Policy erfolgreich in {0} geschrieben"}, - {"null.filename", "Null-Dateiname"}, - {"Save.changes.", "\u00C4nderungen speichern?"}, - {"Yes", "Ja"}, - {"No", "Nein"}, - {"Policy.Entry", "Policy-Eintrag"}, - {"Save.Changes", "\u00C4nderungen speichern"}, - {"No.Policy.Entry.selected", "Kein Policy-Eintrag ausgew\u00E4hlt"}, - {"Unable.to.open.KeyStore.ex.toString.", - "KeyStore kann nicht ge\u00F6ffnet werden: {0}"}, - {"No.principal.selected", "Kein Principal ausgew\u00E4hlt"}, - {"No.permission.selected", "Keine Berechtigung ausgew\u00E4hlt"}, - {"name", "Name"}, - {"configuration.type", "Konfigurationstyp"}, - {"environment.variable.name", "Umgebungsvariablenname"}, - {"library.name", "Library-Name"}, - {"package.name", "Packagename"}, - {"policy.type", "Policy-Typ"}, - {"property.name", "Eigenschaftsname"}, - {"Principal.List", "Principal-Liste"}, - {"Permission.List", "Berechtigungsliste"}, - {"Code.Base", "Codebase"}, - {"KeyStore.U.R.L.", "KeyStore-URL:"}, - {"KeyStore.Password.U.R.L.", "KeyStore-Kennwort-URL:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "Ung\u00FCltige Nulleingabe(n)"}, {"actions.can.only.be.read.", "Aktionen k\u00F6nnen nur \"lesen\" sein"}, @@ -553,6 +58,7 @@ public class Resources_de extends java.util.ListResourceBundle { {"provided.null.OID.map", "Null-OID-Zuordnung angegeben"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "Ung\u00FCltiger Nullwert f\u00FCr AccessControlContext angegeben"}, {"invalid.null.action.provided", "Ung\u00FCltige Nullaktion angegeben"}, @@ -656,6 +162,7 @@ public class Resources_de extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_es.java b/jdk/src/share/classes/sun/security/util/Resources_es.java index 59dc88b9f45..8f2b296c818 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_es.java +++ b/jdk/src/share/classes/sun/security/util/Resources_es.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_es extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [Opci\u00F3n]..."}, - {"Options.", "Opciones:"}, - {"Use.keytool.help.for.all.available.commands", - "Utilice\"keytool -help\" para todos los comandos disponibles"}, - {"Key.and.Certificate.Management.Tool", - "Herramienta de Gesti\u00F3n de Certificados y Claves"}, - {"Commands.", "Comandos:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "Utilice \"keytool -command_name -help\" para la sintaxis de nombre_comando"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "Genera una solicitud de certificado"}, //-certreq - {"Changes.an.entry.s.alias", - "Cambia un alias de entrada"}, //-changealias - {"Deletes.an.entry", - "Suprime una entrada"}, //-delete - {"Exports.certificate", - "Exporta el certificado"}, //-exportcert - {"Generates.a.key.pair", - "Genera un par de claves"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "Genera un clave secreta"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "Genera un certificado a partir de una solicitud de certificado"}, //-gencert - {"Generates.CRL", "Genera CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "Importa entradas desde una base de datos de identidades JDK 1.1.x-style"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "Importa un certificado o una cadena de certificados"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "Importa una o todas las entradas desde otro almac\u00E9n de claves"}, //-importkeystore - {"Clones.a.key.entry", - "Clona una entrada de clave"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "Cambia la contrase\u00F1a de clave de una entrada"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "Enumera las entradas de un almac\u00E9n de claves"}, //-list - {"Prints.the.content.of.a.certificate", - "Imprime el contenido de un certificado"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "Imprime el contenido de una solicitud de certificado"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "Imprime el contenido de un archivo CRL"}, //-printcrl - {"Generates.a.self.signed.certificate", - "Genera un certificado autofirmado"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "Cambia la contrase\u00F1a de almac\u00E9n de un almac\u00E9n de claves"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "nombre de alias de la entrada que se va a procesar"}, //-alias - {"destination.alias", - "alias de destino"}, //-destalias - {"destination.key.password", - "contrase\u00F1a de clave de destino"}, //-destkeypass - {"destination.keystore.name", - "nombre de almac\u00E9n de claves de destino"}, //-destkeystore - {"destination.keystore.password.protected", - "almac\u00E9n de claves de destino protegido por contrase\u00F1a"}, //-destprotected - {"destination.keystore.provider.name", - "nombre de proveedor de almac\u00E9n de claves de destino"}, //-destprovidername - {"destination.keystore.password", - "contrase\u00F1a de almac\u00E9n de claves de destino"}, //-deststorepass - {"destination.keystore.type", - "tipo de almac\u00E9n de claves de destino"}, //-deststoretype - {"distinguished.name", - "nombre distintivo"}, //-dname - {"X.509.extension", - "extensi\u00F3n X.509"}, //-ext - {"output.file.name", - "nombre de archivo de salida"}, //-file and -outfile - {"input.file.name", - "nombre de archivo de entrada"}, //-file and -infile - {"key.algorithm.name", - "nombre de algoritmo de clave"}, //-keyalg - {"key.password", - "contrase\u00F1a de clave"}, //-keypass - {"key.bit.size", - "tama\u00F1o de bit de clave"}, //-keysize - {"keystore.name", - "nombre de almac\u00E9n de claves"}, //-keystore - {"new.password", - "nueva contrase\u00F1a"}, //-new - {"do.not.prompt", - "no solicitar"}, //-noprompt - {"password.through.protected.mechanism", - "contrase\u00F1a a trav\u00E9s de mecanismo protegido"}, //-protected - {"provider.argument", - "argumento del proveedor"}, //-providerarg - {"provider.class.name", - "nombre de clase del proveedor"}, //-providerclass - {"provider.name", - "nombre del proveedor"}, //-providername - {"provider.classpath", - "classpath de proveedor"}, //-providerpath - {"output.in.RFC.style", - "salida en estilo RFC"}, //-rfc - {"signature.algorithm.name", - "nombre de algoritmo de firma"}, //-sigalg - {"source.alias", - "alias de origen"}, //-srcalias - {"source.key.password", - "contrase\u00F1a de clave de origen"}, //-srckeypass - {"source.keystore.name", - "nombre de almac\u00E9n de claves de origen"}, //-srckeystore - {"source.keystore.password.protected", - "almac\u00E9n de claves de origen protegido por contrase\u00F1a"}, //-srcprotected - {"source.keystore.provider.name", - "nombre de proveedor de almac\u00E9n de claves de origen"}, //-srcprovidername - {"source.keystore.password", - "contrase\u00F1a de almac\u00E9n de claves de origen"}, //-srcstorepass - {"source.keystore.type", - "tipo de almac\u00E9n de claves de origen"}, //-srcstoretype - {"SSL.server.host.and.port", - "puerto y host del servidor SSL"}, //-sslserver - {"signed.jar.file", - "archivo jar firmado"}, //=jarfile - {"certificate.validity.start.date.time", - "fecha/hora de inicio de validez del certificado"}, //-startdate - {"keystore.password", - "contrase\u00F1a de almac\u00E9n de claves"}, //-storepass - {"keystore.type", - "tipo de almac\u00E9n de claves"}, //-storetype - {"trust.certificates.from.cacerts", - "certificados de protecci\u00F3n de cacerts"}, //-trustcacerts - {"verbose.output", - "salida detallada"}, //-v - {"validity.number.of.days", - "n\u00FAmero de validez de d\u00EDas"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "identificador de serie del certificado que se va a revocar"}, //-id - // keytool: Running part - {"keytool.error.", "error de herramienta de claves: "}, - {"Illegal.option.", "Opci\u00F3n no permitida: "}, - {"Illegal.value.", "Valor no permitido: "}, - {"Unknown.password.type.", "Tipo de contrase\u00F1a desconocido: "}, - {"Cannot.find.environment.variable.", - "No se ha encontrado la variable del entorno: "}, - {"Cannot.find.file.", "No se ha encontrado el archivo: "}, - {"Command.option.flag.needs.an.argument.", "La opci\u00F3n de comando {0} necesita un argumento."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "Advertencia: los almacenes de claves en formato PKCS12 no admiten contrase\u00F1as de clave y almacenamiento distintas. Se ignorar\u00E1 el valor especificado por el usuario, {0}."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-keystore debe ser NONE si -storetype es {0}"}, - {"Too.many.retries.program.terminated", - "Ha habido demasiados intentos, se ha cerrado el programa"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "Los comandos -storepasswd y -keypasswd no est\u00E1n soportados si -storetype es {0}"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "Los comandos -keypasswd no est\u00E1n soportados si -storetype es PKCS12"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "-keypass y -new no se pueden especificar si -storetype es {0}"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "si se especifica -protected, no deben especificarse -storepass, -keypass ni -new"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Si se especifica -srcprotected, no se puede especificar -srcstorepass ni -srckeypass"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "Si keystore no est\u00E1 protegido por contrase\u00F1a, no se deben especificar -storepass, -keypass ni -new"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Si el almac\u00E9n de claves de origen no est\u00E1 protegido por contrase\u00F1a, no se deben especificar -srcstorepass ni -srckeypass"}, - {"Illegal.startdate.value", "Valor de fecha de inicio no permitido"}, - {"Validity.must.be.greater.than.zero", - "La validez debe ser mayor que cero"}, - {"provName.not.a.provider", "{0} no es un proveedor"}, - {"Usage.error.no.command.provided", "Error de sintaxis: no se ha proporcionado ning\u00FAn comando"}, - {"Source.keystore.file.exists.but.is.empty.", "El archivo de almac\u00E9n de claves de origen existe, pero est\u00E1 vac\u00EDo: "}, - {"Please.specify.srckeystore", "Especifique -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "No se deben especificar -v y -rfc simult\u00E1neamente con el comando 'list'"}, - {"Key.password.must.be.at.least.6.characters", - "La contrase\u00F1a de clave debe tener al menos 6 caracteres"}, - {"New.password.must.be.at.least.6.characters", - "La nueva contrase\u00F1a debe tener al menos 6 caracteres"}, - {"Keystore.file.exists.but.is.empty.", - "El archivo de almac\u00E9n de claves existe, pero est\u00E1 vac\u00EDo: "}, - {"Keystore.file.does.not.exist.", - "El archivo de almac\u00E9n de claves no existe: "}, - {"Must.specify.destination.alias", "Se debe especificar un alias de destino"}, - {"Must.specify.alias", "Se debe especificar un alias"}, - {"Keystore.password.must.be.at.least.6.characters", - "La contrase\u00F1a del almac\u00E9n de claves debe tener al menos 6 caracteres"}, - {"Enter.keystore.password.", "Introduzca la contrase\u00F1a del almac\u00E9n de claves: "}, - {"Enter.source.keystore.password.", "Introduzca la contrase\u00F1a de almac\u00E9n de claves de origen: "}, - {"Enter.destination.keystore.password.", "Introduzca la contrase\u00F1a de almac\u00E9n de claves de destino: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "La contrase\u00F1a del almac\u00E9n de claves es demasiado corta, debe tener al menos 6 caracteres"}, - {"Unknown.Entry.Type", "Tipo de Entrada Desconocido"}, - {"Too.many.failures.Alias.not.changed", "Demasiados fallos. No se ha cambiado el alias"}, - {"Entry.for.alias.alias.successfully.imported.", - "La entrada del alias {0} se ha importado correctamente."}, - {"Entry.for.alias.alias.not.imported.", "La entrada del alias {0} no se ha importado."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "Problema al importar la entrada del alias {0}: {1}.\nNo se ha importado la entrada del alias {0}."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "Comando de importaci\u00F3n completado: {0} entradas importadas correctamente, {1} entradas incorrectas o canceladas"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "Advertencia: se sobrescribir\u00E1 el alias {0} en el almac\u00E9n de claves de destino"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "El alias de entrada existente {0} ya existe, \u00BFdesea sobrescribirlo? [no]: "}, - {"Too.many.failures.try.later", "Demasiados fallos; int\u00E9ntelo m\u00E1s adelante"}, - {"Certification.request.stored.in.file.filename.", - "Solicitud de certificaci\u00F3n almacenada en el archivo <{0}>"}, - {"Submit.this.to.your.CA", "Enviar a la CA"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "si no se especifica el alias, no se puede especificar destalias, srckeypass ni destkeypass"}, - {"Certificate.stored.in.file.filename.", - "Certificado almacenado en el archivo <{0}>"}, - {"Certificate.reply.was.installed.in.keystore", - "Se ha instalado la respuesta del certificado en el almac\u00E9n de claves"}, - {"Certificate.reply.was.not.installed.in.keystore", - "No se ha instalado la respuesta del certificado en el almac\u00E9n de claves"}, - {"Certificate.was.added.to.keystore", - "Se ha agregado el certificado al almac\u00E9n de claves"}, - {"Certificate.was.not.added.to.keystore", - "No se ha agregado el certificado al almac\u00E9n de claves"}, - {".Storing.ksfname.", "[Almacenando {0}]"}, - {"alias.has.no.public.key.certificate.", - "{0} no tiene clave p\u00FAblica (certificado)"}, - {"Cannot.derive.signature.algorithm", - "No se puede derivar el algoritmo de firma"}, - {"Alias.alias.does.not.exist", - "El alias <{0}> no existe"}, - {"Alias.alias.has.no.certificate", - "El alias <{0}> no tiene certificado"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "No se ha generado el par de claves, el alias <{0}> ya existe"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "Generando par de claves {1} de {0} bits para certificado autofirmado ({2}) con una validez de {3} d\u00EDas\n\tpara: {4}"}, - {"Enter.key.password.for.alias.", "Introduzca la contrase\u00F1a de clave para <{0}>"}, - {".RETURN.if.same.as.keystore.password.", - "\t(INTRO si es la misma contrase\u00F1a que la del almac\u00E9n de claves): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "La contrase\u00F1a de clave es demasiado corta; debe tener al menos 6 caracteres"}, - {"Too.many.failures.key.not.added.to.keystore", - "Demasiados fallos; no se ha agregado la clave al almac\u00E9n de claves"}, - {"Destination.alias.dest.already.exists", - "El alias de destino <{0}> ya existe"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "La contrase\u00F1a es demasiado corta; debe tener al menos 6 caracteres"}, - {"Too.many.failures.Key.entry.not.cloned", - "Demasiados fallos. No se ha clonado la entrada de clave"}, - {"key.password.for.alias.", "contrase\u00F1a de clave para <{0}>"}, - {"Keystore.entry.for.id.getName.already.exists", - "La entrada de almac\u00E9n de claves para <{0}> ya existe"}, - {"Creating.keystore.entry.for.id.getName.", - "Creando entrada de almac\u00E9n de claves para <{0}> ..."}, - {"No.entries.from.identity.database.added", - "No se han agregado entradas de la base de datos de identidades"}, - {"Alias.name.alias", "Nombre de Alias: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "Fecha de Creaci\u00F3n: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "Tipo de Entrada: {0}"}, - {"Certificate.chain.length.", "Longitud de la Cadena de Certificado: "}, - {"Certificate.i.1.", "Certificado[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "Huella Digital de Certificado (SHA1): "}, - {"Keystore.type.", "Tipo de Almac\u00E9n de Claves: "}, - {"Keystore.provider.", "Proveedor de Almac\u00E9n de Claves: "}, - {"Your.keystore.contains.keyStore.size.entry", - "Su almac\u00E9n de claves contiene {0,number,integer} entrada"}, - {"Your.keystore.contains.keyStore.size.entries", - "Su almac\u00E9n de claves contiene {0,number,integer} entradas"}, - {"Failed.to.parse.input", "Fallo al analizar la entrada"}, - {"Empty.input", "Entrada vac\u00EDa"}, - {"Not.X.509.certificate", "No es un certificado X.509"}, - {"alias.has.no.public.key", "{0} no tiene clave p\u00FAblica"}, - {"alias.has.no.X.509.certificate", "{0} no tiene certificado X.509"}, - {"New.certificate.self.signed.", "Nuevo Certificado (Autofirmado):"}, - {"Reply.has.no.certificates", "La respuesta no tiene certificados"}, - {"Certificate.not.imported.alias.alias.already.exists", - "Certificado no importado, el alias <{0}> ya existe"}, - {"Input.not.an.X.509.certificate", "La entrada no es un certificado X.509"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "El certificado ya existe en el almac\u00E9n de claves con el alias <{0}>"}, - {"Do.you.still.want.to.add.it.no.", - "\u00BFA\u00FAn desea agregarlo? [no]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "El certificado ya existe en el almac\u00E9n de claves de la CA del sistema, con el alias <{0}>"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "\u00BFA\u00FAn desea agregarlo a su propio almac\u00E9n de claves? [no]: "}, - {"Trust.this.certificate.no.", "\u00BFConfiar en este certificado? [no]: "}, - {"YES", "S\u00ED"}, - {"New.prompt.", "Nuevo {0}: "}, - {"Passwords.must.differ", "Las contrase\u00F1as deben ser distintas"}, - {"Re.enter.new.prompt.", "Vuelva a escribir el nuevo {0}: "}, - {"Re.enter.new.password.", "Volver a escribir la contrase\u00F1a nueva: "}, - {"They.don.t.match.Try.again", "No coinciden. Int\u00E9ntelo de nuevo"}, - {"Enter.prompt.alias.name.", "Escriba el nombre de alias de {0}: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "Indique el nuevo nombre de alias\t(INTRO para cancelar la importaci\u00F3n de esta entrada): "}, - {"Enter.alias.name.", "Introduzca el nombre de alias: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(INTRO si es el mismo que para <{0}>)"}, - {".PATTERN.printX509Cert", - "Propietario: {0}\nEmisor: {1}\nN\u00FAmero de serie: {2}\nV\u00E1lido desde: {3} hasta: {4}\nHuellas digitales del Certificado:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Nombre del Algoritmo de Firma: {8}\n\t Versi\u00F3n: {9}"}, - {"What.is.your.first.and.last.name.", - "\u00BFCu\u00E1les son su nombre y su apellido?"}, - {"What.is.the.name.of.your.organizational.unit.", - "\u00BFCu\u00E1l es el nombre de su unidad de organizaci\u00F3n?"}, - {"What.is.the.name.of.your.organization.", - "\u00BFCu\u00E1l es el nombre de su organizaci\u00F3n?"}, - {"What.is.the.name.of.your.City.or.Locality.", - "\u00BFCu\u00E1l es el nombre de su ciudad o localidad?"}, - {"What.is.the.name.of.your.State.or.Province.", - "\u00BFCu\u00E1l es el nombre de su estado o provincia?"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "\u00BFCu\u00E1l es el c\u00F3digo de pa\u00EDs de dos letras de la unidad?"}, - {"Is.name.correct.", "\u00BFEs correcto {0}?"}, - {"no", "no"}, - {"yes", "s\u00ED"}, - {"y", "s"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "El alias <{0}> no tiene clave"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "El alias <{0}> hace referencia a un tipo de entrada que no es una clave privada. El comando -keyclone s\u00F3lo permite la clonaci\u00F3n de entradas de claves privadas"}, - - {".WARNING.WARNING.WARNING.", - "***************** Advertencia Advertencia Advertencia *****************"}, - {"Signer.d.", "#%d de Firmante:"}, - {"Timestamp.", "Registro de Hora:"}, - {"Signature.", "Firma:"}, - {"CRLs.", "CRL:"}, - {"Certificate.owner.", "Propietario del Certificado: "}, - {"Not.a.signed.jar.file", "No es un archivo jar firmado"}, - {"No.certificate.from.the.SSL.server", - "Ning\u00FAn certificado del servidor SSL"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* La integridad de la informaci\u00F3n almacenada en el almac\u00E9n de claves *\n* NO se ha comprobado. Para comprobar dicha integridad, *\n* debe proporcionar la contrase\u00F1a del almac\u00E9n de claves. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* La integridad de la informaci\u00F3n almacenada en srckeystore*\n* NO se ha comprobado. Para comprobar dicha integridad, *\n* debe proporcionar la contrase\u00F1a de srckeystore. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "La respuesta de certificado no contiene una clave p\u00FAblica para <{0}>"}, - {"Incomplete.certificate.chain.in.reply", - "Cadena de certificado incompleta en la respuesta"}, - {"Certificate.chain.in.reply.does.not.verify.", - "La cadena de certificado de la respuesta no verifica: "}, - {"Top.level.certificate.in.reply.", - "Certificado de nivel superior en la respuesta:\n"}, - {".is.not.trusted.", "... no es de confianza. "}, - {"Install.reply.anyway.no.", "\u00BFInstalar respuesta de todos modos? [no]: "}, - {"NO", "No"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "Las claves p\u00FAblicas en la respuesta y en el almac\u00E9n de claves no coinciden"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "La respuesta del certificado y el certificado en el almac\u00E9n de claves son id\u00E9nticos"}, - {"Failed.to.establish.chain.from.reply", - "No se ha podido definir una cadena a partir de la respuesta"}, - {"n", "n"}, - {"Wrong.answer.try.again", "Respuesta incorrecta, vuelva a intentarlo"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "No se ha generado la clave secreta, el alias <{0}> ya existe"}, - {"Please.provide.keysize.for.secret.key.generation", - "Proporcione el valor de -keysize para la generaci\u00F3n de claves secretas"}, - - {"Extensions.", "Extensiones: "}, - {".Empty.value.", "(Valor vac\u00EDo)"}, - {"Extension.Request.", "Solicitud de Extensi\u00F3n:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "Solicitud de Certificado PKCS #10 (Versi\u00F3n 1.0)\nAsunto: %s\nClave P\u00FAblica: %s formato %s clave\n"}, - {"Unknown.keyUsage.type.", "Tipo de uso de clave desconocido: "}, - {"Unknown.extendedkeyUsage.type.", "Tipo de uso de clave extendida desconocido: "}, - {"Unknown.AccessDescription.type.", "Tipo de descripci\u00F3n de acceso desconocido: "}, - {"Unrecognized.GeneralName.type.", "Tipo de nombre general no reconocido: "}, - {"This.extension.cannot.be.marked.as.critical.", - "Esta extensi\u00F3n no se puede marcar como cr\u00EDtica. "}, - {"Odd.number.of.hex.digits.found.", "Se ha encontrado un n\u00FAmero impar de d\u00EDgitos hexadecimales: "}, - {"Unknown.extension.type.", "Tipo de extensi\u00F3n desconocida: "}, - {"command.{0}.is.ambiguous.", "El comando {0} es ambiguo:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "Advertencia: no hay clave p\u00FAblica para el alias {0}. Aseg\u00FArese de que se ha configurado correctamente un almac\u00E9n de claves."}, - {"Warning.Class.not.found.class", "Advertencia: no se ha encontrado la clase: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "Advertencia: argumento(s) no v\u00E1lido(s) para el constructor: {0}"}, - {"Illegal.Principal.Type.type", "Tipo de principal no permitido: {0}"}, - {"Illegal.option.option", "Opci\u00F3n no permitida: {0}"}, - {"Usage.policytool.options.", "Sintaxis: policytool [opciones]"}, - {".file.file.policy.file.location", - " [-file ] ubicaci\u00F3n del archivo de normas"}, - {"New", "Nuevo"}, - {"Open", "Abrir"}, - {"Save", "Guardar"}, - {"Save.As", "Guardar como"}, - {"View.Warning.Log", "Ver Log de Advertencias"}, - {"Exit", "Salir"}, - {"Add.Policy.Entry", "Agregar Entrada de Pol\u00EDtica"}, - {"Edit.Policy.Entry", "Editar Entrada de Pol\u00EDtica"}, - {"Remove.Policy.Entry", "Eliminar Entrada de Pol\u00EDtica"}, - {"Edit", "Editar"}, - {"Retain", "Mantener"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "Advertencia: el nombre del archivo puede contener caracteres de barra invertida de escape. No es necesario utilizar barras invertidas de escape (la herramienta aplica caracteres de escape seg\u00FAn sea necesario al escribir el contenido de las pol\u00EDticas en el almac\u00E9n persistente).\n\nHaga clic en Mantener para conservar el nombre introducido o en Editar para modificarlo."}, - - {"Add.Public.Key.Alias", "Agregar Alias de Clave P\u00FAblico"}, - {"Remove.Public.Key.Alias", "Eliminar Alias de Clave P\u00FAblico"}, - {"File", "Archivo"}, - {"KeyStore", "Almac\u00E9n de Claves"}, - {"Policy.File.", "Archivo de Pol\u00EDtica:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "No se ha podido abrir el archivo de pol\u00EDtica: {0}: {1}"}, - {"Policy.Tool", "Herramienta de Pol\u00EDticas"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "Ha habido errores al abrir la configuraci\u00F3n de pol\u00EDticas. V\u00E9ase el log de advertencias para obtener m\u00E1s informaci\u00F3n."}, - {"Error", "Error"}, - {"OK", "Aceptar"}, - {"Status", "Estado"}, - {"Warning", "Advertencia"}, - {"Permission.", - "Permiso: "}, - {"Principal.Type.", "Tipo de Principal:"}, - {"Principal.Name.", "Nombre de Principal:"}, - {"Target.Name.", - "Nombre de Destino: "}, - {"Actions.", - "Acciones: "}, - {"OK.to.overwrite.existing.file.filename.", - "\u00BFSobrescribir el archivo existente {0}?"}, - {"Cancel", "Cancelar"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "Agregar Principal"}, - {"Edit.Principal", "Editar Principal"}, - {"Remove.Principal", "Eliminar Principal"}, - {"Principals.", "Principales:"}, - {".Add.Permission", " Agregar Permiso"}, - {".Edit.Permission", " Editar Permiso"}, - {"Remove.Permission", "Eliminar Permiso"}, - {"Done", "Listo"}, - {"KeyStore.URL.", "URL de Almac\u00E9n de Claves:"}, - {"KeyStore.Type.", "Tipo de Almac\u00E9n de Claves:"}, - {"KeyStore.Provider.", "Proveedor de Almac\u00E9n de Claves:"}, - {"KeyStore.Password.URL.", "URL de Contrase\u00F1a de Almac\u00E9n de Claves:"}, - {"Principals", "Principales"}, - {".Edit.Principal.", " Editar Principal:"}, - {".Add.New.Principal.", " Agregar Nuevo Principal:"}, - {"Permissions", "Permisos"}, - {".Edit.Permission.", " Editar Permiso:"}, - {".Add.New.Permission.", " Agregar Permiso Nuevo:"}, - {"Signed.By.", "Firmado Por:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "No se puede especificar un principal con una clase de comod\u00EDn sin un nombre de comod\u00EDn"}, - {"Cannot.Specify.Principal.without.a.Name", - "No se puede especificar el principal sin un nombre"}, - {"Permission.and.Target.Name.must.have.a.value", - "Permiso y Nombre de Destino deben tener un valor"}, - {"Remove.this.Policy.Entry.", "\u00BFEliminar esta entrada de pol\u00EDtica?"}, - {"Overwrite.File", "Sobrescribir Archivo"}, - {"Policy.successfully.written.to.filename", - "Pol\u00EDtica escrita correctamente en {0}"}, - {"null.filename", "nombre de archivo nulo"}, - {"Save.changes.", "\u00BFGuardar los cambios?"}, - {"Yes", "S\u00ED"}, - {"No", "No"}, - {"Policy.Entry", "Entrada de Pol\u00EDtica"}, - {"Save.Changes", "Guardar Cambios"}, - {"No.Policy.Entry.selected", "No se ha seleccionado la entrada de pol\u00EDtica"}, - {"Unable.to.open.KeyStore.ex.toString.", - "No se ha podido abrir el almac\u00E9n de claves: {0}"}, - {"No.principal.selected", "No se ha seleccionado un principal"}, - {"No.permission.selected", "No se ha seleccionado un permiso"}, - {"name", "nombre"}, - {"configuration.type", "tipo de configuraci\u00F3n"}, - {"environment.variable.name", "nombre de variable de entorno"}, - {"library.name", "nombre de la biblioteca"}, - {"package.name", "nombre del paquete"}, - {"policy.type", "tipo de pol\u00EDtica"}, - {"property.name", "nombre de la propiedad"}, - {"Principal.List", "Lista de Principales"}, - {"Permission.List", "Lista de Permisos"}, - {"Code.Base", "Base de C\u00F3digo"}, - {"KeyStore.U.R.L.", "URL de Almac\u00E9n de Claves:"}, - {"KeyStore.Password.U.R.L.", "URL de Contrase\u00F1a de Almac\u00E9n de Claves:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "entradas nulas no v\u00E1lidas"}, {"actions.can.only.be.read.", "las acciones s\u00F3lo pueden 'leerse'"}, @@ -553,6 +58,7 @@ public class Resources_es extends java.util.ListResourceBundle { {"provided.null.OID.map", "mapa de OID proporcionado nulo"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "se ha proporcionado un AccessControlContext nulo no v\u00E1lido"}, {"invalid.null.action.provided", "se ha proporcionado una acci\u00F3n nula no v\u00E1lida"}, @@ -656,6 +162,7 @@ public class Resources_es extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_fr.java b/jdk/src/share/classes/sun/security/util/Resources_fr.java index 385b61853dc..a82a2e49420 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_fr.java +++ b/jdk/src/share/classes/sun/security/util/Resources_fr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_fr extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [Option]..."}, - {"Options.", "Options :"}, - {"Use.keytool.help.for.all.available.commands", - "Utiliser \"keytool -help\" pour toutes les commandes disponibles"}, - {"Key.and.Certificate.Management.Tool", - "Outil de gestion de certificats et de cl\u00E9s"}, - {"Commands.", "Commandes :"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "Utiliser \"keytool -command_name -help\" pour la syntaxe de command_name"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "G\u00E9n\u00E8re une demande de certificat"}, //-certreq - {"Changes.an.entry.s.alias", - "Modifie l'alias d'une entr\u00E9e"}, //-changealias - {"Deletes.an.entry", - "Supprime une entr\u00E9e"}, //-delete - {"Exports.certificate", - "Exporte le certificat"}, //-exportcert - {"Generates.a.key.pair", - "G\u00E9n\u00E8re une paire de cl\u00E9s"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "G\u00E9n\u00E8re une cl\u00E9 secr\u00E8te"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "G\u00E9n\u00E8re le certificat \u00E0 partir d'une demande de certificat"}, //-gencert - {"Generates.CRL", "G\u00E9n\u00E8re la liste des certificats r\u00E9voqu\u00E9s (CRL)"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "Importe les entr\u00E9es \u00E0 partir d'une base de donn\u00E9es d'identit\u00E9s de type JDK 1.1.x"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "Importe un certificat ou une cha\u00EEne de certificat"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "Importe une entr\u00E9e ou la totalit\u00E9 des entr\u00E9es depuis un autre fichier de cl\u00E9s"}, //-importkeystore - {"Clones.a.key.entry", - "Clone une entr\u00E9e de cl\u00E9"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "Modifie le mot de passe de cl\u00E9 d'une entr\u00E9e"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "R\u00E9pertorie les entr\u00E9es d'un fichier de cl\u00E9s"}, //-list - {"Prints.the.content.of.a.certificate", - "Imprime le contenu d'un certificat"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "Imprime le contenu d'une demande de certificat"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "Imprime le contenu d'un fichier de liste des certificats r\u00E9voqu\u00E9s (CRL)"}, //-printcrl - {"Generates.a.self.signed.certificate", - "G\u00E9n\u00E8re un certificat auto-sign\u00E9"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "Modifie le mot de passe de banque d'un fichier de cl\u00E9s"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "nom d'alias de l'entr\u00E9e \u00E0 traiter"}, //-alias - {"destination.alias", - "alias de destination"}, //-destalias - {"destination.key.password", - "mot de passe de la cl\u00E9 de destination"}, //-destkeypass - {"destination.keystore.name", - "nom du fichier de cl\u00E9s de destination"}, //-destkeystore - {"destination.keystore.password.protected", - "mot de passe du fichier de cl\u00E9s de destination prot\u00E9g\u00E9"}, //-destprotected - {"destination.keystore.provider.name", - "nom du fournisseur du fichier de cl\u00E9s de destination"}, //-destprovidername - {"destination.keystore.password", - "mot de passe du fichier de cl\u00E9s de destination"}, //-deststorepass - {"destination.keystore.type", - "type du fichier de cl\u00E9s de destination"}, //-deststoretype - {"distinguished.name", - "nom distinctif"}, //-dname - {"X.509.extension", - "extension X.509"}, //-ext - {"output.file.name", - "nom du fichier de sortie"}, //-file and -outfile - {"input.file.name", - "nom du fichier d'entr\u00E9e"}, //-file and -infile - {"key.algorithm.name", - "nom de l'algorithme de cl\u00E9"}, //-keyalg - {"key.password", - "mot de passe de la cl\u00E9"}, //-keypass - {"key.bit.size", - "taille en bits de la cl\u00E9"}, //-keysize - {"keystore.name", - "nom du fichier de cl\u00E9s"}, //-keystore - {"new.password", - "nouveau mot de passe"}, //-new - {"do.not.prompt", - "ne pas inviter"}, //-noprompt - {"password.through.protected.mechanism", - "mot de passe via m\u00E9canisme prot\u00E9g\u00E9"}, //-protected - {"provider.argument", - "argument du fournisseur"}, //-providerarg - {"provider.class.name", - "nom de la classe de fournisseur"}, //-providerclass - {"provider.name", - "nom du fournisseur"}, //-providername - {"provider.classpath", - "variable d'environnement CLASSPATH du fournisseur"}, //-providerpath - {"output.in.RFC.style", - "sortie au style RFC"}, //-rfc - {"signature.algorithm.name", - "nom de l'algorithme de signature"}, //-sigalg - {"source.alias", - "alias source"}, //-srcalias - {"source.key.password", - "mot de passe de la cl\u00E9 source"}, //-srckeypass - {"source.keystore.name", - "nom du fichier de cl\u00E9s source"}, //-srckeystore - {"source.keystore.password.protected", - "mot de passe du fichier de cl\u00E9s source prot\u00E9g\u00E9"}, //-srcprotected - {"source.keystore.provider.name", - "nom du fournisseur du fichier de cl\u00E9s source"}, //-srcprovidername - {"source.keystore.password", - "mot de passe du fichier de cl\u00E9s source"}, //-srcstorepass - {"source.keystore.type", - "type du fichier de cl\u00E9s source"}, //-srcstoretype - {"SSL.server.host.and.port", - "Port et h\u00F4te du serveur SSL"}, //-sslserver - {"signed.jar.file", - "fichier JAR sign\u00E9"}, //=jarfile - {"certificate.validity.start.date.time", - "date/heure de d\u00E9but de validit\u00E9 du certificat"}, //-startdate - {"keystore.password", - "mot de passe du fichier de cl\u00E9s"}, //-storepass - {"keystore.type", - "type du fichier de cl\u00E9s"}, //-storetype - {"trust.certificates.from.cacerts", - "certificats s\u00E9curis\u00E9s issus de certificats CA"}, //-trustcacerts - {"verbose.output", - "sortie en mode verbose"}, //-v - {"validity.number.of.days", - "nombre de jours de validit\u00E9"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "ID de s\u00E9rie du certificat \u00E0 r\u00E9voquer"}, //-id - // keytool: Running part - {"keytool.error.", "erreur keytool : "}, - {"Illegal.option.", "Option non admise : "}, - {"Illegal.value.", "Valeur non admise : "}, - {"Unknown.password.type.", "Type de mot de passe inconnu : "}, - {"Cannot.find.environment.variable.", - "Variable d'environnement introuvable : "}, - {"Cannot.find.file.", "Fichier introuvable : "}, - {"Command.option.flag.needs.an.argument.", "L''option de commande {0} requiert un argument."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "Avertissement\u00A0: les mots de passe de cl\u00E9 et de banque distincts ne sont pas pris en charge pour les fichiers de cl\u00E9s d''acc\u00E8s PKCS12. La valeur {0} sp\u00E9cifi\u00E9e par l''utilisateur est ignor\u00E9e."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-keystore doit \u00EAtre d\u00E9fini sur NONE si -storetype est {0}"}, - {"Too.many.retries.program.terminated", - "Trop de tentatives, fin du programme"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "Les commandes -storepasswd et -keypasswd ne sont pas prises en charge si -storetype est d\u00E9fini sur {0}"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "Les commandes -keypasswd ne sont pas prises en charge si -storetype est d\u00E9fini sur PKCS12"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "Les commandes -keypass et -new ne peuvent pas \u00EAtre sp\u00E9cifi\u00E9es si -storetype est d\u00E9fini sur {0}"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "si -protected est sp\u00E9cifi\u00E9, -storepass, -keypass et -new ne doivent pas \u00EAtre indiqu\u00E9s"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Si -srcprotected est indiqu\u00E9, les commandes -srcstorepass et -srckeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9es"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "Si le fichier de cl\u00E9s n'est pas prot\u00E9g\u00E9 par un mot de passe, les commandes -storepass, -keypass et -new ne doivent pas \u00EAtre sp\u00E9cifi\u00E9es"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Si le fichier de cl\u00E9s source n'est pas prot\u00E9g\u00E9 par un mot de passe, les commandes -srcstorepass et -srckeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9es"}, - {"Illegal.startdate.value", "Valeur de date de d\u00E9but non admise"}, - {"Validity.must.be.greater.than.zero", - "La validit\u00E9 doit \u00EAtre sup\u00E9rieure \u00E0 z\u00E9ro"}, - {"provName.not.a.provider", "{0} n''est pas un fournisseur"}, - {"Usage.error.no.command.provided", "Erreur de syntaxe\u00A0: aucune commande fournie"}, - {"Source.keystore.file.exists.but.is.empty.", "Le fichier de cl\u00E9s source existe mais il est vide : "}, - {"Please.specify.srckeystore", "Indiquez -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "-v et -rfc ne doivent pas \u00EAtre sp\u00E9cifi\u00E9s avec la commande 'list'"}, - {"Key.password.must.be.at.least.6.characters", - "Un mot de passe de cl\u00E9 doit comporter au moins 6 caract\u00E8res"}, - {"New.password.must.be.at.least.6.characters", - "Le nouveau mot de passe doit comporter au moins 6 caract\u00E8res"}, - {"Keystore.file.exists.but.is.empty.", - "Fichier de cl\u00E9s existant mais vide : "}, - {"Keystore.file.does.not.exist.", - "Le fichier de cl\u00E9s n'existe pas : "}, - {"Must.specify.destination.alias", "L'alias de destination doit \u00EAtre sp\u00E9cifi\u00E9"}, - {"Must.specify.alias", "L'alias doit \u00EAtre sp\u00E9cifi\u00E9"}, - {"Keystore.password.must.be.at.least.6.characters", - "Un mot de passe de fichier de cl\u00E9s doit comporter au moins 6 caract\u00E8res"}, - {"Enter.keystore.password.", "Entrez le mot de passe du fichier de cl\u00E9s : "}, - {"Enter.source.keystore.password.", "Entrez le mot de passe du fichier de cl\u00E9s source\u00A0: "}, - {"Enter.destination.keystore.password.", "Entrez le mot de passe du fichier de cl\u00E9s de destination\u00A0: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "Le mot de passe du fichier de cl\u00E9s est trop court : il doit comporter au moins 6 caract\u00E8res"}, - {"Unknown.Entry.Type", "Type d'entr\u00E9e inconnu"}, - {"Too.many.failures.Alias.not.changed", "Trop d'erreurs. Alias non modifi\u00E9"}, - {"Entry.for.alias.alias.successfully.imported.", - "L''entr\u00E9e de l''alias {0} a \u00E9t\u00E9 import\u00E9e."}, - {"Entry.for.alias.alias.not.imported.", "L''entr\u00E9e de l''alias {0} n''a pas \u00E9t\u00E9 import\u00E9e."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "Probl\u00E8me lors de l''import de l''entr\u00E9e de l''alias {0}\u00A0: {1}.\nL''entr\u00E9e de l''alias {0} n''a pas \u00E9t\u00E9 import\u00E9e."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "Commande d''import ex\u00E9cut\u00E9e\u00A0: {0} entr\u00E9es import\u00E9es, \u00E9chec ou annulation de {1} entr\u00E9es"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "Avertissement\u00A0: l''alias {0} existant sera remplac\u00E9 dans le fichier de cl\u00E9s d''acc\u00E8s de destination"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "L''alias d''entr\u00E9e {0} existe d\u00E9j\u00E0. Voulez-vous le remplacer ? [non]\u00A0: "}, - {"Too.many.failures.try.later", "Trop d'erreurs. R\u00E9essayez plus tard"}, - {"Certification.request.stored.in.file.filename.", - "Demande de certification stock\u00E9e dans le fichier <{0}>"}, - {"Submit.this.to.your.CA", "Soumettre \u00E0 votre CA"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "si l'alias n'est pas sp\u00E9cifi\u00E9, destalias, srckeypass et destkeypass ne doivent pas \u00EAtre sp\u00E9cifi\u00E9s"}, - {"Certificate.stored.in.file.filename.", - "Certificat stock\u00E9 dans le fichier <{0}>"}, - {"Certificate.reply.was.installed.in.keystore", - "R\u00E9ponse de certificat install\u00E9e dans le fichier de cl\u00E9s"}, - {"Certificate.reply.was.not.installed.in.keystore", - "R\u00E9ponse de certificat non install\u00E9e dans le fichier de cl\u00E9s"}, - {"Certificate.was.added.to.keystore", - "Certificat ajout\u00E9 au fichier de cl\u00E9s"}, - {"Certificate.was.not.added.to.keystore", - "Certificat non ajout\u00E9 au fichier de cl\u00E9s"}, - {".Storing.ksfname.", "[Stockage de {0}]"}, - {"alias.has.no.public.key.certificate.", - "{0} ne poss\u00E8de pas de cl\u00E9 publique (certificat)"}, - {"Cannot.derive.signature.algorithm", - "Impossible de d\u00E9duire l'algorithme de signature"}, - {"Alias.alias.does.not.exist", - "L''alias <{0}> n''existe pas"}, - {"Alias.alias.has.no.certificate", - "L''alias <{0}> ne poss\u00E8de pas de certificat"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "Paire de cl\u00E9s non g\u00E9n\u00E9r\u00E9e, l''alias <{0}> existe d\u00E9j\u00E0"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "G\u00E9n\u00E9ration d''une paire de cl\u00E9s {1} de {0} bits et d''un certificat auto-sign\u00E9 ({2}) d''une validit\u00E9 de {3} jours\n\tpour : {4}"}, - {"Enter.key.password.for.alias.", "Entrez le mot de passe de la cl\u00E9 pour <{0}>"}, - {".RETURN.if.same.as.keystore.password.", - "\t(appuyez sur Entr\u00E9e s'il s'agit du mot de passe du fichier de cl\u00E9s) : "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "Le mot de passe de la cl\u00E9 est trop court : il doit comporter au moins 6 caract\u00E8res"}, - {"Too.many.failures.key.not.added.to.keystore", - "Trop d'erreurs. Cl\u00E9 non ajout\u00E9e au fichier de cl\u00E9s"}, - {"Destination.alias.dest.already.exists", - "L''alias de la destination <{0}> existe d\u00E9j\u00E0"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "Le mot de passe est trop court : il doit comporter au moins 6 caract\u00E8res"}, - {"Too.many.failures.Key.entry.not.cloned", - "Trop d'erreurs. Entr\u00E9e de cl\u00E9 non clon\u00E9e"}, - {"key.password.for.alias.", "mot de passe de cl\u00E9 pour <{0}>"}, - {"Keystore.entry.for.id.getName.already.exists", - "L''entr\u00E9e de fichier de cl\u00E9s d''acc\u00E8s pour <{0}> existe d\u00E9j\u00E0"}, - {"Creating.keystore.entry.for.id.getName.", - "Cr\u00E9ation d''une entr\u00E9e de fichier de cl\u00E9s d''acc\u00E8s pour <{0}>..."}, - {"No.entries.from.identity.database.added", - "Aucune entr\u00E9e ajout\u00E9e \u00E0 partir de la base de donn\u00E9es d'identit\u00E9s"}, - {"Alias.name.alias", "Nom d''alias : {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "Date de cr\u00E9ation : {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "Type d''entr\u00E9e\u00A0: {0}"}, - {"Certificate.chain.length.", "Longueur de cha\u00EEne du certificat : "}, - {"Certificate.i.1.", "Certificat[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "Empreinte du certificat (SHA1) : "}, - {"Keystore.type.", "Type de fichier de cl\u00E9s : "}, - {"Keystore.provider.", "Fournisseur de fichier de cl\u00E9s : "}, - {"Your.keystore.contains.keyStore.size.entry", - "Votre fichier de cl\u00E9s d''acc\u00E8s contient {0,number,integer} entr\u00E9e"}, - {"Your.keystore.contains.keyStore.size.entries", - "Votre fichier de cl\u00E9s d''acc\u00E8s contient {0,number,integer} entr\u00E9es"}, - {"Failed.to.parse.input", "L'analyse de l'entr\u00E9e a \u00E9chou\u00E9"}, - {"Empty.input", "Entr\u00E9e vide"}, - {"Not.X.509.certificate", "Pas un certificat X.509"}, - {"alias.has.no.public.key", "{0} ne poss\u00E8de pas de cl\u00E9 publique"}, - {"alias.has.no.X.509.certificate", "{0} ne poss\u00E8de pas de certificat X.509"}, - {"New.certificate.self.signed.", "Nouveau certificat (auto-sign\u00E9) :"}, - {"Reply.has.no.certificates", "La r\u00E9ponse n'a pas de certificat"}, - {"Certificate.not.imported.alias.alias.already.exists", - "Certificat non import\u00E9, l''alias <{0}> existe d\u00E9j\u00E0"}, - {"Input.not.an.X.509.certificate", "L'entr\u00E9e n'est pas un certificat X.509"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "Le certificat existe d\u00E9j\u00E0 dans le fichier de cl\u00E9s d''acc\u00E8s sous l''alias <{0}>"}, - {"Do.you.still.want.to.add.it.no.", - "Voulez-vous toujours l'ajouter ? [non] : "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "Le certificat existe d\u00E9j\u00E0 dans le fichier de cl\u00E9s d''acc\u00E8s CA syst\u00E8me sous l''alias <{0}>"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "Voulez-vous toujours l'ajouter \u00E0 votre fichier de cl\u00E9s ? [non] : "}, - {"Trust.this.certificate.no.", "Faire confiance \u00E0 ce certificat ? [non] : "}, - {"YES", "Oui"}, - {"New.prompt.", "Nouveau {0} : "}, - {"Passwords.must.differ", "Les mots de passe doivent diff\u00E9rer"}, - {"Re.enter.new.prompt.", "Indiquez encore le nouveau {0} : "}, - {"Re.enter.new.password.", "Ressaisissez le nouveau mot de passe : "}, - {"They.don.t.match.Try.again", "Ils sont diff\u00E9rents. R\u00E9essayez."}, - {"Enter.prompt.alias.name.", "Indiquez le nom d''alias {0} : "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "Saisissez le nom du nouvel alias\t(ou appuyez sur Entr\u00E9e pour annuler l'import de cette entr\u00E9e)\u00A0: "}, - {"Enter.alias.name.", "Indiquez le nom d'alias : "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(appuyez sur Entr\u00E9e si le r\u00E9sultat est identique \u00E0 <{0}>)"}, - {".PATTERN.printX509Cert", - "Propri\u00E9taire : {0}\nEmetteur : {1}\nNum\u00E9ro de s\u00E9rie : {2}\nValide du : {3} au : {4}\nEmpreintes du certificat :\n\t MD5: {5}\n\t SHA1 : {6}\n\t SHA256 : {7}\n\t Nom de l''algorithme de signature : {8}\n\t Version : {9}"}, - {"What.is.your.first.and.last.name.", - "Quels sont vos nom et pr\u00E9nom ?"}, - {"What.is.the.name.of.your.organizational.unit.", - "Quel est le nom de votre unit\u00E9 organisationnelle ?"}, - {"What.is.the.name.of.your.organization.", - "Quel est le nom de votre entreprise ?"}, - {"What.is.the.name.of.your.City.or.Locality.", - "Quel est le nom de votre ville de r\u00E9sidence ?"}, - {"What.is.the.name.of.your.State.or.Province.", - "Quel est le nom de votre \u00E9tat ou province ?"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "Quel est le code pays \u00E0 deux lettres pour cette unit\u00E9 ?"}, - {"Is.name.correct.", "Est-ce {0} ?"}, - {"no", "non"}, - {"yes", "oui"}, - {"y", "o"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "L''alias <{0}> n''est associ\u00E9 \u00E0 aucune cl\u00E9"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "L''entr\u00E9e \u00E0 laquelle l''alias <{0}> fait r\u00E9f\u00E9rence n''est pas une entr\u00E9e de type cl\u00E9 priv\u00E9e. La commande -keyclone prend uniquement en charge le clonage des cl\u00E9s priv\u00E9es"}, - - {".WARNING.WARNING.WARNING.", - "***************** Avertissement Avertissement Avertissement *****************"}, - {"Signer.d.", "Signataire n\u00B0%d :"}, - {"Timestamp.", "Horodatage :"}, - {"Signature.", "Signature :"}, - {"CRLs.", "Listes des certificats r\u00E9voqu\u00E9s (CRL) :"}, - {"Certificate.owner.", "Propri\u00E9taire du certificat : "}, - {"Not.a.signed.jar.file", "Fichier JAR non sign\u00E9"}, - {"No.certificate.from.the.SSL.server", - "Aucun certificat du serveur SSL"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* L'int\u00E9grit\u00E9 des informations stock\u00E9es dans votre fichier de cl\u00E9s *\n* n'a PAS \u00E9t\u00E9 v\u00E9rifi\u00E9e. Pour cela, *\n* vous devez fournir le mot de passe de votre fichier de cl\u00E9s. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* L'int\u00E9grit\u00E9 des informations stock\u00E9es dans le fichier de cl\u00E9s source *\n* n'a PAS \u00E9t\u00E9 v\u00E9rifi\u00E9e. Pour cela, *\n* vous devez fournir le mot de passe de votre fichier de cl\u00E9s source. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "La r\u00E9ponse au certificat ne contient pas de cl\u00E9 publique pour <{0}>"}, - {"Incomplete.certificate.chain.in.reply", - "Cha\u00EEne de certificat incompl\u00E8te dans la r\u00E9ponse"}, - {"Certificate.chain.in.reply.does.not.verify.", - "La cha\u00EEne de certificat de la r\u00E9ponse ne concorde pas : "}, - {"Top.level.certificate.in.reply.", - "Certificat de niveau sup\u00E9rieur dans la r\u00E9ponse :\n"}, - {".is.not.trusted.", "... non s\u00E9curis\u00E9. "}, - {"Install.reply.anyway.no.", "Installer la r\u00E9ponse quand m\u00EAme ? [non] : "}, - {"NO", "Non"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "Les cl\u00E9s publiques de la r\u00E9ponse et du fichier de cl\u00E9s ne concordent pas"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "La r\u00E9ponse au certificat et le certificat du fichier de cl\u00E9s sont identiques"}, - {"Failed.to.establish.chain.from.reply", - "Impossible de cr\u00E9er une cha\u00EEne \u00E0 partir de la r\u00E9ponse"}, - {"n", "n"}, - {"Wrong.answer.try.again", "R\u00E9ponse incorrecte, recommencez"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "Cl\u00E9 secr\u00E8te non g\u00E9n\u00E9r\u00E9e, l''alias <{0}> existe d\u00E9j\u00E0"}, - {"Please.provide.keysize.for.secret.key.generation", - "Indiquez -keysize pour la g\u00E9n\u00E9ration de la cl\u00E9 secr\u00E8te"}, - - {"Extensions.", "Extensions\u00A0: "}, - {".Empty.value.", "(Valeur vide)"}, - {"Extension.Request.", "Demande d'extension :"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "Demande de certificat PKCS #10 (version 1.0)\nSujet : %s\nCl\u00E9 publique : format %s pour la cl\u00E9 %s\n"}, - {"Unknown.keyUsage.type.", "Type keyUsage inconnu : "}, - {"Unknown.extendedkeyUsage.type.", "Type extendedkeyUsage inconnu : "}, - {"Unknown.AccessDescription.type.", "Type AccessDescription inconnu : "}, - {"Unrecognized.GeneralName.type.", "Type GeneralName non reconnu : "}, - {"This.extension.cannot.be.marked.as.critical.", - "Cette extension ne peut pas \u00EAtre marqu\u00E9e comme critique. "}, - {"Odd.number.of.hex.digits.found.", "Nombre impair de chiffres hexad\u00E9cimaux trouv\u00E9 : "}, - {"Unknown.extension.type.", "Type d'extension inconnu : "}, - {"command.{0}.is.ambiguous.", "commande {0} ambigu\u00EB :"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "Avertissement\u00A0: il n''existe pas de cl\u00E9 publique pour l''alias {0}. V\u00E9rifiez que le fichier de cl\u00E9s d''acc\u00E8s est correctement configur\u00E9."}, - {"Warning.Class.not.found.class", "Avertissement : classe introuvable - {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "Avertissement\u00A0: arguments non valides pour le constructeur\u00A0- {0}"}, - {"Illegal.Principal.Type.type", "Type de principal non admis : {0}"}, - {"Illegal.option.option", "Option non admise : {0}"}, - {"Usage.policytool.options.", "Syntaxe : policytool [options]"}, - {".file.file.policy.file.location", - " [-file ] emplacement du fichier de r\u00E8gles"}, - {"New", "Nouveau"}, - {"Open", "Ouvrir"}, - {"Save", "Enregistrer"}, - {"Save.As", "Enregistrer sous"}, - {"View.Warning.Log", "Afficher le journal des avertissements"}, - {"Exit", "Quitter"}, - {"Add.Policy.Entry", "Ajouter une r\u00E8gle"}, - {"Edit.Policy.Entry", "Modifier une r\u00E8gle"}, - {"Remove.Policy.Entry", "Enlever une r\u00E8gle"}, - {"Edit", "Modifier"}, - {"Retain", "Conserver"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "Avertissement : il se peut que le nom de fichier contienne des barres obliques inverses avec caract\u00E8re d'\u00E9chappement. Il n'est pas n\u00E9cessaire d'ajouter un caract\u00E8re d'\u00E9chappement aux barres obliques inverses. L'outil proc\u00E8de \u00E0 l'\u00E9chappement si n\u00E9cessaire lorsqu'il \u00E9crit le contenu des r\u00E8gles dans la zone de stockage persistant).\n\nCliquez sur Conserver pour garder le nom saisi ou sur Modifier pour le remplacer."}, - - {"Add.Public.Key.Alias", "Ajouter un alias de cl\u00E9 publique"}, - {"Remove.Public.Key.Alias", "Enlever un alias de cl\u00E9 publique"}, - {"File", "Fichier"}, - {"KeyStore", "Fichier de cl\u00E9s"}, - {"Policy.File.", "Fichier de r\u00E8gles :"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "Impossible d''ouvrir le fichier de r\u00E8gles\u00A0: {0}: {1}"}, - {"Policy.Tool", "Policy Tool"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "Des erreurs se sont produites \u00E0 l'ouverture de la configuration de r\u00E8gles. Pour plus d'informations, consultez le journal des avertissements."}, - {"Error", "Erreur"}, - {"OK", "OK"}, - {"Status", "Statut"}, - {"Warning", "Avertissement"}, - {"Permission.", - "Droit : "}, - {"Principal.Type.", "Type de principal :"}, - {"Principal.Name.", "Nom de principal :"}, - {"Target.Name.", - "Nom de cible : "}, - {"Actions.", - "Actions : "}, - {"OK.to.overwrite.existing.file.filename.", - "Remplacer le fichier existant {0} ?"}, - {"Cancel", "Annuler"}, - {"CodeBase.", "Base de code :"}, - {"SignedBy.", "Sign\u00E9 par :"}, - {"Add.Principal", "Ajouter un principal"}, - {"Edit.Principal", "Modifier un principal"}, - {"Remove.Principal", "Enlever un principal"}, - {"Principals.", "Principaux :"}, - {".Add.Permission", " Ajouter un droit"}, - {".Edit.Permission", " Modifier un droit"}, - {"Remove.Permission", "Enlever un droit"}, - {"Done", "Termin\u00E9"}, - {"KeyStore.URL.", "URL du fichier de cl\u00E9s :"}, - {"KeyStore.Type.", "Type du fichier de cl\u00E9s :"}, - {"KeyStore.Provider.", "Fournisseur du fichier de cl\u00E9s :"}, - {"KeyStore.Password.URL.", "URL du mot de passe du fichier de cl\u00E9s :"}, - {"Principals", "Principaux"}, - {".Edit.Principal.", " Modifier un principal :"}, - {".Add.New.Principal.", " Ajouter un principal :"}, - {"Permissions", "Droits"}, - {".Edit.Permission.", " Modifier un droit :"}, - {".Add.New.Permission.", " Ajouter un droit :"}, - {"Signed.By.", "Sign\u00E9 par :"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "Impossible de sp\u00E9cifier un principal avec une classe g\u00E9n\u00E9rique sans nom g\u00E9n\u00E9rique"}, - {"Cannot.Specify.Principal.without.a.Name", - "Impossible de sp\u00E9cifier un principal sans nom"}, - {"Permission.and.Target.Name.must.have.a.value", - "Le droit et le nom de cible doivent avoir une valeur"}, - {"Remove.this.Policy.Entry.", "Enlever cette r\u00E8gle ?"}, - {"Overwrite.File", "Remplacer le fichier"}, - {"Policy.successfully.written.to.filename", - "R\u00E8gle \u00E9crite dans {0}"}, - {"null.filename", "nom de fichier NULL"}, - {"Save.changes.", "Enregistrer les modifications ?"}, - {"Yes", "Oui"}, - {"No", "Non"}, - {"Policy.Entry", "R\u00E8gle"}, - {"Save.Changes", "Enregistrer les modifications"}, - {"No.Policy.Entry.selected", "Aucune r\u00E8gle s\u00E9lectionn\u00E9e"}, - {"Unable.to.open.KeyStore.ex.toString.", - "Impossible d''ouvrir le fichier de cl\u00E9s d''acc\u00E8s : {0}"}, - {"No.principal.selected", "Aucun principal s\u00E9lectionn\u00E9"}, - {"No.permission.selected", "Aucun droit s\u00E9lectionn\u00E9"}, - {"name", "nom"}, - {"configuration.type", "type de configuration"}, - {"environment.variable.name", "Nom de variable d'environnement"}, - {"library.name", "nom de biblioth\u00E8que"}, - {"package.name", "nom de package"}, - {"policy.type", "type de r\u00E8gle"}, - {"property.name", "nom de propri\u00E9t\u00E9"}, - {"Principal.List", "Liste de principaux"}, - {"Permission.List", "Liste de droits"}, - {"Code.Base", "Base de code"}, - {"KeyStore.U.R.L.", "URL du fichier de cl\u00E9s :"}, - {"KeyStore.Password.U.R.L.", "URL du mot de passe du fichier de cl\u00E9s :"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "entr\u00E9es NULL non valides"}, {"actions.can.only.be.read.", "les actions sont accessibles en lecture uniquement"}, @@ -553,6 +58,7 @@ public class Resources_fr extends java.util.ListResourceBundle { {"provided.null.OID.map", "mappage OID NULL fourni"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "AccessControlContext NULL fourni non valide"}, {"invalid.null.action.provided", "action NULL fournie non valide"}, @@ -656,6 +162,7 @@ public class Resources_fr extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_it.java b/jdk/src/share/classes/sun/security/util/Resources_it.java index 3d3abf09de8..e942f64463c 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_it.java +++ b/jdk/src/share/classes/sun/security/util/Resources_it.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_it extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [Opzione]..."}, - {"Options.", "Opzioni:"}, - {"Use.keytool.help.for.all.available.commands", - "Utilizzare \"keytool -help\" per visualizzare tutti i comandi disponibili"}, - {"Key.and.Certificate.Management.Tool", - "Strumento di gestione di chiavi e certificati"}, - {"Commands.", "Comandi:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "Utilizzare \"keytool -command_name -help\" per informazioni sull'uso di command_name"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "Genera una richiesta di certificato"}, //-certreq - {"Changes.an.entry.s.alias", - "Modifica l'alias di una voce"}, //-changealias - {"Deletes.an.entry", - "Elimina una voce"}, //-delete - {"Exports.certificate", - "Esporta il certificato"}, //-exportcert - {"Generates.a.key.pair", - "Genera una coppia di chiavi"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "Genera una chiave segreta"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "Genera un certificato da una richiesta di certificato"}, //-gencert - {"Generates.CRL", "Genera CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "Importa le voci da un database delle identit\u00E0 di tipo JDK 1.1.x"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "Importa un certificato o una catena di certificati"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "Importa una o tutte le voci da un altro keystore"}, //-importkeystore - {"Clones.a.key.entry", - "Duplica una voce di chiave"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "Modifica la password della chiave per una voce"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "Elenca le voci in un keystore"}, //-list - {"Prints.the.content.of.a.certificate", - "Visualizza i contenuti di un certificato"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "Visualizza i contenuti di una richiesta di certificato"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "Visualizza i contenuti di un file CRL"}, //-printcrl - {"Generates.a.self.signed.certificate", - "Genera certificato con firma automatica"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "Modifica la password di area di memorizzazione di un keystore"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "nome alias della voce da elaborare"}, //-alias - {"destination.alias", - "alias di destinazione"}, //-destalias - {"destination.key.password", - "password chiave di destinazione"}, //-destkeypass - {"destination.keystore.name", - "nome keystore di destinazione"}, //-destkeystore - {"destination.keystore.password.protected", - "password keystore di destinazione protetta"}, //-destprotected - {"destination.keystore.provider.name", - "nome provider keystore di destinazione"}, //-destprovidername - {"destination.keystore.password", - "password keystore di destinazione"}, //-deststorepass - {"destination.keystore.type", - "tipo keystore di destinazione"}, //-deststoretype - {"distinguished.name", - "nome distinto"}, //-dname - {"X.509.extension", - "estensione X.509"}, //-ext - {"output.file.name", - "nome file di output"}, //-file and -outfile - {"input.file.name", - "nome file di input"}, //-file and -infile - {"key.algorithm.name", - "nome algoritmo chiave"}, //-keyalg - {"key.password", - "password chiave"}, //-keypass - {"key.bit.size", - "dimensione bit chiave"}, //-keysize - {"keystore.name", - "nome keystore"}, //-keystore - {"new.password", - "nuova password"}, //-new - {"do.not.prompt", - "non richiedere"}, //-noprompt - {"password.through.protected.mechanism", - "password mediante meccanismo protetto"}, //-protected - {"provider.argument", - "argomento provider"}, //-providerarg - {"provider.class.name", - "nome classe provider"}, //-providerclass - {"provider.name", - "nome provider"}, //-providername - {"provider.classpath", - "classpath provider"}, //-providerpath - {"output.in.RFC.style", - "output in stile RFC"}, //-rfc - {"signature.algorithm.name", - "nome algoritmo firma"}, //-sigalg - {"source.alias", - "alias origine"}, //-srcalias - {"source.key.password", - "password chiave di origine"}, //-srckeypass - {"source.keystore.name", - "nome keystore di origine"}, //-srckeystore - {"source.keystore.password.protected", - "password keystore di origine protetta"}, //-srcprotected - {"source.keystore.provider.name", - "nome provider keystore di origine"}, //-srcprovidername - {"source.keystore.password", - "password keystore di origine"}, //-srcstorepass - {"source.keystore.type", - "tipo keystore di origine"}, //-srcstoretype - {"SSL.server.host.and.port", - "host e porta server SSL"}, //-sslserver - {"signed.jar.file", - "file jar firmato"}, //=jarfile - {"certificate.validity.start.date.time", - "data/ora di inizio validit\u00E0 certificato"}, //-startdate - {"keystore.password", - "password keystore"}, //-storepass - {"keystore.type", - "tipo keystore"}, //-storetype - {"trust.certificates.from.cacerts", - "considera sicuri i certificati da cacerts"}, //-trustcacerts - {"verbose.output", - "output descrittivo"}, //-v - {"validity.number.of.days", - "numero di giorni di validit\u00E0"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "ID seriale del certificato da revocare"}, //-id - // keytool: Running part - {"keytool.error.", "Errore keytool: "}, - {"Illegal.option.", "Opzione non valida: "}, - {"Illegal.value.", "Valore non valido: "}, - {"Unknown.password.type.", "Tipo di password sconosciuto: "}, - {"Cannot.find.environment.variable.", - "Impossibile trovare la variabile di ambiente: "}, - {"Cannot.find.file.", "Impossibile trovare il file: "}, - {"Command.option.flag.needs.an.argument.", "\u00C8 necessario specificare un argomento per l''opzione di comando {0}."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "Avvertenza: non sono supportate password diverse di chiave e di archivio per i keystore PKCS12. Il valore {0} specificato dall''utente verr\u00E0 ignorato."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "Se -storetype \u00E8 impostato su {0}, -keystore deve essere impostato su NONE"}, - {"Too.many.retries.program.terminated", - "Il numero dei tentativi consentiti \u00E8 stato superato. Il programma verr\u00E0 terminato."}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "Se -storetype \u00E8 impostato su {0}, i comandi -storepasswd e -keypasswd non sono supportati"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "Se -storetype \u00E8 impostato su PKCS12 i comandi -keypasswd non vengono supportati"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "Se -storetype \u00E8 impostato su {0}, non \u00E8 possibile specificare un valore per -keypass e -new"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "Se \u00E8 specificata l'opzione -protected, le opzioni -storepass, -keypass e -new non possono essere specificate"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Se viene specificato -srcprotected, -srcstorepass e -srckeypass non dovranno essere specificati"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "Se il file keystore non \u00E8 protetto da password, non deve essere specificato alcun valore per -storepass, -keypass e -new"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "Se il file keystore non \u00E8 protetto da password, non deve essere specificato alcun valore per -srcstorepass e -srckeypass"}, - {"Illegal.startdate.value", "Valore di data di inizio non valido"}, - {"Validity.must.be.greater.than.zero", - "La validit\u00E0 deve essere maggiore di zero"}, - {"provName.not.a.provider", "{0} non \u00E8 un provider"}, - {"Usage.error.no.command.provided", "Errore di utilizzo: nessun comando specificato"}, - {"Source.keystore.file.exists.but.is.empty.", "Il file keystore di origine esiste, ma \u00E8 vuoto: "}, - {"Please.specify.srckeystore", "Specificare -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "Impossibile specificare sia -v sia -rfc con il comando 'list'"}, - {"Key.password.must.be.at.least.6.characters", - "La password della chiave deve contenere almeno 6 caratteri"}, - {"New.password.must.be.at.least.6.characters", - "La nuova password deve contenere almeno 6 caratteri"}, - {"Keystore.file.exists.but.is.empty.", - "Il file keystore esiste ma \u00E8 vuoto: "}, - {"Keystore.file.does.not.exist.", - "Il file keystore non esiste: "}, - {"Must.specify.destination.alias", "\u00C8 necessario specificare l'alias di destinazione"}, - {"Must.specify.alias", "\u00C8 necessario specificare l'alias"}, - {"Keystore.password.must.be.at.least.6.characters", - "La password del keystore deve contenere almeno 6 caratteri"}, - {"Enter.keystore.password.", "Immettere la password del keystore: "}, - {"Enter.source.keystore.password.", "Immettere la password del keystore di origine: "}, - {"Enter.destination.keystore.password.", "Immettere la password del keystore di destinazione: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "La password del keystore \u00E8 troppo corta - deve contenere almeno 6 caratteri"}, - {"Unknown.Entry.Type", "Tipo di voce sconosciuto"}, - {"Too.many.failures.Alias.not.changed", "Numero eccessivo di errori. L'alias non \u00E8 stato modificato."}, - {"Entry.for.alias.alias.successfully.imported.", - "La voce dell''alias {0} \u00E8 stata importata."}, - {"Entry.for.alias.alias.not.imported.", "La voce dell''alias {0} non \u00E8 stata importata."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "Si \u00E8 verificato un problema durante l''importazione della voce dell''alias {0}: {1}.\nLa voce dell''alias {0} non \u00E8 stata importata."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "Comando di importazione completato: {0} voce/i importata/e, {1} voce/i non importata/e o annullata/e"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "Avvertenza: sovrascrittura in corso dell''alias {0} nel file keystore di destinazione"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "La voce dell''alias {0} esiste gi\u00E0. Sovrascrivere? [no]: "}, - {"Too.many.failures.try.later", "Troppi errori - riprovare"}, - {"Certification.request.stored.in.file.filename.", - "La richiesta di certificazione \u00E8 memorizzata nel file <{0}>"}, - {"Submit.this.to.your.CA", "Sottomettere alla propria CA"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "Se l'alias non \u00E8 specificato, destalias, srckeypass e destkeypass non dovranno essere specificati"}, - {"Certificate.stored.in.file.filename.", - "Il certificato \u00E8 memorizzato nel file <{0}>"}, - {"Certificate.reply.was.installed.in.keystore", - "La risposta del certificato \u00E8 stata installata nel keystore"}, - {"Certificate.reply.was.not.installed.in.keystore", - "La risposta del certificato non \u00E8 stata installata nel keystore"}, - {"Certificate.was.added.to.keystore", - "Il certificato \u00E8 stato aggiunto al keystore"}, - {"Certificate.was.not.added.to.keystore", - "Il certificato non \u00E8 stato aggiunto al keystore"}, - {".Storing.ksfname.", "[Memorizzazione di {0}] in corso"}, - {"alias.has.no.public.key.certificate.", - "{0} non dispone di chiave pubblica (certificato)"}, - {"Cannot.derive.signature.algorithm", - "Impossibile derivare l'algoritmo di firma"}, - {"Alias.alias.does.not.exist", - "L''alias <{0}> non esiste"}, - {"Alias.alias.has.no.certificate", - "L''alias <{0}> non dispone di certificato"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "Non \u00E8 stata generata la coppia di chiavi, l''alias <{0}> \u00E8 gi\u00E0 esistente"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "Generazione in corso di una coppia di chiavi {1} da {0} bit e di un certificato autofirmato ({2}) con una validit\u00E0 di {3} giorni\n\tper: {4}"}, - {"Enter.key.password.for.alias.", "Immettere la password della chiave per <{0}>"}, - {".RETURN.if.same.as.keystore.password.", - "\t(INVIO se corrisponde alla password del keystore): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "La password della chiave \u00E8 troppo corta - deve contenere almeno 6 caratteri"}, - {"Too.many.failures.key.not.added.to.keystore", - "Troppi errori - la chiave non \u00E8 stata aggiunta al keystore"}, - {"Destination.alias.dest.already.exists", - "L''alias di destinazione <{0}> \u00E8 gi\u00E0 esistente"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "La password \u00E8 troppo corta - deve contenere almeno 6 caratteri"}, - {"Too.many.failures.Key.entry.not.cloned", - "Numero eccessivo di errori. Il valore della chiave non \u00E8 stato copiato."}, - {"key.password.for.alias.", "password della chiave per <{0}>"}, - {"Keystore.entry.for.id.getName.already.exists", - "La voce del keystore per <{0}> esiste gi\u00E0"}, - {"Creating.keystore.entry.for.id.getName.", - "Creazione della voce del keystore per <{0}> in corso..."}, - {"No.entries.from.identity.database.added", - "Nessuna voce aggiunta dal database delle identit\u00E0"}, - {"Alias.name.alias", "Nome alias: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "Data di creazione: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "Tipo di voce: {0}"}, - {"Certificate.chain.length.", "Lunghezza catena certificati: "}, - {"Certificate.i.1.", "Certificato[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "Impronta digitale certificato (SHA1): "}, - {"Keystore.type.", "Tipo keystore: "}, - {"Keystore.provider.", "Provider keystore: "}, - {"Your.keystore.contains.keyStore.size.entry", - "Il keystore contiene {0,number,integer} voce"}, - {"Your.keystore.contains.keyStore.size.entries", - "Il keystore contiene {0,number,integer} voci"}, - {"Failed.to.parse.input", "Impossibile analizzare l'input"}, - {"Empty.input", "Input vuoto"}, - {"Not.X.509.certificate", "Il certificato non \u00E8 X.509"}, - {"alias.has.no.public.key", "{0} non dispone di chiave pubblica"}, - {"alias.has.no.X.509.certificate", "{0} non dispone di certificato X.509"}, - {"New.certificate.self.signed.", "Nuovo certificato (autofirmato):"}, - {"Reply.has.no.certificates", "La risposta non dispone di certificati"}, - {"Certificate.not.imported.alias.alias.already.exists", - "Impossibile importare il certificato, l''alias <{0}> \u00E8 gi\u00E0 esistente"}, - {"Input.not.an.X.509.certificate", "L'input non \u00E8 un certificato X.509"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "Il certificato esiste gi\u00E0 nel keystore con alias <{0}>"}, - {"Do.you.still.want.to.add.it.no.", - "Aggiungerlo ugualmente? [no]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "Il certificato esiste gi\u00E0 nel keystore CA con alias <{0}>"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "Aggiungerlo al proprio keystore? [no]: "}, - {"Trust.this.certificate.no.", "Considerare sicuro questo certificato? [no]: "}, - {"YES", "S\u00EC"}, - {"New.prompt.", "Nuova {0}: "}, - {"Passwords.must.differ", "Le password non devono coincidere"}, - {"Re.enter.new.prompt.", "Reimmettere un nuovo valore per {0}: "}, - {"Re.enter.new.password.", "Immettere nuovamente la nuova password: "}, - {"They.don.t.match.Try.again", "Non corrispondono. Riprovare."}, - {"Enter.prompt.alias.name.", "Immettere nome alias {0}: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "Immettere un nuovo nome alias\t(premere INVIO per annullare l'importazione della voce): "}, - {"Enter.alias.name.", "Immettere nome alias: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(INVIO se corrisponde al nome di <{0}>"}, - {".PATTERN.printX509Cert", - "Proprietario: {0}\nAutorit\u00E0 emittente: {1}\nNumero di serie: {2}\nValido da: {3} a: {4}\nImpronte digitali certificato:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Nome algoritmo firma: {8}\n\t Versione: {9}"}, - {"What.is.your.first.and.last.name.", - "Specificare nome e cognome"}, - {"What.is.the.name.of.your.organizational.unit.", - "Specificare il nome dell'unit\u00E0 organizzativa"}, - {"What.is.the.name.of.your.organization.", - "Specificare il nome dell'organizzazione"}, - {"What.is.the.name.of.your.City.or.Locality.", - "Specificare la localit\u00E0"}, - {"What.is.the.name.of.your.State.or.Province.", - "Specificare la provincia"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "Specificare il codice a due lettere del paese in cui si trova l'unit\u00E0"}, - {"Is.name.correct.", "Il dato {0} \u00E8 corretto?"}, - {"no", "no"}, - {"yes", "s\u00EC"}, - {"y", "s"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "All''alias <{0}> non \u00E8 associata alcuna chiave"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "L''alias <{0}> fa riferimento a un tipo di voce che non \u00E8 una voce di chiave privata. Il comando -keyclone supporta solo la copia delle voci di chiave private."}, - - {".WARNING.WARNING.WARNING.", - "***************** Avvertenza Avvertenza Avvertenza *****************"}, - {"Signer.d.", "Firmatario #%d:"}, - {"Timestamp.", "Indicatore orario:"}, - {"Signature.", "Firma:"}, - {"CRLs.", "CRL:"}, - {"Certificate.owner.", "Proprietario certificato: "}, - {"Not.a.signed.jar.file", "Non \u00E8 un file jar firmato"}, - {"No.certificate.from.the.SSL.server", - "Nessun certificato dal server SSL"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* L'integrit\u00E0 delle informazioni memorizzate nel keystore *\n* NON \u00E8 stata verificata. Per verificarne l'integrit\u00E0 *\n* \u00E8 necessario fornire la password del keystore. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* L'integrit\u00E0 delle informazioni memorizzate nel srckeystore *\n* NON \u00E8 stata verificata. Per verificarne l'integrit\u00E0 *\n* \u00E8 necessario fornire la password del srckeystore. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "La risposta del certificato non contiene la chiave pubblica per <{0}>"}, - {"Incomplete.certificate.chain.in.reply", - "Catena dei certificati incompleta nella risposta"}, - {"Certificate.chain.in.reply.does.not.verify.", - "La catena dei certificati nella risposta non verifica: "}, - {"Top.level.certificate.in.reply.", - "Certificato di primo livello nella risposta:\n"}, - {".is.not.trusted.", "...non \u00E8 considerato sicuro. "}, - {"Install.reply.anyway.no.", "Installare la risposta? [no]: "}, - {"NO", "No"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "Le chiavi pubbliche nella risposta e nel keystore non corrispondono"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "La risposta del certificato e il certificato nel keystore sono identici"}, - {"Failed.to.establish.chain.from.reply", - "Impossibile stabilire la catena dalla risposta"}, - {"n", "n"}, - {"Wrong.answer.try.again", "Risposta errata, riprovare"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "La chiave segreta non \u00E8 stata generata; l''alias <{0}> esiste gi\u00E0"}, - {"Please.provide.keysize.for.secret.key.generation", - "Specificare il valore -keysize per la generazione della chiave segreta"}, - - {"Extensions.", "Estensioni: "}, - {".Empty.value.", "(valore vuoto)"}, - {"Extension.Request.", "Richiesta di estensione:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "Richiesta di certificato PKCS #10 (versione 1.0)\nOggetto: %s\nChiave pubblica: %s formato %s chiave\n"}, - {"Unknown.keyUsage.type.", "Tipo keyUsage sconosciuto: "}, - {"Unknown.extendedkeyUsage.type.", "Tipo extendedkeyUsage sconosciuto: "}, - {"Unknown.AccessDescription.type.", "Tipo AccessDescription sconosciuto: "}, - {"Unrecognized.GeneralName.type.", "Tipo GeneralName non riconosciuto: "}, - {"This.extension.cannot.be.marked.as.critical.", - "Impossibile contrassegnare questa estensione come critica. "}, - {"Odd.number.of.hex.digits.found.", "\u00C8 stato trovato un numero dispari di cifre esadecimali: "}, - {"Unknown.extension.type.", "Tipo di estensione sconosciuto: "}, - {"command.{0}.is.ambiguous.", "il comando {0} \u00E8 ambiguo:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "Avvertenza: non esiste una chiave pubblica per l''alias {0}. Verificare che il keystore sia configurato correttamente."}, - {"Warning.Class.not.found.class", "Avvertenza: classe non trovata: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "Avvertenza: argomento o argomenti non validi per il costruttore {0}"}, - {"Illegal.Principal.Type.type", "Tipo principal non valido: {0}"}, - {"Illegal.option.option", "Opzione non valida: {0}"}, - {"Usage.policytool.options.", "Utilizzo: policytool [opzioni]"}, - {".file.file.policy.file.location", - " [-file ] posizione del file dei criteri"}, - {"New", "Nuovo"}, - {"Open", "Apri"}, - {"Save", "Salva"}, - {"Save.As", "Salva con nome"}, - {"View.Warning.Log", "Visualizza registro avvertenze"}, - {"Exit", "Esci"}, - {"Add.Policy.Entry", "Aggiungi voce dei criteri"}, - {"Edit.Policy.Entry", "Modifica voce dei criteri"}, - {"Remove.Policy.Entry", "Rimuovi voce dei criteri"}, - {"Edit", "Modifica"}, - {"Retain", "Mantieni"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "Avvertenza: il nome file pu\u00F2 includere barre rovesciate con escape. Non \u00E8 necessario eseguire l'escape delle barre rovesciate (se necessario lo strumento esegue l'escape dei caratteri al momento della scrittura del contenuto dei criteri nell'area di memorizzazione persistente).\n\nFare click su Mantieni per conservare il nome immesso, oppure su Modifica per modificare il nome."}, - - {"Add.Public.Key.Alias", "Aggiungi alias chiave pubblica"}, - {"Remove.Public.Key.Alias", "Rimuovi alias chiave pubblica"}, - {"File", "File"}, - {"KeyStore", "Keystore"}, - {"Policy.File.", "File dei criteri:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "Impossibile aprire il file di criteri {0}: {1}"}, - {"Policy.Tool", "Strumento criteri"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "Si sono verificati errori durante l'apertura della configurazione dei criteri. Consultare il registro delle avvertenze per ulteriori informazioni."}, - {"Error", "Errore"}, - {"OK", "OK"}, - {"Status", "Stato"}, - {"Warning", "Avvertenza"}, - {"Permission.", - "Autorizzazione: "}, - {"Principal.Type.", "Tipo principal:"}, - {"Principal.Name.", "Nome principal:"}, - {"Target.Name.", - "Nome destinazione: "}, - {"Actions.", - "Azioni: "}, - {"OK.to.overwrite.existing.file.filename.", - "OK per sovrascrivere il file {0}?"}, - {"Cancel", "Annulla"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "Aggiungi principal"}, - {"Edit.Principal", "Modifica principal"}, - {"Remove.Principal", "Rimuovi principal"}, - {"Principals.", "Principal:"}, - {".Add.Permission", " Aggiungi autorizzazione"}, - {".Edit.Permission", " Modifica autorizzazione"}, - {"Remove.Permission", "Rimuovi autorizzazione"}, - {"Done", "Fine"}, - {"KeyStore.URL.", "URL keystore:"}, - {"KeyStore.Type.", "Tipo keystore:"}, - {"KeyStore.Provider.", "Provider keystore:"}, - {"KeyStore.Password.URL.", "URL password keystore:"}, - {"Principals", "Principal:"}, - {".Edit.Principal.", " Modifica principal:"}, - {".Add.New.Principal.", " Aggiungi nuovo principal:"}, - {"Permissions", "Autorizzazioni"}, - {".Edit.Permission.", " Modifica autorizzazione:"}, - {".Add.New.Permission.", " Aggiungi nuova autorizzazione:"}, - {"Signed.By.", "Firmato da:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "Impossibile specificare principal con una classe carattere jolly senza un nome carattere jolly"}, - {"Cannot.Specify.Principal.without.a.Name", - "Impossibile specificare principal senza un nome"}, - {"Permission.and.Target.Name.must.have.a.value", - "L'autorizzazione e il nome destinazione non possono essere nulli"}, - {"Remove.this.Policy.Entry.", "Rimuovere questa voce dei criteri?"}, - {"Overwrite.File", "Sovrascrivi file"}, - {"Policy.successfully.written.to.filename", - "I criteri sono stati scritti in {0}"}, - {"null.filename", "nome file nullo"}, - {"Save.changes.", "Salvare le modifiche?"}, - {"Yes", "S\u00EC"}, - {"No", "No"}, - {"Policy.Entry", "Voce dei criteri"}, - {"Save.Changes", "Salva le modifiche"}, - {"No.Policy.Entry.selected", "Nessuna voce dei criteri selezionata"}, - {"Unable.to.open.KeyStore.ex.toString.", - "Impossibile aprire il keystore: {0}"}, - {"No.principal.selected", "Nessun principal selezionato"}, - {"No.permission.selected", "Nessuna autorizzazione selezionata"}, - {"name", "nome"}, - {"configuration.type", "tipo di configurazione"}, - {"environment.variable.name", "nome variabile ambiente"}, - {"library.name", "nome libreria"}, - {"package.name", "nome package"}, - {"policy.type", "tipo di criteri"}, - {"property.name", "nome propriet\u00E0"}, - {"Principal.List", "Lista principal"}, - {"Permission.List", "Lista autorizzazioni"}, - {"Code.Base", "Codebase"}, - {"KeyStore.U.R.L.", "URL keystore:"}, - {"KeyStore.Password.U.R.L.", "URL password keystore:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "input nullo/i non valido/i"}, {"actions.can.only.be.read.", "le azioni possono essere solamente 'lette'"}, @@ -553,6 +58,7 @@ public class Resources_it extends java.util.ListResourceBundle { {"provided.null.OID.map", "specificata mappa OID null"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "fornito un valore nullo non valido per AccessControlContext"}, {"invalid.null.action.provided", "fornita un'azione nulla non valida"}, @@ -656,6 +162,7 @@ public class Resources_it extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_ja.java b/jdk/src/share/classes/sun/security/util/Resources_ja.java index 27643dd1b12..65d9289b161 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_ja.java +++ b/jdk/src/share/classes/sun/security/util/Resources_ja.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_ja extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [\u30AA\u30D7\u30B7\u30E7\u30F3]..."}, - {"Options.", "\u30AA\u30D7\u30B7\u30E7\u30F3:"}, - {"Use.keytool.help.for.all.available.commands", - "\u4F7F\u7528\u53EF\u80FD\u306A\u3059\u3079\u3066\u306E\u30B3\u30DE\u30F3\u30C9\u306B\u3064\u3044\u3066\u306F\"keytool -help\"\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Key.and.Certificate.Management.Tool", - "\u30AD\u30FC\u304A\u3088\u3073\u8A3C\u660E\u66F8\u7BA1\u7406\u30C4\u30FC\u30EB"}, - {"Commands.", "\u30B3\u30DE\u30F3\u30C9:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "command_name\u306E\u4F7F\u7528\u65B9\u6CD5\u306B\u3064\u3044\u3066\u306F\"keytool -command_name -help\"\u3092\u4F7F\u7528\u3057\u3066\u304F\u3060\u3055\u3044"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u3092\u751F\u6210\u3057\u307E\u3059"}, //-certreq - {"Changes.an.entry.s.alias", - "\u30A8\u30F3\u30C8\u30EA\u306E\u5225\u540D\u3092\u5909\u66F4\u3057\u307E\u3059"}, //-changealias - {"Deletes.an.entry", - "\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059"}, //-delete - {"Exports.certificate", - "\u8A3C\u660E\u66F8\u3092\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-exportcert - {"Generates.a.key.pair", - "\u9375\u30DA\u30A2\u3092\u751F\u6210\u3057\u307E\u3059"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "\u79D8\u5BC6\u9375\u3092\u751F\u6210\u3057\u307E\u3059"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u304B\u3089\u8A3C\u660E\u66F8\u3092\u751F\u6210\u3057\u307E\u3059"}, //-gencert - {"Generates.CRL", "CRL\u3092\u751F\u6210\u3057\u307E\u3059"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "JDK 1.1.x-style\u30A2\u30A4\u30C7\u30F3\u30C6\u30A3\u30C6\u30A3\u30FB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u30A8\u30F3\u30C8\u30EA\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "\u8A3C\u660E\u66F8\u307E\u305F\u306F\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "\u5225\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u304B\u30891\u3064\u307E\u305F\u306F\u3059\u3079\u3066\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u30A4\u30F3\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, //-importkeystore - {"Clones.a.key.entry", - "\u9375\u30A8\u30F3\u30C8\u30EA\u306E\u30AF\u30ED\u30FC\u30F3\u3092\u4F5C\u6210\u3057\u307E\u3059"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "\u30A8\u30F3\u30C8\u30EA\u306E\u9375\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5909\u66F4\u3057\u307E\u3059"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306E\u30A8\u30F3\u30C8\u30EA\u3092\u30EA\u30B9\u30C8\u3057\u307E\u3059"}, //-list - {"Prints.the.content.of.a.certificate", - "\u8A3C\u660E\u66F8\u306E\u5185\u5BB9\u3092\u51FA\u529B\u3057\u307E\u3059"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u306E\u5185\u5BB9\u3092\u51FA\u529B\u3057\u307E\u3059"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "CRL\u30D5\u30A1\u30A4\u30EB\u306E\u5185\u5BB9\u3092\u51FA\u529B\u3057\u307E\u3059"}, //-printcrl - {"Generates.a.self.signed.certificate", - "\u81EA\u5DF1\u7F72\u540D\u578B\u8A3C\u660E\u66F8\u3092\u751F\u6210\u3057\u307E\u3059"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30B9\u30C8\u30A2\u30FB\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5909\u66F4\u3057\u307E\u3059"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "\u51E6\u7406\u3059\u308B\u30A8\u30F3\u30C8\u30EA\u306E\u5225\u540D"}, //-alias - {"destination.alias", - "\u51FA\u529B\u5148\u306E\u5225\u540D"}, //-destalias - {"destination.key.password", - "\u51FA\u529B\u5148\u30AD\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-destkeypass - {"destination.keystore.name", - "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u540D"}, //-destkeystore - {"destination.keystore.password.protected", - "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u4FDD\u8B77\u5BFE\u8C61\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-destprotected - {"destination.keystore.provider.name", - "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"}, //-destprovidername - {"destination.keystore.password", - "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-deststorepass - {"destination.keystore.type", - "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7"}, //-deststoretype - {"distinguished.name", - "\u8B58\u5225\u540D"}, //-dname - {"X.509.extension", - "X.509\u62E1\u5F35"}, //-ext - {"output.file.name", - "\u51FA\u529B\u30D5\u30A1\u30A4\u30EB\u540D"}, //-file and -outfile - {"input.file.name", - "\u5165\u529B\u30D5\u30A1\u30A4\u30EB\u540D"}, //-file and -infile - {"key.algorithm.name", - "\u9375\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u540D"}, //-keyalg - {"key.password", - "\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-keypass - {"key.bit.size", - "\u9375\u306E\u30D3\u30C3\u30C8\u30FB\u30B5\u30A4\u30BA"}, //-keysize - {"keystore.name", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u540D"}, //-keystore - {"new.password", - "\u65B0\u898F\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-new - {"do.not.prompt", - "\u30D7\u30ED\u30F3\u30D7\u30C8\u3092\u8868\u793A\u3057\u306A\u3044"}, //-noprompt - {"password.through.protected.mechanism", - "\u4FDD\u8B77\u30E1\u30AB\u30CB\u30BA\u30E0\u306B\u3088\u308B\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-protected - {"provider.argument", - "\u30D7\u30ED\u30D0\u30A4\u30C0\u5F15\u6570"}, //-providerarg - {"provider.class.name", - "\u30D7\u30ED\u30D0\u30A4\u30C0\u30FB\u30AF\u30E9\u30B9\u540D"}, //-providerclass - {"provider.name", - "\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"}, //-providername - {"provider.classpath", - "\u30D7\u30ED\u30D0\u30A4\u30C0\u30FB\u30AF\u30E9\u30B9\u30D1\u30B9"}, //-providerpath - {"output.in.RFC.style", - "RFC\u30B9\u30BF\u30A4\u30EB\u306E\u51FA\u529B"}, //-rfc - {"signature.algorithm.name", - "\u7F72\u540D\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u540D"}, //-sigalg - {"source.alias", - "\u30BD\u30FC\u30B9\u5225\u540D"}, //-srcalias - {"source.key.password", - "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-srckeypass - {"source.keystore.name", - "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u540D"}, //-srckeystore - {"source.keystore.password.protected", - "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u4FDD\u8B77\u5BFE\u8C61\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-srcprotected - {"source.keystore.provider.name", - "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0\u540D"}, //-srcprovidername - {"source.keystore.password", - "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-srcstorepass - {"source.keystore.type", - "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7"}, //-srcstoretype - {"SSL.server.host.and.port", - "SSL\u30B5\u30FC\u30D0\u30FC\u306E\u30DB\u30B9\u30C8\u3068\u30DD\u30FC\u30C8"}, //-sslserver - {"signed.jar.file", - "\u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB"}, //=jarfile - {"certificate.validity.start.date.time", - "\u8A3C\u660E\u66F8\u306E\u6709\u52B9\u958B\u59CB\u65E5\u6642"}, //-startdate - {"keystore.password", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, //-storepass - {"keystore.type", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7"}, //-storetype - {"trust.certificates.from.cacerts", - "cacerts\u304B\u3089\u306E\u8A3C\u660E\u66F8\u3092\u4FE1\u983C\u3059\u308B"}, //-trustcacerts - {"verbose.output", - "\u8A73\u7D30\u51FA\u529B"}, //-v - {"validity.number.of.days", - "\u59A5\u5F53\u6027\u65E5\u6570"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "\u5931\u52B9\u3059\u308B\u8A3C\u660E\u66F8\u306E\u30B7\u30EA\u30A2\u30EBID"}, //-id - // keytool: Running part - {"keytool.error.", "keytool\u30A8\u30E9\u30FC: "}, - {"Illegal.option.", "\u4E0D\u6B63\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: "}, - {"Illegal.value.", "\u4E0D\u6B63\u306A\u5024: "}, - {"Unknown.password.type.", "\u4E0D\u660E\u306A\u30D1\u30B9\u30EF\u30FC\u30C9\u30FB\u30BF\u30A4\u30D7: "}, - {"Cannot.find.environment.variable.", - "\u74B0\u5883\u5909\u6570\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "}, - {"Cannot.find.file.", "\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: "}, - {"Command.option.flag.needs.an.argument.", "\u30B3\u30DE\u30F3\u30C9\u30FB\u30AA\u30D7\u30B7\u30E7\u30F3{0}\u306B\u306F\u5F15\u6570\u304C\u5FC5\u8981\u3067\u3059\u3002"}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "\u8B66\u544A: PKCS12\u30AD\u30FC\u30B9\u30C8\u30A2\u3067\u306F\u3001\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u7570\u306A\u308B\u72B6\u6CC1\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3002\u30E6\u30FC\u30B6\u30FC\u304C\u6307\u5B9A\u3057\u305F{0}\u306E\u5024\u306F\u7121\u8996\u3057\u307E\u3059\u3002"}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-storetype\u304C{0}\u306E\u5834\u5408\u3001-keystore\u306FNONE\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"Too.many.retries.program.terminated", - "\u518D\u8A66\u884C\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u30D7\u30ED\u30B0\u30E9\u30E0\u304C\u7D42\u4E86\u3057\u307E\u3057\u305F"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "-storetype\u304C{0}\u306E\u5834\u5408\u3001-storepasswd\u30B3\u30DE\u30F3\u30C9\u304A\u3088\u3073-keypasswd\u30B3\u30DE\u30F3\u30C9\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "-storetype\u304CPKCS12\u306E\u5834\u5408\u3001-keypasswd\u30B3\u30DE\u30F3\u30C9\u306F\u30B5\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "-storetype\u304C{0}\u306E\u5834\u5408\u3001-keypass\u3068-new\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "-protected\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001-storepass\u3001-keypass\u304A\u3088\u3073-new\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "-srcprotected\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u308B\u5834\u5408\u3001-srcstorepass\u304A\u3088\u3073-srckeypass\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u4FDD\u8B77\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3001-storepass\u3001-keypass\u304A\u3088\u3073-new\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u30D1\u30B9\u30EF\u30FC\u30C9\u3067\u4FDD\u8B77\u3055\u308C\u3066\u3044\u306A\u3044\u5834\u5408\u3001-srcstorepass\u304A\u3088\u3073-srckeypass\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, - {"Illegal.startdate.value", "startdate\u5024\u304C\u7121\u52B9\u3067\u3059"}, - {"Validity.must.be.greater.than.zero", - "\u59A5\u5F53\u6027\u306F\u30BC\u30ED\u3088\u308A\u5927\u304D\u3044\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"provName.not.a.provider", "{0}\u306F\u30D7\u30ED\u30D0\u30A4\u30C0\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, - {"Usage.error.no.command.provided", "\u4F7F\u7528\u30A8\u30E9\u30FC: \u30B3\u30DE\u30F3\u30C9\u304C\u6307\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, - {"Source.keystore.file.exists.but.is.empty.", "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u3001\u5B58\u5728\u3057\u307E\u3059\u304C\u7A7A\u3067\u3059: "}, - {"Please.specify.srckeystore", "-srckeystore\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "'list'\u30B3\u30DE\u30F3\u30C9\u306B-v\u3068-rfc\u306E\u4E21\u65B9\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093"}, - {"Key.password.must.be.at.least.6.characters", - "\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F6\u6587\u5B57\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"New.password.must.be.at.least.6.characters", - "\u65B0\u898F\u30D1\u30B9\u30EF\u30FC\u30C9\u306F6\u6587\u5B57\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"Keystore.file.exists.but.is.empty.", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u5B58\u5728\u3057\u307E\u3059\u304C\u3001\u7A7A\u3067\u3059: "}, - {"Keystore.file.does.not.exist.", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D5\u30A1\u30A4\u30EB\u306F\u5B58\u5728\u3057\u307E\u305B\u3093: "}, - {"Must.specify.destination.alias", "\u51FA\u529B\u5148\u306E\u5225\u540D\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"Must.specify.alias", "\u5225\u540D\u3092\u6307\u5B9A\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"Keystore.password.must.be.at.least.6.characters", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F6\u6587\u5B57\u4EE5\u4E0A\u3067\u3042\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"Enter.keystore.password.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, - {"Enter.source.keystore.password.", "\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, - {"Enter.destination.keystore.password.", "\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u77ED\u3059\u304E\u307E\u3059 - 6\u6587\u5B57\u4EE5\u4E0A\u306B\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Unknown.Entry.Type", "\u4E0D\u660E\u306A\u30A8\u30F3\u30C8\u30EA\u30FB\u30BF\u30A4\u30D7"}, - {"Too.many.failures.Alias.not.changed", "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u5225\u540D\u306F\u5909\u66F4\u3055\u308C\u307E\u305B\u3093"}, - {"Entry.for.alias.alias.successfully.imported.", - "\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u306B\u6210\u529F\u3057\u307E\u3057\u305F\u3002"}, - {"Entry.for.alias.alias.not.imported.", "\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306F\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002"}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u4E2D\u306B\u554F\u984C\u304C\u767A\u751F\u3057\u307E\u3057\u305F: {1}\u3002\n\u5225\u540D{0}\u306E\u30A8\u30F3\u30C8\u30EA\u306F\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002"}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "\u30A4\u30F3\u30DD\u30FC\u30C8\u30FB\u30B3\u30DE\u30F3\u30C9\u304C\u5B8C\u4E86\u3057\u307E\u3057\u305F: {0}\u4EF6\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u304C\u6210\u529F\u3057\u307E\u3057\u305F\u3002{1}\u4EF6\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u304C\u5931\u6557\u3057\u305F\u304B\u53D6\u308A\u6D88\u3055\u308C\u307E\u3057\u305F"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "\u8B66\u544A: \u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306E\u65E2\u5B58\u306E\u5225\u540D{0}\u3092\u4E0A\u66F8\u304D\u3057\u3066\u3044\u307E\u3059"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "\u65E2\u5B58\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u5225\u540D{0}\u304C\u5B58\u5728\u3057\u3066\u3044\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\u3002[\u3044\u3044\u3048]: "}, - {"Too.many.failures.try.later", "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059 - \u5F8C\u3067\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Certification.request.stored.in.file.filename.", - "\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8\u304C\u30D5\u30A1\u30A4\u30EB<{0}>\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F"}, - {"Submit.this.to.your.CA", "\u3053\u308C\u3092CA\u306B\u63D0\u51FA\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "\u5225\u540D\u3092\u6307\u5B9A\u3057\u306A\u3044\u5834\u5408\u3001\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u5225\u540D\u3001\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304A\u3088\u3073\u51FA\u529B\u5148\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u6307\u5B9A\u3067\u304D\u307E\u305B\u3093"}, - {"Certificate.stored.in.file.filename.", - "\u8A3C\u660E\u66F8\u304C\u30D5\u30A1\u30A4\u30EB<{0}>\u306B\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F"}, - {"Certificate.reply.was.installed.in.keystore", - "\u8A3C\u660E\u66F8\u5FDC\u7B54\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u307E\u3057\u305F"}, - {"Certificate.reply.was.not.installed.in.keystore", - "\u8A3C\u660E\u66F8\u5FDC\u7B54\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, - {"Certificate.was.added.to.keystore", - "\u8A3C\u660E\u66F8\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3055\u308C\u307E\u3057\u305F"}, - {"Certificate.was.not.added.to.keystore", - "\u8A3C\u660E\u66F8\u304C\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, - {".Storing.ksfname.", "[{0}\u3092\u683C\u7D0D\u4E2D]"}, - {"alias.has.no.public.key.certificate.", - "{0}\u306B\u306F\u516C\u958B\u9375(\u8A3C\u660E\u66F8)\u304C\u3042\u308A\u307E\u305B\u3093"}, - {"Cannot.derive.signature.algorithm", - "\u7F72\u540D\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u3092\u53D6\u5F97\u3067\u304D\u307E\u305B\u3093"}, - {"Alias.alias.does.not.exist", - "\u5225\u540D<{0}>\u306F\u5B58\u5728\u3057\u307E\u305B\u3093"}, - {"Alias.alias.has.no.certificate", - "\u5225\u540D<{0}>\u306B\u306F\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "\u9375\u30DA\u30A2\u306F\u751F\u6210\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "{3}\u65E5\u9593\u6709\u52B9\u306A{0}\u30D3\u30C3\u30C8\u306E{1}\u306E\u9375\u30DA\u30A2\u3068\u81EA\u5DF1\u7F72\u540D\u578B\u8A3C\u660E\u66F8({2})\u3092\u751F\u6210\u3057\u3066\u3044\u307E\u3059\n\t\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u540D: {4}"}, - {"Enter.key.password.for.alias.", "<{0}>\u306E\u9375\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044"}, - {".RETURN.if.same.as.keystore.password.", - "\t(\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3068\u540C\u3058\u5834\u5408\u306FRETURN\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u77ED\u3059\u304E\u307E\u3059 - 6\u6587\u5B57\u4EE5\u4E0A\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Too.many.failures.key.not.added.to.keystore", - "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059 - \u9375\u306F\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, - {"Destination.alias.dest.already.exists", - "\u51FA\u529B\u5148\u306E\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u77ED\u3059\u304E\u307E\u3059 - 6\u6587\u5B57\u4EE5\u4E0A\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Too.many.failures.Key.entry.not.cloned", - "\u969C\u5BB3\u304C\u591A\u3059\u304E\u307E\u3059\u3002\u9375\u30A8\u30F3\u30C8\u30EA\u306E\u30AF\u30ED\u30FC\u30F3\u306F\u4F5C\u6210\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F"}, - {"key.password.for.alias.", "<{0}>\u306E\u9375\u306E\u30D1\u30B9\u30EF\u30FC\u30C9"}, - {"Keystore.entry.for.id.getName.already.exists", - "<{0}>\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30A8\u30F3\u30C8\u30EA\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, - {"Creating.keystore.entry.for.id.getName.", - "<{0}>\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30A8\u30F3\u30C8\u30EA\u3092\u4F5C\u6210\u4E2D..."}, - {"No.entries.from.identity.database.added", - "\u30A2\u30A4\u30C7\u30F3\u30C6\u30A3\u30C6\u30A3\u30FB\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u304B\u3089\u8FFD\u52A0\u3055\u308C\u305F\u30A8\u30F3\u30C8\u30EA\u306F\u3042\u308A\u307E\u305B\u3093"}, - {"Alias.name.alias", "\u5225\u540D: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "\u4F5C\u6210\u65E5: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0},{1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "\u30A8\u30F3\u30C8\u30EA\u30FB\u30BF\u30A4\u30D7: {0}"}, - {"Certificate.chain.length.", "\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u306E\u9577\u3055: "}, - {"Certificate.i.1.", "\u8A3C\u660E\u66F8[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "\u8A3C\u660E\u66F8\u306E\u30D5\u30A3\u30F3\u30AC\u30D7\u30EA\u30F3\u30C8(SHA1): "}, - {"Keystore.type.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7: "}, - {"Keystore.provider.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0: "}, - {"Your.keystore.contains.keyStore.size.entry", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u306F{0,number,integer}\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u307E\u3059"}, - {"Your.keystore.contains.keyStore.size.entries", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u306F{0,number,integer}\u30A8\u30F3\u30C8\u30EA\u304C\u542B\u307E\u308C\u307E\u3059"}, - {"Failed.to.parse.input", "\u5165\u529B\u306E\u69CB\u6587\u89E3\u6790\u306B\u5931\u6557\u3057\u307E\u3057\u305F"}, - {"Empty.input", "\u5165\u529B\u304C\u3042\u308A\u307E\u305B\u3093"}, - {"Not.X.509.certificate", "X.509\u8A3C\u660E\u66F8\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, - {"alias.has.no.public.key", "{0}\u306B\u306F\u516C\u958B\u9375\u304C\u3042\u308A\u307E\u305B\u3093"}, - {"alias.has.no.X.509.certificate", "{0}\u306B\u306FX.509\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, - {"New.certificate.self.signed.", "\u65B0\u3057\u3044\u8A3C\u660E\u66F8(\u81EA\u5DF1\u7F72\u540D\u578B):"}, - {"Reply.has.no.certificates", "\u5FDC\u7B54\u306B\u306F\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, - {"Certificate.not.imported.alias.alias.already.exists", - "\u8A3C\u660E\u66F8\u306F\u30A4\u30F3\u30DD\u30FC\u30C8\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, - {"Input.not.an.X.509.certificate", "\u5165\u529B\u306FX.509\u8A3C\u660E\u66F8\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "\u8A3C\u660E\u66F8\u306F\u3001\u5225\u540D<{0}>\u306E\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, - {"Do.you.still.want.to.add.it.no.", - "\u8FFD\u52A0\u3057\u307E\u3059\u304B\u3002[\u3044\u3044\u3048]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "\u8A3C\u660E\u66F8\u306F\u3001\u5225\u540D<{0}>\u306E\u30B7\u30B9\u30C6\u30E0\u898F\u6A21\u306ECA\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306B\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u8FFD\u52A0\u3057\u307E\u3059\u304B\u3002 [\u3044\u3044\u3048]: "}, - {"Trust.this.certificate.no.", "\u3053\u306E\u8A3C\u660E\u66F8\u3092\u4FE1\u983C\u3057\u307E\u3059\u304B\u3002 [\u3044\u3044\u3048]: "}, - {"YES", "\u306F\u3044"}, - {"New.prompt.", "\u65B0\u898F{0}: "}, - {"Passwords.must.differ", "\u30D1\u30B9\u30EF\u30FC\u30C9\u306F\u7570\u306A\u3063\u3066\u3044\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"Re.enter.new.prompt.", "\u65B0\u898F{0}\u3092\u518D\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, - {"Re.enter.new.password.", "\u65B0\u898F\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u518D\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, - {"They.don.t.match.Try.again", "\u4E00\u81F4\u3057\u307E\u305B\u3093\u3002\u3082\u3046\u4E00\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Enter.prompt.alias.name.", "{0}\u306E\u5225\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "\u65B0\u3057\u3044\u5225\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\t(\u3053\u306E\u30A8\u30F3\u30C8\u30EA\u306E\u30A4\u30F3\u30DD\u30FC\u30C8\u3092\u53D6\u308A\u6D88\u3059\u5834\u5408\u306FRETURN\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044): "}, - {"Enter.alias.name.", "\u5225\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(<{0}>\u3068\u540C\u3058\u5834\u5408\u306FRETURN\u3092\u62BC\u3057\u3066\u304F\u3060\u3055\u3044)"}, - {".PATTERN.printX509Cert", - "\u6240\u6709\u8005: {0}\n\u767A\u884C\u8005: {1}\n\u30B7\u30EA\u30A2\u30EB\u756A\u53F7: {2}\n\u6709\u52B9\u671F\u9593\u306E\u958B\u59CB\u65E5: {3}\u7D42\u4E86\u65E5: {4}\n\u8A3C\u660E\u66F8\u306E\u30D5\u30A3\u30F3\u30AC\u30D7\u30EA\u30F3\u30C8:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7F72\u540D\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u540D: {8}\n\t \u30D0\u30FC\u30B8\u30E7\u30F3: {9}"}, - {"What.is.your.first.and.last.name.", - "\u59D3\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"What.is.the.name.of.your.organizational.unit.", - "\u7D44\u7E54\u5358\u4F4D\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"What.is.the.name.of.your.organization.", - "\u7D44\u7E54\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"What.is.the.name.of.your.City.or.Locality.", - "\u90FD\u5E02\u540D\u307E\u305F\u306F\u5730\u57DF\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"What.is.the.name.of.your.State.or.Province.", - "\u90FD\u9053\u5E9C\u770C\u540D\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "\u3053\u306E\u5358\u4F4D\u306B\u8A72\u5F53\u3059\u308B2\u6587\u5B57\u306E\u56FD\u30B3\u30FC\u30C9\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"Is.name.correct.", "{0}\u3067\u3088\u308D\u3057\u3044\u3067\u3059\u304B\u3002"}, - {"no", "\u3044\u3044\u3048"}, - {"yes", "\u306F\u3044"}, - {"y", "y"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "\u5225\u540D<{0}>\u306B\u306F\u9375\u304C\u3042\u308A\u307E\u305B\u3093"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "\u5225\u540D<{0}>\u304C\u53C2\u7167\u3057\u3066\u3044\u308B\u30A8\u30F3\u30C8\u30EA\u30FB\u30BF\u30A4\u30D7\u306F\u79D8\u5BC6\u9375\u30A8\u30F3\u30C8\u30EA\u3067\u306F\u3042\u308A\u307E\u305B\u3093\u3002-keyclone\u30B3\u30DE\u30F3\u30C9\u306F\u79D8\u5BC6\u9375\u30A8\u30F3\u30C8\u30EA\u306E\u30AF\u30ED\u30FC\u30F3\u4F5C\u6210\u306E\u307F\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u307E\u3059"}, - - {".WARNING.WARNING.WARNING.", - "*****************\u8B66\u544A \u8B66\u544A \u8B66\u544A*****************"}, - {"Signer.d.", "\u7F72\u540D\u8005\u756A\u53F7%d:"}, - {"Timestamp.", "\u30BF\u30A4\u30E0\u30B9\u30BF\u30F3\u30D7:"}, - {"Signature.", "\u7F72\u540D:"}, - {"CRLs.", "CRL:"}, - {"Certificate.owner.", "\u8A3C\u660E\u66F8\u306E\u6240\u6709\u8005: "}, - {"Not.a.signed.jar.file", "\u7F72\u540D\u4ED8\u304DJAR\u30D5\u30A1\u30A4\u30EB\u3067\u306F\u3042\u308A\u307E\u305B\u3093"}, - {"No.certificate.from.the.SSL.server", - "SSL\u30B5\u30FC\u30D0\u30FC\u304B\u3089\u306E\u8A3C\u660E\u66F8\u304C\u3042\u308A\u307E\u305B\u3093"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "*\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u4FDD\u5B58\u3055\u308C\u305F\u60C5\u5831\u306E\u6574\u5408\u6027\u306F*\n*\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u6574\u5408\u6027\u3092\u691C\u8A3C\u3059\u308B\u306B\u306F*\n*\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002*"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "*\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306B\u4FDD\u5B58\u3055\u308C\u305F\u60C5\u5831\u306E\u6574\u5408\u6027\u306F*\n*\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002\u6574\u5408\u6027\u3092\u691C\u8A3C\u3059\u308B\u306B\u306F*\n*\u30BD\u30FC\u30B9\u30FB\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30D1\u30B9\u30EF\u30FC\u30C9\u3092\u5165\u529B\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002*"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "\u8A3C\u660E\u66F8\u5FDC\u7B54\u306B\u306F\u3001<{0}>\u306E\u516C\u958B\u9375\u306F\u542B\u307E\u308C\u307E\u305B\u3093"}, - {"Incomplete.certificate.chain.in.reply", - "\u5FDC\u7B54\u3057\u305F\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u306F\u4E0D\u5B8C\u5168\u3067\u3059"}, - {"Certificate.chain.in.reply.does.not.verify.", - "\u5FDC\u7B54\u3057\u305F\u8A3C\u660E\u66F8\u30C1\u30A7\u30FC\u30F3\u306F\u691C\u8A3C\u3055\u308C\u3066\u3044\u307E\u305B\u3093: "}, - {"Top.level.certificate.in.reply.", - "\u5FDC\u7B54\u3057\u305F\u30C8\u30C3\u30D7\u30EC\u30D9\u30EB\u306E\u8A3C\u660E\u66F8:\n"}, - {".is.not.trusted.", "... \u306F\u4FE1\u983C\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 "}, - {"Install.reply.anyway.no.", "\u5FDC\u7B54\u3092\u30A4\u30F3\u30B9\u30C8\u30FC\u30EB\u3057\u307E\u3059\u304B\u3002[\u3044\u3044\u3048]: "}, - {"NO", "\u3044\u3044\u3048"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "\u5FDC\u7B54\u3057\u305F\u516C\u958B\u9375\u3068\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u4E00\u81F4\u3057\u307E\u305B\u3093"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "\u8A3C\u660E\u66F8\u5FDC\u7B54\u3068\u30AD\u30FC\u30B9\u30C8\u30A2\u5185\u306E\u8A3C\u660E\u66F8\u304C\u540C\u3058\u3067\u3059"}, - {"Failed.to.establish.chain.from.reply", - "\u5FDC\u7B54\u304B\u3089\u9023\u9396\u3092\u78BA\u7ACB\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F"}, - {"n", "n"}, - {"Wrong.answer.try.again", "\u5FDC\u7B54\u304C\u9593\u9055\u3063\u3066\u3044\u307E\u3059\u3002\u3082\u3046\u4E00\u5EA6\u5B9F\u884C\u3057\u3066\u304F\u3060\u3055\u3044"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "\u79D8\u5BC6\u9375\u306F\u751F\u6210\u3055\u308C\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u5225\u540D<{0}>\u306F\u3059\u3067\u306B\u5B58\u5728\u3057\u307E\u3059"}, - {"Please.provide.keysize.for.secret.key.generation", - "\u79D8\u5BC6\u9375\u306E\u751F\u6210\u6642\u306B\u306F -keysize\u3092\u6307\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044"}, - - {"Extensions.", "\u62E1\u5F35: "}, - {".Empty.value.", "(\u7A7A\u306E\u5024)"}, - {"Extension.Request.", "\u62E1\u5F35\u30EA\u30AF\u30A8\u30B9\u30C8:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "PKCS #10\u8A3C\u660E\u66F8\u30EA\u30AF\u30A8\u30B9\u30C8(\u30D0\u30FC\u30B8\u30E7\u30F31.0)\n\u30B5\u30D6\u30B8\u30A7\u30AF\u30C8: %s\n\u516C\u958B\u9375: %s \u30D5\u30A9\u30FC\u30DE\u30C3\u30C8 %s \u30AD\u30FC\n"}, - {"Unknown.keyUsage.type.", "\u4E0D\u660E\u306AkeyUsage\u30BF\u30A4\u30D7: "}, - {"Unknown.extendedkeyUsage.type.", "\u4E0D\u660E\u306AextendedkeyUsage\u30BF\u30A4\u30D7: "}, - {"Unknown.AccessDescription.type.", "\u4E0D\u660E\u306AAccessDescription\u30BF\u30A4\u30D7: "}, - {"Unrecognized.GeneralName.type.", "\u8A8D\u8B58\u3055\u308C\u306A\u3044GeneralName\u30BF\u30A4\u30D7: "}, - {"This.extension.cannot.be.marked.as.critical.", - "\u3053\u306E\u62E1\u5F35\u306F\u30AF\u30EA\u30C6\u30A3\u30AB\u30EB\u3068\u3057\u3066\u30DE\u30FC\u30AF\u4ED8\u3051\u3067\u304D\u307E\u305B\u3093\u3002 "}, - {"Odd.number.of.hex.digits.found.", "\u5947\u6570\u306E16\u9032\u6570\u304C\u898B\u3064\u304B\u308A\u307E\u3057\u305F: "}, - {"Unknown.extension.type.", "\u4E0D\u660E\u306A\u62E1\u5F35\u30BF\u30A4\u30D7: "}, - {"command.{0}.is.ambiguous.", "\u30B3\u30DE\u30F3\u30C9{0}\u306F\u3042\u3044\u307E\u3044\u3067\u3059:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "\u8B66\u544A: \u5225\u540D{0}\u306E\u516C\u958B\u9375\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002\u30AD\u30FC\u30B9\u30C8\u30A2\u304C\u6B63\u3057\u304F\u69CB\u6210\u3055\u308C\u3066\u3044\u308B\u3053\u3068\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"Warning.Class.not.found.class", "\u8B66\u544A: \u30AF\u30E9\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "\u8B66\u544A: \u30B3\u30F3\u30B9\u30C8\u30E9\u30AF\u30BF\u306E\u5F15\u6570\u304C\u7121\u52B9\u3067\u3059: {0}"}, - {"Illegal.Principal.Type.type", "\u4E0D\u6B63\u306A\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u30BF\u30A4\u30D7: {0}"}, - {"Illegal.option.option", "\u4E0D\u6B63\u306A\u30AA\u30D7\u30B7\u30E7\u30F3: {0}"}, - {"Usage.policytool.options.", "\u4F7F\u7528\u65B9\u6CD5: policytool [options]"}, - {".file.file.policy.file.location", - " [-file ] \u30DD\u30EA\u30B7\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB\u306E\u5834\u6240"}, - {"New", "\u65B0\u898F"}, - {"Open", "\u958B\u304F"}, - {"Save", "\u4FDD\u5B58"}, - {"Save.As", "\u5225\u540D\u4FDD\u5B58"}, - {"View.Warning.Log", "\u8B66\u544A\u30ED\u30B0\u306E\u8868\u793A"}, - {"Exit", "\u7D42\u4E86"}, - {"Add.Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306E\u8FFD\u52A0"}, - {"Edit.Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306E\u7DE8\u96C6"}, - {"Remove.Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u306E\u524A\u9664"}, - {"Edit", "\u7DE8\u96C6"}, - {"Retain", "\u4FDD\u6301"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "\u8B66\u544A: \u30D5\u30A1\u30A4\u30EB\u540D\u306B\u30A8\u30B9\u30B1\u30FC\u30D7\u3055\u308C\u305F\u30D0\u30C3\u30AF\u30B9\u30E9\u30C3\u30B7\u30E5\u6587\u5B57\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u30D0\u30C3\u30AF\u30B9\u30E9\u30C3\u30B7\u30E5\u6587\u5B57\u3092\u30A8\u30B9\u30B1\u30FC\u30D7\u3059\u308B\u5FC5\u8981\u306F\u3042\u308A\u307E\u305B\u3093(\u30C4\u30FC\u30EB\u306F\u30DD\u30EA\u30B7\u30FC\u5185\u5BB9\u3092\u6C38\u7D9A\u30B9\u30C8\u30A2\u306B\u66F8\u304D\u8FBC\u3080\u3068\u304D\u306B\u3001\u5FC5\u8981\u306B\u5FDC\u3058\u3066\u6587\u5B57\u3092\u30A8\u30B9\u30B1\u30FC\u30D7\u3057\u307E\u3059)\u3002\n\n\u5165\u529B\u6E08\u306E\u540D\u524D\u3092\u4FDD\u6301\u3059\u308B\u306B\u306F\u300C\u4FDD\u6301\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3001\u540D\u524D\u3092\u7DE8\u96C6\u3059\u308B\u306B\u306F\u300C\u7DE8\u96C6\u300D\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - - {"Add.Public.Key.Alias", "\u516C\u958B\u9375\u306E\u5225\u540D\u306E\u8FFD\u52A0"}, - {"Remove.Public.Key.Alias", "\u516C\u958B\u9375\u306E\u5225\u540D\u3092\u524A\u9664"}, - {"File", "\u30D5\u30A1\u30A4\u30EB"}, - {"KeyStore", "\u30AD\u30FC\u30B9\u30C8\u30A2"}, - {"Policy.File.", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "\u30DD\u30EA\u30B7\u30FC\u30FB\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F: {0}: {1}"}, - {"Policy.Tool", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30C4\u30FC\u30EB"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "\u30DD\u30EA\u30B7\u30FC\u69CB\u6210\u3092\u958B\u304F\u3068\u304D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002\u8A73\u7D30\u306F\u8B66\u544A\u30ED\u30B0\u3092\u53C2\u7167\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}, - {"Error", "\u30A8\u30E9\u30FC"}, - {"OK", "OK"}, - {"Status", "\u72B6\u614B"}, - {"Warning", "\u8B66\u544A"}, - {"Permission.", - "\u30A2\u30AF\u30BB\u30B9\u6A29: "}, - {"Principal.Type.", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u30BF\u30A4\u30D7:"}, - {"Principal.Name.", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u540D\u524D:"}, - {"Target.Name.", - "\u30BF\u30FC\u30B2\u30C3\u30C8\u540D: "}, - {"Actions.", - "\u30A2\u30AF\u30B7\u30E7\u30F3: "}, - {"OK.to.overwrite.existing.file.filename.", - "\u65E2\u5B58\u306E\u30D5\u30A1\u30A4\u30EB{0}\u306B\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\u3002"}, - {"Cancel", "\u53D6\u6D88"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u8FFD\u52A0"}, - {"Edit.Principal", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u7DE8\u96C6"}, - {"Remove.Principal", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u524A\u9664"}, - {"Principals.", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB:"}, - {".Add.Permission", " \u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u8FFD\u52A0"}, - {".Edit.Permission", " \u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u7DE8\u96C6"}, - {"Remove.Permission", "\u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u524A\u9664"}, - {"Done", "\u5B8C\u4E86"}, - {"KeyStore.URL.", "\u30AD\u30FC\u30B9\u30C8\u30A2URL:"}, - {"KeyStore.Type.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u306E\u30BF\u30A4\u30D7:"}, - {"KeyStore.Provider.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D7\u30ED\u30D0\u30A4\u30C0:"}, - {"KeyStore.Password.URL.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D1\u30B9\u30EF\u30FC\u30C9URL:"}, - {"Principals", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB"}, - {".Edit.Principal.", " \u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u7DE8\u96C6:"}, - {".Add.New.Principal.", " \u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u65B0\u898F\u8FFD\u52A0:"}, - {"Permissions", "\u30A2\u30AF\u30BB\u30B9\u6A29"}, - {".Edit.Permission.", " \u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u7DE8\u96C6:"}, - {".Add.New.Permission.", " \u65B0\u898F\u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u8FFD\u52A0:"}, - {"Signed.By.", "\u7F72\u540D\u8005:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "\u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u540D\u306E\u306A\u3044\u30EF\u30A4\u30EB\u30C9\u30AB\u30FC\u30C9\u30FB\u30AF\u30E9\u30B9\u3092\u4F7F\u7528\u3057\u3066\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093"}, - {"Cannot.Specify.Principal.without.a.Name", - "\u540D\u524D\u3092\u4F7F\u7528\u305B\u305A\u306B\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u3092\u6307\u5B9A\u3059\u308B\u3053\u3068\u306F\u3067\u304D\u307E\u305B\u3093"}, - {"Permission.and.Target.Name.must.have.a.value", - "\u30A2\u30AF\u30BB\u30B9\u6A29\u3068\u30BF\u30FC\u30B2\u30C3\u30C8\u540D\u306F\u3001\u5024\u3092\u4FDD\u6301\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059"}, - {"Remove.this.Policy.Entry.", "\u3053\u306E\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u3092\u524A\u9664\u3057\u307E\u3059\u304B\u3002"}, - {"Overwrite.File", "\u30D5\u30A1\u30A4\u30EB\u3092\u4E0A\u66F8\u304D\u3057\u307E\u3059"}, - {"Policy.successfully.written.to.filename", - "\u30DD\u30EA\u30B7\u30FC\u306E{0}\u3078\u306E\u66F8\u8FBC\u307F\u306B\u6210\u529F\u3057\u307E\u3057\u305F"}, - {"null.filename", "\u30D5\u30A1\u30A4\u30EB\u540D\u304Cnull\u3067\u3059"}, - {"Save.changes.", "\u5909\u66F4\u3092\u4FDD\u5B58\u3057\u307E\u3059\u304B\u3002"}, - {"Yes", "\u306F\u3044"}, - {"No", "\u3044\u3044\u3048"}, - {"Policy.Entry", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA"}, - {"Save.Changes", "\u5909\u66F4\u3092\u4FDD\u5B58\u3057\u307E\u3059"}, - {"No.Policy.Entry.selected", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30A8\u30F3\u30C8\u30EA\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, - {"Unable.to.open.KeyStore.ex.toString.", - "\u30AD\u30FC\u30B9\u30C8\u30A2{0}\u3092\u958B\u3051\u307E\u305B\u3093"}, - {"No.principal.selected", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, - {"No.permission.selected", "\u30A2\u30AF\u30BB\u30B9\u6A29\u304C\u9078\u629E\u3055\u308C\u3066\u3044\u307E\u305B\u3093"}, - {"name", "\u540D\u524D"}, - {"configuration.type", "\u69CB\u6210\u30BF\u30A4\u30D7"}, - {"environment.variable.name", "\u74B0\u5883\u5909\u6570\u540D"}, - {"library.name", "\u30E9\u30A4\u30D6\u30E9\u30EA\u540D"}, - {"package.name", "\u30D1\u30C3\u30B1\u30FC\u30B8\u540D"}, - {"policy.type", "\u30DD\u30EA\u30B7\u30FC\u30FB\u30BF\u30A4\u30D7"}, - {"property.name", "\u30D7\u30ED\u30D1\u30C6\u30A3\u540D"}, - {"Principal.List", "\u30D7\u30EA\u30F3\u30B7\u30D1\u30EB\u306E\u30EA\u30B9\u30C8"}, - {"Permission.List", "\u30A2\u30AF\u30BB\u30B9\u6A29\u306E\u30EA\u30B9\u30C8"}, - {"Code.Base", "\u30B3\u30FC\u30C9\u30FB\u30D9\u30FC\u30B9"}, - {"KeyStore.U.R.L.", "\u30AD\u30FC\u30B9\u30C8\u30A2U R L:"}, - {"KeyStore.Password.U.R.L.", "\u30AD\u30FC\u30B9\u30C8\u30A2\u30FB\u30D1\u30B9\u30EF\u30FC\u30C9U R L:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "null\u306E\u5165\u529B\u306F\u7121\u52B9\u3067\u3059"}, {"actions.can.only.be.read.", "\u30A2\u30AF\u30B7\u30E7\u30F3\u306F'\u8AAD\u8FBC\u307F'\u306E\u307F\u53EF\u80FD\u3067\u3059"}, @@ -553,6 +58,7 @@ public class Resources_ja extends java.util.ListResourceBundle { {"provided.null.OID.map", "null\u306EOID\u30DE\u30C3\u30D7\u304C\u6307\u5B9A\u3055\u308C\u307E\u3057\u305F"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "\u7121\u52B9\u306Anull AccessControlContext\u304C\u6307\u5B9A\u3055\u308C\u307E\u3057\u305F"}, {"invalid.null.action.provided", "\u7121\u52B9\u306Anull\u30A2\u30AF\u30B7\u30E7\u30F3\u304C\u6307\u5B9A\u3055\u308C\u307E\u3057\u305F"}, @@ -656,6 +162,7 @@ public class Resources_ja extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_ko.java b/jdk/src/share/classes/sun/security/util/Resources_ko.java index d1ec7447783..3968919ce7a 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_ko.java +++ b/jdk/src/share/classes/sun/security/util/Resources_ko.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_ko extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [\uC635\uC158]..."}, - {"Options.", "\uC635\uC158:"}, - {"Use.keytool.help.for.all.available.commands", - "\uC0AC\uC6A9 \uAC00\uB2A5\uD55C \uBAA8\uB4E0 \uBA85\uB839\uC5D0 \"keytool -help\" \uC0AC\uC6A9"}, - {"Key.and.Certificate.Management.Tool", - "\uD0A4 \uBC0F \uC778\uC99D\uC11C \uAD00\uB9AC \uD234"}, - {"Commands.", "\uBA85\uB839:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "command_name \uC0AC\uC6A9\uBC95\uC5D0 \"keytool -command_name -help\" \uC0AC\uC6A9"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "\uC778\uC99D\uC11C \uC694\uCCAD\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-certreq - {"Changes.an.entry.s.alias", - "\uD56D\uBAA9\uC758 \uBCC4\uCE6D\uC744 \uBCC0\uACBD\uD569\uB2C8\uB2E4."}, //-changealias - {"Deletes.an.entry", - "\uD56D\uBAA9\uC744 \uC0AD\uC81C\uD569\uB2C8\uB2E4."}, //-delete - {"Exports.certificate", - "\uC778\uC99D\uC11C\uB97C \uC775\uC2A4\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-exportcert - {"Generates.a.key.pair", - "\uD0A4 \uC30D\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "\uBCF4\uC548 \uD0A4\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "\uC778\uC99D\uC11C \uC694\uCCAD\uC5D0\uC11C \uC778\uC99D\uC11C\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-gencert - {"Generates.CRL", "CRL\uC744 \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "JDK 1.1.x \uC2A4\uD0C0\uC77C ID \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uD56D\uBAA9\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "\uC778\uC99D\uC11C \uB610\uB294 \uC778\uC99D\uC11C \uCCB4\uC778\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "\uB2E4\uB978 \uD0A4 \uC800\uC7A5\uC18C\uC5D0\uC11C \uD558\uB098 \uB610\uB294 \uBAA8\uB4E0 \uD56D\uBAA9\uC744 \uC784\uD3EC\uD2B8\uD569\uB2C8\uB2E4."}, //-importkeystore - {"Clones.a.key.entry", - "\uD0A4 \uD56D\uBAA9\uC744 \uBCF5\uC81C\uD569\uB2C8\uB2E4."}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "\uD56D\uBAA9\uC758 \uD0A4 \uBE44\uBC00\uBC88\uD638\uB97C \uBCC0\uACBD\uD569\uB2C8\uB2E4."}, //-keypasswd - {"Lists.entries.in.a.keystore", - "\uD0A4 \uC800\uC7A5\uC18C\uC758 \uD56D\uBAA9\uC744 \uB098\uC5F4\uD569\uB2C8\uB2E4."}, //-list - {"Prints.the.content.of.a.certificate", - "\uC778\uC99D\uC11C\uC758 \uCF58\uD150\uCE20\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4."}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "\uC778\uC99D\uC11C \uC694\uCCAD\uC758 \uCF58\uD150\uCE20\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4."}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "CRL \uD30C\uC77C\uC758 \uCF58\uD150\uCE20\uB97C \uC778\uC1C4\uD569\uB2C8\uB2E4."}, //-printcrl - {"Generates.a.self.signed.certificate", - "\uC790\uCCB4 \uC11C\uBA85\uB41C \uC778\uC99D\uC11C\uB97C \uC0DD\uC131\uD569\uB2C8\uB2E4."}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "\uD0A4 \uC800\uC7A5\uC18C\uC758 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB97C \uBCC0\uACBD\uD569\uB2C8\uB2E4."}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "\uCC98\uB9AC\uD560 \uD56D\uBAA9\uC758 \uBCC4\uCE6D \uC774\uB984"}, //-alias - {"destination.alias", - "\uB300\uC0C1 \uBCC4\uCE6D"}, //-destalias - {"destination.key.password", - "\uB300\uC0C1 \uD0A4 \uBE44\uBC00\uBC88\uD638"}, //-destkeypass - {"destination.keystore.name", - "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uC774\uB984"}, //-destkeystore - {"destination.keystore.password.protected", - "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB428"}, //-destprotected - {"destination.keystore.provider.name", - "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790 \uC774\uB984"}, //-destprovidername - {"destination.keystore.password", - "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638"}, //-deststorepass - {"destination.keystore.type", - "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uC720\uD615"}, //-deststoretype - {"distinguished.name", - "\uC2DD\uBCC4 \uC774\uB984"}, //-dname - {"X.509.extension", - "X.509 \uD655\uC7A5"}, //-ext - {"output.file.name", - "\uCD9C\uB825 \uD30C\uC77C \uC774\uB984"}, //-file and -outfile - {"input.file.name", - "\uC785\uB825 \uD30C\uC77C \uC774\uB984"}, //-file and -infile - {"key.algorithm.name", - "\uD0A4 \uC54C\uACE0\uB9AC\uC998 \uC774\uB984"}, //-keyalg - {"key.password", - "\uD0A4 \uBE44\uBC00\uBC88\uD638"}, //-keypass - {"key.bit.size", - "\uD0A4 \uBE44\uD2B8 \uD06C\uAE30"}, //-keysize - {"keystore.name", - "\uD0A4 \uC800\uC7A5\uC18C \uC774\uB984"}, //-keystore - {"new.password", - "\uC0C8 \uBE44\uBC00\uBC88\uD638"}, //-new - {"do.not.prompt", - "\uD655\uC778\uD558\uC9C0 \uC54A\uC74C"}, //-noprompt - {"password.through.protected.mechanism", - "\uBCF4\uD638\uB418\uB294 \uBA54\uCEE4\uB2C8\uC998\uC744 \uD1B5\uD55C \uBE44\uBC00\uBC88\uD638"}, //-protected - {"provider.argument", - "\uC81C\uACF5\uC790 \uC778\uC218"}, //-providerarg - {"provider.class.name", - "\uC81C\uACF5\uC790 \uD074\uB798\uC2A4 \uC774\uB984"}, //-providerclass - {"provider.name", - "\uC81C\uACF5\uC790 \uC774\uB984"}, //-providername - {"provider.classpath", - "\uC81C\uACF5\uC790 \uD074\uB798\uC2A4 \uACBD\uB85C"}, //-providerpath - {"output.in.RFC.style", - "RFC \uC2A4\uD0C0\uC77C\uC758 \uCD9C\uB825"}, //-rfc - {"signature.algorithm.name", - "\uC11C\uBA85 \uC54C\uACE0\uB9AC\uC998 \uC774\uB984"}, //-sigalg - {"source.alias", - "\uC18C\uC2A4 \uBCC4\uCE6D"}, //-srcalias - {"source.key.password", - "\uC18C\uC2A4 \uD0A4 \uBE44\uBC00\uBC88\uD638"}, //-srckeypass - {"source.keystore.name", - "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uC774\uB984"}, //-srckeystore - {"source.keystore.password.protected", - "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB428"}, //-srcprotected - {"source.keystore.provider.name", - "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790 \uC774\uB984"}, //-srcprovidername - {"source.keystore.password", - "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638"}, //-srcstorepass - {"source.keystore.type", - "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uC720\uD615"}, //-srcstoretype - {"SSL.server.host.and.port", - "SSL \uC11C\uBC84 \uD638\uC2A4\uD2B8 \uBC0F \uD3EC\uD2B8"}, //-sslserver - {"signed.jar.file", - "\uC11C\uBA85\uB41C jar \uD30C\uC77C"}, //=jarfile - {"certificate.validity.start.date.time", - "\uC778\uC99D\uC11C \uC720\uD6A8 \uAE30\uAC04 \uC2DC\uC791 \uB0A0\uC9DC/\uC2DC\uAC04"}, //-startdate - {"keystore.password", - "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638"}, //-storepass - {"keystore.type", - "\uD0A4 \uC800\uC7A5\uC18C \uC720\uD615"}, //-storetype - {"trust.certificates.from.cacerts", - "cacerts\uC758 \uBCF4\uC548 \uC778\uC99D\uC11C"}, //-trustcacerts - {"verbose.output", - "\uC0C1\uC138 \uC815\uBCF4 \uCD9C\uB825"}, //-v - {"validity.number.of.days", - "\uC720\uD6A8 \uAE30\uAC04 \uC77C \uC218"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "\uCCA0\uD68C\uD560 \uC778\uC99D\uC11C\uC758 \uC77C\uB828 ID"}, //-id - // keytool: Running part - {"keytool.error.", "keytool \uC624\uB958: "}, - {"Illegal.option.", "\uC798\uBABB\uB41C \uC635\uC158: "}, - {"Illegal.value.", "\uC798\uBABB\uB41C \uAC12: "}, - {"Unknown.password.type.", "\uC54C \uC218 \uC5C6\uB294 \uBE44\uBC00\uBC88\uD638 \uC720\uD615: "}, - {"Cannot.find.environment.variable.", - "\uD658\uACBD \uBCC0\uC218\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C: "}, - {"Cannot.find.file.", "\uD30C\uC77C\uC744 \uCC3E\uC744 \uC218 \uC5C6\uC74C: "}, - {"Command.option.flag.needs.an.argument.", "\uBA85\uB839 \uC635\uC158 {0}\uC5D0 \uC778\uC218\uAC00 \uD544\uC694\uD569\uB2C8\uB2E4."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "\uACBD\uACE0: \uB2E4\uB978 \uC800\uC7A5\uC18C \uBC0F \uD0A4 \uBE44\uBC00\uBC88\uD638\uB294 PKCS12 KeyStores\uC5D0 \uB300\uD574 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uC0AC\uC6A9\uC790\uAC00 \uC9C0\uC815\uD55C {0} \uAC12\uC744 \uBB34\uC2DC\uD558\uB294 \uC911\uC785\uB2C8\uB2E4."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-storetype\uC774 {0}\uC778 \uACBD\uC6B0 -keystore\uB294 NONE\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"Too.many.retries.program.terminated", - "\uC7AC\uC2DC\uB3C4 \uD69F\uC218\uAC00 \uB108\uBB34 \uB9CE\uC544 \uD504\uB85C\uADF8\uB7A8\uC774 \uC885\uB8CC\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "-storetype\uC774 {0}\uC778 \uACBD\uC6B0 -storepasswd \uBC0F -keypasswd \uBA85\uB839\uC774 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "-storetype\uC774 PKCS12\uC778 \uACBD\uC6B0 -keypasswd \uBA85\uB839\uC774 \uC9C0\uC6D0\uB418\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "-storetype\uC774 {0}\uC778 \uACBD\uC6B0 -keypass \uBC0F -new\uB97C \uC9C0\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "-protected\uB97C \uC9C0\uC815\uD55C \uACBD\uC6B0 -storepass, -keypass \uBC0F -new\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "-srcprotected\uB97C \uC9C0\uC815\uD55C \uACBD\uC6B0 -srcstorepass \uBC0F -srckeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "\uD0A4 \uC800\uC7A5\uC18C\uAC00 \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB418\uC9C0 \uC54A\uB294 \uACBD\uC6B0 -storepass, -keypass \uBC0F -new\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C\uAC00 \uBE44\uBC00\uBC88\uD638\uB85C \uBCF4\uD638\uB418\uC9C0 \uC54A\uB294 \uACBD\uC6B0 -srcstorepass \uBC0F -srckeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, - {"Illegal.startdate.value", "startdate \uAC12\uC774 \uC798\uBABB\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, - {"Validity.must.be.greater.than.zero", - "\uC720\uD6A8 \uAE30\uAC04\uC740 0\uBCF4\uB2E4 \uCEE4\uC57C \uD569\uB2C8\uB2E4."}, - {"provName.not.a.provider", "{0}\uC740(\uB294) \uC81C\uACF5\uC790\uAC00 \uC544\uB2D9\uB2C8\uB2E4."}, - {"Usage.error.no.command.provided", "\uC0AC\uC6A9\uBC95 \uC624\uB958: \uBA85\uB839\uC744 \uC785\uB825\uD558\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {"Source.keystore.file.exists.but.is.empty.", "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uD30C\uC77C\uC774 \uC874\uC7AC\uD558\uC9C0\uB9CC \uBE44\uC5B4 \uC788\uC74C: "}, - {"Please.specify.srckeystore", "-srckeystore\uB97C \uC9C0\uC815\uD558\uC2ED\uC2DC\uC624."}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "'list' \uBA85\uB839\uC5D0 -v\uC640 -rfc\uB97C \uD568\uAED8 \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, - {"Key.password.must.be.at.least.6.characters", - "\uD0A4 \uBE44\uBC00\uBC88\uD638\uB294 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"New.password.must.be.at.least.6.characters", - "\uC0C8 \uBE44\uBC00\uBC88\uD638\uB294 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"Keystore.file.exists.but.is.empty.", - "\uD0A4 \uC800\uC7A5\uC18C \uD30C\uC77C\uC774 \uC874\uC7AC\uD558\uC9C0\uB9CC \uBE44\uC5B4 \uC788\uC74C: "}, - {"Keystore.file.does.not.exist.", - "\uD0A4 \uC800\uC7A5\uC18C \uD30C\uC77C\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC74C: "}, - {"Must.specify.destination.alias", "\uB300\uC0C1 \uBCC4\uCE6D\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4."}, - {"Must.specify.alias", "\uBCC4\uCE6D\uC744 \uC9C0\uC815\uD574\uC57C \uD569\uB2C8\uB2E4."}, - {"Keystore.password.must.be.at.least.6.characters", - "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB294 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"Enter.keystore.password.", "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 \uC785\uB825: "}, - {"Enter.source.keystore.password.", "\uC18C\uC2A4 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 \uC785\uB825: "}, - {"Enter.destination.keystore.password.", "\uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 \uC785\uB825: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uAC00 \uB108\uBB34 \uC9E7\uC74C - 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"Unknown.Entry.Type", "\uC54C \uC218 \uC5C6\uB294 \uD56D\uBAA9 \uC720\uD615"}, - {"Too.many.failures.Alias.not.changed", "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4. \uBCC4\uCE6D\uC774 \uBCC0\uACBD\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {"Entry.for.alias.alias.successfully.imported.", - "{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC774 \uC131\uACF5\uC801\uC73C\uB85C \uC784\uD3EC\uD2B8\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, - {"Entry.for.alias.alias.not.imported.", "{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC774 \uC784\uD3EC\uD2B8\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC744 \uC784\uD3EC\uD2B8\uD558\uB294 \uC911 \uBB38\uC81C \uBC1C\uC0DD: {1}.\n{0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uD56D\uBAA9\uC774 \uC784\uD3EC\uD2B8\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "\uC784\uD3EC\uD2B8 \uBA85\uB839 \uC644\uB8CC: \uC131\uACF5\uC801\uC73C\uB85C \uC784\uD3EC\uD2B8\uB41C \uD56D\uBAA9\uC740 {0}\uAC1C, \uC2E4\uD328\uD558\uAC70\uB098 \uCDE8\uC18C\uB41C \uD56D\uBAA9\uC740 {1}\uAC1C\uC785\uB2C8\uB2E4."}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "\uACBD\uACE0: \uB300\uC0C1 \uD0A4 \uC800\uC7A5\uC18C\uC5D0\uC11C \uAE30\uC874 \uBCC4\uCE6D {0}\uC744(\uB97C) \uACB9\uCCD0 \uC4F0\uB294 \uC911"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "\uAE30\uC874 \uD56D\uBAA9 \uBCC4\uCE6D {0}\uC774(\uAC00) \uC874\uC7AC\uD569\uB2C8\uB2E4. \uACB9\uCCD0 \uC4F0\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, - {"Too.many.failures.try.later", "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC74C - \uB098\uC911\uC5D0 \uC2DC\uB3C4\uD558\uC2ED\uC2DC\uC624."}, - {"Certification.request.stored.in.file.filename.", - "\uC778\uC99D \uC694\uCCAD\uC774 <{0}> \uD30C\uC77C\uC5D0 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, - {"Submit.this.to.your.CA", "CA\uC5D0\uAC8C \uC81C\uCD9C\uD558\uC2ED\uC2DC\uC624."}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "\uBCC4\uCE6D\uC744 \uC9C0\uC815\uD558\uC9C0 \uC54A\uC740 \uACBD\uC6B0 destalias, srckeypass \uBC0F destkeypass\uB97C \uC9C0\uC815\uD558\uC9C0 \uC54A\uC544\uC57C \uD569\uB2C8\uB2E4."}, - {"Certificate.stored.in.file.filename.", - "\uC778\uC99D\uC11C\uAC00 <{0}> \uD30C\uC77C\uC5D0 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, - {"Certificate.reply.was.installed.in.keystore", - "\uC778\uC99D\uC11C \uD68C\uC2E0\uC774 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC124\uCE58\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, - {"Certificate.reply.was.not.installed.in.keystore", - "\uC778\uC99D\uC11C \uD68C\uC2E0\uC774 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC124\uCE58\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {"Certificate.was.added.to.keystore", - "\uC778\uC99D\uC11C\uAC00 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, - {"Certificate.was.not.added.to.keystore", - "\uC778\uC99D\uC11C\uAC00 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uCD94\uAC00\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {".Storing.ksfname.", "[{0}\uC744(\uB97C) \uC800\uC7A5\uD558\uB294 \uC911]"}, - {"alias.has.no.public.key.certificate.", - "{0}\uC5D0 \uACF5\uC6A9 \uD0A4(\uC778\uC99D\uC11C)\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Cannot.derive.signature.algorithm", - "\uC11C\uBA85 \uC54C\uACE0\uB9AC\uC998\uC744 \uD30C\uC0DD\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Alias.alias.does.not.exist", - "<{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, - {"Alias.alias.has.no.certificate", - "<{0}> \uBCC4\uCE6D\uC5D0 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Key.pair.not.generated.alias.alias.already.exists", - "\uD0A4 \uC30D\uC774 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC558\uC73C\uBA70 <{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "\uB2E4\uC74C\uC5D0 \uB300\uD574 \uC720\uD6A8 \uAE30\uAC04\uC774 {3}\uC77C\uC778 {0}\uBE44\uD2B8 {1} \uD0A4 \uC30D \uBC0F \uC790\uCCB4 \uC11C\uBA85\uB41C \uC778\uC99D\uC11C({2})\uB97C \uC0DD\uC131\uD558\uB294 \uC911\n\t: {4}"}, - {"Enter.key.password.for.alias.", "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uBE44\uBC00\uBC88\uD638\uB97C \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, - {".RETURN.if.same.as.keystore.password.", - "\t(\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uC640 \uB3D9\uC77C\uD55C \uACBD\uC6B0 Enter \uD0A4\uB97C \uB204\uB984): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "\uD0A4 \uBE44\uBC00\uBC88\uD638\uAC00 \uB108\uBB34 \uC9E7\uC74C - 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"Too.many.failures.key.not.added.to.keystore", - "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC74C - \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uD0A4\uAC00 \uCD94\uAC00\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {"Destination.alias.dest.already.exists", - "\uB300\uC0C1 \uBCC4\uCE6D <{0}>\uC774(\uAC00) \uC874\uC7AC\uD569\uB2C8\uB2E4."}, - {"Password.is.too.short.must.be.at.least.6.characters", - "\uBE44\uBC00\uBC88\uD638\uAC00 \uB108\uBB34 \uC9E7\uC74C - 6\uC790 \uC774\uC0C1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"Too.many.failures.Key.entry.not.cloned", - "\uC624\uB958\uAC00 \uB108\uBB34 \uB9CE\uC2B5\uB2C8\uB2E4. \uD0A4 \uD56D\uBAA9\uC774 \uBCF5\uC81C\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4."}, - {"key.password.for.alias.", "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uBE44\uBC00\uBC88\uD638"}, - {"Keystore.entry.for.id.getName.already.exists", - "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uC800\uC7A5\uC18C \uD56D\uBAA9\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, - {"Creating.keystore.entry.for.id.getName.", - "<{0}>\uC5D0 \uB300\uD55C \uD0A4 \uC800\uC7A5\uC18C \uD56D\uBAA9\uC744 \uC0DD\uC131\uD558\uB294 \uC911..."}, - {"No.entries.from.identity.database.added", - "ID \uB370\uC774\uD130\uBCA0\uC774\uC2A4\uC5D0\uC11C \uCD94\uAC00\uB41C \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Alias.name.alias", "\uBCC4\uCE6D \uC774\uB984: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "\uC0DD\uC131 \uB0A0\uC9DC: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "\uD56D\uBAA9 \uC720\uD615: {0}"}, - {"Certificate.chain.length.", "\uC778\uC99D\uC11C \uCCB4\uC778 \uAE38\uC774: "}, - {"Certificate.i.1.", "\uC778\uC99D\uC11C[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "\uC778\uC99D\uC11C \uC9C0\uBB38(SHA1): "}, - {"Keystore.type.", "\uD0A4 \uC800\uC7A5\uC18C \uC720\uD615: "}, - {"Keystore.provider.", "\uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790: "}, - {"Your.keystore.contains.keyStore.size.entry", - "\uD0A4 \uC800\uC7A5\uC18C\uC5D0 {0,number,integer}\uAC1C\uC758 \uD56D\uBAA9\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."}, - {"Your.keystore.contains.keyStore.size.entries", - "\uD0A4 \uC800\uC7A5\uC18C\uC5D0 {0,number,integer}\uAC1C\uC758 \uD56D\uBAA9\uC774 \uD3EC\uD568\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."}, - {"Failed.to.parse.input", "\uC785\uB825\uAC12\uC758 \uAD6C\uBB38 \uBD84\uC11D\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."}, - {"Empty.input", "\uC785\uB825\uAC12\uC774 \uBE44\uC5B4 \uC788\uC2B5\uB2C8\uB2E4."}, - {"Not.X.509.certificate", "X.509 \uC778\uC99D\uC11C\uAC00 \uC544\uB2D9\uB2C8\uB2E4."}, - {"alias.has.no.public.key", "{0}\uC5D0 \uACF5\uC6A9 \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"alias.has.no.X.509.certificate", "{0}\uC5D0 X.509 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"New.certificate.self.signed.", "\uC0C8 \uC778\uC99D\uC11C(\uC790\uCCB4 \uC11C\uBA85):"}, - {"Reply.has.no.certificates", "\uD68C\uC2E0\uC5D0 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Certificate.not.imported.alias.alias.already.exists", - "\uC778\uC99D\uC11C\uAC00 \uC784\uD3EC\uD2B8\uB418\uC9C0 \uC54A\uC558\uC73C\uBA70 <{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, - {"Input.not.an.X.509.certificate", "\uC785\uB825\uC774 X.509 \uC778\uC99D\uC11C\uAC00 \uC544\uB2D9\uB2C8\uB2E4."}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "\uC778\uC99D\uC11C\uAC00 <{0}> \uBCC4\uCE6D \uC544\uB798\uC758 \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, - {"Do.you.still.want.to.add.it.no.", - "\uCD94\uAC00\uD558\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "\uC778\uC99D\uC11C\uAC00 <{0}> \uBCC4\uCE6D \uC544\uB798\uC5D0 \uC788\uB294 \uC2DC\uC2A4\uD15C \uCC28\uC6D0\uC758 CA \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "\uACE0\uC720\uD55C \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uCD94\uAC00\uD558\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, - {"Trust.this.certificate.no.", "\uC774 \uC778\uC99D\uC11C\uB97C \uC2E0\uB8B0\uD569\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, - {"YES", "\uC608"}, - {"New.prompt.", "\uC0C8 {0}: "}, - {"Passwords.must.differ", "\uBE44\uBC00\uBC88\uD638\uB294 \uB2EC\uB77C\uC57C \uD569\uB2C8\uB2E4."}, - {"Re.enter.new.prompt.", "\uC0C8 {0} \uB2E4\uC2DC \uC785\uB825: "}, - {"Re.enter.new.password.", "\uC0C8 \uBE44\uBC00\uBC88\uD638 \uB2E4\uC2DC \uC785\uB825: "}, - {"They.don.t.match.Try.again", "\uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC2ED\uC2DC\uC624."}, - {"Enter.prompt.alias.name.", "{0} \uBCC4\uCE6D \uC774\uB984 \uC785\uB825: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "\uC0C8 \uBCC4\uCE6D \uC774\uB984 \uC785\uB825\t(\uC774 \uD56D\uBAA9\uC5D0 \uB300\uD55C \uC784\uD3EC\uD2B8\uB97C \uCDE8\uC18C\uD558\uB824\uBA74 Enter \uD0A4\uB97C \uB204\uB984): "}, - {"Enter.alias.name.", "\uBCC4\uCE6D \uC774\uB984 \uC785\uB825: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(<{0}>\uACFC(\uC640) \uB3D9\uC77C\uD55C \uACBD\uC6B0 Enter \uD0A4\uB97C \uB204\uB984)"}, - {".PATTERN.printX509Cert", - "\uC18C\uC720\uC790: {0}\n\uBC1C\uD589\uC790: {1}\n\uC77C\uB828 \uBC88\uD638: {2}\n\uC801\uD569\uD55C \uC2DC\uC791 \uB0A0\uC9DC: {3}, \uC885\uB8CC \uB0A0\uC9DC: {4}\n\uC778\uC99D\uC11C \uC9C0\uBB38:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \uC11C\uBA85 \uC54C\uACE0\uB9AC\uC998 \uC774\uB984: {8}\n\t \uBC84\uC804: {9}"}, - {"What.is.your.first.and.last.name.", - "\uC774\uB984\uACFC \uC131\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, - {"What.is.the.name.of.your.organizational.unit.", - "\uC870\uC9C1 \uB2E8\uC704 \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, - {"What.is.the.name.of.your.organization.", - "\uC870\uC9C1 \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, - {"What.is.the.name.of.your.City.or.Locality.", - "\uAD6C/\uAD70/\uC2DC \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624?"}, - {"What.is.the.name.of.your.State.or.Province.", - "\uC2DC/\uB3C4 \uC774\uB984\uC744 \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "\uC774 \uC870\uC9C1\uC758 \uB450 \uC790\uB9AC \uAD6D\uAC00 \uCF54\uB4DC\uB97C \uC785\uB825\uD558\uC2ED\uC2DC\uC624."}, - {"Is.name.correct.", "{0}\uC774(\uAC00) \uB9DE\uC2B5\uB2C8\uAE4C?"}, - {"no", "\uC544\uB2C8\uC624"}, - {"yes", "\uC608"}, - {"y", "y"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "<{0}> \uBCC4\uCE6D\uC5D0 \uD0A4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "<{0}> \uBCC4\uCE6D\uC740 \uC804\uC6A9 \uD0A4 \uD56D\uBAA9\uC774 \uC544\uB2CC \uD56D\uBAA9 \uC720\uD615\uC744 \uCC38\uC870\uD569\uB2C8\uB2E4. -keyclone \uBA85\uB839\uC740 \uC804\uC6A9 \uD0A4 \uD56D\uBAA9\uC758 \uBCF5\uC81C\uB9CC \uC9C0\uC6D0\uD569\uB2C8\uB2E4."}, - - {".WARNING.WARNING.WARNING.", - "***************** \uACBD\uACE0 \uACBD\uACE0 \uACBD\uACE0 *****************"}, - {"Signer.d.", "\uC11C\uBA85\uC790 #%d:"}, - {"Timestamp.", "\uC2DC\uAC04 \uAE30\uB85D:"}, - {"Signature.", "\uC11C\uBA85:"}, - {"CRLs.", "CRL:"}, - {"Certificate.owner.", "\uC778\uC99D\uC11C \uC18C\uC720\uC790: "}, - {"Not.a.signed.jar.file", "\uC11C\uBA85\uB41C jar \uD30C\uC77C\uC774 \uC544\uB2D9\uB2C8\uB2E4."}, - {"No.certificate.from.the.SSL.server", - "SSL \uC11C\uBC84\uC5D0\uC11C \uAC00\uC838\uC628 \uC778\uC99D\uC11C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* \uD0A4 \uC800\uC7A5\uC18C\uC5D0 \uC800\uC7A5\uB41C \uC815\uBCF4\uC758 \uBB34\uACB0\uC131\uC774 *\n* \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4! \uBB34\uACB0\uC131\uC744 \uD655\uC778\uD558\uB824\uBA74, *\n* \uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638\uB97C \uC81C\uACF5\uD574\uC57C \uD569\uB2C8\uB2E4. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* srckeystore\uC5D0 \uC800\uC7A5\uB41C \uC815\uBCF4\uC758 \uBB34\uACB0\uC131\uC774 *\n* \uD655\uC778\uB418\uC9C0 \uC54A\uC558\uC2B5\uB2C8\uB2E4! \uBB34\uACB0\uC131\uC744 \uD655\uC778\uD558\uB824\uBA74, *\n* srckeystore \uBE44\uBC00\uBC88\uD638\uB97C \uC81C\uACF5\uD574\uC57C \uD569\uB2C8\uB2E4. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "\uC778\uC99D\uC11C \uD68C\uC2E0\uC5D0 <{0}>\uC5D0 \uB300\uD55C \uACF5\uC6A9 \uD0A4\uAC00 \uD3EC\uD568\uB418\uC5B4 \uC788\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, - {"Incomplete.certificate.chain.in.reply", - "\uD68C\uC2E0\uC5D0 \uBD88\uC644\uC804\uD55C \uC778\uC99D\uC11C \uCCB4\uC778\uC774 \uC788\uC2B5\uB2C8\uB2E4."}, - {"Certificate.chain.in.reply.does.not.verify.", - "\uD68C\uC2E0\uC758 \uC778\uC99D\uC11C \uCCB4\uC778\uC774 \uD655\uC778\uB418\uC9C0 \uC54A\uC74C: "}, - {"Top.level.certificate.in.reply.", - "\uD68C\uC2E0\uC5D0 \uCD5C\uC0C1\uC704 \uB808\uBCA8 \uC778\uC99D\uC11C\uAC00 \uC788\uC74C:\n"}, - {".is.not.trusted.", "...\uC744(\uB97C) \uC2E0\uB8B0\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. "}, - {"Install.reply.anyway.no.", "\uD68C\uC2E0\uC744 \uC124\uCE58\uD558\uACA0\uC2B5\uB2C8\uAE4C? [\uC544\uB2C8\uC624]: "}, - {"NO", "\uC544\uB2C8\uC624"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "\uD68C\uC2E0\uACFC \uD0A4 \uC800\uC7A5\uC18C\uC758 \uACF5\uC6A9 \uD0A4\uAC00 \uC77C\uCE58\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4."}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "\uD68C\uC2E0\uACFC \uD0A4 \uC800\uC7A5\uC18C\uC758 \uC778\uC99D\uC11C\uAC00 \uB3D9\uC77C\uD569\uB2C8\uB2E4."}, - {"Failed.to.establish.chain.from.reply", - "\uD68C\uC2E0\uC758 \uCCB4\uC778 \uC124\uC815\uC744 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4."}, - {"n", "n"}, - {"Wrong.answer.try.again", "\uC798\uBABB\uB41C \uC751\uB2F5\uC785\uB2C8\uB2E4. \uB2E4\uC2DC \uC2DC\uB3C4\uD558\uC2ED\uC2DC\uC624."}, - {"Secret.key.not.generated.alias.alias.already.exists", - "\uBCF4\uC548 \uD0A4\uAC00 \uC0DD\uC131\uB418\uC9C0 \uC54A\uC558\uC73C\uBA70 <{0}> \uBCC4\uCE6D\uC774 \uC874\uC7AC\uD569\uB2C8\uB2E4."}, - {"Please.provide.keysize.for.secret.key.generation", - "\uBCF4\uC548 \uD0A4\uB97C \uC0DD\uC131\uD558\uB824\uBA74 -keysize\uB97C \uC81C\uACF5\uD558\uC2ED\uC2DC\uC624."}, - - {"Extensions.", "\uD655\uC7A5: "}, - {".Empty.value.", "(\uBE44\uC5B4 \uC788\uB294 \uAC12)"}, - {"Extension.Request.", "\uD655\uC7A5 \uC694\uCCAD:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "PKCS #10 \uC778\uC99D\uC11C \uC694\uCCAD(1.0 \uBC84\uC804)\n\uC81C\uBAA9: %s\n\uACF5\uC6A9 \uD0A4: %s \uD615\uC2DD %s \uD0A4\n"}, - {"Unknown.keyUsage.type.", "\uC54C \uC218 \uC5C6\uB294 keyUsage \uC720\uD615: "}, - {"Unknown.extendedkeyUsage.type.", "\uC54C \uC218 \uC5C6\uB294 extendedkeyUsage \uC720\uD615: "}, - {"Unknown.AccessDescription.type.", "\uC54C \uC218 \uC5C6\uB294 AccessDescription \uC720\uD615: "}, - {"Unrecognized.GeneralName.type.", "\uC54C \uC218 \uC5C6\uB294 GeneralName \uC720\uD615: "}, - {"This.extension.cannot.be.marked.as.critical.", - "\uC774 \uD655\uC7A5\uC740 \uC911\uC694\uD55C \uAC83\uC73C\uB85C \uD45C\uC2DC\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4. "}, - {"Odd.number.of.hex.digits.found.", "\uD640\uC218 \uAC1C\uC758 16\uC9C4\uC218\uAC00 \uBC1C\uACAC\uB428: "}, - {"Unknown.extension.type.", "\uC54C \uC218 \uC5C6\uB294 \uD655\uC7A5 \uC720\uD615: "}, - {"command.{0}.is.ambiguous.", "{0} \uBA85\uB839\uC774 \uBAA8\uD638\uD568:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "\uACBD\uACE0: {0} \uBCC4\uCE6D\uC5D0 \uB300\uD55C \uACF5\uC6A9 \uD0A4\uAC00 \uC874\uC7AC\uD558\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4. \uD0A4 \uC800\uC7A5\uC18C\uAC00 \uC81C\uB300\uB85C \uAD6C\uC131\uB418\uC5B4 \uC788\uB294\uC9C0 \uD655\uC778\uD558\uC2ED\uC2DC\uC624."}, - {"Warning.Class.not.found.class", "\uACBD\uACE0: \uD074\uB798\uC2A4\uB97C \uCC3E\uC744 \uC218 \uC5C6\uC74C: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "\uACBD\uACE0: \uC0DD\uC131\uC790\uC5D0 \uB300\uD574 \uBD80\uC801\uD569\uD55C \uC778\uC218: {0}"}, - {"Illegal.Principal.Type.type", "\uC798\uBABB\uB41C \uC8FC\uCCB4 \uC720\uD615: {0}"}, - {"Illegal.option.option", "\uC798\uBABB\uB41C \uC635\uC158: {0}"}, - {"Usage.policytool.options.", "\uC0AC\uC6A9\uBC95: policytool [options]"}, - {".file.file.policy.file.location", - " [-file ] \uC815\uCC45 \uD30C\uC77C \uC704\uCE58"}, - {"New", "\uC0C8\uB85C \uB9CC\uB4E4\uAE30"}, - {"Open", "\uC5F4\uAE30"}, - {"Save", "\uC800\uC7A5"}, - {"Save.As", "\uB2E4\uB978 \uC774\uB984\uC73C\uB85C \uC800\uC7A5"}, - {"View.Warning.Log", "\uACBD\uACE0 \uB85C\uADF8 \uBCF4\uAE30"}, - {"Exit", "\uC885\uB8CC"}, - {"Add.Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9 \uCD94\uAC00"}, - {"Edit.Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9 \uD3B8\uC9D1"}, - {"Remove.Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9 \uC81C\uAC70"}, - {"Edit", "\uD3B8\uC9D1"}, - {"Retain", "\uC720\uC9C0"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "\uACBD\uACE0: \uD30C\uC77C \uC774\uB984\uC5D0 \uC774\uC2A4\uCF00\uC774\uD504\uB41C \uBC31\uC2AC\uB798\uC2DC \uBB38\uC790\uAC00 \uD3EC\uD568\uB418\uC5C8\uC744 \uC218 \uC788\uC2B5\uB2C8\uB2E4. \uBC31\uC2AC\uB798\uC2DC \uBB38\uC790\uB294 \uC774\uC2A4\uCF00\uC774\uD504\uD560 \uD544\uC694\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC601\uAD6C \uC800\uC7A5\uC18C\uC5D0 \uC815\uCC45 \uCF58\uD150\uCE20\uB97C \uC4F8 \uB54C \uD544\uC694\uC5D0 \uB530\uB77C \uC790\uB3D9\uC73C\uB85C \uBB38\uC790\uAC00 \uC774\uC2A4\uCF00\uC774\uD504\uB429\uB2C8\uB2E4.\n\n\uC785\uB825\uB41C \uC774\uB984\uC744 \uADF8\uB300\uB85C \uC720\uC9C0\uD558\uB824\uBA74 [\uC720\uC9C0]\uB97C \uB204\uB974\uACE0, \uC774\uB984\uC744 \uD3B8\uC9D1\uD558\uB824\uBA74 [\uD3B8\uC9D1]\uC744 \uB204\uB974\uC2ED\uC2DC\uC624."}, - - {"Add.Public.Key.Alias", "\uACF5\uC6A9 \uD0A4 \uBCC4\uCE6D \uCD94\uAC00"}, - {"Remove.Public.Key.Alias", "\uACF5\uC6A9 \uD0A4 \uBCC4\uCE6D \uC81C\uAC70"}, - {"File", "\uD30C\uC77C"}, - {"KeyStore", "\uD0A4 \uC800\uC7A5\uC18C"}, - {"Policy.File.", "\uC815\uCC45 \uD30C\uC77C:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "\uC815\uCC45 \uD30C\uC77C\uC744 \uC5F4 \uC218 \uC5C6\uC74C: {0}: {1}"}, - {"Policy.Tool", "\uC815\uCC45 \uD234"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "\uC815\uCC45 \uAD6C\uC131\uC744 \uC5EC\uB294 \uC911 \uC624\uB958\uAC00 \uBC1C\uC0DD\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uB0B4\uC6A9\uC740 \uACBD\uACE0 \uB85C\uADF8\uB97C \uD655\uC778\uD558\uC2ED\uC2DC\uC624."}, - {"Error", "\uC624\uB958"}, - {"OK", "\uD655\uC778"}, - {"Status", "\uC0C1\uD0DC"}, - {"Warning", "\uACBD\uACE0"}, - {"Permission.", - "\uAD8C\uD55C: "}, - {"Principal.Type.", "\uC8FC\uCCB4 \uC720\uD615:"}, - {"Principal.Name.", "\uC8FC\uCCB4 \uC774\uB984:"}, - {"Target.Name.", - "\uB300\uC0C1 \uC774\uB984: "}, - {"Actions.", - "\uC791\uC5C5: "}, - {"OK.to.overwrite.existing.file.filename.", - "\uAE30\uC874 \uD30C\uC77C {0}\uC744(\uB97C) \uACB9\uCCD0 \uC4F0\uACA0\uC2B5\uB2C8\uAE4C?"}, - {"Cancel", "\uCDE8\uC18C"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "\uC8FC\uCCB4 \uCD94\uAC00"}, - {"Edit.Principal", "\uC8FC\uCCB4 \uD3B8\uC9D1"}, - {"Remove.Principal", "\uC8FC\uCCB4 \uC81C\uAC70"}, - {"Principals.", "\uC8FC\uCCB4:"}, - {".Add.Permission", " \uAD8C\uD55C \uCD94\uAC00"}, - {".Edit.Permission", " \uAD8C\uD55C \uD3B8\uC9D1"}, - {"Remove.Permission", "\uAD8C\uD55C \uC81C\uAC70"}, - {"Done", "\uC644\uB8CC"}, - {"KeyStore.URL.", "\uD0A4 \uC800\uC7A5\uC18C URL:"}, - {"KeyStore.Type.", "\uD0A4 \uC800\uC7A5\uC18C \uC720\uD615:"}, - {"KeyStore.Provider.", "\uD0A4 \uC800\uC7A5\uC18C \uC81C\uACF5\uC790:"}, - {"KeyStore.Password.URL.", "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 URL:"}, - {"Principals", "\uC8FC\uCCB4"}, - {".Edit.Principal.", " \uC8FC\uCCB4 \uD3B8\uC9D1:"}, - {".Add.New.Principal.", " \uC0C8 \uC8FC\uCCB4 \uCD94\uAC00:"}, - {"Permissions", "\uAD8C\uD55C"}, - {".Edit.Permission.", " \uAD8C\uD55C \uD3B8\uC9D1:"}, - {".Add.New.Permission.", " \uC0C8 \uAD8C\uD55C \uCD94\uAC00:"}, - {"Signed.By.", "\uC11C\uBA85\uC790:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "\uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790 \uC774\uB984 \uC5C6\uC774 \uC640\uC77C\uB4DC \uCE74\uB4DC \uBB38\uC790 \uD074\uB798\uC2A4\uB97C \uC0AC\uC6A9\uD558\uB294 \uC8FC\uCCB4\uB97C \uC9C0\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Cannot.Specify.Principal.without.a.Name", - "\uC774\uB984 \uC5C6\uC774 \uC8FC\uCCB4\uB97C \uC9C0\uC815\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Permission.and.Target.Name.must.have.a.value", - "\uAD8C\uD55C\uACFC \uB300\uC0C1 \uC774\uB984\uC758 \uAC12\uC774 \uC788\uC5B4\uC57C \uD569\uB2C8\uB2E4."}, - {"Remove.this.Policy.Entry.", "\uC774 \uC815\uCC45 \uD56D\uBAA9\uC744 \uC81C\uAC70\uD558\uACA0\uC2B5\uB2C8\uAE4C?"}, - {"Overwrite.File", "\uD30C\uC77C \uACB9\uCCD0\uC4F0\uAE30"}, - {"Policy.successfully.written.to.filename", - "{0}\uC5D0 \uC131\uACF5\uC801\uC73C\uB85C \uC815\uCC45\uC744 \uC37C\uC2B5\uB2C8\uB2E4."}, - {"null.filename", "\uB110 \uD30C\uC77C \uC774\uB984"}, - {"Save.changes.", "\uBCC0\uACBD \uC0AC\uD56D\uC744 \uC800\uC7A5\uD558\uACA0\uC2B5\uB2C8\uAE4C?"}, - {"Yes", "\uC608"}, - {"No", "\uC544\uB2C8\uC624"}, - {"Policy.Entry", "\uC815\uCC45 \uD56D\uBAA9"}, - {"Save.Changes", "\uBCC0\uACBD \uC0AC\uD56D \uC800\uC7A5"}, - {"No.Policy.Entry.selected", "\uC120\uD0DD\uB41C \uC815\uCC45 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"Unable.to.open.KeyStore.ex.toString.", - "\uD0A4 \uC800\uC7A5\uC18C\uB97C \uC5F4 \uC218 \uC5C6\uC74C: {0}"}, - {"No.principal.selected", "\uC120\uD0DD\uB41C \uC8FC\uCCB4\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"No.permission.selected", "\uC120\uD0DD\uB41C \uAD8C\uD55C\uC774 \uC5C6\uC2B5\uB2C8\uB2E4."}, - {"name", "\uC774\uB984"}, - {"configuration.type", "\uAD6C\uC131 \uC720\uD615"}, - {"environment.variable.name", "\uD658\uACBD \uBCC0\uC218 \uC774\uB984"}, - {"library.name", "\uB77C\uC774\uBE0C\uB7EC\uB9AC \uC774\uB984"}, - {"package.name", "\uD328\uD0A4\uC9C0 \uC774\uB984"}, - {"policy.type", "\uC815\uCC45 \uC720\uD615"}, - {"property.name", "\uC18D\uC131 \uC774\uB984"}, - {"Principal.List", "\uC8FC\uCCB4 \uBAA9\uB85D"}, - {"Permission.List", "\uAD8C\uD55C \uBAA9\uB85D"}, - {"Code.Base", "\uCF54\uB4DC \uBCA0\uC774\uC2A4"}, - {"KeyStore.U.R.L.", "\uD0A4 \uC800\uC7A5\uC18C URL:"}, - {"KeyStore.Password.U.R.L.", "\uD0A4 \uC800\uC7A5\uC18C \uBE44\uBC00\uBC88\uD638 URL:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "\uB110 \uC785\uB825\uAC12\uC774 \uBD80\uC801\uD569\uD569\uB2C8\uB2E4."}, {"actions.can.only.be.read.", "\uC791\uC5C5\uC740 '\uC77D\uAE30' \uC804\uC6A9\uC785\uB2C8\uB2E4."}, @@ -553,6 +58,7 @@ public class Resources_ko extends java.util.ListResourceBundle { {"provided.null.OID.map", "\uB110 OID \uB9F5\uC744 \uC81C\uACF5\uD588\uC2B5\uB2C8\uB2E4."}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "\uBD80\uC801\uD569\uD55C \uB110 AccessControlContext\uAC00 \uC81C\uACF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, {"invalid.null.action.provided", "\uBD80\uC801\uD569\uD55C \uB110 \uC791\uC5C5\uC774 \uC81C\uACF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4."}, @@ -656,6 +162,7 @@ public class Resources_ko extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_pt_BR.java b/jdk/src/share/classes/sun/security/util/Resources_pt_BR.java index 698827f388e..317a1cbb2c3 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_pt_BR.java +++ b/jdk/src/share/classes/sun/security/util/Resources_pt_BR.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_pt_BR extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [Op\u00E7\u00E3o]..."}, - {"Options.", "Op\u00E7\u00F5es:"}, - {"Use.keytool.help.for.all.available.commands", - "Use \"keytool -help\" para todos os comandos dispon\u00EDveis"}, - {"Key.and.Certificate.Management.Tool", - "Ferramenta de Gerenciamento de Chave e Certificado"}, - {"Commands.", "Comandos:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "Use \"keytool -command_name -help\" para uso de command_name"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "Gera uma solicita\u00E7\u00E3o de certificado"}, //-certreq - {"Changes.an.entry.s.alias", - "Altera um alias de entrada"}, //-changealias - {"Deletes.an.entry", - "Deleta uma entrada"}, //-delete - {"Exports.certificate", - "Exporta o certificado"}, //-exportcert - {"Generates.a.key.pair", - "Gera um par de chaves"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "Gera uma chave Secreta"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "Gera um certificado de uma solicita\u00E7\u00E3o de certificado"}, //-gencert - {"Generates.CRL", "Gera CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "Importa entradas de um banco de dados de identidade JDK 1.1.x-style"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "Importa um certificado ou uma cadeia de certificados"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "Importa uma ou todas as entradas de outra \u00E1rea de armazenamento de chaves"}, //-importkeystore - {"Clones.a.key.entry", - "Clona uma entrada de chave"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "Altera a senha da chave de uma entrada"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "Lista entradas em uma \u00E1rea de armazenamento de chaves"}, //-list - {"Prints.the.content.of.a.certificate", - "Imprime o conte\u00FAdo de um certificado"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "Imprime o conte\u00FAdo de uma solicita\u00E7\u00E3o de certificado"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "Imprime o conte\u00FAdo de um arquivo CRL"}, //-printcrl - {"Generates.a.self.signed.certificate", - "Gera um certificado autoassinado"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "Altera a senha de armazenamento de uma \u00E1rea de armazenamento de chaves"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "nome do alias da entrada a ser processada"}, //-alias - {"destination.alias", - "alias de destino"}, //-destalias - {"destination.key.password", - "senha da chave de destino"}, //-destkeypass - {"destination.keystore.name", - "nome da \u00E1rea de armazenamento de chaves de destino"}, //-destkeystore - {"destination.keystore.password.protected", - "senha protegida da \u00E1rea de armazenamento de chaves de destino"}, //-destprotected - {"destination.keystore.provider.name", - "nome do fornecedor da \u00E1rea de armazenamento de chaves de destino"}, //-destprovidername - {"destination.keystore.password", - "senha da \u00E1rea de armazenamento de chaves de destino"}, //-deststorepass - {"destination.keystore.type", - "tipo de \u00E1rea de armazenamento de chaves de destino"}, //-deststoretype - {"distinguished.name", - "nome distinto"}, //-dname - {"X.509.extension", - "extens\u00E3o X.509"}, //-ext - {"output.file.name", - "nome do arquivo de sa\u00EDda"}, //-file and -outfile - {"input.file.name", - "nome do arquivo de entrada"}, //-file and -infile - {"key.algorithm.name", - "nome do algoritmo da chave"}, //-keyalg - {"key.password", - "senha da chave"}, //-keypass - {"key.bit.size", - "tamanho do bit da chave"}, //-keysize - {"keystore.name", - "nome da \u00E1rea de armazenamento de chaves"}, //-keystore - {"new.password", - "nova senha"}, //-new - {"do.not.prompt", - "n\u00E3o perguntar"}, //-noprompt - {"password.through.protected.mechanism", - "senha por meio de mecanismo protegido"}, //-protected - {"provider.argument", - "argumento do fornecedor"}, //-providerarg - {"provider.class.name", - "nome da classe do fornecedor"}, //-providerclass - {"provider.name", - "nome do fornecedor"}, //-providername - {"provider.classpath", - "classpath do fornecedor"}, //-providerpath - {"output.in.RFC.style", - "sa\u00EDda no estilo RFC"}, //-rfc - {"signature.algorithm.name", - "nome do algoritmo de assinatura"}, //-sigalg - {"source.alias", - "alias de origem"}, //-srcalias - {"source.key.password", - "senha da chave de origem"}, //-srckeypass - {"source.keystore.name", - "nome da \u00E1rea de armazenamento de chaves de origem"}, //-srckeystore - {"source.keystore.password.protected", - "senha protegida da \u00E1rea de armazenamento de chaves de origem"}, //-srcprotected - {"source.keystore.provider.name", - "nome do fornecedor da \u00E1rea de armazenamento de chaves de origem"}, //-srcprovidername - {"source.keystore.password", - "senha da \u00E1rea de armazenamento de chaves de origem"}, //-srcstorepass - {"source.keystore.type", - "tipo de \u00E1rea de armazenamento de chaves de origem"}, //-srcstoretype - {"SSL.server.host.and.port", - "porta e host do servidor SSL"}, //-sslserver - {"signed.jar.file", - "arquivo jar assinado"}, //=jarfile - {"certificate.validity.start.date.time", - "data/hora inicial de validade do certificado"}, //-startdate - {"keystore.password", - "senha da \u00E1rea de armazenamento de chaves"}, //-storepass - {"keystore.type", - "tipo de \u00E1rea de armazenamento de chaves"}, //-storetype - {"trust.certificates.from.cacerts", - "certificados confi\u00E1veis do cacerts"}, //-trustcacerts - {"verbose.output", - "sa\u00EDda detalhada"}, //-v - {"validity.number.of.days", - "n\u00FAmero de dias da validade"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "ID de s\u00E9rie do certificado a ser revogado"}, //-id - // keytool: Running part - {"keytool.error.", "erro de keytool: "}, - {"Illegal.option.", "Op\u00E7\u00E3o inv\u00E1lida: "}, - {"Illegal.value.", "Valor inv\u00E1lido: "}, - {"Unknown.password.type.", "Tipo de senha desconhecido: "}, - {"Cannot.find.environment.variable.", - "N\u00E3o \u00E9 poss\u00EDvel localizar a vari\u00E1vel do ambiente: "}, - {"Cannot.find.file.", "N\u00E3o \u00E9 poss\u00EDvel localizar o arquivo: "}, - {"Command.option.flag.needs.an.argument.", "A op\u00E7\u00E3o de comando {0} precisa de um argumento."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "Advert\u00EAncia: Senhas de chave e de armazenamento diferentes n\u00E3o suportadas para KeyStores PKCS12. Ignorando valor {0} especificado pelo usu\u00E1rio."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-keystore deve ser NONE se -storetype for {0}"}, - {"Too.many.retries.program.terminated", - "Excesso de tentativas de repeti\u00E7\u00E3o; programa finalizado"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "comandos -storepasswd e -keypasswd n\u00E3o suportados se -storetype for {0}"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "comandos -keypasswd n\u00E3o suportados se -storetype for PKCS12"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "-keypass e -new n\u00E3o podem ser especificados se -storetype for {0}"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "se -protected for especificado, ent\u00E3o -storepass, -keypass e -new n\u00E3o dever\u00E3o ser especificados"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "se -srcprotected for especificado, ent\u00E3o -srcstorepass e -srckeypass n\u00E3o dever\u00E3o ser especificados"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "se a \u00E1rea de armazenamento de chaves n\u00E3o estiver protegida por senha, ent\u00E3o -storepass, -keypass e -new n\u00E3o dever\u00E3o ser especificados"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "se a \u00E1rea de armazenamento de chaves de origem n\u00E3o estiver protegida por senha, ent\u00E3o -srcstorepass e -srckeypass n\u00E3o dever\u00E3o ser especificados"}, - {"Illegal.startdate.value", "valor da data inicial inv\u00E1lido"}, - {"Validity.must.be.greater.than.zero", - "A validade deve ser maior do que zero"}, - {"provName.not.a.provider", "{0} n\u00E3o \u00E9 um fornecedor"}, - {"Usage.error.no.command.provided", "Erro de uso: nenhum comando fornecido"}, - {"Source.keystore.file.exists.but.is.empty.", "O arquivo da \u00E1rea de armazenamento de chaves de origem existe, mas est\u00E1 vazio: "}, - {"Please.specify.srckeystore", "Especifique -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "N\u00E3o devem ser especificados -v e -rfc com o comando 'list'"}, - {"Key.password.must.be.at.least.6.characters", - "A senha da chave deve ter, no m\u00EDnimo, 6 caracteres"}, - {"New.password.must.be.at.least.6.characters", - "A nova senha deve ter, no m\u00EDnimo, 6 caracteres"}, - {"Keystore.file.exists.but.is.empty.", - "O arquivo da \u00E1rea de armazenamento de chaves existe, mas est\u00E1 vazio: "}, - {"Keystore.file.does.not.exist.", - "O arquivo da \u00E1rea de armazenamento de chaves n\u00E3o existe. "}, - {"Must.specify.destination.alias", "Deve ser especificado um alias de destino"}, - {"Must.specify.alias", "Deve ser especificado um alias"}, - {"Keystore.password.must.be.at.least.6.characters", - "A senha da \u00E1rea de armazenamento de chaves deve ter, no m\u00EDnimo, 6 caracteres"}, - {"Enter.keystore.password.", "Informe a senha da \u00E1rea de armazenamento de chaves: "}, - {"Enter.source.keystore.password.", "Informe a senha da \u00E1rea de armazenamento de chaves de origem: "}, - {"Enter.destination.keystore.password.", "Informe a senha da \u00E1rea de armazenamento de chaves de destino: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "A senha da \u00E1rea de armazenamento de chaves \u00E9 muito curta - ela deve ter, no m\u00EDnimo, 6 caracteres"}, - {"Unknown.Entry.Type", "Tipo de Entrada Desconhecido"}, - {"Too.many.failures.Alias.not.changed", "Excesso de falhas. Alias n\u00E3o alterado"}, - {"Entry.for.alias.alias.successfully.imported.", - "Entrada do alias {0} importada com \u00EAxito."}, - {"Entry.for.alias.alias.not.imported.", "Entrada do alias {0} n\u00E3o importada."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "Problema ao importar a entrada do alias {0}: {1}.\nEntrada do alias {0} n\u00E3o importada."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "Comando de importa\u00E7\u00E3o conclu\u00EDdo: {0} entradas importadas com \u00EAxito, {1} entradas falharam ou foram canceladas"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "Advert\u00EAncia: Substitui\u00E7\u00E3o do alias {0} existente na \u00E1rea de armazenamento de chaves de destino"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "Entrada j\u00E1 existente no alias {0}, substituir? [n\u00E3o]: "}, - {"Too.many.failures.try.later", "Excesso de falhas - tente mais tarde"}, - {"Certification.request.stored.in.file.filename.", - "Solicita\u00E7\u00E3o de certificado armazenada no arquivo <{0}>"}, - {"Submit.this.to.your.CA", "Submeter \u00E0 CA"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "se o alias n\u00E3o estiver especificado, destalias, srckeypass e destkeypass n\u00E3o dever\u00E3o ser especificados"}, - {"Certificate.stored.in.file.filename.", - "Certificado armazenado no arquivo <{0}>"}, - {"Certificate.reply.was.installed.in.keystore", - "A resposta do certificado foi instalada na \u00E1rea de armazenamento de chaves"}, - {"Certificate.reply.was.not.installed.in.keystore", - "A resposta do certificado n\u00E3o foi instalada na \u00E1rea de armazenamento de chaves"}, - {"Certificate.was.added.to.keystore", - "O certificado foi adicionado \u00E0 \u00E1rea de armazenamento de chaves"}, - {"Certificate.was.not.added.to.keystore", - "O certificado n\u00E3o foi adicionado \u00E0 \u00E1rea de armazenamento de chaves"}, - {".Storing.ksfname.", "[Armazenando {0}]"}, - {"alias.has.no.public.key.certificate.", - "{0} n\u00E3o tem chave p\u00FAblica (certificado)"}, - {"Cannot.derive.signature.algorithm", - "N\u00E3o \u00E9 poss\u00EDvel obter um algoritmo de assinatura"}, - {"Alias.alias.does.not.exist", - "O alias <{0}> n\u00E3o existe"}, - {"Alias.alias.has.no.certificate", - "O alias <{0}> n\u00E3o tem certificado"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "Par de chaves n\u00E3o gerado; o alias <{0}> j\u00E1 existe"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "Gerando o par de chaves {1} de {0} bit e o certificado autoassinado ({2}) com uma validade de {3} dias\n\tpara: {4}"}, - {"Enter.key.password.for.alias.", "Informar a senha da chave de <{0}>"}, - {".RETURN.if.same.as.keystore.password.", - "\t(RETURN se for igual \u00E0 senha da \u00E1rea do armazenamento de chaves): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "A senha da chave \u00E9 muito curta - deve ter, no m\u00EDnimo, 6 caracteres"}, - {"Too.many.failures.key.not.added.to.keystore", - "Excesso de falhas - chave n\u00E3o adicionada a \u00E1rea de armazenamento de chaves"}, - {"Destination.alias.dest.already.exists", - "O alias de destino <{0}> j\u00E1 existe"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "A senha \u00E9 muito curta - deve ter, no m\u00EDnimo, 6 caracteres"}, - {"Too.many.failures.Key.entry.not.cloned", - "Excesso de falhas. Entrada da chave n\u00E3o clonada"}, - {"key.password.for.alias.", "senha da chave de <{0}>"}, - {"Keystore.entry.for.id.getName.already.exists", - "A entrada da \u00E1rea do armazenamento de chaves de <{0}> j\u00E1 existe"}, - {"Creating.keystore.entry.for.id.getName.", - "Criando entrada da \u00E1rea do armazenamento de chaves para <{0}> ..."}, - {"No.entries.from.identity.database.added", - "Nenhuma entrada adicionada do banco de dados de identidades"}, - {"Alias.name.alias", "Nome do alias: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "Data de cria\u00E7\u00E3o: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "Tipo de entrada: {0}"}, - {"Certificate.chain.length.", "Comprimento da cadeia de certificados: "}, - {"Certificate.i.1.", "Certificado[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "Fingerprint (MD5) do certificado: "}, - {"Keystore.type.", "Tipo de \u00E1rea de armazenamento de chaves: "}, - {"Keystore.provider.", "Fornecedor da \u00E1rea de armazenamento de chaves: "}, - {"Your.keystore.contains.keyStore.size.entry", - "Sua \u00E1rea de armazenamento de chaves cont\u00E9m {0,number,integer} entrada"}, - {"Your.keystore.contains.keyStore.size.entries", - "Sua \u00E1rea de armazenamento de chaves cont\u00E9m {0,number,integer} entradas"}, - {"Failed.to.parse.input", "Falha durante o parse da entrada"}, - {"Empty.input", "Entrada vazia"}, - {"Not.X.509.certificate", "N\u00E3o \u00E9 um certificado X.509"}, - {"alias.has.no.public.key", "{0} n\u00E3o tem chave p\u00FAblica"}, - {"alias.has.no.X.509.certificate", "{0} n\u00E3o tem certificado X.509"}, - {"New.certificate.self.signed.", "Novo certificado (autoassinado):"}, - {"Reply.has.no.certificates", "A resposta n\u00E3o tem certificado"}, - {"Certificate.not.imported.alias.alias.already.exists", - "Certificado n\u00E3o importado, o alias <{0}> j\u00E1 existe"}, - {"Input.not.an.X.509.certificate", "A entrada n\u00E3o \u00E9 um certificado X.509"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "O certificado j\u00E1 existe no armazenamento de chaves no alias <{0}>"}, - {"Do.you.still.want.to.add.it.no.", - "Ainda deseja adicion\u00E1-lo? [n\u00E3o]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "O certificado j\u00E1 existe na \u00E1rea de armazenamento de chaves da CA em todo o sistema no alias <{0}>"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "Ainda deseja adicion\u00E1-lo \u00E0 sua \u00E1rea de armazenamento de chaves? [n\u00E3o]: "}, - {"Trust.this.certificate.no.", "Confiar neste certificado? [n\u00E3o]: "}, - {"YES", "Sim"}, - {"New.prompt.", "Nova {0}: "}, - {"Passwords.must.differ", "As senhas devem ser diferentes"}, - {"Re.enter.new.prompt.", "Informe novamente a nova {0}: "}, - {"Re.enter.new.password.", "Informe novamente a nova senha: "}, - {"They.don.t.match.Try.again", "Elas n\u00E3o correspondem. Tente novamente"}, - {"Enter.prompt.alias.name.", "Informe o nome do alias {0}: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "Informe o novo nome do alias\t(RETURN para cancelar a importa\u00E7\u00E3o desta entrada): "}, - {"Enter.alias.name.", "Informe o nome do alias: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(RETURN se for igual ao de <{0}>)"}, - {".PATTERN.printX509Cert", - "Propriet\u00E1rio: {0}\nEmissor: {1}\nN\u00FAmero de s\u00E9rie: {2}\nV\u00E1lido de: {3} a: {4}\nFingerprints do certificado:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Nome do algoritmo de assinatura: {8}\n\t Vers\u00E3o: {9}"}, - {"What.is.your.first.and.last.name.", - "Qual \u00E9 o seu nome e o seu sobrenome?"}, - {"What.is.the.name.of.your.organizational.unit.", - "Qual \u00E9 o nome da sua unidade organizacional?"}, - {"What.is.the.name.of.your.organization.", - "Qual \u00E9 o nome da sua empresa?"}, - {"What.is.the.name.of.your.City.or.Locality.", - "Qual \u00E9 o nome da sua Cidade ou Localidade?"}, - {"What.is.the.name.of.your.State.or.Province.", - "Qual \u00E9 o nome do seu Estado ou Munic\u00EDpio?"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "Quais s\u00E3o as duas letras do c\u00F3digo do pa\u00EDs desta unidade?"}, - {"Is.name.correct.", "{0} Est\u00E1 correto?"}, - {"no", "n\u00E3o"}, - {"yes", "sim"}, - {"y", "s"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "O alias <{0}> n\u00E3o tem chave"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "O alias <{0}> faz refer\u00EAncia a um tipo de entrada que n\u00E3o \u00E9 uma entrada de chave privada. O comando -keyclone oferece suporte somente \u00E0 clonagem de entradas de chave privada"}, - - {".WARNING.WARNING.WARNING.", - "***************** Advert\u00EAncia Advert\u00EAncia Advert\u00EAncia *****************"}, - {"Signer.d.", "Signat\u00E1rio #%d:"}, - {"Timestamp.", "Timestamp:"}, - {"Signature.", "Assinatura:"}, - {"CRLs.", "CRLs:"}, - {"Certificate.owner.", "Propriet\u00E1rio do certificado: "}, - {"Not.a.signed.jar.file", "N\u00E3o \u00E9 um arquivo jar assinado"}, - {"No.certificate.from.the.SSL.server", - "N\u00E3o \u00E9 um certificado do servidor SSL"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* A integridade das informa\u00E7\u00F5es armazenadas na sua \u00E1rea de armazenamento de chaves *\n* N\u00C3O foi verificada! Para que seja poss\u00EDvel verificar sua integridade, *\n* voc\u00EA deve fornecer a senha da \u00E1rea de armazenamento de chaves. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* A integridade das informa\u00E7\u00F5es armazenadas no srckeystore *\n* N\u00C3O foi verificada! Para que seja poss\u00EDvel verificar sua integridade, *\n* voc\u00EA deve fornecer a senha do srckeystore. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "A resposta do certificado n\u00E3o cont\u00E9m a chave p\u00FAblica de <{0}>"}, - {"Incomplete.certificate.chain.in.reply", - "Cadeia de certificados incompleta na resposta"}, - {"Certificate.chain.in.reply.does.not.verify.", - "A cadeia de certificados da resposta n\u00E3o verifica: "}, - {"Top.level.certificate.in.reply.", - "Certificado de n\u00EDvel superior na resposta:\n"}, - {".is.not.trusted.", "... n\u00E3o \u00E9 confi\u00E1vel. "}, - {"Install.reply.anyway.no.", "Instalar resposta assim mesmo? [n\u00E3o]: "}, - {"NO", "N\u00E3o"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "As chaves p\u00FAblicas da resposta e da \u00E1rea de armazenamento de chaves n\u00E3o correspondem"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "O certificado da resposta e o certificado da \u00E1rea de armazenamento de chaves s\u00E3o id\u00EAnticos"}, - {"Failed.to.establish.chain.from.reply", - "Falha ao estabelecer a cadeia a partir da resposta"}, - {"n", "n"}, - {"Wrong.answer.try.again", "Resposta errada; tente novamente"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "Chave secreta n\u00E3o gerada; o alias <{0}> j\u00E1 existe"}, - {"Please.provide.keysize.for.secret.key.generation", - "Forne\u00E7a o -keysize para a gera\u00E7\u00E3o da chave secreta"}, - - {"Extensions.", "Extens\u00F5es: "}, - {".Empty.value.", "(Valor vazio)"}, - {"Extension.Request.", "Solicita\u00E7\u00E3o de Extens\u00E3o:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "Solicita\u00E7\u00E3o do Certificado PKCS #10 (Vers\u00E3o 1.0)\nAssunto: %s\nChave P\u00FAblica: %s formato %s chave\n"}, - {"Unknown.keyUsage.type.", "Tipo de keyUsage desconhecido: "}, - {"Unknown.extendedkeyUsage.type.", "Tipo de extendedkeyUsage desconhecido: "}, - {"Unknown.AccessDescription.type.", "Tipo de AccessDescription desconhecido: "}, - {"Unrecognized.GeneralName.type.", "Tipo de GeneralName n\u00E3o reconhecido: "}, - {"This.extension.cannot.be.marked.as.critical.", - "Esta extens\u00E3o n\u00E3o pode ser marcada como cr\u00EDtica. "}, - {"Odd.number.of.hex.digits.found.", "Encontrado n\u00FAmero \u00EDmpar de seis d\u00EDgitos: "}, - {"Unknown.extension.type.", "Tipo de extens\u00E3o desconhecido: "}, - {"command.{0}.is.ambiguous.", "o comando {0} \u00E9 amb\u00EDguo:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "Advert\u00EAncia: N\u00E3o existe uma chave p\u00FAblica para o alias {0}. Certifique-se de que um KeyStore esteja configurado adequadamente."}, - {"Warning.Class.not.found.class", "Advert\u00EAncia: Classe n\u00E3o encontrada: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "Advert\u00EAncia: Argumento(s) inv\u00E1lido(s) para o construtor: {0}"}, - {"Illegal.Principal.Type.type", "Tipo Principal Inv\u00E1lido: {0}"}, - {"Illegal.option.option", "Op\u00E7\u00E3o inv\u00E1lida: {0}"}, - {"Usage.policytool.options.", "Uso: policytool [op\u00E7\u00F5es]"}, - {".file.file.policy.file.location", - " [-file ] localiza\u00E7\u00E3o do arquivo de pol\u00EDtica"}, - {"New", "Novo"}, - {"Open", "Abrir"}, - {"Save", "Salvar"}, - {"Save.As", "Salvar Como"}, - {"View.Warning.Log", "Exibir Log de Advert\u00EAncias"}, - {"Exit", "Sair"}, - {"Add.Policy.Entry", "Adicionar Entrada de Pol\u00EDtica"}, - {"Edit.Policy.Entry", "Editar Entrada de Pol\u00EDtica"}, - {"Remove.Policy.Entry", "Remover Entrada de Pol\u00EDtica"}, - {"Edit", "Editar"}, - {"Retain", "Reter"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "Advert\u00EAncia: O nome do arquivo pode conter caracteres de escape barra invertida. N\u00E3o \u00E9 necess\u00E1rio fazer o escape dos caracteres de barra invertida (a ferramenta faz o escape dos caracteres conforme necess\u00E1rio ao gravar o conte\u00FAdo da pol\u00EDtica no armazenamento persistente).\n\nClique em Reter para reter o nome da entrada ou clique em Editar para edit\u00E1-lo."}, - - {"Add.Public.Key.Alias", "Adicionar Alias de Chave P\u00FAblica"}, - {"Remove.Public.Key.Alias", "Remover Alias de Chave P\u00FAblica"}, - {"File", "Arquivo"}, - {"KeyStore", "KeyStore"}, - {"Policy.File.", "Arquivo de Pol\u00EDtica:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "N\u00E3o foi poss\u00EDvel abrir o arquivo de pol\u00EDtica: {0}: {1}"}, - {"Policy.Tool", "Ferramenta de Pol\u00EDtica"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "Erros durante a abertura da configura\u00E7\u00E3o da pol\u00EDtica. Consulte o Log de Advert\u00EAncias para obter mais informa\u00E7\u00F5es."}, - {"Error", "Erro"}, - {"OK", "OK"}, - {"Status", "Status"}, - {"Warning", "Advert\u00EAncia"}, - {"Permission.", - "Permiss\u00E3o: "}, - {"Principal.Type.", "Tipo do Principal:"}, - {"Principal.Name.", "Nome do Principal:"}, - {"Target.Name.", - "Nome do Alvo: "}, - {"Actions.", - "A\u00E7\u00F5es: "}, - {"OK.to.overwrite.existing.file.filename.", - "Est\u00E1 correto substituir o arquivo existente {0}?"}, - {"Cancel", "Cancelar"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "Adicionar Principal"}, - {"Edit.Principal", "Editar Principal"}, - {"Remove.Principal", "Remover Principal"}, - {"Principals.", "Principais:"}, - {".Add.Permission", " Adicionar Permiss\u00E3o"}, - {".Edit.Permission", " Editar Permiss\u00E3o"}, - {"Remove.Permission", "Remover Permiss\u00E3o"}, - {"Done", "Conclu\u00EDdo"}, - {"KeyStore.URL.", "URL do KeyStore:"}, - {"KeyStore.Type.", "Tipo de KeyStore:"}, - {"KeyStore.Provider.", "Fornecedor de KeyStore:"}, - {"KeyStore.Password.URL.", "URL da Senha do KeyStore:"}, - {"Principals", "Principais"}, - {".Edit.Principal.", " Editar Principal:"}, - {".Add.New.Principal.", " Adicionar Novo Principal:"}, - {"Permissions", "Permiss\u00F5es"}, - {".Edit.Permission.", " Editar Permiss\u00E3o:"}, - {".Add.New.Permission.", " Adicionar Nova Permiss\u00E3o:"}, - {"Signed.By.", "Assinado por:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "N\u00E3o \u00E9 Poss\u00EDvel Especificar um Principal com uma Classe de Curinga sem um Nome de Curinga"}, - {"Cannot.Specify.Principal.without.a.Name", - "N\u00E3o \u00E9 Poss\u00EDvel Especificar um Principal sem um Nome"}, - {"Permission.and.Target.Name.must.have.a.value", - "O Nome de Destino e a Permiss\u00E3o devem ter um Valor"}, - {"Remove.this.Policy.Entry.", "Remover esta Entrada de Pol\u00EDtica?"}, - {"Overwrite.File", "Substituir Arquivo"}, - {"Policy.successfully.written.to.filename", - "Pol\u00EDtica gravada com \u00EAxito em {0}"}, - {"null.filename", "nome de arquivo nulo"}, - {"Save.changes.", "Salvar altera\u00E7\u00F5es?"}, - {"Yes", "Sim"}, - {"No", "N\u00E3o"}, - {"Policy.Entry", "Entrada de Pol\u00EDtica"}, - {"Save.Changes", "Salvar Altera\u00E7\u00F5es"}, - {"No.Policy.Entry.selected", "Nenhuma Entrada de Pol\u00EDtica Selecionada"}, - {"Unable.to.open.KeyStore.ex.toString.", - "N\u00E3o \u00E9 poss\u00EDvel abrir a KeyStore: {0}"}, - {"No.principal.selected", "Nenhum principal selecionado"}, - {"No.permission.selected", "Nenhuma permiss\u00E3o selecionada"}, - {"name", "nome"}, - {"configuration.type", "tipo de configura\u00E7\u00E3o"}, - {"environment.variable.name", "nome da vari\u00E1vel de ambiente"}, - {"library.name", "nome da biblioteca"}, - {"package.name", "nome do pacote"}, - {"policy.type", "tipo de pol\u00EDtica"}, - {"property.name", "nome da propriedade"}, - {"Principal.List", "Lista de Principais"}, - {"Permission.List", "Lista de Permiss\u00F5es"}, - {"Code.Base", "Base de C\u00F3digo"}, - {"KeyStore.U.R.L.", "U R L da KeyStore:"}, - {"KeyStore.Password.U.R.L.", "U R L da Senha do KeyStore:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "entrada(s) nula(s) inv\u00E1lida(s)"}, {"actions.can.only.be.read.", "as a\u00E7\u00F5es s\u00F3 podem ser 'lidas'"}, @@ -553,6 +58,7 @@ public class Resources_pt_BR extends java.util.ListResourceBundle { {"provided.null.OID.map", "mapa OID nulo fornecido"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "AccessControlContext nulo inv\u00E1lido fornecido"}, {"invalid.null.action.provided", "a\u00E7\u00E3o nula inv\u00E1lida fornecida"}, @@ -656,6 +162,7 @@ public class Resources_pt_BR extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_sv.java b/jdk/src/share/classes/sun/security/util/Resources_sv.java index 8ff0e3e9943..e16c1f77f72 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_sv.java +++ b/jdk/src/share/classes/sun/security/util/Resources_sv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_sv extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [Alternativ]..."}, - {"Options.", "Alternativ:"}, - {"Use.keytool.help.for.all.available.commands", - "L\u00E4s \"Hj\u00E4lp - Nyckelverktyg\" f\u00F6r alla tillg\u00E4ngliga kommandon"}, - {"Key.and.Certificate.Management.Tool", - "Hanteringsverktyg f\u00F6r nycklar och certifikat"}, - {"Commands.", "Kommandon:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "L\u00E4s \"Hj\u00E4lp - Nyckelverktyg - command_name\" om anv\u00E4ndning av command_name"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "Genererar certifikatbeg\u00E4ran"}, //-certreq - {"Changes.an.entry.s.alias", - "\u00C4ndrar postalias"}, //-changealias - {"Deletes.an.entry", - "Tar bort post"}, //-delete - {"Exports.certificate", - "Exporterar certifikat"}, //-exportcert - {"Generates.a.key.pair", - "Genererar nyckelpar"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "Genererar hemlig nyckel"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "Genererar certifikat fr\u00E5n certifikatbeg\u00E4ran"}, //-gencert - {"Generates.CRL", "Genererar CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "Importerar poster fr\u00E5n identitetsdatabas i JDK 1.1.x-format"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "Importerar ett certifikat eller en certifikatkedja"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "Importerar en eller alla poster fr\u00E5n annat nyckellager"}, //-importkeystore - {"Clones.a.key.entry", - "Klonar en nyckelpost"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "\u00C4ndrar nyckell\u00F6senordet f\u00F6r en post"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "Visar lista \u00F6ver poster i nyckellager"}, //-list - {"Prints.the.content.of.a.certificate", - "Skriver ut inneh\u00E5llet i ett certifikat"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "Skriver ut inneh\u00E5llet i en certifikatbeg\u00E4ran"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "Skriver ut inneh\u00E5llet i en CRL-fil"}, //-printcrl - {"Generates.a.self.signed.certificate", - "Genererar ett sj\u00E4lvsignerat certifikat"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "\u00C4ndrar lagerl\u00F6senordet f\u00F6r ett nyckellager"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "aliasnamn f\u00F6r post som ska bearbetas"}, //-alias - {"destination.alias", - "destinationsalias"}, //-destalias - {"destination.key.password", - "l\u00F6senord f\u00F6r destinationsnyckel"}, //-destkeypass - {"destination.keystore.name", - "namn p\u00E5 destinationsnyckellager"}, //-destkeystore - {"destination.keystore.password.protected", - "skyddat l\u00F6senord f\u00F6r destinationsnyckellager"}, //-destprotected - {"destination.keystore.provider.name", - "leverant\u00F6rsnamn f\u00F6r destinationsnyckellager"}, //-destprovidername - {"destination.keystore.password", - "l\u00F6senord f\u00F6r destinationsnyckellager"}, //-deststorepass - {"destination.keystore.type", - "typ av destinationsnyckellager"}, //-deststoretype - {"distinguished.name", - "unikt namn"}, //-dname - {"X.509.extension", - "X.509-till\u00E4gg"}, //-ext - {"output.file.name", - "namn p\u00E5 utdatafil"}, //-file and -outfile - {"input.file.name", - "namn p\u00E5 indatafil"}, //-file and -infile - {"key.algorithm.name", - "namn p\u00E5 nyckelalgoritm"}, //-keyalg - {"key.password", - "nyckell\u00F6senord"}, //-keypass - {"key.bit.size", - "nyckelbitstorlek"}, //-keysize - {"keystore.name", - "namn p\u00E5 nyckellager"}, //-keystore - {"new.password", - "nytt l\u00F6senord"}, //-new - {"do.not.prompt", - "fr\u00E5ga inte"}, //-noprompt - {"password.through.protected.mechanism", - "l\u00F6senord med skyddad mekanism"}, //-protected - {"provider.argument", - "leverant\u00F6rsargument"}, //-providerarg - {"provider.class.name", - "namn p\u00E5 leverant\u00F6rsklass"}, //-providerclass - {"provider.name", - "leverant\u00F6rsnamn"}, //-providername - {"provider.classpath", - "leverant\u00F6rsklass\u00F6kv\u00E4g"}, //-providerpath - {"output.in.RFC.style", - "utdata i RFC-format"}, //-rfc - {"signature.algorithm.name", - "namn p\u00E5 signaturalgoritm"}, //-sigalg - {"source.alias", - "k\u00E4llalias"}, //-srcalias - {"source.key.password", - "l\u00F6senord f\u00F6r k\u00E4llnyckel"}, //-srckeypass - {"source.keystore.name", - "namn p\u00E5 k\u00E4llnyckellager"}, //-srckeystore - {"source.keystore.password.protected", - "skyddat l\u00F6senord f\u00F6r k\u00E4llnyckellager"}, //-srcprotected - {"source.keystore.provider.name", - "leverant\u00F6rsnamn f\u00F6r k\u00E4llnyckellager"}, //-srcprovidername - {"source.keystore.password", - "l\u00F6senord f\u00F6r k\u00E4llnyckellager"}, //-srcstorepass - {"source.keystore.type", - "typ av k\u00E4llnyckellager"}, //-srcstoretype - {"SSL.server.host.and.port", - "SSL-serverv\u00E4rd och -port"}, //-sslserver - {"signed.jar.file", - "signerad jar-fil"}, //=jarfile - {"certificate.validity.start.date.time", - "startdatum/-tid f\u00F6r certifikatets giltighet"}, //-startdate - {"keystore.password", - "l\u00F6senord f\u00F6r nyckellager"}, //-storepass - {"keystore.type", - "nyckellagertyp"}, //-storetype - {"trust.certificates.from.cacerts", - "tillf\u00F6rlitliga certifikat fr\u00E5n cacerts"}, //-trustcacerts - {"verbose.output", - "utf\u00F6rliga utdata"}, //-v - {"validity.number.of.days", - "antal dagar f\u00F6r giltighet"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "Seriellt ID f\u00F6r certifikat som ska \u00E5terkallas"}, //-id - // keytool: Running part - {"keytool.error.", "nyckelverktygsfel: "}, - {"Illegal.option.", "Otill\u00E5tet alternativ: "}, - {"Illegal.value.", "Otill\u00E5tet v\u00E4rde: "}, - {"Unknown.password.type.", "Ok\u00E4nd l\u00F6senordstyp: "}, - {"Cannot.find.environment.variable.", - "Kan inte hitta milj\u00F6variabel: "}, - {"Cannot.find.file.", "Hittar inte fil: "}, - {"Command.option.flag.needs.an.argument.", "Kommandoalternativet {0} beh\u00F6ver ett argument."}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "Varning! PKCS12-nyckellager har inte st\u00F6d f\u00F6r olika l\u00F6senord f\u00F6r lagret och nyckeln. Det anv\u00E4ndarspecificerade {0}-v\u00E4rdet ignoreras."}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "-keystore m\u00E5ste vara NONE om -storetype \u00E4r {0}"}, - {"Too.many.retries.program.terminated", - "F\u00F6r m\u00E5nga f\u00F6rs\u00F6k. Programmet avslutas"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "-storepasswd- och -keypasswd-kommandon st\u00F6ds inte om -storetype \u00E4r {0}"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "-keypasswd-kommandon st\u00F6ds inte om -storetype \u00E4r PKCS12"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "-keypass och -new kan inte anges om -storetype \u00E4r {0}"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "om -protected har angetts f\u00E5r inte -storepass, -keypass och -new anges"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "om -srcprotected anges f\u00E5r -srcstorepass och -srckeypass inte anges"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "om nyckellagret inte \u00E4r l\u00F6senordsskyddat f\u00E5r -storepass, -keypass och -new inte anges"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "om k\u00E4llnyckellagret inte \u00E4r l\u00F6senordsskyddat f\u00E5r -srcstorepass och -srckeypass inte anges"}, - {"Illegal.startdate.value", "Otill\u00E5tet v\u00E4rde f\u00F6r startdatum"}, - {"Validity.must.be.greater.than.zero", - "Giltigheten m\u00E5ste vara st\u00F6rre \u00E4n noll"}, - {"provName.not.a.provider", "{0} \u00E4r inte en leverant\u00F6r"}, - {"Usage.error.no.command.provided", "Syntaxfel: inget kommando angivet"}, - {"Source.keystore.file.exists.but.is.empty.", "Nyckellagrets k\u00E4llfil finns, men \u00E4r tom: "}, - {"Please.specify.srckeystore", "Ange -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "Kan inte specificera b\u00E5de -v och -rfc med 'list'-kommandot"}, - {"Key.password.must.be.at.least.6.characters", - "Nyckell\u00F6senordet m\u00E5ste inneh\u00E5lla minst 6 tecken"}, - {"New.password.must.be.at.least.6.characters", - "Det nya l\u00F6senordet m\u00E5ste inneh\u00E5lla minst 6 tecken"}, - {"Keystore.file.exists.but.is.empty.", - "Nyckellagerfilen finns, men \u00E4r tom: "}, - {"Keystore.file.does.not.exist.", - "Nyckellagerfilen finns inte: "}, - {"Must.specify.destination.alias", "Du m\u00E5ste ange destinationsalias"}, - {"Must.specify.alias", "Du m\u00E5ste ange alias"}, - {"Keystore.password.must.be.at.least.6.characters", - "Nyckellagerl\u00F6senordet m\u00E5ste inneh\u00E5lla minst 6 tecken"}, - {"Enter.keystore.password.", "Ange nyckellagerl\u00F6senord: "}, - {"Enter.source.keystore.password.", "Ange l\u00F6senord f\u00F6r k\u00E4llnyckellagret: "}, - {"Enter.destination.keystore.password.", "Ange nyckellagerl\u00F6senord f\u00F6r destination: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "Nyckellagerl\u00F6senordet \u00E4r f\u00F6r kort - det m\u00E5ste inneh\u00E5lla minst 6 tecken"}, - {"Unknown.Entry.Type", "Ok\u00E4nd posttyp"}, - {"Too.many.failures.Alias.not.changed", "F\u00F6r m\u00E5nga fel. Alias har inte \u00E4ndrats"}, - {"Entry.for.alias.alias.successfully.imported.", - "Posten f\u00F6r alias {0} har importerats."}, - {"Entry.for.alias.alias.not.imported.", "Posten f\u00F6r alias {0} har inte importerats."}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "Ett problem uppstod vid importen av posten f\u00F6r alias {0}: {1}.\nPosten {0} har inte importerats."}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "Kommandoimporten slutf\u00F6rd: {0} poster har importerats, {1} poster var felaktiga eller annullerades"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "Varning! Det befintliga aliaset {0} i destinationsnyckellagret skrivs \u00F6ver"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "Aliaset {0} finns redan. Vill du skriva \u00F6ver det? [nej]: "}, - {"Too.many.failures.try.later", "F\u00F6r m\u00E5nga fel - f\u00F6rs\u00F6k igen senare"}, - {"Certification.request.stored.in.file.filename.", - "Certifikatbeg\u00E4ran har lagrats i filen <{0}>"}, - {"Submit.this.to.your.CA", "Skicka detta till certifikatutf\u00E4rdaren"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "om n\u00E5got alias inte anges f\u00E5r destalias, srckeypass och destkeypass inte anges"}, - {"Certificate.stored.in.file.filename.", - "Certifikatet har lagrats i filen <{0}>"}, - {"Certificate.reply.was.installed.in.keystore", - "Certifikatsvaret har installerats i nyckellagret"}, - {"Certificate.reply.was.not.installed.in.keystore", - "Certifikatsvaret har inte installerats i nyckellagret"}, - {"Certificate.was.added.to.keystore", - "Certifikatet har lagts till i nyckellagret"}, - {"Certificate.was.not.added.to.keystore", - "Certifikatet har inte lagts till i nyckellagret"}, - {".Storing.ksfname.", "[Lagrar {0}]"}, - {"alias.has.no.public.key.certificate.", - "{0} saknar offentlig nyckel (certifikat)"}, - {"Cannot.derive.signature.algorithm", - "Kan inte h\u00E4rleda signaturalgoritm"}, - {"Alias.alias.does.not.exist", - "Aliaset <{0}> finns inte"}, - {"Alias.alias.has.no.certificate", - "Aliaset <{0}> saknar certifikat"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "Nyckelparet genererades inte. Aliaset <{0}> finns redan"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "Genererar {0} bitars {1}-nyckelpar och sj\u00E4lvsignerat certifikat ({2}) med en giltighet p\u00E5 {3} dagar\n\tf\u00F6r: {4}"}, - {"Enter.key.password.for.alias.", "Ange nyckell\u00F6senord f\u00F6r <{0}>"}, - {".RETURN.if.same.as.keystore.password.", - "\t(RETURN om det \u00E4r identiskt med nyckellagerl\u00F6senordet): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "Nyckell\u00F6senordet \u00E4r f\u00F6r kort - det m\u00E5ste inneh\u00E5lla minst 6 tecken"}, - {"Too.many.failures.key.not.added.to.keystore", - "F\u00F6r m\u00E5nga fel - nyckeln lades inte till i nyckellagret"}, - {"Destination.alias.dest.already.exists", - "Destinationsaliaset <{0}> finns redan"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "L\u00F6senordet \u00E4r f\u00F6r kort - det m\u00E5ste inneh\u00E5lla minst 6 tecken"}, - {"Too.many.failures.Key.entry.not.cloned", - "F\u00F6r m\u00E5nga fel. Nyckelposten har inte klonats"}, - {"key.password.for.alias.", "nyckell\u00F6senord f\u00F6r <{0}>"}, - {"Keystore.entry.for.id.getName.already.exists", - "Nyckellagerpost f\u00F6r <{0}> finns redan"}, - {"Creating.keystore.entry.for.id.getName.", - "Skapar nyckellagerpost f\u00F6r <{0}> ..."}, - {"No.entries.from.identity.database.added", - "Inga poster fr\u00E5n identitetsdatabasen har lagts till"}, - {"Alias.name.alias", "Aliasnamn: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "Skapat den: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "Posttyp: {0}"}, - {"Certificate.chain.length.", "L\u00E4ngd p\u00E5 certifikatskedja: "}, - {"Certificate.i.1.", "Certifikat[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "Certifikatets fingeravtryck (SHA1): "}, - {"Keystore.type.", "Nyckellagertyp: "}, - {"Keystore.provider.", "Nyckellagerleverant\u00F6r: "}, - {"Your.keystore.contains.keyStore.size.entry", - "Nyckellagret inneh\u00E5ller {0,number,integer} post"}, - {"Your.keystore.contains.keyStore.size.entries", - "Nyckellagret inneh\u00E5ller {0,number,integer} poster"}, - {"Failed.to.parse.input", "Kunde inte tolka indata"}, - {"Empty.input", "Inga indata"}, - {"Not.X.509.certificate", "Inte ett X.509-certifikat"}, - {"alias.has.no.public.key", "{0} saknar offentlig nyckel"}, - {"alias.has.no.X.509.certificate", "{0} saknar X.509-certifikat"}, - {"New.certificate.self.signed.", "Nytt certifikat (sj\u00E4lvsignerat):"}, - {"Reply.has.no.certificates", "Svaret saknar certifikat"}, - {"Certificate.not.imported.alias.alias.already.exists", - "Certifikatet importerades inte. Aliaset <{0}> finns redan"}, - {"Input.not.an.X.509.certificate", "Indata \u00E4r inte ett X.509-certifikat"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "Certifikatet finns redan i nyckellagerfilen under aliaset <{0}>"}, - {"Do.you.still.want.to.add.it.no.", - "Vill du fortfarande l\u00E4gga till det? [nej]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "Certifikatet finns redan i den systemomsp\u00E4nnande CA-nyckellagerfilen under aliaset <{0}>"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "Vill du fortfarande l\u00E4gga till det i ditt eget nyckellagret? [nej]: "}, - {"Trust.this.certificate.no.", "Litar du p\u00E5 det h\u00E4r certifikatet? [nej]: "}, - {"YES", "Ja"}, - {"New.prompt.", "Nytt {0}: "}, - {"Passwords.must.differ", "L\u00F6senorden m\u00E5ste vara olika"}, - {"Re.enter.new.prompt.", "Ange nytt {0} igen: "}, - {"Re.enter.new.password.", "Ange det nya l\u00F6senordet igen: "}, - {"They.don.t.match.Try.again", "De matchar inte. F\u00F6rs\u00F6k igen"}, - {"Enter.prompt.alias.name.", "Ange aliasnamn f\u00F6r {0}: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "Ange ett nytt aliasnamn\t(skriv RETURN f\u00F6r att avbryta importen av denna post): "}, - {"Enter.alias.name.", "Ange aliasnamn: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(RETURN om det \u00E4r det samma som f\u00F6r <{0}>)"}, - {".PATTERN.printX509Cert", - "\u00C4gare: {0}\nUtf\u00E4rdare: {1}\nSerienummer: {2}\nGiltigt fr\u00E5n den: {3} till: {4}\nCertifikatets fingeravtryck:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t Namn p\u00E5 signaturalgoritm: {8}\n\t Version: {9}"}, - {"What.is.your.first.and.last.name.", - "Vad heter du i f\u00F6r- och efternamn?"}, - {"What.is.the.name.of.your.organizational.unit.", - "Vad heter din avdelning inom organisationen?"}, - {"What.is.the.name.of.your.organization.", - "Vad heter din organisation?"}, - {"What.is.the.name.of.your.City.or.Locality.", - "Vad heter din ort eller plats?"}, - {"What.is.the.name.of.your.State.or.Province.", - "Vad heter ditt land eller din provins?"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "Vilken \u00E4r den tv\u00E5st\u00E4lliga landskoden?"}, - {"Is.name.correct.", "\u00C4r {0} korrekt?"}, - {"no", "nej"}, - {"yes", "ja"}, - {"y", "j"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "Aliaset <{0}> saknar nyckel"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "Aliaset <{0}> refererar till en posttyp som inte \u00E4r n\u00E5gon privat nyckelpost. Kommandot -keyclone har endast st\u00F6d f\u00F6r kloning av privata nyckelposter"}, - - {".WARNING.WARNING.WARNING.", - "***************** Varning Varning Varning *****************"}, - {"Signer.d.", "Signerare #%d:"}, - {"Timestamp.", "Tidsst\u00E4mpel:"}, - {"Signature.", "Underskrift:"}, - {"CRLs.", "CRL:er:"}, - {"Certificate.owner.", "Certifikat\u00E4gare: "}, - {"Not.a.signed.jar.file", "Ingen signerad jar-fil"}, - {"No.certificate.from.the.SSL.server", - "Inget certifikat fr\u00E5n SSL-servern"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* Integriteten f\u00F6r den information som lagras i nyckellagerfilen *\n* har INTE verifierats! Om du vill verifiera dess integritet *\n* m\u00E5ste du ange l\u00F6senordet f\u00F6r nyckellagret. *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* Integriteten f\u00F6r den information som lagras i srckeystore*\n* har INTE verifierats! Om du vill verifiera dess integritet *\n* m\u00E5ste du ange l\u00F6senordet f\u00F6r srckeystore. *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "Certifikatsvaret inneh\u00E5ller inte n\u00E5gon offentlig nyckel f\u00F6r <{0}>"}, - {"Incomplete.certificate.chain.in.reply", - "Ofullst\u00E4ndig certifikatskedja i svaret"}, - {"Certificate.chain.in.reply.does.not.verify.", - "Certifikatskedjan i svaret g\u00E5r inte att verifiera: "}, - {"Top.level.certificate.in.reply.", - "Toppniv\u00E5certifikatet i svaret:\n"}, - {".is.not.trusted.", "... \u00E4r inte betrott. "}, - {"Install.reply.anyway.no.", "Vill du installera svaret \u00E4nd\u00E5? [nej]: "}, - {"NO", "Nej"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "De offentliga nycklarna i svaret och nyckellagret matchar inte varandra"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "Certifikatsvaret och certifikatet i nyckellagret \u00E4r identiska"}, - {"Failed.to.establish.chain.from.reply", - "Kunde inte uppr\u00E4tta kedja fr\u00E5n svaret"}, - {"n", "n"}, - {"Wrong.answer.try.again", "Fel svar. F\u00F6rs\u00F6k p\u00E5 nytt."}, - {"Secret.key.not.generated.alias.alias.already.exists", - "Den hemliga nyckeln har inte genererats eftersom aliaset <{0}> redan finns"}, - {"Please.provide.keysize.for.secret.key.generation", - "Ange -keysize f\u00F6r att skapa hemlig nyckel"}, - - {"Extensions.", "Till\u00E4gg: "}, - {".Empty.value.", "(Tomt v\u00E4rde)"}, - {"Extension.Request.", "Till\u00E4ggsbeg\u00E4ran:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "PKCS #10 certifikatbeg\u00E4ran (version 1.0)\n\u00C4mne: %s\nAllm\u00E4n nyckel: %s-format %s-nyckel\n"}, - {"Unknown.keyUsage.type.", "Ok\u00E4nd keyUsage-typ: "}, - {"Unknown.extendedkeyUsage.type.", "Ok\u00E4nd extendedkeyUsage-typ: "}, - {"Unknown.AccessDescription.type.", "Ok\u00E4nd AccessDescription-typ: "}, - {"Unrecognized.GeneralName.type.", "Ok\u00E4nd GeneralName-typ: "}, - {"This.extension.cannot.be.marked.as.critical.", - "Detta till\u00E4gg kan inte markeras som kritiskt. "}, - {"Odd.number.of.hex.digits.found.", "Udda antal hex-siffror p\u00E5tr\u00E4ffades: "}, - {"Unknown.extension.type.", "Ok\u00E4nd till\u00E4ggstyp: "}, - {"command.{0}.is.ambiguous.", "kommandot {0} \u00E4r tvetydigt:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "Varning! Det finns ingen offentlig nyckel f\u00F6r aliaset {0}. Kontrollera att det aktuella nyckellagret \u00E4r korrekt konfigurerat."}, - {"Warning.Class.not.found.class", "Varning! Klassen hittades inte: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "Varning! Ogiltiga argument f\u00F6r konstruktor: {0}"}, - {"Illegal.Principal.Type.type", "Otill\u00E5ten identitetshavaretyp: {0}"}, - {"Illegal.option.option", "Otill\u00E5tet alternativ: {0}"}, - {"Usage.policytool.options.", "Syntax: policytool [alternativ]"}, - {".file.file.policy.file.location", - " [-file ] policyfilens plats"}, - {"New", "Nytt"}, - {"Open", "\u00D6ppna"}, - {"Save", "Spara"}, - {"Save.As", "Spara som"}, - {"View.Warning.Log", "Visa varningslogg"}, - {"Exit", "Avsluta"}, - {"Add.Policy.Entry", "L\u00E4gg till policypost"}, - {"Edit.Policy.Entry", "Redigera policypost"}, - {"Remove.Policy.Entry", "Ta bort policypost"}, - {"Edit", "Redigera"}, - {"Retain", "Beh\u00E5ll"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "Varning! Filnamnet kan inneh\u00E5lla omv\u00E4nda snedstreck inom citattecken. Citattecken kr\u00E4vs inte f\u00F6r omv\u00E4nda snedstreck (verktyget hanterar detta n\u00E4r policyinneh\u00E5llet skrivs till det best\u00E4ndiga lagret).\n\nKlicka p\u00E5 Beh\u00E5ll f\u00F6r att beh\u00E5lla det angivna namnet, eller klicka p\u00E5 Redigera f\u00F6r att \u00E4ndra det."}, - - {"Add.Public.Key.Alias", "L\u00E4gg till offentligt nyckelalias"}, - {"Remove.Public.Key.Alias", "Ta bort offentligt nyckelalias"}, - {"File", "Fil"}, - {"KeyStore", "Nyckellager"}, - {"Policy.File.", "Policyfil:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "Kan inte \u00F6ppna policyfilen: {0}: {1}"}, - {"Policy.Tool", "Policyverktyg"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "Det uppstod ett fel n\u00E4r policykonfigurationen skulle \u00F6ppnas. Se varningsloggen f\u00F6r mer information."}, - {"Error", "Fel"}, - {"OK", "OK"}, - {"Status", "Status"}, - {"Warning", "Varning"}, - {"Permission.", - "Beh\u00F6righet: "}, - {"Principal.Type.", "Identitetshavaretyp:"}, - {"Principal.Name.", "Identitetshavare:"}, - {"Target.Name.", - "M\u00E5l: "}, - {"Actions.", - "Funktioner: "}, - {"OK.to.overwrite.existing.file.filename.", - "Ska den befintliga filen {0} skrivas \u00F6ver?"}, - {"Cancel", "Avbryt"}, - {"CodeBase.", "Kodbas:"}, - {"SignedBy.", "Signerad av:"}, - {"Add.Principal", "L\u00E4gg till identitetshavare"}, - {"Edit.Principal", "Redigera identitetshavare"}, - {"Remove.Principal", "Ta bort identitetshavare"}, - {"Principals.", "Identitetshavare:"}, - {".Add.Permission", " L\u00E4gg till beh\u00F6righet"}, - {".Edit.Permission", " Redigera beh\u00F6righet"}, - {"Remove.Permission", "Ta bort beh\u00F6righet"}, - {"Done", "Utf\u00F6rd"}, - {"KeyStore.URL.", "URL f\u00F6r nyckellager:"}, - {"KeyStore.Type.", "Nyckellagertyp:"}, - {"KeyStore.Provider.", "Nyckellagerleverant\u00F6r:"}, - {"KeyStore.Password.URL.", "URL f\u00F6r l\u00F6senord till nyckellager:"}, - {"Principals", "Identitetshavare"}, - {".Edit.Principal.", " Redigera identitetshavare:"}, - {".Add.New.Principal.", " L\u00E4gg till ny identitetshavare:"}, - {"Permissions", "Beh\u00F6righet"}, - {".Edit.Permission.", " Redigera beh\u00F6righet:"}, - {".Add.New.Permission.", " L\u00E4gg till ny beh\u00F6righet:"}, - {"Signed.By.", "Signerad av:"}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "Kan inte specificera identitetshavare med jokerteckenklass utan jokerteckennamn"}, - {"Cannot.Specify.Principal.without.a.Name", - "Kan inte specificera identitetshavare utan namn"}, - {"Permission.and.Target.Name.must.have.a.value", - "Beh\u00F6righet och m\u00E5lnamn m\u00E5ste ha ett v\u00E4rde"}, - {"Remove.this.Policy.Entry.", "Vill du ta bort den h\u00E4r policyposten?"}, - {"Overwrite.File", "Skriv \u00F6ver fil"}, - {"Policy.successfully.written.to.filename", - "Policy har skrivits till {0}"}, - {"null.filename", "nullfilnamn"}, - {"Save.changes.", "Vill du spara \u00E4ndringarna?"}, - {"Yes", "Ja"}, - {"No", "Nej"}, - {"Policy.Entry", "Policyfel"}, - {"Save.Changes", "Spara \u00E4ndringar"}, - {"No.Policy.Entry.selected", "Ingen policypost har valts"}, - {"Unable.to.open.KeyStore.ex.toString.", - "Kan inte \u00F6ppna nyckellagret: {0}"}, - {"No.principal.selected", "Ingen identitetshavare har valts"}, - {"No.permission.selected", "Ingen beh\u00F6righet har valts"}, - {"name", "namn"}, - {"configuration.type", "konfigurationstyp"}, - {"environment.variable.name", "variabelnamn f\u00F6r milj\u00F6"}, - {"library.name", "biblioteksnamn"}, - {"package.name", "paketnamn"}, - {"policy.type", "policytyp"}, - {"property.name", "egenskapsnamn"}, - {"Principal.List", "Lista \u00F6ver identitetshavare"}, - {"Permission.List", "Beh\u00F6righetslista"}, - {"Code.Base", "Kodbas"}, - {"KeyStore.U.R.L.", "URL f\u00F6r nyckellager:"}, - {"KeyStore.Password.U.R.L.", "URL f\u00F6r l\u00F6senord till nyckellager:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "ogiltiga null-indata"}, {"actions.can.only.be.read.", "funktioner kan endast 'l\u00E4sas'"}, @@ -553,6 +58,7 @@ public class Resources_sv extends java.util.ListResourceBundle { {"provided.null.OID.map", "null-OID-mappning tillhandah\u00F6lls"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "ogiltigt null-AccessControlContext"}, {"invalid.null.action.provided", "ogiltig null-funktion"}, @@ -656,6 +162,7 @@ public class Resources_sv extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_zh_CN.java b/jdk/src/share/classes/sun/security/util/Resources_zh_CN.java index fa4f7a4fec9..80b8763c15f 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_zh_CN.java +++ b/jdk/src/share/classes/sun/security/util/Resources_zh_CN.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_zh_CN extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [\u9009\u9879]..."}, - {"Options.", "\u9009\u9879:"}, - {"Use.keytool.help.for.all.available.commands", - "\u4F7F\u7528 \"keytool -help\" \u83B7\u53D6\u6240\u6709\u53EF\u7528\u547D\u4EE4"}, - {"Key.and.Certificate.Management.Tool", - "\u5BC6\u94A5\u548C\u8BC1\u4E66\u7BA1\u7406\u5DE5\u5177"}, - {"Commands.", "\u547D\u4EE4:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "\u4F7F\u7528 \"keytool -command_name -help\" \u83B7\u53D6 command_name \u7684\u7528\u6CD5"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "\u751F\u6210\u8BC1\u4E66\u8BF7\u6C42"}, //-certreq - {"Changes.an.entry.s.alias", - "\u66F4\u6539\u6761\u76EE\u7684\u522B\u540D"}, //-changealias - {"Deletes.an.entry", - "\u5220\u9664\u6761\u76EE"}, //-delete - {"Exports.certificate", - "\u5BFC\u51FA\u8BC1\u4E66"}, //-exportcert - {"Generates.a.key.pair", - "\u751F\u6210\u5BC6\u94A5\u5BF9"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "\u751F\u6210\u5BF9\u79F0\u5BC6\u94A5"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "\u6839\u636E\u8BC1\u4E66\u8BF7\u6C42\u751F\u6210\u8BC1\u4E66"}, //-gencert - {"Generates.CRL", "\u751F\u6210 CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "\u4ECE JDK 1.1.x \u6837\u5F0F\u7684\u8EAB\u4EFD\u6570\u636E\u5E93\u5BFC\u5165\u6761\u76EE"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "\u5BFC\u5165\u8BC1\u4E66\u6216\u8BC1\u4E66\u94FE"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "\u4ECE\u5176\u4ED6\u5BC6\u94A5\u5E93\u5BFC\u5165\u4E00\u4E2A\u6216\u6240\u6709\u6761\u76EE"}, //-importkeystore - {"Clones.a.key.entry", - "\u514B\u9686\u5BC6\u94A5\u6761\u76EE"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "\u66F4\u6539\u6761\u76EE\u7684\u5BC6\u94A5\u53E3\u4EE4"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "\u5217\u51FA\u5BC6\u94A5\u5E93\u4E2D\u7684\u6761\u76EE"}, //-list - {"Prints.the.content.of.a.certificate", - "\u6253\u5370\u8BC1\u4E66\u5185\u5BB9"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "\u6253\u5370\u8BC1\u4E66\u8BF7\u6C42\u7684\u5185\u5BB9"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "\u6253\u5370 CRL \u6587\u4EF6\u7684\u5185\u5BB9"}, //-printcrl - {"Generates.a.self.signed.certificate", - "\u751F\u6210\u81EA\u7B7E\u540D\u8BC1\u4E66"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "\u66F4\u6539\u5BC6\u94A5\u5E93\u7684\u5B58\u50A8\u53E3\u4EE4"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "\u8981\u5904\u7406\u7684\u6761\u76EE\u7684\u522B\u540D"}, //-alias - {"destination.alias", - "\u76EE\u6807\u522B\u540D"}, //-destalias - {"destination.key.password", - "\u76EE\u6807\u5BC6\u94A5\u53E3\u4EE4"}, //-destkeypass - {"destination.keystore.name", - "\u76EE\u6807\u5BC6\u94A5\u5E93\u540D\u79F0"}, //-destkeystore - {"destination.keystore.password.protected", - "\u53D7\u4FDD\u62A4\u7684\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-destprotected - {"destination.keystore.provider.name", - "\u76EE\u6807\u5BC6\u94A5\u5E93\u63D0\u4F9B\u65B9\u540D\u79F0"}, //-destprovidername - {"destination.keystore.password", - "\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-deststorepass - {"destination.keystore.type", - "\u76EE\u6807\u5BC6\u94A5\u5E93\u7C7B\u578B"}, //-deststoretype - {"distinguished.name", - "\u552F\u4E00\u5224\u522B\u540D"}, //-dname - {"X.509.extension", - "X.509 \u6269\u5C55"}, //-ext - {"output.file.name", - "\u8F93\u51FA\u6587\u4EF6\u540D"}, //-file and -outfile - {"input.file.name", - "\u8F93\u5165\u6587\u4EF6\u540D"}, //-file and -infile - {"key.algorithm.name", - "\u5BC6\u94A5\u7B97\u6CD5\u540D\u79F0"}, //-keyalg - {"key.password", - "\u5BC6\u94A5\u53E3\u4EE4"}, //-keypass - {"key.bit.size", - "\u5BC6\u94A5\u4F4D\u5927\u5C0F"}, //-keysize - {"keystore.name", - "\u5BC6\u94A5\u5E93\u540D\u79F0"}, //-keystore - {"new.password", - "\u65B0\u53E3\u4EE4"}, //-new - {"do.not.prompt", - "\u4E0D\u63D0\u793A"}, //-noprompt - {"password.through.protected.mechanism", - "\u901A\u8FC7\u53D7\u4FDD\u62A4\u7684\u673A\u5236\u7684\u53E3\u4EE4"}, //-protected - {"provider.argument", - "\u63D0\u4F9B\u65B9\u53C2\u6570"}, //-providerarg - {"provider.class.name", - "\u63D0\u4F9B\u65B9\u7C7B\u540D"}, //-providerclass - {"provider.name", - "\u63D0\u4F9B\u65B9\u540D\u79F0"}, //-providername - {"provider.classpath", - "\u63D0\u4F9B\u65B9\u7C7B\u8DEF\u5F84"}, //-providerpath - {"output.in.RFC.style", - "\u4EE5 RFC \u6837\u5F0F\u8F93\u51FA"}, //-rfc - {"signature.algorithm.name", - "\u7B7E\u540D\u7B97\u6CD5\u540D\u79F0"}, //-sigalg - {"source.alias", - "\u6E90\u522B\u540D"}, //-srcalias - {"source.key.password", - "\u6E90\u5BC6\u94A5\u53E3\u4EE4"}, //-srckeypass - {"source.keystore.name", - "\u6E90\u5BC6\u94A5\u5E93\u540D\u79F0"}, //-srckeystore - {"source.keystore.password.protected", - "\u53D7\u4FDD\u62A4\u7684\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-srcprotected - {"source.keystore.provider.name", - "\u6E90\u5BC6\u94A5\u5E93\u63D0\u4F9B\u65B9\u540D\u79F0"}, //-srcprovidername - {"source.keystore.password", - "\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-srcstorepass - {"source.keystore.type", - "\u6E90\u5BC6\u94A5\u5E93\u7C7B\u578B"}, //-srcstoretype - {"SSL.server.host.and.port", - "SSL \u670D\u52A1\u5668\u4E3B\u673A\u548C\u7AEF\u53E3"}, //-sslserver - {"signed.jar.file", - "\u5DF2\u7B7E\u540D\u7684 jar \u6587\u4EF6"}, //=jarfile - {"certificate.validity.start.date.time", - "\u8BC1\u4E66\u6709\u6548\u671F\u5F00\u59CB\u65E5\u671F/\u65F6\u95F4"}, //-startdate - {"keystore.password", - "\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, //-storepass - {"keystore.type", - "\u5BC6\u94A5\u5E93\u7C7B\u578B"}, //-storetype - {"trust.certificates.from.cacerts", - "\u4FE1\u4EFB\u6765\u81EA cacerts \u7684\u8BC1\u4E66"}, //-trustcacerts - {"verbose.output", - "\u8BE6\u7EC6\u8F93\u51FA"}, //-v - {"validity.number.of.days", - "\u6709\u6548\u5929\u6570"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "\u8981\u64A4\u9500\u7684\u8BC1\u4E66\u7684\u5E8F\u5217 ID"}, //-id - // keytool: Running part - {"keytool.error.", "keytool \u9519\u8BEF: "}, - {"Illegal.option.", "\u975E\u6CD5\u9009\u9879: "}, - {"Illegal.value.", "\u975E\u6CD5\u503C: "}, - {"Unknown.password.type.", "\u672A\u77E5\u53E3\u4EE4\u7C7B\u578B: "}, - {"Cannot.find.environment.variable.", - "\u627E\u4E0D\u5230\u73AF\u5883\u53D8\u91CF: "}, - {"Cannot.find.file.", "\u627E\u4E0D\u5230\u6587\u4EF6: "}, - {"Command.option.flag.needs.an.argument.", "\u547D\u4EE4\u9009\u9879{0}\u9700\u8981\u4E00\u4E2A\u53C2\u6570\u3002"}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "\u8B66\u544A: PKCS12 KeyStore \u4E0D\u652F\u6301\u5176\u4ED6\u5B58\u50A8\u548C\u5BC6\u94A5\u53E3\u4EE4\u3002\u6B63\u5728\u5FFD\u7565\u7528\u6237\u6307\u5B9A\u7684{0}\u503C\u3002"}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "\u5982\u679C -storetype \u4E3A {0}, \u5219 -keystore \u5FC5\u987B\u4E3A NONE"}, - {"Too.many.retries.program.terminated", - "\u91CD\u8BD5\u6B21\u6570\u8FC7\u591A, \u7A0B\u5E8F\u5DF2\u7EC8\u6B62"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "\u5982\u679C -storetype \u4E3A {0}, \u5219\u4E0D\u652F\u6301 -storepasswd \u548C -keypasswd \u547D\u4EE4"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "\u5982\u679C -storetype \u4E3A PKCS12, \u5219\u4E0D\u652F\u6301 -keypasswd \u547D\u4EE4"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "\u5982\u679C -storetype \u4E3A {0}, \u5219\u4E0D\u80FD\u6307\u5B9A -keypass \u548C -new"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "\u5982\u679C\u6307\u5B9A\u4E86 -protected, \u5219\u4E0D\u80FD\u6307\u5B9A -storepass, -keypass \u548C -new"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "\u5982\u679C\u6307\u5B9A\u4E86 -srcprotected, \u5219\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "\u5982\u679C\u5BC6\u94A5\u5E93\u672A\u53D7\u53E3\u4EE4\u4FDD\u62A4, \u5219\u4E0D\u80FD\u6307\u5B9A -storepass, -keypass \u548C -new"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "\u5982\u679C\u6E90\u5BC6\u94A5\u5E93\u672A\u53D7\u53E3\u4EE4\u4FDD\u62A4, \u5219\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, - {"Illegal.startdate.value", "\u975E\u6CD5\u5F00\u59CB\u65E5\u671F\u503C"}, - {"Validity.must.be.greater.than.zero", - "\u6709\u6548\u671F\u5FC5\u987B\u5927\u4E8E\u96F6"}, - {"provName.not.a.provider", "{0}\u4E0D\u662F\u63D0\u4F9B\u65B9"}, - {"Usage.error.no.command.provided", "\u7528\u6CD5\u9519\u8BEF: \u6CA1\u6709\u63D0\u4F9B\u547D\u4EE4"}, - {"Source.keystore.file.exists.but.is.empty.", "\u6E90\u5BC6\u94A5\u5E93\u6587\u4EF6\u5B58\u5728, \u4F46\u4E3A\u7A7A: "}, - {"Please.specify.srckeystore", "\u8BF7\u6307\u5B9A -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - "'list' \u547D\u4EE4\u4E0D\u80FD\u540C\u65F6\u6307\u5B9A -v \u53CA -rfc"}, - {"Key.password.must.be.at.least.6.characters", - "\u5BC6\u94A5\u53E3\u4EE4\u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, - {"New.password.must.be.at.least.6.characters", - "\u65B0\u53E3\u4EE4\u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, - {"Keystore.file.exists.but.is.empty.", - "\u5BC6\u94A5\u5E93\u6587\u4EF6\u5B58\u5728, \u4F46\u4E3A\u7A7A: "}, - {"Keystore.file.does.not.exist.", - "\u5BC6\u94A5\u5E93\u6587\u4EF6\u4E0D\u5B58\u5728: "}, - {"Must.specify.destination.alias", "\u5FC5\u987B\u6307\u5B9A\u76EE\u6807\u522B\u540D"}, - {"Must.specify.alias", "\u5FC5\u987B\u6307\u5B9A\u522B\u540D"}, - {"Keystore.password.must.be.at.least.6.characters", - "\u5BC6\u94A5\u5E93\u53E3\u4EE4\u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, - {"Enter.keystore.password.", "\u8F93\u5165\u5BC6\u94A5\u5E93\u53E3\u4EE4: "}, - {"Enter.source.keystore.password.", "\u8F93\u5165\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4: "}, - {"Enter.destination.keystore.password.", "\u8F93\u5165\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "\u5BC6\u94A5\u5E93\u53E3\u4EE4\u592A\u77ED - \u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, - {"Unknown.Entry.Type", "\u672A\u77E5\u6761\u76EE\u7C7B\u578B"}, - {"Too.many.failures.Alias.not.changed", "\u6545\u969C\u592A\u591A\u3002\u672A\u66F4\u6539\u522B\u540D"}, - {"Entry.for.alias.alias.successfully.imported.", - "\u5DF2\u6210\u529F\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u3002"}, - {"Entry.for.alias.alias.not.imported.", "\u672A\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u3002"}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u65F6\u51FA\u73B0\u95EE\u9898: {1}\u3002\n\u672A\u5BFC\u5165\u522B\u540D {0} \u7684\u6761\u76EE\u3002"}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "\u5DF2\u5B8C\u6210\u5BFC\u5165\u547D\u4EE4: {0} \u4E2A\u6761\u76EE\u6210\u529F\u5BFC\u5165, {1} \u4E2A\u6761\u76EE\u5931\u8D25\u6216\u53D6\u6D88"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "\u8B66\u544A: \u6B63\u5728\u8986\u76D6\u76EE\u6807\u5BC6\u94A5\u5E93\u4E2D\u7684\u73B0\u6709\u522B\u540D {0}"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "\u5B58\u5728\u73B0\u6709\u6761\u76EE\u522B\u540D {0}, \u662F\u5426\u8986\u76D6? [no]: "}, - {"Too.many.failures.try.later", "\u6545\u969C\u592A\u591A - \u8BF7\u7A0D\u540E\u518D\u8BD5"}, - {"Certification.request.stored.in.file.filename.", - "\u5B58\u50A8\u5728\u6587\u4EF6 <{0}> \u4E2D\u7684\u8BA4\u8BC1\u8BF7\u6C42"}, - {"Submit.this.to.your.CA", "\u5C06\u6B64\u63D0\u4EA4\u7ED9\u60A8\u7684 CA"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "\u5982\u679C\u6CA1\u6709\u6307\u5B9A\u522B\u540D, \u5219\u4E0D\u80FD\u6307\u5B9A\u76EE\u6807\u522B\u540D, \u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4\u548C\u76EE\u6807\u5BC6\u94A5\u5E93\u53E3\u4EE4"}, - {"Certificate.stored.in.file.filename.", - "\u5B58\u50A8\u5728\u6587\u4EF6 <{0}> \u4E2D\u7684\u8BC1\u4E66"}, - {"Certificate.reply.was.installed.in.keystore", - "\u8BC1\u4E66\u56DE\u590D\u5DF2\u5B89\u88C5\u5728\u5BC6\u94A5\u5E93\u4E2D"}, - {"Certificate.reply.was.not.installed.in.keystore", - "\u8BC1\u4E66\u56DE\u590D\u672A\u5B89\u88C5\u5728\u5BC6\u94A5\u5E93\u4E2D"}, - {"Certificate.was.added.to.keystore", - "\u8BC1\u4E66\u5DF2\u6DFB\u52A0\u5230\u5BC6\u94A5\u5E93\u4E2D"}, - {"Certificate.was.not.added.to.keystore", - "\u8BC1\u4E66\u672A\u6DFB\u52A0\u5230\u5BC6\u94A5\u5E93\u4E2D"}, - {".Storing.ksfname.", "[\u6B63\u5728\u5B58\u50A8{0}]"}, - {"alias.has.no.public.key.certificate.", - "{0}\u6CA1\u6709\u516C\u5171\u5BC6\u94A5 (\u8BC1\u4E66)"}, - {"Cannot.derive.signature.algorithm", - "\u65E0\u6CD5\u6D3E\u751F\u7B7E\u540D\u7B97\u6CD5"}, - {"Alias.alias.does.not.exist", - "\u522B\u540D <{0}> \u4E0D\u5B58\u5728"}, - {"Alias.alias.has.no.certificate", - "\u522B\u540D <{0}> \u6CA1\u6709\u8BC1\u4E66"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "\u672A\u751F\u6210\u5BC6\u94A5\u5BF9, \u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "\u6B63\u5728\u4E3A\u4EE5\u4E0B\u5BF9\u8C61\u751F\u6210 {0} \u4F4D{1}\u5BC6\u94A5\u5BF9\u548C\u81EA\u7B7E\u540D\u8BC1\u4E66 ({2}) (\u6709\u6548\u671F\u4E3A {3} \u5929):\n\t {4}"}, - {"Enter.key.password.for.alias.", "\u8F93\u5165 <{0}> \u7684\u5BC6\u94A5\u53E3\u4EE4"}, - {".RETURN.if.same.as.keystore.password.", - "\t(\u5982\u679C\u548C\u5BC6\u94A5\u5E93\u53E3\u4EE4\u76F8\u540C, \u6309\u56DE\u8F66): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "\u5BC6\u94A5\u53E3\u4EE4\u592A\u77ED - \u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, - {"Too.many.failures.key.not.added.to.keystore", - "\u6545\u969C\u592A\u591A - \u5BC6\u94A5\u672A\u6DFB\u52A0\u5230\u5BC6\u94A5\u5E93\u4E2D"}, - {"Destination.alias.dest.already.exists", - "\u76EE\u6807\u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "\u53E3\u4EE4\u592A\u77ED - \u81F3\u5C11\u5FC5\u987B\u4E3A 6 \u4E2A\u5B57\u7B26"}, - {"Too.many.failures.Key.entry.not.cloned", - "\u6545\u969C\u592A\u591A\u3002\u672A\u514B\u9686\u5BC6\u94A5\u6761\u76EE"}, - {"key.password.for.alias.", "<{0}> \u7684\u5BC6\u94A5\u53E3\u4EE4"}, - {"Keystore.entry.for.id.getName.already.exists", - "<{0}> \u7684\u5BC6\u94A5\u5E93\u6761\u76EE\u5DF2\u7ECF\u5B58\u5728"}, - {"Creating.keystore.entry.for.id.getName.", - "\u6B63\u5728\u521B\u5EFA <{0}> \u7684\u5BC6\u94A5\u5E93\u6761\u76EE..."}, - {"No.entries.from.identity.database.added", - "\u672A\u4ECE\u8EAB\u4EFD\u6570\u636E\u5E93\u4E2D\u6DFB\u52A0\u4EFB\u4F55\u6761\u76EE"}, - {"Alias.name.alias", "\u522B\u540D: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "\u521B\u5EFA\u65E5\u671F: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "\u6761\u76EE\u7C7B\u578B: {0}"}, - {"Certificate.chain.length.", "\u8BC1\u4E66\u94FE\u957F\u5EA6: "}, - {"Certificate.i.1.", "\u8BC1\u4E66[{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "\u8BC1\u4E66\u6307\u7EB9 (SHA1): "}, - {"Keystore.type.", "\u5BC6\u94A5\u5E93\u7C7B\u578B: "}, - {"Keystore.provider.", "\u5BC6\u94A5\u5E93\u63D0\u4F9B\u65B9: "}, - {"Your.keystore.contains.keyStore.size.entry", - "\u60A8\u7684\u5BC6\u94A5\u5E93\u5305\u542B {0,number,integer} \u4E2A\u6761\u76EE"}, - {"Your.keystore.contains.keyStore.size.entries", - "\u60A8\u7684\u5BC6\u94A5\u5E93\u5305\u542B {0,number,integer} \u4E2A\u6761\u76EE"}, - {"Failed.to.parse.input", "\u65E0\u6CD5\u5BF9\u8F93\u5165\u8FDB\u884C\u8BED\u6CD5\u5206\u6790"}, - {"Empty.input", "\u7A7A\u8F93\u5165"}, - {"Not.X.509.certificate", "\u975E X.509 \u8BC1\u4E66"}, - {"alias.has.no.public.key", "{0}\u6CA1\u6709\u516C\u5171\u5BC6\u94A5"}, - {"alias.has.no.X.509.certificate", "{0}\u6CA1\u6709 X.509 \u8BC1\u4E66"}, - {"New.certificate.self.signed.", "\u65B0\u8BC1\u4E66 (\u81EA\u7B7E\u540D):"}, - {"Reply.has.no.certificates", "\u56DE\u590D\u4E2D\u6CA1\u6709\u8BC1\u4E66"}, - {"Certificate.not.imported.alias.alias.already.exists", - "\u8BC1\u4E66\u672A\u5BFC\u5165, \u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, - {"Input.not.an.X.509.certificate", "\u6240\u8F93\u5165\u7684\u4E0D\u662F X.509 \u8BC1\u4E66"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "\u5728\u522B\u540D <{0}> \u4E4B\u4E0B, \u8BC1\u4E66\u5DF2\u7ECF\u5B58\u5728\u4E8E\u5BC6\u94A5\u5E93\u4E2D"}, - {"Do.you.still.want.to.add.it.no.", - "\u662F\u5426\u4ECD\u8981\u6DFB\u52A0? [no]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "\u5728\u522B\u540D <{0}> \u4E4B\u4E0B, \u8BC1\u4E66\u5DF2\u7ECF\u5B58\u5728\u4E8E\u7CFB\u7EDF\u8303\u56F4\u7684 CA \u5BC6\u94A5\u5E93\u4E2D"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "\u662F\u5426\u4ECD\u8981\u5C06\u5B83\u6DFB\u52A0\u5230\u81EA\u5DF1\u7684\u5BC6\u94A5\u5E93? [no]: "}, - {"Trust.this.certificate.no.", "\u662F\u5426\u4FE1\u4EFB\u6B64\u8BC1\u4E66? [no]: "}, - {"YES", "\u662F"}, - {"New.prompt.", "\u65B0{0}: "}, - {"Passwords.must.differ", "\u53E3\u4EE4\u4E0D\u80FD\u76F8\u540C"}, - {"Re.enter.new.prompt.", "\u91CD\u65B0\u8F93\u5165\u65B0{0}: "}, - {"Re.enter.new.password.", "\u518D\u6B21\u8F93\u5165\u65B0\u53E3\u4EE4: "}, - {"They.don.t.match.Try.again", "\u5B83\u4EEC\u4E0D\u5339\u914D\u3002\u8BF7\u91CD\u8BD5"}, - {"Enter.prompt.alias.name.", "\u8F93\u5165{0}\u522B\u540D: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "\u8F93\u5165\u65B0\u7684\u522B\u540D\t(\u6309\u56DE\u8F66\u4EE5\u53D6\u6D88\u5BF9\u6B64\u6761\u76EE\u7684\u5BFC\u5165): "}, - {"Enter.alias.name.", "\u8F93\u5165\u522B\u540D: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(\u5982\u679C\u548C <{0}> \u76F8\u540C, \u5219\u6309\u56DE\u8F66)"}, - {".PATTERN.printX509Cert", - "\u6240\u6709\u8005: {0}\n\u53D1\u5E03\u8005: {1}\n\u5E8F\u5217\u53F7: {2}\n\u6709\u6548\u671F\u5F00\u59CB\u65E5\u671F: {3}, \u622A\u6B62\u65E5\u671F: {4}\n\u8BC1\u4E66\u6307\u7EB9:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7B7E\u540D\u7B97\u6CD5\u540D\u79F0: {8}\n\t \u7248\u672C: {9}"}, - {"What.is.your.first.and.last.name.", - "\u60A8\u7684\u540D\u5B57\u4E0E\u59D3\u6C0F\u662F\u4EC0\u4E48?"}, - {"What.is.the.name.of.your.organizational.unit.", - "\u60A8\u7684\u7EC4\u7EC7\u5355\u4F4D\u540D\u79F0\u662F\u4EC0\u4E48?"}, - {"What.is.the.name.of.your.organization.", - "\u60A8\u7684\u7EC4\u7EC7\u540D\u79F0\u662F\u4EC0\u4E48?"}, - {"What.is.the.name.of.your.City.or.Locality.", - "\u60A8\u6240\u5728\u7684\u57CE\u5E02\u6216\u533A\u57DF\u540D\u79F0\u662F\u4EC0\u4E48?"}, - {"What.is.the.name.of.your.State.or.Province.", - "\u60A8\u6240\u5728\u7684\u7701/\u5E02/\u81EA\u6CBB\u533A\u540D\u79F0\u662F\u4EC0\u4E48?"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "\u8BE5\u5355\u4F4D\u7684\u53CC\u5B57\u6BCD\u56FD\u5BB6/\u5730\u533A\u4EE3\u7801\u662F\u4EC0\u4E48?"}, - {"Is.name.correct.", "{0}\u662F\u5426\u6B63\u786E?"}, - {"no", "\u5426"}, - {"yes", "\u662F"}, - {"y", "y"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "\u522B\u540D <{0}> \u6CA1\u6709\u5BC6\u94A5"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "\u522B\u540D <{0}> \u5F15\u7528\u4E86\u4E0D\u5C5E\u4E8E\u79C1\u6709\u5BC6\u94A5\u6761\u76EE\u7684\u6761\u76EE\u7C7B\u578B\u3002-keyclone \u547D\u4EE4\u4EC5\u652F\u6301\u5BF9\u79C1\u6709\u5BC6\u94A5\u6761\u76EE\u7684\u514B\u9686"}, - - {".WARNING.WARNING.WARNING.", - "***************** \u8B66\u544A \u8B66\u544A \u8B66\u544A *****************"}, - {"Signer.d.", "\u7B7E\u540D\u8005 #%d:"}, - {"Timestamp.", "\u65F6\u95F4\u6233:"}, - {"Signature.", "\u7B7E\u540D:"}, - {"CRLs.", "CRL:"}, - {"Certificate.owner.", "\u8BC1\u4E66\u6240\u6709\u8005: "}, - {"Not.a.signed.jar.file", "\u4E0D\u662F\u5DF2\u7B7E\u540D\u7684 jar \u6587\u4EF6"}, - {"No.certificate.from.the.SSL.server", - "\u6CA1\u6709\u6765\u81EA SSL \u670D\u52A1\u5668\u7684\u8BC1\u4E66"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* \u5B58\u50A8\u5728\u60A8\u7684\u5BC6\u94A5\u5E93\u4E2D\u7684\u4FE1\u606F\u7684\u5B8C\u6574\u6027 *\n* \u5C1A\u672A\u7ECF\u8FC7\u9A8C\u8BC1! \u4E3A\u4E86\u9A8C\u8BC1\u5176\u5B8C\u6574\u6027, *\n* \u5FC5\u987B\u63D0\u4F9B\u5BC6\u94A5\u5E93\u53E3\u4EE4\u3002 *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* \u5B58\u50A8\u5728 srckeystore \u4E2D\u7684\u4FE1\u606F\u7684\u5B8C\u6574\u6027*\n* \u5C1A\u672A\u7ECF\u8FC7\u9A8C\u8BC1! \u4E3A\u4E86\u9A8C\u8BC1\u5176\u5B8C\u6574\u6027, *\n* \u5FC5\u987B\u63D0\u4F9B\u6E90\u5BC6\u94A5\u5E93\u53E3\u4EE4\u3002 *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "\u8BC1\u4E66\u56DE\u590D\u4E2D\u4E0D\u5305\u542B <{0}> \u7684\u516C\u5171\u5BC6\u94A5"}, - {"Incomplete.certificate.chain.in.reply", - "\u56DE\u590D\u4E2D\u7684\u8BC1\u4E66\u94FE\u4E0D\u5B8C\u6574"}, - {"Certificate.chain.in.reply.does.not.verify.", - "\u56DE\u590D\u4E2D\u7684\u8BC1\u4E66\u94FE\u672A\u9A8C\u8BC1: "}, - {"Top.level.certificate.in.reply.", - "\u56DE\u590D\u4E2D\u7684\u9876\u7EA7\u8BC1\u4E66:\n"}, - {".is.not.trusted.", "... \u662F\u4E0D\u53EF\u4FE1\u7684\u3002"}, - {"Install.reply.anyway.no.", "\u662F\u5426\u4ECD\u8981\u5B89\u88C5\u56DE\u590D? [no]: "}, - {"NO", "\u5426"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "\u56DE\u590D\u4E2D\u7684\u516C\u5171\u5BC6\u94A5\u4E0E\u5BC6\u94A5\u5E93\u4E0D\u5339\u914D"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "\u8BC1\u4E66\u56DE\u590D\u4E0E\u5BC6\u94A5\u5E93\u4E2D\u7684\u8BC1\u4E66\u662F\u76F8\u540C\u7684"}, - {"Failed.to.establish.chain.from.reply", - "\u65E0\u6CD5\u4ECE\u56DE\u590D\u4E2D\u5EFA\u7ACB\u94FE"}, - {"n", "n"}, - {"Wrong.answer.try.again", "\u9519\u8BEF\u7684\u7B54\u6848, \u8BF7\u518D\u8BD5\u4E00\u6B21"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "\u6CA1\u6709\u751F\u6210\u5BC6\u94A5, \u522B\u540D <{0}> \u5DF2\u7ECF\u5B58\u5728"}, - {"Please.provide.keysize.for.secret.key.generation", - "\u8BF7\u63D0\u4F9B -keysize \u4EE5\u751F\u6210\u5BF9\u79F0\u5BC6\u94A5"}, - - {"Extensions.", "\u6269\u5C55: "}, - {".Empty.value.", "(\u7A7A\u503C)"}, - {"Extension.Request.", "\u6269\u5C55\u8BF7\u6C42:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "PKCS #10 \u8BC1\u4E66\u8BF7\u6C42 (\u7248\u672C 1.0)\n\u4E3B\u9898: %s\n\u516C\u5171\u5BC6\u94A5: %s \u683C\u5F0F %s \u5BC6\u94A5\n"}, - {"Unknown.keyUsage.type.", "\u672A\u77E5 keyUsage \u7C7B\u578B: "}, - {"Unknown.extendedkeyUsage.type.", "\u672A\u77E5 extendedkeyUsage \u7C7B\u578B: "}, - {"Unknown.AccessDescription.type.", "\u672A\u77E5 AccessDescription \u7C7B\u578B: "}, - {"Unrecognized.GeneralName.type.", "\u65E0\u6CD5\u8BC6\u522B\u7684 GeneralName \u7C7B\u578B: "}, - {"This.extension.cannot.be.marked.as.critical.", - "\u65E0\u6CD5\u5C06\u6B64\u6269\u5C55\u6807\u8BB0\u4E3A\u201C\u4E25\u91CD\u201D\u3002"}, - {"Odd.number.of.hex.digits.found.", "\u627E\u5230\u5947\u6570\u4E2A\u5341\u516D\u8FDB\u5236\u6570\u5B57: "}, - {"Unknown.extension.type.", "\u672A\u77E5\u6269\u5C55\u7C7B\u578B: "}, - {"command.{0}.is.ambiguous.", "\u547D\u4EE4{0}\u4E0D\u660E\u786E:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "\u8B66\u544A: \u522B\u540D {0} \u7684\u516C\u5171\u5BC6\u94A5\u4E0D\u5B58\u5728\u3002\u8BF7\u786E\u4FDD\u5DF2\u6B63\u786E\u914D\u7F6E KeyStore\u3002"}, - {"Warning.Class.not.found.class", "\u8B66\u544A: \u627E\u4E0D\u5230\u7C7B: {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "\u8B66\u544A: \u6784\u9020\u5668\u7684\u53C2\u6570\u65E0\u6548: {0}"}, - {"Illegal.Principal.Type.type", "\u975E\u6CD5\u7684\u4E3B\u7528\u6237\u7C7B\u578B: {0}"}, - {"Illegal.option.option", "\u975E\u6CD5\u9009\u9879: {0}"}, - {"Usage.policytool.options.", "\u7528\u6CD5: policytool [\u9009\u9879]"}, - {".file.file.policy.file.location", - " [-file ] \u7B56\u7565\u6587\u4EF6\u4F4D\u7F6E"}, - {"New", "\u65B0\u5EFA"}, - {"Open", "\u6253\u5F00"}, - {"Save", "\u4FDD\u5B58"}, - {"Save.As", "\u53E6\u5B58\u4E3A"}, - {"View.Warning.Log", "\u67E5\u770B\u8B66\u544A\u65E5\u5FD7"}, - {"Exit", "\u9000\u51FA"}, - {"Add.Policy.Entry", "\u6DFB\u52A0\u7B56\u7565\u6761\u76EE"}, - {"Edit.Policy.Entry", "\u7F16\u8F91\u7B56\u7565\u6761\u76EE"}, - {"Remove.Policy.Entry", "\u5220\u9664\u7B56\u7565\u6761\u76EE"}, - {"Edit", "\u7F16\u8F91"}, - {"Retain", "\u4FDD\u7559"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "\u8B66\u544A: \u6587\u4EF6\u540D\u5305\u542B\u8F6C\u4E49\u7684\u53CD\u659C\u6760\u5B57\u7B26\u3002\u4E0D\u9700\u8981\u5BF9\u53CD\u659C\u6760\u5B57\u7B26\u8FDB\u884C\u8F6C\u4E49 (\u8BE5\u5DE5\u5177\u5728\u5C06\u7B56\u7565\u5185\u5BB9\u5199\u5165\u6C38\u4E45\u5B58\u50A8\u65F6\u4F1A\u6839\u636E\u9700\u8981\u5BF9\u5B57\u7B26\u8FDB\u884C\u8F6C\u4E49)\u3002\n\n\u5355\u51FB\u201C\u4FDD\u7559\u201D\u53EF\u4FDD\u7559\u8F93\u5165\u7684\u540D\u79F0, \u6216\u8005\u5355\u51FB\u201C\u7F16\u8F91\u201D\u53EF\u7F16\u8F91\u8BE5\u540D\u79F0\u3002"}, - - {"Add.Public.Key.Alias", "\u6DFB\u52A0\u516C\u5171\u5BC6\u94A5\u522B\u540D"}, - {"Remove.Public.Key.Alias", "\u5220\u9664\u516C\u5171\u5BC6\u94A5\u522B\u540D"}, - {"File", "\u6587\u4EF6"}, - {"KeyStore", "KeyStore"}, - {"Policy.File.", "\u7B56\u7565\u6587\u4EF6:"}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "\u65E0\u6CD5\u6253\u5F00\u7B56\u7565\u6587\u4EF6: {0}: {1}"}, - {"Policy.Tool", "\u7B56\u7565\u5DE5\u5177"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "\u6253\u5F00\u7B56\u7565\u914D\u7F6E\u65F6\u51FA\u9519\u3002\u6709\u5173\u8BE6\u7EC6\u4FE1\u606F, \u8BF7\u67E5\u770B\u8B66\u544A\u65E5\u5FD7\u3002"}, - {"Error", "\u9519\u8BEF"}, - {"OK", "\u786E\u5B9A"}, - {"Status", "\u72B6\u6001"}, - {"Warning", "\u8B66\u544A"}, - {"Permission.", - "\u6743\u9650: "}, - {"Principal.Type.", "\u4E3B\u7528\u6237\u7C7B\u578B:"}, - {"Principal.Name.", "\u4E3B\u7528\u6237\u540D\u79F0:"}, - {"Target.Name.", - "\u76EE\u6807\u540D\u79F0: "}, - {"Actions.", - "\u64CD\u4F5C: "}, - {"OK.to.overwrite.existing.file.filename.", - "\u786E\u8BA4\u8986\u76D6\u73B0\u6709\u7684\u6587\u4EF6{0}?"}, - {"Cancel", "\u53D6\u6D88"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "\u6DFB\u52A0\u4E3B\u7528\u6237"}, - {"Edit.Principal", "\u7F16\u8F91\u4E3B\u7528\u6237"}, - {"Remove.Principal", "\u5220\u9664\u4E3B\u7528\u6237"}, - {"Principals.", "\u4E3B\u7528\u6237:"}, - {".Add.Permission", " \u6DFB\u52A0\u6743\u9650"}, - {".Edit.Permission", " \u7F16\u8F91\u6743\u9650"}, - {"Remove.Permission", "\u5220\u9664\u6743\u9650"}, - {"Done", "\u5B8C\u6210"}, - {"KeyStore.URL.", "KeyStore URL:"}, - {"KeyStore.Type.", "KeyStore \u7C7B\u578B:"}, - {"KeyStore.Provider.", "KeyStore \u63D0\u4F9B\u65B9:"}, - {"KeyStore.Password.URL.", "KeyStore \u53E3\u4EE4 URL:"}, - {"Principals", "\u4E3B\u7528\u6237"}, - {".Edit.Principal.", " \u7F16\u8F91\u4E3B\u7528\u6237:"}, - {".Add.New.Principal.", " \u6DFB\u52A0\u65B0\u4E3B\u7528\u6237:"}, - {"Permissions", "\u6743\u9650"}, - {".Edit.Permission.", " \u7F16\u8F91\u6743\u9650:"}, - {".Add.New.Permission.", " \u52A0\u5165\u65B0\u7684\u6743\u9650:"}, - {"Signed.By.", "\u7B7E\u7F72\u4EBA: "}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "\u6CA1\u6709\u901A\u914D\u7B26\u540D\u79F0, \u65E0\u6CD5\u4F7F\u7528\u901A\u914D\u7B26\u7C7B\u6307\u5B9A\u4E3B\u7528\u6237"}, - {"Cannot.Specify.Principal.without.a.Name", - "\u6CA1\u6709\u540D\u79F0, \u65E0\u6CD5\u6307\u5B9A\u4E3B\u7528\u6237"}, - {"Permission.and.Target.Name.must.have.a.value", - "\u6743\u9650\u53CA\u76EE\u6807\u540D\u5FC5\u987B\u6709\u4E00\u4E2A\u503C"}, - {"Remove.this.Policy.Entry.", "\u662F\u5426\u5220\u9664\u6B64\u7B56\u7565\u6761\u76EE?"}, - {"Overwrite.File", "\u8986\u76D6\u6587\u4EF6"}, - {"Policy.successfully.written.to.filename", - "\u7B56\u7565\u5DF2\u6210\u529F\u5199\u5165\u5230{0}"}, - {"null.filename", "\u7A7A\u6587\u4EF6\u540D"}, - {"Save.changes.", "\u662F\u5426\u4FDD\u5B58\u6240\u505A\u7684\u66F4\u6539?"}, - {"Yes", "\u662F"}, - {"No", "\u5426"}, - {"Policy.Entry", "\u7B56\u7565\u6761\u76EE"}, - {"Save.Changes", "\u4FDD\u5B58\u66F4\u6539"}, - {"No.Policy.Entry.selected", "\u6CA1\u6709\u9009\u62E9\u7B56\u7565\u6761\u76EE"}, - {"Unable.to.open.KeyStore.ex.toString.", - "\u65E0\u6CD5\u6253\u5F00 KeyStore: {0}"}, - {"No.principal.selected", "\u672A\u9009\u62E9\u4E3B\u7528\u6237"}, - {"No.permission.selected", "\u6CA1\u6709\u9009\u62E9\u6743\u9650"}, - {"name", "\u540D\u79F0"}, - {"configuration.type", "\u914D\u7F6E\u7C7B\u578B"}, - {"environment.variable.name", "\u73AF\u5883\u53D8\u91CF\u540D"}, - {"library.name", "\u5E93\u540D\u79F0"}, - {"package.name", "\u7A0B\u5E8F\u5305\u540D\u79F0"}, - {"policy.type", "\u7B56\u7565\u7C7B\u578B"}, - {"property.name", "\u5C5E\u6027\u540D\u79F0"}, - {"Principal.List", "\u4E3B\u7528\u6237\u5217\u8868"}, - {"Permission.List", "\u6743\u9650\u5217\u8868"}, - {"Code.Base", "\u4EE3\u7801\u5E93"}, - {"KeyStore.U.R.L.", "KeyStore URL:"}, - {"KeyStore.Password.U.R.L.", "KeyStore \u53E3\u4EE4 URL:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "\u65E0\u6548\u7684\u7A7A\u8F93\u5165"}, {"actions.can.only.be.read.", "\u64CD\u4F5C\u53EA\u80FD\u4E3A '\u8BFB\u53D6'"}, @@ -553,6 +58,7 @@ public class Resources_zh_CN extends java.util.ListResourceBundle { {"provided.null.OID.map", "\u63D0\u4F9B\u7684 OID \u6620\u5C04\u4E3A\u7A7A\u503C"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "\u63D0\u4F9B\u4E86\u65E0\u6548\u7684\u7A7A AccessControlContext"}, {"invalid.null.action.provided", "\u63D0\u4F9B\u4E86\u65E0\u6548\u7684\u7A7A\u64CD\u4F5C"}, @@ -656,6 +162,7 @@ public class Resources_zh_CN extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/Resources_zh_TW.java b/jdk/src/share/classes/sun/security/util/Resources_zh_TW.java index cf0fe5e6c8c..b95647a0c4e 100644 --- a/jdk/src/share/classes/sun/security/util/Resources_zh_TW.java +++ b/jdk/src/share/classes/sun/security/util/Resources_zh_TW.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,501 +34,6 @@ public class Resources_zh_TW extends java.util.ListResourceBundle { private static final Object[][] contents = { - // shared (from jarsigner) - {"SPACE", " "}, - {"2SPACE", " "}, - {"6SPACE", " "}, - {"COMMA", ", "}, - // shared (from keytool) - {"NEWLINE", "\n"}, - {"STAR", - "*******************************************"}, - {"STARNN", - "*******************************************\n\n"}, - - // keytool: Help part -// "Option" should be translated. - {".OPTION.", " [\u9078\u9805]..."}, - {"Options.", "\u9078\u9805:"}, - {"Use.keytool.help.for.all.available.commands", - "\u4F7F\u7528 \"keytool -help\" \u53D6\u5F97\u6240\u6709\u53EF\u7528\u7684\u547D\u4EE4"}, - {"Key.and.Certificate.Management.Tool", - "\u91D1\u9470\u8207\u6191\u8B49\u7BA1\u7406\u5DE5\u5177"}, - {"Commands.", "\u547D\u4EE4:"}, - {"Use.keytool.command.name.help.for.usage.of.command.name", - "\u4F7F\u7528 \"keytool -command_name -help\" \u53D6\u5F97 command_name \u7684\u7528\u6CD5"}, - // keytool: help: commands - {"Generates.a.certificate.request", - "\u7522\u751F\u6191\u8B49\u8981\u6C42"}, //-certreq - {"Changes.an.entry.s.alias", - "\u8B8A\u66F4\u9805\u76EE\u7684\u5225\u540D"}, //-changealias - {"Deletes.an.entry", - "\u522A\u9664\u9805\u76EE"}, //-delete - {"Exports.certificate", - "\u532F\u51FA\u6191\u8B49"}, //-exportcert - {"Generates.a.key.pair", - "\u7522\u751F\u91D1\u9470\u7D44"}, //-genkeypair -// translation of "secret" key should be different to "private" key. - {"Generates.a.secret.key", - "\u7522\u751F\u79D8\u5BC6\u91D1\u9470"}, //-genseckey - {"Generates.certificate.from.a.certificate.request", - "\u5F9E\u6191\u8B49\u8981\u6C42\u7522\u751F\u6191\u8B49"}, //-gencert - {"Generates.CRL", "\u7522\u751F CRL"}, //-gencrl - {"Imports.entries.from.a.JDK.1.1.x.style.identity.database", - "\u5F9E JDK 1.1.x-style \u8B58\u5225\u8CC7\u6599\u5EAB\u532F\u5165\u9805\u76EE"}, //-identitydb - {"Imports.a.certificate.or.a.certificate.chain", - "\u532F\u5165\u6191\u8B49\u6216\u6191\u8B49\u93C8"}, //-importcert - {"Imports.one.or.all.entries.from.another.keystore", - "\u5F9E\u5176\u4ED6\u91D1\u9470\u5132\u5B58\u5EAB\u532F\u5165\u4E00\u500B\u6216\u5168\u90E8\u9805\u76EE"}, //-importkeystore - {"Clones.a.key.entry", - "\u8907\u88FD\u91D1\u9470\u9805\u76EE"}, //-keyclone - {"Changes.the.key.password.of.an.entry", - "\u8B8A\u66F4\u9805\u76EE\u7684\u91D1\u9470\u5BC6\u78BC"}, //-keypasswd - {"Lists.entries.in.a.keystore", - "\u5217\u793A\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u9805\u76EE"}, //-list - {"Prints.the.content.of.a.certificate", - "\u5217\u5370\u6191\u8B49\u7684\u5167\u5BB9"}, //-printcert - {"Prints.the.content.of.a.certificate.request", - "\u5217\u5370\u6191\u8B49\u8981\u6C42\u7684\u5167\u5BB9"}, //-printcertreq - {"Prints.the.content.of.a.CRL.file", - "\u5217\u5370 CRL \u6A94\u6848\u7684\u5167\u5BB9"}, //-printcrl - {"Generates.a.self.signed.certificate", - "\u7522\u751F\u81EA\u884C\u7C3D\u7F72\u7684\u6191\u8B49"}, //-selfcert - {"Changes.the.store.password.of.a.keystore", - "\u8B8A\u66F4\u91D1\u9470\u5132\u5B58\u5EAB\u7684\u5132\u5B58\u5BC6\u78BC"}, //-storepasswd - // keytool: help: options - {"alias.name.of.the.entry.to.process", - "\u8981\u8655\u7406\u9805\u76EE\u7684\u5225\u540D\u540D\u7A31"}, //-alias - {"destination.alias", - "\u76EE\u7684\u5730\u5225\u540D"}, //-destalias - {"destination.key.password", - "\u76EE\u7684\u5730\u91D1\u9470\u5BC6\u78BC"}, //-destkeypass - {"destination.keystore.name", - "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-destkeystore - {"destination.keystore.password.protected", - "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u4FDD\u8B77"}, //-destprotected - {"destination.keystore.provider.name", - "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005\u540D\u7A31"}, //-destprovidername - {"destination.keystore.password", - "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-deststorepass - {"destination.keystore.type", - "\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-deststoretype - {"distinguished.name", - "\u8FA8\u5225\u540D\u7A31"}, //-dname - {"X.509.extension", - "X.509 \u64F4\u5145\u5957\u4EF6"}, //-ext - {"output.file.name", - "\u8F38\u51FA\u6A94\u6848\u540D\u7A31"}, //-file and -outfile - {"input.file.name", - "\u8F38\u5165\u6A94\u6848\u540D\u7A31"}, //-file and -infile - {"key.algorithm.name", - "\u91D1\u9470\u6F14\u7B97\u6CD5\u540D\u7A31"}, //-keyalg - {"key.password", - "\u91D1\u9470\u5BC6\u78BC"}, //-keypass - {"key.bit.size", - "\u91D1\u9470\u4F4D\u5143\u5927\u5C0F"}, //-keysize - {"keystore.name", - "\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-keystore - {"new.password", - "\u65B0\u5BC6\u78BC"}, //-new - {"do.not.prompt", - "\u4E0D\u8981\u63D0\u793A"}, //-noprompt - {"password.through.protected.mechanism", - "\u7D93\u7531\u4FDD\u8B77\u6A5F\u5236\u7684\u5BC6\u78BC"}, //-protected - {"provider.argument", - "\u63D0\u4F9B\u8005\u5F15\u6578"}, //-providerarg - {"provider.class.name", - "\u63D0\u4F9B\u8005\u985E\u5225\u540D\u7A31"}, //-providerclass - {"provider.name", - "\u63D0\u4F9B\u8005\u540D\u7A31"}, //-providername - {"provider.classpath", - "\u63D0\u4F9B\u8005\u985E\u5225\u8DEF\u5F91"}, //-providerpath - {"output.in.RFC.style", - "\u4EE5 RFC \u6A23\u5F0F\u8F38\u51FA"}, //-rfc - {"signature.algorithm.name", - "\u7C3D\u7AE0\u6F14\u7B97\u6CD5\u540D\u7A31"}, //-sigalg - {"source.alias", - "\u4F86\u6E90\u5225\u540D"}, //-srcalias - {"source.key.password", - "\u4F86\u6E90\u91D1\u9470\u5BC6\u78BC"}, //-srckeypass - {"source.keystore.name", - "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u540D\u7A31"}, //-srckeystore - {"source.keystore.password.protected", - "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u4FDD\u8B77"}, //-srcprotected - {"source.keystore.provider.name", - "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005\u540D\u7A31"}, //-srcprovidername - {"source.keystore.password", - "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-srcstorepass - {"source.keystore.type", - "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-srcstoretype - {"SSL.server.host.and.port", - "SSL \u4F3A\u670D\u5668\u4E3B\u6A5F\u8207\u9023\u63A5\u57E0"}, //-sslserver - {"signed.jar.file", - "\u7C3D\u7F72\u7684 jar \u6A94\u6848"}, //=jarfile - {"certificate.validity.start.date.time", - "\u6191\u8B49\u6709\u6548\u6027\u958B\u59CB\u65E5\u671F/\u6642\u9593"}, //-startdate - {"keystore.password", - "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC"}, //-storepass - {"keystore.type", - "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B"}, //-storetype - {"trust.certificates.from.cacerts", - "\u4F86\u81EA cacerts \u7684\u4FE1\u4EFB\u6191\u8B49"}, //-trustcacerts - {"verbose.output", - "\u8A73\u7D30\u8CC7\u8A0A\u8F38\u51FA"}, //-v - {"validity.number.of.days", - "\u6709\u6548\u6027\u65E5\u6578"}, //-validity - {"Serial.ID.of.cert.to.revoke", - "\u8981\u64A4\u92B7\u6191\u8B49\u7684\u5E8F\u5217 ID"}, //-id - // keytool: Running part - {"keytool.error.", "\u91D1\u9470\u5DE5\u5177\u932F\u8AA4: "}, - {"Illegal.option.", "\u7121\u6548\u7684\u9078\u9805:"}, - {"Illegal.value.", "\u7121\u6548\u503C: "}, - {"Unknown.password.type.", "\u4E0D\u660E\u7684\u5BC6\u78BC\u985E\u578B: "}, - {"Cannot.find.environment.variable.", - "\u627E\u4E0D\u5230\u74B0\u5883\u8B8A\u6578: "}, - {"Cannot.find.file.", "\u627E\u4E0D\u5230\u6A94\u6848: "}, - {"Command.option.flag.needs.an.argument.", "\u547D\u4EE4\u9078\u9805 {0} \u9700\u8981\u5F15\u6578\u3002"}, - {"Warning.Different.store.and.key.passwords.not.supported.for.PKCS12.KeyStores.Ignoring.user.specified.command.value.", - "\u8B66\u544A: PKCS12 \u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u652F\u63F4\u4E0D\u540C\u7684\u5132\u5B58\u5EAB\u548C\u91D1\u9470\u5BC6\u78BC\u3002\u5FFD\u7565\u4F7F\u7528\u8005\u6307\u5B9A\u7684 {0} \u503C\u3002"}, - {".keystore.must.be.NONE.if.storetype.is.{0}", - "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247 -keystore \u5FC5\u9808\u70BA NONE"}, - {"Too.many.retries.program.terminated", - "\u91CD\u8A66\u6B21\u6578\u592A\u591A\uFF0C\u7A0B\u5F0F\u5DF2\u7D42\u6B62"}, - {".storepasswd.and.keypasswd.commands.not.supported.if.storetype.is.{0}", - "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247\u4E0D\u652F\u63F4 -storepasswd \u548C -keypasswd \u547D\u4EE4"}, - {".keypasswd.commands.not.supported.if.storetype.is.PKCS12", - "\u5982\u679C -storetype \u70BA PKCS12\uFF0C\u5247\u4E0D\u652F\u63F4 -keypasswd \u547D\u4EE4"}, - {".keypass.and.new.can.not.be.specified.if.storetype.is.{0}", - "\u5982\u679C -storetype \u70BA {0}\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -keypass \u548C -new"}, - {"if.protected.is.specified.then.storepass.keypass.and.new.must.not.be.specified", - "\u5982\u679C\u6307\u5B9A -protected\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -storepass\u3001-keypass \u548C -new"}, - {"if.srcprotected.is.specified.then.srcstorepass.and.srckeypass.must.not.be.specified", - "\u5982\u679C\u6307\u5B9A -srcprotected\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, - {"if.keystore.is.not.password.protected.then.storepass.keypass.and.new.must.not.be.specified", - "\u5982\u679C\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u53D7\u5BC6\u78BC\u4FDD\u8B77\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -storepass\u3001-keypass \u548C -new"}, - {"if.source.keystore.is.not.password.protected.then.srcstorepass.and.srckeypass.must.not.be.specified", - "\u5982\u679C\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u53D7\u5BC6\u78BC\u4FDD\u8B77\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A -srcstorepass \u548C -srckeypass"}, - {"Illegal.startdate.value", "\u7121\u6548\u7684 startdate \u503C"}, - {"Validity.must.be.greater.than.zero", - "\u6709\u6548\u6027\u5FC5\u9808\u5927\u65BC\u96F6"}, - {"provName.not.a.provider", "{0} \u4E0D\u662F\u4E00\u500B\u63D0\u4F9B\u8005"}, - {"Usage.error.no.command.provided", "\u7528\u6CD5\u932F\u8AA4: \u672A\u63D0\u4F9B\u547D\u4EE4"}, - {"Source.keystore.file.exists.but.is.empty.", "\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u5B58\u5728\uFF0C\u4F46\u70BA\u7A7A: "}, - {"Please.specify.srckeystore", "\u8ACB\u6307\u5B9A -srckeystore"}, - {"Must.not.specify.both.v.and.rfc.with.list.command", - " 'list' \u547D\u4EE4\u4E0D\u80FD\u540C\u6642\u6307\u5B9A -v \u53CA -rfc"}, - {"Key.password.must.be.at.least.6.characters", - "\u91D1\u9470\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, - {"New.password.must.be.at.least.6.characters", - "\u65B0\u7684\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, - {"Keystore.file.exists.but.is.empty.", - "\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u5B58\u5728\uFF0C\u4F46\u70BA\u7A7A\u767D: "}, - {"Keystore.file.does.not.exist.", - "\u91D1\u9470\u5132\u5B58\u5EAB\u6A94\u6848\u4E0D\u5B58\u5728: "}, - {"Must.specify.destination.alias", "\u5FC5\u9808\u6307\u5B9A\u76EE\u7684\u5730\u5225\u540D"}, - {"Must.specify.alias", "\u5FC5\u9808\u6307\u5B9A\u5225\u540D"}, - {"Keystore.password.must.be.at.least.6.characters", - "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, - {"Enter.keystore.password.", "\u8F38\u5165\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, - {"Enter.source.keystore.password.", "\u8ACB\u8F38\u5165\u4F86\u6E90\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, - {"Enter.destination.keystore.password.", "\u8ACB\u8F38\u5165\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC: "}, - {"Keystore.password.is.too.short.must.be.at.least.6.characters", - "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, - {"Unknown.Entry.Type", "\u4E0D\u660E\u7684\u9805\u76EE\u985E\u578B"}, - {"Too.many.failures.Alias.not.changed", "\u592A\u591A\u932F\u8AA4\u3002\u672A\u8B8A\u66F4\u5225\u540D"}, - {"Entry.for.alias.alias.successfully.imported.", - "\u5DF2\u6210\u529F\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, - {"Entry.for.alias.alias.not.imported.", "\u672A\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, - {"Problem.importing.entry.for.alias.alias.exception.Entry.for.alias.alias.not.imported.", - "\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u6642\u51FA\u73FE\u554F\u984C: {1}\u3002\n\u672A\u532F\u5165\u5225\u540D {0} \u7684\u9805\u76EE\u3002"}, - {"Import.command.completed.ok.entries.successfully.imported.fail.entries.failed.or.cancelled", - "\u5DF2\u5B8C\u6210\u532F\u5165\u547D\u4EE4: \u6210\u529F\u532F\u5165 {0} \u500B\u9805\u76EE\uFF0C{1} \u500B\u9805\u76EE\u5931\u6557\u6216\u5DF2\u53D6\u6D88"}, - {"Warning.Overwriting.existing.alias.alias.in.destination.keystore", - "\u8B66\u544A: \u6B63\u5728\u8986\u5BEB\u76EE\u7684\u5730\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u73FE\u6709\u5225\u540D {0}"}, - {"Existing.entry.alias.alias.exists.overwrite.no.", - "\u73FE\u6709\u9805\u76EE\u5225\u540D {0} \u5B58\u5728\uFF0C\u662F\u5426\u8986\u5BEB\uFF1F[\u5426]: "}, - {"Too.many.failures.try.later", "\u592A\u591A\u932F\u8AA4 - \u8ACB\u7A0D\u5F8C\u518D\u8A66"}, - {"Certification.request.stored.in.file.filename.", - "\u8A8D\u8B49\u8981\u6C42\u5132\u5B58\u5728\u6A94\u6848 <{0}>"}, - {"Submit.this.to.your.CA", "\u5C07\u6B64\u9001\u51FA\u81F3\u60A8\u7684 CA"}, - {"if.alias.not.specified.destalias.srckeypass.and.destkeypass.must.not.be.specified", - "\u5982\u679C\u672A\u6307\u5B9A\u5225\u540D\uFF0C\u5247\u4E0D\u80FD\u6307\u5B9A destalias\u3001srckeypass \u53CA destkeypass"}, - {"Certificate.stored.in.file.filename.", - "\u6191\u8B49\u5132\u5B58\u5728\u6A94\u6848 <{0}>"}, - {"Certificate.reply.was.installed.in.keystore", - "\u6191\u8B49\u56DE\u8986\u5DF2\u5B89\u88DD\u5728\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, - {"Certificate.reply.was.not.installed.in.keystore", - "\u6191\u8B49\u56DE\u8986\u672A\u5B89\u88DD\u5728\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, - {"Certificate.was.added.to.keystore", - "\u6191\u8B49\u5DF2\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, - {"Certificate.was.not.added.to.keystore", - "\u6191\u8B49\u672A\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D"}, - {".Storing.ksfname.", "[\u5132\u5B58 {0}]"}, - {"alias.has.no.public.key.certificate.", - "{0} \u6C92\u6709\u516C\u958B\u91D1\u9470 (\u6191\u8B49)"}, - {"Cannot.derive.signature.algorithm", - "\u7121\u6CD5\u53D6\u5F97\u7C3D\u7AE0\u6F14\u7B97\u6CD5"}, - {"Alias.alias.does.not.exist", - "\u5225\u540D <{0}> \u4E0D\u5B58\u5728"}, - {"Alias.alias.has.no.certificate", - "\u5225\u540D <{0}> \u6C92\u6709\u6191\u8B49"}, - {"Key.pair.not.generated.alias.alias.already.exists", - "\u6C92\u6709\u5EFA\u7ACB\u91D1\u9470\u7D44\uFF0C\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, - {"Generating.keysize.bit.keyAlgName.key.pair.and.self.signed.certificate.sigAlgName.with.a.validity.of.validality.days.for", - "\u91DD\u5C0D {4} \u7522\u751F\u6709\u6548\u671F {3} \u5929\u7684 {0} \u4F4D\u5143 {1} \u91D1\u9470\u7D44\u4EE5\u53CA\u81EA\u6211\u7C3D\u7F72\u6191\u8B49 ({2})\n\t"}, - {"Enter.key.password.for.alias.", "\u8F38\u5165 <{0}> \u7684\u91D1\u9470\u5BC6\u78BC"}, - {".RETURN.if.same.as.keystore.password.", - "\t(RETURN \u5982\u679C\u548C\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u76F8\u540C): "}, - {"Key.password.is.too.short.must.be.at.least.6.characters", - "\u91D1\u9470\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, - {"Too.many.failures.key.not.added.to.keystore", - "\u592A\u591A\u932F\u8AA4 - \u91D1\u9470\u672A\u65B0\u589E\u81F3\u91D1\u9470\u5132\u5B58\u5EAB"}, - {"Destination.alias.dest.already.exists", - "\u76EE\u7684\u5730\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, - {"Password.is.too.short.must.be.at.least.6.characters", - "\u5BC6\u78BC\u592A\u77ED - \u5FC5\u9808\u81F3\u5C11\u70BA 6 \u500B\u5B57\u5143"}, - {"Too.many.failures.Key.entry.not.cloned", - "\u592A\u591A\u932F\u8AA4\u3002\u672A\u8907\u88FD\u91D1\u9470\u9805\u76EE"}, - {"key.password.for.alias.", "<{0}> \u7684\u91D1\u9470\u5BC6\u78BC"}, - {"Keystore.entry.for.id.getName.already.exists", - "<{0}> \u7684\u91D1\u9470\u5132\u5B58\u5EAB\u9805\u76EE\u5DF2\u7D93\u5B58\u5728"}, - {"Creating.keystore.entry.for.id.getName.", - "\u5EFA\u7ACB <{0}> \u7684\u91D1\u9470\u5132\u5B58\u5EAB\u9805\u76EE..."}, - {"No.entries.from.identity.database.added", - "\u6C92\u6709\u65B0\u589E\u4F86\u81EA\u8B58\u5225\u8CC7\u6599\u5EAB\u7684\u9805\u76EE"}, - {"Alias.name.alias", "\u5225\u540D\u540D\u7A31: {0}"}, - {"Creation.date.keyStore.getCreationDate.alias.", - "\u5EFA\u7ACB\u65E5\u671F: {0,date}"}, - {"alias.keyStore.getCreationDate.alias.", - "{0}, {1,date}, "}, - {"alias.", "{0}, "}, - {"Entry.type.type.", "\u9805\u76EE\u985E\u578B: {0}"}, - {"Certificate.chain.length.", "\u6191\u8B49\u93C8\u9577\u5EA6: "}, - {"Certificate.i.1.", "\u6191\u8B49 [{0,number,integer}]:"}, - {"Certificate.fingerprint.SHA1.", "\u6191\u8B49\u6307\u7D0B (SHA1): "}, - {"Keystore.type.", "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B: "}, - {"Keystore.provider.", "\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005: "}, - {"Your.keystore.contains.keyStore.size.entry", - "\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5305\u542B {0,number,integer} \u9805\u76EE"}, - {"Your.keystore.contains.keyStore.size.entries", - "\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5305\u542B {0,number,integer} \u9805\u76EE"}, - {"Failed.to.parse.input", "\u7121\u6CD5\u5256\u6790\u8F38\u5165"}, - {"Empty.input", "\u7A7A\u8F38\u5165"}, - {"Not.X.509.certificate", "\u975E X.509 \u6191\u8B49"}, - {"alias.has.no.public.key", "{0} \u7121\u516C\u958B\u91D1\u9470"}, - {"alias.has.no.X.509.certificate", "{0} \u7121 X.509 \u6191\u8B49"}, - {"New.certificate.self.signed.", "\u65B0\u6191\u8B49 (\u81EA\u6211\u7C3D\u7F72): "}, - {"Reply.has.no.certificates", "\u56DE\u8986\u4E0D\u542B\u6191\u8B49"}, - {"Certificate.not.imported.alias.alias.already.exists", - "\u6191\u8B49\u672A\u8F38\u5165\uFF0C\u5225\u540D <{0}> \u5DF2\u7D93\u5B58\u5728"}, - {"Input.not.an.X.509.certificate", "\u8F38\u5165\u7684\u4E0D\u662F X.509 \u6191\u8B49"}, - {"Certificate.already.exists.in.keystore.under.alias.trustalias.", - "\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684 <{0}> \u5225\u540D\u4E4B\u4E0B\uFF0C\u6191\u8B49\u5DF2\u7D93\u5B58\u5728"}, - {"Do.you.still.want.to.add.it.no.", - "\u60A8\u4ECD\u7136\u60F3\u8981\u5C07\u4E4B\u65B0\u589E\u55CE\uFF1F [\u5426]: "}, - {"Certificate.already.exists.in.system.wide.CA.keystore.under.alias.trustalias.", - "\u6574\u500B\u7CFB\u7D71 CA \u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684 <{0}> \u5225\u540D\u4E4B\u4E0B\uFF0C\u6191\u8B49\u5DF2\u7D93\u5B58\u5728"}, - {"Do.you.still.want.to.add.it.to.your.own.keystore.no.", - "\u60A8\u4ECD\u7136\u60F3\u8981\u5C07\u4E4B\u65B0\u589E\u81F3\u81EA\u5DF1\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u55CE\uFF1F [\u5426]: "}, - {"Trust.this.certificate.no.", "\u4FE1\u4EFB\u9019\u500B\u6191\u8B49\uFF1F [\u5426]: "}, - {"YES", "\u662F"}, - {"New.prompt.", "\u65B0 {0}: "}, - {"Passwords.must.differ", "\u5FC5\u9808\u662F\u4E0D\u540C\u7684\u5BC6\u78BC"}, - {"Re.enter.new.prompt.", "\u91CD\u65B0\u8F38\u5165\u65B0 {0}: "}, - {"Re.enter.new.password.", "\u91CD\u65B0\u8F38\u5165\u65B0\u5BC6\u78BC: "}, - {"They.don.t.match.Try.again", "\u5B83\u5011\u4E0D\u76F8\u7B26\u3002\u8ACB\u91CD\u8A66"}, - {"Enter.prompt.alias.name.", "\u8F38\u5165 {0} \u5225\u540D\u540D\u7A31: "}, - {"Enter.new.alias.name.RETURN.to.cancel.import.for.this.entry.", - "\u8ACB\u8F38\u5165\u65B0\u7684\u5225\u540D\u540D\u7A31\t(RETURN \u4EE5\u53D6\u6D88\u532F\u5165\u6B64\u9805\u76EE):"}, - {"Enter.alias.name.", "\u8F38\u5165\u5225\u540D\u540D\u7A31: "}, - {".RETURN.if.same.as.for.otherAlias.", - "\t(RETURN \u5982\u679C\u548C <{0}> \u7684\u76F8\u540C)"}, - {".PATTERN.printX509Cert", - "\u64C1\u6709\u8005: {0}\n\u767C\u51FA\u8005: {1}\n\u5E8F\u865F: {2}\n\u6709\u6548\u671F\u81EA: {3} \u5230: {4}\n\u6191\u8B49\u6307\u7D0B:\n\t MD5: {5}\n\t SHA1: {6}\n\t SHA256: {7}\n\t \u7C3D\u7AE0\u6F14\u7B97\u6CD5\u540D\u7A31: {8}\n\t \u7248\u672C: {9}"}, - {"What.is.your.first.and.last.name.", - "\u60A8\u7684\u540D\u5B57\u8207\u59D3\u6C0F\u70BA\u4F55\uFF1F"}, - {"What.is.the.name.of.your.organizational.unit.", - "\u60A8\u7684\u7D44\u7E54\u55AE\u4F4D\u540D\u7A31\u70BA\u4F55\uFF1F"}, - {"What.is.the.name.of.your.organization.", - "\u60A8\u7684\u7D44\u7E54\u540D\u7A31\u70BA\u4F55\uFF1F"}, - {"What.is.the.name.of.your.City.or.Locality.", - "\u60A8\u6240\u5728\u7684\u57CE\u5E02\u6216\u5730\u5340\u540D\u7A31\u70BA\u4F55\uFF1F"}, - {"What.is.the.name.of.your.State.or.Province.", - "\u60A8\u6240\u5728\u7684\u5DDE\u53CA\u7701\u4EFD\u540D\u7A31\u70BA\u4F55\uFF1F"}, - {"What.is.the.two.letter.country.code.for.this.unit.", - "\u6B64\u55AE\u4F4D\u7684\u5169\u500B\u5B57\u6BCD\u570B\u5225\u4EE3\u78BC\u70BA\u4F55\uFF1F"}, - {"Is.name.correct.", "{0} \u6B63\u78BA\u55CE\uFF1F"}, - {"no", "\u5426"}, - {"yes", "\u662F"}, - {"y", "y"}, - {".defaultValue.", " [{0}]: "}, - {"Alias.alias.has.no.key", - "\u5225\u540D <{0}> \u6C92\u6709\u91D1\u9470"}, - {"Alias.alias.references.an.entry.type.that.is.not.a.private.key.entry.The.keyclone.command.only.supports.cloning.of.private.key", - "\u5225\u540D <{0}> \u6240\u53C3\u7167\u7684\u9805\u76EE\u4E0D\u662F\u79C1\u5BC6\u91D1\u9470\u985E\u578B\u3002-keyclone \u547D\u4EE4\u50C5\u652F\u63F4\u79C1\u5BC6\u91D1\u9470\u9805\u76EE\u7684\u8907\u88FD"}, - - {".WARNING.WARNING.WARNING.", - "***************** \u8B66\u544A \u8B66\u544A \u8B66\u544A *****************"}, - {"Signer.d.", "\u7C3D\u7F72\u8005 #%d:"}, - {"Timestamp.", "\u6642\u6233:"}, - {"Signature.", "\u7C3D\u7AE0:"}, - {"CRLs.", "CRL:"}, - {"Certificate.owner.", "\u6191\u8B49\u64C1\u6709\u8005: "}, - {"Not.a.signed.jar.file", "\u4E0D\u662F\u7C3D\u7F72\u7684 jar \u6A94\u6848"}, - {"No.certificate.from.the.SSL.server", - "\u6C92\u6709\u4F86\u81EA SSL \u4F3A\u670D\u5668\u7684\u6191\u8B49"}, - - {".The.integrity.of.the.information.stored.in.your.keystore.", - "* \u5C1A\u672A\u9A57\u8B49\u5132\u5B58\u65BC\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u8CC7\u8A0A *\n* \u7684\u5B8C\u6574\u6027\uFF01\u82E5\u8981\u9A57\u8B49\u5176\u5B8C\u6574\u6027\uFF0C*\n* \u60A8\u5FC5\u9808\u63D0\u4F9B\u60A8\u7684\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC\u3002 *"}, - {".The.integrity.of.the.information.stored.in.the.srckeystore.", - "* \u5C1A\u672A\u9A57\u8B49\u5132\u5B58\u65BC srckeystore \u4E2D\u8CC7\u8A0A*\n* \u7684\u5B8C\u6574\u6027\uFF01\u82E5\u8981\u9A57\u8B49\u5176\u5B8C\u6574\u6027\uFF0C\u60A8\u5FC5\u9808 *\n* \u63D0\u4F9B srckeystore \u5BC6\u78BC\u3002 *"}, - - {"Certificate.reply.does.not.contain.public.key.for.alias.", - "\u6191\u8B49\u56DE\u8986\u4E26\u672A\u5305\u542B <{0}> \u7684\u516C\u958B\u91D1\u9470"}, - {"Incomplete.certificate.chain.in.reply", - "\u56DE\u8986\u6642\u7684\u6191\u8B49\u93C8\u4E0D\u5B8C\u6574"}, - {"Certificate.chain.in.reply.does.not.verify.", - "\u56DE\u8986\u6642\u7684\u6191\u8B49\u93C8\u672A\u9A57\u8B49: "}, - {"Top.level.certificate.in.reply.", - "\u56DE\u8986\u6642\u7684\u6700\u9AD8\u7D1A\u6191\u8B49:\\n"}, - {".is.not.trusted.", "... \u662F\u4E0D\u88AB\u4FE1\u4EFB\u7684\u3002"}, - {"Install.reply.anyway.no.", "\u9084\u662F\u8981\u5B89\u88DD\u56DE\u8986\uFF1F [\u5426]: "}, - {"NO", "\u5426"}, - {"Public.keys.in.reply.and.keystore.don.t.match", - "\u56DE\u8986\u6642\u7684\u516C\u958B\u91D1\u9470\u8207\u91D1\u9470\u5132\u5B58\u5EAB\u4E0D\u7B26"}, - {"Certificate.reply.and.certificate.in.keystore.are.identical", - "\u6191\u8B49\u56DE\u8986\u8207\u91D1\u9470\u5132\u5B58\u5EAB\u4E2D\u7684\u6191\u8B49\u662F\u76F8\u540C\u7684"}, - {"Failed.to.establish.chain.from.reply", - "\u7121\u6CD5\u5F9E\u56DE\u8986\u4E2D\u5C07\u93C8\u5EFA\u7ACB\u8D77\u4F86"}, - {"n", "n"}, - {"Wrong.answer.try.again", "\u932F\u8AA4\u7684\u7B54\u6848\uFF0C\u8ACB\u518D\u8A66\u4E00\u6B21"}, - {"Secret.key.not.generated.alias.alias.already.exists", - "\u672A\u7522\u751F\u79D8\u5BC6\u91D1\u9470\uFF0C\u5225\u540D <{0}> \u5DF2\u5B58\u5728"}, - {"Please.provide.keysize.for.secret.key.generation", - "\u8ACB\u63D0\u4F9B -keysize \u4EE5\u7522\u751F\u79D8\u5BC6\u91D1\u9470"}, - - {"Extensions.", "\u64F4\u5145\u5957\u4EF6: "}, - {".Empty.value.", "(\u7A7A\u767D\u503C)"}, - {"Extension.Request.", "\u64F4\u5145\u5957\u4EF6\u8981\u6C42:"}, - {"PKCS.10.Certificate.Request.Version.1.0.Subject.s.Public.Key.s.format.s.key.", - "PKCS #10 \u6191\u8B49\u8981\u6C42 (\u7248\u672C 1.0)\n\u4E3B\u9AD4: %s\n\u516C\u7528\u91D1\u9470: %s \u683C\u5F0F %s \u91D1\u9470\n"}, - {"Unknown.keyUsage.type.", "\u4E0D\u660E\u7684 keyUsage \u985E\u578B: "}, - {"Unknown.extendedkeyUsage.type.", "\u4E0D\u660E\u7684 extendedkeyUsage \u985E\u578B: "}, - {"Unknown.AccessDescription.type.", "\u4E0D\u660E\u7684 AccessDescription \u985E\u578B: "}, - {"Unrecognized.GeneralName.type.", "\u7121\u6CD5\u8FA8\u8B58\u7684 GeneralName \u985E\u578B: "}, - {"This.extension.cannot.be.marked.as.critical.", - "\u6B64\u64F4\u5145\u5957\u4EF6\u7121\u6CD5\u6A19\u793A\u70BA\u95DC\u9375\u3002"}, - {"Odd.number.of.hex.digits.found.", "\u627E\u5230\u5341\u516D\u9032\u4F4D\u6578\u5B57\u7684\u5947\u6578: "}, - {"Unknown.extension.type.", "\u4E0D\u660E\u7684\u64F4\u5145\u5957\u4EF6\u985E\u578B: "}, - {"command.{0}.is.ambiguous.", "\u547D\u4EE4 {0} \u4E0D\u660E\u78BA:"}, - - // policytool - {"Warning.A.public.key.for.alias.signers.i.does.not.exist.Make.sure.a.KeyStore.is.properly.configured.", - "\u8B66\u544A: \u5225\u540D {0} \u7684\u516C\u958B\u91D1\u9470\u4E0D\u5B58\u5728\u3002\u8ACB\u78BA\u5B9A\u91D1\u9470\u5132\u5B58\u5EAB\u914D\u7F6E\u6B63\u78BA\u3002"}, - {"Warning.Class.not.found.class", "\u8B66\u544A: \u627E\u4E0D\u5230\u985E\u5225 {0}"}, - {"Warning.Invalid.argument.s.for.constructor.arg", - "\u8B66\u544A: \u7121\u6548\u7684\u5EFA\u69CB\u5B50\u5F15\u6578: {0}"}, - {"Illegal.Principal.Type.type", "\u7121\u6548\u7684 Principal \u985E\u578B: {0}"}, - {"Illegal.option.option", "\u7121\u6548\u7684\u9078\u9805: {0}"}, - {"Usage.policytool.options.", "\u7528\u6CD5: policytool [options]"}, - {".file.file.policy.file.location", - " [-file ] \u539F\u5247\u6A94\u6848\u4F4D\u7F6E"}, - {"New", "\u65B0\u589E"}, - {"Open", "\u958B\u555F"}, - {"Save", "\u5132\u5B58"}, - {"Save.As", "\u53E6\u5B58\u65B0\u6A94"}, - {"View.Warning.Log", "\u6AA2\u8996\u8B66\u544A\u8A18\u9304"}, - {"Exit", "\u7D50\u675F"}, - {"Add.Policy.Entry", "\u65B0\u589E\u539F\u5247\u9805\u76EE"}, - {"Edit.Policy.Entry", "\u7DE8\u8F2F\u539F\u5247\u9805\u76EE"}, - {"Remove.Policy.Entry", "\u79FB\u9664\u539F\u5247\u9805\u76EE"}, - {"Edit", "\u7DE8\u8F2F"}, - {"Retain", "\u4FDD\u7559"}, - - {"Warning.File.name.may.include.escaped.backslash.characters.It.is.not.necessary.to.escape.backslash.characters.the.tool.escapes", - "\u8B66\u544A: \u6A94\u6848\u540D\u7A31\u5305\u542B\u9041\u96E2\u53CD\u659C\u7DDA\u5B57\u5143\u3002\u4E0D\u9700\u8981\u9041\u96E2\u53CD\u659C\u7DDA\u5B57\u5143 (\u64B0\u5BEB\u539F\u5247\u5167\u5BB9\u81F3\u6C38\u4E45\u5B58\u653E\u5340\u6642\u9700\u8981\u5DE5\u5177\u9041\u96E2\u5B57\u5143)\u3002\n\n\u6309\u4E00\u4E0B\u300C\u4FDD\u7559\u300D\u4EE5\u4FDD\u7559\u8F38\u5165\u7684\u540D\u7A31\uFF0C\u6216\u6309\u4E00\u4E0B\u300C\u7DE8\u8F2F\u300D\u4EE5\u7DE8\u8F2F\u540D\u7A31\u3002"}, - - {"Add.Public.Key.Alias", "\u65B0\u589E\u516C\u958B\u91D1\u9470\u5225\u540D"}, - {"Remove.Public.Key.Alias", "\u79FB\u9664\u516C\u958B\u91D1\u9470\u5225\u540D"}, - {"File", "\u6A94\u6848"}, - {"KeyStore", "\u91D1\u9470\u5132\u5B58\u5EAB"}, - {"Policy.File.", "\u539F\u5247\u6A94\u6848: "}, - {"Could.not.open.policy.file.policyFile.e.toString.", - "\u7121\u6CD5\u958B\u555F\u539F\u5247\u6A94\u6848: {0}: {1}"}, - {"Policy.Tool", "\u539F\u5247\u5DE5\u5177"}, - {"Errors.have.occurred.while.opening.the.policy.configuration.View.the.Warning.Log.for.more.information.", - "\u958B\u555F\u539F\u5247\u8A18\u7F6E\u6642\u767C\u751F\u932F\u8AA4\u3002\u8ACB\u6AA2\u8996\u8B66\u544A\u8A18\u9304\u4EE5\u53D6\u5F97\u66F4\u591A\u7684\u8CC7\u8A0A"}, - {"Error", "\u932F\u8AA4"}, - {"OK", "\u78BA\u5B9A"}, - {"Status", "\u72C0\u614B"}, - {"Warning", "\u8B66\u544A"}, - {"Permission.", - "\u6B0A\u9650: "}, - {"Principal.Type.", "Principal \u985E\u578B: "}, - {"Principal.Name.", "Principal \u540D\u7A31: "}, - {"Target.Name.", - "\u76EE\u6A19\u540D\u7A31: "}, - {"Actions.", - "\u52D5\u4F5C: "}, - {"OK.to.overwrite.existing.file.filename.", - "\u78BA\u8A8D\u8986\u5BEB\u73FE\u5B58\u7684\u6A94\u6848 {0}\uFF1F"}, - {"Cancel", "\u53D6\u6D88"}, - {"CodeBase.", "CodeBase:"}, - {"SignedBy.", "SignedBy:"}, - {"Add.Principal", "\u65B0\u589E Principal"}, - {"Edit.Principal", "\u7DE8\u8F2F Principal"}, - {"Remove.Principal", "\u79FB\u9664 Principal"}, - {"Principals.", "Principal:"}, - {".Add.Permission", " \u65B0\u589E\u6B0A\u9650"}, - {".Edit.Permission", " \u7DE8\u8F2F\u6B0A\u9650"}, - {"Remove.Permission", "\u79FB\u9664\u6B0A\u9650"}, - {"Done", "\u5B8C\u6210"}, - {"KeyStore.URL.", "\u91D1\u9470\u5132\u5B58\u5EAB URL: "}, - {"KeyStore.Type.", "\u91D1\u9470\u5132\u5B58\u5EAB\u985E\u578B:"}, - {"KeyStore.Provider.", "\u91D1\u9470\u5132\u5B58\u5EAB\u63D0\u4F9B\u8005:"}, - {"KeyStore.Password.URL.", "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC URL: "}, - {"Principals", "Principal"}, - {".Edit.Principal.", " \u7DE8\u8F2F Principal: "}, - {".Add.New.Principal.", " \u65B0\u589E Principal: "}, - {"Permissions", "\u6B0A\u9650"}, - {".Edit.Permission.", " \u7DE8\u8F2F\u6B0A\u9650:"}, - {".Add.New.Permission.", " \u65B0\u589E\u6B0A\u9650:"}, - {"Signed.By.", "\u7C3D\u7F72\u4EBA: "}, - {"Cannot.Specify.Principal.with.a.Wildcard.Class.without.a.Wildcard.Name", - "\u6C92\u6709\u842C\u7528\u5B57\u5143\u540D\u7A31\uFF0C\u7121\u6CD5\u6307\u5B9A\u542B\u6709\u842C\u7528\u5B57\u5143\u985E\u5225\u7684 Principal"}, - {"Cannot.Specify.Principal.without.a.Name", - "\u6C92\u6709\u540D\u7A31\uFF0C\u7121\u6CD5\u6307\u5B9A Principal"}, - {"Permission.and.Target.Name.must.have.a.value", - "\u6B0A\u9650\u53CA\u76EE\u6A19\u540D\u7A31\u5FC5\u9808\u6709\u4E00\u500B\u503C\u3002"}, - {"Remove.this.Policy.Entry.", "\u79FB\u9664\u9019\u500B\u539F\u5247\u9805\u76EE\uFF1F"}, - {"Overwrite.File", "\u8986\u5BEB\u6A94\u6848"}, - {"Policy.successfully.written.to.filename", - "\u539F\u5247\u6210\u529F\u5BEB\u5165\u81F3 {0}"}, - {"null.filename", "\u7A7A\u503C\u6A94\u540D"}, - {"Save.changes.", "\u5132\u5B58\u8B8A\u66F4\uFF1F"}, - {"Yes", "\u662F"}, - {"No", "\u5426"}, - {"Policy.Entry", "\u539F\u5247\u9805\u76EE"}, - {"Save.Changes", "\u5132\u5B58\u8B8A\u66F4"}, - {"No.Policy.Entry.selected", "\u6C92\u6709\u9078\u53D6\u539F\u5247\u9805\u76EE"}, - {"Unable.to.open.KeyStore.ex.toString.", - "\u7121\u6CD5\u958B\u555F\u91D1\u9470\u5132\u5B58\u5EAB: {0}"}, - {"No.principal.selected", "\u672A\u9078\u53D6 Principal"}, - {"No.permission.selected", "\u6C92\u6709\u9078\u53D6\u6B0A\u9650"}, - {"name", "\u540D\u7A31"}, - {"configuration.type", "\u7D44\u614B\u985E\u578B"}, - {"environment.variable.name", "\u74B0\u5883\u8B8A\u6578\u540D\u7A31"}, - {"library.name", "\u7A0B\u5F0F\u5EAB\u540D\u7A31"}, - {"package.name", "\u5957\u88DD\u7A0B\u5F0F\u540D\u7A31"}, - {"policy.type", "\u539F\u5247\u985E\u578B"}, - {"property.name", "\u5C6C\u6027\u540D\u7A31"}, - {"Principal.List", "Principal \u6E05\u55AE"}, - {"Permission.List", "\u6B0A\u9650\u6E05\u55AE"}, - {"Code.Base", "\u4EE3\u78BC\u57FA\u6E96"}, - {"KeyStore.U.R.L.", "\u91D1\u9470\u5132\u5B58\u5EAB URL:"}, - {"KeyStore.Password.U.R.L.", "\u91D1\u9470\u5132\u5B58\u5EAB\u5BC6\u78BC URL:"}, - - // javax.security.auth.PrivateCredentialPermission {"invalid.null.input.s.", "\u7121\u6548\u7A7A\u503C\u8F38\u5165"}, {"actions.can.only.be.read.", "\u52D5\u4F5C\u53EA\u80FD\u88AB\u300C\u8B80\u53D6\u300D"}, @@ -553,6 +58,7 @@ public class Resources_zh_TW extends java.util.ListResourceBundle { {"provided.null.OID.map", "\u63D0\u4F9B\u7A7A\u503C OID \u5C0D\u6620"}, // javax.security.auth.Subject + {"NEWLINE", "\n"}, {"invalid.null.AccessControlContext.provided", "\u63D0\u4F9B\u7121\u6548\u7684\u7A7A\u503C AccessControlContext"}, {"invalid.null.action.provided", "\u63D0\u4F9B\u7121\u6548\u7684\u7A7A\u503C\u52D5\u4F5C"}, @@ -656,6 +162,7 @@ public class Resources_zh_TW extends java.util.ListResourceBundle { * * @return the contents of this ResourceBundle. */ + @Override public Object[][] getContents() { return contents; } diff --git a/jdk/src/share/classes/sun/security/util/SecurityConstants.java b/jdk/src/share/classes/sun/security/util/SecurityConstants.java index 08bdaeb03fe..c9d321f7c15 100644 --- a/jdk/src/share/classes/sun/security/util/SecurityConstants.java +++ b/jdk/src/share/classes/sun/security/util/SecurityConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/validator/PKIXValidator.java b/jdk/src/share/classes/sun/security/validator/PKIXValidator.java index 7c010e11958..51761e1bd17 100644 --- a/jdk/src/share/classes/sun/security/validator/PKIXValidator.java +++ b/jdk/src/share/classes/sun/security/validator/PKIXValidator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/CRLExtensions.java b/jdk/src/share/classes/sun/security/x509/CRLExtensions.java index 605ed95d5f2..5e7f42dee0c 100644 --- a/jdk/src/share/classes/sun/security/x509/CRLExtensions.java +++ b/jdk/src/share/classes/sun/security/x509/CRLExtensions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/CertificateExtensions.java b/jdk/src/share/classes/sun/security/x509/CertificateExtensions.java index 44d6df48654..75d5ae35b0e 100644 --- a/jdk/src/share/classes/sun/security/x509/CertificateExtensions.java +++ b/jdk/src/share/classes/sun/security/x509/CertificateExtensions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/DNSName.java b/jdk/src/share/classes/sun/security/x509/DNSName.java index b571e0e5db9..2a35b86fb35 100644 --- a/jdk/src/share/classes/sun/security/x509/DNSName.java +++ b/jdk/src/share/classes/sun/security/x509/DNSName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/RFC822Name.java b/jdk/src/share/classes/sun/security/x509/RFC822Name.java index a477174a4f7..e905ae1b7f2 100644 --- a/jdk/src/share/classes/sun/security/x509/RFC822Name.java +++ b/jdk/src/share/classes/sun/security/x509/RFC822Name.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/URIName.java b/jdk/src/share/classes/sun/security/x509/URIName.java index cf9fa50e0ba..9345640ef57 100644 --- a/jdk/src/share/classes/sun/security/x509/URIName.java +++ b/jdk/src/share/classes/sun/security/x509/URIName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/X509CRLEntryImpl.java b/jdk/src/share/classes/sun/security/x509/X509CRLEntryImpl.java index 441bed90fc1..ab7270995fb 100644 --- a/jdk/src/share/classes/sun/security/x509/X509CRLEntryImpl.java +++ b/jdk/src/share/classes/sun/security/x509/X509CRLEntryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java b/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java index 869100a6c3e..21f39d0366b 100644 --- a/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java +++ b/jdk/src/share/classes/sun/security/x509/X509CRLImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/X509CertImpl.java b/jdk/src/share/classes/sun/security/x509/X509CertImpl.java index b031de9f598..5c965ff2e47 100644 --- a/jdk/src/share/classes/sun/security/x509/X509CertImpl.java +++ b/jdk/src/share/classes/sun/security/x509/X509CertImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/security/x509/X509CertInfo.java b/jdk/src/share/classes/sun/security/x509/X509CertInfo.java index 9379f270043..7d3bb517975 100644 --- a/jdk/src/share/classes/sun/security/x509/X509CertInfo.java +++ b/jdk/src/share/classes/sun/security/x509/X509CertInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/CompactByteArray.java b/jdk/src/share/classes/sun/text/CompactByteArray.java index d28b1db0356..412bc0df36d 100644 --- a/jdk/src/share/classes/sun/text/CompactByteArray.java +++ b/jdk/src/share/classes/sun/text/CompactByteArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/IntHashtable.java b/jdk/src/share/classes/sun/text/IntHashtable.java index 679c710608b..af2c1d37d84 100644 --- a/jdk/src/share/classes/sun/text/IntHashtable.java +++ b/jdk/src/share/classes/sun/text/IntHashtable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/bidi/BidiBase.java b/jdk/src/share/classes/sun/text/bidi/BidiBase.java index a803f8281fd..a0a643b4d22 100644 --- a/jdk/src/share/classes/sun/text/bidi/BidiBase.java +++ b/jdk/src/share/classes/sun/text/bidi/BidiBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/normalizer/ICUData.java b/jdk/src/share/classes/sun/text/normalizer/ICUData.java index 6163329ed4d..20c21a583d6 100644 --- a/jdk/src/share/classes/sun/text/normalizer/ICUData.java +++ b/jdk/src/share/classes/sun/text/normalizer/ICUData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java b/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java index 875d059f156..aadbb13ec08 100644 --- a/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java +++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerBase.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java b/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java index 8f0c9662a2b..6981e1f4fd9 100644 --- a/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java +++ b/jdk/src/share/classes/sun/text/normalizer/NormalizerImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/normalizer/SymbolTable.java b/jdk/src/share/classes/sun/text/normalizer/SymbolTable.java index 95af219f5bc..f49110e6fa9 100644 --- a/jdk/src/share/classes/sun/text/normalizer/SymbolTable.java +++ b/jdk/src/share/classes/sun/text/normalizer/SymbolTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java b/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java index 42f6fdb54b8..27fc4d64419 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java +++ b/jdk/src/share/classes/sun/text/normalizer/UnicodeSet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java b/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java index 53a145c200f..770745226c8 100644 --- a/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java +++ b/jdk/src/share/classes/sun/text/normalizer/UnicodeSetIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java b/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java index 2f418b00753..09f13b9ceca 100644 --- a/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java +++ b/jdk/src/share/classes/sun/text/normalizer/VersionInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java b/jdk/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java index 52d96c28145..4b858bbb82c 100644 --- a/jdk/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java +++ b/jdk/src/share/classes/sun/tools/attach/HotSpotVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider b/jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider index 100e352c78a..debc75277f3 100644 --- a/jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider +++ b/jdk/src/share/classes/sun/tools/attach/META-INF/services/com.sun.tools.attach.spi.AttachProvider @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jar/CommandLine.java b/jdk/src/share/classes/sun/tools/jar/CommandLine.java index b9ddeb84b54..7a17f4600db 100644 --- a/jdk/src/share/classes/sun/tools/jar/CommandLine.java +++ b/jdk/src/share/classes/sun/tools/jar/CommandLine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jar/Manifest.java b/jdk/src/share/classes/sun/tools/jar/Manifest.java index b49d1e8eda0..7a8cf74a906 100644 --- a/jdk/src/share/classes/sun/tools/jar/Manifest.java +++ b/jdk/src/share/classes/sun/tools/jar/Manifest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jar/SignatureFile.java b/jdk/src/share/classes/sun/tools/jar/SignatureFile.java index fd67ce195d4..8e7d3f59435 100644 --- a/jdk/src/share/classes/sun/tools/jar/SignatureFile.java +++ b/jdk/src/share/classes/sun/tools/jar/SignatureFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/javac/resources/javac.properties b/jdk/src/share/classes/sun/tools/javac/resources/javac.properties index 23421b9e9a5..f435c6cca14 100644 --- a/jdk/src/share/classes/sun/tools/javac/resources/javac.properties +++ b/jdk/src/share/classes/sun/tools/javac/resources/javac.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 1996, 1999, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jcmd/Arguments.java b/jdk/src/share/classes/sun/tools/jcmd/Arguments.java index d3b9e50302a..d8c581efe55 100644 --- a/jdk/src/share/classes/sun/tools/jcmd/Arguments.java +++ b/jdk/src/share/classes/sun/tools/jcmd/Arguments.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/AboutDialog.java b/jdk/src/share/classes/sun/tools/jconsole/AboutDialog.java index 1d91d5313bd..ed1d6e4c805 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/AboutDialog.java +++ b/jdk/src/share/classes/sun/tools/jconsole/AboutDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/BorderedComponent.java b/jdk/src/share/classes/sun/tools/jconsole/BorderedComponent.java index 57549ec619d..ee21551dd9a 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/BorderedComponent.java +++ b/jdk/src/share/classes/sun/tools/jconsole/BorderedComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/ClassTab.java b/jdk/src/share/classes/sun/tools/jconsole/ClassTab.java index b192b9f5cd0..164ec9569c9 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/ClassTab.java +++ b/jdk/src/share/classes/sun/tools/jconsole/ClassTab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/ConnectDialog.java b/jdk/src/share/classes/sun/tools/jconsole/ConnectDialog.java index ea6366706c7..ea3f8366766 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/ConnectDialog.java +++ b/jdk/src/share/classes/sun/tools/jconsole/ConnectDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/CreateMBeanDialog.java b/jdk/src/share/classes/sun/tools/jconsole/CreateMBeanDialog.java index 7d391b8e225..94fb5aec51b 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/CreateMBeanDialog.java +++ b/jdk/src/share/classes/sun/tools/jconsole/CreateMBeanDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/Formatter.java b/jdk/src/share/classes/sun/tools/jconsole/Formatter.java index 11923412d38..23468294e34 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/Formatter.java +++ b/jdk/src/share/classes/sun/tools/jconsole/Formatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/HTMLPane.java b/jdk/src/share/classes/sun/tools/jconsole/HTMLPane.java index 34c3c9bedff..c91b9faf928 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/HTMLPane.java +++ b/jdk/src/share/classes/sun/tools/jconsole/HTMLPane.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/InternalDialog.java b/jdk/src/share/classes/sun/tools/jconsole/InternalDialog.java index 703e626a274..1ef95b5bebc 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/InternalDialog.java +++ b/jdk/src/share/classes/sun/tools/jconsole/InternalDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/JConsole.java b/jdk/src/share/classes/sun/tools/jconsole/JConsole.java index 443ae807469..46d9504dc15 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/JConsole.java +++ b/jdk/src/share/classes/sun/tools/jconsole/JConsole.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/LabeledComponent.java b/jdk/src/share/classes/sun/tools/jconsole/LabeledComponent.java index ce045e8f0d3..5d7c9a8509a 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/LabeledComponent.java +++ b/jdk/src/share/classes/sun/tools/jconsole/LabeledComponent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/LocalVirtualMachine.java b/jdk/src/share/classes/sun/tools/jconsole/LocalVirtualMachine.java index 4982c0ec84d..65b03e0fac0 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/LocalVirtualMachine.java +++ b/jdk/src/share/classes/sun/tools/jconsole/LocalVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/MBeansTab.java b/jdk/src/share/classes/sun/tools/jconsole/MBeansTab.java index cb5bcc1ee8c..b7d79e3600d 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/MBeansTab.java +++ b/jdk/src/share/classes/sun/tools/jconsole/MBeansTab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/MaximizableInternalFrame.java b/jdk/src/share/classes/sun/tools/jconsole/MaximizableInternalFrame.java index ab2c1bff121..9bd4ee4fd88 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/MaximizableInternalFrame.java +++ b/jdk/src/share/classes/sun/tools/jconsole/MaximizableInternalFrame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolProxy.java b/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolProxy.java index a796db0da0b..8bd37ce9a49 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolProxy.java +++ b/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolStat.java b/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolStat.java index 869c44e6a1c..df7409815a9 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolStat.java +++ b/jdk/src/share/classes/sun/tools/jconsole/MemoryPoolStat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/MemoryTab.java b/jdk/src/share/classes/sun/tools/jconsole/MemoryTab.java index 756fa18b079..29bed08c5cb 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/MemoryTab.java +++ b/jdk/src/share/classes/sun/tools/jconsole/MemoryTab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/OverviewPanel.java b/jdk/src/share/classes/sun/tools/jconsole/OverviewPanel.java index 269dbd23205..848b71a74d8 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/OverviewPanel.java +++ b/jdk/src/share/classes/sun/tools/jconsole/OverviewPanel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/OverviewTab.java b/jdk/src/share/classes/sun/tools/jconsole/OverviewTab.java index 3b89f6e33c8..08086ab5887 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/OverviewTab.java +++ b/jdk/src/share/classes/sun/tools/jconsole/OverviewTab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/Plotter.java b/jdk/src/share/classes/sun/tools/jconsole/Plotter.java index a9dbeceb999..793b0ea263d 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/Plotter.java +++ b/jdk/src/share/classes/sun/tools/jconsole/Plotter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/PlotterPanel.java b/jdk/src/share/classes/sun/tools/jconsole/PlotterPanel.java index da6b2cc3b6a..da83cd4ac78 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/PlotterPanel.java +++ b/jdk/src/share/classes/sun/tools/jconsole/PlotterPanel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/ProxyClient.java b/jdk/src/share/classes/sun/tools/jconsole/ProxyClient.java index d98d4895289..af7b4267f0b 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/ProxyClient.java +++ b/jdk/src/share/classes/sun/tools/jconsole/ProxyClient.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/Resources.java b/jdk/src/share/classes/sun/tools/jconsole/Resources.java index e7ced473ece..785be24d2e6 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/Resources.java +++ b/jdk/src/share/classes/sun/tools/jconsole/Resources.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/SummaryTab.java b/jdk/src/share/classes/sun/tools/jconsole/SummaryTab.java index e51110085e9..13ee1dd7262 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/SummaryTab.java +++ b/jdk/src/share/classes/sun/tools/jconsole/SummaryTab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/Tab.java b/jdk/src/share/classes/sun/tools/jconsole/Tab.java index 512cc6be5d8..0ca2c7faae7 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/Tab.java +++ b/jdk/src/share/classes/sun/tools/jconsole/Tab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/ThreadTab.java b/jdk/src/share/classes/sun/tools/jconsole/ThreadTab.java index d1cb677efef..354f351f750 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/ThreadTab.java +++ b/jdk/src/share/classes/sun/tools/jconsole/ThreadTab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/VMInternalFrame.java b/jdk/src/share/classes/sun/tools/jconsole/VMInternalFrame.java index 750d444c2fe..d591a1874dc 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/VMInternalFrame.java +++ b/jdk/src/share/classes/sun/tools/jconsole/VMInternalFrame.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/VMPanel.java b/jdk/src/share/classes/sun/tools/jconsole/VMPanel.java index d9072b0ac6a..ec403d5d3b8 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/VMPanel.java +++ b/jdk/src/share/classes/sun/tools/jconsole/VMPanel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/VariableGridLayout.java b/jdk/src/share/classes/sun/tools/jconsole/VariableGridLayout.java index 2d5851ce3b0..d472191aec7 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/VariableGridLayout.java +++ b/jdk/src/share/classes/sun/tools/jconsole/VariableGridLayout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/Version.java.template b/jdk/src/share/classes/sun/tools/jconsole/Version.java.template index f52ac657622..d6ebdb67bd8 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/Version.java.template +++ b/jdk/src/share/classes/sun/tools/jconsole/Version.java.template @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/OperationEntry.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/OperationEntry.java index 30dde2be106..7822c88112c 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/OperationEntry.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/OperationEntry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/TableSorter.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/TableSorter.java index b89ab728a7b..486243e7d17 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/TableSorter.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/TableSorter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/ThreadDialog.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/ThreadDialog.java index dbcdd63ca85..2600f031368 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/ThreadDialog.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/ThreadDialog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/Utils.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/Utils.java index cc97c4e1fb6..0ff44bd6002 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/Utils.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/Utils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java index b42d5c67022..58f795cef21 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XArrayDataViewer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XDataViewer.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XDataViewer.java index c820d831966..58669af1e8a 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XDataViewer.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XDataViewer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanAttributes.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanAttributes.java index 474b928010f..0f610983fdf 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanAttributes.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanAttributes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanInfo.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanInfo.java index cac986ad162..4ce44a48e39 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanInfo.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanNotifications.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanNotifications.java index 5077797bdac..d191bb3a504 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanNotifications.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XMBeanNotifications.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XObject.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XObject.java index 303090abacb..d0b5617a2c4 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XObject.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XOpenTypeViewer.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XOpenTypeViewer.java index 108ff7a2181..e5f0b11df14 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XOpenTypeViewer.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XOpenTypeViewer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XOperations.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XOperations.java index b4f24fa2009..855a76aa8db 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XOperations.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XOperations.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlotter.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlotter.java index 00fdff8e189..06a2dc4e54a 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlotter.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlotter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlottingViewer.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlottingViewer.java index f1e768c1fbb..e6c2d17f411 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlottingViewer.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XPlottingViewer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XSheet.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XSheet.java index f9f5bc4847b..63e4a387fdd 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XSheet.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XSheet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTable.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTable.java index 172ded8f702..4f9b24a9555 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTable.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTextField.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTextField.java index 2cb23599920..bfe3471c4ed 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTextField.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTextField.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTree.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTree.java index 303d9dc0bf0..26d968fa506 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTree.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTreeRenderer.java b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTreeRenderer.java index fb885d7b932..b1c29811329 100644 --- a/jdk/src/share/classes/sun/tools/jconsole/inspector/XTreeRenderer.java +++ b/jdk/src/share/classes/sun/tools/jconsole/inspector/XTreeRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jinfo/JInfo.java b/jdk/src/share/classes/sun/tools/jinfo/JInfo.java index 5a405341685..bcbd7db91f4 100644 --- a/jdk/src/share/classes/sun/tools/jinfo/JInfo.java +++ b/jdk/src/share/classes/sun/tools/jinfo/JInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jmap/JMap.java b/jdk/src/share/classes/sun/tools/jmap/JMap.java index 1d68b668fbf..5350c31ed0b 100644 --- a/jdk/src/share/classes/sun/tools/jmap/JMap.java +++ b/jdk/src/share/classes/sun/tools/jmap/JMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/jstack/JStack.java b/jdk/src/share/classes/sun/tools/jstack/JStack.java index 66fc672652c..e638446b4f1 100644 --- a/jdk/src/share/classes/sun/tools/jstack/JStack.java +++ b/jdk/src/share/classes/sun/tools/jstack/JStack.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/serialver/SerialVer.java b/jdk/src/share/classes/sun/tools/serialver/SerialVer.java index 4b310a81ad7..b2a2de60bcf 100644 --- a/jdk/src/share/classes/sun/tools/serialver/SerialVer.java +++ b/jdk/src/share/classes/sun/tools/serialver/SerialVer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tools/tree/Node.java b/jdk/src/share/classes/sun/tools/tree/Node.java index da71ec5f49c..e07b6b8ef10 100644 --- a/jdk/src/share/classes/sun/tools/tree/Node.java +++ b/jdk/src/share/classes/sun/tools/tree/Node.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tracing/dtrace/DTraceProvider.java b/jdk/src/share/classes/sun/tracing/dtrace/DTraceProvider.java index 432199927ab..4a9eb2888d6 100644 --- a/jdk/src/share/classes/sun/tracing/dtrace/DTraceProvider.java +++ b/jdk/src/share/classes/sun/tracing/dtrace/DTraceProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/tracing/dtrace/JVM.java b/jdk/src/share/classes/sun/tracing/dtrace/JVM.java index c59ce68cb3c..a3fb5e1838d 100644 --- a/jdk/src/share/classes/sun/tracing/dtrace/JVM.java +++ b/jdk/src/share/classes/sun/tracing/dtrace/JVM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/PreHashedMap.java b/jdk/src/share/classes/sun/util/PreHashedMap.java index c09425ce6e4..d0a8ed90597 100644 --- a/jdk/src/share/classes/sun/util/PreHashedMap.java +++ b/jdk/src/share/classes/sun/util/PreHashedMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/calendar/CalendarDate.java b/jdk/src/share/classes/sun/util/calendar/CalendarDate.java index 70c1bed6187..b8e736ca194 100644 --- a/jdk/src/share/classes/sun/util/calendar/CalendarDate.java +++ b/jdk/src/share/classes/sun/util/calendar/CalendarDate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/locale/LocaleUtils.java b/jdk/src/share/classes/sun/util/locale/LocaleUtils.java index 9a89dc0e7e8..ead48fc2493 100644 --- a/jdk/src/share/classes/sun/util/locale/LocaleUtils.java +++ b/jdk/src/share/classes/sun/util/locale/LocaleUtils.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/locale/provider/CurrencyNameProviderImpl.java b/jdk/src/share/classes/sun/util/locale/provider/CurrencyNameProviderImpl.java index 33087118982..cfa805fddfc 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/CurrencyNameProviderImpl.java +++ b/jdk/src/share/classes/sun/util/locale/provider/CurrencyNameProviderImpl.java @@ -26,10 +26,9 @@ package sun.util.locale.provider; import java.util.Locale; -import java.util.MissingResourceException; +import java.util.ResourceBundle; import java.util.Set; import java.util.spi.CurrencyNameProvider; -import sun.util.resources.OpenListResourceBundle; /** * Concrete implementation of the @@ -121,16 +120,10 @@ public class CurrencyNameProviderImpl extends CurrencyNameProvider throw new NullPointerException(); } - OpenListResourceBundle bundle = LocaleProviderAdapter.forType(type).getLocaleData().getCurrencyNames(locale); - LocaleServiceProviderPool pool = - LocaleServiceProviderPool.getPool(CurrencyNameProvider.class); - try { - if (!pool.hasProviders() || - (bundle.getLocale().equals(locale) && - bundle.handleGetKeys().contains(key))) { + ResourceBundle bundle = LocaleProviderAdapter.forType(type).getLocaleData().getCurrencyNames(locale); + if (bundle.containsKey(key)) { return bundle.getString(key); } - } catch (MissingResourceException mre) {} return null; } diff --git a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java index 34ed5b890e2..346cba08ac0 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/JRELocaleProviderAdapter.java @@ -321,7 +321,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { while (tokens.hasMoreTokens()) { String token = tokens.nextToken(); if (token.equals("|")) { - if (isNonEuroLangSupported()) { + if (isNonUSLangSupported()) { continue; } break; @@ -361,7 +361,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { */ int barIndex = supportedLocaleString.indexOf('|'); StringTokenizer localeStringTokenizer; - if (isNonEuroLangSupported()) { + if (isNonUSLangSupported()) { localeStringTokenizer = new StringTokenizer(supportedLocaleString.substring(0, barIndex) + supportedLocaleString.substring(barIndex + 1)); } else { @@ -390,17 +390,17 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { return locales; } - private static volatile Boolean isNonEuroSupported = null; + private static volatile Boolean isNonUSSupported = null; /* - * Returns true if the non European resources jar file exists in jre + * Returns true if the non US resources jar file exists in jre * extension directory. @returns true if the jar file is there. Otherwise, * returns false. */ - private static boolean isNonEuroLangSupported() { - if (isNonEuroSupported == null) { + private static boolean isNonUSLangSupported() { + if (isNonUSSupported == null) { synchronized (JRELocaleProviderAdapter.class) { - if (isNonEuroSupported == null) { + if (isNonUSSupported == null) { final String sep = File.separator; String localeDataJar = java.security.AccessController.doPrivileged( @@ -412,7 +412,7 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { * localedata.jar is installed or not. */ final File f = new File(localeDataJar); - isNonEuroSupported = + isNonUSSupported = AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { @@ -422,6 +422,6 @@ public class JRELocaleProviderAdapter extends LocaleProviderAdapter { } } } - return isNonEuroSupported; + return isNonUSSupported; } } diff --git a/jdk/src/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template b/jdk/src/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template index 3f6851dcf20..4418e568ae0 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template +++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleDataMetaInfo-XLocales.java.template @@ -52,25 +52,25 @@ public class LocaleDataMetaInfo { look up locale string such as "en" could be based on if it contains " en ". */ resourceNameToLocales.put("FormatData", - " #FormatData_EuroLocales# | #FormatData_NonEuroLocales# "); + " #FormatData_USLocales# | #FormatData_NonUSLocales# "); resourceNameToLocales.put("CollationData", - " #CollationData_EuroLocales# | #CollationData_NonEuroLocales# "); + " #CollationData_USLocales# | #CollationData_NonUSLocales# "); resourceNameToLocales.put("TimeZoneNames", - " #TimeZoneNames_EuroLocales# | #TimeZoneNames_NonEuroLocales# "); + " #TimeZoneNames_USLocales# | #TimeZoneNames_NonUSLocales# "); resourceNameToLocales.put("LocaleNames", - " #LocaleNames_EuroLocales# | #LocaleNames_NonEuroLocales# "); + " #LocaleNames_USLocales# | #LocaleNames_NonUSLocales# "); resourceNameToLocales.put("CurrencyNames", - " #CurrencyNames_EuroLocales# | #CurrencyNames_NonEuroLocales# "); + " #CurrencyNames_USLocales# | #CurrencyNames_NonUSLocales# "); resourceNameToLocales.put("CalendarData", - " #CalendarData_EuroLocales# | #CalendarData_NonEuroLocales# "); + " #CalendarData_USLocales# | #CalendarData_NonUSLocales# "); resourceNameToLocales.put("AvailableLocales", - " #AvailableLocales_EuroLocales# | #AvailableLocales_NonEuroLocales# "); + " #AvailableLocales_USLocales# | #AvailableLocales_NonUSLocales# "); } /* diff --git a/jdk/src/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java b/jdk/src/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java index 0344cac81b0..952078fd5c3 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java +++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleNameProviderImpl.java @@ -26,10 +26,9 @@ package sun.util.locale.provider; import java.util.Locale; -import java.util.MissingResourceException; +import java.util.ResourceBundle; import java.util.Set; import java.util.spi.LocaleNameProvider; -import sun.util.resources.OpenListResourceBundle; /** * Concrete implementation of the @@ -175,15 +174,10 @@ public class LocaleNameProviderImpl extends LocaleNameProvider implements Availa throw new NullPointerException(); } - OpenListResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getLocaleNames(locale); - LocaleServiceProviderPool pool = - LocaleServiceProviderPool.getPool(LocaleNameProvider.class); - try { - if (!pool.hasProviders() || - (rb.getLocale().equals(locale) && rb.handleGetKeys().contains(key))) { + ResourceBundle rb = LocaleProviderAdapter.forType(type).getLocaleData().getLocaleNames(locale); + if (rb.containsKey(key)) { return rb.getString(key); } - } catch (MissingResourceException mre) {} return null; } diff --git a/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java b/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java index a8045610ff8..2683b7dd62b 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java +++ b/jdk/src/share/classes/sun/util/locale/provider/LocaleServiceProviderPool.java @@ -302,7 +302,7 @@ public final class LocaleServiceProviderPool { for (LocaleProviderAdapter.Type type: findProviders(current)) { LocaleServiceProvider lsp = providers.get(type); - providersObj = getter.getObject((P)lsp, current, key, params); + providersObj = getter.getObject((P)lsp, locale, key, params); if (providersObj != null) { return providersObj; } else if (isObjectProvider) { @@ -356,7 +356,7 @@ public final class LocaleServiceProviderPool { * @param locale the input locale * @return the list of candidate locales for the given locale */ - private static List getLookupLocales(Locale locale) { + static List getLookupLocales(Locale locale) { // Note: We currently use the default implementation of // ResourceBundle.Control.getCandidateLocales. The result // returned by getCandidateLocales are already normalized diff --git a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java index 0f123c5d51b..cb4f9aee7de 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java +++ b/jdk/src/share/classes/sun/util/locale/provider/SPILocaleProviderAdapter.java @@ -28,8 +28,11 @@ package sun.util.locale.provider; import java.security.AccessController; import java.security.PrivilegedActionException; import java.security.PrivilegedExceptionAction; -import java.util.ServiceLoader; -import java.util.spi.LocaleServiceProvider; +import java.text.*; +import java.text.spi.*; +import java.util.*; +import java.util.concurrent.*; +import java.util.spi.*; /** * LocaleProviderAdapter implementation for the installed SPI implementations. @@ -54,11 +57,28 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { @Override @SuppressWarnings("unchecked") public P run() { - P lsp = null; + P delegate = null; + for (LocaleServiceProvider provider : ServiceLoader.loadInstalled(c)) { - lsp = (P) provider; + if (delegate == null) { + try { + delegate = + (P) Class.forName(SPILocaleProviderAdapter.class.getCanonicalName() + + "$" + + c.getSimpleName() + + "Delegate") + .newInstance(); + } catch (ClassNotFoundException | + InstantiationException | + IllegalAccessException e) { + LocaleServiceProviderPool.config(SPILocaleProviderAdapter.class, e.toString()); + return null; } - return lsp; + } + + ((Delegate)delegate).addImpl(provider); + } + return delegate; } }); } catch (PrivilegedActionException e) { @@ -66,4 +86,478 @@ public class SPILocaleProviderAdapter extends AuxLocaleProviderAdapter { } return null; } + + /* + * Delegate interface. All the implementations have to have the class name + * following "Delegate" convention. + */ + interface Delegate

{ + public void addImpl(P impl); + public P getImpl(Locale locale); +} + + /* + * Obtain the real SPI implementation, using locale fallback + */ + private static

P getImpl(Map map, Locale locale) { + for (Locale l : LocaleServiceProviderPool.getLookupLocales(locale)) { + P ret = map.get(l); + if (ret != null) { + return ret; + } + } + return null; + } + + /* + * Delegates for the actual SPI implementations. + */ + static class BreakIteratorProviderDelegate extends BreakIteratorProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(BreakIteratorProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public BreakIteratorProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public BreakIterator getWordInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getWordInstance(locale); + } + + @Override + public BreakIterator getLineInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getLineInstance(locale); + } + + @Override + public BreakIterator getCharacterInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getCharacterInstance(locale); + } + + @Override + public BreakIterator getSentenceInstance(Locale locale) { + BreakIteratorProvider bip = getImpl(locale); + assert bip != null; + return bip.getSentenceInstance(locale); + } + + } + + static class CollatorProviderDelegate extends CollatorProvider implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(CollatorProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public CollatorProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public Collator getInstance(Locale locale) { + CollatorProvider cp = getImpl(locale); + assert cp != null; + return cp.getInstance(locale); + } + } + + static class DateFormatProviderDelegate extends DateFormatProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(DateFormatProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public DateFormatProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public DateFormat getTimeInstance(int style, Locale locale) { + DateFormatProvider dfp = getImpl(locale); + assert dfp != null; + return dfp.getTimeInstance(style, locale); + } + + @Override + public DateFormat getDateInstance(int style, Locale locale) { + DateFormatProvider dfp = getImpl(locale); + assert dfp != null; + return dfp.getDateInstance(style, locale); + } + + @Override + public DateFormat getDateTimeInstance(int dateStyle, int timeStyle, Locale locale) { + DateFormatProvider dfp = getImpl(locale); + assert dfp != null; + return dfp.getDateTimeInstance(dateStyle, timeStyle, locale); + } + } + + static class DateFormatSymbolsProviderDelegate extends DateFormatSymbolsProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(DateFormatSymbolsProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public DateFormatSymbolsProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public DateFormatSymbols getInstance(Locale locale) { + DateFormatSymbolsProvider dfsp = getImpl(locale); + assert dfsp != null; + return dfsp.getInstance(locale); + } + } + + static class DecimalFormatSymbolsProviderDelegate extends DecimalFormatSymbolsProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(DecimalFormatSymbolsProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public DecimalFormatSymbolsProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public DecimalFormatSymbols getInstance(Locale locale) { + DecimalFormatSymbolsProvider dfsp = getImpl(locale); + assert dfsp != null; + return dfsp.getInstance(locale); + } + } + + static class NumberFormatProviderDelegate extends NumberFormatProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(NumberFormatProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public NumberFormatProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public NumberFormat getCurrencyInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getCurrencyInstance(locale); + } + + @Override + public NumberFormat getIntegerInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getIntegerInstance(locale); + } + + @Override + public NumberFormat getNumberInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getNumberInstance(locale); + } + + @Override + public NumberFormat getPercentInstance(Locale locale) { + NumberFormatProvider nfp = getImpl(locale); + assert nfp != null; + return nfp.getPercentInstance(locale); + } + } + + static class CalendarDataProviderDelegate extends CalendarDataProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(CalendarDataProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public CalendarDataProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public int getFirstDayOfWeek(Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getFirstDayOfWeek(locale); + } + + @Override + public int getMinimalDaysInFirstWeek(Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getMinimalDaysInFirstWeek(locale); + } + + @Override + public String getDisplayName(String calendarType, + int field, int value, + int style, Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getDisplayName(calendarType, field, value, style, locale); + } + + @Override + public Map getDisplayNames(String calendarType, + int field, int style, + Locale locale) { + CalendarDataProvider cdp = getImpl(locale); + assert cdp != null; + return cdp.getDisplayNames(calendarType, field, style, locale); + } + } + + static class CurrencyNameProviderDelegate extends CurrencyNameProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(CurrencyNameProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public CurrencyNameProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public String getSymbol(String currencyCode, Locale locale) { + CurrencyNameProvider cnp = getImpl(locale); + assert cnp != null; + return cnp.getSymbol(currencyCode, locale); + } + + @Override + public String getDisplayName(String currencyCode, Locale locale) { + CurrencyNameProvider cnp = getImpl(locale); + assert cnp != null; + return cnp.getDisplayName(currencyCode, locale); + } + } + + static class LocaleNameProviderDelegate extends LocaleNameProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(LocaleNameProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public LocaleNameProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public String getDisplayLanguage(String languageCode, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayLanguage(languageCode, locale); + } + + @Override + public String getDisplayScript(String scriptCode, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayScript(scriptCode, locale); + } + + @Override + public String getDisplayCountry(String countryCode, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayCountry(countryCode, locale); + } + + @Override + public String getDisplayVariant(String variant, Locale locale) { + LocaleNameProvider lnp = getImpl(locale); + assert lnp != null; + return lnp.getDisplayVariant(variant, locale); + } + } + + static class TimeZoneNameProviderDelegate extends TimeZoneNameProvider + implements Delegate { + private ConcurrentMap map = new ConcurrentHashMap<>(); + + @Override + public void addImpl(TimeZoneNameProvider impl) { + for (Locale l : impl.getAvailableLocales()) { + map.put(l, impl); + } + } + + @Override + public TimeZoneNameProvider getImpl(Locale locale) { + return SPILocaleProviderAdapter.getImpl(map, locale); + } + + @Override + public Locale[] getAvailableLocales() { + return map.keySet().toArray(new Locale[0]); + } + + @Override + public boolean isSupportedLocale(Locale locale) { + return map.containsKey(locale); + } + + @Override + public String getDisplayName(String ID, boolean daylight, int style, Locale locale) { + TimeZoneNameProvider tznp = getImpl(locale); + assert tznp != null; + return tznp.getDisplayName(ID, daylight, style, locale); + } + } } diff --git a/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java b/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java index ea436fb0167..ff092861824 100644 --- a/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java +++ b/jdk/src/share/classes/sun/util/locale/provider/TimeZoneNameProviderImpl.java @@ -26,11 +26,10 @@ package sun.util.locale.provider; import java.util.Locale; -import java.util.MissingResourceException; +import java.util.ResourceBundle; import java.util.Set; import java.util.TimeZone; import java.util.spi.TimeZoneNameProvider; -import sun.util.resources.OpenListResourceBundle; /** * Concrete implementation of the @@ -102,12 +101,8 @@ public class TimeZoneNameProviderImpl extends TimeZoneNameProvider { } LocaleProviderAdapter adapter = LocaleProviderAdapter.forType(type); - OpenListResourceBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames(); - LocaleServiceProviderPool pool = - LocaleServiceProviderPool.getPool(TimeZoneNameProvider.class); - try { - if (!pool.hasProviders() || - (rb.getLocale().equals(locale) && rb.handleGetKeys().contains(id))) { + ResourceBundle rb = adapter.getLocaleResources(locale).getTimeZoneNames(); + if (rb.containsKey(id)) { String[] names = rb.getStringArray(id); int index = daylight ? 3 : 1; if (style == TimeZone.SHORT) { @@ -115,8 +110,6 @@ public class TimeZoneNameProviderImpl extends TimeZoneNameProvider { } return names[index]; } - } catch (MissingResourceException mre) { - } return null; } diff --git a/jdk/src/share/classes/sun/util/logging/LoggingProxy.java b/jdk/src/share/classes/sun/util/logging/LoggingProxy.java index c3cbfd614fc..5d8e99982c5 100644 --- a/jdk/src/share/classes/sun/util/logging/LoggingProxy.java +++ b/jdk/src/share/classes/sun/util/logging/LoggingProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/logging/LoggingSupport.java b/jdk/src/share/classes/sun/util/logging/LoggingSupport.java index c5a2200c5e7..27f010928ae 100644 --- a/jdk/src/share/classes/sun/util/logging/LoggingSupport.java +++ b/jdk/src/share/classes/sun/util/logging/LoggingSupport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/logging/PlatformLogger.java b/jdk/src/share/classes/sun/util/logging/PlatformLogger.java index 30700a06b0b..000a1603fe9 100644 --- a/jdk/src/share/classes/sun/util/logging/PlatformLogger.java +++ b/jdk/src/share/classes/sun/util/logging/PlatformLogger.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java b/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java index fef2777c267..e0551931d19 100644 --- a/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java +++ b/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java index fe6e93374e4..5b2931b7b62 100644 --- a/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java +++ b/jdk/src/share/classes/sun/util/resources/TimeZoneNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CalendarData_ar.properties b/jdk/src/share/classes/sun/util/resources/ar/CalendarData_ar.properties index 79a41226285..d4d3468ed03 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CalendarData_ar.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CalendarData_ar.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_AE.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_AE.properties index 96b2b7a0247..fd8c720c77b 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_AE.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_AE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_BH.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_BH.properties index d6a509901bd..34cd8dddf28 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_BH.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_BH.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_DZ.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_DZ.properties index b164a07c082..9ab387a1374 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_DZ.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_DZ.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_EG.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_EG.properties index 650f6a2cf97..fe372eb0de6 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_EG.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_EG.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_IQ.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_IQ.properties index 40c1140f801..bb4bfdd3d39 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_IQ.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_IQ.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_JO.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_JO.properties index 8e4e4678e66..6f8693e9829 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_JO.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_JO.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_KW.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_KW.properties index c6b4b4abc2a..6672f25d712 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_KW.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_KW.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LB.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LB.properties index 53406bca2e6..6be59f9fb39 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LB.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LB.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LY.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LY.properties index 133c8b56c47..32762800ca4 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LY.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_LY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_MA.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_MA.properties index 9b541033fc0..640db1c270f 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_MA.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_MA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_OM.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_OM.properties index 1616f1b4808..85c670d72b8 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_OM.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_OM.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_QA.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_QA.properties index 0a8918c49e2..f4fac2f7d30 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_QA.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_QA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SA.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SA.properties index e3533f00bd3..86171b22ee0 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SA.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SD.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SD.properties index 7e0800d5f2d..559468af673 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SD.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SD.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SY.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SY.properties index 5456b9660c5..05d80b6ecc8 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SY.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_SY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_TN.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_TN.properties index f38e5f0e0f3..613b7bb36db 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_TN.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_TN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_YE.properties b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_YE.properties index e62e1f39c15..5037a7c5560 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_YE.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/CurrencyNames_ar_YE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ar/LocaleNames_ar.properties b/jdk/src/share/classes/sun/util/resources/ar/LocaleNames_ar.properties index a21d4707192..5dac9722bde 100644 --- a/jdk/src/share/classes/sun/util/resources/ar/LocaleNames_ar.properties +++ b/jdk/src/share/classes/sun/util/resources/ar/LocaleNames_ar.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/be/CalendarData_be.properties b/jdk/src/share/classes/sun/util/resources/be/CalendarData_be.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/be/CalendarData_be.properties +++ b/jdk/src/share/classes/sun/util/resources/be/CalendarData_be.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/be/CurrencyNames_be_BY.properties b/jdk/src/share/classes/sun/util/resources/be/CurrencyNames_be_BY.properties index f8855a894bc..4651ad1c097 100644 --- a/jdk/src/share/classes/sun/util/resources/be/CurrencyNames_be_BY.properties +++ b/jdk/src/share/classes/sun/util/resources/be/CurrencyNames_be_BY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/be/LocaleNames_be.properties b/jdk/src/share/classes/sun/util/resources/be/LocaleNames_be.properties index 25aaa3d4bee..6cc1ca169e5 100644 --- a/jdk/src/share/classes/sun/util/resources/be/LocaleNames_be.properties +++ b/jdk/src/share/classes/sun/util/resources/be/LocaleNames_be.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/bg/CalendarData_bg.properties b/jdk/src/share/classes/sun/util/resources/bg/CalendarData_bg.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/bg/CalendarData_bg.properties +++ b/jdk/src/share/classes/sun/util/resources/bg/CalendarData_bg.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/bg/CurrencyNames_bg_BG.properties b/jdk/src/share/classes/sun/util/resources/bg/CurrencyNames_bg_BG.properties index b3c3f40188b..ab4eade2b1d 100644 --- a/jdk/src/share/classes/sun/util/resources/bg/CurrencyNames_bg_BG.properties +++ b/jdk/src/share/classes/sun/util/resources/bg/CurrencyNames_bg_BG.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/bg/LocaleNames_bg.properties b/jdk/src/share/classes/sun/util/resources/bg/LocaleNames_bg.properties index 2ea8f30c9d6..cec6a952fda 100644 --- a/jdk/src/share/classes/sun/util/resources/bg/LocaleNames_bg.properties +++ b/jdk/src/share/classes/sun/util/resources/bg/LocaleNames_bg.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ca/CalendarData_ca.properties b/jdk/src/share/classes/sun/util/resources/ca/CalendarData_ca.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/ca/CalendarData_ca.properties +++ b/jdk/src/share/classes/sun/util/resources/ca/CalendarData_ca.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ca/CurrencyNames_ca_ES.properties b/jdk/src/share/classes/sun/util/resources/ca/CurrencyNames_ca_ES.properties index 7dd49e6d400..e7f60a2428e 100644 --- a/jdk/src/share/classes/sun/util/resources/ca/CurrencyNames_ca_ES.properties +++ b/jdk/src/share/classes/sun/util/resources/ca/CurrencyNames_ca_ES.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ca/LocaleNames_ca.properties b/jdk/src/share/classes/sun/util/resources/ca/LocaleNames_ca.properties index 61ec3335738..3cb67eb83b5 100644 --- a/jdk/src/share/classes/sun/util/resources/ca/LocaleNames_ca.properties +++ b/jdk/src/share/classes/sun/util/resources/ca/LocaleNames_ca.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/cs/CalendarData_cs.properties b/jdk/src/share/classes/sun/util/resources/cs/CalendarData_cs.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/cs/CalendarData_cs.properties +++ b/jdk/src/share/classes/sun/util/resources/cs/CalendarData_cs.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/cs/CurrencyNames_cs_CZ.properties b/jdk/src/share/classes/sun/util/resources/cs/CurrencyNames_cs_CZ.properties index cc48db2a087..296669d7eab 100644 --- a/jdk/src/share/classes/sun/util/resources/cs/CurrencyNames_cs_CZ.properties +++ b/jdk/src/share/classes/sun/util/resources/cs/CurrencyNames_cs_CZ.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/cs/LocaleNames_cs.properties b/jdk/src/share/classes/sun/util/resources/cs/LocaleNames_cs.properties index a2e8cda50bd..49bb1ffc855 100644 --- a/jdk/src/share/classes/sun/util/resources/cs/LocaleNames_cs.properties +++ b/jdk/src/share/classes/sun/util/resources/cs/LocaleNames_cs.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/da/CalendarData_da.properties b/jdk/src/share/classes/sun/util/resources/da/CalendarData_da.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/da/CalendarData_da.properties +++ b/jdk/src/share/classes/sun/util/resources/da/CalendarData_da.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/da/CurrencyNames_da_DK.properties b/jdk/src/share/classes/sun/util/resources/da/CurrencyNames_da_DK.properties index 2c64e87d66d..d29f7f6cd93 100644 --- a/jdk/src/share/classes/sun/util/resources/da/CurrencyNames_da_DK.properties +++ b/jdk/src/share/classes/sun/util/resources/da/CurrencyNames_da_DK.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/da/LocaleNames_da.properties b/jdk/src/share/classes/sun/util/resources/da/LocaleNames_da.properties index 3981ca9f7d9..f811c424db6 100644 --- a/jdk/src/share/classes/sun/util/resources/da/LocaleNames_da.properties +++ b/jdk/src/share/classes/sun/util/resources/da/LocaleNames_da.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/CalendarData_de.properties b/jdk/src/share/classes/sun/util/resources/de/CalendarData_de.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/de/CalendarData_de.properties +++ b/jdk/src/share/classes/sun/util/resources/de/CalendarData_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de.properties b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de.properties index 7f193bcc8aa..510a68e4a02 100644 --- a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de.properties +++ b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_AT.properties b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_AT.properties index 90700455234..113ed6fb105 100644 --- a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_AT.properties +++ b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_AT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_CH.properties b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_CH.properties index 04756670b31..8ea815fb11a 100644 --- a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_CH.properties +++ b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_CH.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_DE.properties b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_DE.properties index 7968d922b30..6ee888469b4 100644 --- a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_DE.properties +++ b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_DE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_GR.properties b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_GR.properties index 1444f75c8d7..b44226143bb 100644 --- a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_GR.properties +++ b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_GR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_LU.properties b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_LU.properties index 6c757a1ddf2..e7fc898ede4 100644 --- a/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_LU.properties +++ b/jdk/src/share/classes/sun/util/resources/de/CurrencyNames_de_LU.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/de/LocaleNames_de.properties b/jdk/src/share/classes/sun/util/resources/de/LocaleNames_de.properties index 158dd8a29f6..69bdf7dbb66 100644 --- a/jdk/src/share/classes/sun/util/resources/de/LocaleNames_de.properties +++ b/jdk/src/share/classes/sun/util/resources/de/LocaleNames_de.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/el/CalendarData_el.properties b/jdk/src/share/classes/sun/util/resources/el/CalendarData_el.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/el/CalendarData_el.properties +++ b/jdk/src/share/classes/sun/util/resources/el/CalendarData_el.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/el/CalendarData_el_CY.properties b/jdk/src/share/classes/sun/util/resources/el/CalendarData_el_CY.properties index b28ba124cef..6dfca1101df 100644 --- a/jdk/src/share/classes/sun/util/resources/el/CalendarData_el_CY.properties +++ b/jdk/src/share/classes/sun/util/resources/el/CalendarData_el_CY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_CY.properties b/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_CY.properties index 207db80172e..48fa57a8bdc 100644 --- a/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_CY.properties +++ b/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_CY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_GR.properties b/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_GR.properties index 1444f75c8d7..b44226143bb 100644 --- a/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_GR.properties +++ b/jdk/src/share/classes/sun/util/resources/el/CurrencyNames_el_GR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el.properties b/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el.properties index 00dcef2fce5..23c6074e656 100644 --- a/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el.properties +++ b/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el_CY.properties b/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el_CY.properties index bb1b5795fb2..4310a2199f2 100644 --- a/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el_CY.properties +++ b/jdk/src/share/classes/sun/util/resources/el/LocaleNames_el_CY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en.properties b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_GB.properties b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_GB.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_GB.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_GB.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_IE.properties b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_IE.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_IE.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_IE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_MT.properties b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_MT.properties index ba64f31f510..f41fe83d116 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_MT.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CalendarData_en_MT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_AU.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_AU.properties index 0264357607c..174a678a242 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_AU.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_AU.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_CA.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_CA.properties index 846bfe3b43a..98c0ba034fa 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_CA.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_CA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_GB.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_GB.properties index 30e0616f0bf..2601aef96d4 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_GB.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_GB.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IE.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IE.properties index 3a72f0582c1..0f480271483 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IE.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IN.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IN.properties index a57871d51b7..1965ecbdfaf 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IN.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_IN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_MT.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_MT.properties index 0cd749b8632..d78f240ec1a 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_MT.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_MT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_NZ.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_NZ.properties index 2afb18e1b86..1e8ca52a771 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_NZ.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_NZ.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_PH.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_PH.properties index a26d9c17471..e47c27dd732 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_PH.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_PH.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_SG.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_SG.properties index 9eced4d6736..3dcd17b816f 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_SG.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_SG.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_US.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_US.properties index f8fef79c75d..995eaea2eff 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_US.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_US.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_ZA.properties b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_ZA.properties index 50fead9f6cf..b4e58d89580 100644 --- a/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_ZA.properties +++ b/jdk/src/share/classes/sun/util/resources/en/CurrencyNames_en_ZA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en.properties b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en.properties index a7f35a1c9d2..ef2759e5859 100644 --- a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en.properties +++ b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_MT.properties b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_MT.properties index 6c0729d79f4..c5262907816 100644 --- a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_MT.properties +++ b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_MT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_PH.properties b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_PH.properties index 6c0729d79f4..c5262907816 100644 --- a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_PH.properties +++ b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_PH.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_SG.properties b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_SG.properties index 6c0729d79f4..c5262907816 100644 --- a/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_SG.properties +++ b/jdk/src/share/classes/sun/util/resources/en/LocaleNames_en_SG.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/es/CalendarData_es.properties b/jdk/src/share/classes/sun/util/resources/es/CalendarData_es.properties index 3b4514714e2..6f4b1fa4695 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CalendarData_es.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CalendarData_es.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_ES.properties b/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_ES.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_ES.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_ES.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_US.properties b/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_US.properties index d1d5f2a1f48..c3d94c14df9 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_US.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CalendarData_es_US.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es.properties index 9ea7553e092..2fce98ea063 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_AR.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_AR.properties index 7c5e137208a..87779384b52 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_AR.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_AR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_BO.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_BO.properties index 40b17b366e3..646947d045f 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_BO.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_BO.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CL.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CL.properties index 3ceace685bc..4d3fd311690 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CL.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CL.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CO.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CO.properties index c684c547928..4c340c31cce 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CO.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CO.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CR.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CR.properties index 4330f9e1e1f..a94e3a4af21 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CR.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CU.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CU.properties index 23ebbefdf11..69a366adb65 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CU.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_CU.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_DO.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_DO.properties index f746a08da90..9601201a8c4 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_DO.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_DO.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_EC.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_EC.properties index f8fef79c75d..995eaea2eff 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_EC.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_EC.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_ES.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_ES.properties index 7dd49e6d400..e7f60a2428e 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_ES.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_ES.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_GT.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_GT.properties index 2cc3253851f..c8a12cb7e55 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_GT.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_GT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_HN.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_HN.properties index 33269e00f85..0911cb6093c 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_HN.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_HN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_MX.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_MX.properties index 9b15a12a5bc..6a2e8198d68 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_MX.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_MX.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_NI.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_NI.properties index 59486dcc826..da523f29c83 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_NI.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_NI.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PA.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PA.properties index 1912c1ac51b..8aa889faa3f 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PA.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PR.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PR.properties index f8fef79c75d..995eaea2eff 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PR.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PY.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PY.properties index c820d53fa89..9346f48016c 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PY.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_PY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_SV.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_SV.properties index 04ac7f71c53..31e5d2930c6 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_SV.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_SV.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_US.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_US.properties index a0a3c31a4ed..1f381ba4406 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_US.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_US.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_UY.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_UY.properties index ea25ef24e64..2937637dd0a 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_UY.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_UY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_VE.properties b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_VE.properties index dd5b78298ab..41c45105be5 100644 --- a/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_VE.properties +++ b/jdk/src/share/classes/sun/util/resources/es/CurrencyNames_es_VE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es.properties b/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es.properties index ad64421e08c..bb8138828da 100644 --- a/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es.properties +++ b/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es_US.properties b/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es_US.properties index 0c59370f991..576f19a06a0 100644 --- a/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es_US.properties +++ b/jdk/src/share/classes/sun/util/resources/es/LocaleNames_es_US.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/et/CalendarData_et.properties b/jdk/src/share/classes/sun/util/resources/et/CalendarData_et.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/et/CalendarData_et.properties +++ b/jdk/src/share/classes/sun/util/resources/et/CalendarData_et.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/et/CurrencyNames_et_EE.properties b/jdk/src/share/classes/sun/util/resources/et/CurrencyNames_et_EE.properties index 333360ec15c..cdc42148ad6 100644 --- a/jdk/src/share/classes/sun/util/resources/et/CurrencyNames_et_EE.properties +++ b/jdk/src/share/classes/sun/util/resources/et/CurrencyNames_et_EE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/et/LocaleNames_et.properties b/jdk/src/share/classes/sun/util/resources/et/LocaleNames_et.properties index f521684c83a..7228766d42c 100644 --- a/jdk/src/share/classes/sun/util/resources/et/LocaleNames_et.properties +++ b/jdk/src/share/classes/sun/util/resources/et/LocaleNames_et.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fi/CalendarData_fi.properties b/jdk/src/share/classes/sun/util/resources/fi/CalendarData_fi.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/fi/CalendarData_fi.properties +++ b/jdk/src/share/classes/sun/util/resources/fi/CalendarData_fi.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fi/CurrencyNames_fi_FI.properties b/jdk/src/share/classes/sun/util/resources/fi/CurrencyNames_fi_FI.properties index 6e37ff0ff12..160e4d3face 100644 --- a/jdk/src/share/classes/sun/util/resources/fi/CurrencyNames_fi_FI.properties +++ b/jdk/src/share/classes/sun/util/resources/fi/CurrencyNames_fi_FI.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fi/LocaleNames_fi.properties b/jdk/src/share/classes/sun/util/resources/fi/LocaleNames_fi.properties index 10ed75d3e52..bc118ddcd7c 100644 --- a/jdk/src/share/classes/sun/util/resources/fi/LocaleNames_fi.properties +++ b/jdk/src/share/classes/sun/util/resources/fi/LocaleNames_fi.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr.properties b/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr_CA.properties b/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr_CA.properties index 8494e986fdc..6d7df92f9e5 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr_CA.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CalendarData_fr_CA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr.properties b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr.properties index ecba10c9825..a2d23a8413f 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_BE.properties b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_BE.properties index dcb952d2f0b..b350ba62ac8 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_BE.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_BE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CA.properties b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CA.properties index 33f98dc8a79..0ee4b263302 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CA.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CH.properties b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CH.properties index 04756670b31..8ea815fb11a 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CH.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_CH.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_FR.properties b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_FR.properties index 87f0d574163..30c3b542ae2 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_FR.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_FR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_LU.properties b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_LU.properties index 6c757a1ddf2..e7fc898ede4 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_LU.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/CurrencyNames_fr_LU.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/fr/LocaleNames_fr.properties b/jdk/src/share/classes/sun/util/resources/fr/LocaleNames_fr.properties index de6d2998b81..a1e8c31f365 100644 --- a/jdk/src/share/classes/sun/util/resources/fr/LocaleNames_fr.properties +++ b/jdk/src/share/classes/sun/util/resources/fr/LocaleNames_fr.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ga/CurrencyNames_ga_IE.properties b/jdk/src/share/classes/sun/util/resources/ga/CurrencyNames_ga_IE.properties index 894bc6bd359..d4bda89dbb6 100644 --- a/jdk/src/share/classes/sun/util/resources/ga/CurrencyNames_ga_IE.properties +++ b/jdk/src/share/classes/sun/util/resources/ga/CurrencyNames_ga_IE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/ga/LocaleNames_ga.properties b/jdk/src/share/classes/sun/util/resources/ga/LocaleNames_ga.properties index b64080c2536..90b4ca53ab6 100644 --- a/jdk/src/share/classes/sun/util/resources/ga/LocaleNames_ga.properties +++ b/jdk/src/share/classes/sun/util/resources/ga/LocaleNames_ga.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/hi/CalendarData_hi.properties b/jdk/src/share/classes/sun/util/resources/hi/CalendarData_hi.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/hi/CalendarData_hi.properties +++ b/jdk/src/share/classes/sun/util/resources/hi/CalendarData_hi.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hi/CurrencyNames_hi_IN.properties b/jdk/src/share/classes/sun/util/resources/hi/CurrencyNames_hi_IN.properties index 5863f04a304..a638ef07ccb 100644 --- a/jdk/src/share/classes/sun/util/resources/hi/CurrencyNames_hi_IN.properties +++ b/jdk/src/share/classes/sun/util/resources/hi/CurrencyNames_hi_IN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hi/LocaleNames_hi.properties b/jdk/src/share/classes/sun/util/resources/hi/LocaleNames_hi.properties index 948eb04db0e..223fa99fe3b 100644 --- a/jdk/src/share/classes/sun/util/resources/hi/LocaleNames_hi.properties +++ b/jdk/src/share/classes/sun/util/resources/hi/LocaleNames_hi.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hr/CalendarData_hr.properties b/jdk/src/share/classes/sun/util/resources/hr/CalendarData_hr.properties index 035b1649949..4040553fafd 100644 --- a/jdk/src/share/classes/sun/util/resources/hr/CalendarData_hr.properties +++ b/jdk/src/share/classes/sun/util/resources/hr/CalendarData_hr.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hr/CurrencyNames_hr_HR.properties b/jdk/src/share/classes/sun/util/resources/hr/CurrencyNames_hr_HR.properties index 22d1c415d5f..70f210e2da6 100644 --- a/jdk/src/share/classes/sun/util/resources/hr/CurrencyNames_hr_HR.properties +++ b/jdk/src/share/classes/sun/util/resources/hr/CurrencyNames_hr_HR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hr/LocaleNames_hr.properties b/jdk/src/share/classes/sun/util/resources/hr/LocaleNames_hr.properties index efef9f394fc..5c7064d75a4 100644 --- a/jdk/src/share/classes/sun/util/resources/hr/LocaleNames_hr.properties +++ b/jdk/src/share/classes/sun/util/resources/hr/LocaleNames_hr.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hu/CalendarData_hu.properties b/jdk/src/share/classes/sun/util/resources/hu/CalendarData_hu.properties index 48312915f68..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/hu/CalendarData_hu.properties +++ b/jdk/src/share/classes/sun/util/resources/hu/CalendarData_hu.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hu/CurrencyNames_hu_HU.properties b/jdk/src/share/classes/sun/util/resources/hu/CurrencyNames_hu_HU.properties index 673f8113af7..7b9fbd6be5f 100644 --- a/jdk/src/share/classes/sun/util/resources/hu/CurrencyNames_hu_HU.properties +++ b/jdk/src/share/classes/sun/util/resources/hu/CurrencyNames_hu_HU.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/hu/LocaleNames_hu.properties b/jdk/src/share/classes/sun/util/resources/hu/LocaleNames_hu.properties index d9e79920431..3853f337f28 100644 --- a/jdk/src/share/classes/sun/util/resources/hu/LocaleNames_hu.properties +++ b/jdk/src/share/classes/sun/util/resources/hu/LocaleNames_hu.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/in/CalendarData_in_ID.properties b/jdk/src/share/classes/sun/util/resources/in/CalendarData_in_ID.properties index c618ce3b96f..abcd01cb35a 100644 --- a/jdk/src/share/classes/sun/util/resources/in/CalendarData_in_ID.properties +++ b/jdk/src/share/classes/sun/util/resources/in/CalendarData_in_ID.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/in/CurrencyNames_in_ID.properties b/jdk/src/share/classes/sun/util/resources/in/CurrencyNames_in_ID.properties index 193075b9947..f76e1a2933e 100644 --- a/jdk/src/share/classes/sun/util/resources/in/CurrencyNames_in_ID.properties +++ b/jdk/src/share/classes/sun/util/resources/in/CurrencyNames_in_ID.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/in/LocaleNames_in.properties b/jdk/src/share/classes/sun/util/resources/in/LocaleNames_in.properties index 61c259a8da4..71c7e30f2b4 100644 --- a/jdk/src/share/classes/sun/util/resources/in/LocaleNames_in.properties +++ b/jdk/src/share/classes/sun/util/resources/in/LocaleNames_in.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/is/CalendarData_is.properties b/jdk/src/share/classes/sun/util/resources/is/CalendarData_is.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/is/CalendarData_is.properties +++ b/jdk/src/share/classes/sun/util/resources/is/CalendarData_is.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/is/CurrencyNames_is_IS.properties b/jdk/src/share/classes/sun/util/resources/is/CurrencyNames_is_IS.properties index ad9389ff29e..c2051899d93 100644 --- a/jdk/src/share/classes/sun/util/resources/is/CurrencyNames_is_IS.properties +++ b/jdk/src/share/classes/sun/util/resources/is/CurrencyNames_is_IS.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/is/LocaleNames_is.properties b/jdk/src/share/classes/sun/util/resources/is/LocaleNames_is.properties index b8c028c6a78..64645485d01 100644 --- a/jdk/src/share/classes/sun/util/resources/is/LocaleNames_is.properties +++ b/jdk/src/share/classes/sun/util/resources/is/LocaleNames_is.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/it/CalendarData_it.properties b/jdk/src/share/classes/sun/util/resources/it/CalendarData_it.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/it/CalendarData_it.properties +++ b/jdk/src/share/classes/sun/util/resources/it/CalendarData_it.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it.properties b/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it.properties index 9e3ad2a2ff2..a069e982361 100644 --- a/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it.properties +++ b/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_CH.properties b/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_CH.properties index 04756670b31..8ea815fb11a 100644 --- a/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_CH.properties +++ b/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_CH.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_IT.properties b/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_IT.properties index db66ef494d2..c5671e853ff 100644 --- a/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_IT.properties +++ b/jdk/src/share/classes/sun/util/resources/it/CurrencyNames_it_IT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/it/LocaleNames_it.properties b/jdk/src/share/classes/sun/util/resources/it/LocaleNames_it.properties index 6cbf7cf688c..dad9f49f49a 100644 --- a/jdk/src/share/classes/sun/util/resources/it/LocaleNames_it.properties +++ b/jdk/src/share/classes/sun/util/resources/it/LocaleNames_it.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/iw/CalendarData_iw.properties b/jdk/src/share/classes/sun/util/resources/iw/CalendarData_iw.properties index cf18123869a..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/iw/CalendarData_iw.properties +++ b/jdk/src/share/classes/sun/util/resources/iw/CalendarData_iw.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/iw/CurrencyNames_iw_IL.properties b/jdk/src/share/classes/sun/util/resources/iw/CurrencyNames_iw_IL.properties index 939d9a6322b..cfbacb78b09 100644 --- a/jdk/src/share/classes/sun/util/resources/iw/CurrencyNames_iw_IL.properties +++ b/jdk/src/share/classes/sun/util/resources/iw/CurrencyNames_iw_IL.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/iw/LocaleNames_iw.properties b/jdk/src/share/classes/sun/util/resources/iw/LocaleNames_iw.properties index 062708dde86..a52de447af2 100644 --- a/jdk/src/share/classes/sun/util/resources/iw/LocaleNames_iw.properties +++ b/jdk/src/share/classes/sun/util/resources/iw/LocaleNames_iw.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ja/CalendarData_ja.properties b/jdk/src/share/classes/sun/util/resources/ja/CalendarData_ja.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/ja/CalendarData_ja.properties +++ b/jdk/src/share/classes/sun/util/resources/ja/CalendarData_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja.properties b/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja.properties index afbc0c738df..96f527d3e49 100644 --- a/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja.properties +++ b/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja_JP.properties b/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja_JP.properties index 58bfca69549..f43ef088441 100644 --- a/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja_JP.properties +++ b/jdk/src/share/classes/sun/util/resources/ja/CurrencyNames_ja_JP.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ja/LocaleNames_ja.properties b/jdk/src/share/classes/sun/util/resources/ja/LocaleNames_ja.properties index b52d16ff518..b2e07f9bdb1 100644 --- a/jdk/src/share/classes/sun/util/resources/ja/LocaleNames_ja.properties +++ b/jdk/src/share/classes/sun/util/resources/ja/LocaleNames_ja.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ko/CalendarData_ko.properties b/jdk/src/share/classes/sun/util/resources/ko/CalendarData_ko.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/ko/CalendarData_ko.properties +++ b/jdk/src/share/classes/sun/util/resources/ko/CalendarData_ko.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko.properties b/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko.properties index 959bf7cee07..50ce6b84209 100644 --- a/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko.properties +++ b/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko_KR.properties b/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko_KR.properties index c9320ee5031..3791aa82d3e 100644 --- a/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko_KR.properties +++ b/jdk/src/share/classes/sun/util/resources/ko/CurrencyNames_ko_KR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ko/LocaleNames_ko.properties b/jdk/src/share/classes/sun/util/resources/ko/LocaleNames_ko.properties index 67eb5acc7f2..861b9fd4ef5 100644 --- a/jdk/src/share/classes/sun/util/resources/ko/LocaleNames_ko.properties +++ b/jdk/src/share/classes/sun/util/resources/ko/LocaleNames_ko.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/lt/CalendarData_lt.properties b/jdk/src/share/classes/sun/util/resources/lt/CalendarData_lt.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/lt/CalendarData_lt.properties +++ b/jdk/src/share/classes/sun/util/resources/lt/CalendarData_lt.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/lt/CurrencyNames_lt_LT.properties b/jdk/src/share/classes/sun/util/resources/lt/CurrencyNames_lt_LT.properties index 7e784ddbbac..f7275219e28 100644 --- a/jdk/src/share/classes/sun/util/resources/lt/CurrencyNames_lt_LT.properties +++ b/jdk/src/share/classes/sun/util/resources/lt/CurrencyNames_lt_LT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/lt/LocaleNames_lt.properties b/jdk/src/share/classes/sun/util/resources/lt/LocaleNames_lt.properties index 1b42fc6b8ea..5cf5876bc27 100644 --- a/jdk/src/share/classes/sun/util/resources/lt/LocaleNames_lt.properties +++ b/jdk/src/share/classes/sun/util/resources/lt/LocaleNames_lt.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/lv/CalendarData_lv.properties b/jdk/src/share/classes/sun/util/resources/lv/CalendarData_lv.properties index 126532a799c..9849f42b84a 100644 --- a/jdk/src/share/classes/sun/util/resources/lv/CalendarData_lv.properties +++ b/jdk/src/share/classes/sun/util/resources/lv/CalendarData_lv.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties b/jdk/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties index d8ed95cdc0d..2a07e7dc6bb 100644 --- a/jdk/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties +++ b/jdk/src/share/classes/sun/util/resources/lv/CurrencyNames_lv_LV.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/lv/LocaleNames_lv.properties b/jdk/src/share/classes/sun/util/resources/lv/LocaleNames_lv.properties index 97f7ba0e0a6..b4d0b1c837d 100644 --- a/jdk/src/share/classes/sun/util/resources/lv/LocaleNames_lv.properties +++ b/jdk/src/share/classes/sun/util/resources/lv/LocaleNames_lv.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/mk/CalendarData_mk.properties b/jdk/src/share/classes/sun/util/resources/mk/CalendarData_mk.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/mk/CalendarData_mk.properties +++ b/jdk/src/share/classes/sun/util/resources/mk/CalendarData_mk.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/mk/CurrencyNames_mk_MK.properties b/jdk/src/share/classes/sun/util/resources/mk/CurrencyNames_mk_MK.properties index 62a45f2d09a..0e79a357d44 100644 --- a/jdk/src/share/classes/sun/util/resources/mk/CurrencyNames_mk_MK.properties +++ b/jdk/src/share/classes/sun/util/resources/mk/CurrencyNames_mk_MK.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/mk/LocaleNames_mk.properties b/jdk/src/share/classes/sun/util/resources/mk/LocaleNames_mk.properties index 8a7702cb006..e16336d2f62 100644 --- a/jdk/src/share/classes/sun/util/resources/mk/LocaleNames_mk.properties +++ b/jdk/src/share/classes/sun/util/resources/mk/LocaleNames_mk.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ms/CalendarData_ms_MY.properties b/jdk/src/share/classes/sun/util/resources/ms/CalendarData_ms_MY.properties index c618ce3b96f..abcd01cb35a 100644 --- a/jdk/src/share/classes/sun/util/resources/ms/CalendarData_ms_MY.properties +++ b/jdk/src/share/classes/sun/util/resources/ms/CalendarData_ms_MY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/ms/CurrencyNames_ms_MY.properties b/jdk/src/share/classes/sun/util/resources/ms/CurrencyNames_ms_MY.properties index 7829c5c6f71..41262f24ed9 100644 --- a/jdk/src/share/classes/sun/util/resources/ms/CurrencyNames_ms_MY.properties +++ b/jdk/src/share/classes/sun/util/resources/ms/CurrencyNames_ms_MY.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/ms/LocaleNames_ms.properties b/jdk/src/share/classes/sun/util/resources/ms/LocaleNames_ms.properties index 5f7f2302009..8a3816acbc4 100644 --- a/jdk/src/share/classes/sun/util/resources/ms/LocaleNames_ms.properties +++ b/jdk/src/share/classes/sun/util/resources/ms/LocaleNames_ms.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt.properties b/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt.properties index ee3d610d8fa..f41fe83d116 100644 --- a/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt.properties +++ b/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt_MT.properties b/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt_MT.properties index 2c45178a631..a32647b69ba 100644 --- a/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt_MT.properties +++ b/jdk/src/share/classes/sun/util/resources/mt/CalendarData_mt_MT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/mt/CurrencyNames_mt_MT.properties b/jdk/src/share/classes/sun/util/resources/mt/CurrencyNames_mt_MT.properties index 0cd749b8632..d78f240ec1a 100644 --- a/jdk/src/share/classes/sun/util/resources/mt/CurrencyNames_mt_MT.properties +++ b/jdk/src/share/classes/sun/util/resources/mt/CurrencyNames_mt_MT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/mt/LocaleNames_mt.properties b/jdk/src/share/classes/sun/util/resources/mt/LocaleNames_mt.properties index c0c3c058d99..2ed2d54153d 100644 --- a/jdk/src/share/classes/sun/util/resources/mt/LocaleNames_mt.properties +++ b/jdk/src/share/classes/sun/util/resources/mt/LocaleNames_mt.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/nl/CalendarData_nl.properties b/jdk/src/share/classes/sun/util/resources/nl/CalendarData_nl.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/nl/CalendarData_nl.properties +++ b/jdk/src/share/classes/sun/util/resources/nl/CalendarData_nl.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_BE.properties b/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_BE.properties index c39ed728b36..0469b988c21 100644 --- a/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_BE.properties +++ b/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_BE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_NL.properties b/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_NL.properties index 007096af154..acf7b8c9c63 100644 --- a/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_NL.properties +++ b/jdk/src/share/classes/sun/util/resources/nl/CurrencyNames_nl_NL.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/nl/LocaleNames_nl.properties b/jdk/src/share/classes/sun/util/resources/nl/LocaleNames_nl.properties index b88e5a0e937..0770450afc6 100644 --- a/jdk/src/share/classes/sun/util/resources/nl/LocaleNames_nl.properties +++ b/jdk/src/share/classes/sun/util/resources/nl/LocaleNames_nl.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/no/CalendarData_no.properties b/jdk/src/share/classes/sun/util/resources/no/CalendarData_no.properties index 0ca6312fafe..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/no/CalendarData_no.properties +++ b/jdk/src/share/classes/sun/util/resources/no/CalendarData_no.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/no/CurrencyNames_no_NO.properties b/jdk/src/share/classes/sun/util/resources/no/CurrencyNames_no_NO.properties index 1af24433490..10852e51712 100644 --- a/jdk/src/share/classes/sun/util/resources/no/CurrencyNames_no_NO.properties +++ b/jdk/src/share/classes/sun/util/resources/no/CurrencyNames_no_NO.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no.properties b/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no.properties index bcfc071eb85..3a43b04dcc9 100644 --- a/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no.properties +++ b/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no_NO_NY.properties b/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no_NO_NY.properties index bcfc071eb85..3a43b04dcc9 100644 --- a/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no_NO_NY.properties +++ b/jdk/src/share/classes/sun/util/resources/no/LocaleNames_no_NO_NY.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pl/CalendarData_pl.properties b/jdk/src/share/classes/sun/util/resources/pl/CalendarData_pl.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/pl/CalendarData_pl.properties +++ b/jdk/src/share/classes/sun/util/resources/pl/CalendarData_pl.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pl/CurrencyNames_pl_PL.properties b/jdk/src/share/classes/sun/util/resources/pl/CurrencyNames_pl_PL.properties index 47fc2ae8ec0..a1d472fd5e9 100644 --- a/jdk/src/share/classes/sun/util/resources/pl/CurrencyNames_pl_PL.properties +++ b/jdk/src/share/classes/sun/util/resources/pl/CurrencyNames_pl_PL.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pl/LocaleNames_pl.properties b/jdk/src/share/classes/sun/util/resources/pl/LocaleNames_pl.properties index 86d8ff66e29..80d68512c56 100644 --- a/jdk/src/share/classes/sun/util/resources/pl/LocaleNames_pl.properties +++ b/jdk/src/share/classes/sun/util/resources/pl/LocaleNames_pl.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt.properties b/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt.properties index 3b4514714e2..6f4b1fa4695 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt_PT.properties b/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt_PT.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt_PT.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/CalendarData_pt_PT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt.properties b/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt.properties index 20a62c8bb62..20f93490805 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_BR.properties b/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_BR.properties index 7b6aba92c09..95b68a9c957 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_BR.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_BR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_PT.properties b/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_PT.properties index 1d4b7f7aedc..fa0dd96cab6 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_PT.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/CurrencyNames_pt_PT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt.properties b/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt.properties index 93cff5bb9b2..0a56e5c4ca3 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_BR.properties b/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_BR.properties index d6e391f4e76..9f7fce0bd90 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_BR.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_BR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_PT.properties b/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_PT.properties index 56435573b19..d4699708220 100644 --- a/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_PT.properties +++ b/jdk/src/share/classes/sun/util/resources/pt/LocaleNames_pt_PT.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/ro/CalendarData_ro.properties b/jdk/src/share/classes/sun/util/resources/ro/CalendarData_ro.properties index 65efd83b2da..54b8449a943 100644 --- a/jdk/src/share/classes/sun/util/resources/ro/CalendarData_ro.properties +++ b/jdk/src/share/classes/sun/util/resources/ro/CalendarData_ro.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ro/CurrencyNames_ro_RO.properties b/jdk/src/share/classes/sun/util/resources/ro/CurrencyNames_ro_RO.properties index 4dea5aef2e0..b02f984a2ed 100644 --- a/jdk/src/share/classes/sun/util/resources/ro/CurrencyNames_ro_RO.properties +++ b/jdk/src/share/classes/sun/util/resources/ro/CurrencyNames_ro_RO.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ro/LocaleNames_ro.properties b/jdk/src/share/classes/sun/util/resources/ro/LocaleNames_ro.properties index 2d18ac41568..752ef799163 100644 --- a/jdk/src/share/classes/sun/util/resources/ro/LocaleNames_ro.properties +++ b/jdk/src/share/classes/sun/util/resources/ro/LocaleNames_ro.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ru/CalendarData_ru.properties b/jdk/src/share/classes/sun/util/resources/ru/CalendarData_ru.properties index 3b4514714e2..6f4b1fa4695 100644 --- a/jdk/src/share/classes/sun/util/resources/ru/CalendarData_ru.properties +++ b/jdk/src/share/classes/sun/util/resources/ru/CalendarData_ru.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ru/CurrencyNames_ru_RU.properties b/jdk/src/share/classes/sun/util/resources/ru/CurrencyNames_ru_RU.properties index 89fe9c16515..507416bf7d1 100644 --- a/jdk/src/share/classes/sun/util/resources/ru/CurrencyNames_ru_RU.properties +++ b/jdk/src/share/classes/sun/util/resources/ru/CurrencyNames_ru_RU.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/ru/LocaleNames_ru.properties b/jdk/src/share/classes/sun/util/resources/ru/LocaleNames_ru.properties index fe65cf7c89d..b6ec3a2de85 100644 --- a/jdk/src/share/classes/sun/util/resources/ru/LocaleNames_ru.properties +++ b/jdk/src/share/classes/sun/util/resources/ru/LocaleNames_ru.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sk/CalendarData_sk.properties b/jdk/src/share/classes/sun/util/resources/sk/CalendarData_sk.properties index 53ac28c8de1..4d5f29bdcb8 100644 --- a/jdk/src/share/classes/sun/util/resources/sk/CalendarData_sk.properties +++ b/jdk/src/share/classes/sun/util/resources/sk/CalendarData_sk.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sk/CurrencyNames_sk_SK.properties b/jdk/src/share/classes/sun/util/resources/sk/CurrencyNames_sk_SK.properties index eb10a65ca9a..57894083b40 100644 --- a/jdk/src/share/classes/sun/util/resources/sk/CurrencyNames_sk_SK.properties +++ b/jdk/src/share/classes/sun/util/resources/sk/CurrencyNames_sk_SK.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sk/LocaleNames_sk.properties b/jdk/src/share/classes/sun/util/resources/sk/LocaleNames_sk.properties index 2fd0d1b5ac5..59d47a2c686 100644 --- a/jdk/src/share/classes/sun/util/resources/sk/LocaleNames_sk.properties +++ b/jdk/src/share/classes/sun/util/resources/sk/LocaleNames_sk.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sl/CalendarData_sl.properties b/jdk/src/share/classes/sun/util/resources/sl/CalendarData_sl.properties index 40c51eba1fa..a758c00e2ca 100644 --- a/jdk/src/share/classes/sun/util/resources/sl/CalendarData_sl.properties +++ b/jdk/src/share/classes/sun/util/resources/sl/CalendarData_sl.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sl/CurrencyNames_sl_SI.properties b/jdk/src/share/classes/sun/util/resources/sl/CurrencyNames_sl_SI.properties index 27a8a7bfbdb..abafe54ce49 100644 --- a/jdk/src/share/classes/sun/util/resources/sl/CurrencyNames_sl_SI.properties +++ b/jdk/src/share/classes/sun/util/resources/sl/CurrencyNames_sl_SI.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sl/LocaleNames_sl.properties b/jdk/src/share/classes/sun/util/resources/sl/LocaleNames_sl.properties index 154e6e23759..5bb0644eba8 100644 --- a/jdk/src/share/classes/sun/util/resources/sl/LocaleNames_sl.properties +++ b/jdk/src/share/classes/sun/util/resources/sl/LocaleNames_sl.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sq/CalendarData_sq.properties b/jdk/src/share/classes/sun/util/resources/sq/CalendarData_sq.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/sq/CalendarData_sq.properties +++ b/jdk/src/share/classes/sun/util/resources/sq/CalendarData_sq.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sq/CurrencyNames_sq_AL.properties b/jdk/src/share/classes/sun/util/resources/sq/CurrencyNames_sq_AL.properties index 98652aa3562..bfb82bc5f55 100644 --- a/jdk/src/share/classes/sun/util/resources/sq/CurrencyNames_sq_AL.properties +++ b/jdk/src/share/classes/sun/util/resources/sq/CurrencyNames_sq_AL.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sq/LocaleNames_sq.properties b/jdk/src/share/classes/sun/util/resources/sq/LocaleNames_sq.properties index f027076cf9b..e66c0e1d22b 100644 --- a/jdk/src/share/classes/sun/util/resources/sq/LocaleNames_sq.properties +++ b/jdk/src/share/classes/sun/util/resources/sq/LocaleNames_sq.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr.properties b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr.properties index c618ce3b96f..abcd01cb35a 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_BA.properties b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_BA.properties index 7d29a94e698..14180a9a265 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_BA.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_BA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_ME.properties b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_ME.properties index 7d29a94e698..14180a9a265 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_ME.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_ME.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_RS.properties b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_RS.properties index 7d29a94e698..14180a9a265 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_RS.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CalendarData_sr_Latn_RS.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_BA.properties b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_BA.properties index 80fe12cac5d..5d6dacd8905 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_BA.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_BA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_CS.properties b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_CS.properties index 1ba3f20375d..f983d4acdcb 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_CS.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_CS.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_BA.properties b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_BA.properties index 7dc0375ecbf..44ad23d24b3 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_BA.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_BA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_ME.properties b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_ME.properties index 0983b6a2ecc..1d1cb181aaa 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_ME.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_ME.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_RS.properties b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_RS.properties index 3a299f40642..6d511d7e8bc 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_RS.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_Latn_RS.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_ME.properties b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_ME.properties index 7b5fb3dd33c..e52ee703b53 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_ME.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_ME.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_RS.properties b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_RS.properties index 83555220774..e9347f7e26e 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_RS.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/CurrencyNames_sr_RS.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr.properties b/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr.properties index 7ebe39a31f7..d897a0e1a6c 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr_Latn.properties b/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr_Latn.properties index 7cc1c2477c7..2ad7a4d891a 100644 --- a/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr_Latn.properties +++ b/jdk/src/share/classes/sun/util/resources/sr/LocaleNames_sr_Latn.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sv/CalendarData_sv.properties b/jdk/src/share/classes/sun/util/resources/sv/CalendarData_sv.properties index 9fcc1ced96b..f1322141930 100644 --- a/jdk/src/share/classes/sun/util/resources/sv/CalendarData_sv.properties +++ b/jdk/src/share/classes/sun/util/resources/sv/CalendarData_sv.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv.properties b/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv.properties index 2d15627b190..55a89fbcece 100644 --- a/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv.properties +++ b/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv_SE.properties b/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv_SE.properties index b4304813dc7..943c92198a2 100644 --- a/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv_SE.properties +++ b/jdk/src/share/classes/sun/util/resources/sv/CurrencyNames_sv_SE.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/sv/LocaleNames_sv.properties b/jdk/src/share/classes/sun/util/resources/sv/LocaleNames_sv.properties index d3674d8c81a..96d73a9ba2b 100644 --- a/jdk/src/share/classes/sun/util/resources/sv/LocaleNames_sv.properties +++ b/jdk/src/share/classes/sun/util/resources/sv/LocaleNames_sv.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/th/CalendarData_th.properties b/jdk/src/share/classes/sun/util/resources/th/CalendarData_th.properties index 36167c9c604..ca2ae0f185f 100644 --- a/jdk/src/share/classes/sun/util/resources/th/CalendarData_th.properties +++ b/jdk/src/share/classes/sun/util/resources/th/CalendarData_th.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/th/CurrencyNames_th_TH.properties b/jdk/src/share/classes/sun/util/resources/th/CurrencyNames_th_TH.properties index a66c7bc129c..2fd11e638f5 100644 --- a/jdk/src/share/classes/sun/util/resources/th/CurrencyNames_th_TH.properties +++ b/jdk/src/share/classes/sun/util/resources/th/CurrencyNames_th_TH.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/th/LocaleNames_th.properties b/jdk/src/share/classes/sun/util/resources/th/LocaleNames_th.properties index cf385b9a74f..874d52f12a9 100644 --- a/jdk/src/share/classes/sun/util/resources/th/LocaleNames_th.properties +++ b/jdk/src/share/classes/sun/util/resources/th/LocaleNames_th.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/tr/CalendarData_tr.properties b/jdk/src/share/classes/sun/util/resources/tr/CalendarData_tr.properties index c9bd2455d01..2cf2e1de85c 100644 --- a/jdk/src/share/classes/sun/util/resources/tr/CalendarData_tr.properties +++ b/jdk/src/share/classes/sun/util/resources/tr/CalendarData_tr.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/tr/CurrencyNames_tr_TR.properties b/jdk/src/share/classes/sun/util/resources/tr/CurrencyNames_tr_TR.properties index b4c109bcd81..191f4339c21 100644 --- a/jdk/src/share/classes/sun/util/resources/tr/CurrencyNames_tr_TR.properties +++ b/jdk/src/share/classes/sun/util/resources/tr/CurrencyNames_tr_TR.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/tr/LocaleNames_tr.properties b/jdk/src/share/classes/sun/util/resources/tr/LocaleNames_tr.properties index 8590442f768..a69cde7aad2 100644 --- a/jdk/src/share/classes/sun/util/resources/tr/LocaleNames_tr.properties +++ b/jdk/src/share/classes/sun/util/resources/tr/LocaleNames_tr.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/uk/CalendarData_uk.properties b/jdk/src/share/classes/sun/util/resources/uk/CalendarData_uk.properties index c9bd2455d01..2cf2e1de85c 100644 --- a/jdk/src/share/classes/sun/util/resources/uk/CalendarData_uk.properties +++ b/jdk/src/share/classes/sun/util/resources/uk/CalendarData_uk.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/uk/CurrencyNames_uk_UA.properties b/jdk/src/share/classes/sun/util/resources/uk/CurrencyNames_uk_UA.properties index ebe2325a966..7e2f86e3890 100644 --- a/jdk/src/share/classes/sun/util/resources/uk/CurrencyNames_uk_UA.properties +++ b/jdk/src/share/classes/sun/util/resources/uk/CurrencyNames_uk_UA.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/uk/LocaleNames_uk.properties b/jdk/src/share/classes/sun/util/resources/uk/LocaleNames_uk.properties index 9943e972003..ee420eb789e 100644 --- a/jdk/src/share/classes/sun/util/resources/uk/LocaleNames_uk.properties +++ b/jdk/src/share/classes/sun/util/resources/uk/LocaleNames_uk.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/vi/CalendarData_vi.properties b/jdk/src/share/classes/sun/util/resources/vi/CalendarData_vi.properties index 0d9fb85309c..ce811b89320 100644 --- a/jdk/src/share/classes/sun/util/resources/vi/CalendarData_vi.properties +++ b/jdk/src/share/classes/sun/util/resources/vi/CalendarData_vi.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/vi/CurrencyNames_vi_VN.properties b/jdk/src/share/classes/sun/util/resources/vi/CurrencyNames_vi_VN.properties index 72ddc2ae809..d136685408d 100644 --- a/jdk/src/share/classes/sun/util/resources/vi/CurrencyNames_vi_VN.properties +++ b/jdk/src/share/classes/sun/util/resources/vi/CurrencyNames_vi_VN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/vi/LocaleNames_vi.properties b/jdk/src/share/classes/sun/util/resources/vi/LocaleNames_vi.properties index d32d40ba82d..ec8ffaa7021 100644 --- a/jdk/src/share/classes/sun/util/resources/vi/LocaleNames_vi.properties +++ b/jdk/src/share/classes/sun/util/resources/vi/LocaleNames_vi.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/zh/CalendarData_zh.properties b/jdk/src/share/classes/sun/util/resources/zh/CalendarData_zh.properties index 0d9fb85309c..ce811b89320 100644 --- a/jdk/src/share/classes/sun/util/resources/zh/CalendarData_zh.properties +++ b/jdk/src/share/classes/sun/util/resources/zh/CalendarData_zh.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_CN.properties b/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_CN.properties index 804ac91dddf..673f5e52deb 100644 --- a/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_CN.properties +++ b/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_CN.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_TW.properties b/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_TW.properties index 3ec99f11a3a..2e767cb38f2 100644 --- a/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_TW.properties +++ b/jdk/src/share/classes/sun/util/resources/zh/CurrencyNames_zh_TW.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh.properties b/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh.properties index 40f3d90aca3..e4e806db22b 100644 --- a/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh.properties +++ b/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_SG.properties b/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_SG.properties index d3733f48598..e36257015d2 100644 --- a/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_SG.properties +++ b/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_SG.properties @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # # diff --git a/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_TW.properties b/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_TW.properties index d827635fa74..16df704ebae 100644 --- a/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_TW.properties +++ b/jdk/src/share/classes/sun/util/resources/zh/LocaleNames_zh_TW.properties @@ -1,4 +1,4 @@ -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/share/classes/sun/util/spi/XmlPropertiesProvider.java b/jdk/src/share/classes/sun/util/spi/XmlPropertiesProvider.java index 42194daba29..3e4acddecfa 100644 --- a/jdk/src/share/classes/sun/util/spi/XmlPropertiesProvider.java +++ b/jdk/src/share/classes/sun/util/spi/XmlPropertiesProvider.java @@ -55,6 +55,9 @@ public abstract class XmlPropertiesProvider { * @param props the properties table to populate * @param in the input stream from which to read the XML document * @throws IOException if reading from the specified input stream fails + * @throws java.io.UnsupportedEncodingException if the document's encoding + * declaration can be read and it specifies an encoding that is not + * supported * @throws InvalidPropertiesFormatException Data on input stream does not * constitute a valid XML document with the mandated document type. * @@ -73,6 +76,8 @@ public abstract class XmlPropertiesProvider { * @param encoding the name of a supported character encoding * * @throws IOException if writing to the specified output stream fails + * @throws java.io.UnsupportedEncodingException if the encoding is not + * supported by the implementation * @throws NullPointerException if {@code out} is null. * @throws ClassCastException if this {@code Properties} object * contains any keys or values that are not diff --git a/jdk/src/share/classes/sun/util/xml/PlatformXmlPropertiesProvider.java b/jdk/src/share/classes/sun/util/xml/PlatformXmlPropertiesProvider.java index f4e4010b282..06f845bac51 100644 --- a/jdk/src/share/classes/sun/util/xml/PlatformXmlPropertiesProvider.java +++ b/jdk/src/share/classes/sun/util/xml/PlatformXmlPropertiesProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ package sun.util.xml; import java.io.*; import java.util.*; +import java.nio.charset.*; import org.xml.sax.*; import org.w3c.dom.*; import javax.xml.parsers.*; @@ -127,6 +128,13 @@ public class PlatformXmlPropertiesProvider extends XmlPropertiesProvider { String encoding) throws IOException { + // fast-fail for unsupported charsets as UnsupportedEncodingException may + // not be thrown later (see JDK-8000621) + try { + Charset.forName(encoding); + } catch (IllegalCharsetNameException | UnsupportedCharsetException x) { + throw new UnsupportedEncodingException(encoding); + } DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = null; try { diff --git a/jdk/src/share/demo/jfc/Font2DTest/Font2DTest.java b/jdk/src/share/demo/jfc/Font2DTest/Font2DTest.java index 1487c428aef..a5398c573bd 100644 --- a/jdk/src/share/demo/jfc/Font2DTest/Font2DTest.java +++ b/jdk/src/share/demo/jfc/Font2DTest/Font2DTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jfc/Font2DTest/Font2DTestApplet.java b/jdk/src/share/demo/jfc/Font2DTest/Font2DTestApplet.java index 7e663c2bb7c..1292a83cf04 100644 --- a/jdk/src/share/demo/jfc/Font2DTest/Font2DTestApplet.java +++ b/jdk/src/share/demo/jfc/Font2DTest/Font2DTestApplet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jfc/Font2DTest/FontPanel.java b/jdk/src/share/demo/jfc/Font2DTest/FontPanel.java index c939f0b81a7..bb6a17dad96 100644 --- a/jdk/src/share/demo/jfc/Font2DTest/FontPanel.java +++ b/jdk/src/share/demo/jfc/Font2DTest/FontPanel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jfc/Notepad/Notepad.java b/jdk/src/share/demo/jfc/Notepad/Notepad.java index b6c7199e256..301510a154f 100644 --- a/jdk/src/share/demo/jfc/Notepad/Notepad.java +++ b/jdk/src/share/demo/jfc/Notepad/Notepad.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/agent_util/agent_util.c b/jdk/src/share/demo/jvmti/agent_util/agent_util.c index 18558855947..6678ef7d966 100644 --- a/jdk/src/share/demo/jvmti/agent_util/agent_util.c +++ b/jdk/src/share/demo/jvmti/agent_util/agent_util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/agent_util/agent_util.h b/jdk/src/share/demo/jvmti/agent_util/agent_util.h index 1518e932c87..44882d71216 100644 --- a/jdk/src/share/demo/jvmti/agent_util/agent_util.h +++ b/jdk/src/share/demo/jvmti/agent_util/agent_util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/compiledMethodLoad/compiledMethodLoad.c b/jdk/src/share/demo/jvmti/compiledMethodLoad/compiledMethodLoad.c index cfc9ab2b5fa..0f78bc953f7 100644 --- a/jdk/src/share/demo/jvmti/compiledMethodLoad/compiledMethodLoad.c +++ b/jdk/src/share/demo/jvmti/compiledMethodLoad/compiledMethodLoad.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/compiledMethodLoad/sample.makefile.txt b/jdk/src/share/demo/jvmti/compiledMethodLoad/sample.makefile.txt index e214792396f..3c4c5dee595 100644 --- a/jdk/src/share/demo/jvmti/compiledMethodLoad/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/compiledMethodLoad/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/gctest/gctest.c b/jdk/src/share/demo/jvmti/gctest/gctest.c index 7d430f4e87f..96fc83d0cb7 100644 --- a/jdk/src/share/demo/jvmti/gctest/gctest.c +++ b/jdk/src/share/demo/jvmti/gctest/gctest.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/gctest/sample.makefile.txt b/jdk/src/share/demo/jvmti/gctest/sample.makefile.txt index 99fa39907ae..5e5d0720bf9 100644 --- a/jdk/src/share/demo/jvmti/gctest/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/gctest/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/heapTracker/HeapTracker.java b/jdk/src/share/demo/jvmti/heapTracker/HeapTracker.java index 041c88bf878..a7eb362cd20 100644 --- a/jdk/src/share/demo/jvmti/heapTracker/HeapTracker.java +++ b/jdk/src/share/demo/jvmti/heapTracker/HeapTracker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/heapTracker/heapTracker.c b/jdk/src/share/demo/jvmti/heapTracker/heapTracker.c index c1019ade399..ebbcf73de5a 100644 --- a/jdk/src/share/demo/jvmti/heapTracker/heapTracker.c +++ b/jdk/src/share/demo/jvmti/heapTracker/heapTracker.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/heapTracker/heapTracker.h b/jdk/src/share/demo/jvmti/heapTracker/heapTracker.h index b0df4bbf5f9..dcfc4fd8514 100644 --- a/jdk/src/share/demo/jvmti/heapTracker/heapTracker.h +++ b/jdk/src/share/demo/jvmti/heapTracker/heapTracker.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/heapTracker/sample.makefile.txt b/jdk/src/share/demo/jvmti/heapTracker/sample.makefile.txt index a58f7101693..d6e964ff39b 100644 --- a/jdk/src/share/demo/jvmti/heapTracker/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/heapTracker/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/heapViewer/heapViewer.c b/jdk/src/share/demo/jvmti/heapViewer/heapViewer.c index a6da56d67e1..f6a6e5eb488 100644 --- a/jdk/src/share/demo/jvmti/heapViewer/heapViewer.c +++ b/jdk/src/share/demo/jvmti/heapViewer/heapViewer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/heapViewer/sample.makefile.txt b/jdk/src/share/demo/jvmti/heapViewer/sample.makefile.txt index 9f7604668a2..a18c9d1494c 100644 --- a/jdk/src/share/demo/jvmti/heapViewer/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/heapViewer/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/debug_malloc.c b/jdk/src/share/demo/jvmti/hprof/debug_malloc.c index a0155c0588b..daf4698ad5e 100644 --- a/jdk/src/share/demo/jvmti/hprof/debug_malloc.c +++ b/jdk/src/share/demo/jvmti/hprof/debug_malloc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/debug_malloc.h b/jdk/src/share/demo/jvmti/hprof/debug_malloc.h index d74ff608b2a..2b854770ff4 100644 --- a/jdk/src/share/demo/jvmti/hprof/debug_malloc.h +++ b/jdk/src/share/demo/jvmti/hprof/debug_malloc.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof.h b/jdk/src/share/demo/jvmti/hprof/hprof.h index 44afbf4c5d9..6e61affce11 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_blocks.c b/jdk/src/share/demo/jvmti/hprof/hprof_blocks.c index 13534a99ab8..ce205bf2ce6 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_blocks.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_blocks.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_blocks.h b/jdk/src/share/demo/jvmti/hprof/hprof_blocks.h index e35433e73f6..d6dd6d38091 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_blocks.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_blocks.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_check.c b/jdk/src/share/demo/jvmti/hprof/hprof_check.c index c91a54ae840..aef1eb90ef2 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_check.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_check.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_check.h b/jdk/src/share/demo/jvmti/hprof/hprof_check.h index 2840bf114c4..02f470773bf 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_check.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_check.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_class.c b/jdk/src/share/demo/jvmti/hprof/hprof_class.c index d89a804dbb8..f25f53ad934 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_class.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_class.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_class.h b/jdk/src/share/demo/jvmti/hprof/hprof_class.h index 5bcf1b80f79..6b4bc9c397d 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_class.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_class.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_cpu.c b/jdk/src/share/demo/jvmti/hprof/hprof_cpu.c index 358b4784861..5c1b953a401 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_cpu.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_cpu.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_cpu.h b/jdk/src/share/demo/jvmti/hprof/hprof_cpu.h index 6a962390737..e63747ec3dc 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_cpu.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_cpu.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_error.c b/jdk/src/share/demo/jvmti/hprof/hprof_error.c index 8088a49b50a..9776a1da4f0 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_error.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_error.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_error.h b/jdk/src/share/demo/jvmti/hprof/hprof_error.h index b82d4ee6b90..6dd06e02ec3 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_error.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_error.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_event.c b/jdk/src/share/demo/jvmti/hprof/hprof_event.c index 66d89e76eca..15dd4ddaa76 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_event.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_event.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_event.h b/jdk/src/share/demo/jvmti/hprof/hprof_event.h index 198824a2155..ebc372e8511 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_event.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_event.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_frame.c b/jdk/src/share/demo/jvmti/hprof/hprof_frame.c index 284b6a555ae..df99d9aa9d7 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_frame.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_frame.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_frame.h b/jdk/src/share/demo/jvmti/hprof/hprof_frame.h index 8443aee3bb8..5b94414291f 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_frame.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_frame.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_init.c b/jdk/src/share/demo/jvmti/hprof/hprof_init.c index e3add30a6c2..9183800c428 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_init.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_init.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_init.h b/jdk/src/share/demo/jvmti/hprof/hprof_init.h index 500491754a9..57018da4fb5 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_init.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_init.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_io.c b/jdk/src/share/demo/jvmti/hprof/hprof_io.c index 51c7c25852e..93fc0506c61 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_io.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_io.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_io.h b/jdk/src/share/demo/jvmti/hprof/hprof_io.h index 0cb7d85ab66..66ace64a003 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_io.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_io.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_ioname.c b/jdk/src/share/demo/jvmti/hprof/hprof_ioname.c index b14ecb15b8b..2030106fb2f 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_ioname.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_ioname.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_ioname.h b/jdk/src/share/demo/jvmti/hprof/hprof_ioname.h index 03ac0483382..db3e8ff7ad0 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_ioname.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_ioname.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_listener.c b/jdk/src/share/demo/jvmti/hprof/hprof_listener.c index f5fb8963987..9e7386bf073 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_listener.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_listener.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_listener.h b/jdk/src/share/demo/jvmti/hprof/hprof_listener.h index 1e82ca537a0..e9a42b1a255 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_listener.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_listener.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_loader.c b/jdk/src/share/demo/jvmti/hprof/hprof_loader.c index f0c1f1de896..9592b5ae19f 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_loader.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_loader.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_loader.h b/jdk/src/share/demo/jvmti/hprof/hprof_loader.h index ef15f76037a..8a0bcd9256f 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_loader.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_loader.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_md.h b/jdk/src/share/demo/jvmti/hprof/hprof_md.h index 6145a03b5ea..b3e66fe36a6 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_md.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_monitor.c b/jdk/src/share/demo/jvmti/hprof/hprof_monitor.c index 65495df5991..d0ef3ec4a38 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_monitor.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_monitor.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_monitor.h b/jdk/src/share/demo/jvmti/hprof/hprof_monitor.h index 13561633c61..cb379d2e913 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_monitor.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_monitor.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_object.c b/jdk/src/share/demo/jvmti/hprof/hprof_object.c index ce21c23e2ce..8b80c53f830 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_object.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_object.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_object.h b/jdk/src/share/demo/jvmti/hprof/hprof_object.h index ccbf8e03e27..bc274046f2f 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_object.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_object.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_reference.c b/jdk/src/share/demo/jvmti/hprof/hprof_reference.c index e7a668d7f1e..3905fbaba1f 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_reference.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_reference.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_reference.h b/jdk/src/share/demo/jvmti/hprof/hprof_reference.h index 2464f58ed2d..1569cf97c95 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_reference.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_reference.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_site.c b/jdk/src/share/demo/jvmti/hprof/hprof_site.c index f1ae184c6fb..4129710b2bb 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_site.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_site.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_site.h b/jdk/src/share/demo/jvmti/hprof/hprof_site.h index b9229815b5f..ae65521fcf2 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_site.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_site.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_stack.c b/jdk/src/share/demo/jvmti/hprof/hprof_stack.c index 2f0127c49c1..3bf69ddc899 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_stack.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_stack.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_stack.h b/jdk/src/share/demo/jvmti/hprof/hprof_stack.h index 32efdceeb12..33e66450e8d 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_stack.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_stack.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_string.c b/jdk/src/share/demo/jvmti/hprof/hprof_string.c index f2f53a4ce88..4db8ef7a29d 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_string.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_string.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_string.h b/jdk/src/share/demo/jvmti/hprof/hprof_string.h index 13e4f42c52d..bea45e69a3b 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_string.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_string.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_table.c b/jdk/src/share/demo/jvmti/hprof/hprof_table.c index c2c205eb939..83727ef8597 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_table.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_table.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_table.h b/jdk/src/share/demo/jvmti/hprof/hprof_table.h index 84e3acd093a..cee0af9b4c3 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_table.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_table.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_tag.c b/jdk/src/share/demo/jvmti/hprof/hprof_tag.c index 363be9a5502..d4dc64bf8e0 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_tag.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_tag.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_tag.h b/jdk/src/share/demo/jvmti/hprof/hprof_tag.h index 14ef616899e..c20cad9ee16 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_tag.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_tag.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_tls.c b/jdk/src/share/demo/jvmti/hprof/hprof_tls.c index 3c62aacf268..ac6b31a6127 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_tls.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_tls.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_tls.h b/jdk/src/share/demo/jvmti/hprof/hprof_tls.h index 695e78a4096..61f60d33094 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_tls.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_tls.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_trace.c b/jdk/src/share/demo/jvmti/hprof/hprof_trace.c index e56bfe9d417..698e1037d75 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_trace.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_trace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_trace.h b/jdk/src/share/demo/jvmti/hprof/hprof_trace.h index b24ac1ee4c9..1d8f7297d25 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_trace.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_trace.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_tracker.c b/jdk/src/share/demo/jvmti/hprof/hprof_tracker.c index 56e1125122d..e807a192239 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_tracker.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_tracker.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_tracker.h b/jdk/src/share/demo/jvmti/hprof/hprof_tracker.h index 9aec0820a58..57de554fc32 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_tracker.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_tracker.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_util.c b/jdk/src/share/demo/jvmti/hprof/hprof_util.c index 0a191172a9f..59ce144e865 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_util.c +++ b/jdk/src/share/demo/jvmti/hprof/hprof_util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/hprof_util.h b/jdk/src/share/demo/jvmti/hprof/hprof_util.h index 588570ce64b..e85c6b91c48 100644 --- a/jdk/src/share/demo/jvmti/hprof/hprof_util.h +++ b/jdk/src/share/demo/jvmti/hprof/hprof_util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/hprof/sample.makefile.txt b/jdk/src/share/demo/jvmti/hprof/sample.makefile.txt index 8da8100a720..e8f84dc8577 100644 --- a/jdk/src/share/demo/jvmti/hprof/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/hprof/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c b/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c index 772548de165..cd6d1040f50 100644 --- a/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c +++ b/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.h b/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.h index 06b6e01bb3a..e2626784341 100644 --- a/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.h +++ b/jdk/src/share/demo/jvmti/java_crw_demo/java_crw_demo.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/java_crw_demo/sample.makefile.txt b/jdk/src/share/demo/jvmti/java_crw_demo/sample.makefile.txt index a2ec685554e..35dbbe4b5e0 100644 --- a/jdk/src/share/demo/jvmti/java_crw_demo/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/java_crw_demo/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/minst/Minst.java b/jdk/src/share/demo/jvmti/minst/Minst.java index c75edfe6734..2826cea04ba 100644 --- a/jdk/src/share/demo/jvmti/minst/Minst.java +++ b/jdk/src/share/demo/jvmti/minst/Minst.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/minst/minst.c b/jdk/src/share/demo/jvmti/minst/minst.c index e811c63ac25..45da43ea458 100644 --- a/jdk/src/share/demo/jvmti/minst/minst.c +++ b/jdk/src/share/demo/jvmti/minst/minst.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/minst/minst.h b/jdk/src/share/demo/jvmti/minst/minst.h index 8ffc14ce6ec..b7cf45a89bf 100644 --- a/jdk/src/share/demo/jvmti/minst/minst.h +++ b/jdk/src/share/demo/jvmti/minst/minst.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/minst/sample.makefile.txt b/jdk/src/share/demo/jvmti/minst/sample.makefile.txt index 42da35be3ab..94bb4c56ccc 100644 --- a/jdk/src/share/demo/jvmti/minst/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/minst/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/mtrace/Mtrace.java b/jdk/src/share/demo/jvmti/mtrace/Mtrace.java index 061400a1f8b..ecebf75a450 100644 --- a/jdk/src/share/demo/jvmti/mtrace/Mtrace.java +++ b/jdk/src/share/demo/jvmti/mtrace/Mtrace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/mtrace/mtrace.c b/jdk/src/share/demo/jvmti/mtrace/mtrace.c index 4a43b54f93b..05686a7ec70 100644 --- a/jdk/src/share/demo/jvmti/mtrace/mtrace.c +++ b/jdk/src/share/demo/jvmti/mtrace/mtrace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/mtrace/mtrace.h b/jdk/src/share/demo/jvmti/mtrace/mtrace.h index 15c0824017c..c3130b88952 100644 --- a/jdk/src/share/demo/jvmti/mtrace/mtrace.h +++ b/jdk/src/share/demo/jvmti/mtrace/mtrace.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/mtrace/sample.makefile.txt b/jdk/src/share/demo/jvmti/mtrace/sample.makefile.txt index b1032825e7b..46ceb7e59ef 100644 --- a/jdk/src/share/demo/jvmti/mtrace/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/mtrace/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/versionCheck/sample.makefile.txt b/jdk/src/share/demo/jvmti/versionCheck/sample.makefile.txt index 9b7abd4c014..7a586ed734c 100644 --- a/jdk/src/share/demo/jvmti/versionCheck/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/versionCheck/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/versionCheck/versionCheck.c b/jdk/src/share/demo/jvmti/versionCheck/versionCheck.c index b49d7b8209d..441e488a821 100644 --- a/jdk/src/share/demo/jvmti/versionCheck/versionCheck.c +++ b/jdk/src/share/demo/jvmti/versionCheck/versionCheck.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/Agent.cpp b/jdk/src/share/demo/jvmti/waiters/Agent.cpp index 4fd87d0015d..cf2285c6ca6 100644 --- a/jdk/src/share/demo/jvmti/waiters/Agent.cpp +++ b/jdk/src/share/demo/jvmti/waiters/Agent.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/Agent.hpp b/jdk/src/share/demo/jvmti/waiters/Agent.hpp index c508863cf0c..20f03229ef9 100644 --- a/jdk/src/share/demo/jvmti/waiters/Agent.hpp +++ b/jdk/src/share/demo/jvmti/waiters/Agent.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/Monitor.cpp b/jdk/src/share/demo/jvmti/waiters/Monitor.cpp index a99d5a6fa1f..db215c8b7b7 100644 --- a/jdk/src/share/demo/jvmti/waiters/Monitor.cpp +++ b/jdk/src/share/demo/jvmti/waiters/Monitor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/Monitor.hpp b/jdk/src/share/demo/jvmti/waiters/Monitor.hpp index cd5444b2476..f067e8c65c8 100644 --- a/jdk/src/share/demo/jvmti/waiters/Monitor.hpp +++ b/jdk/src/share/demo/jvmti/waiters/Monitor.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/Thread.cpp b/jdk/src/share/demo/jvmti/waiters/Thread.cpp index ca9056710ca..065a40dd516 100644 --- a/jdk/src/share/demo/jvmti/waiters/Thread.cpp +++ b/jdk/src/share/demo/jvmti/waiters/Thread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/Thread.hpp b/jdk/src/share/demo/jvmti/waiters/Thread.hpp index 32697c04cd7..0ad661521e6 100644 --- a/jdk/src/share/demo/jvmti/waiters/Thread.hpp +++ b/jdk/src/share/demo/jvmti/waiters/Thread.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/sample.makefile.txt b/jdk/src/share/demo/jvmti/waiters/sample.makefile.txt index 68ac497e7a1..51cbca4a395 100644 --- a/jdk/src/share/demo/jvmti/waiters/sample.makefile.txt +++ b/jdk/src/share/demo/jvmti/waiters/sample.makefile.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/jvmti/waiters/waiters.cpp b/jdk/src/share/demo/jvmti/waiters/waiters.cpp index c6d34c3dafb..34b79f38308 100644 --- a/jdk/src/share/demo/jvmti/waiters/waiters.cpp +++ b/jdk/src/share/demo/jvmti/waiters/waiters.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/FullThreadDump/Deadlock.java b/jdk/src/share/demo/management/FullThreadDump/Deadlock.java index 452335f97a1..85668ee50da 100644 --- a/jdk/src/share/demo/management/FullThreadDump/Deadlock.java +++ b/jdk/src/share/demo/management/FullThreadDump/Deadlock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/FullThreadDump/FullThreadDump.java b/jdk/src/share/demo/management/FullThreadDump/FullThreadDump.java index 09e85ee5afa..ba46eeb828c 100644 --- a/jdk/src/share/demo/management/FullThreadDump/FullThreadDump.java +++ b/jdk/src/share/demo/management/FullThreadDump/FullThreadDump.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/FullThreadDump/ThreadMonitor.java b/jdk/src/share/demo/management/FullThreadDump/ThreadMonitor.java index 2942ce1aa2a..05846e7c182 100644 --- a/jdk/src/share/demo/management/FullThreadDump/ThreadMonitor.java +++ b/jdk/src/share/demo/management/FullThreadDump/ThreadMonitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/JTop/JTop.java b/jdk/src/share/demo/management/JTop/JTop.java index 4c1539d883c..e3703c6872f 100644 --- a/jdk/src/share/demo/management/JTop/JTop.java +++ b/jdk/src/share/demo/management/JTop/JTop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/JTop/JTopPlugin.java b/jdk/src/share/demo/management/JTop/JTopPlugin.java index 478d865252e..785bb328db4 100644 --- a/jdk/src/share/demo/management/JTop/JTopPlugin.java +++ b/jdk/src/share/demo/management/JTop/JTopPlugin.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/MemoryMonitor/MemoryMonitor.java b/jdk/src/share/demo/management/MemoryMonitor/MemoryMonitor.java index 7dd0b7c551f..3d2769b917a 100644 --- a/jdk/src/share/demo/management/MemoryMonitor/MemoryMonitor.java +++ b/jdk/src/share/demo/management/MemoryMonitor/MemoryMonitor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/MemoryMonitor/README.txt b/jdk/src/share/demo/management/MemoryMonitor/README.txt index 2009e1339e2..5a421dbdc90 100644 --- a/jdk/src/share/demo/management/MemoryMonitor/README.txt +++ b/jdk/src/share/demo/management/MemoryMonitor/README.txt @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/VerboseGC/PrintGCStat.java b/jdk/src/share/demo/management/VerboseGC/PrintGCStat.java index d3f84df997a..565c8dc5c2c 100644 --- a/jdk/src/share/demo/management/VerboseGC/PrintGCStat.java +++ b/jdk/src/share/demo/management/VerboseGC/PrintGCStat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/management/VerboseGC/VerboseGC.java b/jdk/src/share/demo/management/VerboseGC/VerboseGC.java index b70cebb0f05..57f78b8a53a 100644 --- a/jdk/src/share/demo/management/VerboseGC/VerboseGC.java +++ b/jdk/src/share/demo/management/VerboseGC/VerboseGC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/share/demo/nbproject/project.xml b/jdk/src/share/demo/nbproject/project.xml index 43667547ddf..f52bd1ca9f7 100644 --- a/jdk/src/share/demo/nbproject/project.xml +++ b/jdk/src/share/demo/nbproject/project.xml @@ -1,7 +1,7 @@ DIGIT EIGHT keysym2UCSHash.put( (long)0xFFB9, (char)0x0039); // XK_KP_9 --> DIGIT NINE keysym2UCSHash.put( (long)0xFE20, (char)0x0009); // XK_ISO_Left_Tab --> + keysym2UCSHash.put( (long)0xFE50, (char)0x02CB); // XK_dead_grave --> MODIFIER LETTER GRAVE ACCENT + keysym2UCSHash.put( (long)0xFE51, (char)0x02CA); // XK_dead_acute --> MODIFIER LETTER ACUTE ACCENT + keysym2UCSHash.put( (long)0xFE52, (char)0x02C6); // XK_dead_circumflex --> MODIFIER LETTER CIRCUMFLEX ACCENT + keysym2UCSHash.put( (long)0xFE53, (char)0x02DC); // XK_dead_tilde --> SMALL TILDE + keysym2UCSHash.put( (long)0xFE54, (char)0x02C9); // XK_dead_macron --> MODIFIER LETTER MACRON + keysym2UCSHash.put( (long)0xFE55, (char)0x02D8); // XK_dead_breve --> BREVE + keysym2UCSHash.put( (long)0xFE56, (char)0x02D9); // XK_dead_abovedot --> DOT ABOVE + keysym2UCSHash.put( (long)0xFE57, (char)0x00A8); // XK_dead_diaeresis --> DIAERESIS + keysym2UCSHash.put( (long)0xFE58, (char)0x02DA); // XK_dead_abovering --> RING ABOVE + keysym2UCSHash.put( (long)0xFE59, (char)0x02DD); // XK_dead_doubleacute --> DOUBLE ACUTE ACCENT + keysym2UCSHash.put( (long)0xFE5A, (char)0x02C7); // XK_dead_caron --> CARON + keysym2UCSHash.put( (long)0xFE5B, (char)0x00B8); // XK_dead_cedilla --> CEDILLA + keysym2UCSHash.put( (long)0xFE5C, (char)0x02DB); // XK_dead_ogonek --> OGONEK + keysym2UCSHash.put( (long)0xFE5D, (char)0x0269); // XK_dead_iota --> LATIN SMALL LETTER IOTA + keysym2UCSHash.put( (long)0xFE5E, (char)0x3099); // XK_dead_voiced_sound --> COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK + keysym2UCSHash.put( (long)0xFE5F, (char)0x309A); // XK_dead_semivoiced_sound --> COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK + keysym2UCSHash.put( (long)0xFE60, (char)0x0323); // XK_dead_belowdot --> COMBINING DOT BELOW + keysym2UCSHash.put( (long)0xFE61, (char)0x0321); // XK_dead_hook --> COMBINING PALATALIZED HOOK BELOW + keysym2UCSHash.put( (long)0xFE62, (char)0x031B); // XK_dead_horn --> COMBINING HORN keysym2UCSHash.put( (long)0x1a1, (char)0x0104); // XK_Aogonek --> LATIN CAPITAL LETTER A WITH OGONEK keysym2UCSHash.put( (long)0x1a2, (char)0x02d8); // XK_breve --> BREVE keysym2UCSHash.put( (long)0x1a3, (char)0x0141); // XK_Lstroke --> LATIN CAPITAL LETTER L WITH STROKE diff --git a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java index a4c039c2074..0eebbd45c9a 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/XWindow.java +++ b/jdk/src/solaris/classes/sun/awt/X11/XWindow.java @@ -1115,7 +1115,10 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // (1) either XIM could not handle it or // (2) it was Latin 1:1 mapping. // - XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev); + // Preserve modifiers to get Java key code for dead keys + boolean isDeadKey = isDeadKey(keysym[0]); + XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym[0]) + : XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } @@ -1141,7 +1144,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_PRESSED, ev.get_time(), - jkeyToReturn, + isDeadKey ? jkeyExtended : jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), @@ -1149,7 +1152,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { jkeyExtended); - if( unicodeKey > 0 ) { + if (unicodeKey > 0 && !isDeadKey) { keyEventLog.fine("fire _TYPED on "+unicodeKey); postKeyEvent( java.awt.event.KeyEvent.KEY_TYPED, ev.get_time(), @@ -1176,9 +1179,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } // un-private it if you need to call it from elsewhere private void handleKeyRelease(XKeyEvent ev) { - long keysym[] = new long[2]; int unicodeKey = 0; - keysym[0] = XConstants.NoSymbol; if (keyEventLog.isLoggable(PlatformLogger.FINE)) { logIncomingKeyEvent( ev ); @@ -1187,7 +1188,11 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { // and Java KeyEvent keycode should be calculated. // For release we should post released event. // - XKeysym.Keysym2JavaKeycode jkc = XKeysym.getJavaKeycode(ev); + // Preserve modifiers to get Java key code for dead keys + long keysym = xkeycodeToKeysym(ev); + boolean isDeadKey = isDeadKey(keysym); + XKeysym.Keysym2JavaKeycode jkc = isDeadKey ? XKeysym.getJavaKeycode(keysym) + : XKeysym.getJavaKeycode(ev); if( jkc == null ) { jkc = new XKeysym.Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_UNDEFINED, java.awt.event.KeyEvent.KEY_LOCATION_UNKNOWN); } @@ -1219,7 +1224,7 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { jkc.getJavaKeycode(); postKeyEvent( java.awt.event.KeyEvent.KEY_RELEASED, ev.get_time(), - jkeyToReturn, + isDeadKey ? jkeyExtended : jkeyToReturn, (unicodeKey == 0 ? java.awt.event.KeyEvent.CHAR_UNDEFINED : unicodeKey), jkc.getKeyLocation(), ev.get_state(),ev.getPData(), XKeyEvent.getSize(), (long)(ev.get_keycode()), @@ -1229,6 +1234,11 @@ public class XWindow extends XBaseWindow implements X11ComponentPeer { } + + private boolean isDeadKey(long keysym){ + return XKeySymConstants.XK_dead_grave <= keysym && keysym <= XKeySymConstants.XK_dead_semivoiced_sound; + } + /* * XmNiconic and Map/UnmapNotify (that XmNiconic relies on) are * unreliable, since mapping changes can happen for a virtual desktop diff --git a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h index deb7a8d0864..f8168876f72 100644 --- a/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h +++ b/jdk/src/solaris/classes/sun/awt/X11/keysym2ucs.h @@ -695,25 +695,25 @@ SOFTWARE. 0x0000 #define XK_ISO_Center_Object 0xFE33 0x0000 #define XK_ISO_Enter 0xFE34 -0x0000 #define XK_dead_grave 0xFE50 -0x0000 #define XK_dead_acute 0xFE51 -0x0000 #define XK_dead_circumflex 0xFE52 -0x0000 #define XK_dead_tilde 0xFE53 -0x0000 #define XK_dead_macron 0xFE54 -0x0000 #define XK_dead_breve 0xFE55 -0x0000 #define XK_dead_abovedot 0xFE56 -0x0000 #define XK_dead_diaeresis 0xFE57 -0x0000 #define XK_dead_abovering 0xFE58 -0x0000 #define XK_dead_doubleacute 0xFE59 -0x0000 #define XK_dead_caron 0xFE5A -0x0000 #define XK_dead_cedilla 0xFE5B -0x0000 #define XK_dead_ogonek 0xFE5C -0x0000 #define XK_dead_iota 0xFE5D -0x0000 #define XK_dead_voiced_sound 0xFE5E -0x0000 #define XK_dead_semivoiced_sound 0xFE5F -0x0000 #define XK_dead_belowdot 0xFE60 -0x0000 #define XK_dead_hook 0xFE61 -0x0000 #define XK_dead_horn 0xFE62 +0x02CB #define XK_dead_grave 0xFE50 +0x02CA #define XK_dead_acute 0xFE51 +0x02C6 #define XK_dead_circumflex 0xFE52 +0x02DC #define XK_dead_tilde 0xFE53 +0x02C9 #define XK_dead_macron 0xFE54 +0x02D8 #define XK_dead_breve 0xFE55 +0x02D9 #define XK_dead_abovedot 0xFE56 +0x00A8 #define XK_dead_diaeresis 0xFE57 +0x02DA #define XK_dead_abovering 0xFE58 +0x02DD #define XK_dead_doubleacute 0xFE59 +0x02C7 #define XK_dead_caron 0xFE5A +0x00B8 #define XK_dead_cedilla 0xFE5B +0x02DB #define XK_dead_ogonek 0xFE5C +0x0269 #define XK_dead_iota 0xFE5D +0x3099 #define XK_dead_voiced_sound 0xFE5E +0x309A #define XK_dead_semivoiced_sound 0xFE5F +0x0323 #define XK_dead_belowdot 0xFE60 +0x0321 #define XK_dead_hook 0xFE61 +0x031B #define XK_dead_horn 0xFE62 0x0000 #define XK_First_Virtual_Screen 0xFED0 0x0000 #define XK_Prev_Virtual_Screen 0xFED1 @@ -2466,6 +2466,7 @@ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Alt_ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Meta_L), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_META, java.awt.event.KeyEvent.KEY_LOCATION_LEFT)); tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Meta_R), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_META, java.awt.event.KeyEvent.KEY_LOCATION_RIGHT)); tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Caps_Lock), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CAPS_LOCK, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Shift_Lock), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CAPS_LOCK, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); tojava tojava /* Misc Functions */ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Print), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_PRINTSCREEN, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); @@ -2640,6 +2641,21 @@ tojava /* Type 5c Japanese keyboard: henkan */ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kanji), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CONVERT, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); tojava /* Type 5c Japanese keyboard: nihongo */ tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Henkan_Mode), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_INPUT_METHOD_ON_OFF, java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Eisu_Shift ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALPHANUMERIC , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Eisu_toggle ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALPHANUMERIC , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Zenkaku ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_FULL_WIDTH , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Hankaku ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_HALF_WIDTH , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Hiragana ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_HIRAGANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Katakana ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KATAKANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Romaji ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_JAPANESE_ROMAN , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kana_Shift ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kana_Lock ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_KANA_LOCK , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Muhenkan ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_NONCONVERT , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Zen_Koho ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_ALL_CANDIDATES , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Kanji_Bangou ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_CODE_INPUT , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava keysym2JavaKeycodeHash.put( Long.valueOf(XKeySymConstants.XK_Mae_Koho ), new Keysym2JavaKeycode(java.awt.event.KeyEvent.VK_PREVIOUS_CANDIDATE , java.awt.event.KeyEvent.KEY_LOCATION_STANDARD)); +tojava +tojava tojava /* VK_KANA_LOCK is handled separately because it generates the tojava * same keysym as ALT_GRAPH in spite of its different behavior. tojava */ diff --git a/jdk/src/solaris/classes/sun/font/DelegateStrike.java b/jdk/src/solaris/classes/sun/font/DelegateStrike.java new file mode 100644 index 00000000000..1e9ba8ccbc6 --- /dev/null +++ b/jdk/src/solaris/classes/sun/font/DelegateStrike.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.font; + +import java.awt.geom.GeneralPath; +import java.awt.geom.Point2D; +import java.awt.Rectangle; +import java.awt.geom.Rectangle2D; + +/* Returned instead of a NativeStrike. + * It can intercept any request it wants, but mostly + * passes them on to its delegate strike. It is important that + * it override all the inherited FontStrike methods to delegate them + * appropriately. + */ + +class DelegateStrike extends NativeStrike { + + private FontStrike delegateStrike; + + DelegateStrike(NativeFont nativeFont, FontStrikeDesc desc, + FontStrike delegate) { + super(nativeFont, desc); + this.delegateStrike = delegate; + } + + /* We want the native font to be responsible for reporting the + * font metrics, even if it often delegates to another font. + * The code here isn't yet implementing exactly that. If the glyph + * transform was something native couldn't handle, there's no native + * context from which to obtain metrics. Need to revise this to obtain + * the metrics and transform them. But currently in such a case it + * gets the metrics from a different font - its glyph delegate font. + */ + StrikeMetrics getFontMetrics() { + if (strikeMetrics == null) { + if (pScalerContext != 0) { + strikeMetrics = super.getFontMetrics(); + } + if (strikeMetrics == null) { + strikeMetrics = delegateStrike.getFontMetrics(); + } + } + return strikeMetrics; + } + + void getGlyphImagePtrs(int[] glyphCodes, long[] images,int len) { + delegateStrike.getGlyphImagePtrs(glyphCodes, images, len); + } + + long getGlyphImagePtr(int glyphCode) { + return delegateStrike.getGlyphImagePtr(glyphCode); + } + + void getGlyphImageBounds(int glyphCode, + Point2D.Float pt, Rectangle result) { + delegateStrike.getGlyphImageBounds(glyphCode, pt, result); + } + + Point2D.Float getGlyphMetrics(int glyphCode) { + return delegateStrike.getGlyphMetrics(glyphCode); + } + + float getGlyphAdvance(int glyphCode) { + return delegateStrike.getGlyphAdvance(glyphCode); + } + + Point2D.Float getCharMetrics(char ch) { + return delegateStrike.getCharMetrics(ch); + } + + float getCodePointAdvance(int cp) { + if (cp < 0 || cp >= 0x10000) { + cp = 0xffff; + } + return delegateStrike.getGlyphAdvance(cp); + } + + Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) { + return delegateStrike.getGlyphOutlineBounds(glyphCode); + } + + GeneralPath getGlyphOutline(int glyphCode, float x, float y) { + return delegateStrike.getGlyphOutline(glyphCode, x, y); + } + + GeneralPath getGlyphVectorOutline(int[] glyphs, float x, float y) { + return delegateStrike.getGlyphVectorOutline(glyphs, x, y); + } + +} diff --git a/jdk/src/solaris/classes/sun/font/NativeStrike.java b/jdk/src/solaris/classes/sun/font/NativeStrike.java index 777f31351f6..f325ddd90e8 100644 --- a/jdk/src/solaris/classes/sun/font/NativeStrike.java +++ b/jdk/src/solaris/classes/sun/font/NativeStrike.java @@ -32,7 +32,7 @@ import java.awt.Rectangle; import java.awt.geom.Rectangle2D; import java.awt.geom.NoninvertibleTransformException; - class NativeStrike extends PhysicalStrike { +class NativeStrike extends PhysicalStrike { NativeFont nativeFont; int numGlyphs; @@ -294,86 +294,3 @@ import java.awt.geom.NoninvertibleTransformException; } } - -/* Returned instead of a NativeStrike. - * It can intercept any request it wants, but mostly - * passes them on to its delegate strike. It is important that - * it override all the inherited FontStrike methods to delegate them - * appropriately. - */ - -class DelegateStrike extends NativeStrike { - - private FontStrike delegateStrike; - - DelegateStrike(NativeFont nativeFont, FontStrikeDesc desc, - FontStrike delegate) { - super(nativeFont, desc); - this.delegateStrike = delegate; - } - - /* We want the native font to be responsible for reporting the - * font metrics, even if it often delegates to another font. - * The code here isn't yet implementing exactly that. If the glyph - * transform was something native couldn't handle, there's no native - * context from which to obtain metrics. Need to revise this to obtain - * the metrics and transform them. But currently in such a case it - * gets the metrics from a different font - its glyph delegate font. - */ - StrikeMetrics getFontMetrics() { - if (strikeMetrics == null) { - if (pScalerContext != 0) { - strikeMetrics = super.getFontMetrics(); - } - if (strikeMetrics == null) { - strikeMetrics = delegateStrike.getFontMetrics(); - } - } - return strikeMetrics; - } - - void getGlyphImagePtrs(int[] glyphCodes, long[] images,int len) { - delegateStrike.getGlyphImagePtrs(glyphCodes, images, len); - } - - long getGlyphImagePtr(int glyphCode) { - return delegateStrike.getGlyphImagePtr(glyphCode); - } - - void getGlyphImageBounds(int glyphCode, - Point2D.Float pt, Rectangle result) { - delegateStrike.getGlyphImageBounds(glyphCode, pt, result); - } - - Point2D.Float getGlyphMetrics(int glyphCode) { - return delegateStrike.getGlyphMetrics(glyphCode); - } - - float getGlyphAdvance(int glyphCode) { - return delegateStrike.getGlyphAdvance(glyphCode); - } - - Point2D.Float getCharMetrics(char ch) { - return delegateStrike.getCharMetrics(ch); - } - - float getCodePointAdvance(int cp) { - if (cp < 0 || cp >= 0x10000) { - cp = 0xffff; - } - return delegateStrike.getGlyphAdvance(cp); - } - - Rectangle2D.Float getGlyphOutlineBounds(int glyphCode) { - return delegateStrike.getGlyphOutlineBounds(glyphCode); - } - - GeneralPath getGlyphOutline(int glyphCode, float x, float y) { - return delegateStrike.getGlyphOutline(glyphCode, x, y); - } - - GeneralPath getGlyphVectorOutline(int[] glyphs, float x, float y) { - return delegateStrike.getGlyphVectorOutline(glyphs, x, y); - } - -} diff --git a/jdk/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java b/jdk/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java index 12af979197a..809ef99b119 100644 --- a/jdk/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java +++ b/jdk/src/solaris/classes/sun/java2d/jules/JulesAATileGenerator.java @@ -326,24 +326,3 @@ public class JulesAATileGenerator implements AATileGenerator { return tiledTrapArray[index]; } } - -class TileTrapContainer { - int tileAlpha; - GrowableIntArray traps; - - public TileTrapContainer(GrowableIntArray traps) { - this.traps = traps; - } - - public void setTileAlpha(int tileAlpha) { - this.tileAlpha = tileAlpha; - } - - public int getTileAlpha() { - return tileAlpha; - } - - public GrowableIntArray getTraps() { - return traps; - } -} diff --git a/jdk/src/solaris/classes/sun/java2d/jules/TileTrapContainer.java b/jdk/src/solaris/classes/sun/java2d/jules/TileTrapContainer.java new file mode 100644 index 00000000000..80dfbd4f577 --- /dev/null +++ b/jdk/src/solaris/classes/sun/java2d/jules/TileTrapContainer.java @@ -0,0 +1,49 @@ +/* + * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.java2d.jules; + +import sun.java2d.xr.GrowableIntArray; + +class TileTrapContainer { + int tileAlpha; + GrowableIntArray traps; + + public TileTrapContainer(GrowableIntArray traps) { + this.traps = traps; + } + + public void setTileAlpha(int tileAlpha) { + this.tileAlpha = tileAlpha; + } + + public int getTileAlpha() { + return tileAlpha; + } + + public GrowableIntArray getTraps() { + return traps; + } +} diff --git a/jdk/src/solaris/classes/sun/management/FileSystemImpl.java b/jdk/src/solaris/classes/sun/management/FileSystemImpl.java index 67445c58d4e..190d8c20723 100644 --- a/jdk/src/solaris/classes/sun/management/FileSystemImpl.java +++ b/jdk/src/solaris/classes/sun/management/FileSystemImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/net/dns/ResolverConfigurationImpl.java b/jdk/src/solaris/classes/sun/net/dns/ResolverConfigurationImpl.java index 670a675d95c..5af3d445e09 100644 --- a/jdk/src/solaris/classes/sun/net/dns/ResolverConfigurationImpl.java +++ b/jdk/src/solaris/classes/sun/net/dns/ResolverConfigurationImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/DefaultSelectorProvider.java b/jdk/src/solaris/classes/sun/nio/ch/DefaultSelectorProvider.java index 8f91014918c..e812e535165 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/DefaultSelectorProvider.java +++ b/jdk/src/solaris/classes/sun/nio/ch/DefaultSelectorProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java b/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java index be03cc70900..3151b227b8b 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java +++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollArrayWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java b/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java index 05862e2356a..e151051ecea 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorProvider.java b/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorProvider.java index dbd6170355c..044dc8d1c56 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorProvider.java +++ b/jdk/src/solaris/classes/sun/nio/ch/DevPollSelectorProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/EPoll.java b/jdk/src/solaris/classes/sun/nio/ch/EPoll.java index 78bc83c8549..3300f962ae0 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/EPoll.java +++ b/jdk/src/solaris/classes/sun/nio/ch/EPoll.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java b/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java index 539b2c84357..dc08340e46f 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java +++ b/jdk/src/solaris/classes/sun/nio/ch/EPollArrayWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java b/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java index c18650372ca..5fa2b324fc5 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/EPollSelectorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java b/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java index ae7212a3cc3..2917ba9c74a 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java +++ b/jdk/src/solaris/classes/sun/nio/ch/InheritedChannel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/NativeThread.java b/jdk/src/solaris/classes/sun/nio/ch/NativeThread.java index 574c33d3c50..7a7e155c4b9 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/NativeThread.java +++ b/jdk/src/solaris/classes/sun/nio/ch/NativeThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/PollArrayWrapper.java b/jdk/src/solaris/classes/sun/nio/ch/PollArrayWrapper.java index 70c189e2318..bf063c70cfd 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/PollArrayWrapper.java +++ b/jdk/src/solaris/classes/sun/nio/ch/PollArrayWrapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/SolarisEventPort.java b/jdk/src/solaris/classes/sun/nio/ch/SolarisEventPort.java index 6f20d4c283a..d5a74c10931 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/SolarisEventPort.java +++ b/jdk/src/solaris/classes/sun/nio/ch/SolarisEventPort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationChange.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationChange.java index b7767006bc1..2399a38b384 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationChange.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationChange.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationImpl.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationImpl.java index 225f541298a..56653d01c4f 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/AssociationImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/PeerAddrChange.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/PeerAddrChange.java index 7d434e269ec..2dac583ace5 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/PeerAddrChange.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/PeerAddrChange.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/ResultContainer.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/ResultContainer.java index 1235b6e08c6..dee2f989d11 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/ResultContainer.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/ResultContainer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java index 92f17cb3e8b..9035d0a44f8 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpChannelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java index fa44072f4dc..6b42fcc02e3 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNet.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNet.java index efe25b335a4..8f02de791a8 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNet.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNotification.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNotification.java index c901964b832..6227e9ec20b 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNotification.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpNotification.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java index e5d5a892bd7..900d7ab53c0 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/SendFailed.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/SendFailed.java index 25717d5ce11..b152e82b29c 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/SendFailed.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/SendFailed.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/ch/sctp/Shutdown.java b/jdk/src/solaris/classes/sun/nio/ch/sctp/Shutdown.java index b3cf6691d77..1b20317d136 100644 --- a/jdk/src/solaris/classes/sun/nio/ch/sctp/Shutdown.java +++ b/jdk/src/solaris/classes/sun/nio/ch/sctp/Shutdown.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/BsdFileStore.java b/jdk/src/solaris/classes/sun/nio/fs/BsdFileStore.java index 9dfc791eca6..b73218ead5f 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/BsdFileStore.java +++ b/jdk/src/solaris/classes/sun/nio/fs/BsdFileStore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystem.java b/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystem.java index 873feeaa272..c6a85aee558 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystem.java +++ b/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java b/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java index 73c7e83e3cf..eaf49ddd2a7 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java +++ b/jdk/src/solaris/classes/sun/nio/fs/BsdFileSystemProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/BsdNativeDispatcher.java b/jdk/src/solaris/classes/sun/nio/fs/BsdNativeDispatcher.java index 83b668cc23f..7acbc4fa750 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/BsdNativeDispatcher.java +++ b/jdk/src/solaris/classes/sun/nio/fs/BsdNativeDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/DefaultFileTypeDetector.java b/jdk/src/solaris/classes/sun/nio/fs/DefaultFileTypeDetector.java index 9259faeb8fe..295146d755e 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/DefaultFileTypeDetector.java +++ b/jdk/src/solaris/classes/sun/nio/fs/DefaultFileTypeDetector.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java b/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java index fb6f6d1318b..eff7b588419 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java +++ b/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystemProvider.java b/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystemProvider.java index 4d6159865d7..557fc16e5d6 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystemProvider.java +++ b/jdk/src/solaris/classes/sun/nio/fs/LinuxFileSystemProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/LinuxNativeDispatcher.java b/jdk/src/solaris/classes/sun/nio/fs/LinuxNativeDispatcher.java index d657fcb1a14..0186870688a 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/LinuxNativeDispatcher.java +++ b/jdk/src/solaris/classes/sun/nio/fs/LinuxNativeDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystem.java b/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystem.java index ab9888e7d07..0305171589d 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystem.java +++ b/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystemProvider.java b/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystemProvider.java index 5e48c0052c7..528603fa791 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystemProvider.java +++ b/jdk/src/solaris/classes/sun/nio/fs/MacOSXFileSystemProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/MacOSXNativeDispatcher.java b/jdk/src/solaris/classes/sun/nio/fs/MacOSXNativeDispatcher.java index d591857a7ef..f6fe31a3c48 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/MacOSXNativeDispatcher.java +++ b/jdk/src/solaris/classes/sun/nio/fs/MacOSXNativeDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystem.java b/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystem.java index 14bc339cbc5..8b4177e3fde 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystem.java +++ b/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java b/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java index fec87c7a27b..cb34adf3b9a 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java +++ b/jdk/src/solaris/classes/sun/nio/fs/SolarisFileSystemProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/SolarisNativeDispatcher.java b/jdk/src/solaris/classes/sun/nio/fs/SolarisNativeDispatcher.java index 3d54b75cb0d..0b114c02589 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/SolarisNativeDispatcher.java +++ b/jdk/src/solaris/classes/sun/nio/fs/SolarisNativeDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java b/jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java index d7a1f8b0310..df00a728f2c 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java +++ b/jdk/src/solaris/classes/sun/nio/fs/UnixChannelFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/UnixFileSystem.java b/jdk/src/solaris/classes/sun/nio/fs/UnixFileSystem.java index 33ec2ba7bb2..21aefc183df 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/UnixFileSystem.java +++ b/jdk/src/solaris/classes/sun/nio/fs/UnixFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java b/jdk/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java index 5672319106b..5255c660dd1 100644 --- a/jdk/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java +++ b/jdk/src/solaris/classes/sun/nio/fs/UnixNativeDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/print/CUPSPrinter.java b/jdk/src/solaris/classes/sun/print/CUPSPrinter.java index 34a131317ac..ab2d707a89e 100644 --- a/jdk/src/solaris/classes/sun/print/CUPSPrinter.java +++ b/jdk/src/solaris/classes/sun/print/CUPSPrinter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/security/smartcardio/PlatformPCSC.java b/jdk/src/solaris/classes/sun/security/smartcardio/PlatformPCSC.java index d6197b9bcc0..507fedd82bc 100644 --- a/jdk/src/solaris/classes/sun/security/smartcardio/PlatformPCSC.java +++ b/jdk/src/solaris/classes/sun/security/smartcardio/PlatformPCSC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/tools/attach/BsdAttachProvider.java b/jdk/src/solaris/classes/sun/tools/attach/BsdAttachProvider.java index dffbc6bf6ed..c4f6a5cdc97 100644 --- a/jdk/src/solaris/classes/sun/tools/attach/BsdAttachProvider.java +++ b/jdk/src/solaris/classes/sun/tools/attach/BsdAttachProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java b/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java index 4bf55cdf41e..1e08d70446e 100644 --- a/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java +++ b/jdk/src/solaris/classes/sun/tools/attach/LinuxVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java b/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java index cb8a3f16a3f..c7dcf21cf03 100644 --- a/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java +++ b/jdk/src/solaris/classes/sun/tools/attach/SolarisVirtualMachine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/demo/jni/Poller/Client.java b/jdk/src/solaris/demo/jni/Poller/Client.java index 759ae6207dc..ffa706eabc9 100644 --- a/jdk/src/solaris/demo/jni/Poller/Client.java +++ b/jdk/src/solaris/demo/jni/Poller/Client.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/solaris/demo/jni/Poller/LinkedQueue.java b/jdk/src/solaris/demo/jni/Poller/LinkedQueue.java index fcebf47787c..bc70554f3e7 100644 --- a/jdk/src/solaris/demo/jni/Poller/LinkedQueue.java +++ b/jdk/src/solaris/demo/jni/Poller/LinkedQueue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/solaris/demo/jni/Poller/Poller.c b/jdk/src/solaris/demo/jni/Poller/Poller.c index 39a6ce462fd..8f4556be5ec 100644 --- a/jdk/src/solaris/demo/jni/Poller/Poller.c +++ b/jdk/src/solaris/demo/jni/Poller/Poller.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/solaris/demo/jni/Poller/Poller.java b/jdk/src/solaris/demo/jni/Poller/Poller.java index 8b8d6af8631..745fd9922ca 100644 --- a/jdk/src/solaris/demo/jni/Poller/Poller.java +++ b/jdk/src/solaris/demo/jni/Poller/Poller.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/solaris/demo/jni/Poller/PollingServer.java b/jdk/src/solaris/demo/jni/Poller/PollingServer.java index 095f3cc755a..5cb26260398 100644 --- a/jdk/src/solaris/demo/jni/Poller/PollingServer.java +++ b/jdk/src/solaris/demo/jni/Poller/PollingServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/solaris/demo/jni/Poller/SimpleServer.java b/jdk/src/solaris/demo/jni/Poller/SimpleServer.java index 4658a2fd67b..6a099c67071 100644 --- a/jdk/src/solaris/demo/jni/Poller/SimpleServer.java +++ b/jdk/src/solaris/demo/jni/Poller/SimpleServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/solaris/demo/jvmti/hprof/hprof_md.c b/jdk/src/solaris/demo/jvmti/hprof/hprof_md.c index 63469a56626..284a2e6fee7 100644 --- a/jdk/src/solaris/demo/jvmti/hprof/hprof_md.c +++ b/jdk/src/solaris/demo/jvmti/hprof/hprof_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/solaris/doc/sun/man/man1/jcmd.1 b/jdk/src/solaris/doc/sun/man/man1/jcmd.1 index 7d690577d14..3e0cd2a19fa 100644 --- a/jdk/src/solaris/doc/sun/man/man1/jcmd.1 +++ b/jdk/src/solaris/doc/sun/man/man1/jcmd.1 @@ -1,4 +1,4 @@ -." Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +." Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. ." DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. ." ." This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/instrument/EncodingSupport_md.c b/jdk/src/solaris/instrument/EncodingSupport_md.c index 456916e2882..50bff641396 100644 --- a/jdk/src/solaris/instrument/EncodingSupport_md.c +++ b/jdk/src/solaris/instrument/EncodingSupport_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/javavm/export/jvm_md.h b/jdk/src/solaris/javavm/export/jvm_md.h index 390e89c3654..5c681914bba 100644 --- a/jdk/src/solaris/javavm/export/jvm_md.h +++ b/jdk/src/solaris/javavm/export/jvm_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/com/sun/management/MacosxOperatingSystem.c b/jdk/src/solaris/native/com/sun/management/MacosxOperatingSystem.c index 3e7ac65fac4..7f8c1e97f13 100644 --- a/jdk/src/solaris/native/com/sun/management/MacosxOperatingSystem.c +++ b/jdk/src/solaris/native/com/sun/management/MacosxOperatingSystem.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c b/jdk/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c index 656306c83b6..fc5f154c562 100644 --- a/jdk/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c +++ b/jdk/src/solaris/native/com/sun/management/UnixOperatingSystem_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/com/sun/security/auth/module/Unix.c b/jdk/src/solaris/native/com/sun/security/auth/module/Unix.c index 677a70bb5d3..6af63a2f39e 100644 --- a/jdk/src/solaris/native/com/sun/security/auth/module/Unix.c +++ b/jdk/src/solaris/native/com/sun/security/auth/module/Unix.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,83 +47,53 @@ Java_com_sun_security_auth_module_UnixSystem_getUnixInfo jsize numSuppGroups = getgroups(0, NULL); gid_t *groups = (gid_t *)calloc(numSuppGroups, sizeof(gid_t)); - jfieldID fid; + jfieldID userNameID; + jfieldID userID; + jfieldID groupID; + jfieldID supplementaryGroupID; + jstring jstr; jlongArray jgroups; jlong *jgroupsAsArray; jclass cls = (*env)->GetObjectClass(env, obj); memset(pwd_buf, 0, sizeof(pwd_buf)); + if (getpwuid_r(getuid(), &resbuf, pwd_buf, sizeof(pwd_buf), &pwd) == 0 && pwd != NULL && getgroups(numSuppGroups, groups) != -1) { - /* - * set username - */ - fid = (*env)->GetFieldID(env, cls, "username", "Ljava/lang/String;"); - if (fid == 0) { - jclass newExcCls = - (*env)->FindClass(env, "java/lang/IllegalArgumentException"); - if (newExcCls == 0) { - /* Unable to find the new exception class, give up. */ - return; - } - (*env)->ThrowNew(env, newExcCls, "invalid field: username"); - } + userNameID = (*env)->GetFieldID(env, cls, "username", "Ljava/lang/String;"); + if (userNameID == 0) + goto cleanUpAndReturn; + + userID = (*env)->GetFieldID(env, cls, "uid", "J"); + if (userID == 0) + goto cleanUpAndReturn; + + groupID = (*env)->GetFieldID(env, cls, "gid", "J"); + if (groupID == 0) + goto cleanUpAndReturn; + + supplementaryGroupID = (*env)->GetFieldID(env, cls, "groups", "[J"); + if (supplementaryGroupID == 0) + goto cleanUpAndReturn; + jstr = (*env)->NewStringUTF(env, pwd->pw_name); - (*env)->SetObjectField(env, obj, fid, jstr); + (*env)->SetObjectField(env, obj, userNameID, jstr); - /* - * set uid - */ - fid = (*env)->GetFieldID(env, cls, "uid", "J"); - if (fid == 0) { - jclass newExcCls = - (*env)->FindClass(env, "java/lang/IllegalArgumentException"); - if (newExcCls == 0) { - /* Unable to find the new exception class, give up. */ - return; - } - (*env)->ThrowNew(env, newExcCls, "invalid field: username"); - } - (*env)->SetLongField(env, obj, fid, pwd->pw_uid); + (*env)->SetLongField(env, obj, userID, pwd->pw_uid); - /* - * set gid - */ - fid = (*env)->GetFieldID(env, cls, "gid", "J"); - if (fid == 0) { - jclass newExcCls = - (*env)->FindClass(env, "java/lang/IllegalArgumentException"); - if (newExcCls == 0) { - /* Unable to find the new exception class, give up. */ - return; - } - (*env)->ThrowNew(env, newExcCls, "invalid field: username"); - } - (*env)->SetLongField(env, obj, fid, pwd->pw_gid); - - /* - * set supplementary groups - */ - fid = (*env)->GetFieldID(env, cls, "groups", "[J"); - if (fid == 0) { - jclass newExcCls = - (*env)->FindClass(env, "java/lang/IllegalArgumentException"); - if (newExcCls == 0) { - /* Unable to find the new exception class, give up. */ - return; - } - (*env)->ThrowNew(env, newExcCls, "invalid field: username"); - } + (*env)->SetLongField(env, obj, groupID, pwd->pw_gid); jgroups = (*env)->NewLongArray(env, numSuppGroups); jgroupsAsArray = (*env)->GetLongArrayElements(env, jgroups, 0); for (i = 0; i < numSuppGroups; i++) jgroupsAsArray[i] = groups[i]; (*env)->ReleaseLongArrayElements(env, jgroups, jgroupsAsArray, 0); - (*env)->SetObjectField(env, obj, fid, jgroups); + (*env)->SetObjectField(env, obj, supplementaryGroupID, jgroups); } +cleanUpAndReturn: + free(groups); return; } diff --git a/jdk/src/solaris/native/java/io/UnixFileSystem_md.c b/jdk/src/solaris/native/java/io/UnixFileSystem_md.c index 4309ffb06a9..954e212cb56 100644 --- a/jdk/src/solaris/native/java/io/UnixFileSystem_md.c +++ b/jdk/src/solaris/native/java/io/UnixFileSystem_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/io/canonicalize_md.c b/jdk/src/solaris/native/java/io/canonicalize_md.c index b78cc2d5c8a..e985c39b31f 100644 --- a/jdk/src/solaris/native/java/io/canonicalize_md.c +++ b/jdk/src/solaris/native/java/io/canonicalize_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/io/io_util_md.c b/jdk/src/solaris/native/java/io/io_util_md.c index 646e1305c5c..61ceda9e1e6 100644 --- a/jdk/src/solaris/native/java/io/io_util_md.c +++ b/jdk/src/solaris/native/java/io/io_util_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/io/io_util_md.h b/jdk/src/solaris/native/java/io/io_util_md.h index fbf8172b2c7..fe1b7e1ad56 100644 --- a/jdk/src/solaris/native/java/io/io_util_md.h +++ b/jdk/src/solaris/native/java/io/io_util_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c b/jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c index b946663bf9a..741e014e717 100644 --- a/jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c +++ b/jdk/src/solaris/native/java/lang/ProcessEnvironment_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/lang/java_props_macosx.c b/jdk/src/solaris/native/java/lang/java_props_macosx.c index fa4c7a5b236..4afca2a2ae5 100644 --- a/jdk/src/solaris/native/java/lang/java_props_macosx.c +++ b/jdk/src/solaris/native/java/lang/java_props_macosx.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/lang/java_props_macosx.h b/jdk/src/solaris/native/java/lang/java_props_macosx.h index 72909828cfb..b311804835d 100644 --- a/jdk/src/solaris/native/java/lang/java_props_macosx.h +++ b/jdk/src/solaris/native/java/lang/java_props_macosx.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/lang/java_props_md.c b/jdk/src/solaris/native/java/lang/java_props_md.c index c2bc9c1c8a7..baba74fe897 100644 --- a/jdk/src/solaris/native/java/lang/java_props_md.c +++ b/jdk/src/solaris/native/java/lang/java_props_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/net/Inet4AddressImpl.c b/jdk/src/solaris/native/java/net/Inet4AddressImpl.c index 58798c7f827..71acfcdb5b1 100644 --- a/jdk/src/solaris/native/java/net/Inet4AddressImpl.c +++ b/jdk/src/solaris/native/java/net/Inet4AddressImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/net/NetworkInterface.c b/jdk/src/solaris/native/java/net/NetworkInterface.c index 1a9419e0d40..55c131cf339 100644 --- a/jdk/src/solaris/native/java/net/NetworkInterface.c +++ b/jdk/src/solaris/native/java/net/NetworkInterface.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c b/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c index 40b375de56b..e5607af9132 100644 --- a/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c +++ b/jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1318,10 +1318,8 @@ Java_java_net_PlainDatagramSocketImpl_socketSetOption(JNIEnv *env, jobject value) { int fd; int level, optname, optlen; - union { - int i; - char c; - } optval; + int optval; + optlen = sizeof(int); /* * Check that socket hasn't been closed @@ -1381,8 +1379,7 @@ Java_java_net_PlainDatagramSocketImpl_socketSetOption(JNIEnv *env, fid = (*env)->GetFieldID(env, cls, "value", "I"); CHECK_NULL(fid); - optval.i = (*env)->GetIntField(env, value, fid); - optlen = sizeof(optval.i); + optval = (*env)->GetIntField(env, value, fid); break; } @@ -1401,8 +1398,7 @@ Java_java_net_PlainDatagramSocketImpl_socketSetOption(JNIEnv *env, on = (*env)->GetBooleanField(env, value, fid); /* SO_REUSEADDR or SO_BROADCAST */ - optval.i = (on ? 1 : 0); - optlen = sizeof(optval.i); + optval = (on ? 1 : 0); break; } diff --git a/jdk/src/solaris/native/java/net/PlainSocketImpl.c b/jdk/src/solaris/native/java/net/PlainSocketImpl.c index a284ab42d12..b6f78b9c158 100644 --- a/jdk/src/solaris/native/java/net/PlainSocketImpl.c +++ b/jdk/src/solaris/native/java/net/PlainSocketImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/net/SocketInputStream.c b/jdk/src/solaris/native/java/net/SocketInputStream.c index 6ae368e4939..ccee03c9eff 100644 --- a/jdk/src/solaris/native/java/net/SocketInputStream.c +++ b/jdk/src/solaris/native/java/net/SocketInputStream.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/net/bsd_close.c b/jdk/src/solaris/native/java/net/bsd_close.c index f1e24bd6de1..f314357e85e 100644 --- a/jdk/src/solaris/native/java/net/bsd_close.c +++ b/jdk/src/solaris/native/java/net/bsd_close.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/net/net_util_md.c b/jdk/src/solaris/native/java/net/net_util_md.c index 7df6f3e9823..c700cfd0b75 100644 --- a/jdk/src/solaris/native/java/net/net_util_md.c +++ b/jdk/src/solaris/native/java/net/net_util_md.c @@ -546,6 +546,7 @@ static void initLoopbackRoutes() { char dest_str[40]; struct in6_addr dest_addr; char device[16]; + struct loopback_route *loRoutesTemp; if (loRoutes != 0) { free (loRoutes); @@ -606,11 +607,15 @@ static void initLoopbackRoutes() { continue; } else { if (nRoutes == loRoutes_size) { - loRoutes = realloc (loRoutes, loRoutes_size * - sizeof (struct loopback_route) * 2); - if (loRoutes == 0) { - return ; + loRoutesTemp = realloc (loRoutes, loRoutes_size * + sizeof (struct loopback_route) * 2); + + if (loRoutesTemp == 0) { + free(loRoutes); + fclose (f); + return; } + loRoutes=loRoutesTemp; loRoutes_size *= 2; } memcpy (&loRoutes[nRoutes].addr,&dest_addr,sizeof(struct in6_addr)); diff --git a/jdk/src/solaris/native/java/net/net_util_md.h b/jdk/src/solaris/native/java/net/net_util_md.h index e905752ad15..4470a49b1e2 100644 --- a/jdk/src/solaris/native/java/net/net_util_md.h +++ b/jdk/src/solaris/native/java/net/net_util_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/java/util/FileSystemPreferences.c b/jdk/src/solaris/native/java/util/FileSystemPreferences.c index 7bc1f45f8a7..eb0bf43fec5 100644 --- a/jdk/src/solaris/native/java/util/FileSystemPreferences.c +++ b/jdk/src/solaris/native/java/util/FileSystemPreferences.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c index 2cc122c3476..7ae4cdd3259 100644 --- a/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c +++ b/jdk/src/solaris/native/sun/awt/awt_GraphicsEnv.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -753,7 +753,7 @@ awt_init_Display(JNIEnv *env, jobject this) sizeof(errmsg), "Can't connect to X11 window server using '%s' as the value of the DISPLAY variable.", (getenv("DISPLAY") == NULL) ? ":0.0" : getenv("DISPLAY")); - JNU_ThrowInternalError(env, errmsg); + JNU_ThrowByName(env, "java/awt/AWTError", errmsg); return NULL; } diff --git a/jdk/src/solaris/native/sun/jdga/dgalock.c b/jdk/src/solaris/native/sun/jdga/dgalock.c index 0e9c4006358..122e125579c 100644 --- a/jdk/src/solaris/native/sun/jdga/dgalock.c +++ b/jdk/src/solaris/native/sun/jdga/dgalock.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/management/FileSystemImpl.c b/jdk/src/solaris/native/sun/management/FileSystemImpl.c index 1efff528a1a..4eafc9a8c4e 100644 --- a/jdk/src/solaris/native/sun/management/FileSystemImpl.c +++ b/jdk/src/solaris/native/sun/management/FileSystemImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/net/dns/ResolverConfigurationImpl.c b/jdk/src/solaris/native/sun/net/dns/ResolverConfigurationImpl.c index 3d26212254e..829ecae3683 100644 --- a/jdk/src/solaris/native/sun/net/dns/ResolverConfigurationImpl.c +++ b/jdk/src/solaris/native/sun/net/dns/ResolverConfigurationImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/net/spi/DefaultProxySelector.c b/jdk/src/solaris/native/sun/net/spi/DefaultProxySelector.c index 688390265cb..6d17e2bc13b 100644 --- a/jdk/src/solaris/native/sun/net/spi/DefaultProxySelector.c +++ b/jdk/src/solaris/native/sun/net/spi/DefaultProxySelector.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c b/jdk/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c index 3bccd574871..d8514a84126 100644 --- a/jdk/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c +++ b/jdk/src/solaris/native/sun/nio/ch/DatagramChannelImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/DatagramDispatcher.c b/jdk/src/solaris/native/sun/nio/ch/DatagramDispatcher.c index 594ef9ffed4..f9f2391d862 100644 --- a/jdk/src/solaris/native/sun/nio/ch/DatagramDispatcher.c +++ b/jdk/src/solaris/native/sun/nio/ch/DatagramDispatcher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c b/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c index 134a279176f..962f5e49263 100644 --- a/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c +++ b/jdk/src/solaris/native/sun/nio/ch/DevPollArrayWrapper.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/EPoll.c b/jdk/src/solaris/native/sun/nio/ch/EPoll.c index 667270491c4..ea9cdf4dd03 100644 --- a/jdk/src/solaris/native/sun/nio/ch/EPoll.c +++ b/jdk/src/solaris/native/sun/nio/ch/EPoll.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/EPollArrayWrapper.c b/jdk/src/solaris/native/sun/nio/ch/EPollArrayWrapper.c index 22ffd1d5029..c7b391f930a 100644 --- a/jdk/src/solaris/native/sun/nio/ch/EPollArrayWrapper.c +++ b/jdk/src/solaris/native/sun/nio/ch/EPollArrayWrapper.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c b/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c index 8e5c0fd2d05..d47cc3da10b 100644 --- a/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c +++ b/jdk/src/solaris/native/sun/nio/ch/FileChannelImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c b/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c index 4d987b91f05..25beacc3d5d 100644 --- a/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c +++ b/jdk/src/solaris/native/sun/nio/ch/FileDispatcherImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/FileKey.c b/jdk/src/solaris/native/sun/nio/ch/FileKey.c index 85719b297a8..ddb88329eca 100644 --- a/jdk/src/solaris/native/sun/nio/ch/FileKey.c +++ b/jdk/src/solaris/native/sun/nio/ch/FileKey.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/IOUtil.c b/jdk/src/solaris/native/sun/nio/ch/IOUtil.c index 77ea58060cf..58ef02014b5 100644 --- a/jdk/src/solaris/native/sun/nio/ch/IOUtil.c +++ b/jdk/src/solaris/native/sun/nio/ch/IOUtil.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/Net.c b/jdk/src/solaris/native/sun/nio/ch/Net.c index 907baff1ba8..f37fe88b18e 100644 --- a/jdk/src/solaris/native/sun/nio/ch/Net.c +++ b/jdk/src/solaris/native/sun/nio/ch/Net.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/SolarisEventPort.c b/jdk/src/solaris/native/sun/nio/ch/SolarisEventPort.c index 70f6db481d9..09b580cfbf0 100644 --- a/jdk/src/solaris/native/sun/nio/ch/SolarisEventPort.c +++ b/jdk/src/solaris/native/sun/nio/ch/SolarisEventPort.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h b/jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h index ea5d5a78211..cc1367f781b 100644 --- a/jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h +++ b/jdk/src/solaris/native/sun/nio/ch/sctp/Sctp.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c b/jdk/src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c index 4333720c3d8..b432403e9db 100644 --- a/jdk/src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c +++ b/jdk/src/solaris/native/sun/nio/ch/sctp/SctpChannelImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c b/jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c index 35f7315de98..57c4fae4fa5 100644 --- a/jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c +++ b/jdk/src/solaris/native/sun/nio/ch/sctp/SctpNet.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/ch/sctp/SctpServerChannelImpl.c b/jdk/src/solaris/native/sun/nio/ch/sctp/SctpServerChannelImpl.c index 4469cf2ea4d..86309861c67 100644 --- a/jdk/src/solaris/native/sun/nio/ch/sctp/SctpServerChannelImpl.c +++ b/jdk/src/solaris/native/sun/nio/ch/sctp/SctpServerChannelImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/BsdNativeDispatcher.c b/jdk/src/solaris/native/sun/nio/fs/BsdNativeDispatcher.c index 71ecd9058de..0b4f2a74dff 100644 --- a/jdk/src/solaris/native/sun/nio/fs/BsdNativeDispatcher.c +++ b/jdk/src/solaris/native/sun/nio/fs/BsdNativeDispatcher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/GnomeFileTypeDetector.c b/jdk/src/solaris/native/sun/nio/fs/GnomeFileTypeDetector.c index 0bd8dbabf86..9feada6d13a 100644 --- a/jdk/src/solaris/native/sun/nio/fs/GnomeFileTypeDetector.c +++ b/jdk/src/solaris/native/sun/nio/fs/GnomeFileTypeDetector.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c b/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c index 5a158fcaa76..1de7d5b3c98 100644 --- a/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c +++ b/jdk/src/solaris/native/sun/nio/fs/LinuxNativeDispatcher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/LinuxWatchService.c b/jdk/src/solaris/native/sun/nio/fs/LinuxWatchService.c index ca4ce5e6f62..375aaa48505 100644 --- a/jdk/src/solaris/native/sun/nio/fs/LinuxWatchService.c +++ b/jdk/src/solaris/native/sun/nio/fs/LinuxWatchService.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/MacOSXNativeDispatcher.c b/jdk/src/solaris/native/sun/nio/fs/MacOSXNativeDispatcher.c index 50c5e2101a0..f3602b8fdb7 100644 --- a/jdk/src/solaris/native/sun/nio/fs/MacOSXNativeDispatcher.c +++ b/jdk/src/solaris/native/sun/nio/fs/MacOSXNativeDispatcher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/SolarisNativeDispatcher.c b/jdk/src/solaris/native/sun/nio/fs/SolarisNativeDispatcher.c index 5c93feef094..1480ea9046b 100644 --- a/jdk/src/solaris/native/sun/nio/fs/SolarisNativeDispatcher.c +++ b/jdk/src/solaris/native/sun/nio/fs/SolarisNativeDispatcher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c b/jdk/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c index 09ee01bcb11..45d1191c43a 100644 --- a/jdk/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c +++ b/jdk/src/solaris/native/sun/nio/fs/UnixNativeDispatcher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/genSolarisConstants.c b/jdk/src/solaris/native/sun/nio/fs/genSolarisConstants.c index 346bfbbe542..493fb86db00 100644 --- a/jdk/src/solaris/native/sun/nio/fs/genSolarisConstants.c +++ b/jdk/src/solaris/native/sun/nio/fs/genSolarisConstants.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/nio/fs/genUnixConstants.c b/jdk/src/solaris/native/sun/nio/fs/genUnixConstants.c index ee46c73bc51..c2cfc0aba39 100644 --- a/jdk/src/solaris/native/sun/nio/fs/genUnixConstants.c +++ b/jdk/src/solaris/native/sun/nio/fs/genUnixConstants.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/security/jgss/wrapper/NativeFunc.c b/jdk/src/solaris/native/sun/security/jgss/wrapper/NativeFunc.c index f46c00a9be9..8a1d0ee93ce 100644 --- a/jdk/src/solaris/native/sun/security/jgss/wrapper/NativeFunc.c +++ b/jdk/src/solaris/native/sun/security/jgss/wrapper/NativeFunc.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c b/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c index a69f12bb164..2aca46cfbbe 100644 --- a/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c +++ b/jdk/src/solaris/native/sun/security/pkcs11/j2secmod_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c b/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c index 277f114145f..042cf234da0 100644 --- a/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c +++ b/jdk/src/solaris/native/sun/security/pkcs11/wrapper/p11_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. */ /* Copyright (c) 2002 Graz University of Technology. All rights reserved. diff --git a/jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c b/jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c index 4e8199af3a2..589f3e3dd75 100644 --- a/jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c +++ b/jdk/src/solaris/native/sun/security/smartcardio/pcsc_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/npt/npt_md.h b/jdk/src/solaris/npt/npt_md.h index 7a85205543a..9b0c33655a3 100644 --- a/jdk/src/solaris/npt/npt_md.h +++ b/jdk/src/solaris/npt/npt_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/solaris/transport/socket/socket_md.c b/jdk/src/solaris/transport/socket/socket_md.c index f5705039f88..74e8d846c7b 100644 --- a/jdk/src/solaris/transport/socket/socket_md.c +++ b/jdk/src/solaris/transport/socket/socket_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/com/sun/management/OperatingSystem.java b/jdk/src/windows/classes/com/sun/management/OperatingSystem.java index f9481124484..0c5bf9bab73 100644 --- a/jdk/src/windows/classes/com/sun/management/OperatingSystem.java +++ b/jdk/src/windows/classes/com/sun/management/OperatingSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/java/io/DefaultFileSystem.java b/jdk/src/windows/classes/java/io/DefaultFileSystem.java new file mode 100644 index 00000000000..9256dca151d --- /dev/null +++ b/jdk/src/windows/classes/java/io/DefaultFileSystem.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.io; + +/** + * + * @since 1.8 + */ +class DefaultFileSystem { + + /** + * Return the FileSystem object for Windows platform. + */ + public static FileSystem getFileSystem() { + return new WinNTFileSystem(); + } +} diff --git a/jdk/src/windows/classes/java/io/Win32FileSystem.java b/jdk/src/windows/classes/java/io/Win32FileSystem.java deleted file mode 100644 index 4040c128fb1..00000000000 --- a/jdk/src/windows/classes/java/io/Win32FileSystem.java +++ /dev/null @@ -1,608 +0,0 @@ -/* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package java.io; - -import java.security.AccessController; -import java.util.Locale; -import sun.security.action.GetPropertyAction; - - -class Win32FileSystem extends FileSystem { - - private final char slash; - private final char altSlash; - private final char semicolon; - - public Win32FileSystem() { - slash = AccessController.doPrivileged( - new GetPropertyAction("file.separator")).charAt(0); - semicolon = AccessController.doPrivileged( - new GetPropertyAction("path.separator")).charAt(0); - altSlash = (this.slash == '\\') ? '/' : '\\'; - } - - private boolean isSlash(char c) { - return (c == '\\') || (c == '/'); - } - - private boolean isLetter(char c) { - return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')); - } - - private String slashify(String p) { - if ((p.length() > 0) && (p.charAt(0) != slash)) return slash + p; - else return p; - } - - - /* -- Normalization and construction -- */ - - public char getSeparator() { - return slash; - } - - public char getPathSeparator() { - return semicolon; - } - - /* A normal Win32 pathname contains no duplicate slashes, except possibly - for a UNC prefix, and does not end with a slash. It may be the empty - string. Normalized Win32 pathnames have the convenient property that - the length of the prefix almost uniquely identifies the type of the path - and whether it is absolute or relative: - - 0 relative to both drive and directory - 1 drive-relative (begins with '\\') - 2 absolute UNC (if first char is '\\'), - else directory-relative (has form "z:foo") - 3 absolute local pathname (begins with "z:\\") - */ - - private int normalizePrefix(String path, int len, StringBuffer sb) { - int src = 0; - while ((src < len) && isSlash(path.charAt(src))) src++; - char c; - if ((len - src >= 2) - && isLetter(c = path.charAt(src)) - && path.charAt(src + 1) == ':') { - /* Remove leading slashes if followed by drive specifier. - This hack is necessary to support file URLs containing drive - specifiers (e.g., "file://c:/path"). As a side effect, - "/c:/path" can be used as an alternative to "c:/path". */ - sb.append(c); - sb.append(':'); - src += 2; - } else { - src = 0; - if ((len >= 2) - && isSlash(path.charAt(0)) - && isSlash(path.charAt(1))) { - /* UNC pathname: Retain first slash; leave src pointed at - second slash so that further slashes will be collapsed - into the second slash. The result will be a pathname - beginning with "\\\\" followed (most likely) by a host - name. */ - src = 1; - sb.append(slash); - } - } - return src; - } - - /* Normalize the given pathname, whose length is len, starting at the given - offset; everything before this offset is already normal. */ - private String normalize(String path, int len, int off) { - if (len == 0) return path; - if (off < 3) off = 0; /* Avoid fencepost cases with UNC pathnames */ - int src; - char slash = this.slash; - StringBuffer sb = new StringBuffer(len); - - if (off == 0) { - /* Complete normalization, including prefix */ - src = normalizePrefix(path, len, sb); - } else { - /* Partial normalization */ - src = off; - sb.append(path.substring(0, off)); - } - - /* Remove redundant slashes from the remainder of the path, forcing all - slashes into the preferred slash */ - while (src < len) { - char c = path.charAt(src++); - if (isSlash(c)) { - while ((src < len) && isSlash(path.charAt(src))) src++; - if (src == len) { - /* Check for trailing separator */ - int sn = sb.length(); - if ((sn == 2) && (sb.charAt(1) == ':')) { - /* "z:\\" */ - sb.append(slash); - break; - } - if (sn == 0) { - /* "\\" */ - sb.append(slash); - break; - } - if ((sn == 1) && (isSlash(sb.charAt(0)))) { - /* "\\\\" is not collapsed to "\\" because "\\\\" marks - the beginning of a UNC pathname. Even though it is - not, by itself, a valid UNC pathname, we leave it as - is in order to be consistent with the win32 APIs, - which treat this case as an invalid UNC pathname - rather than as an alias for the root directory of - the current drive. */ - sb.append(slash); - break; - } - /* Path does not denote a root directory, so do not append - trailing slash */ - break; - } else { - sb.append(slash); - } - } else { - sb.append(c); - } - } - - String rv = sb.toString(); - return rv; - } - - /* Check that the given pathname is normal. If not, invoke the real - normalizer on the part of the pathname that requires normalization. - This way we iterate through the whole pathname string only once. */ - public String normalize(String path) { - int n = path.length(); - char slash = this.slash; - char altSlash = this.altSlash; - char prev = 0; - for (int i = 0; i < n; i++) { - char c = path.charAt(i); - if (c == altSlash) - return normalize(path, n, (prev == slash) ? i - 1 : i); - if ((c == slash) && (prev == slash) && (i > 1)) - return normalize(path, n, i - 1); - if ((c == ':') && (i > 1)) - return normalize(path, n, 0); - prev = c; - } - if (prev == slash) return normalize(path, n, n - 1); - return path; - } - - public int prefixLength(String path) { - char slash = this.slash; - int n = path.length(); - if (n == 0) return 0; - char c0 = path.charAt(0); - char c1 = (n > 1) ? path.charAt(1) : 0; - if (c0 == slash) { - if (c1 == slash) return 2; /* Absolute UNC pathname "\\\\foo" */ - return 1; /* Drive-relative "\\foo" */ - } - if (isLetter(c0) && (c1 == ':')) { - if ((n > 2) && (path.charAt(2) == slash)) - return 3; /* Absolute local pathname "z:\\foo" */ - return 2; /* Directory-relative "z:foo" */ - } - return 0; /* Completely relative */ - } - - public String resolve(String parent, String child) { - int pn = parent.length(); - if (pn == 0) return child; - int cn = child.length(); - if (cn == 0) return parent; - - String c = child; - int childStart = 0; - int parentEnd = pn; - - if ((cn > 1) && (c.charAt(0) == slash)) { - if (c.charAt(1) == slash) { - /* Drop prefix when child is a UNC pathname */ - childStart = 2; - } else { - /* Drop prefix when child is drive-relative */ - childStart = 1; - - } - if (cn == childStart) { // Child is double slash - if (parent.charAt(pn - 1) == slash) - return parent.substring(0, pn - 1); - return parent; - } - } - - if (parent.charAt(pn - 1) == slash) - parentEnd--; - - int strlen = parentEnd + cn - childStart; - char[] theChars = null; - if (child.charAt(childStart) == slash) { - theChars = new char[strlen]; - parent.getChars(0, parentEnd, theChars, 0); - child.getChars(childStart, cn, theChars, parentEnd); - } else { - theChars = new char[strlen + 1]; - parent.getChars(0, parentEnd, theChars, 0); - theChars[parentEnd] = slash; - child.getChars(childStart, cn, theChars, parentEnd + 1); - } - return new String(theChars); - } - - public String getDefaultParent() { - return ("" + slash); - } - - public String fromURIPath(String path) { - String p = path; - if ((p.length() > 2) && (p.charAt(2) == ':')) { - // "/c:/foo" --> "c:/foo" - p = p.substring(1); - // "c:/foo/" --> "c:/foo", but "c:/" --> "c:/" - if ((p.length() > 3) && p.endsWith("/")) - p = p.substring(0, p.length() - 1); - } else if ((p.length() > 1) && p.endsWith("/")) { - // "/foo/" --> "/foo" - p = p.substring(0, p.length() - 1); - } - return p; - } - - - - /* -- Path operations -- */ - - public boolean isAbsolute(File f) { - int pl = f.getPrefixLength(); - return (((pl == 2) && (f.getPath().charAt(0) == slash)) - || (pl == 3)); - } - - protected native String getDriveDirectory(int drive); - - private static String[] driveDirCache = new String[26]; - - private static int driveIndex(char d) { - if ((d >= 'a') && (d <= 'z')) return d - 'a'; - if ((d >= 'A') && (d <= 'Z')) return d - 'A'; - return -1; - } - - private String getDriveDirectory(char drive) { - int i = driveIndex(drive); - if (i < 0) return null; - String s = driveDirCache[i]; - if (s != null) return s; - s = getDriveDirectory(i + 1); - driveDirCache[i] = s; - return s; - } - - private String getUserPath() { - /* For both compatibility and security, - we must look this up every time */ - return normalize(System.getProperty("user.dir")); - } - - private String getDrive(String path) { - int pl = prefixLength(path); - return (pl == 3) ? path.substring(0, 2) : null; - } - - public String resolve(File f) { - String path = f.getPath(); - int pl = f.getPrefixLength(); - if ((pl == 2) && (path.charAt(0) == slash)) - return path; /* UNC */ - if (pl == 3) - return path; /* Absolute local */ - if (pl == 0) - return getUserPath() + slashify(path); /* Completely relative */ - if (pl == 1) { /* Drive-relative */ - String up = getUserPath(); - String ud = getDrive(up); - if (ud != null) return ud + path; - return up + path; /* User dir is a UNC path */ - } - if (pl == 2) { /* Directory-relative */ - String up = getUserPath(); - String ud = getDrive(up); - if ((ud != null) && path.startsWith(ud)) - return up + slashify(path.substring(2)); - char drive = path.charAt(0); - String dir = getDriveDirectory(drive); - String np; - if (dir != null) { - /* When resolving a directory-relative path that refers to a - drive other than the current drive, insist that the caller - have read permission on the result */ - String p = drive + (':' + dir + slashify(path.substring(2))); - SecurityManager security = System.getSecurityManager(); - try { - if (security != null) security.checkRead(p); - } catch (SecurityException x) { - /* Don't disclose the drive's directory in the exception */ - throw new SecurityException("Cannot resolve path " + path); - } - return p; - } - return drive + ":" + slashify(path.substring(2)); /* fake it */ - } - throw new InternalError("Unresolvable path: " + path); - } - - // Caches for canonicalization results to improve startup performance. - // The first cache handles repeated canonicalizations of the same path - // name. The prefix cache handles repeated canonicalizations within the - // same directory, and must not create results differing from the true - // canonicalization algorithm in canonicalize_md.c. For this reason the - // prefix cache is conservative and is not used for complex path names. - private ExpiringCache cache = new ExpiringCache(); - private ExpiringCache prefixCache = new ExpiringCache(); - - public String canonicalize(String path) throws IOException { - // If path is a drive letter only then skip canonicalization - int len = path.length(); - if ((len == 2) && - (isLetter(path.charAt(0))) && - (path.charAt(1) == ':')) { - char c = path.charAt(0); - if ((c >= 'A') && (c <= 'Z')) - return path; - return "" + ((char) (c-32)) + ':'; - } else if ((len == 3) && - (isLetter(path.charAt(0))) && - (path.charAt(1) == ':') && - (path.charAt(2) == '\\')) { - char c = path.charAt(0); - if ((c >= 'A') && (c <= 'Z')) - return path; - return "" + ((char) (c-32)) + ':' + '\\'; - } - if (!useCanonCaches) { - return canonicalize0(path); - } else { - String res = cache.get(path); - if (res == null) { - String dir = null; - String resDir = null; - if (useCanonPrefixCache) { - dir = parentOrNull(path); - if (dir != null) { - resDir = prefixCache.get(dir); - if (resDir != null) { - // Hit only in prefix cache; full path is canonical, - // but we need to get the canonical name of the file - // in this directory to get the appropriate capitalization - String filename = path.substring(1 + dir.length()); - res = canonicalizeWithPrefix(resDir, filename); - cache.put(dir + File.separatorChar + filename, res); - } - } - } - if (res == null) { - res = canonicalize0(path); - cache.put(path, res); - if (useCanonPrefixCache && dir != null) { - resDir = parentOrNull(res); - if (resDir != null) { - File f = new File(res); - if (f.exists() && !f.isDirectory()) { - prefixCache.put(dir, resDir); - } - } - } - } - } - return res; - } - } - - protected native String canonicalize0(String path) - throws IOException; - protected String canonicalizeWithPrefix(String canonicalPrefix, - String filename) throws IOException - { - return canonicalizeWithPrefix0(canonicalPrefix, - canonicalPrefix + File.separatorChar + filename); - } - // Run the canonicalization operation assuming that the prefix - // (everything up to the last filename) is canonical; just gets - // the canonical name of the last element of the path - protected native String canonicalizeWithPrefix0(String canonicalPrefix, - String pathWithCanonicalPrefix) - throws IOException; - // Best-effort attempt to get parent of this path; used for - // optimization of filename canonicalization. This must return null for - // any cases where the code in canonicalize_md.c would throw an - // exception or otherwise deal with non-simple pathnames like handling - // of "." and "..". It may conservatively return null in other - // situations as well. Returning null will cause the underlying - // (expensive) canonicalization routine to be called. - static String parentOrNull(String path) { - if (path == null) return null; - char sep = File.separatorChar; - char altSep = '/'; - int last = path.length() - 1; - int idx = last; - int adjacentDots = 0; - int nonDotCount = 0; - while (idx > 0) { - char c = path.charAt(idx); - if (c == '.') { - if (++adjacentDots >= 2) { - // Punt on pathnames containing . and .. - return null; - } - if (nonDotCount == 0) { - // Punt on pathnames ending in a . - return null; - } - } else if (c == sep) { - if (adjacentDots == 1 && nonDotCount == 0) { - // Punt on pathnames containing . and .. - return null; - } - if (idx == 0 || - idx >= last - 1 || - path.charAt(idx - 1) == sep || - path.charAt(idx - 1) == altSep) { - // Punt on pathnames containing adjacent slashes - // toward the end - return null; - } - return path.substring(0, idx); - } else if (c == altSep) { - // Punt on pathnames containing both backward and - // forward slashes - return null; - } else if (c == '*' || c == '?') { - // Punt on pathnames containing wildcards - return null; - } else { - ++nonDotCount; - adjacentDots = 0; - } - --idx; - } - return null; - } - - - /* -- Attribute accessors -- */ - - public native int getBooleanAttributes(File f); - public native boolean checkAccess(File f, int access); - public native long getLastModifiedTime(File f); - public native long getLength(File f); - public native boolean setPermission(File f, int access, boolean enable, boolean owneronly); - - /* -- File operations -- */ - - public native boolean createFileExclusively(String path) - throws IOException; - public boolean delete(File f) { - // Keep canonicalization caches in sync after file deletion - // and renaming operations. Could be more clever than this - // (i.e., only remove/update affected entries) but probably - // not worth it since these entries expire after 30 seconds - // anyway. - cache.clear(); - prefixCache.clear(); - return delete0(f); - } - protected native boolean delete0(File f); - public native String[] list(File f); - public native boolean createDirectory(File f); - public boolean rename(File f1, File f2) { - // Keep canonicalization caches in sync after file deletion - // and renaming operations. Could be more clever than this - // (i.e., only remove/update affected entries) but probably - // not worth it since these entries expire after 30 seconds - // anyway. - cache.clear(); - prefixCache.clear(); - return rename0(f1, f2); - } - protected native boolean rename0(File f1, File f2); - public native boolean setLastModifiedTime(File f, long time); - public native boolean setReadOnly(File f); - - - /* -- Filesystem interface -- */ - - private boolean access(String path) { - try { - SecurityManager security = System.getSecurityManager(); - if (security != null) security.checkRead(path); - return true; - } catch (SecurityException x) { - return false; - } - } - - private static native int listRoots0(); - - public File[] listRoots() { - int ds = listRoots0(); - int n = 0; - for (int i = 0; i < 26; i++) { - if (((ds >> i) & 1) != 0) { - if (!access((char)('A' + i) + ":" + slash)) - ds &= ~(1 << i); - else - n++; - } - } - File[] fs = new File[n]; - int j = 0; - char slash = this.slash; - for (int i = 0; i < 26; i++) { - if (((ds >> i) & 1) != 0) - fs[j++] = new File((char)('A' + i) + ":" + slash); - } - return fs; - } - - - /* -- Disk usage -- */ - public long getSpace(File f, int t) { - if (f.exists()) { - File file = (f.isDirectory() ? f : f.getParentFile()); - return getSpace0(file, t); - } - return 0; - } - - private native long getSpace0(File f, int t); - - - /* -- Basic infrastructure -- */ - - public int compare(File f1, File f2) { - return f1.getPath().compareToIgnoreCase(f2.getPath()); - } - - public int hashCode(File f) { - /* Could make this more efficient: String.hashCodeIgnoreCase */ - return f.getPath().toLowerCase(Locale.ENGLISH).hashCode() ^ 1234321; - } - - - private static native void initIDs(); - - static { - initIDs(); - } - -} diff --git a/jdk/src/windows/classes/java/io/WinNTFileSystem.java b/jdk/src/windows/classes/java/io/WinNTFileSystem.java index 5ad2eeb5be4..caa47f80c08 100644 --- a/jdk/src/windows/classes/java/io/WinNTFileSystem.java +++ b/jdk/src/windows/classes/java/io/WinNTFileSystem.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,34 +23,601 @@ * questions. */ -/* - */ - package java.io; +import java.security.AccessController; +import java.util.Locale; +import sun.security.action.GetPropertyAction; + /** * Unicode-aware FileSystem for Windows NT/2000. * * @author Konstantin Kladko * @since 1.4 */ -class WinNTFileSystem extends Win32FileSystem { +class WinNTFileSystem extends FileSystem { - protected native String canonicalize0(String path) - throws IOException; - protected native String canonicalizeWithPrefix0(String canonicalPrefix, - String pathWithCanonicalPrefix) - throws IOException; + private final char slash; + private final char altSlash; + private final char semicolon; + + public WinNTFileSystem() { + slash = AccessController.doPrivileged( + new GetPropertyAction("file.separator")).charAt(0); + semicolon = AccessController.doPrivileged( + new GetPropertyAction("path.separator")).charAt(0); + altSlash = (this.slash == '\\') ? '/' : '\\'; + } + + private boolean isSlash(char c) { + return (c == '\\') || (c == '/'); + } + + private boolean isLetter(char c) { + return ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')); + } + + private String slashify(String p) { + if ((p.length() > 0) && (p.charAt(0) != slash)) return slash + p; + else return p; + } + + /* -- Normalization and construction -- */ + + @Override + public char getSeparator() { + return slash; + } + + @Override + public char getPathSeparator() { + return semicolon; + } + + /* Check that the given pathname is normal. If not, invoke the real + normalizer on the part of the pathname that requires normalization. + This way we iterate through the whole pathname string only once. */ + @Override + public String normalize(String path) { + int n = path.length(); + char slash = this.slash; + char altSlash = this.altSlash; + char prev = 0; + for (int i = 0; i < n; i++) { + char c = path.charAt(i); + if (c == altSlash) + return normalize(path, n, (prev == slash) ? i - 1 : i); + if ((c == slash) && (prev == slash) && (i > 1)) + return normalize(path, n, i - 1); + if ((c == ':') && (i > 1)) + return normalize(path, n, 0); + prev = c; + } + if (prev == slash) return normalize(path, n, n - 1); + return path; + } + + /* Normalize the given pathname, whose length is len, starting at the given + offset; everything before this offset is already normal. */ + private String normalize(String path, int len, int off) { + if (len == 0) return path; + if (off < 3) off = 0; /* Avoid fencepost cases with UNC pathnames */ + int src; + char slash = this.slash; + StringBuffer sb = new StringBuffer(len); + + if (off == 0) { + /* Complete normalization, including prefix */ + src = normalizePrefix(path, len, sb); + } else { + /* Partial normalization */ + src = off; + sb.append(path.substring(0, off)); + } + + /* Remove redundant slashes from the remainder of the path, forcing all + slashes into the preferred slash */ + while (src < len) { + char c = path.charAt(src++); + if (isSlash(c)) { + while ((src < len) && isSlash(path.charAt(src))) src++; + if (src == len) { + /* Check for trailing separator */ + int sn = sb.length(); + if ((sn == 2) && (sb.charAt(1) == ':')) { + /* "z:\\" */ + sb.append(slash); + break; + } + if (sn == 0) { + /* "\\" */ + sb.append(slash); + break; + } + if ((sn == 1) && (isSlash(sb.charAt(0)))) { + /* "\\\\" is not collapsed to "\\" because "\\\\" marks + the beginning of a UNC pathname. Even though it is + not, by itself, a valid UNC pathname, we leave it as + is in order to be consistent with the win32 APIs, + which treat this case as an invalid UNC pathname + rather than as an alias for the root directory of + the current drive. */ + sb.append(slash); + break; + } + /* Path does not denote a root directory, so do not append + trailing slash */ + break; + } else { + sb.append(slash); + } + } else { + sb.append(c); + } + } + + String rv = sb.toString(); + return rv; + } + + /* A normal Win32 pathname contains no duplicate slashes, except possibly + for a UNC prefix, and does not end with a slash. It may be the empty + string. Normalized Win32 pathnames have the convenient property that + the length of the prefix almost uniquely identifies the type of the path + and whether it is absolute or relative: + + 0 relative to both drive and directory + 1 drive-relative (begins with '\\') + 2 absolute UNC (if first char is '\\'), + else directory-relative (has form "z:foo") + 3 absolute local pathname (begins with "z:\\") + */ + private int normalizePrefix(String path, int len, StringBuffer sb) { + int src = 0; + while ((src < len) && isSlash(path.charAt(src))) src++; + char c; + if ((len - src >= 2) + && isLetter(c = path.charAt(src)) + && path.charAt(src + 1) == ':') { + /* Remove leading slashes if followed by drive specifier. + This hack is necessary to support file URLs containing drive + specifiers (e.g., "file://c:/path"). As a side effect, + "/c:/path" can be used as an alternative to "c:/path". */ + sb.append(c); + sb.append(':'); + src += 2; + } else { + src = 0; + if ((len >= 2) + && isSlash(path.charAt(0)) + && isSlash(path.charAt(1))) { + /* UNC pathname: Retain first slash; leave src pointed at + second slash so that further slashes will be collapsed + into the second slash. The result will be a pathname + beginning with "\\\\" followed (most likely) by a host + name. */ + src = 1; + sb.append(slash); + } + } + return src; + } + + @Override + public int prefixLength(String path) { + char slash = this.slash; + int n = path.length(); + if (n == 0) return 0; + char c0 = path.charAt(0); + char c1 = (n > 1) ? path.charAt(1) : 0; + if (c0 == slash) { + if (c1 == slash) return 2; /* Absolute UNC pathname "\\\\foo" */ + return 1; /* Drive-relative "\\foo" */ + } + if (isLetter(c0) && (c1 == ':')) { + if ((n > 2) && (path.charAt(2) == slash)) + return 3; /* Absolute local pathname "z:\\foo" */ + return 2; /* Directory-relative "z:foo" */ + } + return 0; /* Completely relative */ + } + + @Override + public String resolve(String parent, String child) { + int pn = parent.length(); + if (pn == 0) return child; + int cn = child.length(); + if (cn == 0) return parent; + + String c = child; + int childStart = 0; + int parentEnd = pn; + + if ((cn > 1) && (c.charAt(0) == slash)) { + if (c.charAt(1) == slash) { + /* Drop prefix when child is a UNC pathname */ + childStart = 2; + } else { + /* Drop prefix when child is drive-relative */ + childStart = 1; + + } + if (cn == childStart) { // Child is double slash + if (parent.charAt(pn - 1) == slash) + return parent.substring(0, pn - 1); + return parent; + } + } + + if (parent.charAt(pn - 1) == slash) + parentEnd--; + + int strlen = parentEnd + cn - childStart; + char[] theChars = null; + if (child.charAt(childStart) == slash) { + theChars = new char[strlen]; + parent.getChars(0, parentEnd, theChars, 0); + child.getChars(childStart, cn, theChars, parentEnd); + } else { + theChars = new char[strlen + 1]; + parent.getChars(0, parentEnd, theChars, 0); + theChars[parentEnd] = slash; + child.getChars(childStart, cn, theChars, parentEnd + 1); + } + return new String(theChars); + } + + @Override + public String getDefaultParent() { + return ("" + slash); + } + + @Override + public String fromURIPath(String path) { + String p = path; + if ((p.length() > 2) && (p.charAt(2) == ':')) { + // "/c:/foo" --> "c:/foo" + p = p.substring(1); + // "c:/foo/" --> "c:/foo", but "c:/" --> "c:/" + if ((p.length() > 3) && p.endsWith("/")) + p = p.substring(0, p.length() - 1); + } else if ((p.length() > 1) && p.endsWith("/")) { + // "/foo/" --> "/foo" + p = p.substring(0, p.length() - 1); + } + return p; + } + + /* -- Path operations -- */ + + @Override + public boolean isAbsolute(File f) { + int pl = f.getPrefixLength(); + return (((pl == 2) && (f.getPath().charAt(0) == slash)) + || (pl == 3)); + } + + @Override + public String resolve(File f) { + String path = f.getPath(); + int pl = f.getPrefixLength(); + if ((pl == 2) && (path.charAt(0) == slash)) + return path; /* UNC */ + if (pl == 3) + return path; /* Absolute local */ + if (pl == 0) + return getUserPath() + slashify(path); /* Completely relative */ + if (pl == 1) { /* Drive-relative */ + String up = getUserPath(); + String ud = getDrive(up); + if (ud != null) return ud + path; + return up + path; /* User dir is a UNC path */ + } + if (pl == 2) { /* Directory-relative */ + String up = getUserPath(); + String ud = getDrive(up); + if ((ud != null) && path.startsWith(ud)) + return up + slashify(path.substring(2)); + char drive = path.charAt(0); + String dir = getDriveDirectory(drive); + String np; + if (dir != null) { + /* When resolving a directory-relative path that refers to a + drive other than the current drive, insist that the caller + have read permission on the result */ + String p = drive + (':' + dir + slashify(path.substring(2))); + SecurityManager security = System.getSecurityManager(); + try { + if (security != null) security.checkRead(p); + } catch (SecurityException x) { + /* Don't disclose the drive's directory in the exception */ + throw new SecurityException("Cannot resolve path " + path); + } + return p; + } + return drive + ":" + slashify(path.substring(2)); /* fake it */ + } + throw new InternalError("Unresolvable path: " + path); + } + + private String getUserPath() { + /* For both compatibility and security, + we must look this up every time */ + return normalize(System.getProperty("user.dir")); + } + + private String getDrive(String path) { + int pl = prefixLength(path); + return (pl == 3) ? path.substring(0, 2) : null; + } + + private static String[] driveDirCache = new String[26]; + + private static int driveIndex(char d) { + if ((d >= 'a') && (d <= 'z')) return d - 'a'; + if ((d >= 'A') && (d <= 'Z')) return d - 'A'; + return -1; + } + + private native String getDriveDirectory(int drive); + + private String getDriveDirectory(char drive) { + int i = driveIndex(drive); + if (i < 0) return null; + String s = driveDirCache[i]; + if (s != null) return s; + s = getDriveDirectory(i + 1); + driveDirCache[i] = s; + return s; + } + + // Caches for canonicalization results to improve startup performance. + // The first cache handles repeated canonicalizations of the same path + // name. The prefix cache handles repeated canonicalizations within the + // same directory, and must not create results differing from the true + // canonicalization algorithm in canonicalize_md.c. For this reason the + // prefix cache is conservative and is not used for complex path names. + private ExpiringCache cache = new ExpiringCache(); + private ExpiringCache prefixCache = new ExpiringCache(); + + @Override + public String canonicalize(String path) throws IOException { + // If path is a drive letter only then skip canonicalization + int len = path.length(); + if ((len == 2) && + (isLetter(path.charAt(0))) && + (path.charAt(1) == ':')) { + char c = path.charAt(0); + if ((c >= 'A') && (c <= 'Z')) + return path; + return "" + ((char) (c-32)) + ':'; + } else if ((len == 3) && + (isLetter(path.charAt(0))) && + (path.charAt(1) == ':') && + (path.charAt(2) == '\\')) { + char c = path.charAt(0); + if ((c >= 'A') && (c <= 'Z')) + return path; + return "" + ((char) (c-32)) + ':' + '\\'; + } + if (!useCanonCaches) { + return canonicalize0(path); + } else { + String res = cache.get(path); + if (res == null) { + String dir = null; + String resDir = null; + if (useCanonPrefixCache) { + dir = parentOrNull(path); + if (dir != null) { + resDir = prefixCache.get(dir); + if (resDir != null) { + /* + * Hit only in prefix cache; full path is canonical, + * but we need to get the canonical name of the file + * in this directory to get the appropriate + * capitalization + */ + String filename = path.substring(1 + dir.length()); + res = canonicalizeWithPrefix(resDir, filename); + cache.put(dir + File.separatorChar + filename, res); + } + } + } + if (res == null) { + res = canonicalize0(path); + cache.put(path, res); + if (useCanonPrefixCache && dir != null) { + resDir = parentOrNull(res); + if (resDir != null) { + File f = new File(res); + if (f.exists() && !f.isDirectory()) { + prefixCache.put(dir, resDir); + } + } + } + } + } + return res; + } + } + + private native String canonicalize0(String path) + throws IOException; + + private String canonicalizeWithPrefix(String canonicalPrefix, + String filename) throws IOException + { + return canonicalizeWithPrefix0(canonicalPrefix, + canonicalPrefix + File.separatorChar + filename); + } + + // Run the canonicalization operation assuming that the prefix + // (everything up to the last filename) is canonical; just gets + // the canonical name of the last element of the path + private native String canonicalizeWithPrefix0(String canonicalPrefix, + String pathWithCanonicalPrefix) + throws IOException; + + // Best-effort attempt to get parent of this path; used for + // optimization of filename canonicalization. This must return null for + // any cases where the code in canonicalize_md.c would throw an + // exception or otherwise deal with non-simple pathnames like handling + // of "." and "..". It may conservatively return null in other + // situations as well. Returning null will cause the underlying + // (expensive) canonicalization routine to be called. + private static String parentOrNull(String path) { + if (path == null) return null; + char sep = File.separatorChar; + char altSep = '/'; + int last = path.length() - 1; + int idx = last; + int adjacentDots = 0; + int nonDotCount = 0; + while (idx > 0) { + char c = path.charAt(idx); + if (c == '.') { + if (++adjacentDots >= 2) { + // Punt on pathnames containing . and .. + return null; + } + if (nonDotCount == 0) { + // Punt on pathnames ending in a . + return null; + } + } else if (c == sep) { + if (adjacentDots == 1 && nonDotCount == 0) { + // Punt on pathnames containing . and .. + return null; + } + if (idx == 0 || + idx >= last - 1 || + path.charAt(idx - 1) == sep || + path.charAt(idx - 1) == altSep) { + // Punt on pathnames containing adjacent slashes + // toward the end + return null; + } + return path.substring(0, idx); + } else if (c == altSep) { + // Punt on pathnames containing both backward and + // forward slashes + return null; + } else if (c == '*' || c == '?') { + // Punt on pathnames containing wildcards + return null; + } else { + ++nonDotCount; + adjacentDots = 0; + } + --idx; + } + return null; + } /* -- Attribute accessors -- */ + @Override public native int getBooleanAttributes(File f); + + @Override public native boolean checkAccess(File f, int access); + + @Override public native long getLastModifiedTime(File f); + + @Override public native long getLength(File f); - public native boolean setPermission(File f, int access, boolean enable, boolean owneronly); + @Override + public native boolean setPermission(File f, int access, boolean enable, + boolean owneronly); + /* -- File operations -- */ + + @Override + public native boolean createFileExclusively(String path) + throws IOException; + + @Override + public native String[] list(File f); + + @Override + public native boolean createDirectory(File f); + + @Override + public native boolean setLastModifiedTime(File f, long time); + + @Override + public native boolean setReadOnly(File f); + + @Override + public boolean delete(File f) { + // Keep canonicalization caches in sync after file deletion + // and renaming operations. Could be more clever than this + // (i.e., only remove/update affected entries) but probably + // not worth it since these entries expire after 30 seconds + // anyway. + cache.clear(); + prefixCache.clear(); + return delete0(f); + } + + private native boolean delete0(File f); + + @Override + public boolean rename(File f1, File f2) { + // Keep canonicalization caches in sync after file deletion + // and renaming operations. Could be more clever than this + // (i.e., only remove/update affected entries) but probably + // not worth it since these entries expire after 30 seconds + // anyway. + cache.clear(); + prefixCache.clear(); + return rename0(f1, f2); + } + + private native boolean rename0(File f1, File f2); + + /* -- Filesystem interface -- */ + + @Override + public File[] listRoots() { + int ds = listRoots0(); + int n = 0; + for (int i = 0; i < 26; i++) { + if (((ds >> i) & 1) != 0) { + if (!access((char)('A' + i) + ":" + slash)) + ds &= ~(1 << i); + else + n++; + } + } + File[] fs = new File[n]; + int j = 0; + char slash = this.slash; + for (int i = 0; i < 26; i++) { + if (((ds >> i) & 1) != 0) + fs[j++] = new File((char)('A' + i) + ":" + slash); + } + return fs; + } + + private static native int listRoots0(); + + private boolean access(String path) { + try { + SecurityManager security = System.getSecurityManager(); + if (security != null) security.checkRead(path); + return true; + } catch (SecurityException x) { + return false; + } + } + + /* -- Disk usage -- */ + + @Override public long getSpace(File f, int t) { if (f.exists()) { return getSpace0(f, t); @@ -60,20 +627,22 @@ class WinNTFileSystem extends Win32FileSystem { private native long getSpace0(File f, int t); - /* -- File operations -- */ + /* -- Basic infrastructure -- */ + + @Override + public int compare(File f1, File f2) { + return f1.getPath().compareToIgnoreCase(f2.getPath()); + } + + @Override + public int hashCode(File f) { + /* Could make this more efficient: String.hashCodeIgnoreCase */ + return f.getPath().toLowerCase(Locale.ENGLISH).hashCode() ^ 1234321; + } - public native boolean createFileExclusively(String path) - throws IOException; - protected native boolean delete0(File f); - public native String[] list(File f); - public native boolean createDirectory(File f); - protected native boolean rename0(File f1, File f2); - public native boolean setLastModifiedTime(File f, long time); - public native boolean setReadOnly(File f); - protected native String getDriveDirectory(int drive); private static native void initIDs(); static { - initIDs(); + initIDs(); } } diff --git a/jdk/src/windows/classes/java/lang/ProcessEnvironment.java b/jdk/src/windows/classes/java/lang/ProcessEnvironment.java index c49f1f32781..43ff33ffe40 100644 --- a/jdk/src/windows/classes/java/lang/ProcessEnvironment.java +++ b/jdk/src/windows/classes/java/lang/ProcessEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/java/lang/Terminator.java b/jdk/src/windows/classes/java/lang/Terminator.java index 6d3d2d6fa83..4b2c2847bf6 100644 --- a/jdk/src/windows/classes/java/lang/Terminator.java +++ b/jdk/src/windows/classes/java/lang/Terminator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/java/net/DefaultInterface.java b/jdk/src/windows/classes/java/net/DefaultInterface.java index 9f4dfe1a67e..3612a1d8068 100644 --- a/jdk/src/windows/classes/java/net/DefaultInterface.java +++ b/jdk/src/windows/classes/java/net/DefaultInterface.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/java/net/TwoStacksPlainSocketImpl.java b/jdk/src/windows/classes/java/net/TwoStacksPlainSocketImpl.java index 0b020b39b57..6ca25ec6021 100644 --- a/jdk/src/windows/classes/java/net/TwoStacksPlainSocketImpl.java +++ b/jdk/src/windows/classes/java/net/TwoStacksPlainSocketImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java index 06331ba973b..c6cde3c73f4 100644 --- a/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java +++ b/jdk/src/windows/classes/sun/awt/shell/Win32ShellFolder2.java @@ -1099,7 +1099,7 @@ final class Win32ShellFolder2 extends ShellFolder { ? SwingConstants.CENTER : SwingConstants.LEADING); - column.setComparator(new ColumnComparator(getIShellFolder(), i)); + column.setComparator(new ColumnComparator(Win32ShellFolder2.this, i)); notNullColumns.add(column); } @@ -1135,7 +1135,7 @@ final class Win32ShellFolder2 extends ShellFolder { // synchronize the whole code of the sort method once invoke(new Callable() { public Void call() { - Collections.sort(files, new ColumnComparator(getIShellFolder(), 0)); + Collections.sort(files, new ColumnComparator(Win32ShellFolder2.this, 0)); return null; } @@ -1143,12 +1143,12 @@ final class Win32ShellFolder2 extends ShellFolder { } private static class ColumnComparator implements Comparator { - private final long parentIShellFolder; + private final Win32ShellFolder2 shellFolder; private final int columnIdx; - public ColumnComparator(long parentIShellFolder, int columnIdx) { - this.parentIShellFolder = parentIShellFolder; + public ColumnComparator(Win32ShellFolder2 shellFolder, int columnIdx) { + this.shellFolder = shellFolder; this.columnIdx = columnIdx; } @@ -1159,7 +1159,7 @@ final class Win32ShellFolder2 extends ShellFolder { if (o instanceof Win32ShellFolder2 && o1 instanceof Win32ShellFolder2) { // delegates comparison to native method - return compareIDsByColumn(parentIShellFolder, + return compareIDsByColumn(shellFolder.getIShellFolder(), ((Win32ShellFolder2) o).getRelativePIDL(), ((Win32ShellFolder2) o1).getRelativePIDL(), columnIdx); diff --git a/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java b/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java index 27da53ef284..d15e28cb0ad 100644 --- a/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java +++ b/jdk/src/windows/classes/sun/java2d/ScreenUpdateManager.java @@ -111,7 +111,7 @@ public class ScreenUpdateManager { SurfaceData oldsd) { SurfaceData surfaceData = peer.getSurfaceData(); - if (surfaceData.isValid()) { + if (surfaceData == null || surfaceData.isValid()) { return surfaceData; } peer.replaceSurfaceData(); diff --git a/jdk/src/windows/classes/sun/management/FileSystemImpl.java b/jdk/src/windows/classes/sun/management/FileSystemImpl.java index 789b7ee64ee..9bcd99de21d 100644 --- a/jdk/src/windows/classes/sun/management/FileSystemImpl.java +++ b/jdk/src/windows/classes/sun/management/FileSystemImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/net/dns/ResolverConfigurationImpl.java b/jdk/src/windows/classes/sun/net/dns/ResolverConfigurationImpl.java index b896fbf6344..8ca7e8ffaf9 100644 --- a/jdk/src/windows/classes/sun/net/dns/ResolverConfigurationImpl.java +++ b/jdk/src/windows/classes/sun/net/dns/ResolverConfigurationImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/ch/NativeThread.java b/jdk/src/windows/classes/sun/nio/ch/NativeThread.java index 39a9fc6b902..319b5420b88 100644 --- a/jdk/src/windows/classes/sun/nio/ch/NativeThread.java +++ b/jdk/src/windows/classes/sun/nio/ch/NativeThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/ch/SocketDispatcher.java b/jdk/src/windows/classes/sun/nio/ch/SocketDispatcher.java index faf99215cdc..a03d0af93ad 100644 --- a/jdk/src/windows/classes/sun/nio/ch/SocketDispatcher.java +++ b/jdk/src/windows/classes/sun/nio/ch/SocketDispatcher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java b/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java index b755e6ef0c4..beb3e861f83 100644 --- a/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java +++ b/jdk/src/windows/classes/sun/nio/ch/WindowsSelectorImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/ch/sctp/SctpChannelImpl.java b/jdk/src/windows/classes/sun/nio/ch/sctp/SctpChannelImpl.java index 52fcb8ea1f8..8a147203402 100644 --- a/jdk/src/windows/classes/sun/nio/ch/sctp/SctpChannelImpl.java +++ b/jdk/src/windows/classes/sun/nio/ch/sctp/SctpChannelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java b/jdk/src/windows/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java index afb52a92f65..c2c1d968307 100644 --- a/jdk/src/windows/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java +++ b/jdk/src/windows/classes/sun/nio/ch/sctp/SctpMultiChannelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java b/jdk/src/windows/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java index a8c50d3257a..1e224afd13f 100644 --- a/jdk/src/windows/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java +++ b/jdk/src/windows/classes/sun/nio/ch/sctp/SctpServerChannelImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/fs/WindowsDirectoryStream.java b/jdk/src/windows/classes/sun/nio/fs/WindowsDirectoryStream.java index 02309ff01b2..cf4933eca7a 100644 --- a/jdk/src/windows/classes/sun/nio/fs/WindowsDirectoryStream.java +++ b/jdk/src/windows/classes/sun/nio/fs/WindowsDirectoryStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java b/jdk/src/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java index a0020e52a69..70a37309e9e 100644 --- a/jdk/src/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java +++ b/jdk/src/windows/classes/sun/nio/fs/WindowsFileSystemProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/print/Win32PrintServiceLookup.java b/jdk/src/windows/classes/sun/print/Win32PrintServiceLookup.java index dc9e9ee1b27..06d4b0840dd 100644 --- a/jdk/src/windows/classes/sun/print/Win32PrintServiceLookup.java +++ b/jdk/src/windows/classes/sun/print/Win32PrintServiceLookup.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java b/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java index eb748684557..a436d585cba 100644 --- a/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java +++ b/jdk/src/windows/classes/sun/security/krb5/internal/tools/Kinit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java b/jdk/src/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java index abde927cda6..e7507a0a27f 100644 --- a/jdk/src/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java +++ b/jdk/src/windows/classes/sun/security/krb5/internal/tools/KinitOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java b/jdk/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java index 9feacdf4d63..51c2c3dbc32 100644 --- a/jdk/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java +++ b/jdk/src/windows/classes/sun/security/krb5/internal/tools/Ktab.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/security/smartcardio/PlatformPCSC.java b/jdk/src/windows/classes/sun/security/smartcardio/PlatformPCSC.java index 0af23c0ddde..bd6704221cf 100644 --- a/jdk/src/windows/classes/sun/security/smartcardio/PlatformPCSC.java +++ b/jdk/src/windows/classes/sun/security/smartcardio/PlatformPCSC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/classes/sun/tools/attach/WindowsAttachProvider.java b/jdk/src/windows/classes/sun/tools/attach/WindowsAttachProvider.java index cda6a73bc29..76083a4d559 100644 --- a/jdk/src/windows/classes/sun/tools/attach/WindowsAttachProvider.java +++ b/jdk/src/windows/classes/sun/tools/attach/WindowsAttachProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/io/Win32FileSystem_md.c b/jdk/src/windows/native/java/io/Win32FileSystem_md.c deleted file mode 100644 index 91c086c48b9..00000000000 --- a/jdk/src/windows/native/java/io/Win32FileSystem_md.c +++ /dev/null @@ -1,509 +0,0 @@ -/* - * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. - * 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. - */ - -#include -#include -#include -#include -#include -#include -#include - -#include "jvm.h" -#include "jni.h" -#include "jni_util.h" -#include "jlong.h" -#include "io_util.h" -#include "dirent_md.h" -#include "java_io_FileSystem.h" - -/* This macro relies upon the fact that JNU_GetStringPlatformChars always makes - a copy of the string */ - -#define WITH_NATIVE_PATH(env, object, id, var) \ - WITH_FIELD_PLATFORM_STRING(env, object, id, var) \ - JVM_NativePath((char *)var); - -#define END_NATIVE_PATH(env, var) END_PLATFORM_STRING(env, var) - - -static struct { - jfieldID path; -} ids; - -JNIEXPORT void JNICALL -Java_java_io_Win32FileSystem_initIDs(JNIEnv *env, jclass cls) -{ - jclass fileClass = (*env)->FindClass(env, "java/io/File"); - if (!fileClass) return; - ids.path = (*env)->GetFieldID(env, fileClass, - "path", "Ljava/lang/String;"); -} - - -/* -- Path operations -- */ - - -extern int canonicalize(char *path, const char *out, int len); -extern int canonicalizeWithPrefix(const char* canonicalPrefix, const char *pathWithCanonicalPrefix, char *out, int len); - -JNIEXPORT jstring JNICALL -Java_java_io_Win32FileSystem_canonicalize0(JNIEnv *env, jobject this, - jstring pathname) -{ - jstring rv = NULL; - - WITH_PLATFORM_STRING(env, pathname, path) { - char canonicalPath[JVM_MAXPATHLEN]; - if (canonicalize(JVM_NativePath((char *)path), - canonicalPath, JVM_MAXPATHLEN) < 0) { - JNU_ThrowIOExceptionWithLastError(env, "Bad pathname"); - } else { - rv = JNU_NewStringPlatform(env, canonicalPath); - } - } END_PLATFORM_STRING(env, path); - return rv; -} - - -JNIEXPORT jstring JNICALL -Java_java_io_Win32FileSystem_canonicalizeWithPrefix0(JNIEnv *env, jobject this, - jstring canonicalPrefixString, - jstring pathWithCanonicalPrefixString) -{ - jstring rv = NULL; - char canonicalPath[JVM_MAXPATHLEN]; - - WITH_PLATFORM_STRING(env, canonicalPrefixString, canonicalPrefix) { - WITH_PLATFORM_STRING(env, pathWithCanonicalPrefixString, pathWithCanonicalPrefix) { - if (canonicalizeWithPrefix(canonicalPrefix, - pathWithCanonicalPrefix, - canonicalPath, JVM_MAXPATHLEN) < 0) { - JNU_ThrowIOExceptionWithLastError(env, "Bad pathname"); - } else { - rv = JNU_NewStringPlatform(env, canonicalPath); - } - } END_PLATFORM_STRING(env, pathWithCanonicalPrefix); - } END_PLATFORM_STRING(env, canonicalPrefix); - return rv; -} - - - -/* -- Attribute accessors -- */ - -/* Check whether or not the file name in "path" is a Windows reserved - device name (CON, PRN, AUX, NUL, COM[1-9], LPT[1-9]) based on the - returned result from GetFullPathName. If the file name in the path - is indeed a reserved device name GetFuulPathName returns - "\\.\[ReservedDeviceName]". - */ -BOOL isReservedDeviceName(const char* path) { -#define BUFSIZE 9 - char buf[BUFSIZE]; - char *lpf = NULL; - DWORD retLen = GetFullPathName(path, - BUFSIZE, - buf, - &lpf); - if ((retLen == BUFSIZE - 1 || retLen == BUFSIZE - 2) && - buf[0] == '\\' && buf[1] == '\\' && - buf[2] == '.' && buf[3] == '\\') { - char* dname = _strupr(buf + 4); - if (strcmp(dname, "CON") == 0 || - strcmp(dname, "PRN") == 0 || - strcmp(dname, "AUX") == 0 || - strcmp(dname, "NUL") == 0) - return TRUE; - if ((strncmp(dname, "COM", 3) == 0 || - strncmp(dname, "LPT", 3) == 0) && - dname[3] - '0' > 0 && - dname[3] - '0' <= 9) - return TRUE; - } - return FALSE; -} - -JNIEXPORT jint JNICALL -Java_java_io_Win32FileSystem_getBooleanAttributes(JNIEnv *env, jobject this, - jobject file) -{ - jint rv = 0; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - WIN32_FILE_ATTRIBUTE_DATA wfad; - if (!isReservedDeviceName(path) && - GetFileAttributesEx(path, GetFileExInfoStandard, &wfad)) { - rv = (java_io_FileSystem_BA_EXISTS - | ((wfad.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) - ? java_io_FileSystem_BA_DIRECTORY - : java_io_FileSystem_BA_REGULAR) - | ((wfad.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) - ? java_io_FileSystem_BA_HIDDEN : 0)); - } - } END_NATIVE_PATH(env, path); - return rv; -} - - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_checkAccess(JNIEnv *env, jobject this, - jobject file, jint a) -{ - jboolean rv = JNI_FALSE; - int mode; - switch (a) { - case java_io_FileSystem_ACCESS_READ: - case java_io_FileSystem_ACCESS_EXECUTE: - mode = 4; - break; - case java_io_FileSystem_ACCESS_WRITE: - mode = 2; - break; - default: assert(0); - } - WITH_NATIVE_PATH(env, file, ids.path, path) { - if (access(path, mode) == 0) { - rv = JNI_TRUE; - } - } END_NATIVE_PATH(env, path); - return rv; -} - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_setPermission(JNIEnv *env, jobject this, - jobject file, - jint access, - jboolean enable, - jboolean owneronly) -{ - jboolean rv = JNI_FALSE; - if (access == java_io_FileSystem_ACCESS_READ || - access == java_io_FileSystem_ACCESS_EXECUTE) { - return enable; - } - WITH_NATIVE_PATH(env, file, ids.path, path) { - DWORD a; - a = GetFileAttributes(path); - if (a != INVALID_FILE_ATTRIBUTES) { - if (enable) - a = a & ~FILE_ATTRIBUTE_READONLY; - else - a = a | FILE_ATTRIBUTE_READONLY; - if (SetFileAttributes(path, a)) - rv = JNI_TRUE; - } - } END_NATIVE_PATH(env, path); - return rv; -} - -JNIEXPORT jlong JNICALL -Java_java_io_Win32FileSystem_getLastModifiedTime(JNIEnv *env, jobject this, - jobject file) -{ - jlong rv = 0; - WITH_NATIVE_PATH(env, file, ids.path, path) { - /* Win95, Win98, WinME */ - WIN32_FIND_DATA fd; - jlong temp = 0; - LARGE_INTEGER modTime; - HANDLE h = FindFirstFile(path, &fd); - if (h != INVALID_HANDLE_VALUE) { - FindClose(h); - modTime.LowPart = (DWORD) fd.ftLastWriteTime.dwLowDateTime; - modTime.HighPart = (LONG) fd.ftLastWriteTime.dwHighDateTime; - rv = modTime.QuadPart / 10000; - rv -= 11644473600000; - } - } END_NATIVE_PATH(env, path); - return rv; -} - -JNIEXPORT jlong JNICALL -Java_java_io_Win32FileSystem_getLength(JNIEnv *env, jobject this, - jobject file) -{ - jlong rv = 0; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - struct _stati64 sb; - if (_stati64(path, &sb) == 0) { - rv = sb.st_size; - } - } END_NATIVE_PATH(env, path); - return rv; -} - - -/* -- File operations -- */ - - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_createFileExclusively(JNIEnv *env, jclass cls, - jstring pathname) -{ - jboolean rv = JNI_FALSE; - DWORD a; - - WITH_PLATFORM_STRING(env, pathname, path) { - int orv; - int error; - JVM_NativePath((char *)path); - orv = JVM_Open(path, JVM_O_RDWR | JVM_O_CREAT | JVM_O_EXCL, 0666); - if (orv < 0) { - if (orv != JVM_EEXIST) { - error = GetLastError(); - - // If a directory by the named path already exists, - // return false (behavior of solaris and linux) instead of - // throwing an exception - a = GetFileAttributes(path); - - if ((a == INVALID_FILE_ATTRIBUTES) || - !(a & FILE_ATTRIBUTE_DIRECTORY)) { - SetLastError(error); - JNU_ThrowIOExceptionWithLastError(env, path); - } - } - } else { - JVM_Close(orv); - rv = JNI_TRUE; - } - } END_PLATFORM_STRING(env, path); - return rv; -} - - -static int -removeFileOrDirectory(const char *path) /* Returns 0 on success */ -{ - DWORD a; - - SetFileAttributes(path, 0); - a = GetFileAttributes(path); - if (a == INVALID_FILE_ATTRIBUTES) { - return 1; - } else if (a & FILE_ATTRIBUTE_DIRECTORY) { - return !RemoveDirectory(path); - } else { - return !DeleteFile(path); - } -} - - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_delete0(JNIEnv *env, jobject this, - jobject file) -{ - jboolean rv = JNI_FALSE; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - if (removeFileOrDirectory(path) == 0) { - rv = JNI_TRUE; - } - } END_NATIVE_PATH(env, path); - return rv; -} - - -/* ## Clean this up to use direct Win32 calls */ - -JNIEXPORT jobjectArray JNICALL -Java_java_io_Win32FileSystem_list(JNIEnv *env, jobject this, - jobject file) -{ - DIR *dir; - struct dirent *ptr; - int len, maxlen; - jobjectArray rv, old; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - dir = opendir(path); - } END_NATIVE_PATH(env, path); - if (dir == NULL) return NULL; - - /* Allocate an initial String array */ - len = 0; - maxlen = 16; - rv = (*env)->NewObjectArray(env, maxlen, JNU_ClassString(env), NULL); - if (rv == NULL) goto error; - - /* Scan the directory */ - while ((ptr = readdir(dir)) != NULL) { - jstring name; - if (!strcmp(ptr->d_name, ".") || !strcmp(ptr->d_name, "..")) - continue; - if (len == maxlen) { - old = rv; - rv = (*env)->NewObjectArray(env, maxlen <<= 1, - JNU_ClassString(env), NULL); - if (rv == NULL) goto error; - if (JNU_CopyObjectArray(env, rv, old, len) < 0) goto error; - (*env)->DeleteLocalRef(env, old); - } - name = JNU_NewStringPlatform(env, ptr->d_name); - if (name == NULL) goto error; - (*env)->SetObjectArrayElement(env, rv, len++, name); - (*env)->DeleteLocalRef(env, name); - } - closedir(dir); - - /* Copy the final results into an appropriately-sized array */ - old = rv; - rv = (*env)->NewObjectArray(env, len, JNU_ClassString(env), NULL); - if (rv == NULL) goto error; - if (JNU_CopyObjectArray(env, rv, old, len) < 0) goto error; - return rv; - - error: - closedir(dir); - return NULL; -} - - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_createDirectory(JNIEnv *env, jobject this, - jobject file) -{ - jboolean rv = JNI_FALSE; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - if (mkdir(path) == 0) { - rv = JNI_TRUE; - } - } END_NATIVE_PATH(env, path); - return rv; -} - - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_rename0(JNIEnv *env, jobject this, - jobject from, jobject to) -{ - jboolean rv = JNI_FALSE; - - WITH_NATIVE_PATH(env, from, ids.path, fromPath) { - WITH_NATIVE_PATH(env, to, ids.path, toPath) { - if (rename(fromPath, toPath) == 0) { - rv = JNI_TRUE; - } - } END_NATIVE_PATH(env, toPath); - } END_NATIVE_PATH(env, fromPath); - return rv; -} - - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_setLastModifiedTime(JNIEnv *env, jobject this, - jobject file, jlong time) -{ - jboolean rv = JNI_FALSE; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - HANDLE h; - h = CreateFile(path, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL | FILE_FLAG_BACKUP_SEMANTICS, 0); - if (h != INVALID_HANDLE_VALUE) { - LARGE_INTEGER modTime; - FILETIME t; - modTime.QuadPart = (time + 11644473600000L) * 10000L; - t.dwLowDateTime = (DWORD)modTime.LowPart; - t.dwHighDateTime = (DWORD)modTime.HighPart; - if (SetFileTime(h, NULL, NULL, &t)) { - rv = JNI_TRUE; - } - CloseHandle(h); - } - } END_NATIVE_PATH(env, path); - - return rv; -} - - -JNIEXPORT jboolean JNICALL -Java_java_io_Win32FileSystem_setReadOnly(JNIEnv *env, jobject this, - jobject file) -{ - jboolean rv = JNI_FALSE; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - DWORD a; - a = GetFileAttributes(path); - if (a != INVALID_FILE_ATTRIBUTES) { - if (SetFileAttributes(path, a | FILE_ATTRIBUTE_READONLY)) - rv = JNI_TRUE; - } - } END_NATIVE_PATH(env, path); - return rv; -} - - -/* -- Filesystem interface -- */ - - -JNIEXPORT jobject JNICALL -Java_java_io_Win32FileSystem_getDriveDirectory(JNIEnv *env, jclass ignored, - jint drive) -{ - char buf[_MAX_PATH]; - char *p = _getdcwd(drive, buf, sizeof(buf)); - if (p == NULL) return NULL; - if (isalpha(*p) && (p[1] == ':')) p += 2; - return JNU_NewStringPlatform(env, p); -} - - -JNIEXPORT jint JNICALL -Java_java_io_Win32FileSystem_listRoots0(JNIEnv *env, jclass ignored) -{ - return GetLogicalDrives(); -} - -JNIEXPORT jlong JNICALL -Java_java_io_Win32FileSystem_getSpace0(JNIEnv *env, jobject this, - jobject file, jint t) -{ - jlong rv = 0L; - - WITH_NATIVE_PATH(env, file, ids.path, path) { - ULARGE_INTEGER totalSpace, freeSpace, usableSpace; - if (GetDiskFreeSpaceEx(path, &usableSpace, &totalSpace, &freeSpace)) { - switch(t) { - case java_io_FileSystem_SPACE_TOTAL: - rv = long_to_jlong(totalSpace.QuadPart); - break; - case java_io_FileSystem_SPACE_FREE: - rv = long_to_jlong(freeSpace.QuadPart); - break; - case java_io_FileSystem_SPACE_USABLE: - rv = long_to_jlong(usableSpace.QuadPart); - break; - default: - assert(0); - } - } - } END_NATIVE_PATH(env, path); - return rv; -} diff --git a/jdk/src/windows/native/java/io/WinNTFileSystem_md.c b/jdk/src/windows/native/java/io/WinNTFileSystem_md.c index 7d978294367..f1eb449275e 100644 --- a/jdk/src/windows/native/java/io/WinNTFileSystem_md.c +++ b/jdk/src/windows/native/java/io/WinNTFileSystem_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -828,6 +828,12 @@ Java_java_io_WinNTFileSystem_getDriveDirectory(JNIEnv *env, jobject this, return ret; } +JNIEXPORT jint JNICALL +Java_java_io_WinNTFileSystem_listRoots0(JNIEnv *env, jclass ignored) +{ + return GetLogicalDrives(); +} + JNIEXPORT jlong JNICALL Java_java_io_WinNTFileSystem_getSpace0(JNIEnv *env, jobject this, jobject file, jint t) diff --git a/jdk/src/windows/native/java/io/io_util_md.c b/jdk/src/windows/native/java/io/io_util_md.c index 787617e4895..2f0e74fc171 100644 --- a/jdk/src/windows/native/java/io/io_util_md.c +++ b/jdk/src/windows/native/java/io/io_util_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,22 +40,8 @@ #include #include -extern jboolean onNT = JNI_FALSE; - static DWORD MAX_INPUT_EVENTS = 2000; -void -initializeWindowsVersion() { - OSVERSIONINFO ver; - ver.dwOSVersionInfoSize = sizeof(ver); - GetVersionEx(&ver); - if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT) { - onNT = JNI_TRUE; - } else { - onNT = JNI_FALSE; - } -} - /* If this returns NULL then an exception is pending */ WCHAR* fileToNTPath(JNIEnv *env, jobject file, jfieldID id) { @@ -247,27 +233,21 @@ winFileHandleOpen(JNIEnv *env, jstring path, int flags) const DWORD flagsAndAttributes = maybeWriteThrough | maybeDeleteOnClose; HANDLE h = NULL; - if (onNT) { - WCHAR *pathbuf = pathToNTPath(env, path, JNI_TRUE); - if (pathbuf == NULL) { - /* Exception already pending */ - return -1; - } - h = CreateFileW( - pathbuf, /* Wide char path name */ - access, /* Read and/or write permission */ - sharing, /* File sharing flags */ - NULL, /* Security attributes */ - disposition, /* creation disposition */ - flagsAndAttributes, /* flags and attributes */ - NULL); - free(pathbuf); - } else { - WITH_PLATFORM_STRING(env, path, _ps) { - h = CreateFile(_ps, access, sharing, NULL, disposition, - flagsAndAttributes, NULL); - } END_PLATFORM_STRING(env, _ps); + WCHAR *pathbuf = pathToNTPath(env, path, JNI_TRUE); + if (pathbuf == NULL) { + /* Exception already pending */ + return -1; } + h = CreateFileW( + pathbuf, /* Wide char path name */ + access, /* Read and/or write permission */ + sharing, /* File sharing flags */ + NULL, /* Security attributes */ + disposition, /* creation disposition */ + flagsAndAttributes, /* flags and attributes */ + NULL); + free(pathbuf); + if (h == INVALID_HANDLE_VALUE) { int error = GetLastError(); if (error == ERROR_TOO_MANY_OPEN_FILES) { diff --git a/jdk/src/windows/native/java/io/io_util_md.h b/jdk/src/windows/native/java/io/io_util_md.h index 392b8c30784..34036d47262 100644 --- a/jdk/src/windows/native/java/io/io_util_md.h +++ b/jdk/src/windows/native/java/io/io_util_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/lang/ProcessImpl_md.c b/jdk/src/windows/native/java/lang/ProcessImpl_md.c index ed14eeba1be..dfa59f99efd 100644 --- a/jdk/src/windows/native/java/lang/ProcessImpl_md.c +++ b/jdk/src/windows/native/java/lang/ProcessImpl_md.c @@ -40,72 +40,6 @@ */ #define PIPE_SIZE (4096+24) -char * -extractExecutablePath(JNIEnv *env, char *source) -{ - char *p, *r; - - /* If no spaces, then use entire thing */ - if ((p = strchr(source, ' ')) == NULL) - return source; - - /* If no quotes, or quotes after space, return up to space */ - if (((r = strchr(source, '"')) == NULL) || (r > p)) { - *p = 0; - return source; - } - - /* Quotes before space, return up to space after next quotes */ - p = strchr(r, '"'); - if ((p = strchr(p, ' ')) == NULL) - return source; - *p = 0; - return source; -} - -DWORD -selectProcessFlag(JNIEnv *env, jstring cmd0) -{ - char buf[MAX_PATH]; - DWORD newFlag = 0; - char *exe, *p, *name; - unsigned char buffer[2]; - long headerLoc = 0; - int fd = 0; - - exe = (char *)JNU_GetStringPlatformChars(env, cmd0, 0); - exe = extractExecutablePath(env, exe); - - if (exe != NULL) { - if ((p = strchr(exe, '\\')) == NULL) { - SearchPath(NULL, exe, ".exe", MAX_PATH, buf, &name); - } else { - p = strrchr(exe, '\\'); - *p = 0; - p++; - SearchPath(exe, p, ".exe", MAX_PATH, buf, &name); - } - } - - fd = _open(buf, _O_RDONLY); - if (fd > 0) { - _read(fd, buffer, 2); - if (buffer[0] == 'M' && buffer[1] == 'Z') { - _lseek(fd, 60L, SEEK_SET); - _read(fd, buffer, 2); - headerLoc = (long)buffer[1] << 8 | (long)buffer[0]; - _lseek(fd, headerLoc, SEEK_SET); - _read(fd, buffer, 2); - if (buffer[0] == 'P' && buffer[1] == 'E') { - newFlag = DETACHED_PROCESS; - } - } - _close(fd); - } - JNU_ReleaseStringPlatformChars(env, cmd0, exe); - return newFlag; -} - static void win32Error(JNIEnv *env, const char *functionName) { @@ -151,15 +85,8 @@ Java_java_lang_ProcessImpl_create(JNIEnv *env, jclass ignored, const jchar* penvBlock = NULL; jlong *handles = NULL; jlong ret = 0; - OSVERSIONINFO ver; - jboolean onNT = JNI_FALSE; DWORD processFlag; - ver.dwOSVersionInfoSize = sizeof(ver); - GetVersionEx(&ver); - if (ver.dwPlatformId == VER_PLATFORM_WIN32_NT) - onNT = JNI_TRUE; - assert(cmd != NULL); pcmd = (*env)->GetStringChars(env, cmd, NULL); if (pcmd == NULL) goto Catch; @@ -229,10 +156,7 @@ Java_java_lang_ProcessImpl_create(JNIEnv *env, jclass ignored, } SetHandleInformation(si.hStdError, HANDLE_FLAG_INHERIT, TRUE); - if (onNT) - processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT; - else - processFlag = selectProcessFlag(env, cmd) | CREATE_UNICODE_ENVIRONMENT; + processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT; ret = CreateProcessW(0, /* executable name */ (LPWSTR)pcmd, /* command line */ 0, /* process security attribute */ diff --git a/jdk/src/windows/native/java/lang/java_props_md.c b/jdk/src/windows/native/java/lang/java_props_md.c index 19cac3327e9..5d1111efbee 100644 --- a/jdk/src/windows/native/java/lang/java_props_md.c +++ b/jdk/src/windows/native/java/lang/java_props_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c b/jdk/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c index 0077c37aaa2..d3de6e7f024 100644 --- a/jdk/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c +++ b/jdk/src/windows/native/java/net/DualStackPlainDatagramSocketImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/Inet6AddressImpl.c b/jdk/src/windows/native/java/net/Inet6AddressImpl.c index b98b6411b01..20b42b18508 100644 --- a/jdk/src/windows/native/java/net/Inet6AddressImpl.c +++ b/jdk/src/windows/native/java/net/Inet6AddressImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/NetworkInterface.c b/jdk/src/windows/native/java/net/NetworkInterface.c index 570eac30812..b0f9344db4a 100644 --- a/jdk/src/windows/native/java/net/NetworkInterface.c +++ b/jdk/src/windows/native/java/net/NetworkInterface.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/NetworkInterface.h b/jdk/src/windows/native/java/net/NetworkInterface.h index 2f977fd624b..22744c1eb6c 100644 --- a/jdk/src/windows/native/java/net/NetworkInterface.h +++ b/jdk/src/windows/native/java/net/NetworkInterface.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/NetworkInterface_winXP.c b/jdk/src/windows/native/java/net/NetworkInterface_winXP.c index 9b624cd5535..afc31abcd5f 100644 --- a/jdk/src/windows/native/java/net/NetworkInterface_winXP.c +++ b/jdk/src/windows/native/java/net/NetworkInterface_winXP.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c b/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c index dc6fdf41c47..ce6bfbd8c57 100644 --- a/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c +++ b/jdk/src/windows/native/java/net/TwoStacksPlainDatagramSocketImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c b/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c index 840eb240575..4b34384ab1f 100644 --- a/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c +++ b/jdk/src/windows/native/java/net/TwoStacksPlainSocketImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/net_util_md.c b/jdk/src/windows/native/java/net/net_util_md.c index cd3efe922bc..c0c44d74eb7 100644 --- a/jdk/src/windows/native/java/net/net_util_md.c +++ b/jdk/src/windows/native/java/net/net_util_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/net/net_util_md.h b/jdk/src/windows/native/java/net/net_util_md.h index e764260bb24..50a275534bf 100644 --- a/jdk/src/windows/native/java/net/net_util_md.h +++ b/jdk/src/windows/native/java/net/net_util_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/java/util/TimeZone_md.c b/jdk/src/windows/native/java/util/TimeZone_md.c index d29558c2924..57d4b526ba6 100644 --- a/jdk/src/windows/native/java/util/TimeZone_md.c +++ b/jdk/src/windows/native/java/util/TimeZone_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,8 +65,6 @@ static void *keyNames[] = { #define STANDARD_NAME 0 #define STD_NAME 2 -static int isNT = FALSE; /* TRUE if it is NT. */ - /* * Calls RegQueryValueEx() to get the value for the specified key. If * the platform is NT, 2000 or XP, it calls the Unicode @@ -95,12 +93,10 @@ getValueInRegistry(HKEY hKey, int len; *typePtr = 0; - if (isNT) { - ret = RegQueryValueExW(hKey, (WCHAR *) keyNames[keyIndex], NULL, - typePtr, buf, bufLengthPtr); - if (ret == ERROR_SUCCESS && *typePtr == REG_SZ) { - return ret; - } + ret = RegQueryValueExW(hKey, (WCHAR *) keyNames[keyIndex], NULL, + typePtr, buf, bufLengthPtr); + if (ret == ERROR_SUCCESS && *typePtr == REG_SZ) { + return ret; } valSize = sizeof(val); @@ -180,8 +176,7 @@ static int getWinTimeZone(char *winZoneName, char *winMapID) */ ver.dwOSVersionInfoSize = sizeof(ver); GetVersionEx(&ver); - isNT = ver.dwPlatformId == VER_PLATFORM_WIN32_NT; - isVista = isNT && ver.dwMajorVersion >= 6; + isVista = ver.dwMajorVersion >= 6; ret = RegOpenKeyEx(HKEY_LOCAL_MACHINE, WIN_CURRENT_TZ_KEY, 0, KEY_READ, (PHKEY)&hKey); diff --git a/jdk/src/windows/native/sun/management/FileSystemImpl.c b/jdk/src/windows/native/sun/management/FileSystemImpl.c index 0747121d35a..6253a927bcb 100644 --- a/jdk/src/windows/native/sun/management/FileSystemImpl.c +++ b/jdk/src/windows/native/sun/management/FileSystemImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/net/www/protocol/http/ntlm/NTLMAuthSequence.c b/jdk/src/windows/native/sun/net/www/protocol/http/ntlm/NTLMAuthSequence.c index 81f30fbb746..c648f7b764e 100644 --- a/jdk/src/windows/native/sun/net/www/protocol/http/ntlm/NTLMAuthSequence.c +++ b/jdk/src/windows/native/sun/net/www/protocol/http/ntlm/NTLMAuthSequence.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/nio/ch/DatagramChannelImpl.c b/jdk/src/windows/native/sun/nio/ch/DatagramChannelImpl.c index 555ca9fbbfb..9396cf82ea6 100644 --- a/jdk/src/windows/native/sun/nio/ch/DatagramChannelImpl.c +++ b/jdk/src/windows/native/sun/nio/ch/DatagramChannelImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/nio/ch/IOUtil.c b/jdk/src/windows/native/sun/nio/ch/IOUtil.c index 8b03be4b37c..10c72e4682f 100644 --- a/jdk/src/windows/native/sun/nio/ch/IOUtil.c +++ b/jdk/src/windows/native/sun/nio/ch/IOUtil.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/nio/ch/Net.c b/jdk/src/windows/native/sun/nio/ch/Net.c index 36a5d2b302c..8d515e88471 100644 --- a/jdk/src/windows/native/sun/nio/ch/Net.c +++ b/jdk/src/windows/native/sun/nio/ch/Net.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/nio/ch/SocketDispatcher.c b/jdk/src/windows/native/sun/nio/ch/SocketDispatcher.c index e765149eb64..45fe14b07f9 100644 --- a/jdk/src/windows/native/sun/nio/ch/SocketDispatcher.c +++ b/jdk/src/windows/native/sun/nio/ch/SocketDispatcher.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.c b/jdk/src/windows/native/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.c index 81484da7fee..b78f443937b 100644 --- a/jdk/src/windows/native/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.c +++ b/jdk/src/windows/native/sun/nio/ch/WindowsAsynchronousSocketChannelImpl.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/nio/ch/nio_util.h b/jdk/src/windows/native/sun/nio/ch/nio_util.h index 427281cab86..cf2df5363b7 100644 --- a/jdk/src/windows/native/sun/nio/ch/nio_util.h +++ b/jdk/src/windows/native/sun/nio/ch/nio_util.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c index 72e5d5acb49..fce83640b63 100644 --- a/jdk/src/windows/native/sun/security/krb5/NativeCreds.c +++ b/jdk/src/windows/native/sun/security/krb5/NativeCreds.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/security/pkcs11/j2secmod_md.c b/jdk/src/windows/native/sun/security/pkcs11/j2secmod_md.c index fac24a6063f..33b11bfd07e 100644 --- a/jdk/src/windows/native/sun/security/pkcs11/j2secmod_md.c +++ b/jdk/src/windows/native/sun/security/pkcs11/j2secmod_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c b/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c index 968650da591..8d7f753aa58 100644 --- a/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c +++ b/jdk/src/windows/native/sun/security/provider/WinCAPISeedGenerator.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/tools/attach/WindowsAttachProvider.c b/jdk/src/windows/native/sun/tools/attach/WindowsAttachProvider.c index bbd6f400a24..e812b0f935f 100644 --- a/jdk/src/windows/native/sun/tools/attach/WindowsAttachProvider.c +++ b/jdk/src/windows/native/sun/tools/attach/WindowsAttachProvider.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c index 2ee38039823..28424dd1523 100644 --- a/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c +++ b/jdk/src/windows/native/sun/tools/attach/WindowsVirtualMachine.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/tracing/dtrace/jvm_symbols_md.c b/jdk/src/windows/native/sun/tracing/dtrace/jvm_symbols_md.c index dd4d5d03fc8..adca9ecb0e3 100644 --- a/jdk/src/windows/native/sun/tracing/dtrace/jvm_symbols_md.c +++ b/jdk/src/windows/native/sun/tracing/dtrace/jvm_symbols_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/native/sun/windows/awt_Font.cpp b/jdk/src/windows/native/sun/windows/awt_Font.cpp index d07cdae0467..185514c1972 100644 --- a/jdk/src/windows/native/sun/windows/awt_Font.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Font.cpp @@ -150,6 +150,7 @@ AwtFont::AwtFont(int num, JNIEnv *env, jobject javaFont) AwtFont::~AwtFont() { + delete[] m_hFont; } void AwtFont::Dispose() { @@ -160,11 +161,12 @@ void AwtFont::Dispose() { /* NOTE: delete of windows HFONT happens in FontCache::Remove only when the final reference to the font is disposed */ } else if (font != NULL) { - // if font was not in cache, its not shared and we delete it now - VERIFY(::DeleteObject(font)); + // if font was not in cache, its not shared and we delete it now + DASSERT(::GetObjectType(font) == OBJ_FONT); + VERIFY(::DeleteObject(font)); } + m_hFont[i] = NULL; } - delete[] m_hFont; AwtObject::Dispose(); } diff --git a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp index 913540399b5..e8b2d51931a 100644 --- a/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Toolkit.cpp @@ -534,7 +534,6 @@ BOOL AwtToolkit::Dispose() { D3DInitializer::GetInstance().Clean(); AwtObjectList::Cleanup(); - AwtFont::Cleanup(); awt_dnd_uninitialize(); awt_clipboard_uninitialize((JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2)); @@ -554,6 +553,8 @@ BOOL AwtToolkit::Dispose() { ::DispatchMessage(&msg); } + AwtFont::Cleanup(); + HWND toolkitHWndToDestroy = tk.m_toolkitHWnd; tk.m_toolkitHWnd = 0; VERIFY(::DestroyWindow(toolkitHWndToDestroy) != NULL); diff --git a/jdk/src/windows/native/sun/windows/awt_Window.cpp b/jdk/src/windows/native/sun/windows/awt_Window.cpp index 5c5f53dba40..b4110ece075 100644 --- a/jdk/src/windows/native/sun/windows/awt_Window.cpp +++ b/jdk/src/windows/native/sun/windows/awt_Window.cpp @@ -1559,21 +1559,8 @@ void AwtWindow::SendWindowEvent(jint id, HWND opposite, BOOL AwtWindow::AwtSetActiveWindow(BOOL isMouseEventCause, UINT hittest) { - // Fix for 6458497. - // Retreat if current foreground window is out of both our and embedder process. - // The exception is when activation is requested due to a mouse event. - if (!isMouseEventCause) { - HWND fgWindow = ::GetForegroundWindow(); - if (NULL != fgWindow) { - DWORD fgProcessID; - ::GetWindowThreadProcessId(fgWindow, &fgProcessID); - if (fgProcessID != ::GetCurrentProcessId() - && !AwtToolkit::GetInstance().IsEmbedderProcessId(fgProcessID)) - { - return FALSE; - } - } - } + // We used to reject non mouse window activation if our app wasn't active. + // This code since has been removed as the fix for 7185280 HWND proxyContainerHWnd = GetProxyToplevelContainer(); HWND proxyHWnd = GetProxyFocusOwner(); diff --git a/jdk/src/windows/npt/npt_md.h b/jdk/src/windows/npt/npt_md.h index 4cf2176db1c..50747ddd7fd 100644 --- a/jdk/src/windows/npt/npt_md.h +++ b/jdk/src/windows/npt/npt_md.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/windows/transport/shmem/shmem_md.c b/jdk/src/windows/transport/shmem/shmem_md.c index 83e9349574b..056dce648f7 100644 --- a/jdk/src/windows/transport/shmem/shmem_md.c +++ b/jdk/src/windows/transport/shmem/shmem_md.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/Makefile b/jdk/test/Makefile index 87626e3b02b..e42481fae39 100644 --- a/jdk/test/Makefile +++ b/jdk/test/Makefile @@ -477,25 +477,21 @@ jdk_io: $(call TestDirs, java/io) # Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_lang JDK_DEFAULT_TARGETS += jdk_lang -jdk_lang: $(call TestDirs, java/lang) +jdk_lang: $(call TestDirs, java/lang sun/invoke sun/misc vm) $(call RunAgentvmBatch) # Stable othervm testruns (minus items from PROBLEM_LIST) # Using agentvm has serious problems with these tests -JDK_ALL_TARGETS += jdk_management1 -jdk_management1: $(call TestDirs, javax/management) +JDK_ALL_TARGETS += jdk_jmx +jdk_jmx: $(call TestDirs, javax/management com/sun/jmx) $(call RunOthervmBatch) # Stable othervm testruns (minus items from PROBLEM_LIST) # Using agentvm has serious problems with these tests -JDK_ALL_TARGETS += jdk_management2 -jdk_management2: $(call TestDirs, com/sun/jmx com/sun/management sun/management) +JDK_ALL_TARGETS += jdk_management +jdk_management: $(call TestDirs, com/sun/management sun/management) $(call RunOthervmBatch) -# All management tests -jdk_management: jdk_management1 jdk_management2 - @$(SummaryInfo) - # Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_math JDK_DEFAULT_TARGETS += jdk_math @@ -503,44 +499,34 @@ jdk_math: $(call TestDirs, java/math) $(call RunAgentvmBatch) # Stable agentvm testruns (minus items from PROBLEM_LIST) -JDK_ALL_TARGETS += jdk_misc -JDK_DEFAULT_TARGETS += jdk_misc -jdk_misc: $(call TestDirs, \ - demo/jvmti demo/zipfs javax/naming javax/script \ - javax/smartcardio com/sun/jndi com/sun/xml \ - com/sun/corba sun/misc) +JDK_ALL_TARGETS += jdk_other +JDK_DEFAULT_TARGETS += jdk_other +jdk_other: $(call TestDirs, \ + demo/jvmti demo/zipfs sample \ + javax/naming com/sun/jndi \ + javax/script \ + javax/sql \ + javax/smartcardio \ + javax/xml/ws com/sun/internal/ws \ + jdk/asm \ + com/sun/org/apache/xerces \ + com/sun/corba \ + com/sun/servicetag \ + com/sun/tracing \ + sun/usagetracker) $(call RunAgentvmBatch) # Stable agentvm testruns (minus items from PROBLEM_LIST) JDK_ALL_TARGETS += jdk_net JDK_DEFAULT_TARGETS += jdk_net -jdk_net: $(call TestDirs, com/sun/net java/net sun/net) +jdk_net: $(call TestDirs, com/sun/net java/net sun/net com/oracle/net) $(call RunAgentvmBatch) # Stable agentvm testruns (minus items from PROBLEM_LIST) -JDK_ALL_TARGETS += jdk_nio1 -JDK_DEFAULT_TARGETS += jdk_nio1 -jdk_nio1: $(call TestDirs, java/nio/file) - $(call RunAgentvmBatch) - -# Stable agentvm testruns (minus items from PROBLEM_LIST) -JDK_ALL_TARGETS += jdk_nio2 -JDK_DEFAULT_TARGETS += jdk_nio2 -jdk_nio2: $(call TestDirs, java/nio/Buffer java/nio/ByteOrder \ - java/nio/channels java/nio/MappedByteBuffer sun/nio/ch) +jdk_nio: $(call TestDirs, java/nio sun/nio com/oracle/nio) $(call SharedLibraryPermissions,java/nio/channels) $(call RunAgentvmBatch) -# Stable agentvm testruns (minus items from PROBLEM_LIST) -JDK_ALL_TARGETS += jdk_nio3 -JDK_DEFAULT_TARGETS += jdk_nio3 -jdk_nio3: $(call TestDirs, java/nio/charset sun/nio/cs) - $(call RunAgentvmBatch) - -# All nio tests -jdk_nio: jdk_nio1 jdk_nio2 jdk_nio3 - @$(SummaryInfo) - # Stable agentvm testruns (minus items from PROBLEM_LIST) jdk_sctp: $(call TestDirs, com/sun/nio/sctp) $(call RunAgentvmBatch) @@ -548,7 +534,7 @@ jdk_sctp: $(call TestDirs, com/sun/nio/sctp) # Stable othervm testruns (minus items from PROBLEM_LIST) # Using agentvm has serious problems with these tests JDK_ALL_TARGETS += jdk_rmi -jdk_rmi: $(call TestDirs, java/rmi javax/rmi sun/rmi) +jdk_rmi: $(call TestDirs, java/rmi sun/rmi javax/rmi/ssl) $(call RunOthervmBatch) # Stable agentvm testruns (minus items from PROBLEM_LIST) @@ -566,7 +552,7 @@ jdk_security2: $(call TestDirs, javax/crypto javax/xml/crypto com/sun/crypto) JDK_ALL_TARGETS += jdk_security3 jdk_security3: $(call TestDirs, com/sun/security lib/security javax/security \ sun/security com/sun/org/apache/xml/internal/security \ - com/oracle/security/ucrypto) + com/oracle/security) $(call SharedLibraryPermissions,sun/security) $(call RunAgentvmBatch) @@ -593,23 +579,17 @@ jdk_text: $(call TestDirs, java/text sun/text) $(call RunAgentvmBatch) # Stable agentvm testruns (minus items from PROBLEM_LIST) -JDK_ALL_TARGETS += jdk_tools1 -jdk_tools1: $(call TestDirs, com/sun/jdi) +JDK_ALL_TARGETS += jdk_jdi +jdk_jdi: $(call TestDirs, com/sun/jdi) $(call RunAgentvmBatch) # Stable othervm testruns (minus items from PROBLEM_LIST) # Using agentvm has serious problems with these tests -JDK_ALL_TARGETS += jdk_tools2 -jdk_tools2: $(call TestDirs, \ - com/sun/tools sun/jvmstat sun/tools tools vm \ - com/sun/servicetag com/sun/tracing) +JDK_ALL_TARGETS += jdk_tools +jdk_tools: $(call TestDirs, com/sun/tools sun/jvmstat sun/tools tools) $(call SharedLibraryPermissions,tools/launcher) $(call RunAgentvmBatch) -# All tools tests -jdk_tools: jdk_tools1 jdk_tools2 - @$(SummaryInfo) - # Stable othervm testruns (minus items from PROBLEM_LIST) # Using agentvm has serious problems with these tests ifdef OPENJDK diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt index 23c91cf3a92..8fd42d532aa 100644 --- a/jdk/test/ProblemList.txt +++ b/jdk/test/ProblemList.txt @@ -137,12 +137,6 @@ java/lang/management/MemoryMXBean/ResetPeakMemoryUsage.java generic-all # 7196801 java/lang/management/MemoryMXBean/LowMemoryTest2.sh generic-all -# Exclude until the fix for 7195557 propagates widely. -java/lang/management/MemoryMXBean/CollectionUsageThresholdParallelGC.sh generic-all -java/lang/management/MemoryMXBean/CollectionUsageThresholdSerialGC.sh generic-all -java/lang/management/MemoryMXBean/MemoryTest.java generic-all -java/lang/management/MemoryMXBean/MemoryTestAllGC.sh generic-all - # Exclude until hotspot/jdk repos are sync'd w.r.t. JAVA_MAX_SUPPORTED_VERSION # Needed when hotspot fix 7054345 is present. Remove when the JDK source is # updated accordingly. @@ -152,6 +146,10 @@ java/lang/System/Versions.java generic-all # jdk_management +############################################################################ + +# jdk_jmx + # 6959636 javax/management/loading/LibraryLoader/LibraryLoaderTest.java windows-all @@ -167,7 +165,7 @@ javax/management/remote/mandatory/notif/DiffHBTest.java generic-all ############################################################################ -# jdk_misc +# jdk_other # 6988950 demo/jvmti/compiledMethodLoad/CompiledMethodLoadTest.java generic-all @@ -315,6 +313,9 @@ sun/security/tools/keytool/readjar.sh solaris-all sun/security/tools/keytool/selfissued.sh solaris-all sun/security/tools/keytool/standard.sh solaris-all +# 8000439: NPG: REGRESSION : sun/security/krb5/auto/MaxRetries.java fails with timeout +sun/security/krb5/auto/MaxRetries.java solaris-sparcv9 + ############################################################################ # jdk_sound @@ -327,8 +328,6 @@ sun/security/tools/keytool/standard.sh solaris-all # jdk_text -# 7196199 -java/text/Bidi/Bug6665028.java generic-all ############################################################################ # jdk_tools @@ -336,6 +335,24 @@ java/text/Bidi/Bug6665028.java generic-all # 6461635 com/sun/tools/attach/BasicTests.sh generic-all +# 7172176 +sun/tools/jconsole/ResourceCheckTest.sh generic-all +sun/tools/jconsole/ImmutableResourceTest.sh generic-all + +# 7132203 +sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all + +# Tests take too long, see 7143279 +tools/pack200/CommandLineTests.java generic-all +tools/pack200/Pack200Test.java generic-all + +# 7150569 +tools/launcher/UnicodeTest.java macosx-all + +############################################################################ + +# jdk_jdi + # Filed 6952105 com/sun/jdi/SuspendThreadTest.java generic-all @@ -351,20 +368,6 @@ com/sun/jdi/FieldWatchpoints.java generic-all # Filed 6402201 com/sun/jdi/ProcessAttachTest.sh generic-all -# Filed 7172176 -sun/tools/jconsole/ResourceCheckTest.sh generic-all -sun/tools/jconsole/ImmutableResourceTest.sh generic-all - -# 7132203 -sun/jvmstat/monitor/MonitoredVm/CR6672135.java generic-all - -# Tests take too long, see 7143279 -tools/pack200/CommandLineTests.java generic-all -tools/pack200/Pack200Test.java generic-all - -# 7150569 -tools/launcher/UnicodeTest.java macosx-all - ############################################################################ # jdk_util diff --git a/jdk/test/TEST.ROOT b/jdk/test/TEST.ROOT index e6d8dfca678..e8e3fda5f85 100644 --- a/jdk/test/TEST.ROOT +++ b/jdk/test/TEST.ROOT @@ -6,7 +6,7 @@ keys=2d dnd i18n # Tests that must run in othervm mode -othervm.dirs=java/rmi sun/rmi javax/management +othervm.dirs=java/awt java/beans java/rmi javax/accessibility javax/imageio javax/sound javax/print javax/management com/sun/awt sun/awt sun/java2d sun/pisces sun/rmi # Tests that cannot run concurrently exclusiveAccess.dirs=java/rmi/Naming sun/management/jmxremote sun/tools/jstatd diff --git a/jdk/test/com/sun/crypto/provider/Cipher/DES/PaddingTest.java b/jdk/test/com/sun/crypto/provider/Cipher/DES/PaddingTest.java index b33d2e0cd4e..eee4fc9ab72 100644 --- a/jdk/test/com/sun/crypto/provider/Cipher/DES/PaddingTest.java +++ b/jdk/test/com/sun/crypto/provider/Cipher/DES/PaddingTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/crypto/provider/KeyGenerator/Test4628062.java b/jdk/test/com/sun/crypto/provider/KeyGenerator/Test4628062.java index 3fc55b7f8c3..227404e2510 100644 --- a/jdk/test/com/sun/crypto/provider/KeyGenerator/Test4628062.java +++ b/jdk/test/com/sun/crypto/provider/KeyGenerator/Test4628062.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/ConnectedVMs.java b/jdk/test/com/sun/jdi/ConnectedVMs.java index 551cc76855b..f7acff21382 100644 --- a/jdk/test/com/sun/jdi/ConnectedVMs.java +++ b/jdk/test/com/sun/jdi/ConnectedVMs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/EarlyReturnTest.java b/jdk/test/com/sun/jdi/EarlyReturnTest.java index 306ff25a57f..f88c5efa96f 100644 --- a/jdk/test/com/sun/jdi/EarlyReturnTest.java +++ b/jdk/test/com/sun/jdi/EarlyReturnTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/ImmutableResourceTest.sh b/jdk/test/com/sun/jdi/ImmutableResourceTest.sh index 527de199bc9..fa312adad74 100644 --- a/jdk/test/com/sun/jdi/ImmutableResourceTest.sh +++ b/jdk/test/com/sun/jdi/ImmutableResourceTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/JITDebug.sh b/jdk/test/com/sun/jdi/JITDebug.sh index 135978080ba..0ec359799a6 100644 --- a/jdk/test/com/sun/jdi/JITDebug.sh +++ b/jdk/test/com/sun/jdi/JITDebug.sh @@ -1,7 +1,7 @@ #!/bin/ksh -p # -# Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/MethodEntryExitEvents.java b/jdk/test/com/sun/jdi/MethodEntryExitEvents.java index 8f1ac42dd68..a1c67cbfdd4 100644 --- a/jdk/test/com/sun/jdi/MethodEntryExitEvents.java +++ b/jdk/test/com/sun/jdi/MethodEntryExitEvents.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java b/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java index 5047e126d72..af0d937b61c 100644 --- a/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java +++ b/jdk/test/com/sun/jdi/MethodExitReturnValuesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/PrivateTransportTest.sh b/jdk/test/com/sun/jdi/PrivateTransportTest.sh index 868d86447ad..64459008826 100644 --- a/jdk/test/com/sun/jdi/PrivateTransportTest.sh +++ b/jdk/test/com/sun/jdi/PrivateTransportTest.sh @@ -1,7 +1,7 @@ #!/bin/ksh -p # -# Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/ShellScaffold.sh b/jdk/test/com/sun/jdi/ShellScaffold.sh index 4e664c7a17d..d8635e3dda9 100644 --- a/jdk/test/com/sun/jdi/ShellScaffold.sh +++ b/jdk/test/com/sun/jdi/ShellScaffold.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh b/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh index 457d26c4109..7e03dfb652e 100644 --- a/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh +++ b/jdk/test/com/sun/jdi/Solaris32AndSolaris64Test.sh @@ -1,7 +1,7 @@ #!/bin/ksh -p # -# Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh b/jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh index f68fc943da1..6222c80bd14 100644 --- a/jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh +++ b/jdk/test/com/sun/jdi/connect/spi/JdiLoadedByCustomLoader.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java b/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java new file mode 100644 index 00000000000..0db3ab9239c --- /dev/null +++ b/jdk/test/com/sun/jndi/ldap/LdapTimeoutTest.java @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 7094377 8000487 6176036 7056489 + * @summary Timeout tests for ldap + */ + +import java.net.Socket; +import java.net.ServerSocket; +import java.net.SocketTimeoutException; +import java.io.*; +import javax.naming.*; +import javax.naming.directory.*; +import java.util.Hashtable; +import java.util.concurrent.Callable; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public class LdapTimeoutTest { + private static final ScheduledExecutorService pool = + Executors.newScheduledThreadPool(1); + static volatile int passed = 0, failed = 0; + static void pass() {passed++;} + static void fail() {failed++; Thread.dumpStack();} + + public static void main(String[] args) throws Exception { + ServerSocket serverSock = new ServerSocket(0); + Server s = new Server(serverSock); + s.start(); + Thread.sleep(200); + + Hashtable env = new Hashtable(11); + env.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + env.put(Context.PROVIDER_URL, "ldap://localhost:" + + serverSock.getLocalPort()); + + env.put(Context.SECURITY_AUTHENTICATION,"simple"); + + env.put(Context.SECURITY_PRINCIPAL, "user"); + env.put(Context.SECURITY_CREDENTIALS, "password"); + + env.put("com.sun.jndi.ldap.connect.timeout", "10"); + env.put("com.sun.jndi.ldap.read.timeout", "3000"); + + InitialContext ctx = null; + try { + new LdapTimeoutTest().ldapReadTimeoutTest(env, false); + new LdapTimeoutTest().ldapReadTimeoutTest(env, true); + new LdapTimeoutTest().simpleAuthConnectTest(env); + } finally { + s.interrupt(); + LdapTimeoutTest.pool.shutdown(); + } + + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed"); + } + + void ldapReadTimeoutTest(Hashtable env, boolean ssl) { + InitialContext ctx = null; + if (ssl) env.put(Context.SECURITY_PROTOCOL, "ssl"); + ScheduledFuture killer = killSwitch(); + long start = System.nanoTime(); + try { + ctx = new InitialDirContext(env); + SearchControls scl = new SearchControls(); + scl.setSearchScope(SearchControls.SUBTREE_SCOPE); + NamingEnumeration answer = ((InitialDirContext)ctx) + .search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); + // shouldn't reach here + fail(); + } catch (NamingException e) { + if (ssl) { + if (e.getCause() instanceof SocketTimeoutException) { + pass(); + } else if (e.getCause() instanceof InterruptedIOException) { + Thread.interrupted(); + fail(); + } + } else { + pass(); + } + } finally { + if (!shutItDown(killer, ctx)) fail(); + } + } + + void simpleAuthConnectTest(Hashtable env) { + InitialContext ctx = null; + ScheduledFuture killer = killSwitch(); + long start = System.nanoTime(); + try { + ctx = new InitialDirContext(env); + // shouldn't reach here + System.err.println("Fail: InitialDirContext succeeded"); + fail(); + } catch (NamingException e) { + long end = System.nanoTime(); + if (e.getCause() instanceof SocketTimeoutException) { + if (TimeUnit.NANOSECONDS.toMillis(end - start) < 2900) { + pass(); + } else { + System.err.println("Fail: Waited too long"); + fail(); + } + } else if (e.getCause() instanceof InterruptedIOException) { + Thread.interrupted(); + fail(); + } else { + fail(); + } + } finally { + if (!shutItDown(killer, ctx)) fail(); + } + } + + boolean shutItDown(ScheduledFuture killer, InitialContext ctx) { + killer.cancel(true); + try { + if (ctx != null) ctx.close(); + return true; + } catch (NamingException ex) { + return false; + } + } + + ScheduledFuture killSwitch() { + final Thread current = Thread.currentThread(); + return LdapTimeoutTest.pool.schedule(new Callable() { + public Void call() throws Exception { + System.err.println("Fail: killSwitch()"); + current.interrupt(); + return null; + } + }, 5000, TimeUnit.MILLISECONDS); + } + + static class Server extends Thread { + final ServerSocket serverSock; + + Server(ServerSocket serverSock) { + this.serverSock = serverSock; + } + + public void run() { + try { + Socket socket = serverSock.accept(); + } catch (IOException e) {} + } + } +} + diff --git a/jdk/test/com/sun/jndi/ldap/LdapsReadTimeoutTest.java b/jdk/test/com/sun/jndi/ldap/LdapsReadTimeoutTest.java deleted file mode 100644 index 9fae77da009..00000000000 --- a/jdk/test/com/sun/jndi/ldap/LdapsReadTimeoutTest.java +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 7094377 - * @summary Com.sun.jndi.ldap.read.timeout doesn't work with ldaps. - */ - -import java.net.Socket; -import java.net.ServerSocket; -import java.io.*; -import javax.naming.*; -import javax.naming.directory.*; -import java.util.Hashtable; - -public class LdapsReadTimeoutTest { - - public static void main(String[] args) throws Exception { - boolean passed = false; - - // create the server - try (Server server = Server.create()) { - // Set up the environment for creating the initial context - Hashtable env = new Hashtable<>(11); - env.put(Context.INITIAL_CONTEXT_FACTORY, - "com.sun.jndi.ldap.LdapCtxFactory"); - env.put("com.sun.jndi.ldap.connect.timeout", "1000"); - env.put("com.sun.jndi.ldap.read.timeout", "1000"); - env.put(Context.PROVIDER_URL, "ldaps://localhost:" + server.port()); - - - // Create initial context - DirContext ctx = new InitialDirContext(env); - try { - System.out.println("LDAP Client: Connected to the Server"); - - SearchControls scl = new SearchControls(); - scl.setSearchScope(SearchControls.SUBTREE_SCOPE); - System.out.println("Performing Search"); - NamingEnumeration answer = - ctx.search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); - } finally { - // Close the context when we're done - ctx.close(); - } - } catch (NamingException e) { - passed = true; - e.printStackTrace(); - } - - if (!passed) { - throw new Exception("Read timeout test failed," + - " read timeout exception not thrown"); - } - System.out.println("The test PASSED"); - } - - static class Server implements Runnable, Closeable { - private final ServerSocket ss; - private Socket sref; - - private Server(ServerSocket ss) { - this.ss = ss; - } - - static Server create() throws IOException { - Server server = new Server(new ServerSocket(0)); - new Thread(server).start(); - return server; - } - - int port() { - return ss.getLocalPort(); - } - - public void run() { - try (Socket s = ss.accept()) { - sref = s; - System.out.println("Server: Connection accepted"); - BufferedInputStream bis = - new BufferedInputStream(s.getInputStream()); - byte[] buf = new byte[100]; - int n; - do { - n = bis.read(buf); - } while (n > 0); - } catch (IOException e) { - // ignore - } - } - - public void close() throws IOException { - ss.close(); - sref.close(); - } - } -} diff --git a/jdk/test/com/sun/jndi/ldap/ReadTimeoutTest.java b/jdk/test/com/sun/jndi/ldap/ReadTimeoutTest.java deleted file mode 100644 index 20e29173380..00000000000 --- a/jdk/test/com/sun/jndi/ldap/ReadTimeoutTest.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/** - * @test - * @bug 6176036 7056489 - * @summary Read-timeout specification for LDAP operations - */ - -import java.net.Socket; -import java.net.ServerSocket; -import java.io.*; -import javax.naming.*; -import javax.naming.directory.*; -import java.util.Hashtable; - -public class ReadTimeoutTest { - - public static void main(String[] args) throws Exception { - boolean passed = false; - - // create the server - try (Server server = Server.create()) { - // Set up the environment for creating the initial context - Hashtable env = new Hashtable<>(11); - env.put(Context.INITIAL_CONTEXT_FACTORY, - "com.sun.jndi.ldap.LdapCtxFactory"); - env.put("com.sun.jndi.ldap.read.timeout", "1000"); - env.put(Context.PROVIDER_URL, "ldap://localhost:" + server.port()); - - - // Create initial context - DirContext ctx = new InitialDirContext(env); - try { - System.out.println("LDAP Client: Connected to the Server"); - - SearchControls scl = new SearchControls(); - scl.setSearchScope(SearchControls.SUBTREE_SCOPE); - System.out.println("Performing Search"); - NamingEnumeration answer = - ctx.search("ou=People,o=JNDITutorial", "(objectClass=*)", scl); - } finally { - // Close the context when we're done - ctx.close(); - } - } catch (NamingException e) { - passed = true; - e.printStackTrace(); - } - - if (!passed) { - throw new Exception("Read timeout test failed," + - " read timeout exception not thrown"); - } - System.out.println("The test PASSED"); - } - - static class Server implements Runnable, Closeable { - private final ServerSocket ss; - - private Server(ServerSocket ss) { - this.ss = ss; - } - - static Server create() throws IOException { - Server server = new Server(new ServerSocket(0)); - new Thread(server).start(); - return server; - } - - int port() { - return ss.getLocalPort(); - } - - public void run() { - try (Socket s = ss.accept()) { - System.out.println("Server: Connection accepted"); - BufferedInputStream bis = new BufferedInputStream(s.getInputStream()); - byte[] buf = new byte[100]; - int n; - do { - n = bis.read(buf); - } while (n > 0); - } catch (IOException e) { - // ignore - } - } - - public void close() throws IOException { - ss.close(); - } - } -} diff --git a/jdk/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh b/jdk/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh index 009be0034eb..15faf704085 100644 --- a/jdk/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh +++ b/jdk/test/com/sun/management/OperatingSystemMXBean/TestTotalSwap.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/net/httpserver/Test1.java b/jdk/test/com/sun/net/httpserver/Test1.java index e0da2cebe4a..aa1c3969a2d 100644 --- a/jdk/test/com/sun/net/httpserver/Test1.java +++ b/jdk/test/com/sun/net/httpserver/Test1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/net/httpserver/Test10.java b/jdk/test/com/sun/net/httpserver/Test10.java index d5846bda9b8..36f2a80e09b 100644 --- a/jdk/test/com/sun/net/httpserver/Test10.java +++ b/jdk/test/com/sun/net/httpserver/Test10.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/net/httpserver/bugs/B6373555.java b/jdk/test/com/sun/net/httpserver/bugs/B6373555.java index 9bfcd26d3a2..cef94781975 100644 --- a/jdk/test/com/sun/net/httpserver/bugs/B6373555.java +++ b/jdk/test/com/sun/net/httpserver/bugs/B6373555.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java b/jdk/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java index 2ab14ac5b14..df1cbcc5550 100644 --- a/jdk/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java +++ b/jdk/test/com/sun/nio/sctp/SctpChannel/SocketOptionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/nio/sctp/SctpMultiChannel/SocketOptionTests.java b/jdk/test/com/sun/nio/sctp/SctpMultiChannel/SocketOptionTests.java index fdb0e72ab4c..8f7c6fcb8b6 100644 --- a/jdk/test/com/sun/nio/sctp/SctpMultiChannel/SocketOptionTests.java +++ b/jdk/test/com/sun/nio/sctp/SctpMultiChannel/SocketOptionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/security/auth/login/ConfigFile/IllegalURL.java b/jdk/test/com/sun/security/auth/login/ConfigFile/IllegalURL.java index 5e7fb6e1b45..883ab168811 100644 --- a/jdk/test/com/sun/security/auth/login/ConfigFile/IllegalURL.java +++ b/jdk/test/com/sun/security/auth/login/ConfigFile/IllegalURL.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/security/sasl/digest/Unbound.java b/jdk/test/com/sun/security/sasl/digest/Unbound.java new file mode 100644 index 00000000000..e23376986cd --- /dev/null +++ b/jdk/test/com/sun/security/sasl/digest/Unbound.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7110803 + * @summary SASL service for multiple hostnames + * @run main Unbound jmx + * @run main/fail Unbound j + */ +import javax.security.sasl.*; +import javax.security.auth.callback.*; +import java.util.*; + +public class Unbound { + private static final String MECH = "DIGEST-MD5"; + private static final String SERVER_FQDN = "machineX.imc.org"; + private static final String PROTOCOL = "jmx"; + + private static final byte[] EMPTY = new byte[0]; + + private static String pwfile, namesfile, proxyfile; + private static boolean auto; + private static boolean verbose = false; + + private static void init(String[] args) throws Exception { + if (args.length == 1) { + pwfile = "pw.properties"; + namesfile = "names.properties"; + auto = true; + } else { + int i = 1; + if (args[i].equals("-m")) { + i++; + auto = false; + } + if (args.length > i) { + pwfile = args[i++]; + + if (args.length > i) { + namesfile = args[i++]; + + if (args.length > i) { + proxyfile = args[i]; + } + } + } else { + pwfile = "pw.properties"; + namesfile = "names.properties"; + } + } + } + + public static void main(String[] args) throws Exception { + + init(args); + + CallbackHandler clntCbh = new ClientCallbackHandler(auto); + + CallbackHandler srvCbh = + new PropertiesFileCallbackHandler(pwfile, namesfile, proxyfile); + + SaslClient clnt = Sasl.createSaslClient( + new String[]{MECH}, null, PROTOCOL, SERVER_FQDN, null, clntCbh); + + Map props = System.getProperties(); + props.put("com.sun.security.sasl.digest.realm", SERVER_FQDN); + + SaslServer srv = Sasl.createSaslServer(MECH, args[0], null, props, + srvCbh); + + if (clnt == null) { + throw new IllegalStateException( + "Unable to find client impl for " + MECH); + } + if (srv == null) { + throw new IllegalStateException( + "Unable to find server impl for " + MECH); + } + + byte[] response = (clnt.hasInitialResponse()? + clnt.evaluateChallenge(EMPTY) : EMPTY); + byte[] challenge; + + while (!clnt.isComplete() || !srv.isComplete()) { + challenge = srv.evaluateResponse(response); + + if (challenge != null) { + response = clnt.evaluateChallenge(challenge); + } + } + + if (clnt.isComplete() && srv.isComplete()) { + if (verbose) { + System.out.println("SUCCESS"); + System.out.println("authzid is " + srv.getAuthorizationID()); + } + } else { + throw new IllegalStateException( + "FAILURE: mismatched state:" + + " client complete? " + clnt.isComplete() + + " server complete? " + srv.isComplete()); + } + + if (!SERVER_FQDN.equalsIgnoreCase((String) + srv.getNegotiatedProperty(Sasl.BOUND_SERVER_NAME))) { + throw new Exception("Server side gets wrong requested server name"); + } + clnt.dispose(); + srv.dispose(); + } +} diff --git a/jdk/test/com/sun/servicetag/JavaServiceTagTest.java b/jdk/test/com/sun/servicetag/JavaServiceTagTest.java index 6122b14d13c..a411fa973ee 100644 --- a/jdk/test/com/sun/servicetag/JavaServiceTagTest.java +++ b/jdk/test/com/sun/servicetag/JavaServiceTagTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/servicetag/JavaServiceTagTest1.java b/jdk/test/com/sun/servicetag/JavaServiceTagTest1.java index ffe3744ccd3..d220bf0bc41 100644 --- a/jdk/test/com/sun/servicetag/JavaServiceTagTest1.java +++ b/jdk/test/com/sun/servicetag/JavaServiceTagTest1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/com/sun/tools/attach/CommonSetup.sh b/jdk/test/com/sun/tools/attach/CommonSetup.sh index a37d0d10424..13554918178 100644 --- a/jdk/test/com/sun/tools/attach/CommonSetup.sh +++ b/jdk/test/com/sun/tools/attach/CommonSetup.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/demo/zipfs/basic.sh b/jdk/test/demo/zipfs/basic.sh index 7188c181ed8..b222f87bd2e 100644 --- a/jdk/test/demo/zipfs/basic.sh +++ b/jdk/test/demo/zipfs/basic.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/awt/Frame/7024749/bug7024749.java b/jdk/test/java/awt/Frame/7024749/bug7024749.java index 5eb28b6723d..4e7f682aeec 100644 --- a/jdk/test/java/awt/Frame/7024749/bug7024749.java +++ b/jdk/test/java/awt/Frame/7024749/bug7024749.java @@ -25,7 +25,7 @@ * @test * @bug 7024749 * @summary JDK7 b131---a crash in: Java_sun_awt_windows_ThemeReader_isGetThemeTransitionDurationDefined+0x75 - * @library ../../../regtesthelpers + * @library ../../regtesthelpers * @build Util * @author Oleg Pekhovskiy: area=awt.toplevel @run main bug7024749 diff --git a/jdk/test/java/awt/GraphicsConfiguration/NormalizingTransformTest/NormalizingTransformTest.java b/jdk/test/java/awt/GraphicsConfiguration/NormalizingTransformTest/NormalizingTransformTest.java new file mode 100644 index 00000000000..0e5e46b789b --- /dev/null +++ b/jdk/test/java/awt/GraphicsConfiguration/NormalizingTransformTest/NormalizingTransformTest.java @@ -0,0 +1,55 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 6373505 + * @summary Tests that the result of Toolkit.getScreenResolution() is + * consistent with GraphicsConfiguration.getNormalizingTransform(). + * @author Dmitri.Trembovetski@Sun.COM: area=GraphicsConfiguration + * @run main NormalizingTransformTest + */ + +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.awt.Toolkit; +import java.awt.geom.AffineTransform; + +public class NormalizingTransformTest { + + public static void main(String[] args) { + GraphicsConfiguration gc = + GraphicsEnvironment.getLocalGraphicsEnvironment(). + getDefaultScreenDevice().getDefaultConfiguration(); + AffineTransform normTransform = gc.getNormalizingTransform(); + int dpiX = Toolkit.getDefaultToolkit().getScreenResolution(); + int normDpiX = (int)(normTransform.getScaleX() * 72.0); + if (dpiX != normDpiX) { + throw new RuntimeException( + "Test FAILED. Toolkit.getScreenResolution()=" + dpiX + + " GraphicsConfiguration.getNormalizingTransform()="+normDpiX); + } + System.out.println("Test PASSED. DPI="+normDpiX); + } + +} diff --git a/jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh b/jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh index 71c8fa7fcc2..148041c2825 100644 --- a/jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh +++ b/jdk/test/java/awt/Toolkit/AutoShutdown/ShowExitTest/ShowExitTest.sh @@ -1,7 +1,7 @@ #!/bin/ksh -p # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ status=1 #Call this from anywhere to fail the test with an error message # usage: fail "reason why the test failed" -fail() +fail() { echo "The test failed :-(" echo "$*" 1>&2 echo "exit status was $status" @@ -48,7 +48,7 @@ fail() #Call this from anywhere to pass the test with a message # usage: pass "reason why the test passed if applicable" -pass() +pass() { echo "The test passed!!!" echo "$*" 1>&2 exit 0 @@ -64,20 +64,42 @@ OS=`uname -s` case "$OS" in SunOS ) VAR="One value for Sun" - DEFAULT_JDK=/usr/local/java/jdk1.2/solaris + DEFAULT_JDK=/ FILESEP="/" + PATHSEP=":" + TMP="/tmp" ;; Linux ) VAR="A different value for Linux" - DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 + DEFAULT_JDK=/ FILESEP="/" + PATHSEP=":" + TMP="/tmp" ;; - Windows_95 | Windows_98 | Windows_NT | Windows_ME ) + Darwin ) + VAR="A different value for MacOSX" + DEFAULT_JDK=/usr + FILESEP="/" + PATHSEP=":" + TMP="/tmp" + ;; + + Windows* ) VAR="A different value for Win32" - DEFAULT_JDK=/usr/local/java/jdk1.2/win32 + DEFAULT_JDK="C:/Program Files/Java/jdk1.8.0" FILESEP="\\" + PATHSEP=";" + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` + ;; + + CYGWIN* ) + VAR="A different value for Cygwin" + DEFAULT_JDK="/cygdrive/c/Program\ Files/Java/jdk1.8.0" + FILESEP="/" + PATHSEP=";" + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` ;; # catch all other OSs @@ -88,8 +110,8 @@ case "$OS" in esac -# Want this test to run standalone as well as in the harness, so do the -# following to copy the test's directory into the harness's scratch directory +# Want this test to run standalone as well as in the harness, so do the +# following to copy the test's directory into the harness's scratch directory # and set all appropriate variables: if [ -z "${TESTJAVA}" ] ; then @@ -104,7 +126,7 @@ if [ -z "${TESTJAVA}" ] ; then if [ -n "$1" ] ; then TESTJAVA=$1 else echo "no JDK specified on command line so using default!" - TESTJAVA=$DEFAULT_JDK + TESTJAVA=$DEFAULT_JDK fi TESTSRC=. TESTCLASSES=. @@ -113,25 +135,25 @@ fi echo "JDK under test is: $TESTJAVA" #Deal with .class files: -if [ -n "${STANDALONE}" ] ; - then +if [ -n "${STANDALONE}" ] ; + then #if standalone, remind user to cd to dir. containing test before running it echo "Just a reminder: cd to the dir containing this test when running it" # then compile all .java files (if there are any) into .class files - if [ -a *.java ] ; + if [ -a *.java ] ; then echo "Reminder, this test should be in its own directory with all" echo "supporting files it needs in the directory with it." - ${TESTJAVA}/bin/javac ./*.java ; + ${TESTJAVA}/bin/javac ./*.java ; fi # else in harness so copy all the class files from where jtreg put them - # over to the scratch directory this test is running in. + # over to the scratch directory this test is running in. else cp ${TESTCLASSES}/*.class . ; fi -#if in test harness, then copy the entire directory that the test is in over +#if in test harness, then copy the entire directory that the test is in over # to the scratch directory. This catches any support files needed by the test. -if [ -z "${STANDALONE}" ] ; - then cp ${TESTSRC}/* . +if [ -z "${STANDALONE}" ] ; + then cp ${TESTSRC}/* . fi #Just before executing anything, make sure it has executable permission! diff --git a/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.java b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.java new file mode 100644 index 00000000000..a5bed9c1331 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +/* + * @test + * @summary Test that Toolkit.getDefaultToolkit throws AWTError exception if bad DISPLAY variable was set + * @bug 6818083 + * + * @run shell/timeout=240 BadDisplayTest.sh + */ + +import java.awt.*; + +public class BadDisplayTest{ + public static void main(String[] args) { + + Throwable th = null; + try { + Toolkit.getDefaultToolkit(); + } catch (Throwable x) { + th = x; + } + if ( !(th instanceof AWTError)) { + System.exit(1); + } + } +} diff --git a/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh new file mode 100644 index 00000000000..f4a54d300c7 --- /dev/null +++ b/jdk/test/java/awt/Toolkit/BadDisplayTest/BadDisplayTest.sh @@ -0,0 +1,42 @@ +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. + +${TESTJAVA}/bin/javac -cp ${TESTSRC} -d . ${TESTSRC}/BadDisplayTest.java + + +export DISPLAY= + +OS=`uname -s` +case "$OS" in + SunOS ) + ${TESTJAVA}/bin/java BadDisplayTest + ;; + Linux ) + ${TESTJAVA}/bin/java BadDisplayTest + ;; + * ) + echo "Unsupported System: ${OS}" + exit 0; + ;; +esac + +exit $? + diff --git a/jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh b/jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh index 0e22776b1ac..923cac5f845 100644 --- a/jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh +++ b/jdk/test/java/awt/appletviewer/IOExceptionIfEncodedURLTest/IOExceptionIfEncodedURLTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ status=1 #Call this from anywhere to fail the test with an error message # usage: fail "reason why the test failed" -fail() +fail() { echo "The test failed :-(" echo "$*" 1>&2 echo "exit status was $status" @@ -47,7 +47,7 @@ fail() #Call this from anywhere to pass the test with a message # usage: pass "reason why the test passed if applicable" -pass() +pass() { echo "The test passed!!!" echo "$*" 1>&2 exit 0 @@ -99,20 +99,42 @@ OS=`uname -s` case "$OS" in SunOS ) VAR="One value for Sun" - DEFAULT_JDK=/usr/local/java/jdk1.2.1/solaris + DEFAULT_JDK=/ FILESEP="/" + PATHSEP=":" + TMP="/tmp" ;; Linux ) VAR="A different value for Linux" - DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 + DEFAULT_JDK=/ FILESEP="/" + PATHSEP=":" + TMP="/tmp" ;; - Windows_95 | Windows_98 | Windows_NT | Windows_ME | CYGWIN_NT-5.1) + Darwin ) + VAR="A different value for MacOSX" + DEFAULT_JDK=/usr + FILESEP="/" + PATHSEP=":" + TMP="/tmp" + ;; + + Windows* ) VAR="A different value for Win32" - DEFAULT_JDK=/usr/local/java/jdk1.2.1/win32 + DEFAULT_JDK="C:/Program Files/Java/jdk1.8.0" FILESEP="\\" + PATHSEP=";" + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` + ;; + + CYGWIN* ) + VAR="A different value for Cygwin" + DEFAULT_JDK="/cygdrive/c/Program\ Files/Java/jdk1.8.0" + FILESEP="/" + PATHSEP=";" + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` ;; # catch all other OSs @@ -132,12 +154,12 @@ fi # note that the name of the executable is in the fail string as well. # this is how to check for presence of the compiler, etc. #RESOURCE=`whence SomeProgramOrFileNeeded` -#if [ "${RESOURCE}" = "" ] ; -# then fail "Need SomeProgramOrFileNeeded to perform the test" ; +#if [ "${RESOURCE}" = "" ] ; +# then fail "Need SomeProgramOrFileNeeded to perform the test" ; #fi -# Want this test to run standalone as well as in the harness, so do the -# following to copy the test's directory into the harness's scratch directory +# Want this test to run standalone as well as in the harness, so do the +# following to copy the test's directory into the harness's scratch directory # and set all appropriate variables: if [ -z "${TESTJAVA}" ] ; then @@ -152,7 +174,7 @@ if [ -z "${TESTJAVA}" ] ; then if [ -n "$1" ] ; then TESTJAVA=$1 else echo "no JDK specified on command line so using default!" - TESTJAVA=$DEFAULT_JDK + TESTJAVA=$DEFAULT_JDK fi TESTSRC=. TESTCLASSES=. @@ -161,25 +183,25 @@ fi echo "JDK under test is: $TESTJAVA" #Deal with .class files: -if [ -n "${STANDALONE}" ] ; - then +if [ -n "${STANDALONE}" ] ; + then #if standalone, remind user to cd to dir. containing test before running it echo "Just a reminder: cd to the dir containing this test when running it" # then compile all .java files (if there are any) into .class files - if [ -a *.java ] ; + if [ -a *.java ] ; then echo "Reminder, this test should be in its own directory with all" echo "supporting files it needs in the directory with it." - ${TESTJAVA}/bin/javac ./*.java ; + ${TESTJAVA}/bin/javac ./*.java ; fi # else in harness so copy all the class files from where jtreg put them - # over to the scratch directory this test is running in. + # over to the scratch directory this test is running in. else cp ${TESTCLASSES}/*.class . ; fi -#if in test harness, then copy the entire directory that the test is in over +#if in test harness, then copy the entire directory that the test is in over # to the scratch directory. This catches any support files needed by the test. -#if [ -z "${STANDALONE}" ] ; -# then cp ${TESTSRC}/* . +#if [ -z "${STANDALONE}" ] ; +# then cp ${TESTSRC}/* . #fi #Just before executing anything, make sure it has executable permission! @@ -198,7 +220,7 @@ chmod 777 ./* # this shell test as appropriate ( 0 status is considered a pass here ) # The test verifies that appletviewer correctly works with the different -# names of the files, including relative and absolute paths +# names of the files, including relative and absolute paths # 6619458: exclude left brace from the name of the files managed by the VCS NAME='test.html' diff --git a/jdk/test/java/io/File/MaxPathLength.java b/jdk/test/java/io/File/MaxPathLength.java index af8323a365b..4111550bbd2 100644 --- a/jdk/test/java/io/File/MaxPathLength.java +++ b/jdk/test/java/io/File/MaxPathLength.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/File/basic.sh b/jdk/test/java/io/File/basic.sh index 07bea7c80df..74a0f71b614 100644 --- a/jdk/test/java/io/File/basic.sh +++ b/jdk/test/java/io/File/basic.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/FileInputStream/LargeFileAvailable.java b/jdk/test/java/io/FileInputStream/LargeFileAvailable.java index b6fbe4d57d3..90eed30d1dc 100644 --- a/jdk/test/java/io/FileInputStream/LargeFileAvailable.java +++ b/jdk/test/java/io/FileInputStream/LargeFileAvailable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/IOException/LastErrorString.java b/jdk/test/java/io/IOException/LastErrorString.java index 3d6d9edb934..3c769cd8063 100644 --- a/jdk/test/java/io/IOException/LastErrorString.java +++ b/jdk/test/java/io/IOException/LastErrorString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/badSubstByReplace/BadSubstByReplace.java b/jdk/test/java/io/Serializable/badSubstByReplace/BadSubstByReplace.java index ce78220ee76..a943df1f913 100644 --- a/jdk/test/java/io/Serializable/badSubstByReplace/BadSubstByReplace.java +++ b/jdk/test/java/io/Serializable/badSubstByReplace/BadSubstByReplace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh b/jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh index 8fdbf2af3bf..13c4387f7a4 100644 --- a/jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh +++ b/jdk/test/java/io/Serializable/evolution/RenamePackage/run.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/expectedStackTrace/ExpectedStackTrace.java b/jdk/test/java/io/Serializable/expectedStackTrace/ExpectedStackTrace.java index 2c68ce0d811..3021ba90d26 100644 --- a/jdk/test/java/io/Serializable/expectedStackTrace/ExpectedStackTrace.java +++ b/jdk/test/java/io/Serializable/expectedStackTrace/ExpectedStackTrace.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/replaceStringArray/ReplaceStringArray.java b/jdk/test/java/io/Serializable/replaceStringArray/ReplaceStringArray.java index 11b2d6d9f1f..1dc432bcc8f 100644 --- a/jdk/test/java/io/Serializable/replaceStringArray/ReplaceStringArray.java +++ b/jdk/test/java/io/Serializable/replaceStringArray/ReplaceStringArray.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/replaceWithNull/ReplaceWithNull.java b/jdk/test/java/io/Serializable/replaceWithNull/ReplaceWithNull.java index 896900b2d62..0641a107883 100644 --- a/jdk/test/java/io/Serializable/replaceWithNull/ReplaceWithNull.java +++ b/jdk/test/java/io/Serializable/replaceWithNull/ReplaceWithNull.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/serialver/classpath/run.sh b/jdk/test/java/io/Serializable/serialver/classpath/run.sh index ef762f2ba39..8c6b9f3d0be 100644 --- a/jdk/test/java/io/Serializable/serialver/classpath/run.sh +++ b/jdk/test/java/io/Serializable/serialver/classpath/run.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/serialver/nested/run.sh b/jdk/test/java/io/Serializable/serialver/nested/run.sh index 7a0274ba4fa..765d2d41c41 100644 --- a/jdk/test/java/io/Serializable/serialver/nested/run.sh +++ b/jdk/test/java/io/Serializable/serialver/nested/run.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/Serializable/verifyDynamicObjHandleTable/VerifyDynamicObjHandleTable.java b/jdk/test/java/io/Serializable/verifyDynamicObjHandleTable/VerifyDynamicObjHandleTable.java index 3e8156b0728..80933edd12d 100644 --- a/jdk/test/java/io/Serializable/verifyDynamicObjHandleTable/VerifyDynamicObjHandleTable.java +++ b/jdk/test/java/io/Serializable/verifyDynamicObjHandleTable/VerifyDynamicObjHandleTable.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/io/pathNames/win32/bug6344646.java b/jdk/test/java/io/pathNames/win32/bug6344646.java index d39dd40cf36..30f5aa25e49 100644 --- a/jdk/test/java/io/pathNames/win32/bug6344646.java +++ b/jdk/test/java/io/pathNames/win32/bug6344646.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,7 +23,7 @@ /* @test * @bug 6344646 - * @summary tests that Win32FileSystem.hashCode() uses + * @summary tests that WinNTFileSystem.hashCode() uses * locale independent case mapping. */ diff --git a/jdk/test/java/lang/Character/CheckProp.java b/jdk/test/java/lang/Character/CheckProp.java index db511f9cc6b..ee1b6492fb4 100644 --- a/jdk/test/java/lang/Character/CheckProp.java +++ b/jdk/test/java/lang/Character/CheckProp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/Character/CheckScript.java b/jdk/test/java/lang/Character/CheckScript.java index 3678aee4bed..147f931e988 100644 --- a/jdk/test/java/lang/Character/CheckScript.java +++ b/jdk/test/java/lang/Character/CheckScript.java @@ -1,6 +1,6 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh b/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh index e5170c74bd0..17940eabf31 100644 --- a/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh +++ b/jdk/test/java/lang/ClassLoader/deadlock/TestCrossDelegate.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh b/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh index 06126d0ba55..5c2f0172daf 100644 --- a/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh +++ b/jdk/test/java/lang/ClassLoader/deadlock/TestOneWayDelegate.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/Double/ToHexString.java b/jdk/test/java/lang/Double/ToHexString.java index c9fb07e9587..2dab65047a2 100644 --- a/jdk/test/java/lang/Double/ToHexString.java +++ b/jdk/test/java/lang/Double/ToHexString.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/ProcessBuilder/Basic.java b/jdk/test/java/lang/ProcessBuilder/Basic.java index ff7f0512725..8ad7bd93709 100644 --- a/jdk/test/java/lang/ProcessBuilder/Basic.java +++ b/jdk/test/java/lang/ProcessBuilder/Basic.java @@ -36,10 +36,12 @@ import java.lang.ProcessBuilder.Redirect; import static java.lang.ProcessBuilder.Redirect.*; import java.io.*; +import java.lang.reflect.Field; import java.util.*; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit; import java.security.*; +import sun.misc.Unsafe; import java.util.regex.Pattern; import java.util.regex.Matcher; import static java.lang.System.getenv; @@ -1938,17 +1940,21 @@ public class Basic { final byte[] bytes = new byte[10]; final Process p = new ProcessBuilder(childArgs).start(); final CountDownLatch latch = new CountDownLatch(1); + final InputStream s; + switch (action & 0x1) { + case 0: s = p.getInputStream(); break; + case 1: s = p.getErrorStream(); break; + default: throw new Error(); + } final Thread thread = new Thread() { public void run() { try { - latch.countDown(); int r; - switch (action) { - case 0: r = p.getInputStream().read(); break; - case 1: r = p.getErrorStream().read(); break; - case 2: r = p.getInputStream().read(bytes); break; - case 3: r = p.getErrorStream().read(bytes); break; - default: throw new Error(); + latch.countDown(); + switch (action & 0x2) { + case 0: r = s.read(); break; + case 2: r = s.read(bytes); break; + default: throw new Error(); } equal(-1, r); } catch (Throwable t) { unexpected(t); }}}; @@ -1956,6 +1962,40 @@ public class Basic { thread.start(); latch.await(); Thread.sleep(10); + + String os = System.getProperty("os.name"); + if (os.equalsIgnoreCase("Solaris") || + os.equalsIgnoreCase("SunOS")) + { + final Object deferred; + Class c = s.getClass(); + if (c.getName().equals( + "java.lang.UNIXProcess$DeferredCloseInputStream")) + { + deferred = s; + } else { + Field deferredField = p.getClass(). + getDeclaredField("stdout_inner_stream"); + deferredField.setAccessible(true); + deferred = deferredField.get(p); + } + Field useCountField = deferred.getClass(). + getDeclaredField("useCount"); + useCountField.setAccessible(true); + + while (useCountField.getInt(deferred) <= 0) { + Thread.yield(); + } + } else if (s instanceof BufferedInputStream) { + Field f = Unsafe.class.getDeclaredField("theUnsafe"); + f.setAccessible(true); + Unsafe unsafe = (Unsafe)f.get(null); + + while (unsafe.tryMonitorEnter(s)) { + unsafe.monitorExit(s); + Thread.sleep(1); + } + } p.destroy(); thread.join(); } diff --git a/jdk/test/java/lang/Runtime/exec/StreamsSurviveDestroy.java b/jdk/test/java/lang/Runtime/exec/StreamsSurviveDestroy.java index 3b51171fd1c..27e5ae83eb8 100644 --- a/jdk/test/java/lang/Runtime/exec/StreamsSurviveDestroy.java +++ b/jdk/test/java/lang/Runtime/exec/StreamsSurviveDestroy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/StringBuffer/AppendStringBuilder.java b/jdk/test/java/lang/StringBuffer/AppendStringBuilder.java new file mode 100644 index 00000000000..a27f6a12a28 --- /dev/null +++ b/jdk/test/java/lang/StringBuffer/AppendStringBuilder.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* @test + * @bug 6206780 + * @summary Test StringBuffer.append(StringBuilder); + */ + +import java.util.Random; + +public class AppendStringBuilder { + private static Random generator = new Random(); + + public static void main(String[] args) throws Exception { + for (int i=0; i<1000; i++) { + StringBuilder sb1 = generateTestBuilder(10, 100); + StringBuilder sb2 = generateTestBuilder(10, 100); + StringBuilder sb3 = generateTestBuilder(10, 100); + String s1 = sb1.toString(); + String s2 = sb2.toString(); + String s3 = sb3.toString(); + + String concatResult = new String(s1+s2+s3); + + StringBuffer test = new StringBuffer(); + test.append(sb1); + test.append(sb2); + test.append(sb3); + + if (!test.toString().equals(concatResult)) + throw new RuntimeException("StringBuffer.append failure"); + } + } + + private static int getRandomIndex(int constraint1, int constraint2) { + int range = constraint2 - constraint1; + int x = generator.nextInt(range); + return constraint1 + x; + } + + private static StringBuilder generateTestBuilder(int min, int max) { + StringBuilder aNewStringBuilder = new StringBuilder(120); + int aNewLength = getRandomIndex(min, max); + for(int y=0; y + */ + +import java.util.ArrayList; +import java.util.List; + +public class BufferForwarding { + private final static String A_STRING_BUFFER_VAL = "aStringBuffer"; + private final static String A_STRING_BUILDER_VAL = "aStringBuilder"; + private final static String A_STRING_VAL = "aString"; + private final static String NON_EMPTY_VAL = "NonEmpty"; + + public BufferForwarding() { + System.out.println( "Starting BufferForwarding"); + } + + public static void main(String... args) { + new BufferForwarding().executeTestMethods(); + } + + public void executeTestMethods() { + appendCharSequence(); + indexOfString(); + indexOfStringIntNull(); + indexOfStringNull(); + indexOfStringint(); + insertintCharSequence(); + insertintObject(); + insertintboolean(); + insertintchar(); + insertintdouble(); + insertintfloat(); + insertintint(); + insertintlong(); + lastIndexOfString(); + lastIndexOfStringint(); + } + + public void appendCharSequence() { + // three different flavors of CharSequence + CharSequence aString = A_STRING_VAL; + CharSequence aStringBuilder = new StringBuilder(A_STRING_BUILDER_VAL); + CharSequence aStringBuffer = new StringBuffer(A_STRING_BUFFER_VAL); + + assertEquals( /*actual*/ new StringBuilder().append(aString).toString(), /*expected*/ A_STRING_VAL ); + assertEquals( new StringBuilder().append(aStringBuilder).toString(), A_STRING_BUILDER_VAL ); + assertEquals( new StringBuilder().append(aStringBuffer).toString(), A_STRING_BUFFER_VAL ); + + assertEquals( /*actual*/ new StringBuilder(NON_EMPTY_VAL).append(aString).toString(), NON_EMPTY_VAL+A_STRING_VAL ); + assertEquals( new StringBuilder(NON_EMPTY_VAL).append(aStringBuilder).toString(), NON_EMPTY_VAL+A_STRING_BUILDER_VAL ); + assertEquals( new StringBuilder(NON_EMPTY_VAL).append(aStringBuffer).toString(), NON_EMPTY_VAL+A_STRING_BUFFER_VAL ); + } + + void indexOfString() { + StringBuffer sb = new StringBuffer("xyz"); + assertEquals( sb.indexOf("y"), 1 ); + assertEquals( sb.indexOf("not found"), -1 ); + } + + + public void indexOfStringint() { + StringBuffer sb = new StringBuffer("xyyz"); + assertEquals( sb.indexOf("y",0), 1 ); + assertEquals( sb.indexOf("y",1), 1 ); + assertEquals( sb.indexOf("y",2), 2 ); + assertEquals( sb.indexOf("not found"), -1 ); + } + + + public void indexOfStringIntNull() { + StringBuffer sb = new StringBuffer(); + // should be NPE if null passed + try { + sb.indexOf(null,1); + throw new RuntimeException("Test failed: should have thrown NPE"); + } catch (NullPointerException npe) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown NPE. Instead threw " + + t); + } + } + + + public void indexOfStringNull() { + StringBuffer sb = new StringBuffer(); + + // should be NPE if null passed + try { + sb.indexOf(null); + throw new RuntimeException("Test failed: should have thrown NPE"); + } catch (NullPointerException npe) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown NPE. Instead threw " + + t); + } + } + + + public void insertintboolean() { + boolean b = true; + StringBuffer sb = new StringBuffer("012345"); + assertEquals( sb.insert( 2, b).toString(), "01true2345"); + } + + + public void insertintchar() { + char c = 'C'; + StringBuffer sb = new StringBuffer("012345"); + assertEquals( sb.insert( 2, c ).toString(), "01C2345"); + } + + + public void insertintCharSequence() { + final String initString = "012345"; + // three different flavors of CharSequence + CharSequence aString = A_STRING_VAL; + CharSequence aStringBuilder = new StringBuilder(A_STRING_BUILDER_VAL); + CharSequence aStringBuffer = new StringBuffer(A_STRING_BUFFER_VAL); + + assertEquals( new StringBuffer(initString).insert(2, aString).toString(), "01"+A_STRING_VAL+"2345" ); + + assertEquals( new StringBuffer(initString).insert(2, aStringBuilder).toString(), "01"+A_STRING_BUILDER_VAL+"2345" ); + + assertEquals( new StringBuffer(initString).insert(2, aStringBuffer).toString(), "01"+A_STRING_BUFFER_VAL+"2345" ); + + try { + new StringBuffer(initString).insert(7, aString); + throw new RuntimeException("Test failed: should have thrown IndexOutOfBoundsException"); + } catch (IndexOutOfBoundsException soob) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown IndexOutOfBoundsException, but instead threw " + t.getMessage()); + + } + } + + public void insertintdouble() { + double d = 99d; + StringBuffer sb = new StringBuffer("012345"); + assertEquals( sb.insert( 2, d ).toString(), "0199.02345"); } + + + public void insertintfloat() { + float f = 99.0f; + StringBuffer sb = new StringBuffer("012345"); + assertEquals( sb.insert( 2, f ).toString(), "0199.02345"); } + + + public void insertintint() { + int i = 99; + StringBuffer sb = new StringBuffer("012345"); + assertEquals( sb.insert( 2, i ).toString(), "01992345"); + } + + + public void insertintlong() { + long l = 99; + StringBuffer sb = new StringBuffer("012345"); + assertEquals( sb.insert( 2, l ).toString(), "01992345"); } + + public void insertintObject() { + StringBuffer sb = new StringBuffer("012345"); + List ls = new ArrayList(); + ls.add("A"); ls.add("B"); + String lsString = ls.toString(); + assertEquals( sb.insert(2, ls).toString(), "01"+lsString+"2345"); + + try { + sb.insert(sb.length()+1, ls); + throw new RuntimeException("Test failed: should have thrown StringIndexOutOfBoundsException"); + } catch (StringIndexOutOfBoundsException soob) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown StringIndexOutOfBoundsException, but instead threw:" + + t); + + } + } + + + + public void lastIndexOfString() { + String xyz = "xyz"; + String xyz3 = "xyzxyzxyz"; + StringBuffer sb = new StringBuffer(xyz3); + int pos = sb.lastIndexOf("xyz"); + assertEquals( pos, 2*xyz.length() ); + } + + public void lastIndexOfStringint() { + StringBuffer sb = new StringBuffer("xyzxyzxyz"); + int pos = sb.lastIndexOf("xyz",5); + assertEquals( pos, 3 ); + pos = sb.lastIndexOf("xyz", 6); + assertEquals( pos, 6 ); + } + + public void assertEquals( String actual, String expected) { + if (!actual.equals( expected )) { + throw new RuntimeException( "Test failed: actual = '" + actual + + "', expected = '" + expected + "'"); + } + } + + public void assertEquals( int actual, int expected) { + if (actual != expected) { + throw new RuntimeException( "Test failed: actual = '" + actual + + "', expected = '" + expected + "'"); + } + } +} diff --git a/jdk/test/java/lang/StringBuffer/TestSynchronization.java b/jdk/test/java/lang/StringBuffer/TestSynchronization.java new file mode 100644 index 00000000000..75b4b82f3d5 --- /dev/null +++ b/jdk/test/java/lang/StringBuffer/TestSynchronization.java @@ -0,0 +1,315 @@ +/* + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 6206780 + * @summary Test that all public unsynchronized methods of StringBuffer are either directly or indirectly synchronized + */ +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * TestSynchronization tests whether synchronized methods calls on an object + * result in synchronized calls. Note that this may not test all cases desired. + * It only tests whether some synchronization has occurred on the object during + * the call chain, and can't tell whether the object was locked across all + * operations that have been performed on the object. + */ +public class TestSynchronization { + + /** + * Define parameters used in methods of StringBuffer - admittedly a bit of + * hack but 'purpose-built' for StringBuffer. Something more general could + * probably be developed if the test needs to be more widely adopted. + *

+ * boolean char char[] int double float long Object CharSequence String + * StringBuffer StringBuilder + *

+ */ + private static final boolean BOOLEAN_VAL = true; + private static final char CHAR_VAL = 'x'; + private static final char[] CHAR_ARRAY_VAL = {'c', 'h', 'a', 'r', 'a', 'r', + 'r', 'a', 'y'}; + private static final int INT_VAL = 1; + private static final double DOUBLE_VAL = 1.0d; + private static final float FLOAT_VAL = 1.0f; + private static final long LONG_VAL = 1L; + private static final Object OBJECT_VAL = new Object(); + private static final String STRING_VAL = "String value"; + private static final StringBuilder STRING_BUILDER_VAL = + new StringBuilder("StringBuilder value"); + private static final StringBuffer STRING_BUFFER_VAL = + new StringBuffer("StringBuffer value"); + private static final CharSequence[] CHAR_SEQUENCE_VAL = {STRING_VAL, + STRING_BUILDER_VAL, STRING_BUFFER_VAL}; + + public static void main(String... args) throws Exception { + // First, test the tester + testClass(MyTestClass.class, /* + * self-test + */ true); + // Finally, test StringBuffer + testClass(StringBuffer.class, /* + * self-test + */ false); + } + + /** + * Test all the public, unsynchronized methods of the given class. If + * isSelfTest is true, this is a self-test to ensure that the test program + * itself is working correctly. Should help ensure correctness of this + * program if it changes. + *

+ * @param aClass - the class to test + * @param isSelfTest - true if this is the special self-test class + * @throws SecurityException + */ + private static void testClass(Class aClass, boolean isSelfTest) throws + Exception { + // Get all unsynchronized public methods via reflection. We don't need + // to test synchronized methods. By definition. they are already doing + // the right thing. + List methods = Arrays.asList(aClass.getDeclaredMethods()); + for (Method m : methods) { + int modifiers = m.getModifiers(); + if (Modifier.isPublic(modifiers) + && !Modifier.isSynchronized(modifiers)) { + try { + testMethod(aClass, m); + } catch (TestFailedException e) { + if (isSelfTest) { + String methodName = e.getMethod().getName(); + switch (methodName) { + case "should_pass": + throw new RuntimeException( + "Test failed: self-test failed. The 'should_pass' method did not pass the synchronization test. Check the test code."); + case "should_fail": + break; + default: + throw new RuntimeException( + "Test failed: something is amiss with the test. A TestFailedException was generated on a call to " + + methodName + " which we didn't expect to test in the first place."); + } + } else { + throw new RuntimeException("Test failed: the method " + + e.getMethod().toString() + + " should be synchronized, but isn't."); + } + } + } + } + } + + private static void invokeMethod(Class aClass, final Method m, + final Object[] args) throws TestFailedException, Exception { + //System.out.println( "Invoking " + m.toString() + " with parameters " + Arrays.toString(args)); + final Constructor objConstructor; + Object obj = null; + + objConstructor = aClass.getConstructor(String.class); + obj = objConstructor.newInstance("LeftPalindrome-emordnilaP-thgiR"); + + // test method m for synchronization + if (!isSynchronized(m, obj, args)) { + throw new TestFailedException(m); + } + } + + private static void testMethod(Class aClass, Method m) throws + Exception { + /* + * Construct call with arguments of the correct type. Note that the + * values are somewhat irrelevant. If the call actually succeeds, it + * means we aren't synchronized and the test has failed. + */ + Class[] pTypes = m.getParameterTypes(); + List charSequenceArgs = new ArrayList<>(); + Object[] args = new Object[pTypes.length]; + for (int i = 0; i < pTypes.length; i++) { + // determine the type and create the corresponding actual argument + Class pType = pTypes[i]; + if (pType.equals(boolean.class)) { + args[i] = BOOLEAN_VAL; + } else if (pType.equals(char.class)) { + args[i] = CHAR_VAL; + } else if (pType.equals(int.class)) { + args[i] = INT_VAL; + } else if (pType.equals(double.class)) { + args[i] = DOUBLE_VAL; + } else if (pType.equals(float.class)) { + args[i] = FLOAT_VAL; + } else if (pType.equals(long.class)) { + args[i] = LONG_VAL; + } else if (pType.equals(Object.class)) { + args[i] = OBJECT_VAL; + } else if (pType.equals(StringBuilder.class)) { + args[i] = STRING_BUILDER_VAL; + } else if (pType.equals(StringBuffer.class)) { + args[i] = STRING_BUFFER_VAL; + } else if (pType.equals(String.class)) { + args[i] = STRING_VAL; + } else if (pType.isArray() && pType.getComponentType().equals(char.class)) { + args[i] = CHAR_ARRAY_VAL; + } else if (pType.equals(CharSequence.class)) { + charSequenceArgs.add(new Integer(i)); + } else { + throw new RuntimeException("Test Failed: not accounting for method call with parameter type of " + pType.getName() + " You must update the test."); + } + } + /* + * If there are no CharSequence args, we can simply invoke our method + * and test it + */ + if (charSequenceArgs.isEmpty()) { + invokeMethod(aClass, m, args); + } else { + /* + * Iterate through the different CharSequence types and invoke the + * method for each type. + */ + if (charSequenceArgs.size() > 1) { + throw new RuntimeException("Test Failed: the test cannot handle a method with multiple CharSequence arguments. You must update the test to handle the method " + + m.toString()); + } + for (int j = 0; j < CHAR_SEQUENCE_VAL.length; j++) { + args[charSequenceArgs.get(0)] = CHAR_SEQUENCE_VAL[j]; + invokeMethod(aClass, m, args); + } + } + } + + @SuppressWarnings("serial") + private static class TestFailedException extends Exception { + + final Method m; + + public Method getMethod() { + return m; + } + + public TestFailedException(Method m) { + this.m = m; + } + } + + static class InvokeTask implements Runnable { + + private final Method m; + private final Object target; + private final Object[] args; + + InvokeTask(Method m, Object target, Object... args) { + this.m = m; + this.target = target; + this.args = args; + } + + @Override + public void run() { + try { + m.invoke(target, args); + } catch (IllegalAccessException | IllegalArgumentException | + InvocationTargetException e) { + e.printStackTrace(); + } + } + } + + /** + * isSynchronized tests whether the given method is synchronized or not by + * invoking it in a thread and testing the thread state after starting the + * thread + *

+ * @param m the method to test + * @param target the object the method is executed on + * @param args the arguments passed to the method + * @return true iff the method is synchronized + */ + private static boolean isSynchronized(Method m, Object target, + Object... args) { + Thread t = new Thread(new InvokeTask(m, target, args)); + + Boolean isSynchronized = null; + + synchronized (target) { + t.start(); + + while (isSynchronized == null) { + switch (t.getState()) { + case NEW: + case RUNNABLE: + case WAITING: + case TIMED_WAITING: + Thread.yield(); + break; + case BLOCKED: + isSynchronized = true; + break; + case TERMINATED: + isSynchronized = false; + break; + } + } + } + + try { + t.join(); + } catch (InterruptedException ex) { + ex.printStackTrace(); + } + + return isSynchronized; + } + + /* + * This class is used to test the synchronization tester above. It has a + * method, should_pass, that is unsynchronized but calls a synchronized + * method. It has another method, should_fail, which isn't synchronized and + * doesn't call a synchronized method. The former should pass and the latter + * should fail. + */ + private static class MyTestClass { + + @SuppressWarnings("unused") + public MyTestClass(String s) { + } + + @SuppressWarnings("unused") + public void should_pass() { + // call sync method + sync_shouldnt_be_tested(); + } + + @SuppressWarnings("unused") + public void should_fail() { + } + + public synchronized void sync_shouldnt_be_tested() { + } + } +} diff --git a/jdk/test/java/lang/StringBuilder/AppendStringBuffer.java b/jdk/test/java/lang/StringBuilder/AppendStringBuffer.java new file mode 100644 index 00000000000..a54cf0a0d29 --- /dev/null +++ b/jdk/test/java/lang/StringBuilder/AppendStringBuffer.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @bug 6206780 + * @summary Test StringBuilder.append(StringBuffer); + */ + +import java.util.Random; + +public class AppendStringBuffer { + private static Random generator = new Random(); + + public static void main(String[] args) throws Exception { + for (int i=0; i<1000; i++) { + StringBuffer sb1 = generateTestBuffer(10, 100); + StringBuffer sb2 = generateTestBuffer(10, 100); + StringBuffer sb3 = generateTestBuffer(10, 100); + String s1 = sb1.toString(); + String s2 = sb2.toString(); + String s3 = sb3.toString(); + + String concatResult = new String(s1+s2+s3); + + StringBuilder test = new StringBuilder(); + test.append(sb1); + test.append(sb2); + test.append(sb3); + + if (!test.toString().equals(concatResult)) + throw new RuntimeException("StringBuffer.append failure"); + } + } + + private static int getRandomIndex(int constraint1, int constraint2) { + int range = constraint2 - constraint1; + int x = generator.nextInt(range); + return constraint1 + x; + } + + private static StringBuffer generateTestBuffer(int min, int max) { + StringBuffer aNewStringBuffer = new StringBuffer(120); + int aNewLength = getRandomIndex(min, max); + for(int y=0; y + */ + +import java.util.ArrayList; +import java.util.List; + +public class BuilderForwarding { + private final static String A_STRING_BUFFER_VAL = "aStringBuffer"; + private final static String A_STRING_BUILDER_VAL = "aStringBuilder"; + private final static String A_STRING_VAL = "aString"; + private final static String NON_EMPTY_VAL = "NonEmpty"; + + public BuilderForwarding() { + System.out.println( "Starting BuilderForwarding"); + } + + public static void main(String... args) { + new BuilderForwarding().executeTestMethods(); + } + + public void executeTestMethods() { + appendCharSequence(); + indexOfString(); + indexOfStringIntNull(); + indexOfStringNull(); + indexOfStringint(); + insertintCharSequence(); + insertintObject(); + insertintboolean(); + insertintchar(); + insertintdouble(); + insertintfloat(); + insertintint(); + insertintlong(); + lastIndexOfString(); + lastIndexOfStringint(); + } + + public void appendCharSequence() { + // three different flavors of CharSequence + CharSequence aString = A_STRING_VAL; + CharSequence aStringBuilder = new StringBuilder(A_STRING_BUILDER_VAL); + CharSequence aStringBuffer = new StringBuffer(A_STRING_BUFFER_VAL); + + assertEquals( /*actual*/ new StringBuilder().append(aString).toString(), /*expected*/ A_STRING_VAL ); + assertEquals( new StringBuilder().append(aStringBuilder).toString(), A_STRING_BUILDER_VAL ); + assertEquals( new StringBuilder().append(aStringBuffer).toString(), A_STRING_BUFFER_VAL ); + + assertEquals( /*actual*/ new StringBuilder(NON_EMPTY_VAL).append(aString).toString(), NON_EMPTY_VAL+A_STRING_VAL ); + assertEquals( new StringBuilder(NON_EMPTY_VAL).append(aStringBuilder).toString(), NON_EMPTY_VAL+A_STRING_BUILDER_VAL ); + assertEquals( new StringBuilder(NON_EMPTY_VAL).append(aStringBuffer).toString(), NON_EMPTY_VAL+A_STRING_BUFFER_VAL ); + } + + + public void indexOfString() { + StringBuilder sb = new StringBuilder(); + // should be NPE if null passed + try { + + sb.indexOf(null); + throw new RuntimeException("Test failed: should have thrown NPE"); + + + } catch (NullPointerException npe) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown NPE. Instead threw " + + t); + } + sb = new StringBuilder("xyz"); + assertEquals( sb.indexOf("y"), 1 ); + assertEquals( sb.indexOf("not found"), -1 ); + } + + + public void indexOfStringint() { + StringBuilder sb = new StringBuilder(); + // should be NPE if null passed + try { + sb.indexOf(null,1); + throw new RuntimeException("Test failed: should have thrown NPE"); + } catch (NullPointerException npe) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown NPE"); + } + sb = new StringBuilder("xyyz"); + assertEquals( sb.indexOf("y",0), 1 ); + assertEquals( sb.indexOf("y",1), 1 ); + assertEquals( sb.indexOf("y",2), 2 ); + assertEquals( sb.indexOf("not found"), -1 ); + } + + + public void indexOfStringIntNull() { + StringBuffer sb = new StringBuffer(); + // should be NPE if null passed + try { + sb.indexOf(null,1); + throw new RuntimeException("Test failed: should have thrown NPE"); + } catch (NullPointerException npe) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown NPE. Instead threw " + + t); + } + } + + + public void indexOfStringNull() { + StringBuilder sb = new StringBuilder(); + + // should be NPE if null passed + try { + sb.indexOf(null); + throw new RuntimeException("Test failed: should have thrown NPE"); + } catch (NullPointerException npe) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown NPE. Instead threw " + + t); + } + } + + + public void insertintboolean() { + boolean b = true; + StringBuilder sb = new StringBuilder("012345"); + assertEquals( sb.insert( 2, b).toString(), "01true2345"); + } + + + public void insertintchar() { + char c = 'C'; + StringBuilder sb = new StringBuilder("012345"); + assertEquals( sb.insert( 2, c ).toString(), "01C2345"); + } + + + public void insertintCharSequence() { + final String initString = "012345"; + // three different flavors of CharSequence + CharSequence aString = A_STRING_VAL; + CharSequence aStringBuilder = new StringBuilder(A_STRING_BUILDER_VAL); + CharSequence aStringBuffer = new StringBuffer(A_STRING_BUFFER_VAL); + + assertEquals( new StringBuilder(initString).insert(2, aString).toString(), "01"+A_STRING_VAL+"2345" ); + + assertEquals( new StringBuilder(initString).insert(2, aStringBuilder).toString(), "01"+A_STRING_BUILDER_VAL+"2345" ); + + assertEquals( new StringBuilder(initString).insert(2, aStringBuffer).toString(), "01"+A_STRING_BUFFER_VAL+"2345" ); + + try { + new StringBuilder(initString).insert(7, aString); + throw new RuntimeException("Test failed: should have thrown IndexOutOfBoundsException"); + } catch (IndexOutOfBoundsException soob) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown IndexOutOfBoundsException, but instead threw " + t.getMessage()); + + } + } + + + public void insertintdouble() { + double d = 99d; + StringBuilder sb = new StringBuilder("012345"); + assertEquals( sb.insert( 2, d ).toString(), "0199.02345"); } + + + public void insertintfloat() { + float f = 99.0f; + StringBuilder sb = new StringBuilder("012345"); + assertEquals( sb.insert( 2, f ).toString(), "0199.02345"); } + + + public void insertintint() { + int i = 99; + StringBuilder sb = new StringBuilder("012345"); + assertEquals( sb.insert( 2, i ).toString(), "01992345"); + } + + + public void insertintlong() { + long l = 99; + StringBuilder sb = new StringBuilder("012345"); + assertEquals( sb.insert( 2, l ).toString(), "01992345"); } + + + public void insertintObject() { + StringBuilder sb = new StringBuilder("012345"); + List ls = new ArrayList(); + ls.add("A"); ls.add("B"); + String lsString = ls.toString(); + assertEquals( sb.insert(2, ls).toString(), "01"+lsString+"2345"); + + try { + sb.insert(sb.length()+1, ls); + throw new RuntimeException("Test failed: should have thrown StringIndexOutOfBoundsException"); + } catch (StringIndexOutOfBoundsException soob) { + // expected: passed + } catch (Throwable t) { + throw new RuntimeException("Test failed: should have thrown StringIndexOutOfBoundsException, but instead threw:" + + t); + } + } + + + public void lastIndexOfString() { + String xyz = "xyz"; + String xyz3 = "xyzxyzxyz"; + StringBuilder sb = new StringBuilder(xyz3); + int pos = sb.lastIndexOf("xyz"); + assertEquals( pos, 2*xyz.length() ); + } + + + public void lastIndexOfStringint() { + StringBuilder sb = new StringBuilder("xyzxyzxyz"); + int pos = sb.lastIndexOf("xyz",5); + assertEquals( pos, 3 ); + pos = sb.lastIndexOf("xyz", 6); + assertEquals( pos, 6 ); + } + + public void assertEquals( String actual, String expected) { + if (!actual.equals( expected )) { + throw new RuntimeException( "Test failed: actual = '" + actual + + "', expected = '" + expected + "'"); + } + } + + public void assertEquals( int actual, int expected) { + if (actual != expected) { + throw new RuntimeException( "Test failed: actual = '" + actual + + "', expected = '" + expected + "'"); + } + } +} + diff --git a/jdk/test/java/lang/StringCoding/CheckEncodings.sh b/jdk/test/java/lang/StringCoding/CheckEncodings.sh index 95c2419ffbd..6b5fc830d15 100644 --- a/jdk/test/java/lang/StringCoding/CheckEncodings.sh +++ b/jdk/test/java/lang/StringCoding/CheckEncodings.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/ThreadGroup/NullThreadName.java b/jdk/test/java/lang/ThreadGroup/NullThreadName.java index 4179b22446d..cbbb50a47f8 100644 --- a/jdk/test/java/lang/ThreadGroup/NullThreadName.java +++ b/jdk/test/java/lang/ThreadGroup/NullThreadName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/ThreadGroup/Stop.java b/jdk/test/java/lang/ThreadGroup/Stop.java index 4763acc8036..156bc9d4bdd 100644 --- a/jdk/test/java/lang/ThreadGroup/Stop.java +++ b/jdk/test/java/lang/ThreadGroup/Stop.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh b/jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh index 7322b0867f7..c7315f5d146 100644 --- a/jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh +++ b/jdk/test/java/lang/annotation/loaderLeak/LoaderLeak.sh @@ -1,6 +1,6 @@ #!/bin/sh -# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/annotation/loaderLeak/Main.java b/jdk/test/java/lang/annotation/loaderLeak/Main.java index fceda8195ff..7e249ebc106 100644 --- a/jdk/test/java/lang/annotation/loaderLeak/Main.java +++ b/jdk/test/java/lang/annotation/loaderLeak/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh b/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh index 6a7218466af..f5f034be5a2 100644 --- a/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh +++ b/jdk/test/java/lang/instrument/appendToClassLoaderSearch/CommonSetup.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/7196190/ClassForNameTest.java b/jdk/test/java/lang/invoke/7196190/ClassForNameTest.java new file mode 100644 index 00000000000..48ccb2a6463 --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/ClassForNameTest.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7196190 + * @summary Improve method of handling MethodHandles + * + * @run main/othervm ClassForNameTest + */ + +import java.lang.invoke.*; +import java.lang.reflect.Method; +import java.util.Arrays; + +public class ClassForNameTest { + final static String NAME = ClassForNameTest.class.getName(); + + public static void main(String[] args) throws Throwable { + { + final MethodType mt = MethodType.methodType(Class.class, String.class); + final MethodHandle mh = MethodHandles.lookup() + .findStatic(Class.class, "forName", mt); + + Class.forName(NAME); + + mh.invoke(NAME); + mh.bindTo(NAME).invoke(); + mh.invokeWithArguments(Arrays.asList(NAME)); + mh.invokeWithArguments(NAME); + Class cls = (Class) mh.invokeExact(NAME); + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + final MethodHandle mh = MethodHandles.lookup() + .findVirtual(Method.class, "invoke", mt) + .bindTo(fnMethod); + + fnMethod.invoke(null, NAME); + + mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); + mh.invoke(null, new Object[]{NAME}); + mh.invokeWithArguments(null, new Object[]{NAME}); + mh.invokeWithArguments(Arrays.asList(null, new Object[]{NAME})); + Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + + final MethodHandle mh = MethodHandles.lookup() + .bind(fnMethod, "invoke", mt); + + mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); + mh.invoke(null, new Object[]{NAME}); + mh.invokeWithArguments(null, NAME); + mh.invokeWithArguments(Arrays.asList(null, NAME)); + Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodHandle mh = MethodHandles.lookup().unreflect(fnMethod); + + mh.bindTo(NAME).invoke(); + mh.invoke(NAME); + mh.invokeWithArguments(NAME); + mh.invokeWithArguments(Arrays.asList(NAME)); + Class cls = (Class) mh.invokeExact(NAME); + } + + System.out.println("TEST PASSED"); + } +} diff --git a/jdk/test/java/lang/invoke/7196190/GetUnsafeTest.java b/jdk/test/java/lang/invoke/7196190/GetUnsafeTest.java new file mode 100644 index 00000000000..0fd3cbd8d0f --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/GetUnsafeTest.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7196190 + * @summary Improve method of handling MethodHandles + * + * @run main/othervm/policy=jtreg.security.policy/secure=java.lang.SecurityManager GetUnsafeTest + */ + +import java.lang.invoke.*; +import java.lang.reflect.Method; +import java.util.Arrays; + +public class GetUnsafeTest { + final static String NAME = "sun.misc.Unsafe"; + + private static boolean isTestFailed = false; + + private static void fail() { + isTestFailed = true; + try { throw new Exception(); } catch (Throwable e) { + StackTraceElement frame = e.getStackTrace()[1]; + System.out.printf("Failed at %s:%d\n", frame.getFileName(), frame.getLineNumber()); + } + } + + public static void main(String[] args) throws Throwable { + { + final MethodType mt = MethodType.methodType(Class.class, String.class); + final MethodHandle mh = MethodHandles.lookup() + .findStatic(Class.class, "forName", mt); + + try { Class.forName(NAME); fail(); } catch (Throwable e) {} + + try { mh.invoke(NAME); fail(); } catch (Throwable e) {} + try { mh.bindTo(NAME).invoke(); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(NAME)); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(NAME); fail(); } catch (Throwable e) {} + try { Class cls = (Class) mh.invokeExact(NAME); fail(); } catch (Throwable e) {} + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + final MethodHandle mh = MethodHandles.lookup() + .findVirtual(Method.class, "invoke", mt) + .bindTo(fnMethod); + + try { fnMethod.invoke(null, NAME); fail(); } catch (Throwable e) {} + + try { mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); fail(); } catch (Throwable e) {} + try { mh.invoke(null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(null, new Object[]{NAME})); fail(); } catch (Throwable e) {} + try { Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodType mt = MethodType.methodType(Object.class, Object.class, Object[].class); + + final MethodHandle mh = MethodHandles.lookup().bind(fnMethod, "invoke", mt); + + try { mh.bindTo(null).bindTo(new Object[]{NAME}).invoke(); fail(); } catch (Throwable e) {} + try { mh.invoke(null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(null, NAME); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(null, NAME)); fail(); } catch (Throwable e) {} + try { Object obj = mh.invokeExact((Object) null, new Object[]{NAME}); fail(); } catch (Throwable e) {} + } + + { + final Method fnMethod = Class.class.getMethod("forName", String.class); + final MethodHandle mh = MethodHandles.lookup().unreflect(fnMethod); + + try { mh.bindTo(NAME).invoke(); fail(); } catch (Throwable e) {} + try { mh.invoke(NAME); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(NAME); fail(); } catch (Throwable e) {} + try { mh.invokeWithArguments(Arrays.asList(NAME)); fail(); } catch (Throwable e) {} + try { Class cls = (Class) mh.invokeExact(NAME); fail(); } catch (Throwable e) {} + } + + if (!isTestFailed) { + System.out.println("TEST PASSED"); + } else { + System.out.println("TEST FAILED"); + System.exit(1); + } + } +} diff --git a/jdk/test/java/lang/invoke/7196190/MHProxyTest.java b/jdk/test/java/lang/invoke/7196190/MHProxyTest.java new file mode 100644 index 00000000000..5e07f393cb1 --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/MHProxyTest.java @@ -0,0 +1,181 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + * + */ + +/** + * @test + * @bug 7196190 + * @summary Improve method of handling MethodHandles + * + * @run main/othervm MHProxyTest + */ + +import java.lang.invoke.*; +import java.security.*; +import static java.lang.invoke.MethodHandles.*; +import static java.lang.invoke.MethodType.*; + +public class MHProxyTest { + private static final Class C_Unsafe; + private static final MethodHandle MH_getUnsafe; + static { + // Do these before there is a SM installed. + C_Unsafe = sun.misc.Unsafe.class; // EXPECT A WARNING ON THIS LINE + Lookup lookup = lookup(); + MethodHandle gumh = null; + try { + gumh = lookup.findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + } catch (ReflectiveOperationException ex) { + throw new InternalError(ex.toString()); + } + MH_getUnsafe = gumh; + // Try some different lookups: + try { + lookup.in(Object.class).findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + } catch (ReflectiveOperationException ex) { + throw new InternalError(ex.toString()); + } + lookup = lookup().in(C_Unsafe); + try { + lookup.in(C_Unsafe).findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + } catch (ReflectiveOperationException ex) { + throw new InternalError(ex.toString()); + } + } + + public static void main(String[] args) throws Throwable { + System.setSecurityManager(new SecurityManager()); + Lookup lookup = lookup(); + testBasic(lookup); + testDoPriv(lookup); + testSetVar(); + Lookup l2 = lookup.in(Object.class); + System.out.println("=== "+l2); + testBasic(l2); + testDoPriv(l2); + Lookup l3 = lookup.in(C_Unsafe); + System.out.println("=== "+l3); + testBasic(l3); + testDoPriv(l3); + if (failure != null) + throw failure; + } + + private static Throwable failure; + private static void fail(Throwable ex) { + if (failure == null) + failure = ex; + StackTraceElement frame = new Exception().getStackTrace()[1]; + System.out.printf("Failed at %s:%d: %s\n", frame.getFileName(), frame.getLineNumber(), ex); + } + private static void ok(Throwable ex) { + StackTraceElement frame = new Exception().getStackTrace()[1]; + System.out.printf("OK at %s:%d: %s\n", frame.getFileName(), frame.getLineNumber(), ex); + } + + private static void testBasic(Lookup lookup) throws Throwable { + // Verify that we can't get to this guy under the SM: + try { + MethodHandle badmh = lookup.findStatic(C_Unsafe, "getUnsafe", methodType(C_Unsafe)); + assert(badmh.type() == methodType(C_Unsafe)); + badmh = badmh.asType(badmh.type().generic()); + Object u = C_Unsafe.cast(badmh.invokeExact()); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got mh to getUnsafe!")); + } catch (SecurityException ex) { + ok(ex); + } + try { + Object u = MH_getUnsafe.invokeWithArguments(); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH invoke)")); + } catch (SecurityException ex) { + ok(ex); + } + try { + MethodHandle mh = MH_getUnsafe; + mh = mh.asType(mh.type().generic()); + mh = foldArguments(identity(Object.class), mh); + mh = filterReturnValue(mh, identity(Object.class)); + Object u = mh.invokeExact(); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH invokeWithArguments)")); + } catch (SecurityException ex) { + ok(ex); + } + } + + private static void testDoPriv(Lookup lookup) throws Throwable { + PrivilegedAction privAct = MethodHandleProxies.asInterfaceInstance(PrivilegedAction.class, MH_getUnsafe); + try { + Object u = AccessController.doPrivileged(privAct); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (static doPriv)")); + } catch (SecurityException ex) { + ok(ex); + } + MethodHandle MH_doPriv = lookup.findStatic(AccessController.class, "doPrivileged", + methodType(Object.class, PrivilegedAction.class)); + MH_doPriv = MH_doPriv.bindTo(privAct); + try { + Object u = MH_doPriv.invoke(); + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH + doPriv)")); + } catch (SecurityException ex) { + ok(ex); + } + // try one more layer of indirection: + Runnable rbl = MethodHandleProxies.asInterfaceInstance(Runnable.class, MH_doPriv); + try { + rbl.run(); + fail(new AssertionError("got the Unsafe object! (Runnable + MH + doPriv)")); + } catch (SecurityException ex) { + ok(ex); + } + } + + private static void testSetVar() throws Throwable { + { + // Test the box pattern: + Object[] box = new Object[1]; + MethodHandle MH_getFoo = identity(Object.class).bindTo("foo"); + MethodHandle MH_storeToBox = insertArguments(arrayElementSetter(Object[].class), 0, box, 0); + MethodHandle mh = filterReturnValue(MH_getFoo, MH_storeToBox); + mh.invokeExact(); + assert(box[0] == "foo"); + } + { + Object[] box = new Object[1]; + MethodHandle MH_storeToBox = insertArguments(arrayElementSetter(Object[].class), 0, box, 0); + MethodHandle mh = filterReturnValue(MH_getUnsafe.asType(MH_getUnsafe.type().generic()), MH_storeToBox); + try { + mh.invokeExact(); + Object u = box[0]; + assert(C_Unsafe.isInstance(u)); + fail(new AssertionError("got the Unsafe object! (MH + setElement)")); + } catch (SecurityException ex) { + ok(ex); + } + } + } +} diff --git a/jdk/test/java/lang/invoke/7196190/jtreg.security.policy b/jdk/test/java/lang/invoke/7196190/jtreg.security.policy new file mode 100644 index 00000000000..d32c7af9b3f --- /dev/null +++ b/jdk/test/java/lang/invoke/7196190/jtreg.security.policy @@ -0,0 +1,9 @@ +/* + * security policy used by the test process + * must allow file reads so that jtreg itself can run + */ + +grant { + // standard test activation permissions + permission java.io.FilePermission "*", "read"; +}; diff --git a/jdk/test/java/lang/invoke/CallSiteTest.java b/jdk/test/java/lang/invoke/CallSiteTest.java index 5e0a875e561..3e9d7d7b89a 100644 --- a/jdk/test/java/lang/invoke/CallSiteTest.java +++ b/jdk/test/java/lang/invoke/CallSiteTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/ClassValueTest.java b/jdk/test/java/lang/invoke/ClassValueTest.java index 56b577159d5..8e6ab29d0f9 100644 --- a/jdk/test/java/lang/invoke/ClassValueTest.java +++ b/jdk/test/java/lang/invoke/ClassValueTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/JavaDocExamplesTest.java b/jdk/test/java/lang/invoke/JavaDocExamplesTest.java index 9fd24296dfe..76f0e01318a 100644 --- a/jdk/test/java/lang/invoke/JavaDocExamplesTest.java +++ b/jdk/test/java/lang/invoke/JavaDocExamplesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/MethodHandlesTest.java b/jdk/test/java/lang/invoke/MethodHandlesTest.java index aaa41a8f0db..770cdc6ca32 100644 --- a/jdk/test/java/lang/invoke/MethodHandlesTest.java +++ b/jdk/test/java/lang/invoke/MethodHandlesTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/MethodTypeTest.java b/jdk/test/java/lang/invoke/MethodTypeTest.java index d8d460fd191..e680b1b81f2 100644 --- a/jdk/test/java/lang/invoke/MethodTypeTest.java +++ b/jdk/test/java/lang/invoke/MethodTypeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/PrivateInvokeTest.java b/jdk/test/java/lang/invoke/PrivateInvokeTest.java index 434b8e82ca2..cc4fec37dbb 100644 --- a/jdk/test/java/lang/invoke/PrivateInvokeTest.java +++ b/jdk/test/java/lang/invoke/PrivateInvokeTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/RicochetTest.java b/jdk/test/java/lang/invoke/RicochetTest.java index 342cffbbe5f..6451fb48cd8 100644 --- a/jdk/test/java/lang/invoke/RicochetTest.java +++ b/jdk/test/java/lang/invoke/RicochetTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/invoke/ThrowExceptionsTest.java b/jdk/test/java/lang/invoke/ThrowExceptionsTest.java index b22d370748c..7ac5475865d 100644 --- a/jdk/test/java/lang/invoke/ThrowExceptionsTest.java +++ b/jdk/test/java/lang/invoke/ThrowExceptionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/BufferPoolMXBean/Basic.java b/jdk/test/java/lang/management/BufferPoolMXBean/Basic.java index a55f50ef0ef..6bdd96a2fa8 100644 --- a/jdk/test/java/lang/management/BufferPoolMXBean/Basic.java +++ b/jdk/test/java/lang/management/BufferPoolMXBean/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java b/jdk/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java index 5e88b469e50..c0fb62c95c0 100644 --- a/jdk/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java +++ b/jdk/test/java/lang/management/ManagementFactory/GetPlatformMXBeans.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java b/jdk/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java index 6178d47c145..b7d9b111f6b 100644 --- a/jdk/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java +++ b/jdk/test/java/lang/management/ManagementFactory/MBeanServerMXBeanUnsupportedTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/ManagementFactory/ThreadMXBeanProxy.java b/jdk/test/java/lang/management/ManagementFactory/ThreadMXBeanProxy.java index bd00434dbba..8146e6c1d43 100644 --- a/jdk/test/java/lang/management/ManagementFactory/ThreadMXBeanProxy.java +++ b/jdk/test/java/lang/management/ManagementFactory/ThreadMXBeanProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java b/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java index b8bcd7e140c..62dc211d913 100644 --- a/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java +++ b/jdk/test/java/lang/management/MemoryMXBean/CollectionUsageThreshold.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java b/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java index ae84e832ad3..65d2da8d957 100644 --- a/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java +++ b/jdk/test/java/lang/management/MemoryMXBean/MemoryTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh b/jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh index 7c1a5ae036f..1f8d823dcdb 100644 --- a/jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh +++ b/jdk/test/java/lang/management/OperatingSystemMXBean/TestSystemLoadAvg.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java b/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java index 9d13b954c14..eea0a6fdab1 100644 --- a/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java +++ b/jdk/test/java/lang/management/PlatformLoggingMXBean/PlatformLoggingMXBeanTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/lang/ref/Basic.java b/jdk/test/java/lang/ref/Basic.java index 4a885d8d991..deb9ec34826 100644 --- a/jdk/test/java/lang/ref/Basic.java +++ b/jdk/test/java/lang/ref/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -105,6 +105,7 @@ public class Basic { System.err.println("GC " + i); Thread.sleep(10); System.gc(); + System.runFinalization(); showReferences(); while ((r = q2.poll()) != null) { diff --git a/jdk/test/java/net/Authenticator/B4678055.java b/jdk/test/java/net/Authenticator/B4678055.java index 3618c2a9d66..dc5befb6d22 100644 --- a/jdk/test/java/net/Authenticator/B4678055.java +++ b/jdk/test/java/net/Authenticator/B4678055.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Authenticator/B4722333.java b/jdk/test/java/net/Authenticator/B4722333.java index 5dad9c058b5..441e1107887 100644 --- a/jdk/test/java/net/Authenticator/B4722333.java +++ b/jdk/test/java/net/Authenticator/B4722333.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Authenticator/B4759514.java b/jdk/test/java/net/Authenticator/B4759514.java index 586ae0f5520..d81dd62e3ff 100644 --- a/jdk/test/java/net/Authenticator/B4759514.java +++ b/jdk/test/java/net/Authenticator/B4759514.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Authenticator/B4769350.java b/jdk/test/java/net/Authenticator/B4769350.java index fc00cabce79..23987c7fe65 100644 --- a/jdk/test/java/net/Authenticator/B4769350.java +++ b/jdk/test/java/net/Authenticator/B4769350.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Authenticator/B4921848.java b/jdk/test/java/net/Authenticator/B4921848.java index cc7a0b89d62..98a6e594802 100644 --- a/jdk/test/java/net/Authenticator/B4921848.java +++ b/jdk/test/java/net/Authenticator/B4921848.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Authenticator/B4933582.java b/jdk/test/java/net/Authenticator/B4933582.java index 090b49d7f20..ac8706241fc 100644 --- a/jdk/test/java/net/Authenticator/B4933582.java +++ b/jdk/test/java/net/Authenticator/B4933582.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Authenticator/B4933582.sh b/jdk/test/java/net/Authenticator/B4933582.sh index 90af3b5b118..66188364c09 100644 --- a/jdk/test/java/net/Authenticator/B4933582.sh +++ b/jdk/test/java/net/Authenticator/B4933582.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Authenticator/B4962064.java b/jdk/test/java/net/Authenticator/B4962064.java index 9f99e03ab37..b7eae976275 100644 --- a/jdk/test/java/net/Authenticator/B4962064.java +++ b/jdk/test/java/net/Authenticator/B4962064.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/CookieHandler/CookieManagerTest.java b/jdk/test/java/net/CookieHandler/CookieManagerTest.java index 7d61a458c3d..ac51b42b0b5 100644 --- a/jdk/test/java/net/CookieHandler/CookieManagerTest.java +++ b/jdk/test/java/net/CookieHandler/CookieManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/CookieHandler/NullUriCookieTest.java b/jdk/test/java/net/CookieHandler/NullUriCookieTest.java index 22ae6c2cb9d..d585e5f0b7c 100644 --- a/jdk/test/java/net/CookieHandler/NullUriCookieTest.java +++ b/jdk/test/java/net/CookieHandler/NullUriCookieTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/CookieHandler/TestHttpCookie.java b/jdk/test/java/net/CookieHandler/TestHttpCookie.java index 98bf852836f..1975fef4959 100644 --- a/jdk/test/java/net/CookieHandler/TestHttpCookie.java +++ b/jdk/test/java/net/CookieHandler/TestHttpCookie.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/DatagramPacket/ReuseBuf.java b/jdk/test/java/net/DatagramPacket/ReuseBuf.java index 001ad2fde90..019927a382f 100644 --- a/jdk/test/java/net/DatagramPacket/ReuseBuf.java +++ b/jdk/test/java/net/DatagramPacket/ReuseBuf.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/DatagramSocket/Send12k.java b/jdk/test/java/net/DatagramSocket/Send12k.java index c9d7bc66ff8..6446330d35e 100644 --- a/jdk/test/java/net/DatagramSocket/Send12k.java +++ b/jdk/test/java/net/DatagramSocket/Send12k.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java b/jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java index cfe06b96c97..b0cb10a6e92 100644 --- a/jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java +++ b/jdk/test/java/net/DatagramSocket/SendDatagramToBadAddress.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh b/jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh index 092e12d1d27..372c04d9059 100644 --- a/jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh +++ b/jdk/test/java/net/DatagramSocket/SetDatagramSocketImplFactory/ADatagramSocket.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/InetAddress/GetLocalHostWithSM.java b/jdk/test/java/net/InetAddress/GetLocalHostWithSM.java index 1afe502f437..c8d06acb613 100644 --- a/jdk/test/java/net/InetAddress/GetLocalHostWithSM.java +++ b/jdk/test/java/net/InetAddress/GetLocalHostWithSM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/NetworkInterface/NetParamsTest.java b/jdk/test/java/net/NetworkInterface/NetParamsTest.java index dd6d172e1b3..abb61402353 100644 --- a/jdk/test/java/net/NetworkInterface/NetParamsTest.java +++ b/jdk/test/java/net/NetworkInterface/NetParamsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/ProxySelector/LoopbackAddresses.java b/jdk/test/java/net/ProxySelector/LoopbackAddresses.java index 54c74ab1abe..a8c0078f672 100644 --- a/jdk/test/java/net/ProxySelector/LoopbackAddresses.java +++ b/jdk/test/java/net/ProxySelector/LoopbackAddresses.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/ProxySelector/ProxyTest.java b/jdk/test/java/net/ProxySelector/ProxyTest.java index 44a16fb0286..9a7b3e9bbcb 100644 --- a/jdk/test/java/net/ProxySelector/ProxyTest.java +++ b/jdk/test/java/net/ProxySelector/ProxyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Socket/OldSocketImpl.sh b/jdk/test/java/net/Socket/OldSocketImpl.sh index 09e40926593..5f429d1e4ee 100644 --- a/jdk/test/java/net/Socket/OldSocketImpl.sh +++ b/jdk/test/java/net/Socket/OldSocketImpl.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Socket/SocketGrowth.java b/jdk/test/java/net/Socket/SocketGrowth.java new file mode 100644 index 00000000000..0290f81dec0 --- /dev/null +++ b/jdk/test/java/net/Socket/SocketGrowth.java @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7181793 + * @summary getOutputStream create streams that cannot be GC'ed until Socket is closed + * @run main/othervm -Xmx32m SocketGrowth + */ + +import java.io.IOException; +import java.net.ServerSocket; +import java.net.Socket; + +public class SocketGrowth { + + public static void main(String[] args) throws IOException { + + try (ServerSocket ss = new ServerSocket(0)) { + try (Socket s = new Socket("localhost", ss.getLocalPort()); + Socket peer = ss.accept()) { + for (int i=0; i<1000000; i++) { + // buggy JDK will run out of memory in this loop + s.getOutputStream(); + // test InputStream also while we're here + s.getInputStream(); + if (i % 100000 == 0) System.out.println(i); + } + } + } + } +} diff --git a/jdk/test/java/net/Socket/setReuseAddress/Basic.java b/jdk/test/java/net/Socket/setReuseAddress/Basic.java index 1b5757589f9..b0014d001fc 100644 --- a/jdk/test/java/net/Socket/setReuseAddress/Basic.java +++ b/jdk/test/java/net/Socket/setReuseAddress/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Socket/setReuseAddress/Restart.java b/jdk/test/java/net/Socket/setReuseAddress/Restart.java index 8287141af4c..7f335bdb989 100644 --- a/jdk/test/java/net/Socket/setReuseAddress/Restart.java +++ b/jdk/test/java/net/Socket/setReuseAddress/Restart.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Socks/SocksServer.java b/jdk/test/java/net/Socks/SocksServer.java index f6720afd56d..6e27e342e94 100644 --- a/jdk/test/java/net/Socks/SocksServer.java +++ b/jdk/test/java/net/Socks/SocksServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/Socks/SocksV4Test.java b/jdk/test/java/net/Socks/SocksV4Test.java index d9786a21789..01546c17126 100644 --- a/jdk/test/java/net/Socks/SocksV4Test.java +++ b/jdk/test/java/net/Socks/SocksV4Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URL/B5086147.sh b/jdk/test/java/net/URL/B5086147.sh index 75d8946f383..e92a8ee2892 100644 --- a/jdk/test/java/net/URL/B5086147.sh +++ b/jdk/test/java/net/URL/B5086147.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URL/OpenStream.java b/jdk/test/java/net/URL/OpenStream.java index 2b5b450cf66..1f293b9e61a 100644 --- a/jdk/test/java/net/URL/OpenStream.java +++ b/jdk/test/java/net/URL/OpenStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URL/PerConnectionProxy.java b/jdk/test/java/net/URL/PerConnectionProxy.java index 72e431d8d3f..71b39d406a2 100644 --- a/jdk/test/java/net/URL/PerConnectionProxy.java +++ b/jdk/test/java/net/URL/PerConnectionProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URL/Test.java b/jdk/test/java/net/URL/Test.java index 58c88182723..4ea4bd7c634 100644 --- a/jdk/test/java/net/URL/Test.java +++ b/jdk/test/java/net/URL/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -322,10 +322,6 @@ public class Test { test("ftp://ftp.is.co.za/rfc/rfc1808.txt") .s("ftp").h("ftp.is.co.za").p("/rfc/rfc1808.txt").z(); - test("gopher://spinaltap.micro.umn.edu/00/Weather/California/Los%20Angeles") - .s("gopher").h("spinaltap.micro.umn.edu") - .p("/00/Weather/California/Los%20Angeles").z(); - test("http://www.math.uio.no/faq/compression-faq/part1.html") .s("http").h("www.math.uio.no").p("/faq/compression-faq/part1.html").z(); diff --git a/jdk/test/java/net/URL/runconstructor.sh b/jdk/test/java/net/URL/runconstructor.sh index 04e397a0795..340f1e91f56 100644 --- a/jdk/test/java/net/URL/runconstructor.sh +++ b/jdk/test/java/net/URL/runconstructor.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URLClassLoader/B5077773.sh b/jdk/test/java/net/URLClassLoader/B5077773.sh index 9724ac95582..b489769ebba 100644 --- a/jdk/test/java/net/URLClassLoader/B5077773.sh +++ b/jdk/test/java/net/URLClassLoader/B5077773.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URLClassLoader/closetest/CloseTest.java b/jdk/test/java/net/URLClassLoader/closetest/CloseTest.java index 740c1f92c51..598b1e6b5d9 100644 --- a/jdk/test/java/net/URLClassLoader/closetest/CloseTest.java +++ b/jdk/test/java/net/URLClassLoader/closetest/CloseTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URLClassLoader/sealing/checksealed.sh b/jdk/test/java/net/URLClassLoader/sealing/checksealed.sh index 80f0adc4f94..c2a048aff59 100644 --- a/jdk/test/java/net/URLClassLoader/sealing/checksealed.sh +++ b/jdk/test/java/net/URLClassLoader/sealing/checksealed.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URLConnection/6212146/test.sh b/jdk/test/java/net/URLConnection/6212146/test.sh index bc24a5e70b6..56a628a427e 100644 --- a/jdk/test/java/net/URLConnection/6212146/test.sh +++ b/jdk/test/java/net/URLConnection/6212146/test.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URLConnection/B5052093.java b/jdk/test/java/net/URLConnection/B5052093.java index 48552eaef83..be1f23ff312 100644 --- a/jdk/test/java/net/URLConnection/B5052093.java +++ b/jdk/test/java/net/URLConnection/B5052093.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/net/URLConnection/Redirect307Test.java b/jdk/test/java/net/URLConnection/Redirect307Test.java index d9e980fff47..a1194b59f3e 100644 --- a/jdk/test/java/net/URLConnection/Redirect307Test.java +++ b/jdk/test/java/net/URLConnection/Redirect307Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/Basic-X.java.template b/jdk/test/java/nio/Buffer/Basic-X.java.template index 1548a9f8277..cae8c26514e 100644 --- a/jdk/test/java/nio/Buffer/Basic-X.java.template +++ b/jdk/test/java/nio/Buffer/Basic-X.java.template @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/Basic.java b/jdk/test/java/nio/Buffer/Basic.java index 0dba4c123b4..aef98306a9c 100644 --- a/jdk/test/java/nio/Buffer/Basic.java +++ b/jdk/test/java/nio/Buffer/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/BasicByte.java b/jdk/test/java/nio/Buffer/BasicByte.java index 861a4335b5b..fc3f7adf398 100644 --- a/jdk/test/java/nio/Buffer/BasicByte.java +++ b/jdk/test/java/nio/Buffer/BasicByte.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/BasicChar.java b/jdk/test/java/nio/Buffer/BasicChar.java index b89916101bf..1710fcf899e 100644 --- a/jdk/test/java/nio/Buffer/BasicChar.java +++ b/jdk/test/java/nio/Buffer/BasicChar.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/BasicDouble.java b/jdk/test/java/nio/Buffer/BasicDouble.java index 97efe8f6847..0f9509064cb 100644 --- a/jdk/test/java/nio/Buffer/BasicDouble.java +++ b/jdk/test/java/nio/Buffer/BasicDouble.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/BasicFloat.java b/jdk/test/java/nio/Buffer/BasicFloat.java index 2f954934a05..0ada0ab971b 100644 --- a/jdk/test/java/nio/Buffer/BasicFloat.java +++ b/jdk/test/java/nio/Buffer/BasicFloat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/BasicInt.java b/jdk/test/java/nio/Buffer/BasicInt.java index a9ce0fb450b..445c9711f78 100644 --- a/jdk/test/java/nio/Buffer/BasicInt.java +++ b/jdk/test/java/nio/Buffer/BasicInt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/BasicLong.java b/jdk/test/java/nio/Buffer/BasicLong.java index 82fb25b8a2d..bc8c5f7a124 100644 --- a/jdk/test/java/nio/Buffer/BasicLong.java +++ b/jdk/test/java/nio/Buffer/BasicLong.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/Buffer/BasicShort.java b/jdk/test/java/nio/Buffer/BasicShort.java index 9f8579d7510..3f0a24bf0df 100644 --- a/jdk/test/java/nio/Buffer/BasicShort.java +++ b/jdk/test/java/nio/Buffer/BasicShort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/MappedByteBuffer/Truncate.java b/jdk/test/java/nio/MappedByteBuffer/Truncate.java index be74c80df93..a0d255c2d0a 100644 --- a/jdk/test/java/nio/MappedByteBuffer/Truncate.java +++ b/jdk/test/java/nio/MappedByteBuffer/Truncate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/AsynchronousChannelGroup/AsExecutor.java b/jdk/test/java/nio/channels/AsynchronousChannelGroup/AsExecutor.java index db720d8bc26..ec4cb09d61c 100644 --- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/AsExecutor.java +++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/AsExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Basic.java b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Basic.java index 8f5fc96c5c8..8c6b5cb7020 100644 --- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Basic.java +++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Restart.java b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Restart.java index 351770f3e77..5fb2f123b02 100644 --- a/jdk/test/java/nio/channels/AsynchronousChannelGroup/Restart.java +++ b/jdk/test/java/nio/channels/AsynchronousChannelGroup/Restart.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/AsynchronousServerSocketChannel/Basic.java b/jdk/test/java/nio/channels/AsynchronousServerSocketChannel/Basic.java index 53f1384823b..753629f8e1b 100644 --- a/jdk/test/java/nio/channels/AsynchronousServerSocketChannel/Basic.java +++ b/jdk/test/java/nio/channels/AsynchronousServerSocketChannel/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/DatagramChannel/BasicMulticastTests.java b/jdk/test/java/nio/channels/DatagramChannel/BasicMulticastTests.java index 8cab0956539..c60b6b7cd94 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/BasicMulticastTests.java +++ b/jdk/test/java/nio/channels/DatagramChannel/BasicMulticastTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/DatagramChannel/MulticastSendReceiveTests.java b/jdk/test/java/nio/channels/DatagramChannel/MulticastSendReceiveTests.java index 3591e83451e..8f0f9a5fba3 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/MulticastSendReceiveTests.java +++ b/jdk/test/java/nio/channels/DatagramChannel/MulticastSendReceiveTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/DatagramChannel/NetworkConfiguration.java b/jdk/test/java/nio/channels/DatagramChannel/NetworkConfiguration.java index 7833a4b892c..6bb5c947f78 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/NetworkConfiguration.java +++ b/jdk/test/java/nio/channels/DatagramChannel/NetworkConfiguration.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/DatagramChannel/Refused.java b/jdk/test/java/nio/channels/DatagramChannel/Refused.java index 62788043e8a..7b495fe0783 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/Refused.java +++ b/jdk/test/java/nio/channels/DatagramChannel/Refused.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java b/jdk/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java index 426a98eb86d..cc3f52f3245 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java +++ b/jdk/test/java/nio/channels/DatagramChannel/SelectWhenRefused.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java b/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java index 1f01bd971b2..bc7146cc982 100644 --- a/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java +++ b/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/FileChannel/ClosedByInterrupt.java b/jdk/test/java/nio/channels/FileChannel/ClosedByInterrupt.java index 26c3d89789a..153a2ad451f 100644 --- a/jdk/test/java/nio/channels/FileChannel/ClosedByInterrupt.java +++ b/jdk/test/java/nio/channels/FileChannel/ClosedByInterrupt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/Selector/OpRead.java b/jdk/test/java/nio/channels/Selector/OpRead.java index cec477901ff..7632d27499d 100644 --- a/jdk/test/java/nio/channels/Selector/OpRead.java +++ b/jdk/test/java/nio/channels/Selector/OpRead.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/Selector/lots_of_updates.sh b/jdk/test/java/nio/channels/Selector/lots_of_updates.sh index c484158c9ff..a34ab99e2b0 100644 --- a/jdk/test/java/nio/channels/Selector/lots_of_updates.sh +++ b/jdk/test/java/nio/channels/Selector/lots_of_updates.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java b/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java index ee5ad4a3cff..a7756989290 100644 --- a/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java +++ b/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/SocketChannel/AdaptSocket.java b/jdk/test/java/nio/channels/SocketChannel/AdaptSocket.java index 09c14e208b9..d479b49ef48 100644 --- a/jdk/test/java/nio/channels/SocketChannel/AdaptSocket.java +++ b/jdk/test/java/nio/channels/SocketChannel/AdaptSocket.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/SocketChannel/Open.sh b/jdk/test/java/nio/channels/SocketChannel/Open.sh index 013f8a1a361..1c959ea7b5b 100644 --- a/jdk/test/java/nio/channels/SocketChannel/Open.sh +++ b/jdk/test/java/nio/channels/SocketChannel/Open.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/SocketChannel/Shutdown.java b/jdk/test/java/nio/channels/SocketChannel/Shutdown.java index 535972bde79..47f71872a36 100644 --- a/jdk/test/java/nio/channels/SocketChannel/Shutdown.java +++ b/jdk/test/java/nio/channels/SocketChannel/Shutdown.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java b/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java index 561d6c9cac0..f1cb496afea 100644 --- a/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java +++ b/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/channels/TestUtil.java b/jdk/test/java/nio/channels/TestUtil.java index c396709ffaf..f06ffc4a847 100644 --- a/jdk/test/java/nio/channels/TestUtil.java +++ b/jdk/test/java/nio/channels/TestUtil.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/charset/Charset/NIOCharsetAvailabilityTest.java b/jdk/test/java/nio/charset/Charset/NIOCharsetAvailabilityTest.java index ce455dd2ed1..78913f2f46a 100644 --- a/jdk/test/java/nio/charset/Charset/NIOCharsetAvailabilityTest.java +++ b/jdk/test/java/nio/charset/Charset/NIOCharsetAvailabilityTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh b/jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh index 8b394281895..49caa0dfebb 100644 --- a/jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh +++ b/jdk/test/java/nio/charset/coders/CheckSJISMappingProp.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/charset/coders/Errors.java b/jdk/test/java/nio/charset/coders/Errors.java index 0b74001dd6e..7c9cf1e6f47 100644 --- a/jdk/test/java/nio/charset/coders/Errors.java +++ b/jdk/test/java/nio/charset/coders/Errors.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/charset/spi/basic.sh b/jdk/test/java/nio/charset/spi/basic.sh index 330e4d0ff2d..c1bdd45dd02 100644 --- a/jdk/test/java/nio/charset/spi/basic.sh +++ b/jdk/test/java/nio/charset/spi/basic.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/file/Files/CustomOptions.java b/jdk/test/java/nio/file/Files/CustomOptions.java index a06b97efd75..9af38f26853 100644 --- a/jdk/test/java/nio/file/Files/CustomOptions.java +++ b/jdk/test/java/nio/file/Files/CustomOptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/file/Path/PathOps.java b/jdk/test/java/nio/file/Path/PathOps.java index 6c2521302c6..865581c9273 100644 --- a/jdk/test/java/nio/file/Path/PathOps.java +++ b/jdk/test/java/nio/file/Path/PathOps.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/file/WatchService/Basic.java b/jdk/test/java/nio/file/WatchService/Basic.java index 019ec96c30f..00965e89d85 100644 --- a/jdk/test/java/nio/file/WatchService/Basic.java +++ b/jdk/test/java/nio/file/WatchService/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/file/WatchService/SensitivityModifier.java b/jdk/test/java/nio/file/WatchService/SensitivityModifier.java index f990870acae..6f9a14cfd60 100644 --- a/jdk/test/java/nio/file/WatchService/SensitivityModifier.java +++ b/jdk/test/java/nio/file/WatchService/SensitivityModifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/nio/file/WatchService/WithSecurityManager.java b/jdk/test/java/nio/file/WatchService/WithSecurityManager.java index ac2a70aa254..c2cd9c316f5 100644 --- a/jdk/test/java/nio/file/WatchService/WithSecurityManager.java +++ b/jdk/test/java/nio/file/WatchService/WithSecurityManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/rmi/activation/checkusage/CheckUsage.java b/jdk/test/java/rmi/activation/checkusage/CheckUsage.java index 095bdc2782e..66ff7ad9445 100644 --- a/jdk/test/java/rmi/activation/checkusage/CheckUsage.java +++ b/jdk/test/java/rmi/activation/checkusage/CheckUsage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/rmi/testlibrary/JavaVM.java b/jdk/test/java/rmi/testlibrary/JavaVM.java index 62be87d8279..d0c3c38a16b 100644 --- a/jdk/test/java/rmi/testlibrary/JavaVM.java +++ b/jdk/test/java/rmi/testlibrary/JavaVM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/rmi/transport/pinLastArguments/PinLastArguments.java b/jdk/test/java/rmi/transport/pinLastArguments/PinLastArguments.java index f82560236c6..bcf1ff0c74d 100644 --- a/jdk/test/java/rmi/transport/pinLastArguments/PinLastArguments.java +++ b/jdk/test/java/rmi/transport/pinLastArguments/PinLastArguments.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh b/jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh index 57af5011eb1..a503697dc73 100644 --- a/jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/ClassLoaderDeadlock.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh index 7daa2379037..53555ee26ff 100644 --- a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh index 53803a6beb0..1109496c723 100644 --- a/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh +++ b/jdk/test/java/security/Security/ClassLoaderDeadlock/Deadlock2.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/security/Security/signedfirst/Dyn.sh b/jdk/test/java/security/Security/signedfirst/Dyn.sh index a98e2ff38be..d87e5ff0139 100644 --- a/jdk/test/java/security/Security/signedfirst/Dyn.sh +++ b/jdk/test/java/security/Security/signedfirst/Dyn.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/security/Security/signedfirst/Static.sh b/jdk/test/java/security/Security/signedfirst/Static.sh index ff663088602..6b41adf31ad 100644 --- a/jdk/test/java/security/Security/signedfirst/Static.sh +++ b/jdk/test/java/security/Security/signedfirst/Static.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/text/Bidi/Bug6850113.java b/jdk/test/java/text/Bidi/Bug6850113.java index 704615049ce..0082c6f5184 100644 --- a/jdk/test/java/text/Bidi/Bug6850113.java +++ b/jdk/test/java/text/Bidi/Bug6850113.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/text/Format/ChoiceFormat/Bug8001209.java b/jdk/test/java/text/Format/ChoiceFormat/Bug8001209.java new file mode 100644 index 00000000000..b9f490fad62 --- /dev/null +++ b/jdk/test/java/text/Format/ChoiceFormat/Bug8001209.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8001209 + * @summary Confirm that the values set by setChoices() are not mutable. + */ +import java.text.*; + +public class Bug8001209 { + + public static void main(String[] args) throws Exception { + boolean err = false; + + // Borrow an example in API doc + double[] limits = {1,2,3,4,5,6,7}; + String[] dayOfWeekNames = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"}; + ChoiceFormat form = new ChoiceFormat(limits, dayOfWeekNames); + ParsePosition status = new ParsePosition(0); + + StringBuilder before = new StringBuilder(); + for (double i = 1.0; i <= 7.0; ++i) { + status.setIndex(0); + String s = form.format(i); + before.append(" "); + before.append(s); + before.append(form.parse(form.format(i),status)); + } + String original = before.toString(); + + double[] newLimits = form.getLimits(); + String[] newFormats = (String[])form.getFormats(); + newFormats[6] = "Doyoubi"; + StringBuilder after = new StringBuilder(); + for (double i = 1.0; i <= 7.0; ++i) { + status.setIndex(0); + String s = form.format(i); + after.append(" "); + after.append(s); + after.append(form.parse(form.format(i),status)); + } + if (!original.equals(after.toString())) { + err = true; + System.err.println(" Expected:" + before + + "\n Got: " + after); + } + + dayOfWeekNames[6] = "Saturday"; + after = new StringBuilder(); + for (double i = 1.0; i <= 7.0; ++i) { + status.setIndex(0); + String s = form.format(i); + after.append(" "); + after.append(s); + after.append(form.parse(form.format(i),status)); + } + if (!original.equals(after.toString())) { + err = true; + System.err.println(" Expected:" + before + + "\n Got: " + after); + } + + if (err) { + throw new RuntimeException("Failed."); + } else { + System.out.println("Passed."); + } + } +} diff --git a/jdk/test/java/util/Collection/BiggernYours.java b/jdk/test/java/util/Collection/BiggernYours.java index ad5e37337b0..24ce930e713 100644 --- a/jdk/test/java/util/Collection/BiggernYours.java +++ b/jdk/test/java/util/Collection/BiggernYours.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Collections/EmptyIterator.java b/jdk/test/java/util/Collections/EmptyIterator.java index 902f03407dc..f7815d32d99 100644 --- a/jdk/test/java/util/Collections/EmptyIterator.java +++ b/jdk/test/java/util/Collections/EmptyIterator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Currency/CurrencyTest.java b/jdk/test/java/util/Currency/CurrencyTest.java index c22813845ce..6971442bfb0 100644 --- a/jdk/test/java/util/Currency/CurrencyTest.java +++ b/jdk/test/java/util/Currency/CurrencyTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Hashtable/HashCode.java b/jdk/test/java/util/Hashtable/HashCode.java index 822ce519764..5a3c3299889 100644 --- a/jdk/test/java/util/Hashtable/HashCode.java +++ b/jdk/test/java/util/Hashtable/HashCode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Hashtable/SimpleSerialization.java b/jdk/test/java/util/Hashtable/SimpleSerialization.java index 537c32e8e74..deb322cb7fc 100644 --- a/jdk/test/java/util/Hashtable/SimpleSerialization.java +++ b/jdk/test/java/util/Hashtable/SimpleSerialization.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Locale/Bug6989440.java b/jdk/test/java/util/Locale/Bug6989440.java index 53475eb3b24..b675d495775 100644 --- a/jdk/test/java/util/Locale/Bug6989440.java +++ b/jdk/test/java/util/Locale/Bug6989440.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Locale/LocaleCategory.sh b/jdk/test/java/util/Locale/LocaleCategory.sh index 618e00f3409..34becd35a98 100644 --- a/jdk/test/java/util/Locale/LocaleCategory.sh +++ b/jdk/test/java/util/Locale/LocaleCategory.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Locale/LocaleProviders.java b/jdk/test/java/util/Locale/LocaleProviders.java index 98a999b39d4..b6320727943 100644 --- a/jdk/test/java/util/Locale/LocaleProviders.java +++ b/jdk/test/java/util/Locale/LocaleProviders.java @@ -47,6 +47,14 @@ public class LocaleProviders { bug7198834Test(); break; + case "tzNameTest": + tzNameTest(args[1]); + break; + + case "bug8001440Test": + bug8001440Test(); + break; + default: throw new RuntimeException("Test method '"+methodName+"' not found."); } @@ -81,4 +89,18 @@ public class LocaleProviders { System.out.println("Windows HOST locale adapter not found. Ignoring this test."); } } + + static void tzNameTest(String id) { + TimeZone tz = TimeZone.getTimeZone(id); + String tzName = tz.getDisplayName(false, TimeZone.SHORT, Locale.US); + if (tzName.startsWith("GMT")) { + throw new RuntimeException("JRE's localized time zone name for "+id+" could not be retrieved. Returned name was: "+tzName); + } + } + + static void bug8001440Test() { + Locale locale = Locale.forLanguageTag("th-TH-u-nu-hoge"); + NumberFormat nf = NumberFormat.getInstance(locale); + String nu = nf.format(1234560); + } } diff --git a/jdk/test/java/util/Locale/LocaleProviders.sh b/jdk/test/java/util/Locale/LocaleProviders.sh index 703d1f0f8a3..59e43fcff76 100644 --- a/jdk/test/java/util/Locale/LocaleProviders.sh +++ b/jdk/test/java/util/Locale/LocaleProviders.sh @@ -23,7 +23,7 @@ #!/bin/sh # # @test -# @bug 6336885 7196799 7197573 7198834 +# @bug 6336885 7196799 7197573 7198834 8000245 8000615 8001440 # @summary tests for "java.locale.providers" system property # @compile -XDignore.symbol.file LocaleProviders.java # @run shell/timeout=600 LocaleProviders.sh @@ -65,6 +65,36 @@ case "$OS" in ;; esac +# create an SPI implementation +mk() { + d=`dirname $1` + if [ ! -d $d ]; then mkdir -p $d; fi + cat - >$1 +} + +SPIDIR=${TESTCLASSES}${FS}spi +rm -rf ${SPIDIR} +mk ${SPIDIR}${FS}src${FS}tznp.java << EOF +import java.util.spi.TimeZoneNameProvider; +import java.util.Locale; + +public class tznp extends TimeZoneNameProvider { + public String getDisplayName(String ID, boolean daylight, int style, Locale locale) { + return "tznp"; + } + + public Locale[] getAvailableLocales() { + Locale[] locales = {Locale.GERMAN, Locale.US, Locale.JAPANESE, Locale.CHINESE}; + return locales; + } +} +EOF +mk ${SPIDIR}${FS}dest${FS}META-INF${FS}services${FS}java.util.spi.TimeZoneNameProvider << EOF +tznp +EOF +${TESTJAVA}${FS}bin${FS}javac -d ${SPIDIR}${FS}dest ${SPIDIR}${FS}src${FS}tznp.java +${TESTJAVA}${FS}bin${FS}jar cvf ${SPIDIR}${FS}tznp.jar -C ${SPIDIR}${FS}dest . + # get the platform default locales PLATDEF=`${TESTJAVA}${FS}bin${FS}java -classpath ${TESTCLASSES} LocaleProviders getPlatformLocale display` DEFLANG=`echo ${PLATDEF} | sed -e "s/,.*//"` @@ -199,4 +229,28 @@ PARAM2= PARAM3= runTest +# testing 8000245 fix. +METHODNAME=tzNameTest +PREFLIST="JRE -Djava.ext.dirs=${SPIDIR}" +PARAM1=Europe/Moscow +PARAM2= +PARAM3= +runTest + +# testing 8000615 fix. +METHODNAME=tzNameTest +PREFLIST="JRE -Djava.ext.dirs=${SPIDIR}" +PARAM1=America/Los_Angeles +PARAM2= +PARAM3= +runTest + +# testing 8001440 fix. +METHODNAME=bug8001440Test +PREFLIST=CLDR +PARAM1= +PARAM2= +PARAM3= +runTest + exit $result diff --git a/jdk/test/java/util/Map/EntryHashCode.java b/jdk/test/java/util/Map/EntryHashCode.java new file mode 100644 index 00000000000..98ef36500ec --- /dev/null +++ b/jdk/test/java/util/Map/EntryHashCode.java @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * Portions Copyright (c) 2012 IBM Corporation + */ + +/* + * @test + * @bug 8000955 + * @summary Map.Entry implementations need to comply with Map.Entry.hashCode() defined behaviour. + * @author ngmr + */ +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentSkipListMap; + +public class EntryHashCode { + private static final int TEST_SIZE = 100; + + static final Object[][] entryData = { + new Object[TEST_SIZE], + new Object[TEST_SIZE] + }; + + @SuppressWarnings("unchecked") + static final Map[] maps = (Map[])new Map[] { + new HashMap<>(), + new Hashtable<>(), + new IdentityHashMap<>(), + new LinkedHashMap<>(), + new TreeMap<>(), + new WeakHashMap<>(), + new ConcurrentHashMap<>(), + new ConcurrentSkipListMap<>() + }; + + static { + for (int i = 0; i < entryData[0].length; i++) { + // key objects need to be Comparable for use in TreeMap + entryData[0][i] = new Comparable() { + public int compareTo(Object o) { + return (hashCode() - o.hashCode()); + } + }; + entryData[1][i] = new Object(); + } + } + + private static void addTestData(Map map) { + for (int i = 0; i < entryData[0].length; i++) { + map.put(entryData[0][i], entryData[1][i]); + } + } + + public static void main(String[] args) throws Exception { + Exception failure = null; + for (Map map: maps) { + addTestData(map); + + try { + for (Map.Entry e: map.entrySet()) { + Object key = e.getKey(); + Object value = e.getValue(); + int expectedEntryHashCode = + (Objects.hashCode(key) ^ Objects.hashCode(value)); + + if (e.hashCode() != expectedEntryHashCode) { + throw new Exception("FAILURE: " + + e.getClass().getName() + + ".hashCode() does not conform to defined" + + " behaviour of java.util.Map.Entry.hashCode()"); + } + } + } catch (Exception e) { + if (failure == null) { + failure = e; + } else { + failure.addSuppressed(e); + } + } finally { + map.clear(); + } + } + if (failure != null) { + throw failure; + } + } +} diff --git a/jdk/test/java/util/Map/Get.java b/jdk/test/java/util/Map/Get.java index 870a7b89ae4..a6878f75d90 100644 --- a/jdk/test/java/util/Map/Get.java +++ b/jdk/test/java/util/Map/Get.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java index 29f0eee7d21..ebffc3f4f3c 100644 --- a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.java @@ -48,14 +48,18 @@ public class CurrencyNameProviderTest extends ProviderTest { void test1() { com.bar.CurrencyNameProviderImpl cnp = new com.bar.CurrencyNameProviderImpl(); + com.bar.CurrencyNameProviderImpl2 cnp2 = new com.bar.CurrencyNameProviderImpl2(); Locale[] availloc = Locale.getAvailableLocales(); Locale[] testloc = availloc.clone(); - List providerloc = Arrays.asList(cnp.getAvailableLocales()); + List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getCurrencyNameProvider().getAvailableLocales()); + List providerloc = new ArrayList(); + providerloc.addAll(Arrays.asList(cnp.getAvailableLocales())); + providerloc.addAll(Arrays.asList(cnp2.getAvailableLocales())); for (Locale target: availloc) { // pure JRE implementation OpenListResourceBundle rb = (OpenListResourceBundle)LocaleProviderAdapter.forJRE().getLocaleData().getCurrencyNames(target); - boolean jreHasBundle = rb.getLocale().equals(target); + boolean jreSupportsTarget = jreimplloc.contains(target); for (Locale test: testloc) { // get a Currency instance @@ -78,31 +82,33 @@ public class CurrencyNameProviderTest extends ProviderTest { String providerscurrency = null; String providersname = null; if (providerloc.contains(target)) { + if (cnp.isSupportedLocale(target)) { providerscurrency = cnp.getSymbol(c.getCurrencyCode(), target); providersname = cnp.getDisplayName(c.getCurrencyCode(), target); + } else { + providerscurrency = cnp2.getSymbol(c.getCurrencyCode(), target); + providersname = cnp2.getDisplayName(c.getCurrencyCode(), target); + } } - // JRE's name (if any) + // JRE's name String jrescurrency = null; String jresname = null; String key = c.getCurrencyCode(); String nameKey = key.toLowerCase(Locale.ROOT); - if (jreHasBundle) { + if (jreSupportsTarget) { try { jrescurrency = rb.getString(key); - } catch (MissingResourceException mre) { - // JRE does not have any resource, "jrescurrency" should remain null - } + } catch (MissingResourceException mre) {} try { jresname = rb.getString(nameKey); - } catch (MissingResourceException mre) { - // JRE does not have any resource, "jresname" should remain null - } + } catch (MissingResourceException mre) {} } - checkValidity(target, jrescurrency, providerscurrency, currencyresult, jrescurrency!=null); + checkValidity(target, jrescurrency, providerscurrency, currencyresult, + jreSupportsTarget && jrescurrency != null); checkValidity(target, jresname, providersname, nameresult, - jreHasBundle && rb.handleGetKeys().contains(nameKey)); + jreSupportsTarget && jresname != null); } } } @@ -111,18 +117,22 @@ public class CurrencyNameProviderTest extends ProviderTest { final String pattern = "###,###\u00A4"; final String YEN_IN_OSAKA = "100,000\u5186\u3084\u3002"; final String YEN_IN_KYOTO = "100,000\u5186\u3069\u3059\u3002"; + final String YEN_IN_TOKYO= "100,000JPY-tokyo"; final Locale OSAKA = new Locale("ja", "JP", "osaka"); final Locale KYOTO = new Locale("ja", "JP", "kyoto"); + final Locale TOKYO = new Locale("ja", "JP", "tokyo"); Integer i = new Integer(100000); String formatted; DecimalFormat df; void test2() { + Locale defloc = Locale.getDefault(); + try { df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance(OSAKA)); System.out.println(formatted = df.format(i)); if(!formatted.equals(YEN_IN_OSAKA)) { - throw new RuntimeException("formatted zone names mismatch. " + + throw new RuntimeException("formatted currency names mismatch. " + "Should match with " + YEN_IN_OSAKA); } @@ -132,13 +142,25 @@ public class CurrencyNameProviderTest extends ProviderTest { df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance()); System.out.println(formatted = df.format(i)); if(!formatted.equals(YEN_IN_KYOTO)) { - throw new RuntimeException("formatted zone names mismatch. " + + throw new RuntimeException("formatted currency names mismatch. " + "Should match with " + YEN_IN_KYOTO); } df.parse(YEN_IN_KYOTO); + + Locale.setDefault(TOKYO); + df = new DecimalFormat(pattern, DecimalFormatSymbols.getInstance()); + System.out.println(formatted = df.format(i)); + if(!formatted.equals(YEN_IN_TOKYO)) { + throw new RuntimeException("formatted currency names mismatch. " + + "Should match with " + YEN_IN_TOKYO); + } + + df.parse(YEN_IN_TOKYO); } catch (ParseException pe) { throw new RuntimeException("parse error occured" + pe); + } finally { + Locale.setDefault(defloc); } } } diff --git a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh index a0a9d582eae..9cfc700766a 100644 --- a/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh +++ b/jdk/test/java/util/PluggableLocale/CurrencyNameProviderTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,6 @@ #!/bin/sh # # @test -# @bug 4052440 +# @bug 4052440 8000997 # @summary CurrencyNameProvider tests # @run shell ExecTest.sh bar CurrencyNameProviderTest true diff --git a/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java b/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java index 20547219f53..44d537b25ca 100644 --- a/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.java @@ -44,6 +44,7 @@ public class DateFormatSymbolsProviderTest extends ProviderTest { DateFormatSymbolsProviderTest() { availableLocalesTest(); objectValidityTest(); + hashCodeTest(); } void availableLocalesTest() { @@ -124,4 +125,17 @@ public class DateFormatSymbolsProviderTest extends ProviderTest { } } } + + // Bug 7200341. + void hashCodeTest() { + for (Locale target: availloc) { + // look for provider's object + DateFormatSymbols dfs = DateFormatSymbols.getInstance(target); + if (dfs.getClass().getSimpleName().equals("FooDateFormatSymbols")) { + // call its hashCode(). success if no ArrayIndexOutOfBoundsException is thrown. + dfs.hashCode(); + break; + } + } + } } diff --git a/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.sh b/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.sh index 22c97d0a1ad..9103e8283b9 100644 --- a/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.sh +++ b/jdk/test/java/util/PluggableLocale/DateFormatSymbolsProviderTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,6 @@ #!/bin/sh # # @test -# @bug 4052440 +# @bug 4052440 7200341 # @summary DateFormatSymbolsProvider tests # @run shell ExecTest.sh foo DateFormatSymbolsProviderTest true diff --git a/jdk/test/java/util/PluggableLocale/ExecTest.sh b/jdk/test/java/util/PluggableLocale/ExecTest.sh index 5a125887d65..18bd8d16f61 100644 --- a/jdk/test/java/util/PluggableLocale/ExecTest.sh +++ b/jdk/test/java/util/PluggableLocale/ExecTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/PluggableLocale/GenericTest.java b/jdk/test/java/util/PluggableLocale/GenericTest.java index 3987f986bea..288d7a3ab04 100644 --- a/jdk/test/java/util/PluggableLocale/GenericTest.java +++ b/jdk/test/java/util/PluggableLocale/GenericTest.java @@ -38,6 +38,7 @@ public class GenericTest { com.foo.DecimalFormatSymbolsProviderImpl decimalFSP = new com.foo.DecimalFormatSymbolsProviderImpl(); com.foo.NumberFormatProviderImpl numberFP = new com.foo.NumberFormatProviderImpl(); com.bar.CurrencyNameProviderImpl currencyNP = new com.bar.CurrencyNameProviderImpl(); + com.bar.CurrencyNameProviderImpl2 currencyNP2 = new com.bar.CurrencyNameProviderImpl2(); com.bar.LocaleNameProviderImpl localeNP = new com.bar.LocaleNameProviderImpl(); com.bar.TimeZoneNameProviderImpl tzNP = new com.bar.TimeZoneNameProviderImpl(); com.bar.CalendarDataProviderImpl calDataP = new com.bar.CalendarDataProviderImpl(); @@ -68,6 +69,7 @@ public class GenericTest { expected.addAll(Arrays.asList(decimalFSP.getAvailableLocales())); expected.addAll(Arrays.asList(numberFP.getAvailableLocales())); expected.addAll(Arrays.asList(currencyNP.getAvailableLocales())); + expected.addAll(Arrays.asList(currencyNP2.getAvailableLocales())); expected.addAll(Arrays.asList(localeNP.getAvailableLocales())); expected.addAll(Arrays.asList(tzNP.getAvailableLocales())); expected.addAll(Arrays.asList(calDataP.getAvailableLocales())); diff --git a/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.java b/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.java index e8cc6c908fd..c82fab0a514 100644 --- a/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.java @@ -36,15 +36,21 @@ public class LocaleNameProviderTest extends ProviderTest { } LocaleNameProviderTest() { + checkAvailLocValidityTest(); + variantFallbackTest(); + } + + void checkAvailLocValidityTest() { com.bar.LocaleNameProviderImpl lnp = new com.bar.LocaleNameProviderImpl(); Locale[] availloc = Locale.getAvailableLocales(); Locale[] testloc = availloc.clone(); + List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getLocaleNameProvider().getAvailableLocales()); List providerloc = Arrays.asList(lnp.getAvailableLocales()); for (Locale target: availloc) { // pure JRE implementation OpenListResourceBundle rb = LocaleProviderAdapter.forJRE().getLocaleData().getLocaleNames(target); - boolean jreHasBundle = rb.getLocale().equals(target); + boolean jreSupportsTarget = jreimplloc.contains(target); for (Locale test: testloc) { // codes @@ -67,7 +73,7 @@ public class LocaleNameProviderTest extends ProviderTest { providersvrnt = lnp.getDisplayVariant(vrnt, target); } - // JRE's name (if any) + // JRE's name String jreslang = null; String jresctry = null; String jresvrnt = null; @@ -84,18 +90,41 @@ public class LocaleNameProviderTest extends ProviderTest { if (!vrnt.equals("")) { try { jresvrnt = rb.getString("%%"+vrnt); - } catch (MissingResourceException mre) { - jresvrnt = vrnt; - } + } catch (MissingResourceException mre) {} } + System.out.print("For key: "+lang+" "); checkValidity(target, jreslang, providerslang, langresult, - jreHasBundle && rb.handleGetKeys().contains(lang)); + jreSupportsTarget && jreslang != null); + System.out.print("For key: "+ctry+" "); checkValidity(target, jresctry, providersctry, ctryresult, - jreHasBundle && rb.handleGetKeys().contains(ctry)); + jreSupportsTarget && jresctry != null); + System.out.print("For key: "+vrnt+" "); checkValidity(target, jresvrnt, providersvrnt, vrntresult, - jreHasBundle && rb.handleGetKeys().contains("%%"+vrnt)); + jreSupportsTarget && jresvrnt != null); } } } + + void variantFallbackTest() { + Locale YY = new Locale("yy", "YY", "YYYY"); + Locale YY_suffix = new Locale("yy", "YY", "YYYY_suffix"); + String retVrnt = null; + String message = "variantFallbackTest() succeeded."; + + + try { + YY.getDisplayVariant(YY_suffix); + message = "variantFallbackTest() failed. Either provider wasn't invoked, or invoked without suffix."; + } catch (RuntimeException re) { + retVrnt = re.getMessage(); + if (YY_suffix.getVariant().equals(retVrnt)) { + System.out.println(message); + return; +} + message = "variantFallbackTest() failed. Returned variant: "+retVrnt; + } + + throw new RuntimeException(message); + } } diff --git a/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.sh b/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.sh index 4e7e85b0127..0df042631d3 100644 --- a/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.sh +++ b/jdk/test/java/util/PluggableLocale/LocaleNameProviderTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,6 @@ #!/bin/sh # # @test -# @bug 4052440 +# @bug 4052440 8000273 # @summary LocaleNameProvider tests # @run shell ExecTest.sh bar LocaleNameProviderTest true diff --git a/jdk/test/java/util/PluggableLocale/ProviderTest.java b/jdk/test/java/util/PluggableLocale/ProviderTest.java index 57c8b43de60..32b5b639954 100644 --- a/jdk/test/java/util/PluggableLocale/ProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/ProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,5 +42,7 @@ public class ProviderTest { "result do not match with provider's result. target: "+target+" result: "+result+" providers: "+providers); } } + + System.out.println("checkValidity succeeded. target: "+target+" result: "+result+" jre's: "+jres+" providers: "+providers+" jre-preferred: "+jresPreferred); } } diff --git a/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java b/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java index 4795ce82c97..cc71e6c6543 100644 --- a/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java +++ b/jdk/test/java/util/PluggableLocale/TimeZoneNameProviderTest.java @@ -45,13 +45,14 @@ public class TimeZoneNameProviderTest extends ProviderTest { void test1() { Locale[] available = Locale.getAvailableLocales(); + List jreimplloc = Arrays.asList(LocaleProviderAdapter.forJRE().getTimeZoneNameProvider().getAvailableLocales()); List providerLocales = Arrays.asList(tznp.getAvailableLocales()); String[] ids = TimeZone.getAvailableIDs(); for (Locale target: available) { // pure JRE implementation OpenListResourceBundle rb = LocaleProviderAdapter.forJRE().getLocaleData().getTimeZoneNames(target); - boolean jreHasBundle = rb.getLocale().equals(target); + boolean jreSupportsTarget = jreimplloc.contains(target); for (String id: ids) { // the time zone @@ -59,7 +60,7 @@ public class TimeZoneNameProviderTest extends ProviderTest { // JRE string array for the id String[] jrearray = null; - if (jreHasBundle) { + if (jreSupportsTarget) { try { jrearray = rb.getStringArray(id); } catch (MissingResourceException mre) {} @@ -75,14 +76,14 @@ public class TimeZoneNameProviderTest extends ProviderTest { providersname = tznp.getDisplayName(id, i>=3, i%2, target); } - // JRE's name (if any) + // JRE's name String jresname = null; if (jrearray != null) { jresname = jrearray[i]; } checkValidity(target, jresname, providersname, name, - jreHasBundle && rb.handleGetKeys().contains(id)); + jreSupportsTarget && jresname != null); } } } diff --git a/jdk/test/java/util/PluggableLocale/barprovider.jar b/jdk/test/java/util/PluggableLocale/barprovider.jar index dd8b4d01aa3..901b2b2b7f6 100644 Binary files a/jdk/test/java/util/PluggableLocale/barprovider.jar and b/jdk/test/java/util/PluggableLocale/barprovider.jar differ diff --git a/jdk/test/java/util/PluggableLocale/fooprovider.jar b/jdk/test/java/util/PluggableLocale/fooprovider.jar index c1b5723f9b9..125dbe17756 100644 Binary files a/jdk/test/java/util/PluggableLocale/fooprovider.jar and b/jdk/test/java/util/PluggableLocale/fooprovider.jar differ diff --git a/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java b/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java new file mode 100644 index 00000000000..5ed7222f95e --- /dev/null +++ b/jdk/test/java/util/PluggableLocale/providersrc/CurrencyNameProviderImpl2.java @@ -0,0 +1,63 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * + */ + +package com.bar; + +import java.util.*; +import java.util.spi.*; + +import com.foobar.Utils; + +public class CurrencyNameProviderImpl2 extends CurrencyNameProvider { + static Locale[] avail = {new Locale("ja", "JP", "tokyo")}; + public Locale[] getAvailableLocales() { + return avail; + } + + @Override + public String getSymbol(String c, Locale locale) { + if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { + throw new IllegalArgumentException("locale is not supported: "+locale); + } + + if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) { + return "JPY-tokyo"; + } + return null; + } + + @Override + public String getDisplayName(String c, Locale locale) { + if (!Utils.supportsLocale(Arrays.asList(avail), locale)) { + throw new IllegalArgumentException("locale is not supported: "+locale); + } + + if (c.equals("JPY") && Utils.supportsLocale(avail[0], locale)) { + return "JPY-tokyo"; + } + return null; + } +} diff --git a/jdk/test/java/util/PluggableLocale/providersrc/DateFormatSymbolsProviderImpl.java b/jdk/test/java/util/PluggableLocale/providersrc/DateFormatSymbolsProviderImpl.java index 34a201afb87..25e044b91da 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/DateFormatSymbolsProviderImpl.java +++ b/jdk/test/java/util/PluggableLocale/providersrc/DateFormatSymbolsProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -221,5 +221,10 @@ public class DateFormatSymbolsProviderImpl extends DateFormatSymbolsProvider { public void setAmPmStrings(String[] newAmpms) { ampms = newAmpms; } + + @Override + public String[][] getZoneStrings() { + return new String[0][0]; + } } } diff --git a/jdk/test/java/util/PluggableLocale/providersrc/LocaleNameProviderImpl.java b/jdk/test/java/util/PluggableLocale/providersrc/LocaleNameProviderImpl.java index fc3beb8d723..b9f322e5f28 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/LocaleNameProviderImpl.java +++ b/jdk/test/java/util/PluggableLocale/providersrc/LocaleNameProviderImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,57 +37,64 @@ public class LocaleNameProviderImpl extends LocaleNameProvider { Locale.JAPAN, new Locale("ja", "JP", "osaka"), new Locale("ja", "JP", "kyoto"), - new Locale("xx")}; + new Locale("xx"), + new Locale("yy", "YY", "YYYY")}; static List availList = Arrays.asList(avail); public Locale[] getAvailableLocales() { return avail; } + @Override public String getDisplayLanguage(String lang, Locale target) { + return getDisplayString(lang, target); + } + + @Override + public String getDisplayCountry(String ctry, Locale target) { + return getDisplayString(ctry, target); + } + + @Override + public String getDisplayVariant(String vrnt, Locale target) { + return getDisplayString(vrnt, target); + } + + private String getDisplayString(String key, Locale target) { if (!Utils.supportsLocale(availList, target)) { throw new IllegalArgumentException("locale is not supported: "+target); } String ret = null; + if (target.getLanguage().equals("yy") && + target.getCountry().equals("YY")) { + String vrnt = target.getVariant(); + if (vrnt.startsWith("YYYY")) { + switch (key) { + case "yy": + case "YY": + ret = "waiwai"; + break; + + case "YYYY": + if (vrnt.equals("YYYY_suffix")) { + // for LocaleNameProviderTest.variantFallbackTest() + throw new RuntimeException(vrnt); + } else { + ret = "waiwai"; + } + break; + } + } + } else { + // resource bundle based (allows fallback) try { ResourceBundle rb = ResourceBundle.getBundle("com.bar.LocaleNames", target); - ret = rb.getString(lang); + ret = rb.getString(key); } catch (MissingResourceException mre) { } + } return ret; } - - public String getDisplayCountry(String ctry, Locale target) { - if (!Utils.supportsLocale(availList, target)) { - throw new IllegalArgumentException("locale is not supported: "+target); } - - String ret = null; - - try { - ResourceBundle rb = ResourceBundle.getBundle("LocaleNames", target); - ret = rb.getString(ctry); - } catch (MissingResourceException mre) { - } - - return ret; - } - - public String getDisplayVariant(String vrnt, Locale target) { - if (!Utils.supportsLocale(availList, target)) { - throw new IllegalArgumentException("locale is not supported: "+target); - } - - String ret = null; - - try { - ResourceBundle rb = ResourceBundle.getBundle("LocaleNames", target); - ret = rb.getString(vrnt); - } catch (MissingResourceException mre) { - } - - return ret; - } -} diff --git a/jdk/test/java/util/PluggableLocale/providersrc/Makefile b/jdk/test/java/util/PluggableLocale/providersrc/Makefile index d69cecd149d..3c550992691 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/Makefile +++ b/jdk/test/java/util/PluggableLocale/providersrc/Makefile @@ -35,6 +35,7 @@ FOOFILES_JAVA = \ BARFILES_JAVA = \ CurrencyNameProviderImpl.java \ + CurrencyNameProviderImpl2.java \ TimeZoneNameProviderImpl.java \ LocaleNameProviderImpl.java \ CalendarDataProviderImpl.java \ diff --git a/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider index 938d6b090c1..9817ed386e2 100644 --- a/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider +++ b/jdk/test/java/util/PluggableLocale/providersrc/java.util.spi.CurrencyNameProvider @@ -5,3 +5,4 @@ # implementation class # com.bar.CurrencyNameProviderImpl +com.bar.CurrencyNameProviderImpl2 diff --git a/jdk/test/java/util/Properties/LoadAndStoreXML.java b/jdk/test/java/util/Properties/LoadAndStoreXML.java index 8fc5e73ab44..fd1d81f47e6 100644 --- a/jdk/test/java/util/Properties/LoadAndStoreXML.java +++ b/jdk/test/java/util/Properties/LoadAndStoreXML.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8000354 + * @bug 8000354 8000685 * @summary Basic test of storeToXML and loadToXML */ @@ -66,13 +66,13 @@ public class LoadAndStoreXML { * Sanity test that properties saved with Properties#storeToXML can be * read with Properties#loadFromXML. */ - static void test() throws IOException { + static void testLoadAndStore(String encoding) throws IOException { Properties props = new Properties(); props.put("k1", "foo"); props.put("k2", "bar"); ByteArrayOutputStream out = new ByteArrayOutputStream(); - props.storeToXML(out, "no comment"); + props.storeToXML(out, null, encoding); Properties p = new Properties(); ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray()); @@ -85,19 +85,74 @@ public class LoadAndStoreXML { } } + /** + * Test loadFromXML with a document that does not have an encoding declaration + */ + static void testLoadWithoutEncoding() throws IOException { + Properties expected = new Properties(); + expected.put("foo", "bar"); + + String s = "" + + "" + + "" + + "bar" + + ""; + ByteArrayInputStream in = new ByteArrayInputStream(s.getBytes("UTF-8")); + Properties props = new Properties(); + props.loadFromXML(in); + + if (!props.equals(expected)) { + System.err.println("loaded: " + props + ", expected: " + expected); + throw new RuntimeException("Test failed"); + } + } + + /** + * Test loadFromXML with unsupported encoding + */ + static void testLoadWithBadEncoding() throws IOException { + String s = "" + + "" + + "" + + "bar" + + ""; + ByteArrayInputStream in = new ByteArrayInputStream(s.getBytes("UTF-8")); + Properties props = new Properties(); + try { + props.loadFromXML(in); + throw new RuntimeException("UnsupportedEncodingException expected"); + } catch (UnsupportedEncodingException expected) { } + } + + /** + * Test storeToXML with unsupported encoding + */ + static void testStoreWithBadEncoding() throws IOException { + Properties props = new Properties(); + props.put("foo", "bar"); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + try { + props.storeToXML(out, null, "BAD"); + throw new RuntimeException("UnsupportedEncodingException expected"); + } catch (UnsupportedEncodingException expected) { } + } + public static void main(String[] args) throws IOException { - // run test without security manager - test(); + testLoadAndStore("UTF-8"); + testLoadAndStore("UTF-16"); + testLoadWithoutEncoding(); + testLoadWithBadEncoding(); + testStoreWithBadEncoding(); - // re-run test with security manager + // re-run sanity test with security manager Policy orig = Policy.getPolicy(); Policy p = new SimplePolicy(new RuntimePermission("setSecurityManager"), new PropertyPermission("line.separator", "read")); Policy.setPolicy(p); System.setSecurityManager(new SecurityManager()); try { - test(); + testLoadAndStore("UTF-8"); } finally { // turn off security manager and restore policy System.setSecurityManager(null); diff --git a/jdk/test/java/util/ResourceBundle/Bug4168625Test.java b/jdk/test/java/util/ResourceBundle/Bug4168625Test.java index cf511101bf1..09568a24b9b 100644 --- a/jdk/test/java/util/ResourceBundle/Bug4168625Test.java +++ b/jdk/test/java/util/ResourceBundle/Bug4168625Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh b/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh index 59128d6faec..ef17b412172 100644 --- a/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh +++ b/jdk/test/java/util/ResourceBundle/Bug6299235Test.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/ResourceBundle/Control/Bug6530694.java b/jdk/test/java/util/ResourceBundle/Control/Bug6530694.java index 7463681a918..97bb919d6bd 100644 --- a/jdk/test/java/util/ResourceBundle/Control/Bug6530694.java +++ b/jdk/test/java/util/ResourceBundle/Control/Bug6530694.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/ServiceLoader/Basic.java b/jdk/test/java/util/ServiceLoader/Basic.java index 9912d688eb4..9677db7ccbe 100644 --- a/jdk/test/java/util/ServiceLoader/Basic.java +++ b/jdk/test/java/util/ServiceLoader/Basic.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,10 +44,41 @@ public class Basic { eq, s1, s2)); } - public static void main(String[] args) { + static abstract class TestLoader { + String name; - ServiceLoader sl = ServiceLoader.load(FooService.class); - out.format("%s%n", sl); + TestLoader(String name) { this.name = name; } + + abstract ServiceLoader load(); + } + + static TestLoader tcclLoader = new TestLoader("Thread context class loader") { + ServiceLoader load() { + return ServiceLoader.load(FooService.class); + } + }; + + static TestLoader systemClLoader = new TestLoader("System class loader") { + ServiceLoader load() { + return ServiceLoader.load(FooService.class, ClassLoader.getSystemClassLoader()); + } + }; + + static TestLoader nullClLoader = new TestLoader("null (defer to system class loader)") { + ServiceLoader load() { + return ServiceLoader.load(FooService.class, null); + } + }; + + public static void main(String[] args) { + for (TestLoader tl : Arrays.asList(tcclLoader, systemClLoader, nullClLoader)) { + test(tl); + } + } + + static void test(TestLoader tl) { + ServiceLoader sl = tl.load(); + out.format("%s: %s%n", tl.name, sl); // Providers are cached Set ps = setOf(sl); @@ -58,5 +89,4 @@ public class Basic { checkEquals(ps, setOf(sl), false); } - } diff --git a/jdk/test/java/util/ServiceLoader/basic.sh b/jdk/test/java/util/ServiceLoader/basic.sh index dc9305164a6..259b2e15636 100644 --- a/jdk/test/java/util/ServiceLoader/basic.sh +++ b/jdk/test/java/util/ServiceLoader/basic.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -22,7 +22,7 @@ # # @test -# @bug 4640520 6354623 +# @bug 4640520 6354623 7198496 # @summary Unit test for java.util.ServiceLoader # # @build Basic Load FooService FooProvider1 FooProvider2 FooProvider3 diff --git a/jdk/test/java/util/Timer/Args.java b/jdk/test/java/util/Timer/Args.java index ab8065c8670..3198a93fbe0 100644 --- a/jdk/test/java/util/Timer/Args.java +++ b/jdk/test/java/util/Timer/Args.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/Timer/KillThread.java b/jdk/test/java/util/Timer/KillThread.java index dee5eeea208..20733a61bc0 100644 --- a/jdk/test/java/util/Timer/KillThread.java +++ b/jdk/test/java/util/Timer/KillThread.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/UUID/UUIDTest.java b/jdk/test/java/util/UUID/UUIDTest.java index dca2d775232..de73a66a183 100644 --- a/jdk/test/java/util/UUID/UUIDTest.java +++ b/jdk/test/java/util/UUID/UUIDTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/concurrent/FutureTask/BlockingTaskExecutor.java b/jdk/test/java/util/concurrent/FutureTask/BlockingTaskExecutor.java index 05b37082989..b37664aeaf9 100644 --- a/jdk/test/java/util/concurrent/FutureTask/BlockingTaskExecutor.java +++ b/jdk/test/java/util/concurrent/FutureTask/BlockingTaskExecutor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/concurrent/ThreadPoolExecutor/Custom.java b/jdk/test/java/util/concurrent/ThreadPoolExecutor/Custom.java index b05b3e826b7..75e5a9144b9 100644 --- a/jdk/test/java/util/concurrent/ThreadPoolExecutor/Custom.java +++ b/jdk/test/java/util/concurrent/ThreadPoolExecutor/Custom.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/concurrent/locks/Lock/FlakyMutex.java b/jdk/test/java/util/concurrent/locks/Lock/FlakyMutex.java index 7722e84e686..e00cf4c612a 100644 --- a/jdk/test/java/util/concurrent/locks/Lock/FlakyMutex.java +++ b/jdk/test/java/util/concurrent/locks/Lock/FlakyMutex.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/concurrent/locks/Lock/TimedAcquireLeak.java b/jdk/test/java/util/concurrent/locks/Lock/TimedAcquireLeak.java index 72b8f8a5cb8..62749bf6ba3 100644 --- a/jdk/test/java/util/concurrent/locks/Lock/TimedAcquireLeak.java +++ b/jdk/test/java/util/concurrent/locks/Lock/TimedAcquireLeak.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/logging/LoggingDeadlock4.java b/jdk/test/java/util/logging/LoggingDeadlock4.java index 39956255783..f52d74b1277 100644 --- a/jdk/test/java/util/logging/LoggingDeadlock4.java +++ b/jdk/test/java/util/logging/LoggingDeadlock4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/logging/LoggingMXBeanTest.java b/jdk/test/java/util/logging/LoggingMXBeanTest.java index e6c694d37e4..a01e57c1357 100644 --- a/jdk/test/java/util/logging/LoggingMXBeanTest.java +++ b/jdk/test/java/util/logging/LoggingMXBeanTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,6 +43,8 @@ public class LoggingMXBeanTest ObjectName objectName = null; static String LOGGER_NAME_1 = "com.sun.management.Logger1"; static String LOGGER_NAME_2 = "com.sun.management.Logger2"; + static Logger logger1; + static Logger logger2; public LoggingMXBeanTest() throws Exception { @@ -131,8 +133,8 @@ public class LoggingMXBeanTest System.out.println( "*********** Phase 3 ***********" ); System.out.println( "*******************************" ); System.out.println( " Create and test new Loggers" ); - Logger logger1 = Logger.getLogger( LOGGER_NAME_1 ); - Logger logger2 = Logger.getLogger( LOGGER_NAME_2 ); + logger1 = Logger.getLogger( LOGGER_NAME_1 ); + logger2 = Logger.getLogger( LOGGER_NAME_2 ); // check that Level object are returned properly try { diff --git a/jdk/test/java/util/logging/LoggingMXBeanTest2.java b/jdk/test/java/util/logging/LoggingMXBeanTest2.java index 37b6aceb023..005ed72e03a 100644 --- a/jdk/test/java/util/logging/LoggingMXBeanTest2.java +++ b/jdk/test/java/util/logging/LoggingMXBeanTest2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,12 +42,14 @@ public class LoggingMXBeanTest2 static String LOGGER_NAME_1 = "com.sun.management.Logger"; static String LOGGER_NAME_2 = "com.sun.management.Logger.Logger2"; static String UNKNOWN_LOGGER_NAME = "com.sun.management.Unknown"; + static Logger logger1; + static Logger logger2; public LoggingMXBeanTest2() throws Exception { - Logger logger1 = Logger.getLogger( LOGGER_NAME_1 ); + logger1 = Logger.getLogger( LOGGER_NAME_1 ); logger1.setLevel(Level.FINE); - Logger logger2 = Logger.getLogger( LOGGER_NAME_2 ); + logger2 = Logger.getLogger( LOGGER_NAME_2 ); logger2.setLevel(null); /* diff --git a/jdk/test/java/util/logging/MemoryHandlerTest.java b/jdk/test/java/util/logging/MemoryHandlerTest.java new file mode 100644 index 00000000000..026e571859f --- /dev/null +++ b/jdk/test/java/util/logging/MemoryHandlerTest.java @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7159567 + * @summary Test of configuring a MemoryHandler sub-class handler target via logging.properties + * @run main/othervm MemoryHandlerTest + */ +import java.io.File; +import java.io.IOException; +import java.util.logging.Handler; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.LogRecord; +import java.util.logging.Logger; +import java.util.logging.MemoryHandler; + +public class MemoryHandlerTest { + + static final String CFG_FILE_PROP = "java.util.logging.config.file"; + static final String LM_PROP_FNAME = "MemoryHandlerTest.props"; + static Logger logger; + + public static void main(String... args) throws IOException { + // load logging.propertes for the test + String tstSrc = System.getProperty("test.src", "."); + File fname = new File(tstSrc, LM_PROP_FNAME); + String prop = fname.getCanonicalPath(); + System.setProperty(CFG_FILE_PROP, prop); + LogManager logMgr = LogManager.getLogManager(); + // create a logger + logger = Logger.getLogger(MemoryHandlerTest.class.getName()); + // don't have parent handlers get log messages + logger.setUseParentHandlers(false); + // + // Test 1,2: create a CustomMemoryHandler which in the config has + // specified a target of CustomTargetHandler. (1) Make sure that it + // is created and (2) that the target handler is loaded. + // + CustomMemoryHandler cmh = new CustomMemoryHandler(); + try { + logger.addHandler(cmh); + } catch (RuntimeException rte) { + throw new RuntimeException( + "Test Failed: did not load java.util.logging.ConsoleHandler as expected", + rte); + } + // if we get here and our config has been processed properly, then we + // should have loaded our target handler + if (CustomTargetHandler.numLoaded !=1) { + throw new RuntimeException( + "Test failed: did not load CustomTargetHandler as expected"); + } + // + // Test 3: try to add a handler with no target. This should fail with + // an exception + CustomMemoryHandlerNoTarget cmhnt = null; + try { + cmhnt = new CustomMemoryHandlerNoTarget(); + } catch (RuntimeException re) { + // expected -- no target specified + System.out.println("Info: " + re.getMessage() + " as expected."); + } + if (cmhnt != null) { + throw new RuntimeException( + "Test Failed: erroneously loaded CustomMemoryHandlerNoTarget"); + } + + // Test 4: log a message and check that the target handler is actually used + logger.log(Level.WARNING, "Unused"); + if (CustomTargetHandler.numPublished != 1) { + throw new RuntimeException("Test failed: CustomTargetHandler was not used"); + } + + // Test 5: make sure that SimpleTargetHandler hasn't been erroneously called + if (SimpleTargetHandler.numPublished != 0) { + throw new RuntimeException("Test failed: SimpleTargetHandler has been used"); + } + + // Test 6: try using SimpleTargetHanlder via standard MemoryHandler + // (which has target set to SimpleTargetHandler) + MemoryHandler mh = new MemoryHandler(); + mh.publish(new LogRecord(Level.INFO, "Unused msg to MemoryHandler")); + // see if it made it to the SimpleTargetHandler + if (SimpleTargetHandler.numPublished != 1) { + throw new RuntimeException("Test failed: SimpleTargetHandler was not used"); + } + } + + public static class CustomMemoryHandler extends MemoryHandler { + } + + public static class CustomMemoryHandlerNoTarget extends MemoryHandler { + } + + public static class CustomTargetHandler extends Handler { + + public static int numPublished; + public static int numLoaded; + + public CustomTargetHandler() { + numLoaded++; + } + + @Override + public void publish(LogRecord unused) { + numPublished++; + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } + } + + public static class SimpleTargetHandler extends Handler { + public static int numPublished; + + @Override + public void publish(LogRecord unused) { + numPublished++; + } + + @Override + public void flush() { + } + + @Override + public void close() throws SecurityException { + } + } +} diff --git a/jdk/test/java/util/logging/MemoryHandlerTest.props b/jdk/test/java/util/logging/MemoryHandlerTest.props new file mode 100644 index 00000000000..4860569ebbc --- /dev/null +++ b/jdk/test/java/util/logging/MemoryHandlerTest.props @@ -0,0 +1,9 @@ +.level= INFO +MemoryHandlerTest$CustomMemoryHandler.push=WARNING +MemoryHandlerTest$CustomMemoryHandlerNoTarget.push=WARNING +MemoryHandlerTest$CustomMemoryHandler.target=MemoryHandlerTest$CustomTargetHandler +handlers=java.util.logging.ConsoleHandler,MemoryHandlerTest$CustomMemoryHandler,MemoryHandlerTest$CustomMemoryHandlerNoTarget +java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter +java.util.logging.ConsoleHandler.level = INFO +java.util.logging.MemoryHandler.target=MemoryHandlerTest$SimpleTargetHandler +java.util.logging.MemoryHandler.push = INFO diff --git a/jdk/test/java/util/prefs/CheckUserPrefFirst.java b/jdk/test/java/util/prefs/CheckUserPrefFirst.java new file mode 100644 index 00000000000..d0ee277adf1 --- /dev/null +++ b/jdk/test/java/util/prefs/CheckUserPrefFirst.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.prefs.Preferences; + +/** + * + * @author khazra + * First class called by CheckUserPrefsStorage.sh to create and + * store a user preference + */ + +public class CheckUserPrefFirst { + + public static void main(String[] args) throws Exception { + Preferences prefs = Preferences.userNodeForPackage(CheckUserPrefFirst.class); + prefs.put("Check", "Success"); + prefs.flush(); + } +} + diff --git a/jdk/test/java/util/prefs/CheckUserPrefLater.java b/jdk/test/java/util/prefs/CheckUserPrefLater.java new file mode 100644 index 00000000000..555a9ad176c --- /dev/null +++ b/jdk/test/java/util/prefs/CheckUserPrefLater.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.prefs.Preferences; + +/** + * CheckUserPrefsStorage.sh uses this to check that preferences stored + * by CheckUserPrefFirst.java can be retrieved + * @author khazra + */ + +public class CheckUserPrefLater { + + public static void main(String[] args) throws Exception { + Preferences prefs = Preferences.userNodeForPackage(CheckUserPrefFirst.class); + String result = prefs.get("Check", null); + if ((result == null) || !(result.equals("Success"))) + throw new RuntimeException("User pref not stored!"); + prefs.remove("Check"); + prefs.flush(); + } + +} + diff --git a/jdk/test/java/util/prefs/CheckUserPrefsStorage.sh b/jdk/test/java/util/prefs/CheckUserPrefsStorage.sh new file mode 100644 index 00000000000..71ded594cb2 --- /dev/null +++ b/jdk/test/java/util/prefs/CheckUserPrefsStorage.sh @@ -0,0 +1,68 @@ +# +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# @test +# @bug 7198073 +# @build CheckUserPrefFirst CheckUserPrefLater +# @run shell CheckUserPrefsStorage.sh +# @summary Tests that user preferences are stored in the +# permanent storage +# + +OS=`uname -s` +case "$OS" in + SunOS | Linux | Darwin ) + PS=":" + FS="/" + ;; + CYGWIN* ) + PS=";" + FS="/" + ;; + Windows* ) + PS=";" + FS="\\" + ;; + * ) + echo "Unrecognized system!" + exit 1; + ;; +esac + +# run CheckUserPrefFirst - creates and stores a user pref +${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} CheckUserPrefFirst +result=$? +if [ "$result" -ne "0" ]; then + exit 1 +fi + +# run CheckUserPrefLater - Looks for the stored pref +${TESTJAVA}${FS}bin${FS}java -cp ${TESTCLASSES} CheckUserPrefLater +result=$? +if [ "$result" -ne "0" ]; then + exit 1 +fi + +# no failures, exit. +exit 0 + diff --git a/jdk/test/java/util/regex/RegExTest.java b/jdk/test/java/util/regex/RegExTest.java index e2b61d83407..3f8679ae976 100644 --- a/jdk/test/java/util/regex/RegExTest.java +++ b/jdk/test/java/util/regex/RegExTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/java/util/zip/ZipFile/ManyZipFiles.java b/jdk/test/java/util/zip/ZipFile/ManyZipFiles.java index fe2da9964e8..265a672f9b1 100644 --- a/jdk/test/java/util/zip/ZipFile/ManyZipFiles.java +++ b/jdk/test/java/util/zip/ZipFile/ManyZipFiles.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh b/jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh index 01dc34ce5bf..b23e2bd99a2 100644 --- a/jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh +++ b/jdk/test/javax/crypto/SecretKeyFactory/FailOverTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/crypto/sanity/CheckManifestForRelease.java b/jdk/test/javax/crypto/sanity/CheckManifestForRelease.java new file mode 100644 index 00000000000..1d87575baa5 --- /dev/null +++ b/jdk/test/javax/crypto/sanity/CheckManifestForRelease.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7197071 + * @summary Makefiles for various security providers aren't including + * the default manifest. + */ +import java.net.*; +import java.io.*; + +/** + * When the Java specification version is incremented, all of the providers + * must be recompiled with the proper implementation version to match. + */ +public class CheckManifestForRelease { + + /** + * @param args the command line arguments + */ + public static void main(String[] args) throws Exception { + checkFileManifests(); + } + + /* + * Iterate over the files of interest: JCE framework and providers + */ + static private void checkFileManifests() throws Exception { + System.out.println("============="); + String libDirName = System.getProperty("java.home", ".") + "/lib"; + String extDirName = libDirName + "/ext"; + + System.out.println("Checking Manifest in directory: \n " + + extDirName); + + /* + * Current list of JCE providers, all of which currently live in + * the extensions directory. Add if more are created. + */ + String[] providers = new String[]{ + "sunjce_provider.jar", + "sunec.jar", + "sunmscapi.jar", + "sunpkcs11.jar", + "ucrypto.jar" + }; + + checkManifest(libDirName, "jce.jar"); + for (String provider : providers) { + checkManifest(extDirName, provider); + } + System.out.println("Passed."); + } + + // Helper method to format the URL properly. + static private String formatURL(String dir, String file) { + return "jar:file:///" + dir + "/" + file + "!/"; + } + + static private String specVersion = + System.getProperty("java.specification.version"); + + /* + * Test the root cause, which is that there were no manifest values + * for many of the providers, and for those that had them, there was + * no test to make sure that the impl version was appropriate for + * the spec version. + */ + static private void checkManifest(String dir, String file) + throws Exception { + + System.out.println("Checking: " + file); + + String url = formatURL(dir, file); + JarURLConnection urlc = + (JarURLConnection) (new URL(url).openConnection()); + + String implVersion; + try { + implVersion = urlc.getManifest().getMainAttributes().getValue( + "Implementation-Version"); + } catch (FileNotFoundException e) { + /* + * If the file doesn't exist (e.g. mscapi on solaris), + * skip it. If there are other problems, fail out. + */ + System.out.println(" " + file + " not found, skipping..."); + return; + } + + if (implVersion == null) { + throw new Exception( + "Implementation-Version not found in Manifest"); + } + + if (!implVersion.startsWith(specVersion)) { + throw new Exception( + "Implementation-Version does not match " + + "Specification-Version"); + } + } +} diff --git a/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh b/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh index 1eb3d34ca98..18ffc1c8d40 100644 --- a/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh +++ b/jdk/test/javax/imageio/stream/StreamCloserLeak/run_test.sh @@ -1,6 +1,6 @@ #!/bin/ksh -p # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -78,28 +78,44 @@ OS=`uname -s` case "$OS" in SunOS ) VAR="One value for Sun" - DEFAULT_JDK=/usr/local/java/jdk1.2/solaris + DEFAULT_JDK=/ FILESEP="/" PATHSEP=":" TMP="/tmp" ;; - Linux | Darwin ) + Linux ) VAR="A different value for Linux" - DEFAULT_JDK=/usr/local/java/jdk1.4/linux-i386 + DEFAULT_JDK=/ FILESEP="/" PATHSEP=":" TMP="/tmp" ;; - Windows_95 | Windows_98 | Windows_NT | Windows_ME | CYGWIN* ) + Darwin ) + VAR="A different value for MacOSX" + DEFAULT_JDK=/usr + FILESEP="/" + PATHSEP=":" + TMP="/tmp" + ;; + + Windows* ) VAR="A different value for Win32" - DEFAULT_JDK=/usr/local/java/jdk1.2/win32 + DEFAULT_JDK="C:/Program Files/Java/jdk1.8.0" FILESEP="\\" PATHSEP=";" TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` ;; + CYGWIN* ) + VAR="A different value for Cygwin" + DEFAULT_JDK="/cygdrive/c/Program\ Files/Java/jdk1.8.0" + FILESEP="/" + PATHSEP=";" + TMP=`cd "${SystemRoot}/Temp"; echo ${PWD}` + ;; + # catch all other OSs * ) echo "Unrecognized system! $OS" diff --git a/jdk/test/javax/management/remote/mandatory/URLTest.java b/jdk/test/javax/management/remote/mandatory/URLTest.java index 4649ec580c6..bf84b44e7d9 100644 --- a/jdk/test/javax/management/remote/mandatory/URLTest.java +++ b/jdk/test/javax/management/remote/mandatory/URLTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,8 +24,6 @@ /* * @test * @bug 5057532 - * @ignore Test will fail until 6338951 is resolved (java.net.URI now - * accepts "http://-a"). * @summary Tests that host names are parsed correctly in URLs * @author Eamonn McManus * @run clean URLTest diff --git a/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java b/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java index b6cd2999bb1..0b09931b0f7 100644 --- a/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java +++ b/jdk/test/javax/management/remote/mandatory/notif/ListenerScaleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/management/timer/MissingNotificationTest.java b/jdk/test/javax/management/timer/MissingNotificationTest.java new file mode 100644 index 00000000000..39da6cb1098 --- /dev/null +++ b/jdk/test/javax/management/timer/MissingNotificationTest.java @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6809322 + * @summary Test for missing notifications in a high concurrency environment + * @author Jaroslav Bachorik + * @run clean MissingNotificationTest + * @run build MissingNotificationTest + * @run main MissingNotificationTest + */ + +import java.util.Date; +import java.util.Random; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import javax.management.timer.Timer; +import javax.management.Notification; +import javax.management.NotificationListener; + +public class MissingNotificationTest { + private static int TASK_COUNT = 10000; + private static long fixedDelay = 0;// anything bigger than 100 and no alarms remain unfired + + private static class NotifListener implements NotificationListener { + + int count; + + public synchronized void handleNotification(Notification notification, Object handback) { + count++; + } + + synchronized int getCount() { + return count; + } + } + + public static void main(String[] args) throws Exception { + System.out.println( + ">>> Test for missing notifications."); + + System.out.println(">>> Create a Timer object."); + final Timer timer = new Timer(); + + timer.start(); + + NotifListener listener = new NotifListener(); + timer.addNotificationListener(listener, null, null); + + ExecutorService executor = Executors.newFixedThreadPool(100); + final Random rand = new Random(); + + + for (int i = 0; i < TASK_COUNT; i++) { + executor.execute(new Runnable() { + public void run() { + long dateMillis = System.currentTimeMillis() + fixedDelay + rand.nextInt(2000); + Date date = new Date(dateMillis); + timer.addNotification("type", "msg", "userData", date); + } + }); + + } + + executor.shutdown(); + executor.awaitTermination(20, TimeUnit.SECONDS); + + waitForNotificationsToEnd(listener); + + timer.stop(); + + if (listener.count < TASK_COUNT) { + throw new RuntimeException("Not fired: " + (TASK_COUNT - listener.count)); + } else { + System.out.println(">>> All notifications handled OK"); + } + + System.out.println(">>> Bye bye!"); + } + + /** + * Will return when all notifications are handled or after 10sec. of no new + * notifications + * + * @param listener + * @throws InterruptedException + */ + private static void waitForNotificationsToEnd(NotifListener listener) + throws InterruptedException { + int oldCout = listener.getCount(); + int noChangeCounter = 1; + while (listener.getCount() < TASK_COUNT) { + Thread.sleep(1000); + System.out.print('.'); + if (oldCout == listener.getCount())//no change + { + if (++noChangeCounter > 10) { + break; + } + } else { + noChangeCounter = 1; + } + + oldCout = listener.getCount(); + } + System.out.println(); + } +} diff --git a/jdk/test/javax/naming/spi/DirectoryManager/GetContDirCtx.java b/jdk/test/javax/naming/spi/DirectoryManager/GetContDirCtx.java index 520da9d3933..508f96716f1 100644 --- a/jdk/test/javax/naming/spi/DirectoryManager/GetContDirCtx.java +++ b/jdk/test/javax/naming/spi/DirectoryManager/GetContDirCtx.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/script/CommonSetup.sh b/jdk/test/javax/script/CommonSetup.sh index c604cfb6a97..37dff6380c3 100644 --- a/jdk/test/javax/script/CommonSetup.sh +++ b/jdk/test/javax/script/CommonSetup.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/security/auth/Subject/Synch.java b/jdk/test/javax/security/auth/Subject/Synch.java index 9acc2185282..8c392a31d0b 100644 --- a/jdk/test/javax/security/auth/Subject/Synch.java +++ b/jdk/test/javax/security/auth/Subject/Synch.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/security/auth/Subject/Synch2.java b/jdk/test/javax/security/auth/Subject/Synch2.java index c88fbee5ea2..1fe6a437597 100644 --- a/jdk/test/javax/security/auth/Subject/Synch2.java +++ b/jdk/test/javax/security/auth/Subject/Synch2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/security/auth/Subject/Synch3.java b/jdk/test/javax/security/auth/Subject/Synch3.java index e058702a97b..56f8d57584b 100644 --- a/jdk/test/javax/security/auth/Subject/Synch3.java +++ b/jdk/test/javax/security/auth/Subject/Synch3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/security/auth/Subject/doAs/Test.sh b/jdk/test/javax/security/auth/Subject/doAs/Test.sh index bac30854434..cbf94e031f0 100644 --- a/jdk/test/javax/security/auth/Subject/doAs/Test.sh +++ b/jdk/test/javax/security/auth/Subject/doAs/Test.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/security/auth/login/LoginContext/ResetConfigModule.java b/jdk/test/javax/security/auth/login/LoginContext/ResetConfigModule.java index b0f372f48ca..a9a4b6e82c5 100644 --- a/jdk/test/javax/security/auth/login/LoginContext/ResetConfigModule.java +++ b/jdk/test/javax/security/auth/login/LoginContext/ResetConfigModule.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/javax/swing/AncestorNotifier/7193219/bug7193219.java b/jdk/test/javax/swing/AncestorNotifier/7193219/bug7193219.java new file mode 100644 index 00000000000..0db4839dc50 --- /dev/null +++ b/jdk/test/javax/swing/AncestorNotifier/7193219/bug7193219.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + @bug 7193219 + @summary JComboBox serialization fails in JDK 1.7 + @author Anton Litvinov +*/ + +import java.io.*; + +import javax.swing.*; + +public class bug7193219 { + private static byte[] serializeGUI() { + // Create and set up the window. + JFrame frame = new JFrame("Serialization"); + JPanel mainPanel = new JPanel(); + + /** + * If JComboBox is replaced with other component like JLabel + * The issue does not happen. + */ + JComboBox status = new JComboBox(); + status.addItem("123"); + mainPanel.add(status); + frame.getContentPane().add(mainPanel); + frame.pack(); + + try { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ObjectOutputStream oos = new ObjectOutputStream(baos); + oos.writeObject(mainPanel); + oos.flush(); + frame.dispose(); + return baos.toByteArray(); + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + } + + private static void deserializeGUI(byte[] serializedData) { + try { + ObjectInputStream ois = new ObjectInputStream(new ByteArrayInputStream(serializedData)); + JPanel mainPanel = (JPanel)ois.readObject(); + JFrame frame = new JFrame("Deserialization"); + frame.getContentPane().add(mainPanel); + frame.pack(); + frame.dispose(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + deserializeGUI(serializeGUI()); + } + }); + } +} diff --git a/jdk/test/javax/swing/JMenuItem/4654927/bug4654927.java b/jdk/test/javax/swing/JMenuItem/4654927/bug4654927.java new file mode 100644 index 00000000000..cac3386567a --- /dev/null +++ b/jdk/test/javax/swing/JMenuItem/4654927/bug4654927.java @@ -0,0 +1,152 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 4654927 + * @summary Clicking on Greyed Menuitems closes the Menubar Dropdown + * @author Alexander Potochkin + * @library ../../regtesthelpers + * @build Util + * @run main bug4654927 + */ + +import javax.swing.*; + +import java.awt.*; +import java.awt.event.InputEvent; +import java.util.concurrent.Callable; +import sun.awt.SunToolkit; + +public class bug4654927 { + + private static volatile JMenu menu; + private static volatile JMenuItem menuItem; + + public static void main(String[] args) throws Exception { + String systemLAF = UIManager.getSystemLookAndFeelClassName(); + // the test is not applicable to Motif L&F + if(systemLAF.endsWith("MotifLookAndFeel")){ + return; + } + + UIManager.setLookAndFeel(systemLAF); + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Robot robot = new Robot(); + robot.setAutoDelay(10); + + SwingUtilities.invokeAndWait(new Runnable() { + + public void run() { + createAndShowUI(); + } + }); + toolkit.realSync(); + + // test mouse press + Point point = Util.getCenterPoint(menu); + robot.mouseMove(point.x, point.y); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + point = Util.getCenterPoint(menuItem); + robot.mouseMove(point.x, point.y); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + if (!isMenuItemShowing()) { + throw new RuntimeException("Popup is unexpectedly closed"); + } + + // test mouse drag + point = Util.getCenterPoint(menu); + robot.mouseMove(point.x, point.y); + Point menuLocation = Util.invokeOnEDT(new Callable() { + + @Override + public Point call() throws Exception { + return menu.getLocationOnScreen(); + } + }); + + Point itemLocation = Util.invokeOnEDT(new Callable() { + + @Override + public Point call() throws Exception { + return menuItem.getLocationOnScreen(); + } + }); + + int x0 = menuLocation.x + 10; + int y0 = menuLocation.y + 10; + int x1 = itemLocation.x + 10; + int y1 = itemLocation.y + 10; + + // close menu + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + robot.mousePress(InputEvent.BUTTON1_MASK); + Util.glide(robot, x0, y0, x1, y1); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + toolkit.realSync(); + + if (!isMenuItemShowing()) { + throw new RuntimeException("Popup is unexpectedly closed"); + } + } + + private static boolean isMenuItemShowing() throws Exception { + return Util.invokeOnEDT(new Callable() { + + @Override + public Boolean call() throws Exception { + return menuItem.isShowing(); + } + }); + } + + private static void createAndShowUI() { + JFrame frame = new JFrame(); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + menu = new JMenu("Menu"); + menu.add(new JMenuItem("menuItem")); + menuItem = new JMenuItem("menuItem"); + menuItem.setEnabled(false); + menu.add(menuItem); + menu.add(new JMenuItem("menuItem")); + + JMenuBar bar = new JMenuBar(); + bar.add(menu); + frame.setJMenuBar(bar); + + frame.setSize(200, 200); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + + } +} diff --git a/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java b/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java new file mode 100644 index 00000000000..47761ec13d2 --- /dev/null +++ b/jdk/test/javax/swing/JMenuItem/ActionListenerCalledTwice/ActionListenerCalledTwiceTest.java @@ -0,0 +1,83 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7160951 + * @summary [macosx] ActionListener called twice for JMenuItem using ScreenMenuBar + * @author vera.akulova@oracle.com + * @run main ActionListenerCalledTwiceTest + */ + +import sun.awt.*; +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; + +public class ActionListenerCalledTwiceTest { + static volatile int listenerCallCounter = 0; + public static void main(String[] args) throws Exception { + if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) { + System.out.println("This test is for MacOS only. Automatically passed on other platforms."); + return; + } + System.setProperty("apple.laf.useScreenMenuBar", "true"); + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + createAndShowGUI(); + } + }); + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + Robot robot = new Robot(); + robot.setAutoDelay(100); + robot.keyPress(KeyEvent.VK_META); + robot.keyPress(KeyEvent.VK_E); + robot.keyRelease(KeyEvent.VK_E); + robot.keyRelease(KeyEvent.VK_META); + toolkit.realSync(); + if (listenerCallCounter != 1) { + throw new Exception("Test failed: ActionListener called " + listenerCallCounter + " times instead of 1!"); + } + } + + private static void createAndShowGUI() { + JMenuItem newItem = new JMenuItem("Exit"); + newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, InputEvent.META_MASK)); + newItem.addActionListener( + new ActionListener(){ + public void actionPerformed(ActionEvent e) { + listenerCallCounter++; + } + } + ); + JMenu menu = new JMenu("Menu"); + menu.add(newItem); + JMenuBar bar = new JMenuBar(); + bar.add(menu); + JFrame frame = new JFrame("Test"); + frame.setJMenuBar(bar); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.pack(); + frame.setVisible(true); + } +} diff --git a/jdk/test/javax/swing/JMenuItem/ShortcutNotDiplayed/ShortcutNotDisplayedTest.java b/jdk/test/javax/swing/JMenuItem/ShortcutNotDiplayed/ShortcutNotDisplayedTest.java new file mode 100644 index 00000000000..3d8c541b90d --- /dev/null +++ b/jdk/test/javax/swing/JMenuItem/ShortcutNotDiplayed/ShortcutNotDisplayedTest.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7186371 + * @summary [macosx] Main menu shortcuts not displayed + * @author vera.akulova@oracle.com + * @run main/manual ShortcutNotDisplayedTest + */ + +import java.awt.*; +import java.awt.event.*; +import javax.swing.*; + +public class ShortcutNotDisplayedTest { + static volatile boolean done = false; + static volatile boolean pass = false; + static final String PASS_COMMAND = "pass"; + + public static void main(String[] args) throws Exception { + if (sun.awt.OSInfo.getOSType() != sun.awt.OSInfo.OSType.MACOSX) { + System.out.println("This test is for MacOS only. Automatically passed on other platforms."); + return; + } + System.setProperty("apple.laf.useScreenMenuBar", "true"); + SwingUtilities.invokeAndWait(new Runnable() { + public void run() { + createAndShowGUI(); + } + }); + + do { try { Thread.sleep(300); } catch (Exception e) {} } while (!done) ; + if (!pass) { + throw new Exception("Shortcuts not displayed as expected in the screen menu bar."); + } + } + + private static void createAndShowGUI() { + JMenuItem newItem = new JMenuItem("Exit"); + newItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_E, java.awt.event.InputEvent.META_MASK)); + + JMenu menu = new JMenu("Test Frame Window Menu"); + menu.setMnemonic(KeyEvent.VK_M); + menu.add(newItem); + + JMenuBar bar = new JMenuBar(); + bar.add(menu); + JTextArea text = new JTextArea( + " Please follow instructions:\n" + + " 1. You should see \"Test Frame Window Menu\" menu on the screen menu bar.\n" + + " 2. Open \"Test Frame Window Menu\" menu. \n" + + " Check that menu item \"Exit\" has a shortcut with image for Command Key and symbol \"E\". \n" + + " If you see the shortcut press \"Passed\". Otherwise press \"Failed\".\n" + ); + text.setEditable(false); + + JScrollPane sp = new JScrollPane(text); + sp.setSize(300,200); + + JButton passBtn = new JButton("Pass"); + passBtn.setActionCommand(PASS_COMMAND); + JButton failBtn = new JButton("Fail"); + ActionListener listener = new ActionListener() { + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals(PASS_COMMAND)) { + pass = true; + } + done = true; + } + }; + + JFrame testFrame = new JFrame("Test Frame Window"); + testFrame.setLayout(new FlowLayout()); + testFrame.setBounds(100, 100, 600, 180); + testFrame.setJMenuBar(bar); + testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + passBtn.addActionListener(listener); + failBtn.addActionListener(listener); + testFrame.getContentPane().add(sp); + testFrame.getContentPane().add(passBtn); + testFrame.getContentPane().add(failBtn); + testFrame.setVisible(true); + } +} diff --git a/jdk/test/javax/swing/plaf/windows/WindowsRootPaneUI/WrongAltProcessing/WrongAltProcessing.java b/jdk/test/javax/swing/plaf/windows/WindowsRootPaneUI/WrongAltProcessing/WrongAltProcessing.java new file mode 100644 index 00000000000..e09087537c2 --- /dev/null +++ b/jdk/test/javax/swing/plaf/windows/WindowsRootPaneUI/WrongAltProcessing/WrongAltProcessing.java @@ -0,0 +1,169 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + @bug 8001633 + @summary Wrong alt processing during switching between windows + @author mikhail.cherkasov@oracle.com + @run main WrongAltProcessing +*/ + +import sun.awt.SunToolkit; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.*; + + +public class WrongAltProcessing { + + private static Robot robot; + private static JFrame firstFrame; + private static JFrame secondFrame; + private static JTextField mainFrameTf1; + private static JTextField mainFrameTf2; + private static JTextField secondFrameTf; + + public static void main(String[] args) throws AWTException { + try { + UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); + } catch (Exception e) { + return;// miss unsupported platforms. + } + createWindows(); + initRobot(); + runScript(); + verify(); + } + + private static void verify() { + Component c = DefaultKeyboardFocusManager + .getCurrentKeyboardFocusManager().getFocusOwner(); + if (!(c == mainFrameTf2)) { + throw new RuntimeException("Wrong focus owner."); + } + } + + public static void sync() { + SunToolkit toolkit = (SunToolkit) Toolkit.getDefaultToolkit(); + toolkit.realSync(); + } + + public static void initRobot() throws AWTException { + robot = new Robot(); + robot.setAutoDelay(100); + } + + private static void clickWindowsTitle(JFrame frame) { + Point point = frame.getLocationOnScreen(); + robot.mouseMove(point.x + (frame.getWidth() / 2), point.y + 5); + robot.mousePress(InputEvent.BUTTON1_MASK); + robot.mouseRelease(InputEvent.BUTTON1_MASK); + } + + public static void runScript() { + robot.delay(1000); + printABCD(); + pressTab(); + clickWindowsTitle(secondFrame); + robot.delay(500); + robot.keyPress(KeyEvent.VK_ALT); + robot.keyRelease(KeyEvent.VK_ALT); + clickWindowsTitle(firstFrame); + sync(); + } + + private static void pressTab() { + robot.keyPress(KeyEvent.VK_TAB); + robot.keyRelease(KeyEvent.VK_TAB); + } + + private static void printABCD() { + robot.keyPress(KeyEvent.VK_A); + robot.keyRelease(KeyEvent.VK_A); + robot.keyPress(KeyEvent.VK_B); + robot.keyRelease(KeyEvent.VK_B); + robot.keyPress(KeyEvent.VK_C); + robot.keyRelease(KeyEvent.VK_C); + robot.keyPress(KeyEvent.VK_D); + robot.keyRelease(KeyEvent.VK_D); + } + + public static void createWindows() { + firstFrame = new JFrame("Frame"); + firstFrame.setLayout(new FlowLayout()); + + JMenuBar bar = new JMenuBar(); + JMenu menu = new JMenu("File"); + JMenuItem item = new JMenuItem("Save"); + + mainFrameTf1 = new JTextField(10); + mainFrameTf2 = new JTextField(10); + + mainFrameTf1.addKeyListener(new KeyAdapter() { + public void keyPressed(KeyEvent EVT) { + if (EVT.getKeyChar() >= 'a' && EVT.getKeyChar() <= 'z') { + try { + // imitate some long processing + Thread.sleep(2000); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } + } + }); + + menu.add(item); + bar.add(menu); + firstFrame.setJMenuBar(bar); + + + firstFrame.add(mainFrameTf1); + firstFrame.add(mainFrameTf2); + + firstFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + firstFrame.pack(); + + secondFrame = new JFrame("Frame 2"); + secondFrame.setLocation(0, 150); + secondFrameTf = new JTextField(20); + secondFrame.add(secondFrameTf); + secondFrame.pack(); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + secondFrame.setVisible(true); + } + }); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + firstFrame.setVisible(true); + } + }); + + mainFrameTf1.requestFocus(); + sync(); + } +} diff --git a/jdk/test/javax/swing/regtesthelpers/Util.java b/jdk/test/javax/swing/regtesthelpers/Util.java index 68bc0f8c404..a9df4934583 100644 --- a/jdk/test/javax/swing/regtesthelpers/Util.java +++ b/jdk/test/javax/swing/regtesthelpers/Util.java @@ -156,6 +156,36 @@ public class Util { } } + /** + * Moves mouse smoothly from (x0, y0) to (x1, y1). + */ + public static void glide(Robot robot, int x0, int y0, int x1, int y1) throws AWTException { + float dmax = (float) Math.max(Math.abs(x1 - x0), Math.abs(y1 - y0)); + float dx = (x1 - x0) / dmax; + float dy = (y1 - y0) / dmax; + + for (int i = 0; i <= dmax; i += 10) { + robot.mouseMove((int) (x0 + dx * i), (int) (y0 + dy * i)); + } + } + + /** + * Gets component center point + * + * @return center point of the component + */ + public static Point getCenterPoint(final Component component) throws Exception { + return Util.invokeOnEDT(new Callable() { + + @Override + public Point call() throws Exception { + Point p = component.getLocationOnScreen(); + Dimension size = component.getSize(); + return new Point(p.x + size.width / 2, p.y + size.height / 2); + } + }); + } + /** * Invokes the task on the EDT thread. * diff --git a/jdk/test/javax/swing/text/html/parser/Parser/6836089/bug6836089.java b/jdk/test/javax/swing/text/html/parser/Parser/6836089/bug6836089.java new file mode 100644 index 00000000000..cf41b8c88fa --- /dev/null +++ b/jdk/test/javax/swing/text/html/parser/Parser/6836089/bug6836089.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 6836089 + * @summary Tests correct parsing of characters outside Base Multilingual Plane + * @author Vladislav Karnaukhov + */ + +import javax.swing.*; +import javax.swing.text.html.*; + +public class bug6836089 { + + public static void main(String[] args) throws Exception { + SwingUtilities.invokeAndWait(new Runnable() { + @Override + public void run() { + JTextPane htmlPane = new JTextPane(); + htmlPane.setEditorKit(new HTMLEditorKit()); + + htmlPane.setText("𠀀"); + String str = htmlPane.getText(); + if (str.contains("�")) { + throw new RuntimeException("Test failed"); + } + } + }); + } +} diff --git a/jdk/test/javax/xml/crypto/dsig/SecurityManager/XMLDSigWithSecMgr.java b/jdk/test/javax/xml/crypto/dsig/SecurityManager/XMLDSigWithSecMgr.java index bcbf96e771b..31c4ec5904e 100644 --- a/jdk/test/javax/xml/crypto/dsig/SecurityManager/XMLDSigWithSecMgr.java +++ b/jdk/test/javax/xml/crypto/dsig/SecurityManager/XMLDSigWithSecMgr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/jdk/asm/AsmSanity.java b/jdk/test/jdk/asm/AsmSanity.java new file mode 100644 index 00000000000..0ae1cadc437 --- /dev/null +++ b/jdk/test/jdk/asm/AsmSanity.java @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 7197401 + * @summary Add a subset of the org.objectweb.asm packages to jdk8 + * This test doesn't test asm functionality, it just tests the presence of + * asm in the jdk. + * These compile/run commands do the following: + * - Verify that asm is not in ct.sym so user code that refs it won't compile. + * - Verify that asm really is in rt.jar and can be accessed when ct.sym is not used. + * - Verify that if user code is compiled without ct.sym, it can't access asm classes + * at runtime when a security manager is in use. + * + * @compile/fail AsmSanity.java + * + * @compile -XDignore.symbol.file=true AsmSanity.java + * @run main/othervm AsmSanity + * + * @run main/othervm/fail AsmSanity secure + * + */ + + +// Verify that the expected asm pkgs are present +import jdk.internal.org.objectweb.asm.*; +import jdk.internal.org.objectweb.asm.commons.*; +import jdk.internal.org.objectweb.asm.signature.*; +import jdk.internal.org.objectweb.asm.tree.*; +import jdk.internal.org.objectweb.asm.tree.analysis.*; +import jdk.internal.org.objectweb.asm.util.*; + +// Verify that we can actually run some of the asm code. +public class AsmSanity { + + static public void main(String[] args) { + if (args.length == 0) { + System.out.println("-- Running without SecurityManager"); + new Label(); + System.out.println("-- Passed"); + return; + } + + if (args[0].equals("secure")) { + System.out.println("-- Running with SecurityManager"); + java.lang.SecurityManager sm = new SecurityManager(); + System.setSecurityManager(sm); + // This should cause an accessClassInPackage exception + new Label(); + return; + } + throw new Error("-- Failed: Unknown argument to main: " + args[0]); + } +} diff --git a/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh b/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh index 63e60b5bf9a..e4184062a5f 100644 --- a/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh +++ b/jdk/test/lib/security/java.policy/Ext_AllPolicy.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/invoke/util/ValueConversionsTest.java b/jdk/test/sun/invoke/util/ValueConversionsTest.java index 5b6d1bd0173..d5255b92953 100644 --- a/jdk/test/sun/invoke/util/ValueConversionsTest.java +++ b/jdk/test/sun/invoke/util/ValueConversionsTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/misc/Cleaner/exitOnThrow.sh b/jdk/test/sun/misc/Cleaner/exitOnThrow.sh index 81daf8ba56e..f6090cd42ec 100644 --- a/jdk/test/sun/misc/Cleaner/exitOnThrow.sh +++ b/jdk/test/sun/misc/Cleaner/exitOnThrow.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/misc/Version/Version.java b/jdk/test/sun/misc/Version/Version.java index 16ecd1ea9c8..13e507540c1 100644 --- a/jdk/test/sun/misc/Version/Version.java +++ b/jdk/test/sun/misc/Version/Version.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/AuthHeaderTest.java b/jdk/test/sun/net/www/AuthHeaderTest.java index 9e646e0a49b..63aae18ec80 100644 --- a/jdk/test/sun/net/www/AuthHeaderTest.java +++ b/jdk/test/sun/net/www/AuthHeaderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/MarkResetTest.sh b/jdk/test/sun/net/www/MarkResetTest.sh index 20bb6ab9e25..c3eb53a56d5 100644 --- a/jdk/test/sun/net/www/MarkResetTest.sh +++ b/jdk/test/sun/net/www/MarkResetTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/http/ChunkedInputStream/ChunkedEncodingWithProgressMonitorTest.java b/jdk/test/sun/net/www/http/ChunkedInputStream/ChunkedEncodingWithProgressMonitorTest.java index c5e92d5b6f6..e5c26afc92e 100644 --- a/jdk/test/sun/net/www/http/ChunkedInputStream/ChunkedEncodingWithProgressMonitorTest.java +++ b/jdk/test/sun/net/www/http/ChunkedInputStream/ChunkedEncodingWithProgressMonitorTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/http/HttpClient/RetryPost.sh b/jdk/test/sun/net/www/http/HttpClient/RetryPost.sh index d1b7469ecce..314a007c64f 100644 --- a/jdk/test/sun/net/www/http/HttpClient/RetryPost.sh +++ b/jdk/test/sun/net/www/http/HttpClient/RetryPost.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/http/KeepAliveCache/B5045306.java b/jdk/test/sun/net/www/http/KeepAliveCache/B5045306.java index c36d2cfc3d9..7e1abfd4f0e 100644 --- a/jdk/test/sun/net/www/http/KeepAliveCache/B5045306.java +++ b/jdk/test/sun/net/www/http/KeepAliveCache/B5045306.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/httptest/HttpTransaction.java b/jdk/test/sun/net/www/httptest/HttpTransaction.java index 6007070b8e3..781aacaff5b 100644 --- a/jdk/test/sun/net/www/httptest/HttpTransaction.java +++ b/jdk/test/sun/net/www/httptest/HttpTransaction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/httptest/TestHttpServer.java b/jdk/test/sun/net/www/httptest/TestHttpServer.java index 7f91461b734..13f2098915e 100644 --- a/jdk/test/sun/net/www/httptest/TestHttpServer.java +++ b/jdk/test/sun/net/www/httptest/TestHttpServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/file/DirPermissionDenied.sh b/jdk/test/sun/net/www/protocol/file/DirPermissionDenied.sh index 91eaa6c0387..a85f4d53a99 100644 --- a/jdk/test/sun/net/www/protocol/file/DirPermissionDenied.sh +++ b/jdk/test/sun/net/www/protocol/file/DirPermissionDenied.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/http/B6296310.java b/jdk/test/sun/net/www/protocol/http/B6296310.java index a932d9caece..6d0ce343a4e 100644 --- a/jdk/test/sun/net/www/protocol/http/B6296310.java +++ b/jdk/test/sun/net/www/protocol/http/B6296310.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/http/B6299712.java b/jdk/test/sun/net/www/protocol/http/B6299712.java index 727b62e5743..2cdedcba6d0 100644 --- a/jdk/test/sun/net/www/protocol/http/B6299712.java +++ b/jdk/test/sun/net/www/protocol/http/B6299712.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/http/RelativeRedirect.java b/jdk/test/sun/net/www/protocol/http/RelativeRedirect.java index 861ee6a95d0..eb4b2a69e42 100644 --- a/jdk/test/sun/net/www/protocol/http/RelativeRedirect.java +++ b/jdk/test/sun/net/www/protocol/http/RelativeRedirect.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/http/ResponseCacheStream.java b/jdk/test/sun/net/www/protocol/http/ResponseCacheStream.java index 6b85d7f4c73..bff2a765d6c 100644 --- a/jdk/test/sun/net/www/protocol/http/ResponseCacheStream.java +++ b/jdk/test/sun/net/www/protocol/http/ResponseCacheStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/http/SetChunkedStreamingMode.java b/jdk/test/sun/net/www/protocol/http/SetChunkedStreamingMode.java index e1d2fd9a865..6ed5a9a6035 100644 --- a/jdk/test/sun/net/www/protocol/http/SetChunkedStreamingMode.java +++ b/jdk/test/sun/net/www/protocol/http/SetChunkedStreamingMode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/jar/B5105410.sh b/jdk/test/sun/net/www/protocol/jar/B5105410.sh index 66623dbb900..3dbce7f3f77 100644 --- a/jdk/test/sun/net/www/protocol/jar/B5105410.sh +++ b/jdk/test/sun/net/www/protocol/jar/B5105410.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/net/www/protocol/jar/jarbug/run.sh b/jdk/test/sun/net/www/protocol/jar/jarbug/run.sh index 0446848a58d..31cfbe86158 100644 --- a/jdk/test/sun/net/www/protocol/jar/jarbug/run.sh +++ b/jdk/test/sun/net/www/protocol/jar/jarbug/run.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/DoubleByteDecoder.java b/jdk/test/sun/nio/cs/OLD/DoubleByteDecoder.java index 7565a4d3be3..97748a1cb53 100644 --- a/jdk/test/sun/nio/cs/OLD/DoubleByteDecoder.java +++ b/jdk/test/sun/nio/cs/OLD/DoubleByteDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/DoubleByteEncoder.java b/jdk/test/sun/nio/cs/OLD/DoubleByteEncoder.java index ca04fae671e..505a583f871 100644 --- a/jdk/test/sun/nio/cs/OLD/DoubleByteEncoder.java +++ b/jdk/test/sun/nio/cs/OLD/DoubleByteEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/EUC_JP_LINUX_OLD.java b/jdk/test/sun/nio/cs/OLD/EUC_JP_LINUX_OLD.java index 121e5b35849..d4bebb61da1 100644 --- a/jdk/test/sun/nio/cs/OLD/EUC_JP_LINUX_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/EUC_JP_LINUX_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/EUC_JP_OLD.java b/jdk/test/sun/nio/cs/OLD/EUC_JP_OLD.java index 96d93634f8e..94fa1730d0c 100644 --- a/jdk/test/sun/nio/cs/OLD/EUC_JP_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/EUC_JP_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/EUC_JP_Open_OLD.java b/jdk/test/sun/nio/cs/OLD/EUC_JP_Open_OLD.java index 910e962b288..554d8e64555 100644 --- a/jdk/test/sun/nio/cs/OLD/EUC_JP_Open_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/EUC_JP_Open_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0201_OLD.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0201_OLD.java index a8ce6a47d92..add11764288 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0201_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0201_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Decoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Decoder.java index 59ee58ef783..d64010dfa38 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Decoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Decoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Encoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Encoder.java index bbdea5f41e8..412d61eb641 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Encoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Encoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_OLD.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_OLD.java index 7e211f61347..570d3ccd087 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Decoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Decoder.java index 69643357505..1359ee6df2a 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Decoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Decoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Encoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Encoder.java index cde51b70f1a..cb06cdbedd3 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Encoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0208_Solaris_Encoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Decoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Decoder.java index 92e388fc01b..03d6d7fbab8 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Decoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Decoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Encoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Encoder.java index fc155081da7..f44ecf12362 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Encoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Encoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_OLD.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_OLD.java index adb19f161b9..63813d049a0 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Decoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Decoder.java index dac98b2fb09..49ac7459d84 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Decoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Decoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Encoder.java b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Encoder.java index 716e4020a8e..a8f6f5ea2c0 100644 --- a/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Encoder.java +++ b/jdk/test/sun/nio/cs/OLD/JIS_X_0212_Solaris_Encoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/MS932_OLD.java b/jdk/test/sun/nio/cs/OLD/MS932_OLD.java index 46307e2a613..0f1dd889c76 100644 --- a/jdk/test/sun/nio/cs/OLD/MS932_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/MS932_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/PCK_OLD.java b/jdk/test/sun/nio/cs/OLD/PCK_OLD.java index d2cc0c43a30..9fcd9853795 100644 --- a/jdk/test/sun/nio/cs/OLD/PCK_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/PCK_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/SJIS_OLD.java b/jdk/test/sun/nio/cs/OLD/SJIS_OLD.java index 5cc9e2cc5cc..343e0525f70 100644 --- a/jdk/test/sun/nio/cs/OLD/SJIS_OLD.java +++ b/jdk/test/sun/nio/cs/OLD/SJIS_OLD.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/SingleByteDecoder.java b/jdk/test/sun/nio/cs/OLD/SingleByteDecoder.java index 3c59f224825..1e1b0912673 100644 --- a/jdk/test/sun/nio/cs/OLD/SingleByteDecoder.java +++ b/jdk/test/sun/nio/cs/OLD/SingleByteDecoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/SingleByteEncoder.java b/jdk/test/sun/nio/cs/OLD/SingleByteEncoder.java index d3fa9282af7..6c9b6f928eb 100644 --- a/jdk/test/sun/nio/cs/OLD/SingleByteEncoder.java +++ b/jdk/test/sun/nio/cs/OLD/SingleByteEncoder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/OLD/TestIBMDB.java b/jdk/test/sun/nio/cs/OLD/TestIBMDB.java index 72d6720e75a..404eb5b3aa0 100644 --- a/jdk/test/sun/nio/cs/OLD/TestIBMDB.java +++ b/jdk/test/sun/nio/cs/OLD/TestIBMDB.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/StrCodingBenchmark.java b/jdk/test/sun/nio/cs/StrCodingBenchmark.java index 1d28ba5aaa9..42c66bf77ae 100644 --- a/jdk/test/sun/nio/cs/StrCodingBenchmark.java +++ b/jdk/test/sun/nio/cs/StrCodingBenchmark.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/StrCodingBenchmarkDB.java b/jdk/test/sun/nio/cs/StrCodingBenchmarkDB.java index bb7210227f8..988c10addb7 100644 --- a/jdk/test/sun/nio/cs/StrCodingBenchmarkDB.java +++ b/jdk/test/sun/nio/cs/StrCodingBenchmarkDB.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/TestCp834_SBCS.java b/jdk/test/sun/nio/cs/TestCp834_SBCS.java index 25e64698da4..d935b84d3ef 100644 --- a/jdk/test/sun/nio/cs/TestCp834_SBCS.java +++ b/jdk/test/sun/nio/cs/TestCp834_SBCS.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/TestStringCoding.java b/jdk/test/sun/nio/cs/TestStringCoding.java index 76f31d8897b..569ef2f6e22 100644 --- a/jdk/test/sun/nio/cs/TestStringCoding.java +++ b/jdk/test/sun/nio/cs/TestStringCoding.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/TestUTF8.java b/jdk/test/sun/nio/cs/TestUTF8.java index e83f8fbb51a..c54ae66f4d9 100644 --- a/jdk/test/sun/nio/cs/TestUTF8.java +++ b/jdk/test/sun/nio/cs/TestUTF8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/nio/cs/TestX11JIS0201.java b/jdk/test/sun/nio/cs/TestX11JIS0201.java index 6b9c58978a3..414493c961e 100644 --- a/jdk/test/sun/nio/cs/TestX11JIS0201.java +++ b/jdk/test/sun/nio/cs/TestX11JIS0201.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/ConfPlusProp.java b/jdk/test/sun/security/krb5/ConfPlusProp.java index 9fe1adcf455..0a944989cd7 100644 --- a/jdk/test/sun/security/krb5/ConfPlusProp.java +++ b/jdk/test/sun/security/krb5/ConfPlusProp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ * @bug 6857795 * @bug 6858589 * @bug 6972005 + * @compile -XDignore.symbol.file ConfPlusProp.java * @run main/othervm ConfPlusProp * @summary krb5.conf ignored if system properties on realm and kdc are provided */ @@ -75,7 +76,7 @@ public class ConfPlusProp { check("R1", "k1"); check("R2", "old"); check("R3", null); - if (!config.getDefault("forwardable", "libdefaults").equals("well")) { + if (!config.get("libdefaults", "forwardable").equals("well")) { throw new Exception("Extra config error"); } @@ -103,7 +104,7 @@ public class ConfPlusProp { check("R1", null); check("R2", null); check("R3", null); - if (config.getDefault("forwardable", "libdefaults") != null) { + if (config.get("libdefaults", "forwardable") != null) { throw new Exception("Extra config error"); } } @@ -121,7 +122,7 @@ public class ConfPlusProp { check("R1", "k1"); check("R2", "k2"); check("R3", "k2"); - if (!config.getDefault("forwardable", "libdefaults").equals("well")) { + if (!config.get("libdefaults", "forwardable").equals("well")) { throw new Exception("Extra config error"); } @@ -143,7 +144,7 @@ public class ConfPlusProp { check("R1", "k2"); check("R2", "k2"); check("R3", "k2"); - if (config.getDefault("forwardable", "libdefaults") != null) { + if (config.get("libdefaults", "forwardable") != null) { throw new Exception("Extra config error"); } } diff --git a/jdk/test/sun/security/krb5/DnsFallback.java b/jdk/test/sun/security/krb5/DnsFallback.java index 3a48b05d837..b1e64197794 100644 --- a/jdk/test/sun/security/krb5/DnsFallback.java +++ b/jdk/test/sun/security/krb5/DnsFallback.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,12 +28,20 @@ * @summary fix dns_fallback parse error, and use dns by default */ -import sun.security.krb5.*; import java.io.*; +import java.lang.reflect.Method; +import sun.security.krb5.Config; public class DnsFallback { + + static Method useDNS_Realm; + public static void main(String[] args) throws Exception { + useDNS_Realm = Config.class.getDeclaredMethod("useDNS_Realm"); + useDNS_Realm.setAccessible(true); + + // for 6673164 check("true", "true", true); check("false", "true", false); @@ -48,22 +56,25 @@ public class DnsFallback { check(null, null, true); } - static void check(String realm, String fallback, boolean output) throws Exception { - FileOutputStream fo = new FileOutputStream("dnsfallback.conf"); - StringBuffer sb = new StringBuffer(); - sb.append("[libdefaults]\n"); - if (realm != null) { - sb.append("dns_lookup_realm=" + realm + "\n"); + static void check(String realm, String fallback, boolean output) + throws Exception { + + try (PrintStream ps = + new PrintStream(new FileOutputStream("dnsfallback.conf"))) { + ps.println("[libdefaults]\n"); + if (realm != null) { + ps.println("dns_lookup_realm=" + realm); + } + if (fallback != null) { + ps.println("dns_fallback=" + fallback); + } } - if (fallback != null) { - sb.append("dns_fallback=" + fallback + "\n"); - } - fo.write(sb.toString().getBytes()); - fo.close(); + System.setProperty("java.security.krb5.conf", "dnsfallback.conf"); Config.refresh(); System.out.println("Testing " + realm + ", " + fallback + ", " + output); - if (Config.getInstance().useDNS_Realm() != output) { + + if (!useDNS_Realm.invoke(Config.getInstance()).equals(output)) { throw new Exception("Fail"); } } diff --git a/jdk/test/sun/security/krb5/Krb5NameEquals.java b/jdk/test/sun/security/krb5/Krb5NameEquals.java index 765621de8c4..0851423a7fd 100644 --- a/jdk/test/sun/security/krb5/Krb5NameEquals.java +++ b/jdk/test/sun/security/krb5/Krb5NameEquals.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/ParseConfig.java b/jdk/test/sun/security/krb5/ParseConfig.java index 43c5ce39f3a..ecbfa8af6a9 100644 --- a/jdk/test/sun/security/krb5/ParseConfig.java +++ b/jdk/test/sun/security/krb5/ParseConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,7 @@ /* * @test * @bug 6319046 + * @compile -XDignore.symbol.file ParseConfig.java * @run main/othervm ParseConfig * @summary Problem with parsing krb5.conf */ @@ -37,7 +38,7 @@ public class ParseConfig { String sample = "kdc.example.com kdc2.example.com"; for ( int i = 0; i < 4; i++ ) { - String expected = config.getDefault("kdc", "EXAMPLE_" + i + ".COM"); + String expected = config.getAll("realms", "EXAMPLE_" + i + ".COM", "kdc"); if (!sample.equals(expected)) { throw new Exception("krb5.conf: unexpected kdc value \"" + expected + "\""); diff --git a/jdk/test/sun/security/krb5/auto/BadKdc.java b/jdk/test/sun/security/krb5/auto/BadKdc.java index be8259d3538..1c10ccd69aa 100644 --- a/jdk/test/sun/security/krb5/auto/BadKdc.java +++ b/jdk/test/sun/security/krb5/auto/BadKdc.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/BadKdc1.java b/jdk/test/sun/security/krb5/auto/BadKdc1.java index bc96d056d71..7db7b8ad7a8 100644 --- a/jdk/test/sun/security/krb5/auto/BadKdc1.java +++ b/jdk/test/sun/security/krb5/auto/BadKdc1.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/BadKdc2.java b/jdk/test/sun/security/krb5/auto/BadKdc2.java index 26e001bcc70..7568784521d 100644 --- a/jdk/test/sun/security/krb5/auto/BadKdc2.java +++ b/jdk/test/sun/security/krb5/auto/BadKdc2.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/BadKdc3.java b/jdk/test/sun/security/krb5/auto/BadKdc3.java index 83816027a55..4bafd9a2ffe 100644 --- a/jdk/test/sun/security/krb5/auto/BadKdc3.java +++ b/jdk/test/sun/security/krb5/auto/BadKdc3.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/BadKdc4.java b/jdk/test/sun/security/krb5/auto/BadKdc4.java index bbd40471fb1..877e5400df9 100644 --- a/jdk/test/sun/security/krb5/auto/BadKdc4.java +++ b/jdk/test/sun/security/krb5/auto/BadKdc4.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/BasicKrb5Test.java b/jdk/test/sun/security/krb5/auto/BasicKrb5Test.java index aaf6b126668..aa6c0a40d28 100644 --- a/jdk/test/sun/security/krb5/auto/BasicKrb5Test.java +++ b/jdk/test/sun/security/krb5/auto/BasicKrb5Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,7 @@ * @test * @bug 6706974 * @summary Add krb5 test infrastructure + * @compile -XDignore.symbol.file BasicKrb5Test.java * @run main/othervm BasicKrb5Test * @run main/othervm BasicKrb5Test des-cbc-crc * @run main/othervm BasicKrb5Test des-cbc-md5 @@ -86,7 +87,7 @@ public class BasicKrb5Test { new OneKDC(etype).writeJAASConf(); System.out.println("Testing etype " + etype); - if (etype != null && !EType.isSupported(Config.getInstance().getType(etype))) { + if (etype != null && !EType.isSupported(Config.getType(etype))) { // aes256 is not enabled on all systems System.out.println("Not supported."); return; diff --git a/jdk/test/sun/security/krb5/auto/Context.java b/jdk/test/sun/security/krb5/auto/Context.java index ca612bad477..64ef5908262 100644 --- a/jdk/test/sun/security/krb5/auto/Context.java +++ b/jdk/test/sun/security/krb5/auto/Context.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/MaxRetries.java b/jdk/test/sun/security/krb5/auto/MaxRetries.java index f4f86a3fc89..2e896bc5a56 100644 --- a/jdk/test/sun/security/krb5/auto/MaxRetries.java +++ b/jdk/test/sun/security/krb5/auto/MaxRetries.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -108,7 +108,7 @@ public class MaxRetries { if (line.startsWith(">>> KDCCommunication")) { System.out.println(line); if (line.indexOf(timeoutTag) < 0) { - throw new Exception("Wrong timeout value"); + throw new Exception("Wrong timeout value" + timeoutTag); } count--; } diff --git a/jdk/test/sun/security/krb5/auto/OneKDC.java b/jdk/test/sun/security/krb5/auto/OneKDC.java index 76841af8fd2..5c87abb961a 100644 --- a/jdk/test/sun/security/krb5/auto/OneKDC.java +++ b/jdk/test/sun/security/krb5/auto/OneKDC.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/SSL.java b/jdk/test/sun/security/krb5/auto/SSL.java index 7ad0bd82c70..353916e7578 100644 --- a/jdk/test/sun/security/krb5/auto/SSL.java +++ b/jdk/test/sun/security/krb5/auto/SSL.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/SaslBasic.java b/jdk/test/sun/security/krb5/auto/SaslBasic.java new file mode 100644 index 00000000000..ef38ab3185f --- /dev/null +++ b/jdk/test/sun/security/krb5/auto/SaslBasic.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7110803 + * @summary SASL service for multiple hostnames + * @compile -XDignore.symbol.file SaslBasic.java + * @run main/othervm SaslBasic bound + * @run main/othervm SaslBasic unbound + */ +import java.io.IOException; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Locale; +import javax.security.auth.callback.Callback; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.UnsupportedCallbackException; +import javax.security.sasl.*; + +// The basic krb5 test skeleton you can copy from +public class SaslBasic { + + public static void main(String[] args) throws Exception { + + boolean bound = args[0].equals("bound"); + String name = "host." + OneKDC.REALM.toLowerCase(Locale.US); + + new OneKDC(null).writeJAASConf(); + System.setProperty("javax.security.auth.useSubjectCredsOnly", "false"); + + HashMap clntprops = new HashMap(); + clntprops.put(Sasl.QOP, "auth-conf"); + SaslClient sc = Sasl.createSaslClient( + new String[]{"GSSAPI"}, null, "server", + name, clntprops, null); + + final HashMap srvprops = new HashMap(); + srvprops.put(Sasl.QOP, "auth,auth-int,auth-conf"); + SaslServer ss = Sasl.createSaslServer("GSSAPI", "server", + bound? name: null, srvprops, + new CallbackHandler() { + public void handle(Callback[] callbacks) + throws IOException, UnsupportedCallbackException { + for (Callback cb : callbacks) { + if (cb instanceof RealmCallback) { + ((RealmCallback) cb).setText(OneKDC.REALM); + } else if (cb instanceof AuthorizeCallback) { + ((AuthorizeCallback) cb).setAuthorized(true); + } + } + } + }); + + byte[] token = new byte[0]; + while (!sc.isComplete() || !ss.isComplete()) { + if (!sc.isComplete()) { + token = sc.evaluateChallenge(token); + } + if (!ss.isComplete()) { + token = ss.evaluateResponse(token); + } + } + if (!bound) { + String boundName = (String)ss.getNegotiatedProperty(Sasl.BOUND_SERVER_NAME); + if (!boundName.equals(name)) { + throw new Exception("Wrong bound server name"); + } + } + byte[] hello = "hello".getBytes(); + token = sc.wrap(hello, 0, hello.length); + token = ss.unwrap(token, 0, token.length); + if (!Arrays.equals(hello, token)) { + throw new Exception("Message altered"); + } + } +} diff --git a/jdk/test/sun/security/krb5/auto/TcpTimeout.java b/jdk/test/sun/security/krb5/auto/TcpTimeout.java index 01bd58cfa70..325d5bb3591 100644 --- a/jdk/test/sun/security/krb5/auto/TcpTimeout.java +++ b/jdk/test/sun/security/krb5/auto/TcpTimeout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/auto/W83.java b/jdk/test/sun/security/krb5/auto/W83.java index 8ac419b5774..dea4e765e40 100644 --- a/jdk/test/sun/security/krb5/auto/W83.java +++ b/jdk/test/sun/security/krb5/auto/W83.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/krb5/ccache/EmptyCC.java b/jdk/test/sun/security/krb5/ccache/EmptyCC.java index d5bfc008651..a0cd759373d 100644 --- a/jdk/test/sun/security/krb5/ccache/EmptyCC.java +++ b/jdk/test/sun/security/krb5/ccache/EmptyCC.java @@ -24,9 +24,11 @@ /* * @test * @bug 7158329 + * @bug 8001208 * @summary NPE in sun.security.krb5.Credentials.acquireDefaultCreds() * @compile -XDignore.symbol.file EmptyCC.java - * @run main EmptyCC + * @run main EmptyCC tmpcc + * @run main EmptyCC FILE:tmpcc */ import java.io.File; import java.io.InputStream; @@ -40,9 +42,9 @@ import sun.security.krb5.internal.ccache.CredentialsCache; public class EmptyCC { public static void main(String[] args) throws Exception { final PrincipalName pn = new PrincipalName("dummy@FOO.COM"); - final String ccache = "tmpcc"; + final String ccache = args[0]; - if (args.length == 0) { + if (args.length == 1) { // Main process, write the ccache and launch sub process CredentialsCache cache = CredentialsCache.create(pn, ccache); cache.save(); @@ -54,6 +56,7 @@ public class EmptyCC { "-cp", System.getProperty("test.classes"), "EmptyCC", + ccache, "readcc" ); @@ -77,6 +80,14 @@ public class EmptyCC { if (!cc.equals(ccache)) { throw new Exception("env not set correctly"); } + // 8001208: Fix for KRB5CCNAME not complete + // Make sure the ccache is created with bare file name + if (CredentialsCache.getInstance() == null) { + throw new Exception("Cache not instantiated"); + } + if (!new File("tmpcc").exists()) { + throw new Exception("File not found"); + } Credentials.acquireTGTFromCache(pn, null); } } diff --git a/jdk/test/sun/security/krb5/config/Duplicates.java b/jdk/test/sun/security/krb5/config/Duplicates.java new file mode 100644 index 00000000000..0d8bac70c6d --- /dev/null +++ b/jdk/test/sun/security/krb5/config/Duplicates.java @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 7184246 + * @compile -XDignore.symbol.file Duplicates.java + * @run main/othervm Duplicates + * @summary Simplify Config.get() of krb5 + */ + +import sun.security.krb5.Config; + +public class Duplicates { + public static void main(String[] args) throws Exception { + System.setProperty("java.security.krb5.conf", + System.getProperty("test.src", ".") +"/k1.conf"); + Config config = Config.getInstance(); + config.listTable(); + String s; + + // Latter overwrites former for root section + s = config.get("libdefaults", "default_realm"); + if (s != null) { + throw new Exception(); + } + // Latter overwrites former for strings + s = config.get("libdefaults", "default_tkt_enctypes"); + if (!s.equals("aes256-cts")) { + throw new Exception(); + } + // Latter overwrites former for sub-section + s = config.get("realms", "R1", "kdc"); + if (!s.equals("k2")) { + throw new Exception(s); + } + // Duplicate keys in [realms] are merged + s = config.getAll("realms", "R2", "kdc"); + if (!s.equals("k1 k2 k3 k4")) { + throw new Exception(s); + } + // Duplicate keys in [capaths] are merged + s = config.getAll("capaths", "R1", "R2"); + if (!s.equals("R3 R4 R5 R6")) { + throw new Exception(s); + } + // We can be very deep now + s = config.get("new", "x", "y", "z", "a", "b", "c"); + if (!s.equals("d")) { + throw new Exception(s); + } + } +} diff --git a/jdk/test/sun/security/krb5/config/KdcDefaultOptions.java b/jdk/test/sun/security/krb5/config/KdcDefaultOptions.java new file mode 100644 index 00000000000..fb920635e4e --- /dev/null +++ b/jdk/test/sun/security/krb5/config/KdcDefaultOptions.java @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +/* + * @test + * @bug 7195426 + * @summary kdc_default_options not supported correctly + * @compile -XDignore.symbol.file KdcDefaultOptions.java + * @run main/othervm KdcDefaultOptions + */ + +import sun.security.krb5.Config; +import sun.security.krb5.internal.KDCOptions; + +public class KdcDefaultOptions { + public static void main(String[] args) throws Exception { + System.setProperty("java.security.krb5.conf", + System.getProperty("test.src", ".") + "/kdc_default_options.conf"); + Config.refresh(); + KDCOptions options = new KDCOptions(); + if (!options.get(KDCOptions.FORWARDABLE) || + !options.get(KDCOptions.PROXIABLE) || + !options.get(KDCOptions.RENEWABLE_OK)) { + throw new Exception(options.toString()); + } + } +} diff --git a/jdk/test/sun/security/krb5/config/SCDynamicConfigTest.java b/jdk/test/sun/security/krb5/config/SCDynamicConfigTest.java new file mode 100644 index 00000000000..b749927312b --- /dev/null +++ b/jdk/test/sun/security/krb5/config/SCDynamicConfigTest.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7184246 + * @summary Simplify Config.get() of krb5 + */ +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Hashtable; +import java.util.Vector; +import sun.security.krb5.Config; +import sun.security.krb5.SCDynamicStoreConfig; + +public class SCDynamicConfigTest { + + static Vector>hosts() { + Vector > result = new Vector<>(); + Hashtable pair = new Hashtable<>(); + pair.put("host", "127.0.0.1"); + result.add(pair); + pair = new Hashtable<>(); + pair.put("host", "127.0.0.2"); + result.add(pair); + return result; + } + + public static void main(String[] args) throws Exception { + // Reconstruct a typical SCDynamicConfig.getKerberosConfig() output + Hashtable conf = new Hashtable<>(); + + Hashtable libdefaults = new Hashtable<>(); + libdefaults.put("default_realm", "REALM.COM"); + conf.put("libdefaults", libdefaults); + + Hashtable realms = new Hashtable<>(); + Hashtable thisRealm = new Hashtable<>(); + realms.put("REALM.COM", thisRealm); + thisRealm.put("kpasswd", hosts()); + thisRealm.put("kadmin", hosts()); + thisRealm.put("kdc", hosts()); + conf.put("realms", realms); + + Hashtable domain_realm = new Hashtable<>(); + domain_realm.put(".realm.com", "REALM.COM"); + domain_realm.put("realm.com", "REALM.COM"); + conf.put("domain_realm", domain_realm); + + System.out.println("SCDynamicConfig:\n"); + System.out.println(conf); + + // Simulate SCDynamicConfig.getConfig() output + Method m = SCDynamicStoreConfig.class.getDeclaredMethod( + "convertNativeConfig", Hashtable.class); + m.setAccessible(true); + conf = (Hashtable)m.invoke(null, conf); + + System.out.println("\nkrb5.conf:\n"); + System.out.println(conf); + + // Feed it into a Config object + System.setProperty("java.security.krb5.conf", "not-a-file"); + Config cf = Config.getInstance(); + Field f = Config.class.getDeclaredField("stanzaTable"); + f.setAccessible(true); + f.set(cf, conf); + + System.out.println("\nConfig:\n"); + System.out.println(cf); + + if (!cf.getDefaultRealm().equals("REALM.COM")) { + throw new Exception(); + } + if (!cf.getKDCList("REALM.COM").equals("127.0.0.1 127.0.0.2")) { + throw new Exception(); + } + if (!cf.get("domain_realm", ".realm.com").equals("REALM.COM")) { + throw new Exception(); + } + } +} diff --git a/jdk/test/sun/security/krb5/config/k1.conf b/jdk/test/sun/security/krb5/config/k1.conf new file mode 100644 index 00000000000..76b8513e74d --- /dev/null +++ b/jdk/test/sun/security/krb5/config/k1.conf @@ -0,0 +1,40 @@ +[libdefaults] +default_realm = R1 + +[libdefaults] +default_tkt_enctypes = aes128-cts +default_tkt_enctypes = aes256-cts + +[realms] +R1 = { + kdc = k1 +} +R1 = { + kdc = k2 +} +R2 = { + kdc = k1 + kdc = k2 k3 + admin_server = a1 + kdc = k4 +} + +[capaths] +R1 = { + R2 = R3 + R2 = R4 R5 + R2 = R6 +} + +[new] +x = { + y = { + z = { + a = { + b = { + c = d + } + } + } + } +} diff --git a/jdk/test/sun/security/krb5/config/kdc_default_options.conf b/jdk/test/sun/security/krb5/config/kdc_default_options.conf new file mode 100644 index 00000000000..03482c823fd --- /dev/null +++ b/jdk/test/sun/security/krb5/config/kdc_default_options.conf @@ -0,0 +1,3 @@ +[libdefaults] +default_realm = EXAMPLE.COM +kdc_default_options = 0x50000010 diff --git a/jdk/test/sun/security/krb5/runNameEquals.sh b/jdk/test/sun/security/krb5/runNameEquals.sh index 0f0ab172a44..15096cc99de 100644 --- a/jdk/test/sun/security/krb5/runNameEquals.sh +++ b/jdk/test/sun/security/krb5/runNameEquals.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.sh b/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.sh index bfa08c807ce..4041c0e093a 100644 --- a/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.sh +++ b/jdk/test/sun/security/pkcs11/KeyStore/SecretKeysBasic.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh b/jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh index 2511ff6694f..ce5693f5968 100644 --- a/jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh +++ b/jdk/test/sun/security/pkcs11/Provider/ConfigQuotedString.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Provider/Login.sh b/jdk/test/sun/security/pkcs11/Provider/Login.sh index 6288a8f1364..86d8f9e4f70 100644 --- a/jdk/test/sun/security/pkcs11/Provider/Login.sh +++ b/jdk/test/sun/security/pkcs11/Provider/Login.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java b/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java index a192d5255da..c99c498946d 100644 --- a/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java +++ b/jdk/test/sun/security/pkcs11/Secmod/AddPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java b/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java index 2b43c3bbb10..1b3ff8194e7 100644 --- a/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java +++ b/jdk/test/sun/security/pkcs11/Secmod/AddTrustedCert.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Secmod/Crypto.java b/jdk/test/sun/security/pkcs11/Secmod/Crypto.java index 97085c36719..c44ab87835f 100644 --- a/jdk/test/sun/security/pkcs11/Secmod/Crypto.java +++ b/jdk/test/sun/security/pkcs11/Secmod/Crypto.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java b/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java index ec130ac11e5..a41bef9c77e 100644 --- a/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java +++ b/jdk/test/sun/security/pkcs11/Secmod/GetPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Secmod/JksSetPrivateKey.java b/jdk/test/sun/security/pkcs11/Secmod/JksSetPrivateKey.java index d302aad99d5..e3a60befff4 100644 --- a/jdk/test/sun/security/pkcs11/Secmod/JksSetPrivateKey.java +++ b/jdk/test/sun/security/pkcs11/Secmod/JksSetPrivateKey.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/Secmod/TrustAnchors.java b/jdk/test/sun/security/pkcs11/Secmod/TrustAnchors.java index 3d15b3f5128..646b81bfd81 100644 --- a/jdk/test/sun/security/pkcs11/Secmod/TrustAnchors.java +++ b/jdk/test/sun/security/pkcs11/Secmod/TrustAnchors.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/SecmodTest.java b/jdk/test/sun/security/pkcs11/SecmodTest.java index 76f68da0bb1..8973f8b2582 100644 --- a/jdk/test/sun/security/pkcs11/SecmodTest.java +++ b/jdk/test/sun/security/pkcs11/SecmodTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java b/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java index eba81c6d3ea..35662d6c624 100644 --- a/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java +++ b/jdk/test/sun/security/pkcs11/ec/ReadCertificates.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java b/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java index 6acc667aaf3..930e0625b43 100644 --- a/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java +++ b/jdk/test/sun/security/pkcs11/ec/ReadPKCS12.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/ec/TestECDH.java b/jdk/test/sun/security/pkcs11/ec/TestECDH.java index aa26d5c6d43..1d70befc89c 100644 --- a/jdk/test/sun/security/pkcs11/ec/TestECDH.java +++ b/jdk/test/sun/security/pkcs11/ec/TestECDH.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/ec/TestECDSA.java b/jdk/test/sun/security/pkcs11/ec/TestECDSA.java index 6f5325aae9e..a684d8aa8e1 100644 --- a/jdk/test/sun/security/pkcs11/ec/TestECDSA.java +++ b/jdk/test/sun/security/pkcs11/ec/TestECDSA.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/fips/TrustManagerTest.java b/jdk/test/sun/security/pkcs11/fips/TrustManagerTest.java index 81fba236ce2..76c5dadfd64 100644 --- a/jdk/test/sun/security/pkcs11/fips/TrustManagerTest.java +++ b/jdk/test/sun/security/pkcs11/fips/TrustManagerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/rsa/TestCACerts.java b/jdk/test/sun/security/pkcs11/rsa/TestCACerts.java index 188b94cd6aa..5e9f9ed061d 100644 --- a/jdk/test/sun/security/pkcs11/rsa/TestCACerts.java +++ b/jdk/test/sun/security/pkcs11/rsa/TestCACerts.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java b/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java index c940d562dfa..5ccaa0ab72a 100644 --- a/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java +++ b/jdk/test/sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/pkcs12/PKCS12SameKeyId.java b/jdk/test/sun/security/pkcs12/PKCS12SameKeyId.java index 0d06d730f58..f65292aeba1 100644 --- a/jdk/test/sun/security/pkcs12/PKCS12SameKeyId.java +++ b/jdk/test/sun/security/pkcs12/PKCS12SameKeyId.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,8 @@ * @test * @bug 6958026 * @summary Problem with PKCS12 keystore + * @compile -XDignore.symbol.file PKCS12SameKeyId.java + * @run main PKCS12SameKeyId */ import java.io.File; @@ -40,7 +42,6 @@ import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEParameterSpec; import sun.security.pkcs.EncryptedPrivateKeyInfo; -import sun.security.tools.KeyTool; import sun.security.util.ObjectIdentifier; import sun.security.x509.AlgorithmId; import sun.security.x509.X500Name; @@ -61,7 +62,7 @@ public class PKCS12SameKeyId { String cmd = "-keystore " + JKSFILE + " -storepass changeit -keypass changeit " + "-genkeypair -alias p" + i + " -dname CN=" + i; - KeyTool.main(cmd.split(" ")); + sun.security.tools.keytool.Main.main(cmd.split(" ")); } // Prepare EncryptedPrivateKeyInfo parameters, copied from various diff --git a/jdk/test/sun/security/provider/DSA/TestKeyPairGenerator.java b/jdk/test/sun/security/provider/DSA/TestKeyPairGenerator.java index f0c0fc37828..10483d5e66c 100644 --- a/jdk/test/sun/security/provider/DSA/TestKeyPairGenerator.java +++ b/jdk/test/sun/security/provider/DSA/TestKeyPairGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/provider/PolicyFile/Comparator.java b/jdk/test/sun/security/provider/PolicyFile/Comparator.java index 41d8938fc84..5f65d464164 100644 --- a/jdk/test/sun/security/provider/PolicyFile/Comparator.java +++ b/jdk/test/sun/security/provider/PolicyFile/Comparator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh b/jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh index 6e7442b5601..b52db72b326 100644 --- a/jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh +++ b/jdk/test/sun/security/provider/PolicyFile/getinstance/getinstance.sh @@ -1,7 +1,7 @@ #! /bin/sh # -# Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/provider/X509Factory/BigCRL.java b/jdk/test/sun/security/provider/X509Factory/BigCRL.java index 355c9becf72..bfc6b564ebb 100644 --- a/jdk/test/sun/security/provider/X509Factory/BigCRL.java +++ b/jdk/test/sun/security/provider/X509Factory/BigCRL.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/SSLSecurity/ProviderTest.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/SSLSecurity/ProviderTest.java index 2bb3b37c7b7..625af1791bd 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/SSLSecurity/ProviderTest.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/SSLSecurity/ProviderTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadBlocksClose.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadBlocksClose.java index 288859157ca..e14976ce777 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadBlocksClose.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadBlocksClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadHandshake.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadHandshake.java index ae726bf4d4d..f9d9342d017 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadHandshake.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadHandshake.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadZeroBytes.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadZeroBytes.java index 625e459baa7..566fdc034a3 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadZeroBytes.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/ReadZeroBytes.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/RemoveMarkReset.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/RemoveMarkReset.java index cdc8658ce57..096f12f8a87 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/RemoveMarkReset.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppInputStream/RemoveMarkReset.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppOutputStream/NoExceptionOnClose.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppOutputStream/NoExceptionOnClose.java index 8d2a9d244d3..a085d47ff04 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppOutputStream/NoExceptionOnClose.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/AppOutputStream/NoExceptionOnClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java index 9f01c477fe7..75e7436291f 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/RSAExport.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/RSAExport.java index 0ead094c084..d63fc8ea0d1 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/RSAExport.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/RSAExport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/GenSSLConfigs/main.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/GenSSLConfigs/main.java index 432aed4ffe3..dbe16292e04 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/GenSSLConfigs/main.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/GenSSLConfigs/main.java @@ -6,7 +6,7 @@ */ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/HandshakeOutStream/NullCerts.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/HandshakeOutStream/NullCerts.java index 0ffc0fac312..13b615456fc 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/HandshakeOutStream/NullCerts.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/HandshakeOutStream/NullCerts.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/InputRecord/SSLSocketTimeoutNulls.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/InputRecord/SSLSocketTimeoutNulls.java index 0a674a4a77a..70344cde866 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/InputRecord/SSLSocketTimeoutNulls.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/InputRecord/SSLSocketTimeoutNulls.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadKSProvider.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadKSProvider.java index 49b7841aeac..8e5f931e0a4 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadKSProvider.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadKSProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadTSProvider.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadTSProvider.java index 20a8b99eece..93355acf93d 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadTSProvider.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/BadTSProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/GoodProvider.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/GoodProvider.java index 64c55c7ade4..0ca10ec0d8c 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/GoodProvider.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLContextImpl/GoodProvider.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/RehandshakeFinished.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/RehandshakeFinished.java index 60e4acd85d7..da8e591d922 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/RehandshakeFinished.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/RehandshakeFinished.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/SSLEngineDeadlock.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/SSLEngineDeadlock.java index 6914a5cda56..1de0ab3bc54 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/SSLEngineDeadlock.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLEngineImpl/SSLEngineDeadlock.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSessionImpl/HashCodeMissing.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSessionImpl/HashCodeMissing.java index f10edfbb215..fa0433187f9 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSessionImpl/HashCodeMissing.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSessionImpl/HashCodeMissing.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java index de582a9d242..b65f8836be3 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/AsyncSSLSocketClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientModeClientAuth.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientModeClientAuth.java index adf86a0b6d9..8f279e8c5bc 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientModeClientAuth.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientModeClientAuth.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientTimeout.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientTimeout.java index a01789e4e06..16d28193c75 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientTimeout.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ClientTimeout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/CloseSocketException.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/CloseSocketException.java index 2958269cb00..41b88c1facd 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/CloseSocketException.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/CloseSocketException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/InvalidateServerSessionRenegotiate.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/InvalidateServerSessionRenegotiate.java index b0764a54a4f..2a6f0a8fa56 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/InvalidateServerSessionRenegotiate.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/InvalidateServerSessionRenegotiate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NewSocketMethods.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NewSocketMethods.java index 66fdda584ca..b78154958c9 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NewSocketMethods.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NewSocketMethods.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NonAutoClose.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NonAutoClose.java index dedac497df5..1d465e343c4 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NonAutoClose.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NonAutoClose.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh index aa01dcaef5e..fa5a410aa64 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/NotifyHandshakeTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReuseAddr.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReuseAddr.java index 638303669de..db5209f9095 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReuseAddr.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReuseAddr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReverseNameLookup.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReverseNameLookup.java index f8f570b64b4..612712b35bf 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReverseNameLookup.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ReverseNameLookup.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SSLSocketImplThrowsWrongExceptions.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SSLSocketImplThrowsWrongExceptions.java index dcbf0aab6d1..4c8ad80cbf7 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SSLSocketImplThrowsWrongExceptions.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SSLSocketImplThrowsWrongExceptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ServerTimeout.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ServerTimeout.java index aa116cf1867..ff7c0db1203 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ServerTimeout.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/ServerTimeout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SetClientMode.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SetClientMode.java index 8d3da6cf024..f26ae0a0c7f 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SetClientMode.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/SetClientMode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/UnconnectedSocketWrongExceptions.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/UnconnectedSocketWrongExceptions.java index 672e4b6e5ba..63fb43fa56b 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/UnconnectedSocketWrongExceptions.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SSLSocketImpl/UnconnectedSocketWrongExceptions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java index 6390a40227a..137f11460a6 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/AnonCipherWithWantClientAuth.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java index bc6b4e8eddb..b14e5cf3ea2 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ServerHandshaker/GetPeerHost.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2001, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SocketCreation/SocketCreation.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SocketCreation/SocketCreation.java index e79495e92a2..f81675c3725 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SocketCreation/SocketCreation.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/SocketCreation/SocketCreation.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/ClientServer.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/ClientServer.java index 8b724335d9c..c6099b407b4 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/ClientServer.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/ClientServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/PKIXExtendedTM.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/PKIXExtendedTM.java index 0ff498d36d1..aaf5fb2447d 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/PKIXExtendedTM.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/PKIXExtendedTM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SelfIssuedCert.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SelfIssuedCert.java index 6605d607c81..0037b6f379f 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SelfIssuedCert.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SelfIssuedCert.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java index b7a3613cc43..561718fe59e 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/SunX509ExtendedTM.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/X509ExtendedTMEnabled.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/X509ExtendedTMEnabled.java index 6a8659c0418..d257d241ff9 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/X509ExtendedTMEnabled.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/X509TrustManagerImpl/X509ExtendedTMEnabled.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/spi/ProviderInit.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/spi/ProviderInit.java index 23d57f860cc..682d80ade01 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/spi/ProviderInit.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/spi/ProviderInit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/CriticalSubjectAltName.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/CriticalSubjectAltName.java index e11b3f0c99b..e01115224c5 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/CriticalSubjectAltName.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/CriticalSubjectAltName.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/GetResponseCode.java b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/GetResponseCode.java index 5eb8ba15279..9335085eeba 100644 --- a/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/GetResponseCode.java +++ b/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/www/protocol/https/HttpsURLConnection/GetResponseCode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/ImplicitHandshake.java b/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/ImplicitHandshake.java index 8de05f1a094..8badfd66224 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/ImplicitHandshake.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/ImplicitHandshake.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSessionNulls.java b/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSessionNulls.java index 4bb6cb082a8..fc9cfbf1071 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSessionNulls.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSessionNulls.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSocketInherit.java b/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSocketInherit.java index 27fd5c076d0..2e3f544d246 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSocketInherit.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/FixingJavadocs/SSLSocketInherit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/CheckMyTrustedKeystore.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/CheckMyTrustedKeystore.java index 4ba4ea15a48..7dee02ea699 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/CheckMyTrustedKeystore.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/CheckMyTrustedKeystore.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/HttpsURLConnectionLocalCertificateChain.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/HttpsURLConnectionLocalCertificateChain.java index 1a05bc01530..ec773b244dd 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/HttpsURLConnectionLocalCertificateChain.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/HttpsURLConnectionLocalCertificateChain.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/JSSERenegotiate.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/JSSERenegotiate.java index 9e71fe7f48d..748b5fed6d4 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/JSSERenegotiate.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/JSSERenegotiate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLCtxAccessToSessCtx.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLCtxAccessToSessCtx.java index 5247412661a..41fddc46ed0 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLCtxAccessToSessCtx.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLCtxAccessToSessCtx.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/AcceptLargeFragments.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/AcceptLargeFragments.java index 8252d54b32e..c896c19547b 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/AcceptLargeFragments.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/AcceptLargeFragments.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ExtendedKeySocket.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ExtendedKeySocket.java index 171dcd7fc34..0f5b54bf1da 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ExtendedKeySocket.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ExtendedKeySocket.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargePacket.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargePacket.java index 498df71463a..c95ebfdf7dc 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargePacket.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargePacket.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -21,13 +21,18 @@ * questions. */ +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + /* * @test * * @bug 6388456 * @summary Need adjustable TLS max record size for interoperability * with non-compliant - * @run main/othervm -Djsse.enableCBCProtection=false LargePacket + * @run main/othervm LargePacket * * @author Xuelei Fan */ @@ -83,12 +88,12 @@ public class LargePacket extends SSLEngineService { SocketChannel sc = ssc.accept(); // Complete connection. - while (!sc.finishConnect() ) { + while (!sc.finishConnect()) { // waiting for the connection completed. } // handshaking - handshaking(ssle, sc); + handshaking(ssle, sc, null); // receive application data receive(ssle, sc); @@ -131,7 +136,7 @@ public class LargePacket extends SSLEngineService { } // handshaking - handshaking(ssle, sc); + handshaking(ssle, sc, null); // send out application data deliver(ssle, sc); @@ -169,6 +174,8 @@ public class LargePacket extends SSLEngineService { * Fork off the other side, then do your work. */ LargePacket() throws Exception { + super("../../../../../etc"); + if (separateServerThread) { startServer(true); startClient(false); diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/NoAuthClientAuth.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/NoAuthClientAuth.java index 916e72be650..f951e84c8bc 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/NoAuthClientAuth.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/NoAuthClientAuth.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/SSLEngineService.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/SSLEngineService.java index b00780e6361..bc4c6f7db12 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/SSLEngineService.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/SSLEngineService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -22,8 +22,6 @@ */ /* - * - * * @bug 6388456 * @summary Need adjustable TLS max record size for interoperability * with non-compliant stacks @@ -42,17 +40,31 @@ import java.nio.channels.*; public class SSLEngineService { - private static String pathToStores = "../../../../../etc"; private static String keyStoreFile = "keystore"; private static String trustStoreFile = "truststore"; private static char[] passphrase = "passphrase".toCharArray(); - private static String keyFilename = + private String pathToStores; + private String keyFilename; + private String trustFilename; + + protected SSLEngineService() { + init("../../../../../etc"); + } + + protected SSLEngineService(String pathToStores) { + init(pathToStores); + } + + private void init(String pathToStores) { + this.pathToStores = pathToStores; + this.keyFilename = System.getProperty("test.src", "./") + "/" + pathToStores + "/" + keyStoreFile; - private static String trustFilename = + this.trustFilename = System.getProperty("test.src", "./") + "/" + pathToStores + "/" + trustStoreFile; + } // deliver local application data. protected static void deliver(SSLEngine ssle, SocketChannel sc) @@ -143,9 +155,12 @@ public class SSLEngineService { ByteBuffer peerNetData = ByteBuffer.allocate(netBufferMax/2); int received = -1; + boolean needToReadMore = true; while (received != 0) { - if (ssle.isInboundDone() || sc.read(peerNetData) < 0) { - break; + if (needToReadMore) { + if (ssle.isInboundDone() || sc.read(peerNetData) < 0) { + break; + } } peerNetData.flip(); @@ -186,6 +201,8 @@ public class SSLEngineService { " bytes large packet "); } + needToReadMore = (peerNetData.position() > 0) ? false : true; + break; case BUFFER_OVERFLOW : @@ -206,6 +223,8 @@ public class SSLEngineService { " bytes for BUFFER_UNDERFLOW"); peerNetData = enlargeBuffer(peerNetData, size); } + + needToReadMore = true; break; default : // CLOSED : @@ -215,8 +234,8 @@ public class SSLEngineService { } } - protected static void handshaking(SSLEngine ssle, SocketChannel sc) - throws Exception { + protected static void handshaking(SSLEngine ssle, SocketChannel sc, + ByteBuffer additional) throws Exception { int appBufferMax = ssle.getSession().getApplicationBufferSize(); int netBufferMax = ssle.getSession().getPacketBufferSize(); @@ -232,15 +251,39 @@ public class SSLEngineService { SSLEngineResult.HandshakeStatus hs = ssle.getHandshakeStatus(); // start handshaking from unwrap + byte[] buffer = new byte[0xFF]; + boolean underflow = false; do { switch (hs) { case NEED_UNWRAP : if (peerNetData.position() == 0) { + if (additional != null && additional.hasRemaining()) { + do { + int len = Math.min(buffer.length, + peerNetData.remaining()); + len = Math.min(len, additional.remaining()); + if (len != 0) { + additional.get(buffer, 0, len); + peerNetData.put(buffer, 0, len); + } + } while (peerNetData.remaining() > 0 && + additional.hasRemaining()); + } else { + if (sc.read(peerNetData) < 0) { + ssle.closeInbound(); + return; + } + } + } + + if (underflow) { if (sc.read(peerNetData) < 0) { ssle.closeInbound(); return; } + + underflow = false; } peerNetData.flip(); @@ -259,6 +302,8 @@ public class SSLEngineService { size + " bytes for BUFFER_UNDERFLOW"); peerNetData = enlargeBuffer(peerNetData, size); } + + underflow = true; break; case BUFFER_OVERFLOW : // maybe need to enlarge the peer application data buffer. @@ -339,7 +384,7 @@ public class SSLEngineService { /* * Create an initialized SSLContext to use for this test. */ - protected static SSLEngine createSSLEngine(boolean mode) throws Exception { + protected SSLEngine createSSLEngine(boolean mode) throws Exception { SSLEngine ssle; diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngineResult/Deserialize.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngineResult/Deserialize.java index af116cd3b4d..369a6f8e77b 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngineResult/Deserialize.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngineResult/Deserialize.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionCacheSizeTests.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionCacheSizeTests.java index 64f602e7043..d5fdadd9b1e 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionCacheSizeTests.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionCacheSizeTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionTimeOutTests.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionTimeOutTests.java index 495e012f5e6..3d0946724f5 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionTimeOutTests.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SessionTimeOutTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/testEnabledProtocols.java b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/testEnabledProtocols.java index 06fe82dec8f..5774049ba6e 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/testEnabledProtocols.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/testEnabledProtocols.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorer.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorer.java new file mode 100644 index 00000000000..2cd46354010 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorer.java @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/* + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../NewAPIs/SSLEngine ../../../../templates + * @build SSLEngineService SSLCapabilities SSLExplorer + * @run main/othervm SSLEngineExplorer SSLv2Hello,SSLv3 + * @run main/othervm SSLEngineExplorer SSLv3 + * @run main/othervm SSLEngineExplorer TLSv1 + * @run main/othervm SSLEngineExplorer TLSv1.1 + * @run main/othervm SSLEngineExplorer TLSv1.2 + */ + +import javax.net.ssl.*; +import java.nio.*; +import java.net.*; +import java.util.*; +import java.nio.channels.*; + +public class SSLEngineExplorer extends SSLEngineService { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + // Is the server ready to serve? + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + // create SSLEngine. + SSLEngine ssle = createSSLEngine(false); + + // Create a server socket channel. + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.socket().bind(isa); + serverPort = ssc.socket().getLocalPort(); + + // Signal Client, we're ready for his connect. + serverReady = true; + + // Accept a socket channel. + SocketChannel sc = ssc.accept(); + sc.configureBlocking(false); + + // Complete connection. + while (!sc.finishConnect()) { + Thread.sleep(50); + // waiting for the connection completed. + } + + ByteBuffer buffer = ByteBuffer.allocate(0xFF); + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + buffer.limit(SSLExplorer.RECORD_HEADER_SIZE); + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + int recordLength = SSLExplorer.getRequiredSize(buffer); + if (buffer.capacity() < recordLength) { + ByteBuffer oldBuffer = buffer; + buffer = ByteBuffer.allocate(recordLength); + buffer.put(oldBuffer); + } + + buffer.position(SSLExplorer.RECORD_HEADER_SIZE); + buffer.limit(buffer.capacity()); + while (position < recordLength) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + capabilities = SSLExplorer.explore(buffer); + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + // handshaking + handshaking(ssle, sc, buffer); + + // receive application data + receive(ssle, sc); + + // send out application data + deliver(ssle, sc); + + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkCapabilities(capabilities, session); + + // close the socket channel. + sc.close(); + ssc.close(); + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + // create SSLEngine. + SSLEngine ssle = createSSLEngine(true); + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + // Create a non-blocking socket channel. + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + sc.connect(isa); + + // Complete connection. + while (!sc.finishConnect() ) { + Thread.sleep(50); + // waiting for the connection completed. + } + + // enable the specified TLS protocol + ssle.setEnabledProtocols(supportedProtocols); + + // handshaking + handshaking(ssle, sc, null); + + // send out application data + deliver(ssle, sc); + + // receive application data + receive(ssle, sc); + + // close the socket channel. + sc.close(); + } + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + throw new Exception( + "server name indication does not match capabilities"); + } + } + + private static String[] supportedProtocols; // supported protocols + + private static void parseArguments(String[] args) { + supportedProtocols = args[0].split(","); + } + + + /* + * ============================================================= + * The remainder is just support stuff + */ + volatile Exception serverException = null; + volatile Exception clientException = null; + + // use any free port by default + volatile int serverPort = 0; + + public static void main(String args[]) throws Exception { + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + new SSLEngineExplorer(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLEngineExplorer() throws Exception { + super("../../../../etc"); + + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * + * If the main thread excepted, that propagates back + * immediately. If the other thread threw an exception, we + * should report back. + */ + if (serverException != null) { + System.out.print("Server Exception:"); + throw serverException; + } + if (clientException != null) { + System.out.print("Client Exception:"); + throw clientException; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + System.err.println(e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + doServerSide(); + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + doClientSide(); + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerMatchedSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerMatchedSNI.java new file mode 100644 index 00000000000..c201bee86ad --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerMatchedSNI.java @@ -0,0 +1,393 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/* + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../NewAPIs/SSLEngine ../../../../templates + * @build SSLEngineService SSLCapabilities SSLExplorer + * @run main/othervm SSLEngineExplorerMatchedSNI www.example.com + * www\.example\.com + * @run main/othervm SSLEngineExplorerMatchedSNI www.example.com + * www\.example\.(com|org) + * @run main/othervm SSLEngineExplorerMatchedSNI example.com + * (.*\.)*example\.(com|org) + * @run main/othervm SSLEngineExplorerMatchedSNI www.example.com + * (.*\.)*example\.(com|org) + * @run main/othervm SSLEngineExplorerMatchedSNI www.us.example.com + * (.*\.)*example\.(com|org) + */ + +import javax.net.ssl.*; +import java.nio.*; +import java.net.*; +import java.util.*; +import java.nio.channels.*; + +public class SSLEngineExplorerMatchedSNI extends SSLEngineService { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = false; + + // Is the server ready to serve? + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + // create SSLEngine. + SSLEngine ssle = createSSLEngine(false); + + // Create a server socket channel. + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.socket().bind(isa); + serverPort = ssc.socket().getLocalPort(); + + // Signal Client, we're ready for his connect. + serverReady = true; + + // Accept a socket channel. + SocketChannel sc = ssc.accept(); + + // Complete connection. + while (!sc.finishConnect()) { + Thread.sleep(50); + // waiting for the connection completed. + } + + ByteBuffer buffer = ByteBuffer.allocate(0xFF); + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + buffer.limit(SSLExplorer.RECORD_HEADER_SIZE); + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + int recordLength = SSLExplorer.getRequiredSize(buffer); + if (buffer.capacity() < recordLength) { + ByteBuffer oldBuffer = buffer; + buffer = ByteBuffer.allocate(recordLength); + buffer.put(oldBuffer); + } + + buffer.position(SSLExplorer.RECORD_HEADER_SIZE); + buffer.limit(buffer.capacity()); + while (position < recordLength) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + capabilities = SSLExplorer.explore(buffer); + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + // enable server name indication checking + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = ssle.getSSLParameters(); + params.setSNIMatchers(matchers); + ssle.setSSLParameters(params); + + // handshaking + handshaking(ssle, sc, buffer); + + // receive application data + receive(ssle, sc); + + // send out application data + deliver(ssle, sc); + + // check server name indication + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkCapabilities(capabilities, session); + + // close the socket channel. + sc.close(); + ssc.close(); + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + // create SSLEngine. + SSLEngine ssle = createSSLEngine(true); + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + // Create a non-blocking socket channel. + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + sc.connect(isa); + + // Complete connection. + while (!sc.finishConnect() ) { + Thread.sleep(50); + // waiting for the connection completed. + } + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = ssle.getSSLParameters(); + params.setServerNames(serverNames); + ssle.setSSLParameters(params); + + // handshaking + handshaking(ssle, sc, null); + + // send out application data + deliver(ssle, sc); + + // receive application data + receive(ssle, sc); + + // check server name indication + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkSNIInSession(session); + + // close the socket channel. + sc.close(); + } + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + for (SNIServerName sni : sessionSNI) { + System.out.println("SNI in session is " + sni); + } + + List capaSNI = capabilities.getServerNames(); + for (SNIServerName sni : capaSNI) { + System.out.println("SNI in session is " + sni); + } + + throw new Exception( + "server name indication does not match capabilities"); + } + + checkSNIInSession(session); + } + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (sessionSNI.isEmpty()) { + throw new Exception( + "unexpected empty request server name indication"); + } + + if (sessionSNI.size() != 1) { + throw new Exception( + "unexpected request server name indication"); + } + + SNIServerName serverName = sessionSNI.get(0); + if (!(serverName instanceof SNIHostName)) { + throw new Exception( + "unexpected instance of request server name indication"); + } + + String hostname = ((SNIHostName)serverName).getAsciiName(); + if (!clientRequestedHostname.equalsIgnoreCase(hostname)) { + throw new Exception( + "unexpected request server name indication value"); + } + } + + private static String clientRequestedHostname; + private static String serverAcceptableHostname; + + private static void parseArguments(String[] args) { + clientRequestedHostname = args[0]; + serverAcceptableHostname = args[1]; + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + volatile Exception serverException = null; + volatile Exception clientException = null; + + // use any free port by default + volatile int serverPort = 0; + + public static void main(String args[]) throws Exception { + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + new SSLEngineExplorerMatchedSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLEngineExplorerMatchedSNI() throws Exception { + super("../../../../etc"); + + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * + * If the main thread excepted, that propagates back + * immediately. If the other thread threw an exception, we + * should report back. + */ + if (serverException != null) { + System.out.print("Server Exception:"); + throw serverException; + } + if (clientException != null) { + System.out.print("Client Exception:"); + throw clientException; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + System.err.println(e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + doServerSide(); + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + doClientSide(); + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerUnmatchedSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerUnmatchedSNI.java new file mode 100644 index 00000000000..2a9647be457 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerUnmatchedSNI.java @@ -0,0 +1,406 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/* + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../NewAPIs/SSLEngine ../../../../templates + * @build SSLEngineService SSLCapabilities SSLExplorer + * @run main/othervm SSLEngineExplorerUnmatchedSNI www.example.com + * www\.example\.org + */ + +import javax.net.ssl.*; +import java.io.*; +import java.nio.*; +import java.net.*; +import java.util.*; +import java.nio.channels.*; + +public class SSLEngineExplorerUnmatchedSNI extends SSLEngineService { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = false; + + // Is the server ready to serve? + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + // create SSLEngine. + SSLEngine ssle = createSSLEngine(false); + + // Create a server socket channel. + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.socket().bind(isa); + serverPort = ssc.socket().getLocalPort(); + + // Signal Client, we're ready for his connect. + serverReady = true; + + // Accept a socket channel. + SocketChannel sc = ssc.accept(); + + // Complete connection. + while (!sc.finishConnect()) { + Thread.sleep(50); + // waiting for the connection completed. + } + + ByteBuffer buffer = ByteBuffer.allocate(0xFF); + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + buffer.limit(SSLExplorer.RECORD_HEADER_SIZE); + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + int recordLength = SSLExplorer.getRequiredSize(buffer); + if (buffer.capacity() < recordLength) { + ByteBuffer oldBuffer = buffer; + buffer = ByteBuffer.allocate(recordLength); + buffer.put(oldBuffer); + } + + buffer.position(SSLExplorer.RECORD_HEADER_SIZE); + buffer.limit(buffer.capacity()); + while (position < recordLength) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + capabilities = SSLExplorer.explore(buffer); + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + // enable server name indication checking + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = ssle.getSSLParameters(); + params.setSNIMatchers(matchers); + ssle.setSSLParameters(params); + + try { + // handshaking + handshaking(ssle, sc, buffer); + + // receive application data + receive(ssle, sc); + + // send out application data + deliver(ssle, sc); + + // check server name indication + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkCapabilities(capabilities, session); + + throw new Exception( + "Mismatched server name indication was accepted"); + } catch (SSLHandshakeException sslhe) { + // the expected unrecognized server name indication exception + } catch (IOException ioe) { + // the peer may have closed the socket because of the unmatched + // server name indication. + } finally { + // close the socket channel. + sc.close(); + ssc.close(); + } + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + // create SSLEngine. + SSLEngine ssle = createSSLEngine(true); + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + // Create a non-blocking socket channel. + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + sc.connect(isa); + + // Complete connection. + while (!sc.finishConnect() ) { + Thread.sleep(50); + // waiting for the connection completed. + } + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = ssle.getSSLParameters(); + params.setServerNames(serverNames); + ssle.setSSLParameters(params); + + try { + // handshaking + handshaking(ssle, sc, null); + + // send out application data + deliver(ssle, sc); + + // receive application data + receive(ssle, sc); + + // check server name indication + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkSNIInSession(session); + + throw new Exception( + "Mismatched server name indication was accepted"); + } catch (SSLHandshakeException sslhe) { + // the expected unrecognized server name indication exception + } catch (IOException ioe) { + // the peer may have closed the socket because of the unmatched + // server name indication. + } finally { + // close the socket channel. + sc.close(); + } + } + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + for (SNIServerName sni : sessionSNI) { + System.out.println("SNI in session is " + sni); + } + + List capaSNI = capabilities.getServerNames(); + for (SNIServerName sni : capaSNI) { + System.out.println("SNI in session is " + sni); + } + + throw new Exception( + "server name indication does not match capabilities"); + } + + checkSNIInSession(session); + } + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (sessionSNI.isEmpty()) { + throw new Exception( + "unexpected empty request server name indication"); + } + + if (sessionSNI.size() != 1) { + throw new Exception( + "unexpected request server name indication"); + } + + SNIServerName serverName = sessionSNI.get(0); + if (!(serverName instanceof SNIHostName)) { + throw new Exception( + "unexpected instance of request server name indication"); + } + + String hostname = ((SNIHostName)serverName).getAsciiName(); + if (!clientRequestedHostname.equalsIgnoreCase(hostname)) { + throw new Exception( + "unexpected request server name indication value"); + } + } + + private static String clientRequestedHostname; + private static String serverAcceptableHostname; + + private static void parseArguments(String[] args) { + clientRequestedHostname = args[0]; + serverAcceptableHostname = args[1]; + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + volatile Exception serverException = null; + volatile Exception clientException = null; + + // use any free port by default + volatile int serverPort = 0; + + public static void main(String args[]) throws Exception { + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + new SSLEngineExplorerUnmatchedSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLEngineExplorerUnmatchedSNI() throws Exception { + super("../../../../etc"); + + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * + * If the main thread excepted, that propagates back + * immediately. If the other thread threw an exception, we + * should report back. + */ + if (serverException != null) { + System.out.print("Server Exception:"); + throw serverException; + } + if (clientException != null) { + System.out.print("Client Exception:"); + throw clientException; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + System.err.println(e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + doServerSide(); + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + doClientSide(); + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerWithCli.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerWithCli.java new file mode 100644 index 00000000000..bfa23cb38de --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerWithCli.java @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/* + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../NewAPIs/SSLEngine ../../../../templates + * @build SSLEngineService SSLCapabilities SSLExplorer + * @run main/othervm SSLEngineExplorerWithCli + */ + +import javax.net.ssl.*; +import java.nio.*; +import java.net.*; +import java.util.*; +import java.nio.channels.*; + +public class SSLEngineExplorerWithCli extends SSLEngineService { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + // Is the server ready to serve? + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + // create SSLEngine. + SSLEngine ssle = createSSLEngine(false); + + // Create a server socket channel. + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.socket().bind(isa); + serverPort = ssc.socket().getLocalPort(); + + // Signal Client, we're ready for his connect. + serverReady = true; + + // Accept a socket channel. + SocketChannel sc = ssc.accept(); + + // Complete connection. + while (!sc.finishConnect()) { + Thread.sleep(50); + // waiting for the connection completed. + } + + ByteBuffer buffer = ByteBuffer.allocate(0xFF); + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + buffer.limit(SSLExplorer.RECORD_HEADER_SIZE); + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + int recordLength = SSLExplorer.getRequiredSize(buffer); + if (buffer.capacity() < recordLength) { + ByteBuffer oldBuffer = buffer; + buffer = ByteBuffer.allocate(recordLength); + buffer.put(oldBuffer); + } + + buffer.position(SSLExplorer.RECORD_HEADER_SIZE); + buffer.limit(buffer.capacity()); + while (position < recordLength) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + capabilities = SSLExplorer.explore(buffer); + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + // handshaking + handshaking(ssle, sc, buffer); + + // receive application data + receive(ssle, sc); + + // send out application data + deliver(ssle, sc); + + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkCapabilities(capabilities, session); + + // close the socket channel. + sc.close(); + ssc.close(); + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + // create SSLEngine. + SSLEngine ssle = createSSLEngine(true); + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + // Create a non-blocking socket channel. + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + sc.connect(isa); + + // Complete connection. + while (!sc.finishConnect() ) { + Thread.sleep(50); + // waiting for the connection completed. + } + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = ssle.getSSLParameters(); + params.setServerNames(serverNames); + ssle.setSSLParameters(params); + + // handshaking + handshaking(ssle, sc, null); + + // send out application data + deliver(ssle, sc); + + // receive application data + receive(ssle, sc); + + // check server name indication + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkSNIInSession(session); + + // close the socket channel. + sc.close(); + } + + private static String clientRequestedHostname = "www.example.com"; + private static String serverAcceptableHostname = + "www\\.example\\.(com|org)"; + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + for (SNIServerName sni : sessionSNI) { + System.out.println("SNI in session is " + sni); + } + + List capaSNI = capabilities.getServerNames(); + for (SNIServerName sni : capaSNI) { + System.out.println("SNI in session is " + sni); + } + + throw new Exception( + "server name indication does not match capabilities"); + } + + checkSNIInSession(session); + } + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (sessionSNI.isEmpty()) { + throw new Exception( + "unexpected empty request server name indication"); + } + + if (sessionSNI.size() != 1) { + throw new Exception( + "unexpected request server name indication"); + } + + SNIServerName serverName = sessionSNI.get(0); + if (!(serverName instanceof SNIHostName)) { + throw new Exception( + "unexpected instance of request server name indication"); + } + + String hostname = ((SNIHostName)serverName).getAsciiName(); + if (!clientRequestedHostname.equalsIgnoreCase(hostname)) { + throw new Exception( + "unexpected request server name indication value"); + } + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + volatile Exception serverException = null; + volatile Exception clientException = null; + + // use any free port by default + volatile int serverPort = 0; + + public static void main(String args[]) throws Exception { + if (debug) + System.setProperty("javax.net.debug", "all"); + + new SSLEngineExplorerWithCli(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLEngineExplorerWithCli() throws Exception { + super("../../../../etc"); + + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * + * If the main thread excepted, that propagates back + * immediately. If the other thread threw an exception, we + * should report back. + */ + if (serverException != null) { + System.out.print("Server Exception:"); + throw serverException; + } + if (clientException != null) { + System.out.print("Client Exception:"); + throw clientException; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + System.err.println(e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + doServerSide(); + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + doClientSide(); + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerWithSrv.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerWithSrv.java new file mode 100644 index 00000000000..e8fd2707f25 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLEngineExplorerWithSrv.java @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/* + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../NewAPIs/SSLEngine ../../../../templates + * @build SSLEngineService SSLCapabilities SSLExplorer + * @run main/othervm SSLEngineExplorerWithSrv + */ + +import javax.net.ssl.*; +import java.nio.*; +import java.net.*; +import java.util.*; +import java.nio.channels.*; + +public class SSLEngineExplorerWithSrv extends SSLEngineService { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + // Is the server ready to serve? + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + // create SSLEngine. + SSLEngine ssle = createSSLEngine(false); + + // Create a server socket channel. + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + ServerSocketChannel ssc = ServerSocketChannel.open(); + ssc.socket().bind(isa); + serverPort = ssc.socket().getLocalPort(); + + // Signal Client, we're ready for his connect. + serverReady = true; + + // Accept a socket channel. + SocketChannel sc = ssc.accept(); + + // Complete connection. + while (!sc.finishConnect()) { + Thread.sleep(50); + // waiting for the connection completed. + } + + ByteBuffer buffer = ByteBuffer.allocate(0xFF); + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + buffer.limit(SSLExplorer.RECORD_HEADER_SIZE); + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + int recordLength = SSLExplorer.getRequiredSize(buffer); + if (buffer.capacity() < recordLength) { + ByteBuffer oldBuffer = buffer; + buffer = ByteBuffer.allocate(recordLength); + buffer.put(oldBuffer); + } + + buffer.position(SSLExplorer.RECORD_HEADER_SIZE); + buffer.limit(buffer.capacity()); + while (position < recordLength) { + int n = sc.read(buffer); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + buffer.flip(); + + capabilities = SSLExplorer.explore(buffer); + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + // enable server name indication checking + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = ssle.getSSLParameters(); + params.setSNIMatchers(matchers); + ssle.setSSLParameters(params); + + // handshaking + handshaking(ssle, sc, buffer); + + // receive application data + receive(ssle, sc); + + // send out application data + deliver(ssle, sc); + + // check server name indication + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkCapabilities(capabilities, session); + + // close the socket channel. + sc.close(); + ssc.close(); + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + // create SSLEngine. + SSLEngine ssle = createSSLEngine(true); + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + // Create a non-blocking socket channel. + SocketChannel sc = SocketChannel.open(); + sc.configureBlocking(false); + InetSocketAddress isa = + new InetSocketAddress(InetAddress.getLocalHost(), serverPort); + sc.connect(isa); + + // Complete connection. + while (!sc.finishConnect() ) { + Thread.sleep(50); + // waiting for the connection completed. + } + + // handshaking + handshaking(ssle, sc, null); + + // send out application data + deliver(ssle, sc); + + // receive application data + receive(ssle, sc); + + // check server name indication + ExtendedSSLSession session = (ExtendedSSLSession)ssle.getSession(); + checkSNIInSession(session); + + // close the socket channel. + sc.close(); + } + + private static String clientRequestedHostname = "www.example.com"; + private static String serverAcceptableHostname = + "www\\.example\\.(com|org)"; + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + for (SNIServerName sni : sessionSNI) { + System.out.println("SNI in session is " + sni); + } + + List capaSNI = capabilities.getServerNames(); + for (SNIServerName sni : capaSNI) { + System.out.println("SNI in session is " + sni); + } + + throw new Exception( + "server name indication does not match capabilities"); + } + + checkSNIInSession(session); + } + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.isEmpty()) { + throw new Exception( + "should be empty request server name indication"); + } + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + volatile Exception serverException = null; + volatile Exception clientException = null; + + // use any free port by default + volatile int serverPort = 0; + + public static void main(String args[]) throws Exception { + if (debug) + System.setProperty("javax.net.debug", "all"); + + new SSLEngineExplorerWithSrv(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLEngineExplorerWithSrv() throws Exception { + super("../../../../etc"); + + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * + * If the main thread excepted, that propagates back + * immediately. If the other thread threw an exception, we + * should report back. + */ + if (serverException != null) { + System.out.print("Server Exception:"); + throw serverException; + } + if (clientException != null) { + System.out.print("Client Exception:"); + throw clientException; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + System.err.println(e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + doServerSide(); + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + doClientSide(); + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketConsistentSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketConsistentSNI.java new file mode 100644 index 00000000000..d9ff691e06c --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketConsistentSNI.java @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @run main/othervm SSLSocketConsistentSNI + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketConsistentSNI { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + SSLServerSocketFactory sslssf = + (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); + SSLServerSocket sslServerSocket = + (SSLServerSocket) sslssf.createServerSocket(serverPort); + + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = sslServerSocket.getSSLParameters(); + params.setSNIMatchers(matchers); + sslServerSocket.setSSLParameters(params); + + serverPort = sslServerSocket.getLocalPort(); + + /* + * Signal Client, we're ready for his connect. + */ + serverReady = true; + + SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept(); + try { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + ExtendedSSLSession session = + (ExtendedSSLSession)sslSocket.getSession(); + checkSNIInSession(session); + } finally { + sslSocket.close(); + sslServerSocket.close(); + } + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = sslSocket.getSSLParameters(); + params.setServerNames(serverNames); + sslSocket.setSSLParameters(params); + + try { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + ExtendedSSLSession session = + (ExtendedSSLSession)sslSocket.getSession(); + checkSNIInSession(session); + } finally { + sslSocket.close(); + } + } + + private static String clientRequestedHostname = "www.example.com"; + private static String serverAcceptableHostname = "www\\.example\\.com"; + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (sessionSNI.isEmpty()) { + throw new Exception( + "unexpected empty request server name indication"); + } + + if (sessionSNI.size() != 1) { + throw new Exception( + "unexpected request server name indication"); + } + + SNIServerName serverName = sessionSNI.get(0); + if (!(serverName instanceof SNIHostName)) { + throw new Exception( + "unexpected instance of request server name indication"); + } + + String hostname = ((SNIHostName)serverName).getAsciiName(); + if (!clientRequestedHostname.equalsIgnoreCase(hostname)) { + throw new Exception( + "unexpected request server name indication value"); + } + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Start the tests. + */ + new SSLSocketConsistentSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketConsistentSNI() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorer.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorer.java new file mode 100644 index 00000000000..27e2b6abce7 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorer.java @@ -0,0 +1,375 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../../../../templates + * @build SSLCapabilities SSLExplorer + * @run main/othervm SSLSocketExplorer SSLv2Hello,SSLv3 + * @run main/othervm SSLSocketExplorer SSLv3 + * @run main/othervm SSLSocketExplorer TLSv1 + * @run main/othervm SSLSocketExplorer TLSv1.1 + * @run main/othervm SSLSocketExplorer TLSv1.2 + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketExplorer { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + ServerSocket serverSocket = new ServerSocket(serverPort); + + // Signal Client, we're ready for his connect. + serverPort = serverSocket.getLocalPort(); + serverReady = true; + + Socket socket = serverSocket.accept(); + InputStream ins = socket.getInputStream(); + + byte[] buffer = new byte[0xFF]; + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int count = SSLExplorer.RECORD_HEADER_SIZE - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + int recordLength = SSLExplorer.getRequiredSize(buffer, 0, position); + if (buffer.length < recordLength) { + buffer = Arrays.copyOf(buffer, recordLength); + } + + while (position < recordLength) { + int count = recordLength - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + capabilities = SSLExplorer.explore(buffer, 0, recordLength);; + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + ByteArrayInputStream bais = + new ByteArrayInputStream(buffer, 0, position); + SSLSocket sslSocket = (SSLSocket)sslsf.createSocket(socket, bais, true); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + ExtendedSSLSession session = (ExtendedSSLSession)sslSocket.getSession(); + checkCapabilities(capabilities, session); + + sslSocket.close(); + serverSocket.close(); + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + // enable the specified TLS protocol + sslSocket.setEnabledProtocols(supportedProtocols); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + sslSocket.close(); + } + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + throw new Exception( + "server name indication does not match capabilities"); + } + } + + private static String[] supportedProtocols; // supported protocols + + private static void parseArguments(String[] args) { + supportedProtocols = args[0].split(","); + } + + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + /* + * Start the tests. + */ + new SSLSocketExplorer(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketExplorer() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerFailure.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerFailure.java new file mode 100644 index 00000000000..44a37150ef8 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerFailure.java @@ -0,0 +1,383 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../../../../templates + * @build SSLCapabilities SSLExplorer + * @run main/othervm SSLSocketExplorerFailure SSLv2Hello,SSLv3 + * @run main/othervm SSLSocketExplorerFailure SSLv3 + * @run main/othervm SSLSocketExplorerFailure TLSv1 + * @run main/othervm SSLSocketExplorerFailure TLSv1.1 + * @run main/othervm SSLSocketExplorerFailure TLSv1.2 + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketExplorerFailure { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + ServerSocket serverSocket = new ServerSocket(serverPort); + + // Signal Client, we're ready for his connect. + serverPort = serverSocket.getLocalPort(); + serverReady = true; + + Socket socket = serverSocket.accept(); + InputStream ins = socket.getInputStream(); + + byte[] buffer = new byte[0xFF]; + int position = 0; + SSLCapabilities capabilities = null; + boolean failed = false; + try { + // Read the header of TLS record + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int count = SSLExplorer.RECORD_HEADER_SIZE - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + int recordLength = SSLExplorer.getRequiredSize(buffer, 0, position); + if (buffer.length < recordLength) { + buffer = Arrays.copyOf(buffer, recordLength); + } + + while (position < recordLength) { + int count = recordLength - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + capabilities = SSLExplorer.explore(buffer, 0, recordLength);; + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + // want an I/O exception + throw new IOException("We just want a I/O exception"); + } catch (Exception e) { + failed = true; + } + + // off course, the above explore failed. Faile to failure handler + SSLContext context = SSLContext.getInstance("TLS"); + context.init(null, null, null); + SSLSocketFactory sslsf = context.getSocketFactory(); + ByteArrayInputStream bais = + new ByteArrayInputStream(buffer, 0, position); + SSLSocket sslSocket = (SSLSocket)sslsf.createSocket(socket, bais, true); + + try { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + if (!failed) { + sslOS.write(85); + sslOS.flush(); + } else { + sslSocket.close(); + } + } catch (Exception e) { + System.out.println("server exception " + e); + } finally { + sslSocket.close(); + serverSocket.close(); + } + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + // enable the specified TLS protocol + sslSocket.setEnabledProtocols(supportedProtocols); + + try { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + } catch (Exception e) { + System.out.println("client exception " + e); + } finally { + sslSocket.close(); + } + } + + private static String[] supportedProtocols; // supported protocols + + private static void parseArguments(String[] args) { + supportedProtocols = args[0].split(","); + } + + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + /* + * Start the tests. + */ + new SSLSocketExplorerFailure(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketExplorerFailure() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerMatchedSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerMatchedSNI.java new file mode 100644 index 00000000000..c9ae26c42a6 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerMatchedSNI.java @@ -0,0 +1,435 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../../../../templates + * @build SSLCapabilities SSLExplorer + * @run main/othervm SSLSocketExplorerMatchedSNI www.example.com + * www\.example\.com + * @run main/othervm SSLSocketExplorerMatchedSNI www.example.com + * www\.example\.(com|org) + * @run main/othervm SSLSocketExplorerMatchedSNI example.com + * (.*\.)*example\.(com|org) + * @run main/othervm SSLSocketExplorerMatchedSNI www.example.com + * (.*\.)*example\.(com|org) + * @run main/othervm SSLSocketExplorerMatchedSNI www.us.example.com + * (.*\.)*example\.(com|org) + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketExplorerMatchedSNI { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = false; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + ServerSocket serverSocket = new ServerSocket(serverPort); + + // Signal Client, we're ready for his connect. + serverPort = serverSocket.getLocalPort(); + serverReady = true; + + Socket socket = serverSocket.accept(); + InputStream ins = socket.getInputStream(); + + byte[] buffer = new byte[0xFF]; + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int count = SSLExplorer.RECORD_HEADER_SIZE - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + int recordLength = SSLExplorer.getRequiredSize(buffer, 0, position); + if (buffer.length < recordLength) { + buffer = Arrays.copyOf(buffer, recordLength); + } + + while (position < recordLength) { + int count = recordLength - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + capabilities = SSLExplorer.explore(buffer, 0, recordLength);; + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + ByteArrayInputStream bais = + new ByteArrayInputStream(buffer, 0, position); + SSLSocket sslSocket = (SSLSocket)sslsf.createSocket(socket, bais, true); + + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = sslSocket.getSSLParameters(); + params.setSNIMatchers(matchers); + sslSocket.setSSLParameters(params); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + ExtendedSSLSession session = (ExtendedSSLSession)sslSocket.getSession(); + checkCapabilities(capabilities, session); + + sslSocket.close(); + serverSocket.close(); + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = sslSocket.getSSLParameters(); + params.setServerNames(serverNames); + sslSocket.setSSLParameters(params); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + ExtendedSSLSession session = (ExtendedSSLSession)sslSocket.getSession(); + checkSNIInSession(session); + + sslSocket.close(); + } + + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + for (SNIServerName sni : sessionSNI) { + System.out.println("SNI in session is " + sni); + } + + List capaSNI = capabilities.getServerNames(); + for (SNIServerName sni : capaSNI) { + System.out.println("SNI in session is " + sni); + } + + throw new Exception( + "server name indication does not match capabilities"); + } + + checkSNIInSession(session); + } + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (sessionSNI.isEmpty()) { + throw new Exception( + "unexpected empty request server name indication"); + } + + if (sessionSNI.size() != 1) { + throw new Exception( + "unexpected request server name indication"); + } + + SNIServerName serverName = sessionSNI.get(0); + if (!(serverName instanceof SNIHostName)) { + throw new Exception( + "unexpected instance of request server name indication"); + } + + String hostname = ((SNIHostName)serverName).getAsciiName(); + if (!clientRequestedHostname.equalsIgnoreCase(hostname)) { + throw new Exception( + "unexpected request server name indication value"); + } + } + + private static String clientRequestedHostname; + private static String serverAcceptableHostname; + + private static void parseArguments(String[] args) { + clientRequestedHostname = args[0]; + serverAcceptableHostname = args[1]; + } + + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + /* + * Start the tests. + */ + new SSLSocketExplorerMatchedSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketExplorerMatchedSNI() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerUnmatchedSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerUnmatchedSNI.java new file mode 100644 index 00000000000..eab48002d6f --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerUnmatchedSNI.java @@ -0,0 +1,392 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../../../../templates + * @build SSLCapabilities SSLExplorer + * @run main/othervm SSLSocketExplorerUnmatchedSNI www.example.com + * www\.example\.org + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketExplorerUnmatchedSNI { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = false; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + ServerSocket serverSocket = new ServerSocket(serverPort); + + // Signal Client, we're ready for his connect. + serverPort = serverSocket.getLocalPort(); + serverReady = true; + + Socket socket = serverSocket.accept(); + InputStream ins = socket.getInputStream(); + + byte[] buffer = new byte[0xFF]; + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int count = SSLExplorer.RECORD_HEADER_SIZE - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + int recordLength = SSLExplorer.getRequiredSize(buffer, 0, position); + if (buffer.length < recordLength) { + buffer = Arrays.copyOf(buffer, recordLength); + } + + while (position < recordLength) { + int count = recordLength - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + capabilities = SSLExplorer.explore(buffer, 0, recordLength);; + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + ByteArrayInputStream bais = + new ByteArrayInputStream(buffer, 0, position); + SSLSocket sslSocket = (SSLSocket)sslsf.createSocket(socket, bais, true); + + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = sslSocket.getSSLParameters(); + params.setSNIMatchers(matchers); + sslSocket.setSSLParameters(params); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + try { + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + throw new Exception( + "Mismatched server name indication was accepted"); + } catch (SSLHandshakeException sslhe) { + // the expected unrecognized server name indication exception + } catch (IOException ioe) { + // the peer may have closed the socket because of the unmatched + // server name indication. + } finally { + sslSocket.close(); + serverSocket.close(); + } + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = sslSocket.getSSLParameters(); + params.setServerNames(serverNames); + sslSocket.setSSLParameters(params); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + try { + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + throw new Exception( + "Mismatched server name indication was accepted"); + } catch (SSLHandshakeException sslhe) { + // the expected unrecognized server name indication exception + } catch (IOException ioe) { + // the peer may have closed the socket because of the unmatched + // server name indication. + } finally { + sslSocket.close(); + } + } + + private static String clientRequestedHostname; + private static String serverAcceptableHostname; + + private static void parseArguments(String[] args) { + clientRequestedHostname = args[0]; + serverAcceptableHostname = args[1]; + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + /* + * Start the tests. + */ + new SSLSocketExplorerUnmatchedSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketExplorerUnmatchedSNI() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerWithCliSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerWithCliSNI.java new file mode 100644 index 00000000000..6933c9a9894 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerWithCliSNI.java @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../../../../templates + * @build SSLCapabilities SSLExplorer + * @run main/othervm SSLSocketExplorerWithCliSNI + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketExplorerWithCliSNI { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + ServerSocket serverSocket = new ServerSocket(serverPort); + + // Signal Client, we're ready for his connect. + serverPort = serverSocket.getLocalPort(); + serverReady = true; + + Socket socket = serverSocket.accept(); + InputStream ins = socket.getInputStream(); + + byte[] buffer = new byte[0xFF]; + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int count = SSLExplorer.RECORD_HEADER_SIZE - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + int recordLength = SSLExplorer.getRequiredSize(buffer, 0, position); + if (buffer.length < recordLength) { + buffer = Arrays.copyOf(buffer, recordLength); + } + + while (position < recordLength) { + int count = recordLength - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + capabilities = SSLExplorer.explore(buffer, 0, recordLength);; + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + ByteArrayInputStream bais = + new ByteArrayInputStream(buffer, 0, position); + SSLSocket sslSocket = (SSLSocket)sslsf.createSocket(socket, bais, true); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + ExtendedSSLSession session = (ExtendedSSLSession)sslSocket.getSession(); + checkCapabilities(capabilities, session); + + sslSocket.close(); + serverSocket.close(); + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = sslSocket.getSSLParameters(); + params.setServerNames(serverNames); + sslSocket.setSSLParameters(params); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + ExtendedSSLSession session = (ExtendedSSLSession)sslSocket.getSession(); + checkSNIInSession(session); + + sslSocket.close(); + } + + private static String clientRequestedHostname = "www.example.com"; + private static String serverAcceptableHostname = + "www\\.example\\.(com|org)"; + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + for (SNIServerName sni : sessionSNI) { + System.out.println("SNI in session is " + sni); + } + + List capaSNI = capabilities.getServerNames(); + for (SNIServerName sni : capaSNI) { + System.out.println("SNI in session is " + sni); + } + + throw new Exception( + "server name indication does not match capabilities"); + } + + checkSNIInSession(session); + } + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (sessionSNI.isEmpty()) { + throw new Exception( + "unexpected empty request server name indication"); + } + + if (sessionSNI.size() != 1) { + throw new Exception( + "unexpected request server name indication"); + } + + SNIServerName serverName = sessionSNI.get(0); + if (!(serverName instanceof SNIHostName)) { + throw new Exception( + "unexpected instance of request server name indication"); + } + + String hostname = ((SNIHostName)serverName).getAsciiName(); + if (!clientRequestedHostname.equalsIgnoreCase(hostname)) { + throw new Exception( + "unexpected request server name indication value"); + } + } + + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Start the tests. + */ + new SSLSocketExplorerWithCliSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketExplorerWithCliSNI() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerWithSrvSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerWithSrvSNI.java new file mode 100644 index 00000000000..64b1ae9a63b --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketExplorerWithSrvSNI.java @@ -0,0 +1,390 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @library ../../../../templates + * @build SSLCapabilities SSLExplorer + * @run main/othervm SSLSocketExplorerWithSrvSNI + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketExplorerWithSrvSNI { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + + ServerSocket serverSocket = new ServerSocket(serverPort); + + // Signal Client, we're ready for his connect. + serverPort = serverSocket.getLocalPort(); + serverReady = true; + + Socket socket = serverSocket.accept(); + InputStream ins = socket.getInputStream(); + + byte[] buffer = new byte[0xFF]; + int position = 0; + SSLCapabilities capabilities = null; + + // Read the header of TLS record + while (position < SSLExplorer.RECORD_HEADER_SIZE) { + int count = SSLExplorer.RECORD_HEADER_SIZE - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + int recordLength = SSLExplorer.getRequiredSize(buffer, 0, position); + if (buffer.length < recordLength) { + buffer = Arrays.copyOf(buffer, recordLength); + } + + while (position < recordLength) { + int count = recordLength - position; + int n = ins.read(buffer, position, count); + if (n < 0) { + throw new Exception("unexpected end of stream!"); + } + position += n; + } + + capabilities = SSLExplorer.explore(buffer, 0, recordLength);; + if (capabilities != null) { + System.out.println("Record version: " + + capabilities.getRecordVersion()); + System.out.println("Hello version: " + + capabilities.getHelloVersion()); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + ByteArrayInputStream bais = + new ByteArrayInputStream(buffer, 0, position); + SSLSocket sslSocket = (SSLSocket)sslsf.createSocket(socket, bais, true); + + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = sslSocket.getSSLParameters(); + params.setSNIMatchers(matchers); + sslSocket.setSSLParameters(params); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + ExtendedSSLSession session = (ExtendedSSLSession)sslSocket.getSession(); + checkCapabilities(capabilities, session); + + sslSocket.close(); + serverSocket.close(); + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + ExtendedSSLSession session = (ExtendedSSLSession)sslSocket.getSession(); + checkSNIInSession(session); + + sslSocket.close(); + } + + private static String clientRequestedHostname = "www.example.com"; + private static String serverAcceptableHostname = + "www\\.example\\.(com|org)"; + + void checkCapabilities(SSLCapabilities capabilities, + ExtendedSSLSession session) throws Exception { + + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.equals(capabilities.getServerNames())) { + for (SNIServerName sni : sessionSNI) { + System.out.println("SNI in session is " + sni); + } + + List capaSNI = capabilities.getServerNames(); + for (SNIServerName sni : capaSNI) { + System.out.println("SNI in session is " + sni); + } + + throw new Exception( + "server name indication does not match capabilities"); + } + + checkSNIInSession(session); + } + + void checkSNIInSession(ExtendedSSLSession session) throws Exception { + List sessionSNI = session.getRequestedServerNames(); + if (!sessionSNI.isEmpty()) { + throw new Exception( + "should be empty request server name indication"); + } + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Start the tests. + */ + new SSLSocketExplorerWithSrvSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketExplorerWithSrvSNI() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketInconsistentSNI.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketInconsistentSNI.java new file mode 100644 index 00000000000..6ba1dfd9c21 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketInconsistentSNI.java @@ -0,0 +1,340 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/** + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @run main/othervm SSLSocketInconsistentSNI + */ + +import java.io.*; +import java.nio.*; +import java.nio.channels.*; +import java.util.*; +import java.net.*; +import javax.net.ssl.*; + +public class SSLSocketInconsistentSNI { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = true; + + /* + * Where do we find the keystores? + */ + static String pathToStores = "../../../../etc"; + static String keyStoreFile = "keystore"; + static String trustStoreFile = "truststore"; + static String passwd = "passphrase"; + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * If the client or server is doing some kind of object creation + * that the other side depends on, and that thread prematurely + * exits, you may experience a hang. The test harness will + * terminate all hung threads after its timeout has expired, + * currently 3 minutes by default, but you might try to be + * smart about it.... + */ + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + SSLServerSocketFactory sslssf = + (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); + SSLServerSocket sslServerSocket = + (SSLServerSocket) sslssf.createServerSocket(serverPort); + + SNIMatcher matcher = SNIHostName.createSNIMatcher( + serverAcceptableHostname); + Collection matchers = new ArrayList<>(1); + matchers.add(matcher); + SSLParameters params = sslServerSocket.getSSLParameters(); + params.setSNIMatchers(matchers); + sslServerSocket.setSSLParameters(params); + + serverPort = sslServerSocket.getLocalPort(); + + /* + * Signal Client, we're ready for his connect. + */ + serverReady = true; + + SSLSocket sslSocket = (SSLSocket) sslServerSocket.accept(); + try { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write(85); + sslOS.flush(); + + throw new Exception( + "Mismatched server name indication was accepted"); + } catch (SSLHandshakeException sslhe) { + // the expected unrecognized server name indication exception + } catch (IOException ioe) { + // the peer may have closed the socket because of the unmatched + // server name indication. + } finally { + sslSocket.close(); + sslServerSocket.close(); + } + } + + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLSocketFactory sslsf = + (SSLSocketFactory) SSLSocketFactory.getDefault(); + SSLSocket sslSocket = (SSLSocket) + sslsf.createSocket("localhost", serverPort); + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = sslSocket.getSSLParameters(); + params.setServerNames(serverNames); + sslSocket.setSSLParameters(params); + + try { + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write(280); + sslOS.flush(); + sslIS.read(); + + throw new Exception( + "Mismatched server name indication was accepted"); + } catch (SSLHandshakeException sslhe) { + // the expected unrecognized server name indication exception + } catch (IOException ioe) { + // the peer may have closed the socket because of the unmatched + // server name indication. + } finally { + sslSocket.close(); + } + } + + private static String clientRequestedHostname = "www.example.com"; + private static String serverAcceptableHostname = "www\\.example\\.org"; + + /* + * ============================================================= + * The remainder is just support stuff + */ + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + String keyFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + keyStoreFile; + String trustFilename = + System.getProperty("test.src", ".") + "/" + pathToStores + + "/" + trustStoreFile; + + System.setProperty("javax.net.ssl.keyStore", keyFilename); + System.setProperty("javax.net.ssl.keyStorePassword", passwd); + System.setProperty("javax.net.ssl.trustStore", trustFilename); + System.setProperty("javax.net.ssl.trustStorePassword", passwd); + + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Start the tests. + */ + new SSLSocketInconsistentSNI(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketInconsistentSNI() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died..."); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died..."); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketSNISensitive.java b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketSNISensitive.java new file mode 100644 index 00000000000..03a841bfd85 --- /dev/null +++ b/jdk/test/sun/security/ssl/javax/net/ssl/ServerName/SSLSocketSNISensitive.java @@ -0,0 +1,570 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. 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. + */ + +// +// SunJSSE does not support dynamic system properties, no way to re-use +// system properties in samevm/agentvm mode. +// + +/* + * @test + * @bug 7068321 + * @summary Support TLS Server Name Indication (SNI) Extension in JSSE Server + * @run main/othervm SSLSocketSNISensitive PKIX www.example.com + * @run main/othervm SSLSocketSNISensitive SunX509 www.example.com + * @run main/othervm SSLSocketSNISensitive PKIX www.example.net + * @run main/othervm SSLSocketSNISensitive SunX509 www.example.net + * @run main/othervm SSLSocketSNISensitive PKIX www.invalid.com + * @run main/othervm SSLSocketSNISensitive SunX509 www.invalid.com + */ + +import java.net.*; +import java.util.*; +import java.io.*; +import javax.net.ssl.*; +import java.security.KeyStore; +import java.security.KeyFactory; +import java.security.cert.Certificate; +import java.security.cert.X509Certificate; +import java.security.cert.CertificateFactory; +import java.security.spec.*; +import java.security.interfaces.*; +import sun.misc.BASE64Decoder; + + +public class SSLSocketSNISensitive { + + /* + * ============================================================= + * Set the various variables needed for the tests, then + * specify what tests to run on each side. + */ + + /* + * Should we run the client or server in a separate thread? + * Both sides can throw exceptions, but do you have a preference + * as to which side should be the main thread. + */ + static boolean separateServerThread = false; + + /* + * Where do we find the keystores? + */ + // Certificates and key used in the test. + static String trustedCertStr = + "-----BEGIN CERTIFICATE-----\n" + + "MIICkjCCAfugAwIBAgIBADANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA3WhcNMzMwMzI4MTIwNjA3WjA7MQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwgZ8wDQYJ\n" + + "KoZIhvcNAQEBBQADgY0AMIGJAoGBANY+7Enp+1S566kLcKk+qe4Ki6BxaHGZ+v7r\n" + + "vLksx9IQZCbAEf4YLbrZhKzKD3SPIJXyxPFwknAknIh3Knk8mViOZks7T8L3GnJr\n" + + "TBaVvDyTzDJum/QYiahfO2qpfN/Oya2UILmqsBAeLyWpzbQsAyWBXfoUtkOUgnzK\n" + + "fk6QAKYrAgMBAAGjgaUwgaIwHQYDVR0OBBYEFEtmQi7jT1ijXOafPsfkrLwSVu9e\n" + + "MGMGA1UdIwRcMFqAFEtmQi7jT1ijXOafPsfkrLwSVu9eoT+kPTA7MQswCQYDVQQG\n" + + "EwJVUzENMAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2\n" + + "Y2WCAQAwDwYDVR0TAQH/BAUwAwEB/zALBgNVHQ8EBAMCAQYwDQYJKoZIhvcNAQEE\n" + + "BQADgYEAkKWxMc4+ODk5WwLXXweB8/IKfVfrizNn0KLEgsZ6xNXFIXDpiPGAFcgl\n" + + "MzFO424JgyvUulsUc/X16Cnuwwntkk6KUG7vEV7h4o9sAV7Cax3gfQE/EZFb4ybn\n" + + "aBm1UsujMKd/ovqbbbxJbmOWzCeo0QfIGleDEyh3NBBZ0i11Kiw=\n" + + "-----END CERTIFICATE-----"; + + // web server certificate, www.example.com + static String targetCertStr_A = + "-----BEGIN CERTIFICATE-----\n" + + "MIICVTCCAb6gAwIBAgIBAjANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA4WhcNMzIwMTAzMTIwNjA4WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + + "BAMTD3d3dy5leGFtcGxlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + + "4zFp3PZNzsd3ZwG6FNNWO9eSN+UBymlf8oCwpKJM2tIinmMWvWIXnlx/2UXIfSAq\n" + + "QEG3aXkAFyEiGGpQlBbqcfrESsHsiz2pnnm5dG2v/eS0Bwz1jmcuNmwnh3UQw2Vl\n" + + "+BLk8ukdrLjiCT8jARiHExYf1Xg+wUqQ9y8NV26hdaUCAwEAAaNPME0wCwYDVR0P\n" + + "BAQDAgPoMB0GA1UdDgQWBBQwtx+gqzn2w4y82brXlp7tqBYEZDAfBgNVHSMEGDAW\n" + + "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQAJWo8B6Ud+\n" + + "/OU+UcZLihlfMX02OSlK2ZB7mfqpj2G3JT9yb0A+VbY3uuajmaYYIIxl3kXGz/n8\n" + + "M2Q/Ux/MDxG+IFKHC26Kuj4dAQgzjq2pILVPTE2QnaQTNCsgVZtTaC47SG9FRSoC\n" + + "qvnIvn/oTpKSqus76I1cR4joDtiV2OEuVw==\n" + + "-----END CERTIFICATE-----"; + + // Private key in the format of PKCS#8 + static String targetPrivateKey_A = + "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAOMxadz2Tc7Hd2cB\n" + + "uhTTVjvXkjflAcppX/KAsKSiTNrSIp5jFr1iF55cf9lFyH0gKkBBt2l5ABchIhhq\n" + + "UJQW6nH6xErB7Is9qZ55uXRtr/3ktAcM9Y5nLjZsJ4d1EMNlZfgS5PLpHay44gk/\n" + + "IwEYhxMWH9V4PsFKkPcvDVduoXWlAgMBAAECgYAqX2nuIyXp3fvgA0twXOYlbRRB\n" + + "Rn3qAXM6qFPJsNeCrFR2k+aG1cev6nKR1FkLNTeMGnWZv06MAcr5IML8i7WXyG4C\n" + + "LY/C0gedn94FDKFlln+bTENwQTGjn4lKysDA+IuNpasTeMCajbic+dPByhIdTOjZ\n" + + "iMCyxbLfpk40zQopVQJBAPyfGmkeHB3GjdbdgujWCGKb2UxBa4O8dy3O4l2yizTn\n" + + "uUqMGcwGY4ciNSVvZQ7jKo4vDmkSuYib4/woPChaNfMCQQDmO0BQuSWYGNtSwV35\n" + + "lafZfX1dNCLKm1iNA6A12evXgvQiE9WT4mqionig0VZW16HtiY4/BkHOcos/K9Um\n" + + "ARQHAkA8mkaRtSF1my5nv1gqVz5Hua+VdZQ/VDUbDiiL5cszc+ulkJqXsWirAG/T\n" + + "fTe3LJQG7A7+8fkEZrF4yoY0AAA1AkEAotokezULj5N9iAL5SzL9wIzQYV4ggfny\n" + + "YATBjXXxKccakwQ+ndWZIiMUeoS4ssLialhTgucVI0fIkU2a/r/ifwJAc6e+5Pvh\n" + + "MghQj/U788Od/v6rgqz/NGsduZ7uilCMcWiwA73OR2MHMH/OIuoofuEPrfuV9isV\n" + + "xVXhgpKfP/pdOA=="; + + // web server certificate, www.example.net + static String targetCertStr_B = + "-----BEGIN CERTIFICATE-----\n" + + "MIICVTCCAb6gAwIBAgIBBDANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA5WhcNMzIwMTAzMTIwNjA5WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + + "BAMTD3d3dy5leGFtcGxlLm5ldDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + + "2VlzF1fvWYczDChrUeJiLJ1M/dIShCaOTfYGiXfQGEZCAWTacUclwr+rVMnZ75/c\n" + + "wwg5pNdXRijxMil8DBTS1gFcIFQhosLHvzIAe6ULlg/xB+/L6KBz+NTWfo/2KF6t\n" + + "xatmcToNrCcwi7eUOfbzQje65Tizs56jJYem2m7Rk0ECAwEAAaNPME0wCwYDVR0P\n" + + "BAQDAgPoMB0GA1UdDgQWBBQT/FR0cAWcZQ7h0X79KGki34OSQjAfBgNVHSMEGDAW\n" + + "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQB67cPIT6fz\n" + + "6Ws8fBpYgW2ad4ci66i1WduBD9CpGFE+jRK2feRj6hvYBXocKj0AMWUFIEB2E3hA\n" + + "oIjxcf1GxIpHVl9DjlhxqXbA0Ktl7/NGNRlDSLTizOTl3FB1mMTlOGvXDVmpcFhl\n" + + "HuoP1hYvhTsBwPx5igGNchuPtDIUzL2mXw==\n" + + "-----END CERTIFICATE-----"; + + static String targetPrivateKey_B = + "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANlZcxdX71mHMwwo\n" + + "a1HiYiydTP3SEoQmjk32Bol30BhGQgFk2nFHJcK/q1TJ2e+f3MMIOaTXV0Yo8TIp\n" + + "fAwU0tYBXCBUIaLCx78yAHulC5YP8Qfvy+igc/jU1n6P9ihercWrZnE6DawnMIu3\n" + + "lDn280I3uuU4s7OeoyWHptpu0ZNBAgMBAAECgYEAl19H26sfhD+32rDPxZCgBShs\n" + + "dZ33zVe45i0Bcn4iTLWpxKTDyf7eGps4rO2DvfKdYqt40ggzvSZIjUH9JcDe8GmG\n" + + "d3m0ILB7pg4jsFlpyeHpTO8grPLxA1G9s3o0DoFpz/rooqgFfe/DrRDmRoOSkgfV\n" + + "/gseIbgJHRO/Ctyvdh0CQQD6uFd0HxhH1jl/JzvPzIH4LSnPcdEh9zsMEb6uzh75\n" + + "9qL+IHD5N2I/pYZTKqDFIwhJf701+LKag55AX/zrDt7rAkEA3e00AbnwanDMa6Wj\n" + + "+gFekUQveSVra38LiihzCkyVvQpFjbiF1rUhSNQ0dpU5/hmrYF0C6H9VXAesfkUY\n" + + "WhpDgwJAYjgZOop77piDycZK7isFt32p5XSHIzFBVocVFlH1XKM8UyXOXDNQL/Le\n" + + "XnJSrSf+NRzvuNcG0PVC56Ey6brXpQJAY4M4vcltt5zq3R5CQBmbGRJ1IyKXX3Vx\n" + + "bDslEqoyvri7ZYgnY5aG3UxiVgYmIf3KrgQnCLAIS6MZQumiuMxsFwJAK5pEG063\n" + + "9ngUof4fDMvZphqZjZR1zMKz/V/9ge0DWBINaqFgsgebNu+MyImsC8C6WKjGmV/2\n" + + "f1MY0D7sC2vU/Q=="; + + // web server certificate, www.invalid.com + static String targetCertStr_C = + "-----BEGIN CERTIFICATE-----\n" + + "MIICVTCCAb6gAwIBAgIBAzANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjA5WhcNMzIwMTAzMTIwNjA5WjBVMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxGDAWBgNV\n" + + "BAMTD3d3dy5pbnZhbGlkLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA\n" + + "q6MyQwzCr2nJ41l0frmHL0qULSyW51MhevBC+1W28i0LE/efrmpwV3LdnlQEGFak\n" + + "DLDwtnff3iru8dSMcA7KdWVkivsE7ZTP+qFDaWBAy7XXiSsv6yZ2Nh4jJb0YcD28\n" + + "45zk2nAl5Az1/PuoTi1vpQxzFZKuBm1HGgz3MEZvBvMCAwEAAaNPME0wCwYDVR0P\n" + + "BAQDAgPoMB0GA1UdDgQWBBRRMifrND015Nm8N6gV5X7cg1YjjjAfBgNVHSMEGDAW\n" + + "gBRLZkIu409Yo1zmnz7H5Ky8ElbvXjANBgkqhkiG9w0BAQQFAAOBgQBjkUO6Ri/B\n" + + "uDC2gDMIyL5+NTe/1dPPQYM4HhCNa/KQYvU5lzCKO9Vpa+i+nyrUNNXUu8Tkyq4Y\n" + + "A+aGSm6+FT/i9rFwkYUdorBtD3KfQiwTIWrVERXBkWI5iZNaVZhx0TFy4vUpf65d\n" + + "QtwkbHpC66fdKc2EdLXkuY9KkmtZZJJ7YA==\n" + + "-----END CERTIFICATE-----"; + + static String targetPrivateKey_C = + "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKujMkMMwq9pyeNZ\n" + + "dH65hy9KlC0sludTIXrwQvtVtvItCxP3n65qcFdy3Z5UBBhWpAyw8LZ3394q7vHU\n" + + "jHAOynVlZIr7BO2Uz/qhQ2lgQMu114krL+smdjYeIyW9GHA9vOOc5NpwJeQM9fz7\n" + + "qE4tb6UMcxWSrgZtRxoM9zBGbwbzAgMBAAECgYASJDK40Y12Wvki1Z6xkkyOnBRj\n" + + "XfYpRykfxGtgA2RN3qLwHlk7Zzaul46DIKA6LlYynTUkJDF+Ww1cdDnP0lBlwcmM\n" + + "iD0ck3zYyYBLhQHuVbkK3SYE+ANRhM0icvvqANP2at/U4awQcPNEae/KCiecLNu3\n" + + "CJGqyhPDdrEAqPuJGQJBAN46pQC6l3yrcSYE2s53jSmsm2HVVOFlFXjU6k/RMTxG\n" + + "FfDJtGUAOQ37rPQ06ugr/gjLAmmPp+FXozaBdA32D80CQQDFuGRgv3WYqbglIcRL\n" + + "JRs6xlj9w1F97s/aiUenuwhIPNiUoRbV7mnNuZ/sGF0svOVE7SazRjuFX6UqL9Y9\n" + + "HzG/AkEA170pCI8cl4w8eUNHRB9trGKEKjMXhwVCFh7lJf2ZBcGodSzr8w2HVhrZ\n" + + "Ke7hiemDYffrbJ1oxmv05+o+x3r0lQJBAL6adVm2+FyFMFnLZXmzeb59O4jWY5bt\n" + + "Qz6/HG6bpO5OidMuP99YCHMkQQDOs/PO3Y5GuAoW6IY4n/Y9S2B80+0CQBl1/H9/\n" + + "0n/vrb6vW6Azds49tuS82RFAnOhtwTyBEajs08WF8rZQ3WD2RHJnH0+jjfL0anIp\n" + + "dQBSeNN7s7b6rRk="; + + // This is a certificate for client + static String targetCertStr_D= + "-----BEGIN CERTIFICATE-----\n" + + "MIICVDCCAb2gAwIBAgIBBTANBgkqhkiG9w0BAQQFADA7MQswCQYDVQQGEwJVUzEN\n" + + "MAsGA1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UwHhcN\n" + + "MTIwNDE3MTIwNjEwWhcNMzIwMTAzMTIwNjEwWjBUMQswCQYDVQQGEwJVUzENMAsG\n" + + "A1UEChMESmF2YTEdMBsGA1UECxMUU3VuSlNTRSBUZXN0IFNlcml2Y2UxFzAVBgNV\n" + + "BAMTDkludGVyT3AgVGVzdGVyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo\n" + + "Q/KoAIAC2ljFfW2KwjnxTzi4NQJeUuk2seqKpsAY8x4O5dvixzUl6142zmljapqi\n" + + "bJloQVpfB+CEc5/l4h5gzGRVzkuqP1oPzDrpZ5GsvmvuHenV/TzCIgX1cLETzQVt\n" + + "6Rk06okoBPnw3hDJEJiEc1Rv7HCE8p/p+SaiHrskwwIDAQABo08wTTALBgNVHQ8E\n" + + "BAMCA+gwHQYDVR0OBBYEFPr91O33RIGfFSqza2AwQIgE4QswMB8GA1UdIwQYMBaA\n" + + "FEtmQi7jT1ijXOafPsfkrLwSVu9eMA0GCSqGSIb3DQEBBAUAA4GBANIDFYgAhoj3\n" + + "B8u1YpqeoEp2Lt9TwrYBshaIrbmBPCwCGio0JIsoov3n8BCSg5F+8MnOtPl+TjeO\n" + + "0Ug+7guPdCk/wg8YNxLHgSsQlpcNJDjWiErqmUPVrg5BPPQb65qMund6KTmMN0y6\n" + + "4EbSmxRpZO/N0/5oK4umTk0EeXKNekBj\n" + + "-----END CERTIFICATE-----"; + + static String targetPrivateKey_D = + "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAOhD8qgAgALaWMV9\n" + + "bYrCOfFPOLg1Al5S6Tax6oqmwBjzHg7l2+LHNSXrXjbOaWNqmqJsmWhBWl8H4IRz\n" + + "n+XiHmDMZFXOS6o/Wg/MOulnkay+a+4d6dX9PMIiBfVwsRPNBW3pGTTqiSgE+fDe\n" + + "EMkQmIRzVG/scITyn+n5JqIeuyTDAgMBAAECgYBw37yIKp4LRONJLnhSq6sO+0n8\n" + + "Mz6waiiN/Q6XTQwj09pysQAYCGlqwSRrDAqpVsBJWO+Ae+oYLrLMi4hUZnwN75v3\n" + + "pe1nXlrD11RmPLXwBxqFxNSvAs2FgLHZEtwHI7Bn8KybT/8bGkQ8csLceInYtMDD\n" + + "MuTyy2KRk/pj60zIKQJBAPgebQiAH6viFQ88AwHaNvQhlUfwmSC1i6f8LVoeqaHC\n" + + "lnP0LJBwlyDeeEInhHrCR2ibnCB6I/Pig+49XQgabK8CQQDvpJwuGEbsOO+3rkJJ\n" + + "OpOw4toG0QJZdRnT6l8I6BlboQRZSfFh+lGGahvFXkxc4KdUpJ7QPtXU7HHk6Huk\n" + + "8RYtAkA9CW8VGj+wTuuTVdX/jKjcIa7RhbSFwWNbrcOSWdys+Gt+luCnn6rt4QyA\n" + + "aaxDbquWZkFgE+voQR7nap0KM0XtAkAznd0WAJymHM1lXt9gLoHJQ9N6TGKZKiPa\n" + + "BU1a+cMcfV4WbVrUo7oTnZ9Fr73681iXXq3mZOJh7lvJ1llreZIxAkBEnbiTgEf4\n" + + "tvku68jHcRbRPmdS7CBSWNEBaHLOm4pUSTcxVTKKMHw7vmM5/UYUxJ8QNKCYxn6O\n" + + "+vtiBwBawwzN"; + + static String[] serverCerts = {targetCertStr_A, + targetCertStr_B, targetCertStr_C}; + static String[] serverKeys = {targetPrivateKey_A, + targetPrivateKey_B, targetPrivateKey_C}; + static String[] clientCerts = {targetCertStr_D}; + static String[] clientKeys = {targetPrivateKey_D}; + + static char passphrase[] = "passphrase".toCharArray(); + + /* + * Is the server ready to serve? + */ + volatile static boolean serverReady = false; + + /* + * Turn on SSL debugging? + */ + static boolean debug = false; + + /* + * Define the server side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doServerSide() throws Exception { + SSLContext context = generateSSLContext(false); + SSLServerSocketFactory sslssf = context.getServerSocketFactory(); + SSLServerSocket sslServerSocket = + (SSLServerSocket)sslssf.createServerSocket(serverPort); + serverPort = sslServerSocket.getLocalPort(); + + /* + * Signal Client, we're ready for his connect. + */ + serverReady = true; + + SSLSocket sslSocket = (SSLSocket)sslServerSocket.accept(); + try { + sslSocket.setSoTimeout(5000); + sslSocket.setSoLinger(true, 5); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslIS.read(); + sslOS.write('A'); + sslOS.flush(); + + SSLSession session = sslSocket.getSession(); + checkCertificate(session.getLocalCertificates(), + clientRequestedHostname); + } finally { + sslSocket.close(); + sslServerSocket.close(); + } + } + + /* + * Define the client side of the test. + * + * If the server prematurely exits, serverReady will be set to true + * to avoid infinite hangs. + */ + void doClientSide() throws Exception { + + /* + * Wait for server to get started. + */ + while (!serverReady) { + Thread.sleep(50); + } + + SSLContext context = generateSSLContext(true); + SSLSocketFactory sslsf = context.getSocketFactory(); + + SSLSocket sslSocket = + (SSLSocket)sslsf.createSocket("localhost", serverPort); + + SNIHostName serverName = new SNIHostName(clientRequestedHostname); + List serverNames = new ArrayList<>(1); + serverNames.add(serverName); + SSLParameters params = sslSocket.getSSLParameters(); + params.setServerNames(serverNames); + sslSocket.setSSLParameters(params); + + try { + sslSocket.setSoTimeout(5000); + sslSocket.setSoLinger(true, 5); + + InputStream sslIS = sslSocket.getInputStream(); + OutputStream sslOS = sslSocket.getOutputStream(); + + sslOS.write('B'); + sslOS.flush(); + sslIS.read(); + + SSLSession session = sslSocket.getSession(); + checkCertificate(session.getPeerCertificates(), + clientRequestedHostname); + } finally { + sslSocket.close(); + } + } + + private static void checkCertificate(Certificate[] certs, + String hostname) throws Exception { + if (certs != null && certs.length != 0) { + X509Certificate x509Cert = (X509Certificate)certs[0]; + + String subject = x509Cert.getSubjectX500Principal().getName(); + + if (!subject.contains(hostname)) { + throw new Exception( + "Not the expected certificate: " + subject); + } + } + } + + /* + * ============================================================= + * The remainder is just support stuff + */ + private static String tmAlgorithm; // trust manager + private static String clientRequestedHostname; // server name indication + + private static void parseArguments(String[] args) { + tmAlgorithm = args[0]; + clientRequestedHostname = args[1]; + } + + private static SSLContext generateSSLContext(boolean isClient) + throws Exception { + + // generate certificate from cert string + CertificateFactory cf = CertificateFactory.getInstance("X.509"); + + // create a key store + KeyStore ks = KeyStore.getInstance("JKS"); + ks.load(null, null); + + // import the trused cert + ByteArrayInputStream is = + new ByteArrayInputStream(trustedCertStr.getBytes()); + Certificate trusedCert = cf.generateCertificate(is); + is.close(); + + ks.setCertificateEntry("RSA Export Signer", trusedCert); + + String[] certStrs = null; + String[] keyStrs = null; + if (isClient) { + certStrs = clientCerts; + keyStrs = clientKeys; + } else { + certStrs = serverCerts; + keyStrs = serverKeys; + } + + for (int i = 0; i < certStrs.length; i++) { + // generate the private key. + String keySpecStr = keyStrs[i]; + PKCS8EncodedKeySpec priKeySpec = new PKCS8EncodedKeySpec( + new BASE64Decoder().decodeBuffer(keySpecStr)); + KeyFactory kf = KeyFactory.getInstance("RSA"); + RSAPrivateKey priKey = + (RSAPrivateKey)kf.generatePrivate(priKeySpec); + + // generate certificate chain + String keyCertStr = certStrs[i]; + is = new ByteArrayInputStream(keyCertStr.getBytes()); + Certificate keyCert = cf.generateCertificate(is); + is.close(); + + Certificate[] chain = new Certificate[2]; + chain[0] = keyCert; + chain[1] = trusedCert; + + // import the key entry. + ks.setKeyEntry("key-entry-" + i, priKey, passphrase, chain); + } + + // create SSL context + TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmAlgorithm); + tmf.init(ks); + + SSLContext ctx = SSLContext.getInstance("TLS"); + KeyManagerFactory kmf = KeyManagerFactory.getInstance("NewSunX509"); + kmf.init(ks, passphrase); + + ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); + ks = null; + + return ctx; + } + + // use any free port by default + volatile int serverPort = 0; + + volatile Exception serverException = null; + volatile Exception clientException = null; + + public static void main(String[] args) throws Exception { + if (debug) + System.setProperty("javax.net.debug", "all"); + + /* + * Get the customized arguments. + */ + parseArguments(args); + + /* + * Start the tests. + */ + new SSLSocketSNISensitive(); + } + + Thread clientThread = null; + Thread serverThread = null; + + /* + * Primary constructor, used to drive remainder of the test. + * + * Fork off the other side, then do your work. + */ + SSLSocketSNISensitive() throws Exception { + try { + if (separateServerThread) { + startServer(true); + startClient(false); + } else { + startClient(true); + startServer(false); + } + } catch (Exception e) { + // swallow for now. Show later + } + + /* + * Wait for other side to close down. + */ + if (separateServerThread) { + serverThread.join(); + } else { + clientThread.join(); + } + + /* + * When we get here, the test is pretty much over. + * Which side threw the error? + */ + Exception local; + Exception remote; + String whichRemote; + + if (separateServerThread) { + remote = serverException; + local = clientException; + whichRemote = "server"; + } else { + remote = clientException; + local = serverException; + whichRemote = "client"; + } + + /* + * If both failed, return the curthread's exception, but also + * print the remote side Exception + */ + if ((local != null) && (remote != null)) { + System.out.println(whichRemote + " also threw:"); + remote.printStackTrace(); + System.out.println(); + throw local; + } + + if (remote != null) { + throw remote; + } + + if (local != null) { + throw local; + } + } + + void startServer(boolean newThread) throws Exception { + if (newThread) { + serverThread = new Thread() { + public void run() { + try { + doServerSide(); + } catch (Exception e) { + /* + * Our server thread just died. + * + * Release the client, if not active already... + */ + System.err.println("Server died, because of " + e); + serverReady = true; + serverException = e; + } + } + }; + serverThread.start(); + } else { + try { + doServerSide(); + } catch (Exception e) { + serverException = e; + } finally { + serverReady = true; + } + } + } + + void startClient(boolean newThread) throws Exception { + if (newThread) { + clientThread = new Thread() { + public void run() { + try { + doClientSide(); + } catch (Exception e) { + /* + * Our client thread just died. + */ + System.err.println("Client died, because of " + e); + clientException = e; + } + } + }; + clientThread.start(); + } else { + try { + doClientSide(); + } catch (Exception e) { + clientException = e; + } + } + } +} diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/EmptyCertificateAuthorities.java b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/EmptyCertificateAuthorities.java index 01134a096a5..07503cb7c03 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/EmptyCertificateAuthorities.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/EmptyCertificateAuthorities.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableBlockCipher.java b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableBlockCipher.java index c58a6e76e98..ad27a1e468f 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableBlockCipher.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableBlockCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableStreamCipher.java b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableStreamCipher.java index c8b19bdf370..3d15a7cf154 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableStreamCipher.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/ExportableStreamCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericBlockCipher.java b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericBlockCipher.java index 32e1fdbddd1..9a0a83e26e4 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericBlockCipher.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericBlockCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java index 7ec0c49fa44..c96d8ec9cc8 100644 --- a/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java +++ b/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sanity/pluggability/CheckSSLContextExport.java b/jdk/test/sun/security/ssl/sanity/pluggability/CheckSSLContextExport.java index 3527c062e41..b9c949eaa7d 100644 --- a/jdk/test/sun/security/ssl/sanity/pluggability/CheckSSLContextExport.java +++ b/jdk/test/sun/security/ssl/sanity/pluggability/CheckSSLContextExport.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/http/ChunkedOutputStream/Test.java b/jdk/test/sun/security/ssl/sun/net/www/http/ChunkedOutputStream/Test.java index 686411bf155..67fe5c229f7 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/http/ChunkedOutputStream/Test.java +++ b/jdk/test/sun/security/ssl/sun/net/www/http/ChunkedOutputStream/Test.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/httpstest/HttpTransaction.java b/jdk/test/sun/security/ssl/sun/net/www/httpstest/HttpTransaction.java index 5389d9f3fa3..ea90c267301 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/httpstest/HttpTransaction.java +++ b/jdk/test/sun/security/ssl/sun/net/www/httpstest/HttpTransaction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/httpstest/TestHttpsServer.java b/jdk/test/sun/security/ssl/sun/net/www/httpstest/TestHttpsServer.java index 21fc8ab29c2..178ec9c7255 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/httpstest/TestHttpsServer.java +++ b/jdk/test/sun/security/ssl/sun/net/www/httpstest/TestHttpsServer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java index 68647c5719a..4e740fa4d84 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/DNSIdentities.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsCreateSockTest.java b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsCreateSockTest.java index 051e1bef83b..08d969d0579 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsCreateSockTest.java +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsCreateSockTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsSocketFacTest.java b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsSocketFacTest.java index a32e77523fc..043f612cf3c 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsSocketFacTest.java +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/HttpsSocketFacTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh index 69bdc6cfb50..7696cbbd6b3 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxy.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh index c7c9882c2ff..9e2ed3c4bf0 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/HttpsURLConnection/PostThruProxyWithAuth.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java index f0d7baca05d..ed4cf6836e0 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/ComHostnameVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java index ac9b80437b7..3337871fbdf 100644 --- a/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java +++ b/jdk/test/sun/security/ssl/sun/net/www/protocol/https/NewImpl/JavaxHostnameVerifier.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/templates/SSLCapabilities.java b/jdk/test/sun/security/ssl/templates/SSLCapabilities.java new file mode 100644 index 00000000000..22ea3600054 --- /dev/null +++ b/jdk/test/sun/security/ssl/templates/SSLCapabilities.java @@ -0,0 +1,70 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.util.List; +import javax.net.ssl.SNIServerName; + +/** + * Encapsulates the security capabilities of an SSL/TLS connection. + *

+ * The security capabilities are the list of ciphersuites to be accepted in + * an SSL/TLS handshake, the record version, the hello version, and server + * name indication, etc., of an SSL/TLS connection. + *

+ * SSLCapabilities can be retrieved by exploring the network + * data of an SSL/TLS connection via {@link SSLExplorer#explore(ByteBuffer)} + * or {@link SSLExplorer#explore(byte[], int, int)}. + * + * @see SSLExplorer + */ +public abstract class SSLCapabilities { + + /** + * Returns the record version of an SSL/TLS connection + * + * @return a non-null record version + */ + public abstract String getRecordVersion(); + + /** + * Returns the hello version of an SSL/TLS connection + * + * @return a non-null hello version + */ + public abstract String getHelloVersion(); + + /** + * Returns a List containing all {@link SNIServerName}s + * of the server name indication. + * + * @return a non-null immutable list of {@link SNIServerName}s + * of the server name indication parameter, may be empty + * if no server name indication. + * + * @see SNIServerName + */ + public abstract List getServerNames(); +} + diff --git a/jdk/test/sun/security/ssl/templates/SSLEngineTemplate.java b/jdk/test/sun/security/ssl/templates/SSLEngineTemplate.java index e5056c9d472..22fff98357b 100644 --- a/jdk/test/sun/security/ssl/templates/SSLEngineTemplate.java +++ b/jdk/test/sun/security/ssl/templates/SSLEngineTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/ssl/templates/SSLExplorer.java b/jdk/test/sun/security/ssl/templates/SSLExplorer.java new file mode 100644 index 00000000000..9b912c850dd --- /dev/null +++ b/jdk/test/sun/security/ssl/templates/SSLExplorer.java @@ -0,0 +1,615 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.nio.ByteBuffer; +import java.nio.BufferUnderflowException; +import java.io.IOException; +import javax.net.ssl.*; +import java.util.*; + +import sun.misc.HexDumpEncoder; + +/** + * Instances of this class acts as an explorer of the network data of an + * SSL/TLS connection. + */ +public final class SSLExplorer { + + // Private constructor prevents construction outside this class. + private SSLExplorer() { + } + + /** + * The header size of TLS/SSL records. + *

+ * The value of this constant is {@value}. + */ + public final static int RECORD_HEADER_SIZE = 0x05; + + /** + * Returns the required number of bytes in the {@code source} + * {@link ByteBuffer} necessary to explore SSL/TLS connection. + *

+ * This method tries to parse as few bytes as possible from + * {@code source} byte buffer to get the length of an + * SSL/TLS record. + *

+ * This method accesses the {@code source} parameter in read-only + * mode, and does not update the buffer's properties such as capacity, + * limit, position, and mark values. + * + * @param source + * a {@link ByteBuffer} containing + * inbound or outbound network data for an SSL/TLS connection. + * @throws BufferUnderflowException if less than {@code RECORD_HEADER_SIZE} + * bytes remaining in {@code source} + * @return the required size in byte to explore an SSL/TLS connection + */ + public final static int getRequiredSize(ByteBuffer source) { + + ByteBuffer input = source.duplicate(); + + // Do we have a complete header? + if (input.remaining() < RECORD_HEADER_SIZE) { + throw new BufferUnderflowException(); + } + + // Is it a handshake message? + byte firstByte = input.get(); + byte secondByte = input.get(); + byte thirdByte = input.get(); + if ((firstByte & 0x80) != 0 && thirdByte == 0x01) { + // looks like a V2ClientHello + // return (((firstByte & 0x7F) << 8) | (secondByte & 0xFF)) + 2; + return RECORD_HEADER_SIZE; // Only need the header fields + } else { + return (((input.get() & 0xFF) << 8) | (input.get() & 0xFF)) + 5; + } + } + + /** + * Returns the required number of bytes in the {@code source} byte array + * necessary to explore SSL/TLS connection. + *

+ * This method tries to parse as few bytes as possible from + * {@code source} byte array to get the length of an + * SSL/TLS record. + * + * @param source + * a byte array containing inbound or outbound network data for + * an SSL/TLS connection. + * @param offset + * the start offset in array {@code source} at which the + * network data is read from. + * @param length + * the maximum number of bytes to read. + * + * @throws BufferUnderflowException if less than {@code RECORD_HEADER_SIZE} + * bytes remaining in {@code source} + * @return the required size in byte to explore an SSL/TLS connection + */ + public final static int getRequiredSize(byte[] source, + int offset, int length) throws IOException { + + ByteBuffer byteBuffer = + ByteBuffer.wrap(source, offset, length).asReadOnlyBuffer(); + return getRequiredSize(byteBuffer); + } + + /** + * Launch and explore the security capabilities from byte buffer. + *

+ * This method tries to parse as few records as possible from + * {@code source} byte buffer to get the {@link SSLCapabilities} + * of an SSL/TLS connection. + *

+ * Please NOTE that this method must be called before any handshaking + * occurs. The behavior of this method is not defined in this release + * if the handshake has begun, or has completed. + *

+ * This method accesses the {@code source} parameter in read-only + * mode, and does not update the buffer's properties such as capacity, + * limit, position, and mark values. + * + * @param source + * a {@link ByteBuffer} containing + * inbound or outbound network data for an SSL/TLS connection. + * + * @throws IOException on network data error + * @throws BufferUnderflowException if not enough source bytes available + * to make a complete exploration. + * + * @return the explored {@link SSLCapabilities} of the SSL/TLS + * connection + */ + public final static SSLCapabilities explore(ByteBuffer source) + throws IOException { + + ByteBuffer input = source.duplicate(); + + // Do we have a complete header? + if (input.remaining() < RECORD_HEADER_SIZE) { + throw new BufferUnderflowException(); + } + + // Is it a handshake message? + byte firstByte = input.get(); + byte secondByte = input.get(); + byte thirdByte = input.get(); + if ((firstByte & 0x80) != 0 && thirdByte == 0x01) { + // looks like a V2ClientHello + return exploreV2HelloRecord(input, + firstByte, secondByte, thirdByte); + } else if (firstByte == 22) { // 22: handshake record + return exploreTLSRecord(input, + firstByte, secondByte, thirdByte); + } else { + throw new SSLException("Not handshake record"); + } + } + + /** + * Launch and explore the security capabilities from byte array. + *

+ * Please NOTE that this method must be called before any handshaking + * occurs. The behavior of this method is not defined in this release + * if the handshake has begun, or has completed. Once handshake has + * begun, or has completed, the security capabilities can not and + * should not be launched with this method. + * + * @param source + * a byte array containing inbound or outbound network data for + * an SSL/TLS connection. + * @param offset + * the start offset in array {@code source} at which the + * network data is read from. + * @param length + * the maximum number of bytes to read. + * + * @throws IOException on network data error + * @throws BufferUnderflowException if not enough source bytes available + * to make a complete exploration. + * @return the explored {@link SSLCapabilities} of the SSL/TLS + * connection + * + * @see #explore(ByteBuffer) + */ + public final static SSLCapabilities explore(byte[] source, + int offset, int length) throws IOException { + ByteBuffer byteBuffer = + ByteBuffer.wrap(source, offset, length).asReadOnlyBuffer(); + return explore(byteBuffer); + } + + /* + * uint8 V2CipherSpec[3]; + * struct { + * uint16 msg_length; // The highest bit MUST be 1; + * // the remaining bits contain the length + * // of the following data in bytes. + * uint8 msg_type; // MUST be 1 + * Version version; + * uint16 cipher_spec_length; // It cannot be zero and MUST be a + * // multiple of the V2CipherSpec length. + * uint16 session_id_length; // This field MUST be empty. + * uint16 challenge_length; // SHOULD use a 32-byte challenge + * V2CipherSpec cipher_specs[V2ClientHello.cipher_spec_length]; + * opaque session_id[V2ClientHello.session_id_length]; + * opaque challenge[V2ClientHello.challenge_length; + * } V2ClientHello; + */ + private static SSLCapabilities exploreV2HelloRecord( + ByteBuffer input, byte firstByte, byte secondByte, + byte thirdByte) throws IOException { + + // We only need the header. We have already had enough source bytes. + // int recordLength = (firstByte & 0x7F) << 8) | (secondByte & 0xFF); + try { + // Is it a V2ClientHello? + if (thirdByte != 0x01) { + throw new SSLException( + "Unsupported or Unrecognized SSL record"); + } + + // What's the hello version? + byte helloVersionMajor = input.get(); + byte helloVersionMinor = input.get(); + + // 0x00: major version of SSLv20 + // 0x02: minor version of SSLv20 + // + // SNIServerName is an extension, SSLv20 doesn't support extension. + return new SSLCapabilitiesImpl((byte)0x00, (byte)0x02, + helloVersionMajor, helloVersionMinor, + Collections.emptyList()); + } catch (BufferUnderflowException bufe) { + throw new SSLProtocolException( + "Invalid handshake record"); + } + } + + /* + * struct { + * uint8 major; + * uint8 minor; + * } ProtocolVersion; + * + * enum { + * change_cipher_spec(20), alert(21), handshake(22), + * application_data(23), (255) + * } ContentType; + * + * struct { + * ContentType type; + * ProtocolVersion version; + * uint16 length; + * opaque fragment[TLSPlaintext.length]; + * } TLSPlaintext; + */ + private static SSLCapabilities exploreTLSRecord( + ByteBuffer input, byte firstByte, byte secondByte, + byte thirdByte) throws IOException { + + // Is it a handshake message? + if (firstByte != 22) { // 22: handshake record + throw new SSLException("Not handshake record"); + } + + // We need the record version to construct SSLCapabilities. + byte recordMajorVersion = secondByte; + byte recordMinorVersion = thirdByte; + + // Is there enough data for a full record? + int recordLength = getInt16(input); + if (recordLength > input.remaining()) { + throw new BufferUnderflowException(); + } + + // We have already had enough source bytes. + try { + return exploreHandshake(input, + recordMajorVersion, recordMinorVersion, recordLength); + } catch (BufferUnderflowException bufe) { + throw new SSLProtocolException( + "Invalid handshake record"); + } + } + + /* + * enum { + * hello_request(0), client_hello(1), server_hello(2), + * certificate(11), server_key_exchange (12), + * certificate_request(13), server_hello_done(14), + * certificate_verify(15), client_key_exchange(16), + * finished(20) + * (255) + * } HandshakeType; + * + * struct { + * HandshakeType msg_type; + * uint24 length; + * select (HandshakeType) { + * case hello_request: HelloRequest; + * case client_hello: ClientHello; + * case server_hello: ServerHello; + * case certificate: Certificate; + * case server_key_exchange: ServerKeyExchange; + * case certificate_request: CertificateRequest; + * case server_hello_done: ServerHelloDone; + * case certificate_verify: CertificateVerify; + * case client_key_exchange: ClientKeyExchange; + * case finished: Finished; + * } body; + * } Handshake; + */ + private static SSLCapabilities exploreHandshake( + ByteBuffer input, byte recordMajorVersion, + byte recordMinorVersion, int recordLength) throws IOException { + + // What is the handshake type? + byte handshakeType = input.get(); + if (handshakeType != 0x01) { // 0x01: client_hello message + throw new IllegalStateException("Not initial handshaking"); + } + + // What is the handshake body length? + int handshakeLength = getInt24(input); + + // Theoretically, a single handshake message might span multiple + // records, but in practice this does not occur. + if (handshakeLength > (recordLength - 4)) { // 4: handshake header size + throw new SSLException("Handshake message spans multiple records"); + } + + input = input.duplicate(); + input.limit(handshakeLength + input.position()); + return exploreClientHello(input, + recordMajorVersion, recordMinorVersion); + } + + /* + * struct { + * uint32 gmt_unix_time; + * opaque random_bytes[28]; + * } Random; + * + * opaque SessionID<0..32>; + * + * uint8 CipherSuite[2]; + * + * enum { null(0), (255) } CompressionMethod; + * + * struct { + * ProtocolVersion client_version; + * Random random; + * SessionID session_id; + * CipherSuite cipher_suites<2..2^16-2>; + * CompressionMethod compression_methods<1..2^8-1>; + * select (extensions_present) { + * case false: + * struct {}; + * case true: + * Extension extensions<0..2^16-1>; + * }; + * } ClientHello; + */ + private static SSLCapabilities exploreClientHello( + ByteBuffer input, + byte recordMajorVersion, + byte recordMinorVersion) throws IOException { + + List snList = Collections.emptyList(); + + // client version + byte helloMajorVersion = input.get(); + byte helloMinorVersion = input.get(); + + // ignore random + int position = input.position(); + input.position(position + 32); // 32: the length of Random + + // ignore session id + ignoreByteVector8(input); + + // ignore cipher_suites + ignoreByteVector16(input); + + // ignore compression methods + ignoreByteVector8(input); + + if (input.remaining() > 0) { + snList = exploreExtensions(input); + } + + return new SSLCapabilitiesImpl( + recordMajorVersion, recordMinorVersion, + helloMajorVersion, helloMinorVersion, snList); + } + + /* + * struct { + * ExtensionType extension_type; + * opaque extension_data<0..2^16-1>; + * } Extension; + * + * enum { + * server_name(0), max_fragment_length(1), + * client_certificate_url(2), trusted_ca_keys(3), + * truncated_hmac(4), status_request(5), (65535) + * } ExtensionType; + */ + private static List exploreExtensions(ByteBuffer input) + throws IOException { + + int length = getInt16(input); // length of extensions + while (length > 0) { + int extType = getInt16(input); // extenson type + int extLen = getInt16(input); // length of extension data + + if (extType == 0x00) { // 0x00: type of server name indication + return exploreSNIExt(input, extLen); + } else { // ignore other extensions + ignoreByteVector(input, extLen); + } + + length -= extLen + 4; + } + + return Collections.emptyList(); + } + + /* + * struct { + * NameType name_type; + * select (name_type) { + * case host_name: HostName; + * } name; + * } ServerName; + * + * enum { + * host_name(0), (255) + * } NameType; + * + * opaque HostName<1..2^16-1>; + * + * struct { + * ServerName server_name_list<1..2^16-1> + * } ServerNameList; + */ + private static List exploreSNIExt(ByteBuffer input, + int extLen) throws IOException { + + Map sniMap = new LinkedHashMap<>(); + + int remains = extLen; + if (extLen >= 2) { // "server_name" extension in ClientHello + int listLen = getInt16(input); // length of server_name_list + if (listLen == 0 || listLen + 2 != extLen) { + throw new SSLProtocolException( + "Invalid server name indication extension"); + } + + remains -= 2; // 0x02: the length field of server_name_list + while (remains > 0) { + int code = getInt8(input); // name_type + int snLen = getInt16(input); // length field of server name + if (snLen > remains) { + throw new SSLProtocolException( + "Not enough data to fill declared vector size"); + } + byte[] encoded = new byte[snLen]; + input.get(encoded); + + SNIServerName serverName; + switch (code) { + case StandardConstants.SNI_HOST_NAME: + if (encoded.length == 0) { + throw new SSLProtocolException( + "Empty HostName in server name indication"); + } + serverName = new SNIHostName(encoded); + break; + default: + serverName = new UnknownServerName(code, encoded); + } + // check for duplicated server name type + if (sniMap.put(serverName.getType(), serverName) != null) { + throw new SSLProtocolException( + "Duplicated server name of type " + + serverName.getType()); + } + + remains -= encoded.length + 3; // NameType: 1 byte + // HostName length: 2 bytes + } + } else if (extLen == 0) { // "server_name" extension in ServerHello + throw new SSLProtocolException( + "Not server name indication extension in client"); + } + + if (remains != 0) { + throw new SSLProtocolException( + "Invalid server name indication extension"); + } + + return Collections.unmodifiableList( + new ArrayList<>(sniMap.values())); + } + + private static int getInt8(ByteBuffer input) { + return input.get(); + } + + private static int getInt16(ByteBuffer input) { + return ((input.get() & 0xFF) << 8) | (input.get() & 0xFF); + } + + private static int getInt24(ByteBuffer input) { + return ((input.get() & 0xFF) << 16) | ((input.get() & 0xFF) << 8) | + (input.get() & 0xFF); + } + + private static void ignoreByteVector8(ByteBuffer input) { + ignoreByteVector(input, getInt8(input)); + } + + private static void ignoreByteVector16(ByteBuffer input) { + ignoreByteVector(input, getInt16(input)); + } + + private static void ignoreByteVector24(ByteBuffer input) { + ignoreByteVector(input, getInt24(input)); + } + + private static void ignoreByteVector(ByteBuffer input, int length) { + if (length != 0) { + int position = input.position(); + input.position(position + length); + } + } + + private static class UnknownServerName extends SNIServerName { + UnknownServerName(int code, byte[] encoded) { + super(code, encoded); + } + } + + private static final class SSLCapabilitiesImpl extends SSLCapabilities { + private final static Map versionMap = new HashMap<>(5); + + private final String recordVersion; + private final String helloVersion; + List sniNames; + + static { + versionMap.put(0x0002, "SSLv2Hello"); + versionMap.put(0x0300, "SSLv3"); + versionMap.put(0x0301, "TLSv1"); + versionMap.put(0x0302, "TLSv1.1"); + versionMap.put(0x0303, "TLSv1.2"); + } + + SSLCapabilitiesImpl(byte recordMajorVersion, byte recordMinorVersion, + byte helloMajorVersion, byte helloMinorVersion, + List sniNames) { + + int version = (recordMajorVersion << 8) | recordMinorVersion; + this.recordVersion = versionMap.get(version) != null ? + versionMap.get(version) : + unknownVersion(recordMajorVersion, recordMinorVersion); + + version = (helloMajorVersion << 8) | helloMinorVersion; + this.helloVersion = versionMap.get(version) != null ? + versionMap.get(version) : + unknownVersion(helloMajorVersion, helloMinorVersion); + + this.sniNames = sniNames; + } + + @Override + public String getRecordVersion() { + return recordVersion; + } + + @Override + public String getHelloVersion() { + return helloVersion; + } + + @Override + public List getServerNames() { + if (!sniNames.isEmpty()) { + return Collections.unmodifiableList(sniNames); + } + + return sniNames; + } + + private static String unknownVersion(byte major, byte minor) { + return "Unknown-" + ((int)major) + "." + ((int)minor); + } + } +} + diff --git a/jdk/test/sun/security/ssl/templates/SSLSocketTemplate.java b/jdk/test/sun/security/ssl/templates/SSLSocketTemplate.java index 244b80444db..a31be5d3340 100644 --- a/jdk/test/sun/security/ssl/templates/SSLSocketTemplate.java +++ b/jdk/test/sun/security/ssl/templates/SSLSocketTemplate.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/jarsigner/AlgOptions.sh b/jdk/test/sun/security/tools/jarsigner/AlgOptions.sh index 35bb1e7ea1f..b6f8c8b3ff2 100644 --- a/jdk/test/sun/security/tools/jarsigner/AlgOptions.sh +++ b/jdk/test/sun/security/tools/jarsigner/AlgOptions.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/jarsigner/JarSigningNonAscii.java b/jdk/test/sun/security/tools/jarsigner/JarSigningNonAscii.java index c0cae086252..69bf09ed5bf 100644 --- a/jdk/test/sun/security/tools/jarsigner/JarSigningNonAscii.java +++ b/jdk/test/sun/security/tools/jarsigner/JarSigningNonAscii.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -62,7 +62,7 @@ public class JarSigningNonAscii { "-signedJar", signedJar, unsignedJar, "b" }; - JarSigner.main(jsArgs); + sun.security.tools.jarsigner.Main.main(jsArgs); // verify the signed jar file diff --git a/jdk/test/sun/security/tools/jarsigner/LargeJarEntry.java b/jdk/test/sun/security/tools/jarsigner/LargeJarEntry.java index 280160b2a13..4d4db3c68a0 100644 --- a/jdk/test/sun/security/tools/jarsigner/LargeJarEntry.java +++ b/jdk/test/sun/security/tools/jarsigner/LargeJarEntry.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,7 +35,6 @@ import java.io.FileOutputStream; import java.util.jar.JarEntry; import java.util.jar.JarOutputStream; import java.util.zip.CRC32; -import sun.security.tools.JarSigner; public class LargeJarEntry { @@ -73,7 +72,7 @@ public class LargeJarEntry { jarName, "b" }; // now, try to sign it try { - JarSigner.main(jsArgs); + sun.security.tools.jarsigner.Main.main(jsArgs); } catch (OutOfMemoryError err) { throw new Exception("Test failed with OutOfMemoryError", err); } finally { diff --git a/jdk/test/sun/security/tools/jarsigner/PercentSign.sh b/jdk/test/sun/security/tools/jarsigner/PercentSign.sh index b29945262ee..559c0533e73 100644 --- a/jdk/test/sun/security/tools/jarsigner/PercentSign.sh +++ b/jdk/test/sun/security/tools/jarsigner/PercentSign.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh index 298a0a7354e..c3eec5819e1 100644 --- a/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh +++ b/jdk/test/sun/security/tools/jarsigner/concise_jarsigner.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/jarsigner/diffend.sh b/jdk/test/sun/security/tools/jarsigner/diffend.sh index 0927b2db9ad..0f943796af4 100644 --- a/jdk/test/sun/security/tools/jarsigner/diffend.sh +++ b/jdk/test/sun/security/tools/jarsigner/diffend.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/jarsigner/oldsig.sh b/jdk/test/sun/security/tools/jarsigner/oldsig.sh index a6c7464ad2f..aae758cb937 100644 --- a/jdk/test/sun/security/tools/jarsigner/oldsig.sh +++ b/jdk/test/sun/security/tools/jarsigner/oldsig.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/AltProviderPath.sh b/jdk/test/sun/security/tools/keytool/AltProviderPath.sh index 05dc50c6ccb..067a5eb7bf0 100644 --- a/jdk/test/sun/security/tools/keytool/AltProviderPath.sh +++ b/jdk/test/sun/security/tools/keytool/AltProviderPath.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh b/jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh index bc3a868d0ae..0f9b82c84b8 100644 --- a/jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh +++ b/jdk/test/sun/security/tools/keytool/CloneKeyAskPassword.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/CloseFile.java b/jdk/test/sun/security/tools/keytool/CloseFile.java index b1b83a4bf0e..82c3e44a194 100644 --- a/jdk/test/sun/security/tools/keytool/CloseFile.java +++ b/jdk/test/sun/security/tools/keytool/CloseFile.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,12 +26,13 @@ * @bug 6489721 * @summary keytool has not closed several file streams * @author weijun.wang + * @compile -XDignore.symbol.file CloseFile.java + * @run main CloseFile * * This test is only useful on Windows, which fails before the fix and succeeds * after it. On other platforms, it always passes. */ -import sun.security.tools.KeyTool; import java.io.*; public class CloseFile { @@ -58,7 +59,7 @@ public class CloseFile { } static void run(String s) throws Exception { - KeyTool.main((s+" -debug").split(" ")); + sun.security.tools.keytool.Main.main((s+" -debug").split(" ")); } static void remove(String filename, boolean check) { new File(filename).delete(); diff --git a/jdk/test/sun/security/tools/keytool/KeyToolTest.java b/jdk/test/sun/security/tools/keytool/KeyToolTest.java index 573f9be3bd7..e86af93ea24 100644 --- a/jdk/test/sun/security/tools/keytool/KeyToolTest.java +++ b/jdk/test/sun/security/tools/keytool/KeyToolTest.java @@ -56,7 +56,6 @@ */ import java.security.KeyStore; -import sun.security.tools.KeyTool; import sun.security.x509.*; import java.io.*; import java.security.KeyPairGenerator; @@ -149,12 +148,13 @@ public class KeyToolTest { System.setOut(new PrintStream(b1)); System.setErr(new PrintStream(b2)); - // since System.in is overrided, the KeyTool.main() method will + // since System.in is overrided, the + // sun.security.tools.keytool.Main.main() method will // never block at user input - // use -debug so that KeyTool.main() will throw an Exception + // use -debug so that main() will throw an Exception // instead of calling System.exit() - KeyTool.main(("-debug "+cmd).split("\\s+")); + sun.security.tools.keytool.Main.main(("-debug "+cmd).split("\\s+")); } finally { out = b1.toString(); err = b2.toString(); diff --git a/jdk/test/sun/security/tools/keytool/NewSize7.java b/jdk/test/sun/security/tools/keytool/NewSize7.java index ab8ef5cb59a..2e5ee6ef3af 100644 --- a/jdk/test/sun/security/tools/keytool/NewSize7.java +++ b/jdk/test/sun/security/tools/keytool/NewSize7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,8 @@ * @test * @bug 6561126 * @summary keytool should use larger default keysize for keypairs + * @compile -XDignore.symbol.file NewSize7.java + * @run main NewSize7 */ import java.io.File; @@ -34,13 +36,13 @@ import java.nio.file.Paths; import java.security.KeyStore; import java.security.cert.X509Certificate; import java.security.interfaces.RSAPublicKey; -import sun.security.tools.KeyTool; public class NewSize7 { public static void main(String[] args) throws Exception { String FILE = "newsize7-ks"; new File(FILE).delete(); - KeyTool.main(("-debug -genkeypair -keystore " + FILE + + sun.security.tools.keytool.Main.main(("-debug -genkeypair -keystore " + + FILE + " -alias a -dname cn=c -storepass changeit" + " -keypass changeit -keyalg rsa").split(" ")); KeyStore ks = KeyStore.getInstance("JKS"); diff --git a/jdk/test/sun/security/tools/keytool/NoExtNPE.sh b/jdk/test/sun/security/tools/keytool/NoExtNPE.sh index f0af8227250..da63ed8ce3a 100644 --- a/jdk/test/sun/security/tools/keytool/NoExtNPE.sh +++ b/jdk/test/sun/security/tools/keytool/NoExtNPE.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/SecretKeyKS.sh b/jdk/test/sun/security/tools/keytool/SecretKeyKS.sh index 98e3df4384a..6246d2bdbb1 100644 --- a/jdk/test/sun/security/tools/keytool/SecretKeyKS.sh +++ b/jdk/test/sun/security/tools/keytool/SecretKeyKS.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/StandardAlgName.sh b/jdk/test/sun/security/tools/keytool/StandardAlgName.sh index b3d1c519c0e..8ac1324bc11 100644 --- a/jdk/test/sun/security/tools/keytool/StandardAlgName.sh +++ b/jdk/test/sun/security/tools/keytool/StandardAlgName.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/StartDateTest.java b/jdk/test/sun/security/tools/keytool/StartDateTest.java index bb64480b1f0..597c74510fe 100644 --- a/jdk/test/sun/security/tools/keytool/StartDateTest.java +++ b/jdk/test/sun/security/tools/keytool/StartDateTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,8 @@ * @test * @bug 6468285 * @summary keytool ability to backdate self-signed certificates to compensate for clock skew + * @compile -XDignore.symbol.file StartDateTest.java + * @run main StartDateTest */ import java.io.File; @@ -35,7 +37,6 @@ import java.security.cert.X509Certificate; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; -import sun.security.tools.KeyTool; public class StartDateTest { public static void main(String[] args) throws Exception { @@ -66,7 +67,8 @@ public class StartDateTest { new File("jks").delete(); // Part 2: Test format - Method m = KeyTool.class.getDeclaredMethod("getStartDate", String.class); + Method m = sun.security.tools.keytool.Main.class.getDeclaredMethod( + "getStartDate", String.class); m.setAccessible(true); for (String s: new String[] { null, //NOW! @@ -127,7 +129,7 @@ public class StartDateTest { } static void run(String s) throws Exception { - KeyTool.main((s+" -debug").split(" ")); + sun.security.tools.keytool.Main.main((s+" -debug").split(" ")); } static Date getIssueDate() throws Exception { diff --git a/jdk/test/sun/security/tools/keytool/UnknownAndUnparseable.java b/jdk/test/sun/security/tools/keytool/UnknownAndUnparseable.java index 5c587ac548b..cb8cbad4159 100644 --- a/jdk/test/sun/security/tools/keytool/UnknownAndUnparseable.java +++ b/jdk/test/sun/security/tools/keytool/UnknownAndUnparseable.java @@ -25,12 +25,13 @@ * @test * @bug 7192202 * @summary Make sure keytool prints both unknown and unparseable extensions + * @compile -XDignore.symbol.file UnknownAndUnparseable.java + * @run main UnknownAndUnparseable */ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.PrintStream; -import sun.security.tools.KeyTool; import sun.security.x509.PKIXExtensions; public class UnknownAndUnparseable { @@ -44,14 +45,14 @@ public class UnknownAndUnparseable { String genkey = s + "-genkeypair -alias a -dname CN=A -ext 1.2.3.4=1234 " + "-ext " + PKIXExtensions.KeyUsage_Id.toString() + "=5678"; - KeyTool.main(genkey.split(" ")); + sun.security.tools.keytool.Main.main(genkey.split(" ")); // Get the list output to a string String list = s + "-list -v"; ByteArrayOutputStream bout = new ByteArrayOutputStream(); PrintStream oldOut = System.out; System.setOut(new PrintStream(bout)); - KeyTool.main(list.split(" ")); + sun.security.tools.keytool.Main.main(list.split(" ")); System.setOut(oldOut); String out = bout.toString(); System.out.println(out); diff --git a/jdk/test/sun/security/tools/keytool/autotest.sh b/jdk/test/sun/security/tools/keytool/autotest.sh index ea4c3f2715f..56836d107c3 100644 --- a/jdk/test/sun/security/tools/keytool/autotest.sh +++ b/jdk/test/sun/security/tools/keytool/autotest.sh @@ -78,7 +78,7 @@ case "$OS" in esac if [ "$LIBNAME" = "" ]; then - echo "Cannot find LIBNAME" + echo "Cannot find libsoftokn3.so" exit 1 fi diff --git a/jdk/test/sun/security/tools/keytool/i18n.sh b/jdk/test/sun/security/tools/keytool/i18n.sh index 75610878f7d..8b9680ac204 100644 --- a/jdk/test/sun/security/tools/keytool/i18n.sh +++ b/jdk/test/sun/security/tools/keytool/i18n.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/printssl.sh b/jdk/test/sun/security/tools/keytool/printssl.sh index b17113ab497..b750ffe8d2d 100644 --- a/jdk/test/sun/security/tools/keytool/printssl.sh +++ b/jdk/test/sun/security/tools/keytool/printssl.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/resource.sh b/jdk/test/sun/security/tools/keytool/resource.sh index b21cf830f62..1256422144e 100644 --- a/jdk/test/sun/security/tools/keytool/resource.sh +++ b/jdk/test/sun/security/tools/keytool/resource.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/keytool/standard.sh b/jdk/test/sun/security/tools/keytool/standard.sh index 98e3b03be89..756d2fb1f1e 100644 --- a/jdk/test/sun/security/tools/keytool/standard.sh +++ b/jdk/test/sun/security/tools/keytool/standard.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -56,7 +56,7 @@ case "$OS" in ;; esac -${TESTJAVA}${FS}bin${FS}javac -d . ${TESTSRC}${FS}KeyToolTest.java || exit 10 +${TESTJAVA}${FS}bin${FS}javac -d . -XDignore.symbol.file ${TESTSRC}${FS}KeyToolTest.java || exit 10 echo | ${TESTJAVA}${FS}bin${FS}java -Dfile KeyToolTest status=$? diff --git a/jdk/test/sun/security/tools/policytool/Alias.sh b/jdk/test/sun/security/tools/policytool/Alias.sh index ee006958b4d..4db8c09b42a 100644 --- a/jdk/test/sun/security/tools/policytool/Alias.sh +++ b/jdk/test/sun/security/tools/policytool/Alias.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/policytool/ChangeUI.sh b/jdk/test/sun/security/tools/policytool/ChangeUI.sh index b423c2371a9..95e25af1227 100644 --- a/jdk/test/sun/security/tools/policytool/ChangeUI.sh +++ b/jdk/test/sun/security/tools/policytool/ChangeUI.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/policytool/OpenPolicy.sh b/jdk/test/sun/security/tools/policytool/OpenPolicy.sh index 34952e0d26a..5aca3324661 100644 --- a/jdk/test/sun/security/tools/policytool/OpenPolicy.sh +++ b/jdk/test/sun/security/tools/policytool/OpenPolicy.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/policytool/SaveAs.sh b/jdk/test/sun/security/tools/policytool/SaveAs.sh index fed21e40dfa..661ebd99a3e 100644 --- a/jdk/test/sun/security/tools/policytool/SaveAs.sh +++ b/jdk/test/sun/security/tools/policytool/SaveAs.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/policytool/UpdatePermissions.sh b/jdk/test/sun/security/tools/policytool/UpdatePermissions.sh index 81cf1f29186..eada9d734cd 100644 --- a/jdk/test/sun/security/tools/policytool/UpdatePermissions.sh +++ b/jdk/test/sun/security/tools/policytool/UpdatePermissions.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/policytool/UsePolicy.sh b/jdk/test/sun/security/tools/policytool/UsePolicy.sh index 697f8c46510..3422f2cfc15 100644 --- a/jdk/test/sun/security/tools/policytool/UsePolicy.sh +++ b/jdk/test/sun/security/tools/policytool/UsePolicy.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 1999, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/tools/policytool/i18n.sh b/jdk/test/sun/security/tools/policytool/i18n.sh index 5a30c02e20f..8537d48c708 100644 --- a/jdk/test/sun/security/tools/policytool/i18n.sh +++ b/jdk/test/sun/security/tools/policytool/i18n.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2000, 2002, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/util/Oid/S11N.sh b/jdk/test/sun/security/util/Oid/S11N.sh index 48a37114563..488c8959094 100644 --- a/jdk/test/sun/security/util/Oid/S11N.sh +++ b/jdk/test/sun/security/util/Oid/S11N.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2004, 2009, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/util/Resources/Format.java b/jdk/test/sun/security/util/Resources/Format.java index 5241d288e16..3cc8cd0125e 100644 --- a/jdk/test/sun/security/util/Resources/Format.java +++ b/jdk/test/sun/security/util/Resources/Format.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -150,7 +150,7 @@ public class Format s.getPrivateCredentials().add(new Format()); System.out.println("Test 12, s.toString() = " + s.toString()); } catch (Exception e) { - throw new SecurityException("test 12 failed: e.toString()"); + throw new SecurityException("test 12 failed: e.toString()", e); } try { diff --git a/jdk/test/sun/security/util/Resources/NewNamesFormat.java b/jdk/test/sun/security/util/Resources/NewNamesFormat.java index 9c3b4521908..d984cfa0321 100644 --- a/jdk/test/sun/security/util/Resources/NewNamesFormat.java +++ b/jdk/test/sun/security/util/Resources/NewNamesFormat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,9 @@ public class NewNamesFormat { public static void main(String[] args) throws Exception { checkRes("sun.security.util.Resources"); checkRes("sun.security.util.AuthResources"); - checkRes("sun.security.tools.JarSignerResources"); + checkRes("sun.security.tools.jarsigner.Resources"); + checkRes("sun.security.tools.keytool.Resources"); + checkRes("sun.security.tools.policytool.Resources"); } private static void checkRes(String resName) throws Exception { diff --git a/jdk/test/sun/security/util/Resources/NewResourcesNames.java b/jdk/test/sun/security/util/Resources/NewResourcesNames.java index 72078b5c333..c0db9544b17 100644 --- a/jdk/test/sun/security/util/Resources/NewResourcesNames.java +++ b/jdk/test/sun/security/util/Resources/NewResourcesNames.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,9 @@ class NewResourcesNames { static int MAXLEN = 127; static String[] resources = { - "sun/security/tools/JarSignerResources.java", + "sun/security/tools/jarsigner/Resources.java", + "sun/security/tools/keytool/Resources.java", + "sun/security/tools/policytool/Resources.java", "sun/security/util/Resources.java", "sun/security/util/AuthResources.java", }; @@ -94,7 +96,7 @@ class NewResourcesNames { // // This means a " exists right after getString(. Sometimes you see // - // Working on sun/security/tools/KeyTool.java + // Working on sun/security/tools/keytool/Main.java // BAD!! pmatch != match: 212 != 209 // Working on sun/security/provider/PolicyFile.java // BAD!! pmatch != match: 14 != 10 @@ -165,7 +167,7 @@ class NewResourcesNames { Set names = new HashSet(); - String file = "sun/security/tools/KeyTool.java"; + String file = "sun/security/tools/keytool/Main.java"; System.err.println("Working on " + file); File origFile = new File(file); File tmpFile = new File(file + ".tmp"); diff --git a/jdk/test/sun/security/x509/AlgorithmId/ExtensibleAlgorithmId.java b/jdk/test/sun/security/x509/AlgorithmId/ExtensibleAlgorithmId.java index b1ce9b795c7..2f85217f483 100644 --- a/jdk/test/sun/security/x509/AlgorithmId/ExtensibleAlgorithmId.java +++ b/jdk/test/sun/security/x509/AlgorithmId/ExtensibleAlgorithmId.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/security/x509/AlgorithmId/NonStandardNames.java b/jdk/test/sun/security/x509/AlgorithmId/NonStandardNames.java index 9870db335f5..c6ca55ce385 100644 --- a/jdk/test/sun/security/x509/AlgorithmId/NonStandardNames.java +++ b/jdk/test/sun/security/x509/AlgorithmId/NonStandardNames.java @@ -25,6 +25,8 @@ * @test * @bug 7180907 * @summary Jarsigner -verify fails if rsa file used sha-256 with authenticated attributes + * @compile -XDignore.symbol.file NonStandardNames.java + * @run main NonStandardNames */ import java.security.MessageDigest; @@ -35,7 +37,7 @@ import sun.security.pkcs.PKCS7; import sun.security.pkcs.PKCS9Attribute; import sun.security.pkcs.PKCS9Attributes; import sun.security.pkcs.SignerInfo; -import sun.security.tools.CertAndKeyGen; +import sun.security.tools.keytool.CertAndKeyGen; import sun.security.x509.AlgorithmId; import sun.security.x509.X500Name; diff --git a/jdk/test/sun/tools/common/CommonSetup.sh b/jdk/test/sun/tools/common/CommonSetup.sh index 7d37dbe51f3..db58377a668 100644 --- a/jdk/test/sun/tools/common/CommonSetup.sh +++ b/jdk/test/sun/tools/common/CommonSetup.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jcmd/jcmd-Defaults.sh b/jdk/test/sun/tools/jcmd/jcmd-Defaults.sh index cf791358922..2d6aa2ebe89 100644 --- a/jdk/test/sun/tools/jcmd/jcmd-Defaults.sh +++ b/jdk/test/sun/tools/jcmd/jcmd-Defaults.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jcmd/jcmd-f.sh b/jdk/test/sun/tools/jcmd/jcmd-f.sh index 5cbd1b93236..ad73bc750ee 100644 --- a/jdk/test/sun/tools/jcmd/jcmd-f.sh +++ b/jdk/test/sun/tools/jcmd/jcmd-f.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jcmd/jcmd-help-help.sh b/jdk/test/sun/tools/jcmd/jcmd-help-help.sh index b9545ff7f79..2f99b6faef7 100644 --- a/jdk/test/sun/tools/jcmd/jcmd-help-help.sh +++ b/jdk/test/sun/tools/jcmd/jcmd-help-help.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jcmd/jcmd-help.sh b/jdk/test/sun/tools/jcmd/jcmd-help.sh index e822a411042..b640776c367 100644 --- a/jdk/test/sun/tools/jcmd/jcmd-help.sh +++ b/jdk/test/sun/tools/jcmd/jcmd-help.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jcmd/jcmd-pid.sh b/jdk/test/sun/tools/jcmd/jcmd-pid.sh index eda230aa1f1..df397339327 100644 --- a/jdk/test/sun/tools/jcmd/jcmd-pid.sh +++ b/jdk/test/sun/tools/jcmd/jcmd-pid.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jcmd/jcmd_Output1.awk b/jdk/test/sun/tools/jcmd/jcmd_Output1.awk index 92bc9db6a29..986951dc178 100644 --- a/jdk/test/sun/tools/jcmd/jcmd_Output1.awk +++ b/jdk/test/sun/tools/jcmd/jcmd_Output1.awk @@ -16,7 +16,7 @@ BEGIN { } # or match on the condition that the class name is not available -/^[0-9]+ -- process information unavailable$/ { +/^[0-9]+ -- .*$/ { current=1; } diff --git a/jdk/test/sun/tools/jconsole/ImmutableResourceTest.sh b/jdk/test/sun/tools/jconsole/ImmutableResourceTest.sh index 414d02b9cbf..dedf21271b0 100644 --- a/jdk/test/sun/tools/jconsole/ImmutableResourceTest.sh +++ b/jdk/test/sun/tools/jconsole/ImmutableResourceTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2007, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jinfo/Basic.sh b/jdk/test/sun/tools/jinfo/Basic.sh index 639d1686ffc..0fdcb9e1e38 100644 --- a/jdk/test/sun/tools/jinfo/Basic.sh +++ b/jdk/test/sun/tools/jinfo/Basic.sh @@ -1,6 +1,6 @@ #!/bin/sh # -# Copyright (c) 2006, 2011, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jps/jps-l_Output1.awk b/jdk/test/sun/tools/jps/jps-l_Output1.awk index ed90256b8df..5280197ed6b 100644 --- a/jdk/test/sun/tools/jps/jps-l_Output1.awk +++ b/jdk/test/sun/tools/jps/jps-l_Output1.awk @@ -16,7 +16,7 @@ BEGIN { } # or match on the condition that the class name is not available -/^[0-9]+ -- process information unavailable$/ { +/^[0-9]+ -- .*$/ { matched++; } diff --git a/jdk/test/sun/tools/jps/jps_Output1.awk b/jdk/test/sun/tools/jps/jps_Output1.awk index 270889edfd9..1781bc560e3 100644 --- a/jdk/test/sun/tools/jps/jps_Output1.awk +++ b/jdk/test/sun/tools/jps/jps_Output1.awk @@ -16,7 +16,7 @@ BEGIN { } # or match on the condition that the class name is not available -/^[0-9]+ -- process information unavailable$/ { +/^[0-9]+ -- .*$/ { matched++; } diff --git a/jdk/test/sun/tools/jrunscript/common.sh b/jdk/test/sun/tools/jrunscript/common.sh index 8fd6df5c93e..a80157fd1c2 100644 --- a/jdk/test/sun/tools/jrunscript/common.sh +++ b/jdk/test/sun/tools/jrunscript/common.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jrunscript/jrunscript-argsTest.sh b/jdk/test/sun/tools/jrunscript/jrunscript-argsTest.sh index 68928de89de..55f3147039a 100644 --- a/jdk/test/sun/tools/jrunscript/jrunscript-argsTest.sh +++ b/jdk/test/sun/tools/jrunscript/jrunscript-argsTest.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jrunscript/jrunscript-eTest.sh b/jdk/test/sun/tools/jrunscript/jrunscript-eTest.sh index 625c6d40449..e9867b84ffa 100644 --- a/jdk/test/sun/tools/jrunscript/jrunscript-eTest.sh +++ b/jdk/test/sun/tools/jrunscript/jrunscript-eTest.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jrunscript/jrunscript-fTest.sh b/jdk/test/sun/tools/jrunscript/jrunscript-fTest.sh index a50d983c99f..170a7dd0d11 100644 --- a/jdk/test/sun/tools/jrunscript/jrunscript-fTest.sh +++ b/jdk/test/sun/tools/jrunscript/jrunscript-fTest.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/jrunscript/jrunscriptTest.sh b/jdk/test/sun/tools/jrunscript/jrunscriptTest.sh index 2d1916a7cde..0a3237536db 100644 --- a/jdk/test/sun/tools/jrunscript/jrunscriptTest.sh +++ b/jdk/test/sun/tools/jrunscript/jrunscriptTest.sh @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh b/jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh index 527de199bc9..fa312adad74 100644 --- a/jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh +++ b/jdk/test/sun/tools/native2ascii/resources/ImmutableResourceTest.sh @@ -1,5 +1,5 @@ # -# Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/sun/util/logging/PlatformLoggerTest.java b/jdk/test/sun/util/logging/PlatformLoggerTest.java index 9e7435d4045..25018874af4 100644 --- a/jdk/test/sun/util/logging/PlatformLoggerTest.java +++ b/jdk/test/sun/util/logging/PlatformLoggerTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/tools/launcher/DefaultLocaleTest.java b/jdk/test/tools/launcher/DefaultLocaleTest.java index 1fbce312fb0..d962813bb21 100644 --- a/jdk/test/tools/launcher/DefaultLocaleTest.java +++ b/jdk/test/tools/launcher/DefaultLocaleTest.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2004, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/tools/pack200/CommandLineTests.java b/jdk/test/tools/pack200/CommandLineTests.java index e32fadbf85b..4e0c8b1e003 100644 --- a/jdk/test/tools/pack200/CommandLineTests.java +++ b/jdk/test/tools/pack200/CommandLineTests.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/test/tools/pack200/TimeStamp.java b/jdk/test/tools/pack200/TimeStamp.java index aa82fbb4e16..8dfc2d9bc2e 100644 --- a/jdk/test/tools/pack200/TimeStamp.java +++ b/jdk/test/tools/pack200/TimeStamp.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/langtools/.hgtags b/langtools/.hgtags index 080bdc4ab61..377c3143f47 100644 --- a/langtools/.hgtags +++ b/langtools/.hgtags @@ -183,3 +183,5 @@ e48e7e1f026b82d921433150180799898c088890 jdk8-b55 f299927fc31689385f67ab7322c18eb41d8bd71e jdk8-b59 3d2b98ffcb534b0e5be87bb1f9f68d1518ad7729 jdk8-b60 26020b247ad3806dbca33e029ee12e1b191f59f9 jdk8-b61 +b47bb81ba962ef80bb6f0b863c33a0afcfb0b49e jdk8-b62 +92e6f2190ca0567c857f85c3fb7a2be5adf079d0 jdk8-b63 diff --git a/langtools/make/tools/genstubs/GenStubs.java b/langtools/make/tools/genstubs/GenStubs.java index ff7cbbbf7df..5ff9f35789b 100644 --- a/langtools/make/tools/genstubs/GenStubs.java +++ b/langtools/make/tools/genstubs/GenStubs.java @@ -35,7 +35,7 @@ import com.sun.source.tree.CompilationUnitTree; import com.sun.source.util.JavacTask; import com.sun.tools.javac.api.JavacTool; import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.TypeTags; +import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.tree.JCTree.JCFieldAccess; @@ -244,23 +244,23 @@ public class GenStubs { else { String t = tree.vartype.toString(); if (t.equals("boolean")) - tree.init = new JCLiteral(TypeTags.BOOLEAN, 0) { }; + tree.init = new JCLiteral(TypeTag.BOOLEAN, 0) { }; else if (t.equals("byte")) - tree.init = new JCLiteral(TypeTags.BYTE, 0) { }; + tree.init = new JCLiteral(TypeTag.BYTE, 0) { }; else if (t.equals("char")) - tree.init = new JCLiteral(TypeTags.CHAR, 0) { }; + tree.init = new JCLiteral(TypeTag.CHAR, 0) { }; else if (t.equals("double")) - tree.init = new JCLiteral(TypeTags.DOUBLE, 0.d) { }; + tree.init = new JCLiteral(TypeTag.DOUBLE, 0.d) { }; else if (t.equals("float")) - tree.init = new JCLiteral(TypeTags.FLOAT, 0.f) { }; + tree.init = new JCLiteral(TypeTag.FLOAT, 0.f) { }; else if (t.equals("int")) - tree.init = new JCLiteral(TypeTags.INT, 0) { }; + tree.init = new JCLiteral(TypeTag.INT, 0) { }; else if (t.equals("long")) - tree.init = new JCLiteral(TypeTags.LONG, 0) { }; + tree.init = new JCLiteral(TypeTag.LONG, 0) { }; else if (t.equals("short")) - tree.init = new JCLiteral(TypeTags.SHORT, 0) { }; + tree.init = new JCLiteral(TypeTag.SHORT, 0) { }; else - tree.init = new JCLiteral(TypeTags.BOT, null) { }; + tree.init = new JCLiteral(TypeTag.BOT, null) { }; } } result = tree; diff --git a/langtools/makefiles/BuildLangtools.gmk b/langtools/makefiles/BuildLangtools.gmk new file mode 100644 index 00000000000..c5870703870 --- /dev/null +++ b/langtools/makefiles/BuildLangtools.gmk @@ -0,0 +1,205 @@ +# +# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +# This must be the first rule +default: all + +include $(SPEC) +include MakeBase.gmk +include JavaCompilation.gmk + +# The BOOT_JAVAC setup uses the bootdir compiler to compile the tools +# and the bootstrap javac, to be run by the bootdir jvm. +$(eval $(call SetupJavaCompiler,BOOT_JAVAC,\ + JAVAC:=$(JAVAC),\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA),\ + FLAGS:=-XDignore.symbol.file=true -g -Xlint:all$(COMMA)-deprecation -Werror)) + +# Now setup the compilation of the properties compilation tool. You can depend +# upon $(BUILD_TOOLS) to trigger a compilation of the tools. Note that we +# add src/share/classes to the sourcepath. This is necessary since the GenStubs +# program needs to be linked and run towards the new javac sources. +$(eval $(call SetupJavaCompilation,BUILD_TOOLS,\ + SETUP:=BOOT_JAVAC,\ + DISABLE_SJAVAC:=true,\ + ADD_JAVAC_FLAGS:=-Xprefer:source,\ + SRC:=$(LANGTOOLS_TOPDIR)/make/tools $(LANGTOOLS_TOPDIR)/src/share/classes,\ + INCLUDES:=compileproperties genstubs,\ + BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses)) + +# The compileprops tools compiles a properties file into a resource bundle. +TOOL_COMPILEPROPS_CMD:=$(JAVA) -cp $(LANGTOOLS_OUTPUTDIR)/btclasses compileproperties.CompileProperties -quiet +# Lookup the properties that need to be compiled into resource bundles. +PROPSOURCES:=$(shell find $(LANGTOOLS_TOPDIR)/src/share/classes -name "*.properties") +# Strip away prefix and suffix, leaving for example only: "com/sun/tools/javac/resources/javac_zh_CN" +PROPPATHS:=$(patsubst $(LANGTOOLS_TOPDIR)/src/share/classes/%.properties,%,$(PROPSOURCES)) +# Generate the list of java files to be created. +PROPJAVAS:=$(patsubst %,$(LANGTOOLS_OUTPUTDIR)/gensrc/%.java,$(PROPPATHS)) +# Generate the package dirs for the tobe generated java files. +PROPDIRS:=$(dir $(PROPJAVAS)) +# Now generate a sequence of "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle" +# suitable to be fed into the CompileProperties command. +PROPCMDLINE:=$(subst _SPACE_,$(SPACE),$(join $(addprefix -compile_SPACE_,$(PROPSOURCES)), \ + $(addsuffix _SPACE_java.util.ListResourceBundle,$(addprefix _SPACE_$(LANGTOOLS_OUTPUTDIR)/gensrc/,$(addsuffix .java,$(PROPPATHS)))))) + +# Now setup the rule for the generation of the resource bundles. +$(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d : $(PROPSOURCES) $(BUILD_TOOLS) + rm -rf $(@D)/* + mkdir -p $(@D) $(PROPDIRS) + printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties + printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties + printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties + echo Compiling $(words $(PROPSOURCES) v1 v2 v3) properties into resource bundles + $(TOOL_COMPILEPROPS_CMD) $(PROPCMDLINE) \ + -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.java \ + java.util.ListResourceBundle \ + -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.java \ + java.util.ListResourceBundle \ + -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.java \ + java.util.ListResourceBundle + echo PROPS_ARE_CREATED=yes > $@ + +# Trigger the generation of the resource bundles. After the resource bundles have +# been compiled, then the makefile will restart and the newly created java files +# will become part of the build further along in the makefile. +-include $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d + +ifeq ($(PROPS_ARE_CREATED),yes) + # Setup the rules to build a dist/bootstrap/lib/javac.jar, ie a smaller intermediate javac + # that can be compiled with an old javac. The intermediate javac is then used + # to compile javac again and to build the complete new jdk. + $(eval $(call SetupJavaCompilation,BUILD_BOOTSTRAP_LANGTOOLS,\ + SETUP:=BOOT_JAVAC,\ + DISABLE_SJAVAC:=true,\ + SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ + EXCLUDES:=com/sun/tools/javac/nio,\ + BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ + JARMAIN:=com.sun.tools.javac.Main)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAH,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar,\ + JARMAIN:=com.sun.tools.javah.Main)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAP,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar,\ + JARMAIN:=com.sun.tools.javap.Main)) + + $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVADOC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar,\ + JARMAIN:=com.sun.tools.javadoc.Main)) + + # GenStubs is used to bootstrap any dependencies from javac to the new JDK that is not + # yet built. It is currently not needed but might be again in the future. The following + # exercises the functionality to verify that it works. + TOOL_GENSTUBS_CMD=$(JAVA) \ + "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ + -classpath $(LANGTOOLS_OUTPUTDIR)/btclasses \ + genstubs.GenStubs + # We fetch source from the JDK... + JDKS=$(JDK_TOPDIR)/src/share/classes + # Build the list of classes to generate stubs from. java/util/Objects.java isn't + # currently needed, but is used as a demo for now. + STUBSOURCES:=$(shell $(FIND) $(JDKS) -name "*.java" | $(GREP) \ + -e "$(JDKS)/java/util/Objects.java") + # Rewrite the file names into class names because the GenStubs tool require this. + STUBCLASSES:=$(subst /,.,$(patsubst $(JDKS)/%.java,%,$(STUBSOURCES))) + + # Now setup the build recipe for genstubs. + $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d : $(STUBSOURCES) $(BUILD_TOOLS) \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ + $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d + mkdir -p $(@D) + mkdir -p $(LANGTOOLS_OUTPUTDIR)/tmpstubs + echo $(LOG_INFO) Generating stubs from JDK sources. + ($(TOOL_GENSTUBS_CMD) -s $(LANGTOOLS_OUTPUTDIR)/tmpstubs -sourcepath $(JDKS) $(STUBCLASSES) && echo STUBS_ARE_CREATED=yes > $@) + if $(DIFF) -x "_the*" -rq $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(LANGTOOLS_OUTPUTDIR)/genstubs > /dev/null 2>&1; then \ + echo $(LOG_INFO) No changes in the stubs!; \ + rm -rf $(LANGTOOLS_OUTPUTDIR)/tmpstubs; \ + else \ + echo $(LOG_INFO) Changes in stubs detected!; \ + rm -rf $(@D); \ + mv $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(@D); \ + fi + echo STUBS_ARE_CREATED=yes > $@ + + # Trigger a generation of the genstubs java source code and a restart + # of the makefile to make sure that the following build setup use the + # newly created java files. + -include $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d + + ifeq ($(STUBS_ARE_CREATED),yes) + # Setup a compiler configuration using the intermediate javac in dist/bootstrap/lib/javac.jar + # that generates code for the new jdk that is being built. + # The code compiled by this compiler setup, cannot necessarily be run with the bootstrap jvm. + $(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE,\ + JVM:=$(JAVA),\ + JAVAC:="-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ + -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ + FLAGS:=-XDignore.symbol.file=true -Xlint:all$(COMMA)-deprecation -Werror,\ + SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ + SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) + + # javax.tools.JavaCompilerTool isn't really a suffix but this gets the file copied. + RESOURCE_SUFFIXES:=.gif .xml .css javax.tools.JavaCompilerTool + + $(eval $(call SetupJavaCompilation,BUILD_FULL_JAVAC,\ + SETUP:=GENERATE_NEWBYTECODE,\ + SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc \ + $(LANGTOOLS_OUTPUTDIR)/genstubs,\ + EXCLUDES:=java/util java/io java/nio,\ + COPY:=$(RESOURCE_SUFFIXES),\ + BIN:=$(LANGTOOLS_OUTPUTDIR)/classes)) + + $(eval $(call SetupArchive,ARCHIVE_FULL_JAVAC,$(BUILD_FULL_JAVAC),\ + SETUP:=GENERATE_NEWBYTECODE,\ + SRCS:=$(LANGTOOLS_OUTPUTDIR)/classes,\ + SUFFIXES:=.class $(RESOURCE_SUFFIXES),\ + JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar)) + + $(eval $(call SetupZipArchive,ZIP_FULL_JAVAC_SOURCE,\ + SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ + ZIP:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip)) + + all: $(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar \ + $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar + + + endif +endif diff --git a/langtools/makefiles/Makefile b/langtools/makefiles/Makefile index 2f8b4e08bc3..9539fe0e255 100644 --- a/langtools/makefiles/Makefile +++ b/langtools/makefiles/Makefile @@ -1,5 +1,5 @@ # -# Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. # # This code is free software; you can redistribute it and/or modify it @@ -23,183 +23,27 @@ # questions. # -# This must be the first rule -default: all - -include $(SPEC) -include MakeBase.gmk -include JavaCompilation.gmk - -# The BOOT_JAVAC setup uses the bootdir compiler to compile the tools -# and the bootstrap javac, to be run by the bootdir jvm. -$(eval $(call SetupJavaCompiler,BOOT_JAVAC,\ - JAVAC:=$(JAVAC),\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA),\ - FLAGS:=-XDignore.symbol.file=true -g -Xlint:all$(COMMA)-deprecation -Werror)) - -# Now setup the compilation of the properties compilation tool. You can depend -# upon $(BUILD_TOOLS) to trigger a compilation of the tools. Note that we -# add src/share/classes to the sourcepath. This is necessary since the GenStubs -# program needs to be linked and run towards the new javac sources. -$(eval $(call SetupJavaCompilation,BUILD_TOOLS,\ - SETUP:=BOOT_JAVAC,\ - DISABLE_SJAVAC:=true,\ - ADD_JAVAC_FLAGS:=-Xprefer:source,\ - SRC:=$(LANGTOOLS_TOPDIR)/make/tools $(LANGTOOLS_TOPDIR)/src/share/classes,\ - INCLUDES:=compileproperties genstubs,\ - BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses)) - -# The compileprops tools compiles a properties file into a resource bundle. -TOOL_COMPILEPROPS_CMD:=$(JAVA) -cp $(LANGTOOLS_OUTPUTDIR)/btclasses compileproperties.CompileProperties -quiet -# Lookup the properties that need to be compiled into resource bundles. -PROPSOURCES:=$(shell find $(LANGTOOLS_TOPDIR)/src/share/classes -name "*.properties") -# Strip away prefix and suffix, leaving for example only: "com/sun/tools/javac/resources/javac_zh_CN" -PROPPATHS:=$(patsubst $(LANGTOOLS_TOPDIR)/src/share/classes/%.properties,%,$(PROPSOURCES)) -# Generate the list of java files to be created. -PROPJAVAS:=$(patsubst %,$(LANGTOOLS_OUTPUTDIR)/gensrc/%.java,$(PROPPATHS)) -# Generate the package dirs for the tobe generated java files. -PROPDIRS:=$(dir $(PROPJAVAS)) -# Now generate a sequence of "-compile ...javac_zh_CN.properties ...javac_zh_CN.java java.util.ListResourceBundle" -# suitable to be fed into the CompileProperties command. -PROPCMDLINE:=$(subst _SPACE_,$(SPACE),$(join $(addprefix -compile_SPACE_,$(PROPSOURCES)), \ - $(addsuffix _SPACE_java.util.ListResourceBundle,$(addprefix _SPACE_$(LANGTOOLS_OUTPUTDIR)/gensrc/,$(addsuffix .java,$(PROPPATHS)))))) - -# Now setup the rule for the generation of the resource bundles. -$(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d : $(PROPSOURCES) $(BUILD_TOOLS) - rm -rf $(@D)/* - mkdir -p $(@D) $(PROPDIRS) - printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties - printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties - printf "jdk=$(JDK_VERSION)\nfull=$(FULL_VERSION)\nrelease=$(RELEASE)\n" > $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties - echo Compiling $(words $(PROPSOURCES) v1 v2 v3) properties into resource bundles - $(TOOL_COMPILEPROPS_CMD) $(PROPCMDLINE) \ - -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.properties \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javah/resources/version.java \ - java.util.ListResourceBundle \ - -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.properties \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javap/resources/version.java \ - java.util.ListResourceBundle \ - -compile $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.properties \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/com/sun/tools/javac/resources/version.java \ - java.util.ListResourceBundle - echo PROPS_ARE_CREATED=yes > $@ - -# Trigger the generation of the resource bundles. After the resource bundles have -# been compiled, then the makefile will restart and the newly created java files -# will become part of the build further along in the makefile. --include $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d - -ifeq ($(PROPS_ARE_CREATED),yes) - # Setup the rules to build a dist/bootstrap/lib/javac.jar, ie a smaller intermediate javac - # that can be compiled with an old javac. The intermediate javac is then used - # to compile javac again and to build the complete new jdk. - $(eval $(call SetupJavaCompilation,BUILD_BOOTSTRAP_LANGTOOLS,\ - SETUP:=BOOT_JAVAC,\ - DISABLE_SJAVAC:=true,\ - SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ - EXCLUDES:=com/sun/tools/javac/nio,\ - BIN:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ - JARMAIN:=com.sun.tools.javac.Main)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAH,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar,\ - JARMAIN:=com.sun.tools.javah.Main)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVAP,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar,\ - JARMAIN:=com.sun.tools.javap.Main)) - - $(eval $(call SetupArchive,ARCHIVE_BOOTSTRAP_JAVADOC,$(BUILD_BOOTSTRAP_LANGTOOLS),\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/btclasses/bootstrap,\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar,\ - JARMAIN:=com.sun.tools.javadoc.Main)) - - # GenStubs is used to bootstrap any dependencies from javac to the new JDK that is not - # yet built. It is currently not needed but might be again in the future. The following - # exercises the functionality to verify that it works. - TOOL_GENSTUBS_CMD=$(JAVA) \ - "-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -classpath $(LANGTOOLS_OUTPUTDIR)/btclasses \ - genstubs.GenStubs - # We fetch source from the JDK... - JDKS=$(JDK_TOPDIR)/src/share/classes - # Build the list of classes to generate stubs from. java/util/Objects.java isn't - # currently needed, but is used as a demo for now. - STUBSOURCES:=$(shell $(FIND) $(JDKS) -name "*.java" | $(GREP) \ - -e "$(JDKS)/java/util/Objects.java") - # Rewrite the file names into class names because the GenStubs tool require this. - STUBCLASSES:=$(subst /,.,$(patsubst $(JDKS)/%.java,%,$(STUBSOURCES))) - - # Now setup the build recipe for genstubs. - $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d : $(STUBSOURCES) $(BUILD_TOOLS) \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ - $(LANGTOOLS_OUTPUTDIR)/gensrc/_the_props.d - mkdir -p $(@D) - mkdir -p $(LANGTOOLS_OUTPUTDIR)/tmpstubs - echo Generating stubs from JDK sources. - ($(TOOL_GENSTUBS_CMD) -s $(LANGTOOLS_OUTPUTDIR)/tmpstubs -sourcepath $(JDKS) $(STUBCLASSES) && echo STUBS_ARE_CREATED=yes > $@) - if $(DIFF) -x "_the*" -rq $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(LANGTOOLS_OUTPUTDIR)/genstubs > /dev/null 2>&1; then \ - echo No changes in the stubs!; \ - rm -rf $(LANGTOOLS_OUTPUTDIR)/tmpstubs; \ - else \ - echo Changes in stubs detected!; \ - rm -rf $(@D); \ - mv $(LANGTOOLS_OUTPUTDIR)/tmpstubs $(@D); \ - fi - echo STUBS_ARE_CREATED=yes > $@ - - # Trigger a generation of the genstubs java source code and a restart - # of the makefile to make sure that the following build setup use the - # newly created java files. - -include $(LANGTOOLS_OUTPUTDIR)/genstubs/_the_stubs.d - - ifeq ($(STUBS_ARE_CREATED),yes) - # Setup a compiler configuration using the intermediate javac in dist/bootstrap/lib/javac.jar - # that generates code for the new jdk that is being built. - # The code compiled by this compiler setup, cannot necessarily be run with the bootstrap jvm. - $(eval $(call SetupJavaCompiler,GENERATE_NEWBYTECODE,\ - JVM:=$(JAVA),\ - JAVAC:="-Xbootclasspath/p:$(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar" \ - -jar $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar,\ - FLAGS:=-XDignore.symbol.file=true -Xlint:all$(COMMA)-deprecation -Werror,\ - SERVER_DIR:=$(SJAVAC_SERVER_DIR),\ - SERVER_JVM:=$(SJAVAC_SERVER_JAVA))) - - # javax.tools.JavaCompilerTool isn't really a suffix but this gets the file copied. - RESOURCE_SUFFIXES:=.gif .xml .css javax.tools.JavaCompilerTool - - $(eval $(call SetupJavaCompilation,BUILD_FULL_JAVAC,\ - SETUP:=GENERATE_NEWBYTECODE,\ - SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc \ - $(LANGTOOLS_OUTPUTDIR)/genstubs,\ - EXCLUDES:=java/util java/io java/nio,\ - COPY:=$(RESOURCE_SUFFIXES),\ - BIN:=$(LANGTOOLS_OUTPUTDIR)/classes)) - - $(eval $(call SetupArchive,ARCHIVE_FULL_JAVAC,$(BUILD_FULL_JAVAC),\ - SETUP:=GENERATE_NEWBYTECODE,\ - SRCS:=$(LANGTOOLS_OUTPUTDIR)/classes,\ - SUFFIXES:=.class $(RESOURCE_SUFFIXES),\ - JAR:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar)) - - $(eval $(call SetupZipArchive,ZIP_FULL_JAVAC_SOURCE,\ - SRC:=$(LANGTOOLS_TOPDIR)/src/share/classes $(LANGTOOLS_OUTPUTDIR)/gensrc,\ - ZIP:=$(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip)) - - all: $(LANGTOOLS_OUTPUTDIR)/dist/lib/classes.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/lib/src.zip \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javac.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javah.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javap.jar \ - $(LANGTOOLS_OUTPUTDIR)/dist/bootstrap/lib/javadoc.jar - - - endif +# Locate this Makefile +ifeq ($(filter /%,$(lastword $(MAKEFILE_LIST))),) + makefile_path:=$(CURDIR)/$(lastword $(MAKEFILE_LIST)) +else + makefile_path:=$(lastword $(MAKEFILE_LIST)) endif +repo_dir:=$(patsubst %/makefiles/Makefile,%,$(makefile_path)) + +# What is the name of this subsystem (langtools, corba, etc)? +subsystem_name:=$(notdir $(repo_dir)) + +# Try to locate top-level makefile +top_level_makefile:=$(repo_dir)/../common/makefiles/Makefile +ifneq ($(wildcard $(top_level_makefile)),) + $(info Will run $(subsystem_name) target on top-level Makefile) + $(info WARNING: This is a non-recommended way of building!) + $(info ===================================================) +else + $(info Cannot locate top-level Makefile. Is this repo not checked out as part of a complete forest?) + $(error Build from top-level Makefile instead) +endif + +all: + @$(MAKE) -f $(top_level_makefile) $(subsystem_name) diff --git a/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java b/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java index ad32c1a1d43..7f73936588f 100644 --- a/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java +++ b/langtools/src/share/classes/com/sun/javadoc/SerialFieldTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ package com.sun.javadoc; public interface SerialFieldTag extends Tag, Comparable { /** - * Return the serialziable field name. + * Return the serializable field name. */ public String fieldName(); diff --git a/langtools/src/share/classes/com/sun/javadoc/Tag.java b/langtools/src/share/classes/com/sun/javadoc/Tag.java index 96faac5a39d..2e129f50505 100644 --- a/langtools/src/share/classes/com/sun/javadoc/Tag.java +++ b/langtools/src/share/classes/com/sun/javadoc/Tag.java @@ -70,14 +70,14 @@ public interface Tag { * than one tag of a given kind: *

* - * - * - * - * - * - * - * - * + * + * + * + * + * + * + * + * *
kind() name()
@throws @throws
@throws @exception
@see @see
@see @link
@see @linkplain
@serial @serial
@serial @serialData
kind() name()
@throws @throws
@throws @exception
@see @see
@see @link
@see @linkplain
@serial @serial
@serial @serialData
*/ String kind(); diff --git a/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java b/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java index 66b585cf347..e6ff1aad67c 100644 --- a/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java +++ b/langtools/src/share/classes/com/sun/source/tree/CompilationUnitTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package com.sun.source.tree; import java.util.List; import javax.tools.JavaFileObject; -import com.sun.source.tree.LineMap; /** * Represents the abstract syntax tree for compilation units (source diff --git a/langtools/src/share/classes/com/sun/source/tree/Scope.java b/langtools/src/share/classes/com/sun/source/tree/Scope.java index 441f337f836..5d86fc8bf24 100644 --- a/langtools/src/share/classes/com/sun/source/tree/Scope.java +++ b/langtools/src/share/classes/com/sun/source/tree/Scope.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,9 @@ package com.sun.source.tree; -import com.sun.source.tree.Tree; import javax.lang.model.element.Element; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.TypeElement; -import javax.lang.model.type.DeclaredType; /** * Interface for determining locally available program elements, such as diff --git a/langtools/src/share/classes/com/sun/source/util/TaskEvent.java b/langtools/src/share/classes/com/sun/source/util/TaskEvent.java index 7f4514964f7..9ade21f229d 100644 --- a/langtools/src/share/classes/com/sun/source/util/TaskEvent.java +++ b/langtools/src/share/classes/com/sun/source/util/TaskEvent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.source.util; -import com.sun.source.tree.CompilationUnitTree; import javax.lang.model.element.TypeElement; import javax.tools.JavaFileObject; +import com.sun.source.tree.CompilationUnitTree; + /** * Provides details about work that has been done by the JDK Java Compiler, javac. * diff --git a/langtools/src/share/classes/com/sun/source/util/TreePath.java b/langtools/src/share/classes/com/sun/source/util/TreePath.java index 103f6240567..eef400abc2e 100644 --- a/langtools/src/share/classes/com/sun/source/util/TreePath.java +++ b/langtools/src/share/classes/com/sun/source/util/TreePath.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.source.util; -import com.sun.source.tree.*; import java.util.Iterator; +import com.sun.source.tree.*; + /** * A path of tree nodes, typically used to represent the sequence of ancestor * nodes of a tree node up to the top level CompilationUnitTree node. diff --git a/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java b/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java index 38043332030..69d034788cc 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/BootstrapMethods_attribute.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,8 +28,8 @@ package com.sun.tools.classfile; import java.io.IOException; /** - * See JVMS - * http://cr.openjdk.java.net/~jrose/pres/indy-javadoc-mlvm/ + * See JVMS 4.7.21 + * http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.21 * *

This is NOT part of any supported API. * If you write code that depends on this, you do so at your own risk. diff --git a/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java b/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java index f40a8d5e6e9..6a5bd8ccf86 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/ClassTranslator.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,8 @@ package com.sun.tools.classfile; +import java.util.Map; + import com.sun.tools.classfile.ConstantPool.CONSTANT_Class_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_Double_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_Fieldref_info; @@ -40,7 +42,6 @@ import com.sun.tools.classfile.ConstantPool.CONSTANT_NameAndType_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_String_info; import com.sun.tools.classfile.ConstantPool.CONSTANT_Utf8_info; import com.sun.tools.classfile.ConstantPool.CPInfo; -import java.util.Map; /** * Rewrites a class file using a map of translations. diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java b/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java index cffa7780350..a33964369fc 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Dependencies.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,8 +33,8 @@ import java.util.Map; import java.util.Set; import java.util.regex.Pattern; -import com.sun.tools.classfile.Dependency.Finder; import com.sun.tools.classfile.Dependency.Filter; +import com.sun.tools.classfile.Dependency.Finder; import com.sun.tools.classfile.Dependency.Location; import com.sun.tools.classfile.Type.ArrayType; import com.sun.tools.classfile.Type.ClassSigType; @@ -43,7 +43,6 @@ import com.sun.tools.classfile.Type.MethodType; import com.sun.tools.classfile.Type.SimpleType; import com.sun.tools.classfile.Type.TypeParamType; import com.sun.tools.classfile.Type.WildcardType; - import static com.sun.tools.classfile.ConstantPool.*; /** @@ -99,7 +98,7 @@ public class Dependencies { * Get the ClassFile object for a specified class. * @param className the name of the class to be returned. * @return the ClassFile for the given class - * @throws Dependencies#ClassFileNotFoundException if the classfile cannot be + * @throws Dependencies.ClassFileNotFoundException if the classfile cannot be * found */ public ClassFile getClassFile(String className) diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java b/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java index 28db3312188..7cbc3481264 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Descriptor.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -114,7 +114,7 @@ public class Descriptor { private String parse(String desc, int start, int end) throws InvalidDescriptor { int p = start; - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); int dims = 0; count = 0; diff --git a/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java b/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java index a2d36f5dc25..aafb9861994 100644 --- a/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java +++ b/langtools/src/share/classes/com/sun/tools/classfile/Instruction.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -103,7 +103,7 @@ public class Instruction { R visitConstantPoolRefAndValue(Instruction instr, int index, int value, P p); /** See {@link Kind#LOCAL}. */ R visitLocal(Instruction instr, int index, P p); - /** See {@link Kind#LOCAL_UBYTE}. */ + /** See {@link Kind#LOCAL_BYTE}. */ R visitLocalAndValue(Instruction instr, int index, int value, P p); /** See {@link Kind#DYNAMIC}. */ R visitLookupSwitch(Instruction instr, int default_, int npairs, int[] matches, int[] offsets, P p); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java index 191b392937e..6633b78dc82 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractExecutableMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Print method and constructor info. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) @@ -81,7 +86,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite * Add the summary link for the member. * * @param context the id of the context where the link will be printed - * @param classDoc the classDoc that we should link to + * @param cd the classDoc that we should link to * @param member the member being linked to * @param tdSummary the content tree to which the link will be added */ @@ -101,7 +106,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite /** * Add the inherited summary link for the member. * - * @param classDoc the classDoc that we should link to + * @param cd the classDoc that we should link to * @param member the member being linked to * @param linksTree the content tree to which the link will be added */ @@ -138,7 +143,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite * Add all the parameters for the executable member. * * @param member the member to write parameters for. - * @param tree the content tree to which the parameters information will be added. + * @param htmltree the content tree to which the parameters information will be added. */ protected void addParameters(ExecutableMemberDoc member, Content htmltree) { addParameters(member, true, htmltree); @@ -149,7 +154,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite * * @param member the member to write parameters for. * @param includeAnnotations true if annotation information needs to be added. - * @param tree the content tree to which the parameters information will be added. + * @param htmltree the content tree to which the parameters information will be added. */ protected void addParameters(ExecutableMemberDoc member, boolean includeAnnotations, Content htmltree) { @@ -276,7 +281,7 @@ public abstract class AbstractExecutableMemberWriter extends AbstractMemberWrite * @return the 1.4.x style anchor for the ExecutableMemberDoc. */ protected String getErasureAnchor(ExecutableMemberDoc emd) { - StringBuffer buf = new StringBuffer(emd.name() + "("); + StringBuilder buf = new StringBuilder(emd.name() + "("); Parameter[] params = emd.parameters(); boolean foundTypeVariable = false; for (int i = 0; i < params.length; i++) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java index 0284f8a1f9f..3db480cfcdf 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,9 @@ import java.io.*; import java.util.*; import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate Index for all the Member Names with Indexing in @@ -39,6 +39,11 @@ import com.sun.tools.doclets.internal.toolkit.*; * {@link SplitIndexWriter}. It uses the functionality from * {@link HtmlDocletWriter} to generate the Index Contents. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see IndexBuilder * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) @@ -51,32 +56,18 @@ public class AbstractIndexWriter extends HtmlDocletWriter { protected IndexBuilder indexbuilder; /** - * This constructor will be used by {@link SplitIndexWriter}. Initialises + * This constructor will be used by {@link SplitIndexWriter}. Initializes * path to this file and relative path from this file. * + * @param configuration The current configuration * @param path Path to the file which is getting generated. - * @param filename Name of the file which is getting genrated. - * @param relpath Relative path from this file to the current directory. * @param indexbuilder Unicode based Index from {@link IndexBuilder} */ protected AbstractIndexWriter(ConfigurationImpl configuration, - String path, String filename, - String relpath, IndexBuilder indexbuilder) + DocPath path, + IndexBuilder indexbuilder) throws IOException { - super(configuration, path, filename, relpath); - this.indexbuilder = indexbuilder; - } - - /** - * This Constructor will be used by {@link SingleIndexWriter}. - * - * @param filename Name of the file which is getting genrated. - * @param indexbuilder Unicode based Index form {@link IndexBuilder} - */ - protected AbstractIndexWriter(ConfigurationImpl configuration, - String filename, IndexBuilder indexbuilder) - throws IOException { - super(configuration, filename); + super(configuration, path); this.indexbuilder = indexbuilder; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java index 27ca14fab60..df2e8af8d79 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,17 +25,23 @@ package com.sun.tools.doclets.formats.html; -import java.util.*; import java.lang.reflect.Modifier; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * The base class for member writers. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (Re-write) @@ -181,23 +187,6 @@ public abstract class AbstractMemberWriter { */ protected abstract void addNavDetailLink(boolean link, Content liNav); - /*** ***/ - - protected void print(String str) { - writer.print(str); - writer.displayLength += str.length(); - } - - protected void print(char ch) { - writer.print(ch); - writer.displayLength++; - } - - protected void strong(String str) { - writer.strong(str); - writer.displayLength += str.length(); - } - /** * Add the member name to the content tree and modifies the display length. * @@ -257,7 +246,7 @@ public abstract class AbstractMemberWriter { if (len <= 0) { return ""; } - StringBuffer sb = new StringBuffer(len); + StringBuilder sb = new StringBuilder(len); for(int i = 0; i < len; i++) { sb.append(' '); } @@ -304,23 +293,6 @@ public abstract class AbstractMemberWriter { tdSummaryType.addContent(code); } - private void printModifier(ProgramElementDoc member) { - if (member.isProtected()) { - print("protected "); - } else if (member.isPrivate()) { - print("private "); - } else if (!member.isPublic()) { // Package private - writer.printText("doclet.Package_private"); - print(" "); - } - if (member.isMethod() && ((MethodDoc)member).isAbstract()) { - print("abstract "); - } - if (member.isStatic()) { - print("static"); - } - } - /** * Add the modifier for the member. * @@ -364,7 +336,7 @@ public abstract class AbstractMemberWriter { * Add the comment for the given member. * * @param member the member being documented. - * @param contentTree the content tree to which the comment will be added. + * @param htmltree the content tree to which the comment will be added. */ protected void addComment(ProgramElementDoc member, Content htmltree) { if (member.inlineTags().length > 0) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java index ef407dfb206..0a75cca2329 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractPackageIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,15 +27,22 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.DocPath; /** * Abstract class to generate the overview files in * Frame and Non-Frame format. This will be sub-classed by to * generate overview-frame.html as well as overview-summary.html. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ @@ -47,14 +54,14 @@ public abstract class AbstractPackageIndexWriter extends HtmlDocletWriter { protected PackageDoc[] packages; /** - * Constructor. Also initialises the packages variable. + * Constructor. Also initializes the packages variable. * + * @param configuration The current configuration * @param filename Name of the package index file to be generated. */ public AbstractPackageIndexWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); - this.relativepathNoSlash = "."; packages = configuration.packages; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java index 2b1b352942c..63786f474f0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AbstractTreeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.formats.html.markup.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Abstract class to print the class hierarchy page for all the Classes. This @@ -38,6 +39,11 @@ import com.sun.javadoc.*; * generate the Package Tree and global Tree(for all the classes and packages) * pages. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar */ public abstract class AbstractTreeWriter extends HtmlDocletWriter { @@ -50,45 +56,22 @@ public abstract class AbstractTreeWriter extends HtmlDocletWriter { private static final String LI_CIRCLE = "circle"; /** - * Constructor initilises classtree variable. This constructor will be used + * Constructor initializes classtree variable. This constructor will be used * while generating global tree file "overview-tree.html". * + * @param configuration The current configuration * @param filename File to be generated. * @param classtree Tree built by {@link ClassTree}. * @throws IOException * @throws DocletAbortException */ protected AbstractTreeWriter(ConfigurationImpl configuration, - String filename, ClassTree classtree) + DocPath filename, ClassTree classtree) throws IOException { super(configuration, filename); this.classtree = classtree; } - /** - * Create appropriate directory for the package and also initilise the - * relative path from this generated file to the current or - * the destination directory. This constructor will be used while - * generating "package tree" file. - * - * @param path Directories in this path will be created if they are not - * already there. - * @param filename Name of the package tree file to be generated. - * @param classtree The tree built using {@link ClassTree}. - * for the package pkg. - * @param pkg PackageDoc for which tree file will be generated. - * @throws IOException - * @throws DocletAbortException - */ - protected AbstractTreeWriter(ConfigurationImpl configuration, - String path, String filename, - ClassTree classtree, PackageDoc pkg) - throws IOException { - super(configuration, - path, filename, DirectoryManager.getRelativePath(pkg.name())); - this.classtree = classtree; - } - /** * Add each level of the class tree. For each sub-class or * sub-interface indents the next level information. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java index b68af0445cc..af0f4a24f81 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AllClassesFrameWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,9 @@ import java.io.*; import java.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Generate the file with list of all the classes in this run. This page will be @@ -39,22 +39,17 @@ import com.sun.tools.doclets.formats.html.markup.*; * the left-hand top frame. The name of the generated file is * "allclasses-frame.html". * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar * @author Doug Kramer * @author Bhavesh Patel (Modified) */ public class AllClassesFrameWriter extends HtmlDocletWriter { - /** - * The name of the output file with frames - */ - public static final String OUTPUT_FILE_NAME_FRAMES = "allclasses-frame.html"; - - /** - * The name of the output file without frames - */ - public static final String OUTPUT_FILE_NAME_NOFRAMES = "allclasses-noframe.html"; - /** * Index of all the classes. */ @@ -66,13 +61,16 @@ public class AllClassesFrameWriter extends HtmlDocletWriter { final HtmlTree BR = new HtmlTree(HtmlTag.BR); /** - * Construct AllClassesFrameWriter object. Also initilises the indexbuilder + * Construct AllClassesFrameWriter object. Also initializes the indexbuilder * variable in this class. + * @param configuration The current configuration + * @param filename Path to the file which is getting generated. + * @param indexbuilder Unicode based Index from {@link IndexBuilder} * @throws IOException * @throws DocletAbortException */ public AllClassesFrameWriter(ConfigurationImpl configuration, - String filename, IndexBuilder indexbuilder) + DocPath filename, IndexBuilder indexbuilder) throws IOException { super(configuration, filename); this.indexbuilder = indexbuilder; @@ -89,13 +87,13 @@ public class AllClassesFrameWriter extends HtmlDocletWriter { public static void generate(ConfigurationImpl configuration, IndexBuilder indexbuilder) { AllClassesFrameWriter allclassgen; - String filename = OUTPUT_FILE_NAME_FRAMES; + DocPath filename = DocPaths.ALLCLASSES_FRAME; try { allclassgen = new AllClassesFrameWriter(configuration, filename, indexbuilder); allclassgen.buildAllClassesFile(true); allclassgen.close(); - filename = OUTPUT_FILE_NAME_NOFRAMES; + filename = DocPaths.ALLCLASSES_NOFRAME; allclassgen = new AllClassesFrameWriter(configuration, filename, indexbuilder); allclassgen.buildAllClassesFile(false); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java index 77f23279071..03e04e79946 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeOptionalMemberWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.*; /** * Writes annotation type optional member documentation in HTML format. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) */ @@ -136,7 +141,7 @@ public class AnnotationTypeOptionalMemberWriterImpl extends */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", "annotation_type_optional_element_summary", + return writer.getHyperLink("annotation_type_optional_element_summary", writer.getResource("doclet.navAnnotationTypeOptionalMember")); } else { return writer.getResource("doclet.navAnnotationTypeOptionalMember"); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java index f2418e5143d..2fe1f662c1e 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeRequiredMemberWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.*; /** * Writes annotation type required member documentation in HTML format. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) */ @@ -255,7 +260,7 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", "annotation_type_required_element_summary", + return writer.getHyperLink("annotation_type_required_element_summary", writer.getResource("doclet.navAnnotationTypeRequiredMember")); } else { return writer.getResource("doclet.navAnnotationTypeRequiredMember"); @@ -267,7 +272,7 @@ public class AnnotationTypeRequiredMemberWriterImpl extends AbstractMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "annotation_type_element_detail", + liNav.addContent(writer.getHyperLink("annotation_type_element_detail", writer.getResource("doclet.navAnnotationTypeMember"))); } else { liNav.addContent(writer.getResource("doclet.navAnnotationTypeMember")); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java index 83886defa9c..636522e0cc3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/AnnotationTypeWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,22 @@ package com.sun.tools.doclets.formats.html; +import java.io.IOException; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.builders.*; import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.builders.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Class Information Page. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see com.sun.javadoc.ClassDoc * @see java.util.Collections * @see java.util.List @@ -57,13 +65,10 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @param prevType the previous class that was documented. * @param nextType the next class being documented. */ - public AnnotationTypeWriterImpl (AnnotationTypeDoc annotationType, + public AnnotationTypeWriterImpl(AnnotationTypeDoc annotationType, Type prevType, Type nextType) - throws Exception { - super(ConfigurationImpl.getInstance(), - DirectoryManager.getDirectoryPath(annotationType.containingPackage()), - annotationType.name() + ".html", - DirectoryManager.getRelativePath(annotationType.containingPackage().name())); + throws Exception { + super(ConfigurationImpl.getInstance(), DocPath.forClass(annotationType)); this.annotationType = annotationType; configuration.currentcd = annotationType.asClassDoc(); this.prev = prevType; @@ -76,7 +81,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -98,7 +103,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink("class-use/" + filename, "", useLabel); + Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -187,7 +192,7 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter /** * {@inheritDoc} */ - public void printDocument(Content contentTree) { + public void printDocument(Content contentTree) throws IOException { printHtmlDocument(configuration.metakeywords.getMetaKeywords(annotationType), true, contentTree); } @@ -281,8 +286,8 @@ public class AnnotationTypeWriterImpl extends SubWriterHolderWriter * {@inheritDoc} */ protected Content getNavLinkTree() { - Content treeLinkContent = getHyperLink("package-tree.html", - "", treeLabel, "", ""); + Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, + treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java index d0cea943d6a..5f8001b6fb4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassUseWriter.java @@ -27,14 +27,20 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate class usage information. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert G. Field * @author Bhavesh Patel (Modified) */ @@ -76,7 +82,6 @@ public class ClassUseWriter extends SubWriterHolderWriter { final String methodUseTableSummary; final String constructorUseTableSummary; - /** * Constructor. * @@ -85,10 +90,9 @@ public class ClassUseWriter extends SubWriterHolderWriter { * @throws DocletAbortException */ public ClassUseWriter(ConfigurationImpl configuration, - ClassUseMapper mapper, String path, - String filename, String relpath, + ClassUseMapper mapper, DocPath filename, ClassDoc classdoc) throws IOException { - super(configuration, path, filename, relpath); + super(configuration, filename); this.classdoc = classdoc; if (mapper.classToPackageAnnotations.containsKey(classdoc.qualifiedName())) pkgToPackageAnnotations = new HashSet(mapper.classToPackageAnnotations.get(classdoc.qualifiedName())); @@ -193,23 +197,19 @@ public class ClassUseWriter extends SubWriterHolderWriter { public static void generate(ConfigurationImpl configuration, ClassUseMapper mapper, ClassDoc classdoc) { ClassUseWriter clsgen; - String path = DirectoryManager.getDirectoryPath(classdoc. - containingPackage()); - path += "class-use" + DirectoryManager.URL_FILE_SEPARATOR; - String filename = classdoc.name() + ".html"; - String pkgname = classdoc.containingPackage().name(); - pkgname += (pkgname.length() > 0)? ".class-use": "class-use"; - String relpath = DirectoryManager.getRelativePath(pkgname); + DocPath path = DocPath.forPackage(classdoc) + .resolve(DocPaths.CLASS_USE) + .resolve(DocPath.forName(classdoc)); try { clsgen = new ClassUseWriter(configuration, - mapper, path, filename, - relpath, classdoc); + mapper, path, + classdoc); clsgen.generateClassUseFile(); clsgen.close(); } catch (IOException exc) { configuration.standardmessage. error("doclet.exception_encountered", - exc.toString(), filename); + exc.toString(), path.getPath()); throw new DocletAbortException(); } } @@ -353,7 +353,7 @@ public class ClassUseWriter extends SubWriterHolderWriter { */ protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException { Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, - getHyperLink("", pkg.name(), new StringContent(Util.getPackageName(pkg)))); + getHyperLink(pkg.name(), new StringContent(Util.getPackageName(pkg)))); contentTree.addContent(tdFirst); HtmlTree tdLast = new HtmlTree(HtmlTag.TD); tdLast.addStyle(HtmlStyle.colLast); @@ -464,8 +464,8 @@ public class ClassUseWriter extends SubWriterHolderWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("../package-summary.html", "", - packageLabel); + Content linkContent = + getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_SUMMARY), packageLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -500,8 +500,8 @@ public class ClassUseWriter extends SubWriterHolderWriter { */ protected Content getNavLinkTree() { Content linkContent = classdoc.containingPackage().isIncluded() ? - getHyperLink("../package-tree.html", "", treeLabel) : - getHyperLink(relativePath + "overview-tree.html", "", treeLabel); + getHyperLink(DocPath.parent.resolve(DocPaths.PACKAGE_TREE), treeLabel) : + getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), treeLabel); Content li = HtmlTree.LI(linkContent); return li; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java index cc8411ee7cd..78d8ca88b2c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ClassWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,17 +25,24 @@ package com.sun.tools.doclets.formats.html; +import java.io.IOException; import java.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.builders.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Class Information Page. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see com.sun.javadoc.ClassDoc * @see java.util.Collections * @see java.util.List @@ -65,11 +72,8 @@ public class ClassWriterImpl extends SubWriterHolderWriter */ public ClassWriterImpl (ClassDoc classDoc, ClassDoc prevClass, ClassDoc nextClass, ClassTree classTree) - throws Exception { - super(ConfigurationImpl.getInstance(), - DirectoryManager.getDirectoryPath(classDoc.containingPackage()), - classDoc.name() + ".html", - DirectoryManager.getRelativePath(classDoc.containingPackage().name())); + throws Exception { + super(ConfigurationImpl.getInstance(), DocPath.forClass(classDoc)); this.classDoc = classDoc; configuration.currentcd = classDoc; this.classtree = classTree; @@ -83,7 +87,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -105,7 +109,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content linkContent = getHyperLink("class-use/" + filename, "", useLabel); + Content linkContent = getHyperLink(DocPaths.CLASS_USE.resolve(filename), useLabel); Content li = HtmlTree.LI(linkContent); return li; } @@ -196,7 +200,7 @@ public class ClassWriterImpl extends SubWriterHolderWriter /** * {@inheritDoc} */ - public void printDocument(Content contentTree) { + public void printDocument(Content contentTree) throws IOException { printHtmlDocument(configuration.metakeywords.getMetaKeywords(classDoc), true, contentTree); } @@ -560,8 +564,8 @@ public class ClassWriterImpl extends SubWriterHolderWriter * {@inheritDoc} */ protected Content getNavLinkTree() { - Content treeLinkContent = getHyperLink("package-tree.html", - "", treeLabel, "", ""); + Content treeLinkContent = getHyperLink(DocPaths.PACKAGE_TREE, + treeLabel, "", ""); Content li = HtmlTree.LI(treeLinkContent); return li; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java index 7985d9341dd..fb6966b890a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConfigurationImpl.java @@ -25,13 +25,12 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; +import java.net.*; +import java.util.*; import com.sun.javadoc.*; -import java.util.*; -import java.io.*; -import java.net.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Configure the output based on the command line options. @@ -46,6 +45,11 @@ import java.net.*; * use "-helpfile" option when already "-nohelp" option is used. *

* + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field. * @author Atul Dambalkar. * @author Jamie Ho @@ -61,11 +65,6 @@ public class ConfigurationImpl extends Configuration { */ public static final String BUILD_DATE = System.getProperty("java.version"); - /** - * The name of the constant values file. - */ - public static final String CONSTANTS_FILE_NAME = "constant-values.html"; - /** * Argument for command line option "-header". */ @@ -179,7 +178,7 @@ public class ConfigurationImpl extends Configuration { * First file to appear in the right-hand frame in the generated * documentation. */ - public String topFile = ""; + public DocPath topFile = DocPath.empty; /** * The classdoc for the class file getting generated. @@ -188,8 +187,8 @@ public class ConfigurationImpl extends Configuration { // ClassWriter. /** - * Constructor. Initialises resource for the - * {@link com.sun.tools.doclets.MessageRetriever}. + * Constructor. Initializes resource for the + * {@link com.sun.tools.doclets.internal.toolkit.util.MessageRetriever MessageRetriever}. */ private ConfigurationImpl() { standardmessage = new MessageRetriever(this, @@ -367,7 +366,7 @@ public class ConfigurationImpl extends Configuration { "-helpfile")); return false; } - File help = new File(os[1]); + DocFile help = DocFile.createFileForInput(this, os[1]); if (!help.exists()) { reporter.printError(getText("doclet.File_not_found", os[1])); return false; @@ -447,18 +446,17 @@ public class ConfigurationImpl extends Configuration { return; } if (createoverview) { - topFile = "overview-summary.html"; + topFile = DocPaths.OVERVIEW_SUMMARY; } else { if (packages.length == 1 && packages[0].name().equals("")) { if (root.classes().length > 0) { ClassDoc[] classarr = root.classes(); Arrays.sort(classarr); ClassDoc cd = getValidClass(classarr); - topFile = DirectoryManager.getPathToClass(cd); + topFile = DocPath.forClass(cd); } } else { - topFile = DirectoryManager.getPathToPackage(packages[0], - "package-summary.html"); + topFile = DocPath.forPackage(packages[0]).resolve(DocPaths.PACKAGE_SUMMARY); } } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java index 4d38ad9778c..ec98f180410 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstantsSummaryWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,14 +27,20 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Write the Constants Summary Page in HTML format. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) * @since 1.4 @@ -63,7 +69,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter */ public ConstantsSummaryWriterImpl(ConfigurationImpl configuration) throws IOException { - super(configuration, ConfigurationImpl.CONSTANTS_FILE_NAME); + super(configuration, DocPaths.CONSTANT_VALUES); this.configuration = configuration; constantsTableSummary = configuration.getText("doclet.Constants_Table_Summary", configuration.getText("doclet.Constants_Summary")); @@ -101,13 +107,13 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter //add link to summary Content link; if (packageName.length() == 0) { - link = getHyperLink("#" + DocletConstants.UNNAMED_PACKAGE_ANCHOR, - "", defaultPackageLabel, "", ""); + link = getHyperLink(DocLink.fragment(DocletConstants.UNNAMED_PACKAGE_ANCHOR), + defaultPackageLabel, "", ""); } else { Content packageNameContent = getPackageLabel(parsedPackageName); packageNameContent.addContent(".*"); - link = getHyperLink("#" + parsedPackageName, - "", packageNameContent, "", ""); + link = getHyperLink(DocLink.fragment(parsedPackageName), + packageNameContent, "", ""); printedPackageHeaders.add(parsedPackageName); } contentListTree.addContent(HtmlTree.LI(link)); @@ -297,7 +303,7 @@ public class ConstantsSummaryWriterImpl extends HtmlDocletWriter /** * {@inheritDoc} */ - public void printDocument(Content contentTree) { + public void printDocument(Content contentTree) throws IOException { printHtmlDocument(null, true, contentTree); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java index 6db2b0d23c3..6e2a5ec5284 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/ConstructorWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes constructor documentation. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) @@ -275,7 +280,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", "constructor_summary", + return writer.getHyperLink("constructor_summary", writer.getResource("doclet.navConstructor")); } else { return writer.getResource("doclet.navConstructor"); @@ -287,7 +292,7 @@ public class ConstructorWriterImpl extends AbstractExecutableMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "constructor_detail", + liNav.addContent(writer.getHyperLink("constructor_detail", writer.getResource("doclet.navConstructor"))); } else { liNav.addContent(writer.getResource("doclet.navConstructor")); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java index ed9805b58c1..bb989452b85 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/DeprecatedListWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,15 +26,20 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.DeprecatedAPIListBuilder; -import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate File to list all the deprecated classes and class members with the * appropriate links. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see java.util.List * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) @@ -90,7 +95,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { * @param filename the file to be generated. */ public DeprecatedListWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); this.configuration = configuration; NestedClassWriterImpl classW = new NestedClassWriterImpl(this); @@ -111,7 +116,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { * @param configuration the current configuration of the doclet. */ public static void generate(ConfigurationImpl configuration) { - String filename = "deprecated-list.html"; + DocPath filename = DocPaths.DEPRECATED_LIST; try { DeprecatedListWriter depr = new DeprecatedListWriter(configuration, filename); @@ -175,7 +180,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { private void addIndexLink(DeprecatedAPIListBuilder builder, int type, Content contentTree) { if (builder.hasDocumentation(type)) { - Content li = HtmlTree.LI(getHyperLink("#" + ANCHORS[type], + Content li = HtmlTree.LI(getHyperLink(ANCHORS[type], getResource(HEADING_KEYS[type]))); contentTree.addContent(li); } @@ -208,7 +213,7 @@ public class DeprecatedListWriter extends SubWriterHolderWriter { * * @param builder the deprecated list builder * @param type the type of list being documented - * @param contentTree the content tree to which the anchor will be added + * @param htmlTree the content tree to which the anchor will be added */ private void addAnchor(DeprecatedAPIListBuilder builder, int type, Content htmlTree) { if (builder.hasDocumentation(type)) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java index f567aae7ae1..b06255ad9a6 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/EnumConstantWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes enum constant documentation in HTML format. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @author Bhavesh Patel (Modified) */ @@ -258,7 +263,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null)? + return writer.getHyperLink((cd == null)? "enum_constant_summary": "enum_constants_inherited_from_class_" + configuration().getClassName(cd), @@ -273,7 +278,7 @@ public class EnumConstantWriterImpl extends AbstractMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "enum_constant_detail", + liNav.addContent(writer.getHyperLink("enum_constant_detail", writer.getResource("doclet.navEnum"))); } else { liNav.addContent(writer.getResource("doclet.navEnum")); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java index ed442aaf731..10f076a08af 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FieldWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes field documentation in HTML format. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (rewrite) @@ -288,7 +293,7 @@ public class FieldWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null)? + return writer.getHyperLink((cd == null)? "field_summary": "fields_inherited_from_class_" + configuration().getClassName(cd), @@ -303,7 +308,7 @@ public class FieldWriterImpl extends AbstractMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "field_detail", + liNav.addContent(writer.getHyperLink("field_detail", writer.getResource("doclet.navField"))); } else { liNav.addContent(writer.getResource("doclet.navField")); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java index 1d7ac273338..6a39cedee6d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/FrameOutputWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,9 +26,10 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the documentation in the Html "frame" format in the browser. The @@ -40,6 +41,11 @@ import com.sun.tools.doclets.formats.html.markup.*; * right-hand frame will have overview or package summary or class file. Also * take care of browsers which do not support Html frames. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar */ public class FrameOutputWriter extends HtmlDocletWriter { @@ -57,7 +63,7 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param filename File to be generated. */ public FrameOutputWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); noOfPackages = configuration.packages.length; } @@ -71,9 +77,9 @@ public class FrameOutputWriter extends HtmlDocletWriter { */ public static void generate(ConfigurationImpl configuration) { FrameOutputWriter framegen; - String filename = ""; + DocPath filename = DocPath.empty; try { - filename = "index.html"; + filename = DocPaths.INDEX; framegen = new FrameOutputWriter(configuration, filename); framegen.generateFrameFile(); framegen.close(); @@ -86,10 +92,10 @@ public class FrameOutputWriter extends HtmlDocletWriter { } /** - * Generate the contants in the "index.html" file. Print the frame details + * Generate the constants in the "index.html" file. Print the frame details * as well as warning if browser is not supporting the Html frames. */ - protected void generateFrameFile() { + protected void generateFrameFile() throws IOException { Content frameset = getFrameDetails(); if (configuration.windowtitle.length() > 0) { printFramesetDocument(configuration.windowtitle, configuration.notimestamp, @@ -149,8 +155,8 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param contentTree the content tree to which the information will be added */ private void addAllPackagesFrameTag(Content contentTree) { - HtmlTree frame = HtmlTree.FRAME("overview-frame.html", "packageListFrame", - configuration.getText("doclet.All_Packages")); + HtmlTree frame = HtmlTree.FRAME(DocPaths.OVERVIEW_FRAME.getPath(), + "packageListFrame", configuration.getText("doclet.All_Packages")); contentTree.addContent(frame); } @@ -160,8 +166,8 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param contentTree the content tree to which the information will be added */ private void addAllClassesFrameTag(Content contentTree) { - HtmlTree frame = HtmlTree.FRAME("allclasses-frame.html", "packageFrame", - configuration.getText("doclet.All_classes_and_interfaces")); + HtmlTree frame = HtmlTree.FRAME(DocPaths.ALLCLASSES_FRAME.getPath(), + "packageFrame", configuration.getText("doclet.All_classes_and_interfaces")); contentTree.addContent(frame); } @@ -171,7 +177,7 @@ public class FrameOutputWriter extends HtmlDocletWriter { * @param contentTree the content tree to which the information will be added */ private void addClassFrameTag(Content contentTree) { - HtmlTree frame = HtmlTree.FRAME(configuration.topFile, "classFrame", + HtmlTree frame = HtmlTree.FRAME(configuration.topFile.getPath(), "classFrame", configuration.getText("doclet.Package_class_and_interface_descriptions"), SCROLL_YES); contentTree.addContent(frame); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java index 7f15c842276..9d14671f3d2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HelpWriter.java @@ -26,14 +26,20 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate the Help File for the generated API documentation. The help file * contents are helpful for browsing the generated documentation. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar */ public class HelpWriter extends HtmlDocletWriter { @@ -43,7 +49,7 @@ public class HelpWriter extends HtmlDocletWriter { * @param filename File to be generated. */ public HelpWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); } @@ -56,9 +62,9 @@ public class HelpWriter extends HtmlDocletWriter { */ public static void generate(ConfigurationImpl configuration) { HelpWriter helpgen; - String filename = ""; + DocPath filename = DocPath.empty; try { - filename = "help-doc.html"; + filename = DocPaths.HELP_DOC; helpgen = new HelpWriter(configuration, filename); helpgen.generateHelpFile(); helpgen.close(); @@ -73,7 +79,7 @@ public class HelpWriter extends HtmlDocletWriter { /** * Generate the help file contents. */ - protected void generateHelpFile() { + protected void generateHelpFile() throws IOException { String title = configuration.getText("doclet.Window_Help_title"); Content body = getBody(true, getWindowTitle(title)); addTop(body); @@ -107,7 +113,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Overview")); Content liOverview = HtmlTree.LI(HtmlStyle.blockList, overviewHeading); Content line3 = getResource("doclet.Help_line_3", - getHyperLinkString("overview-summary.html", + getHyperLinkString(DocPaths.OVERVIEW_SUMMARY, configuration.getText("doclet.Overview"))); Content overviewPara = HtmlTree.P(line3); liOverview.addContent(overviewPara); @@ -228,7 +234,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Help_line_16")); Content liTree = HtmlTree.LI(HtmlStyle.blockList, treeHead); Content line17 = getResource("doclet.Help_line_17_with_tree_link", - getHyperLinkString("overview-tree.html", + getHyperLinkString(DocPaths.OVERVIEW_TREE, configuration.getText("doclet.Class_Hierarchy"))); Content treePara = HtmlTree.P(line17); liTree.addContent(treePara); @@ -246,7 +252,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Deprecated_API")); Content liDeprecated = HtmlTree.LI(HtmlStyle.blockList, dHead); Content line20 = getResource("doclet.Help_line_20_with_deprecated_api_link", - getHyperLinkString("deprecated-list.html", + getHyperLinkString(DocPaths.DEPRECATED_LIST, configuration.getText("doclet.Deprecated_API"))); Content dPara = HtmlTree.P(line20); liDeprecated.addContent(dPara); @@ -255,10 +261,10 @@ public class HelpWriter extends HtmlDocletWriter { if (configuration.createindex) { String indexlink; if (configuration.splitindex) { - indexlink = getHyperLinkString("index-files/index-1.html", + indexlink = getHyperLinkString(DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)), configuration.getText("doclet.Index")); } else { - indexlink = getHyperLinkString("index-all.html", + indexlink = getHyperLinkString(DocPaths.INDEX_ALL, configuration.getText("doclet.Index")); } Content indexHead = HtmlTree.HEADING(HtmlConstants.CONTENT_HEADING, @@ -287,7 +293,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.All_Classes")); Content liAllClasses = HtmlTree.LI(HtmlStyle.blockList, allclassesHead); Content line27 = getResource("doclet.Help_line_27", - getHyperLinkString("allclasses-noframe.html", + getHyperLinkString(DocPaths.ALLCLASSES_NOFRAME, configuration.getText("doclet.All_Classes"))); Content allclassesPara = HtmlTree.P(line27); liAllClasses.addContent(allclassesPara); @@ -303,7 +309,7 @@ public class HelpWriter extends HtmlDocletWriter { getResource("doclet.Constants_Summary")); Content liConst = HtmlTree.LI(HtmlStyle.blockList, constHead); Content line29 = getResource("doclet.Help_line_29", - getHyperLinkString("constant-values.html", + getHyperLinkString(DocPaths.CONSTANT_VALUES, configuration.getText("doclet.Constants_Summary"))); Content constPara = HtmlTree.P(line29); liConst.addContent(constPara); @@ -319,6 +325,7 @@ public class HelpWriter extends HtmlDocletWriter { * * @return a content tree for the help label */ + @Override protected Content getNavLinkHelp() { Content li = HtmlTree.LI(HtmlStyle.navBarCell1Rev, helpLabel); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java index 89af9ab5d80..6a9f691cedd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDoclet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,17 +24,22 @@ */ package com.sun.tools.doclets.formats.html; +import java.io.*; +import java.util.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.builders.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; - /** * The class with "start" method, calls individual Writers. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar * @author Robert Field * @author Jamie Ho @@ -89,31 +94,22 @@ public class HtmlDoclet extends AbstractDoclet { throws Exception { super.generateOtherFiles(root, classtree); if (configuration.linksource) { - if (configuration.destDirName.length() > 0) { - SourceToHTMLConverter.convertRoot(configuration, - root, configuration.destDirName + File.separator - + DocletConstants.SOURCE_OUTPUT_DIR_NAME); - } else { - SourceToHTMLConverter.convertRoot(configuration, - root, DocletConstants.SOURCE_OUTPUT_DIR_NAME); - } + SourceToHTMLConverter.convertRoot(configuration, + root, DocPaths.SOURCE_OUTPUT); } - if (configuration.topFile.length() == 0) { + if (configuration.topFile.isEmpty()) { configuration.standardmessage. error("doclet.No_Non_Deprecated_Classes_To_Document"); return; } boolean nodeprecated = configuration.nodeprecated; - String configdestdir = configuration.destDirName; - String confighelpfile = configuration.helpfile; - String configstylefile = configuration.stylesheetfile; - performCopy(configdestdir, confighelpfile); - performCopy(configdestdir, configstylefile); - Util.copyResourceFile(configuration, "background.gif", false); - Util.copyResourceFile(configuration, "tab.gif", false); - Util.copyResourceFile(configuration, "titlebar.gif", false); - Util.copyResourceFile(configuration, "titlebar_end.gif", false); + performCopy(configuration.helpfile); + performCopy(configuration.stylesheetfile); + copyResourceFile("background.gif"); + copyResourceFile("tab.gif"); + copyResourceFile("titlebar.gif"); + copyResourceFile("titlebar_end.gif"); // do early to reduce memory footprint if (configuration.classuse) { ClassUseWriter.generate(configuration, classtree); @@ -150,9 +146,8 @@ public class HtmlDoclet extends AbstractDoclet { // If a stylesheet file is not specified, copy the default stylesheet // and replace newline with platform-specific newline. if (configuration.stylesheetfile.length() == 0) { - Util.copyFile(configuration, "stylesheet.css", Util.RESOURCESDIR, - (configdestdir.isEmpty()) ? - System.getProperty("user.dir") : configdestdir, false, true); + DocFile f = DocFile.createFileForOutput(configuration, DocPaths.STYLESHEET); + f.copyResource(DocPaths.RESOURCES.resolve(DocPaths.STYLESHEET), false, true); } } @@ -253,29 +248,33 @@ public class HtmlDoclet extends AbstractDoclet { return (ConfigurationImpl.getInstance()).validOptions(options, reporter); } - private void performCopy(String configdestdir, String filename) { + /** + * Copy a file in the resources directory to the destination directory. + * @param resource The name of the resource file to copy + */ + private void copyResourceFile(String resource) { + DocPath p = DocPaths.RESOURCES.resolve(resource); + DocFile f = DocFile.createFileForOutput(configuration, p); + f.copyResource(p, false, false); + } + + private void performCopy(String filename) { + if (filename.isEmpty()) + return; + try { - String destdir = (configdestdir.length() > 0) ? - configdestdir + File.separatorChar: ""; - if (filename.length() > 0) { - File helpstylefile = new File(filename); - String parent = helpstylefile.getParent(); - String helpstylefilename = (parent == null)? - filename: - filename.substring(parent.length() + 1); - File desthelpfile = new File(destdir + helpstylefilename); - if (!desthelpfile.getCanonicalPath().equals( - helpstylefile.getCanonicalPath())) { - configuration.message. - notice((SourcePosition) null, - "doclet.Copying_File_0_To_File_1", - helpstylefile.toString(), desthelpfile.toString()); - Util.copyFile(desthelpfile, helpstylefile); - } - } + DocFile fromfile = DocFile.createFileForInput(configuration, filename); + DocPath path = DocPath.create(fromfile.getName()); + DocFile toFile = DocFile.createFileForOutput(configuration, path); + if (toFile.isSameFile(fromfile)) + return; + + configuration.message.notice((SourcePosition) null, + "doclet.Copying_File_0_To_File_1", + fromfile.toString(), path.getPath()); + toFile.copyFile(fromfile); } catch (IOException exc) { - configuration.message. - error((SourcePosition) null, + configuration.message.error((SourcePosition) null, "doclet.perform_copy_exception_encountered", exc.toString()); throw new DocletAbortException(); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java index 59d776106d1..0531db15abd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlDocletWriter.java @@ -32,14 +32,19 @@ import java.util.*; import com.sun.javadoc.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for the Html Format Code Generation specific to JavaDoc. * This Class contains methods related to the Html Code Generation which * are used extensively while generating the entire documentation. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Atul M Dambalkar * @author Robert Field @@ -50,32 +55,24 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Relative path from the file getting generated to the destination * directory. For example, if the file getting generated is - * "java/lang/Object.html", then the relative path string is "../../". + * "java/lang/Object.html", then the path to the root is "../..". * This string can be empty if the file getting generated is in * the destination directory. */ - public String relativePath = ""; + public final DocPath pathToRoot; /** - * Same as relativepath, but normalized to never be empty or - * end with a slash. - */ - public String relativepathNoSlash = ""; - - /** - * Platform-dependent directory path from the current or the + * Platform-independent path from the current or the * destination directory to the file getting generated. * Used when creating the file. - * For example, if the file getting generated is - * "java/lang/Object.html", then the path string is "java/lang". */ - public String path = ""; + public final DocPath path; /** * Name of the file getting generated. If the file getting generated is * "java/lang/Object.html", then the filename is "Object.html". */ - public String filename = ""; + public final DocPath filename; /** * The display length used for indentation while generating the class page. @@ -95,33 +92,15 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Constructor to construct the HtmlStandardWriter object. * - * @param filename File to be generated. + * @param path File to be generated. */ - public HtmlDocletWriter(ConfigurationImpl configuration, - String filename) throws IOException { - super(configuration, filename); - this.configuration = configuration; - this.filename = filename; - } - - /** - * Constructor to construct the HtmlStandardWriter object. - * - * @param path Platform-dependent {@link #path} used when - * creating file. - * @param filename Name of file to be generated. - * @param relativePath Value for the variable {@link #relativePath}. - */ - public HtmlDocletWriter(ConfigurationImpl configuration, - String path, String filename, - String relativePath) throws IOException { - super(configuration, path, filename); + public HtmlDocletWriter(ConfigurationImpl configuration, DocPath path) + throws IOException { + super(configuration, path); this.configuration = configuration; this.path = path; - this.relativePath = relativePath; - this.relativepathNoSlash = - DirectoryManager.getPathNoTrailingSlash(this.relativePath); - this.filename = filename; + this.pathToRoot = path.parent().invert(); + this.filename = path.basename(); } /** @@ -160,8 +139,9 @@ public class HtmlDocletWriter extends HtmlDocWriter { int previndex = 0; while (true) { if (configuration.docrootparent.length() > 0) { + final String docroot_parent = "{@docroot}/.."; // Search for lowercase version of {@docRoot}/.. - index = lowerHtml.indexOf("{@docroot}/..", previndex); + index = lowerHtml.indexOf(docroot_parent, previndex); // If next {@docRoot}/.. pattern not found, append rest of htmlstr and exit loop if (index < 0) { buf.append(htmlstr.substring(previndex)); @@ -169,17 +149,18 @@ public class HtmlDocletWriter extends HtmlDocWriter { } // If next {@docroot}/.. pattern found, append htmlstr up to start of tag buf.append(htmlstr.substring(previndex, index)); - previndex = index + 13; // length for {@docroot}/.. string + previndex = index + docroot_parent.length(); // Insert docrootparent absolute path where {@docRoot}/.. was located buf.append(configuration.docrootparent); // Append slash if next character is not a slash if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') { - buf.append(DirectoryManager.URL_FILE_SEPARATOR); + buf.append('/'); } } else { + final String docroot = "{@docroot}"; // Search for lowercase version of {@docRoot} - index = lowerHtml.indexOf("{@docroot}", previndex); + index = lowerHtml.indexOf(docroot, previndex); // If next {@docRoot} tag not found, append rest of htmlstr and exit loop if (index < 0) { buf.append(htmlstr.substring(previndex)); @@ -187,46 +168,18 @@ public class HtmlDocletWriter extends HtmlDocWriter { } // If next {@docroot} tag found, append htmlstr up to start of tag buf.append(htmlstr.substring(previndex, index)); - previndex = index + 10; // length for {@docroot} string + previndex = index + docroot.length(); // Insert relative path where {@docRoot} was located - buf.append(relativepathNoSlash); + buf.append(pathToRoot.isEmpty() ? "." : pathToRoot.getPath()); // Append slash if next character is not a slash - if (relativepathNoSlash.length() > 0 && previndex < htmlstr.length() && - htmlstr.charAt(previndex) != '/') { - buf.append(DirectoryManager.URL_FILE_SEPARATOR); + if (previndex < htmlstr.length() && htmlstr.charAt(previndex) != '/') { + buf.append('/'); } } } return buf.toString(); } - /** - * Print Html Hyper Link, with target frame. This - * link will only appear if page is not in a frame. - * - * @param link String name of the file. - * @param where Position in the file - * @param target Name of the target frame. - * @param label Tag for the link. - * @param strong Whether the label should be strong or not? - */ - public void printNoFramesTargetHyperLink(String link, String where, - String target, String label, - boolean strong) { - script(); - println(" "); - scriptEnd(); - noScript(); - println(" " + getHyperLinkString(link, where, label, strong, "", "", target)); - noScriptEnd(); - println(DocletConstants.NL); - } - /** * Get the script to show or hide the All classes link. * @@ -324,14 +277,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return new TagletWriterImpl(this, isFirstSentence); } - protected void printTagsInfoHeader() { - dl(); - } - - protected void printTagsInfoFooter() { - dlEnd(); - } - /** * Get Package link, with target frame. * @@ -342,67 +287,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ public Content getTargetPackageLink(PackageDoc pd, String target, Content label) { - return getHyperLink(pathString(pd, "package-summary.html"), "", label, "", target); - } - - /** - * Print the html file header. Also print Html page title and stylesheet - * default properties. - * - * @param title String window title to go in the <TITLE> tag - * @param metakeywords Array of String keywords for META tag. Each element - * of the array is assigned to a separate META tag. - * Pass in null for no array. - * @param includeScript boolean true if printing windowtitle script. - * False for files that appear in the left-hand frames. - */ - public void printHtmlHeader(String title, String[] metakeywords, - boolean includeScript) { - println(""); - println(""); - html(); - head(); - if (! configuration.notimestamp) { - print(""); - } - if (configuration.charset.length() > 0) { - println(""); - } - if ( configuration.windowtitle.length() > 0 ) { - title += " (" + configuration.windowtitle + ")"; - } - title(title); - println(title); - titleEnd(); - println(""); - if (! configuration.notimestamp) { - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); - println(""); - } - if ( metakeywords != null ) { - for ( int i=0; i < metakeywords.length; i++ ) { - println(""); - } - } - println(""); - printStyleSheetProperties(); - println(""); - // Don't print windowtitle script for overview-frame, allclasses-frame - // and package-frame - if (includeScript) { - printWinTitleScript(title); - } - println(""); - headEnd(); - println(""); - body("white", includeScript); + return getHyperLink(pathString(pd, DocPaths.PACKAGE_SUMMARY), label, "", target); } /** @@ -416,13 +301,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param body the body htmltree to be included in the document */ public void printHtmlDocument(String[] metakeywords, boolean includeScript, - Content body) { + Content body) throws IOException { Content htmlDocType = DocType.Transitional(); Content htmlComment = new Comment(configuration.getText("doclet.New_Page")); Content head = new HtmlTree(HtmlTag.HEAD); if (!configuration.notimestamp) { - Content headComment = new Comment("Generated by javadoc (version " + - ConfigurationImpl.BUILD_DATE + ") on " + today()); + Content headComment = new Comment(getGeneratedByString()); head.addContent(headComment); } if (configuration.charset.length() > 0) { @@ -447,7 +331,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { head, body); Content htmlDocument = new HtmlDocument(htmlDocType, htmlComment, htmlTree); - print(htmlDocument.toString()); + write(htmlDocument); } /** @@ -463,26 +347,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return title; } - /** - * Print user specified header and the footer. - * - * @param header if true print the user provided header else print the - * user provided footer. - */ - public void printUserHeaderFooter(boolean header) { - em(); - if (header) { - print(replaceDocRootDir(configuration.header)); - } else { - if (configuration.footer.length() != 0) { - print(replaceDocRootDir(configuration.footer)); - } else { - print(replaceDocRootDir(configuration.header)); - } - } - emEnd(); - } - /** * Get user specified header and the footer. * @@ -505,14 +369,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return em; } - /** - * Print the user specified top. - */ - public void printTop() { - print(replaceDocRootDir(configuration.top)); - hr(); - } - /** * Adds the user specified top. * @@ -523,14 +379,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { body.addContent(top); } - /** - * Print the user specified bottom. - */ - public void printBottom() { - hr(); - print(replaceDocRootDir(configuration.bottom)); - } - /** * Adds the user specified bottom. * @@ -543,128 +391,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { body.addContent(p); } - /** - * Print the navigation bar for the Html page at the top and and the bottom. - * - * @param header If true print navigation bar at the top of the page else - * print the nevigation bar at the bottom. - */ - protected void navLinks(boolean header) { - println(""); - if (!configuration.nonavbar) { - if (header) { - println(DocletConstants.NL + ""); - anchor("navbar_top"); - println(); - print(getHyperLinkString("", "skip-navbar_top", "", false, "", - configuration.getText("doclet.Skip_navigation_links"), "")); - } else { - println(DocletConstants.NL + ""); - anchor("navbar_bottom"); - println(); - print(getHyperLinkString("", "skip-navbar_bottom", "", false, "", - configuration.getText("doclet.Skip_navigation_links"), "")); - } - table(0, "100%", 1, 0); - tr(); - tdColspanBgcolorStyle(2, "#EEEEFF", "NavBarCell1"); - println(""); - if (header) { - anchor("navbar_top_firstrow"); - } else { - anchor("navbar_bottom_firstrow"); - } - table(0, 0, 3); - print(" "); - trAlignVAlign("center", "top"); - - if (configuration.createoverview) { - navLinkContents(); - } - - if (configuration.packages.length == 1) { - navLinkPackage(configuration.packages[0]); - } else if (configuration.packages.length > 1) { - navLinkPackage(); - } - - navLinkClass(); - - if(configuration.classuse) { - navLinkClassUse(); - } - if(configuration.createtree) { - navLinkTree(); - } - if(!(configuration.nodeprecated || - configuration.nodeprecatedlist)) { - navLinkDeprecated(); - } - if(configuration.createindex) { - navLinkIndex(); - } - if (!configuration.nohelp) { - navLinkHelp(); - } - print(" "); - trEnd(); - tableEnd(); - tdEnd(); - - tdAlignVAlignRowspan("right", "top", 3); - - printUserHeaderFooter(header); - tdEnd(); - trEnd(); - println(""); - - tr(); - tdBgcolorStyle("white", "NavBarCell2"); - font("-2"); - space(); - navLinkPrevious(); - space(); - println(""); - space(); - navLinkNext(); - fontEnd(); - tdEnd(); - - tdBgcolorStyle("white", "NavBarCell2"); - font("-2"); - print(" "); - navShowLists(); - print(" "); - space(); - println(""); - space(); - navHideLists(filename); - print(" "); - space(); - println(""); - space(); - navLinkClassIndex(); - fontEnd(); - tdEnd(); - - trEnd(); - - printSummaryDetailLinks(); - - tableEnd(); - if (header) { - aName("skip-navbar_top"); - aEnd(); - println(DocletConstants.NL + ""); - } else { - aName("skip-navbar_bottom"); - aEnd(); - println(DocletConstants.NL + ""); - } - println(""); - } - } - /** * Adds the navigation bar for the Html page at the top and and the bottom. * @@ -681,9 +407,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { allClassesId += "navbar_top"; Content a = getMarkerAnchor("navbar_top"); navDiv.addContent(a); - Content skipLinkContent = getHyperLink("", - "skip-navbar_top", HtmlTree.EMPTY, configuration.getText( - "doclet.Skip_navigation_links"), ""); + Content skipLinkContent = getHyperLink(DocLink.fragment("skip-navbar_top"), + HtmlTree.EMPTY, + configuration.getText("doclet.Skip_navigation_links"), + ""); navDiv.addContent(skipLinkContent); } else { body.addContent(HtmlConstants.START_OF_BOTTOM_NAVBAR); @@ -691,9 +418,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { allClassesId += "navbar_bottom"; Content a = getMarkerAnchor("navbar_bottom"); navDiv.addContent(a); - Content skipLinkContent = getHyperLink("", - "skip-navbar_bottom", HtmlTree.EMPTY, configuration.getText( - "doclet.Skip_navigation_links"), ""); + Content skipLinkContent = getHyperLink(DocLink.fragment("skip-navbar_bottom"), + HtmlTree.EMPTY, + configuration.getText("doclet.Skip_navigation_links"), + ""); navDiv.addContent(skipLinkContent); } if (header) { @@ -756,14 +484,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } - /** - * Print the word "NEXT" to indicate that no link is available. Override - * this method to customize next link. - */ - protected void navLinkNext() { - navLinkNext(null); - } - /** * Get the word "NEXT" to indicate that no link is available. Override * this method to customize next link. @@ -774,14 +494,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getNavLinkNext(null); } - /** - * Print the word "PREV" to indicate that no link is available. Override - * this method to customize prev link. - */ - protected void navLinkPrevious() { - navLinkPrevious(null); - } - /** * Get the word "PREV" to indicate that no link is available. Override * this method to customize prev link. @@ -792,80 +504,24 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getNavLinkPrevious(null); } - /** - * Do nothing. This is the default method. - */ - protected void printSummaryDetailLinks() { - } - /** * Do nothing. This is the default method. */ protected void addSummaryDetailLinks(Content navDiv) { } - /** - * Print link to the "overview-summary.html" page. - */ - protected void navLinkContents() { - navCellStart(); - printHyperLink(relativePath + "overview-summary.html", "", - configuration.getText("doclet.Overview"), true, "NavBarFont1"); - navCellEnd(); - } - /** * Get link to the "overview-summary.html" page. * * @return a content tree for the link */ protected Content getNavLinkContents() { - Content linkContent = getHyperLink(relativePath + - "overview-summary.html", "", overviewLabel, "", ""); + Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_SUMMARY), + overviewLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } - /** - * Description for a cell in the navigation bar. - */ - protected void navCellStart() { - print(" "); - tdBgcolorStyle("#EEEEFF", "NavBarCell1"); - print(" "); - } - - /** - * Description for a cell in the navigation bar, but with reverse - * high-light effect. - */ - protected void navCellRevStart() { - print(" "); - tdBgcolorStyle("#FFFFFF", "NavBarCell1Rev"); - print(" "); - space(); - } - - /** - * Closing tag for navigation bar cell. - */ - protected void navCellEnd() { - space(); - tdEnd(); - } - - /** - * Print link to the "package-summary.html" page for the package passed. - * - * @param pkg Package to which link will be generated. - */ - protected void navLinkPackage(PackageDoc pkg) { - navCellStart(); - printPackageLink(pkg, configuration.getText("doclet.Package"), true, - "NavBarFont1"); - navCellEnd(); - } - /** * Get link to the "package-summary.html" page for the package passed. * @@ -879,18 +535,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print the word "Package" in the navigation bar cell, to indicate that - * link is not available here. - */ - protected void navLinkPackage() { - navCellStart(); - fontStyle("NavBarFont1"); - printText("doclet.Package"); - fontEnd(); - navCellEnd(); - } - /** * Get the word "Package" , to indicate that link is not available here. * @@ -901,18 +545,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print the word "Use" in the navigation bar cell, to indicate that link - * is not available. - */ - protected void navLinkClassUse() { - navCellStart(); - fontStyle("NavBarFont1"); - printText("doclet.navClassUse"); - fontEnd(); - navCellEnd(); - } - /** * Get the word "Use", to indicate that link is not available. * @@ -923,51 +555,22 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print link for previous file. - * - * @param prev File name for the prev link. - */ - public void navLinkPrevious(String prev) { - String tag = configuration.getText("doclet.Prev"); - if (prev != null) { - printHyperLink(prev, "", tag, true) ; - } else { - print(tag); - } - } - /** * Get link for previous file. * * @param prev File name for the prev link * @return a content tree for the link */ - public Content getNavLinkPrevious(String prev) { + public Content getNavLinkPrevious(DocPath prev) { Content li; if (prev != null) { - li = HtmlTree.LI(getHyperLink(prev, "", prevLabel, "", "")); + li = HtmlTree.LI(getHyperLink(prev, prevLabel, "", "")); } else li = HtmlTree.LI(prevLabel); return li; } - /** - * Print link for next file. If next is null, just print the label - * without linking it anywhere. - * - * @param next File name for the next link. - */ - public void navLinkNext(String next) { - String tag = configuration.getText("doclet.Next"); - if (next != null) { - printHyperLink(next, "", tag, true); - } else { - print(tag); - } - } - /** * Get link for next file. If next is null, just print the label * without linking it anywhere. @@ -975,63 +578,36 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param next File name for the next link * @return a content tree for the link */ - public Content getNavLinkNext(String next) { + public Content getNavLinkNext(DocPath next) { Content li; if (next != null) { - li = HtmlTree.LI(getHyperLink(next, "", nextLabel, "", "")); + li = HtmlTree.LI(getHyperLink(next, nextLabel, "", "")); } else li = HtmlTree.LI(nextLabel); return li; } - /** - * Print "FRAMES" link, to switch to the frame version of the output. - * - * @param link File to be linked, "index.html". - */ - protected void navShowLists(String link) { - print(getHyperLinkString(link + "?" + path + filename, "", - configuration.getText("doclet.FRAMES"), true, "", "", "_top")); - } - /** * Get "FRAMES" link, to switch to the frame version of the output. * * @param link File to be linked, "index.html" * @return a content tree for the link */ - protected Content getNavShowLists(String link) { - Content framesContent = getHyperLink(link + "?" + path + - filename, "", framesLabel, "", "_top"); + protected Content getNavShowLists(DocPath link) { + DocLink dl = new DocLink(link, path.getPath(), null); + Content framesContent = getHyperLink(dl, framesLabel, "", "_top"); Content li = HtmlTree.LI(framesContent); return li; } - /** - * Print "FRAMES" link, to switch to the frame version of the output. - */ - protected void navShowLists() { - navShowLists(relativePath + "index.html"); - } - /** * Get "FRAMES" link, to switch to the frame version of the output. * * @return a content tree for the link */ protected Content getNavShowLists() { - return getNavShowLists(relativePath + "index.html"); - } - - /** - * Print "NO FRAMES" link, to switch to the non-frame version of the output. - * - * @param link File to be linked. - */ - protected void navHideLists(String link) { - print(getHyperLinkString(link, "", configuration.getText("doclet.NO_FRAMES"), - true, "", "", "_top")); + return getNavShowLists(pathToRoot.resolve(DocPaths.INDEX)); } /** @@ -1040,31 +616,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param link File to be linked * @return a content tree for the link */ - protected Content getNavHideLists(String link) { - Content noFramesContent = getHyperLink(link, "", noframesLabel, "", "_top"); + protected Content getNavHideLists(DocPath link) { + Content noFramesContent = getHyperLink(link, noframesLabel, "", "_top"); Content li = HtmlTree.LI(noFramesContent); return li; } - /** - * Print "Tree" link in the navigation bar. If there is only one package - * specified on the command line, then the "Tree" link will be to the - * only "package-tree.html" file otherwise it will be to the - * "overview-tree.html" file. - */ - protected void navLinkTree() { - navCellStart(); - PackageDoc[] packages = configuration.root.specifiedPackages(); - if (packages.length == 1 && configuration.root.specifiedClasses().length == 0) { - printHyperLink(pathString(packages[0], "package-tree.html"), "", - configuration.getText("doclet.Tree"), true, "NavBarFont1"); - } else { - printHyperLink(relativePath + "overview-tree.html", "", - configuration.getText("doclet.Tree"), true, "NavBarFont1"); - } - navCellEnd(); - } - /** * Get "Tree" link in the navigation bar. If there is only one package * specified on the command line, then the "Tree" link will be to the @@ -1078,11 +635,11 @@ public class HtmlDocletWriter extends HtmlDocWriter { PackageDoc[] packages = configuration.root.specifiedPackages(); if (packages.length == 1 && configuration.root.specifiedClasses().length == 0) { treeLinkContent = getHyperLink(pathString(packages[0], - "package-tree.html"), "", treeLabel, + DocPaths.PACKAGE_TREE), treeLabel, "", ""); } else { - treeLinkContent = getHyperLink(relativePath + "overview-tree.html", - "", treeLabel, "", ""); + treeLinkContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), + treeLabel, "", ""); } Content li = HtmlTree.LI(treeLinkContent); return li; @@ -1095,24 +652,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkMainTree(String label) { - Content mainTreeContent = getHyperLink(relativePath + "overview-tree.html", + Content mainTreeContent = getHyperLink(pathToRoot.resolve(DocPaths.OVERVIEW_TREE), new StringContent(label)); Content li = HtmlTree.LI(mainTreeContent); return li; } - /** - * Print the word "Class" in the navigation bar cell, to indicate that - * class link is not available. - */ - protected void navLinkClass() { - navCellStart(); - fontStyle("NavBarFont1"); - printText("doclet.Class"); - fontEnd(); - navCellEnd(); - } - /** * Get the word "Class", to indicate that class link is not available. * @@ -1123,39 +668,18 @@ public class HtmlDocletWriter extends HtmlDocWriter { return li; } - /** - * Print "Deprecated" API link in the navigation bar. - */ - protected void navLinkDeprecated() { - navCellStart(); - printHyperLink(relativePath + "deprecated-list.html", "", - configuration.getText("doclet.navDeprecated"), true, "NavBarFont1"); - navCellEnd(); - } - /** * Get "Deprecated" API link in the navigation bar. * * @return a content tree for the link */ protected Content getNavLinkDeprecated() { - Content linkContent = getHyperLink(relativePath + - "deprecated-list.html", "", deprecatedLabel, "", ""); + Content linkContent = getHyperLink(pathToRoot.resolve(DocPaths.DEPRECATED_LIST), + deprecatedLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } - /** - * Print link for generated index. If the user has used "-splitindex" - * command line option, then link to file "index-files/index-1.html" is - * generated otherwise link to file "index-all.html" is generated. - */ - protected void navLinkClassIndex() { - printNoFramesTargetHyperLink(relativePath + - AllClassesFrameWriter.OUTPUT_FILE_NAME_NOFRAMES, - "", "", configuration.getText("doclet.All_Classes"), true); - } - /** * Get link for generated index. If the user has used "-splitindex" * command line option, then link to file "index-files/index-1.html" is @@ -1164,26 +688,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkClassIndex() { - Content allClassesContent = getHyperLink(relativePath + - AllClassesFrameWriter.OUTPUT_FILE_NAME_NOFRAMES, "", + Content allClassesContent = getHyperLink(pathToRoot.resolve( + DocPaths.ALLCLASSES_NOFRAME), allclassesLabel, "", ""); Content li = HtmlTree.LI(allClassesContent); return li; } - /** - * Print link for generated class index. - */ - protected void navLinkIndex() { - navCellStart(); - printHyperLink(relativePath + - (configuration.splitindex? - DirectoryManager.getPath("index-files") + - fileseparator: "") + - (configuration.splitindex? - "index-1.html" : "index-all.html"), "", - configuration.getText("doclet.Index"), true, "NavBarFont1"); - navCellEnd(); - } /** * Get link for generated class index. @@ -1191,35 +701,15 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkIndex() { - Content linkContent = getHyperLink(relativePath +(configuration.splitindex? - DirectoryManager.getPath("index-files") + fileseparator: "") + - (configuration.splitindex?"index-1.html" : "index-all.html"), "", + Content linkContent = getHyperLink(pathToRoot.resolve( + (configuration.splitindex + ? DocPaths.INDEX_FILES.resolve(DocPaths.indexN(1)) + : DocPaths.INDEX_ALL)), indexLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } - /** - * Print help file link. If user has provided a help file, then generate a - * link to the user given file, which is already copied to current or - * destination directory. - */ - protected void navLinkHelp() { - String helpfilenm = configuration.helpfile; - if (helpfilenm.equals("")) { - helpfilenm = "help-doc.html"; - } else { - int lastsep; - if ((lastsep = helpfilenm.lastIndexOf(File.separatorChar)) != -1) { - helpfilenm = helpfilenm.substring(lastsep + 1); - } - } - navCellStart(); - printHyperLink(relativePath + helpfilenm, "", - configuration.getText("doclet.Help"), true, "NavBarFont1"); - navCellEnd(); - } - /** * Get help file link. If user has provided a help file, then generate a * link to the user given file, which is already copied to current or @@ -1228,102 +718,20 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @return a content tree for the link */ protected Content getNavLinkHelp() { - String helpfilenm = configuration.helpfile; - if (helpfilenm.equals("")) { - helpfilenm = "help-doc.html"; + String helpfile = configuration.helpfile; + DocPath helpfilenm; + if (helpfile.isEmpty()) { + helpfilenm = DocPaths.HELP_DOC; } else { - int lastsep; - if ((lastsep = helpfilenm.lastIndexOf(File.separatorChar)) != -1) { - helpfilenm = helpfilenm.substring(lastsep + 1); - } + DocFile file = DocFile.createFileForInput(configuration, helpfile); + helpfilenm = DocPath.create(file.getName()); } - Content linkContent = getHyperLink(relativePath + helpfilenm, "", + Content linkContent = getHyperLink(pathToRoot.resolve(helpfilenm), helpLabel, "", ""); Content li = HtmlTree.LI(linkContent); return li; } - /** - * Print the word "Detail" in the navigation bar. No link is available. - */ - protected void navDetail() { - printText("doclet.Detail"); - } - - /** - * Print the word "Summary" in the navigation bar. No link is available. - */ - protected void navSummary() { - printText("doclet.Summary"); - } - - /** - * Print the Html table tag for the index summary tables. The table tag - * printed is - * {@code } - */ - public void tableIndexSummary() { - table(1, "100%", 3, 0); - } - - /** - * Print the Html table tag for the index summary tables. - * - * @param summary the summary for the table tag summary attribute. - */ - public void tableIndexSummary(String summary) { - table(1, "100%", 3, 0, summary); - } - - /** - * Same as {@link #tableIndexSummary()}. - */ - public void tableIndexDetail() { - table(1, "100%", 3, 0); - } - - /** - * Print Html tag for table elements. The tag printed is - * <TD ALIGN="right" VALIGN="top" WIDTH="1%">. - */ - public void tdIndex() { - print(""); - } - - /** - * Print </TR> tag. Add a newline character at the end. - */ - public void trEnd() { - println(""); - } - - /** - * Print <TD> tag. - */ - public void td() { - print(""); - } - - /** - * Print <LINK str> tag. - * - * @param str String. - */ - public void link(String str) { - println(""); - } - - /** - * Print "<!-- " comment start string. - */ - public void commentStart() { - print(""); - } - - /** - * Print <CAPTION CLASS="stylename"> tag. Adds a newline character - * at the end. - * - * @param stylename style to be applied. - */ - public void captionStyle(String stylename) { - println(""); - } - - /** - * Print <TR BGCOLOR="color" CLASS="stylename"> tag. Adds a newline character - * at the end. - * - * @param color String color. - * @param stylename String stylename. - */ - public void trBgcolorStyle(String color, String stylename) { - println(""); - } - - /** - * Print <TR BGCOLOR="color"> tag. Adds a newline character at the end. - * - * @param color String color. - */ - public void trBgcolor(String color) { - println(""); - } - - /** - * Print <TR ALIGN="align" VALIGN="valign"> tag. Adds a newline character - * at the end. - * - * @param align String align. - * @param valign String valign. - */ - public void trAlignVAlign(String align, String valign) { - println(""); - } - - /** - * Print <TH ALIGN="align"> tag. - * - * @param align the align attribute. - */ - public void thAlign(String align) { - print(""); - } - - /** - * Print <TD COLSPAN=i> tag. - * - * @param i integer. - */ - public void tdColspan(int i) { - print("
"); - } - - /** - * Print table caption. - */ - public void tableCaptionStart() { - captionStyle("TableCaption"); - } - - /** - * Print table sub-caption. - */ - public void tableSubCaptionStart() { - captionStyle("TableSubCaption"); - } - - /** - * Print table caption end tags. - */ - public void tableCaptionEnd() { - captionEnd(); - } - - /** - * Print summary table header. - */ - public void summaryTableHeader(String[] header, String scope) { - tr(); - for ( int i=0; i < header.length; i++ ) { - thScopeNoWrap("TableHeader", scope); - print(header[i]); - thEnd(); - } - trEnd(); - } - /** * Get summary table header. * @@ -1407,7 +815,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Returns a package name label. * - * @param parsedName the package name + * @param packageName the package name * @return the package name content */ public Content getPackageLabel(String packageName) { @@ -1453,163 +861,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { } /** - * Prine table header information about color, column span and the font. - * - * @param color Background color. - * @param span Column span. - */ - public void tableHeaderStart(String color, int span) { - trBgcolorStyle(color, "TableHeadingColor"); - thAlignColspan("left", span); - font("+2"); - } - - /** - * Print table header for the inherited members summary tables. Print the - * background color information. - * - * @param color Background color. - */ - public void tableInheritedHeaderStart(String color) { - trBgcolorStyle(color, "TableSubHeadingColor"); - thAlign("left"); - } - - /** - * Print "Use" table header. Print the background color and the column span. - * - * @param color Background color. - */ - public void tableUseInfoHeaderStart(String color) { - trBgcolorStyle(color, "TableSubHeadingColor"); - thAlignColspan("left", 2); - } - - /** - * Print table header with the background color with default column span 2. - * - * @param color Background color. - */ - public void tableHeaderStart(String color) { - tableHeaderStart(color, 2); - } - - /** - * Print table header with the column span, with the default color #CCCCFF. - * - * @param span Column span. - */ - public void tableHeaderStart(int span) { - tableHeaderStart("#CCCCFF", span); - } - - /** - * Print table header with default column span 2 and default color #CCCCFF. - */ - public void tableHeaderStart() { - tableHeaderStart(2); - } - - /** - * Print table header end tags for font, column and row. - */ - public void tableHeaderEnd() { - fontEnd(); - thEnd(); - trEnd(); - } - - /** - * Print table header end tags in inherited tables for column and row. - */ - public void tableInheritedHeaderEnd() { - thEnd(); - trEnd(); - } - - /** - * Print the summary table row cell attribute width. - * - * @param width Width of the table cell. - */ - public void summaryRow(int width) { - if (width != 0) { - tdWidth(width + "%"); - } else { - td(); - } - } - - /** - * Print the summary table row cell end tag. - */ - public void summaryRowEnd() { - tdEnd(); - } - - /** - * Print the heading in Html {@literal

} format. - * - * @param str The Header string. - */ - public void printIndexHeading(String str) { - h2(); - print(str); - h2End(); - } - - /** - * Print Html tag <FRAMESET=arg>. - * - * @param arg Argument for the tag. - */ - public void frameSet(String arg) { - println(""); - } - - /** - * Print Html closing tag </FRAMESET>. - */ - public void frameSetEnd() { - println(""); - } - - /** - * Print Html tag <FRAME=arg>. - * - * @param arg Argument for the tag. - */ - public void frame(String arg) { - println(""); - } - - /** - * Print Html closing tag </FRAME>. - */ - public void frameEnd() { - println(""); - } - - /** - * Return path to the class page for a classdoc. For example, the class - * name is "java.lang.Object" and if the current file getting generated is - * "java/io/File.html", then the path string to the class, returned is - * "../../java/lang.Object.html". - * - * @param cd Class to which the path is requested. - */ - protected String pathToClass(ClassDoc cd) { - return pathString(cd.containingPackage(), cd.name() + ".html"); - } - - /** - * Return the path to the class page for a classdoc. Works same as - * {@link #pathToClass(ClassDoc)}. + * Return the path to the class page for a classdoc. * * @param cd Class to which the path is requested. * @param name Name of the file(doesn't include path). */ - protected String pathString(ClassDoc cd, String name) { + protected DocPath pathString(ClassDoc cd, DocPath name) { return pathString(cd.containingPackage(), name); } @@ -1622,34 +879,8 @@ public class HtmlDocletWriter extends HtmlDocWriter { * @param pd Package in which the file name is assumed to be. * @param name File name, to which path string is. */ - protected String pathString(PackageDoc pd, String name) { - StringBuffer buf = new StringBuffer(relativePath); - buf.append(DirectoryManager.getPathToPackage(pd, name)); - return buf.toString(); - } - - /** - * Print the link to the given package. - * - * @param pkg the package to link to. - * @param label the label for the link. - * @param isStrong true if the label should be strong. - */ - public void printPackageLink(PackageDoc pkg, String label, boolean isStrong) { - print(getPackageLinkString(pkg, label, isStrong)); - } - - /** - * Print the link to the given package. - * - * @param pkg the package to link to. - * @param label the label for the link. - * @param isStrong true if the label should be strong. - * @param style the font of the package link label. - */ - public void printPackageLink(PackageDoc pkg, String label, boolean isStrong, - String style) { - print(getPackageLinkString(pkg, label, isStrong, style)); + protected DocPath pathString(PackageDoc pd, DocPath name) { + return pathToRoot.resolve(DocPath.forPackage(pd).resolve(name)); } /** @@ -1687,12 +918,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } if (included || pkg == null) { - return getHyperLinkString(pathString(pkg, "package-summary.html"), - "", label, isStrong, style); + return getHyperLinkString(pathString(pkg, DocPaths.PACKAGE_SUMMARY), + label, isStrong, style); } else { - String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); + DocLink crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); if (crossPkgLink != null) { - return getHyperLinkString(crossPkgLink, "", label, isStrong, style); + return getHyperLinkString(crossPkgLink, label, isStrong, style); } else { return label; } @@ -1718,12 +949,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } if (included || pkg == null) { - return getHyperLink(pathString(pkg, "package-summary.html"), - "", label); + return getHyperLink(pathString(pkg, DocPaths.PACKAGE_SUMMARY), + label); } else { - String crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); + DocLink crossPkgLink = getCrossPackageLink(Util.getPackageName(pkg)); if (crossPkgLink != null) { - return getHyperLink(crossPkgLink, "", label); + return getHyperLink(crossPkgLink, label); } else { return label; } @@ -1735,21 +966,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return (cd.isInterface())? italicsText(name): name; } - public void printSrcLink(ProgramElementDoc d, String label) { - if (d == null) { - return; - } - ClassDoc cd = d.containingClass(); - if (cd == null) { - //d must be a class doc since in has no containing class. - cd = (ClassDoc) d; - } - String href = relativePath + DocletConstants.SOURCE_OUTPUT_DIR_NAME - + DirectoryManager.getDirectoryPath(cd.containingPackage()) - + cd.name() + ".html#" + SourceToHTMLConverter.getAnchorName(d); - printHyperLink(href, "", label, true); - } - /** * Add the link to the content tree. * @@ -1766,10 +982,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { //d must be a class doc since in has no containing class. cd = (ClassDoc) doc; } - String href = relativePath + DocletConstants.SOURCE_OUTPUT_DIR_NAME - + DirectoryManager.getDirectoryPath(cd.containingPackage()) - + cd.name() + ".html#" + SourceToHTMLConverter.getAnchorName(doc); - Content linkContent = getHyperLink(href, "", label, "", ""); + DocPath href = pathToRoot + .resolve(DocPaths.SOURCE_OUTPUT) + .resolve(DocPath.forClass(cd)); + Content linkContent = getHyperLink(href.fragment(SourceToHTMLConverter.getAnchorName(doc)), label, "", ""); htmltree.addContent(linkContent); } @@ -1782,7 +998,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ public String getLink(LinkInfoImpl linkInfo) { LinkFactoryImpl factory = new LinkFactoryImpl(this); - String link = ((LinkOutputImpl) factory.getLinkOutput(linkInfo)).toString(); + String link = factory.getLinkOutput(linkInfo).toString(); displayLength += linkInfo.displayLength; return link; } @@ -1795,15 +1011,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ public String getTypeParameterLinks(LinkInfoImpl linkInfo) { LinkFactoryImpl factory = new LinkFactoryImpl(this); - return ((LinkOutputImpl) - factory.getTypeParameterLinks(linkInfo, false)).toString(); - } - - /** - * Print the link to the given class. - */ - public void printLink(LinkInfoImpl linkInfo) { - print(getLink(linkInfo)); + return factory.getTypeParameterLinks(linkInfo, false).toString(); } /************************************************************* @@ -1823,13 +1031,13 @@ public class HtmlDocletWriter extends HtmlDocWriter { public String getCrossClassLink(String qualifiedClassName, String refMemName, String label, boolean strong, String style, boolean code) { - String className = "", - packageName = qualifiedClassName == null ? "" : qualifiedClassName; + String className = ""; + String packageName = qualifiedClassName == null ? "" : qualifiedClassName; int periodIndex; - while((periodIndex = packageName.lastIndexOf('.')) != -1) { + while ((periodIndex = packageName.lastIndexOf('.')) != -1) { className = packageName.substring(periodIndex + 1, packageName.length()) + (className.length() > 0 ? "." + className : ""); - String defaultLabel = code ? getCode() + className + getCodeEnd() : className; + String defaultLabel = code ? codeText(className) : className; packageName = packageName.substring(0, periodIndex); if (getCrossPackageLink(packageName) != null) { //The package exists in external documentation, so link to the external @@ -1837,11 +1045,12 @@ public class HtmlDocletWriter extends HtmlDocWriter { //the -link option. There are ways to determine if an external package //exists, but no way to determine if the external class exists. We just //have to assume that it does. - return getHyperLinkString( - configuration.extern.getExternalLink(packageName, relativePath, - className + ".html?is-external=true"), - refMemName == null ? "" : refMemName, - label == null || label.length() == 0 ? defaultLabel : label, + DocLink link = configuration.extern.getExternalLink(packageName, pathToRoot, + className + ".html", refMemName); + return getHyperLinkString(link, + (label == null) || label.length() == 0 ? defaultLabel : label, + + strong, style, configuration.getText("doclet.Href_Class_Or_Interface_Title", packageName), ""); @@ -1857,9 +1066,9 @@ public class HtmlDocletWriter extends HtmlDocWriter { return configuration.extern.isExternal(cd); } - public String getCrossPackageLink(String pkgName) { - return configuration.extern.getExternalLink(pkgName, relativePath, - "package-summary.html?is-external=true"); + public DocLink getCrossPackageLink(String pkgName) { + return configuration.extern.getExternalLink(pkgName, pathToRoot, + DocPaths.PACKAGE_SUMMARY.getPath()); } /** @@ -1887,7 +1096,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Retrieve the class link with the package portion of the label in - * plain text. If the qualifier is excluded, it willnot be included in the + * plain text. If the qualifier is excluded, it will not be included in the * link label. * * @param cd the class to link to. @@ -1937,30 +1146,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addPreQualifiedClassLink(context, cd, true, contentTree); } - public void printText(String key) { - print(configuration.getText(key)); - } - - public void printText(String key, String a1) { - print(configuration.getText(key, a1)); - } - - public void printText(String key, String a1, String a2) { - print(configuration.getText(key, a1, a2)); - } - - public void strongText(String key) { - strong(configuration.getText(key)); - } - - public void strongText(String key, String a1) { - strong(configuration.getText(key, a1)); - } - - public void strongText(String key, String a1, String a2) { - strong(configuration.getText(key, a1, a2)); - } - /** * Get the link for the given member. * @@ -1973,22 +1158,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return getDocLink(context, doc.containingClass(), doc, label); } - /** - * Print the link for the given member. - * - * @param context the id of the context where the link will be printed. - * @param classDoc the classDoc that we should link to. This is not - * necessarily equal to doc.containingClass(). We may be - * inheriting comments. - * @param doc the member being linked to. - * @param label the label for the link. - * @param strong true if the link should be strong. - */ - public void printDocLink(int context, ClassDoc classDoc, MemberDoc doc, - String label, boolean strong) { - print(getDocLink(context, classDoc, doc, label, strong)); - } - /** * Return the link for the given member. * @@ -2060,10 +1229,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { } } - public void anchor(ExecutableMemberDoc emd) { - anchor(getAnchor(emd)); - } - public String getAnchor(ExecutableMemberDoc emd) { StringBuilder signature = new StringBuilder(emd.signature()); StringBuilder signatureParsed = new StringBuilder(); @@ -2086,66 +1251,62 @@ public class HtmlDocletWriter extends HtmlDocWriter { if (! (tagName.startsWith("@link") || tagName.equals("@see"))) { return ""; } - StringBuffer result = new StringBuffer(); - boolean isplaintext = tagName.toLowerCase().equals("@linkplain"); - String label = see.label(); - label = (label.length() > 0)? - ((isplaintext) ? label : - getCode() + label + getCodeEnd()):""; + String seetext = replaceDocRootDir(see.text()); //Check if @see is an href or "string" if (seetext.startsWith("<") || seetext.startsWith("\"")) { - result.append(seetext); - return result.toString(); + return seetext; } + boolean plain = tagName.equalsIgnoreCase("@linkplain"); + String label = plainOrCodeText(plain, see.label()); + //The text from the @see tag. We will output this text when a label is not specified. - String text = (isplaintext) ? seetext : getCode() + seetext + getCodeEnd(); + String text = plainOrCodeText(plain, seetext); ClassDoc refClass = see.referencedClass(); String refClassName = see.referencedClassName(); MemberDoc refMem = see.referencedMember(); String refMemName = see.referencedMemberName(); + if (refClass == null) { //@see is not referencing an included class PackageDoc refPackage = see.referencedPackage(); if (refPackage != null && refPackage.isIncluded()) { //@see is referencing an included package - String packageName = isplaintext ? refPackage.name() : - getCode() + refPackage.name() + getCodeEnd(); - result.append(getPackageLinkString(refPackage, - label.length() == 0 ? packageName : label, false)); + if (label.isEmpty()) + label = plainOrCodeText(plain, refPackage.name()); + return getPackageLinkString(refPackage, label, false); } else { //@see is not referencing an included class or package. Check for cross links. - String classCrossLink, packageCrossLink = getCrossPackageLink(refClassName); + String classCrossLink; + DocLink packageCrossLink = getCrossPackageLink(refClassName); if (packageCrossLink != null) { //Package cross link found - result.append(getHyperLinkString(packageCrossLink, "", - (label.length() == 0)? text : label, false)); + return getHyperLinkString(packageCrossLink, + (label.isEmpty() ? text : label), false); } else if ((classCrossLink = getCrossClassLink(refClassName, - refMemName, label, false, "", ! isplaintext)) != null) { - //Class cross link found (possiblly to a member in the class) - result.append(classCrossLink); + refMemName, label, false, "", !plain)) != null) { + //Class cross link found (possibly to a member in the class) + return classCrossLink; } else { //No cross link found so print warning configuration.getDocletSpecificMsg().warning(see.position(), "doclet.see.class_or_package_not_found", tagName, seetext); - result.append((label.length() == 0)? text: label); + return (label.isEmpty() ? text: label); } } } else if (refMemName == null) { // Must be a class reference since refClass is not null and refMemName is null. - if (label.length() == 0) { - label = (isplaintext) ? refClass.name() : getCode() + refClass.name() + getCodeEnd(); - result.append(getLink(new LinkInfoImpl(refClass, label))); - } else { - result.append(getLink(new LinkInfoImpl(refClass, label))); + if (label.isEmpty()) { + label = plainOrCodeText(plain, refClass.name()); } + return getLink(new LinkInfoImpl(refClass, label)); } else if (refMem == null) { // Must be a member reference since refClass is not null and refMemName is not null. // However, refMem is null, so this referenced member does not exist. - result.append((label.length() == 0)? text: label); + return (label.isEmpty() ? text: label); } else { // Must be a member reference since refClass is not null and refMemName is not null. // refMem is not null, so this @see tag must be referencing a valid member. @@ -2177,17 +1338,16 @@ public class HtmlDocletWriter extends HtmlDocWriter { refMemName += ((ExecutableMemberDoc)refMem).signature(); } } - text = (isplaintext) ? - refMemName : getCode() + Util.escapeHtmlChars(refMemName) + getCodeEnd(); - result.append(getDocLink(LinkInfoImpl.CONTEXT_SEE_TAG, containing, - refMem, (label.length() == 0)? text: label, false)); + text = plainOrCodeText(plain, Util.escapeHtmlChars(refMemName)); + + return getDocLink(LinkInfoImpl.CONTEXT_SEE_TAG, containing, + refMem, (label.isEmpty() ? text: label), false); } - return result.toString(); } - public void printInlineComment(Doc doc, Tag tag) { - printCommentTags(doc, tag.inlineTags(), false, false); + private String plainOrCodeText(boolean plain, String text) { + return (plain || text.isEmpty()) ? text : codeText(text); } /** @@ -2201,10 +1361,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, tag.inlineTags(), false, false, htmltree); } - public void printInlineDeprecatedComment(Doc doc, Tag tag) { - printCommentTags(doc, tag.inlineTags(), true, false); - } - /** * Add the inline deprecated comment. * @@ -2216,10 +1372,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, tag.inlineTags(), true, false, htmltree); } - public void printSummaryComment(Doc doc) { - printSummaryComment(doc, doc.firstSentenceTags()); - } - /** * Adds the summary content. * @@ -2230,10 +1382,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addSummaryComment(doc, doc.firstSentenceTags(), htmltree); } - public void printSummaryComment(Doc doc, Tag[] firstSentenceTags) { - printCommentTags(doc, firstSentenceTags, false, true); - } - /** * Adds the summary content. * @@ -2245,23 +1393,10 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, firstSentenceTags, false, true, htmltree); } - public void printSummaryDeprecatedComment(Doc doc) { - printCommentTags(doc, doc.firstSentenceTags(), true, true); - } - - public void printSummaryDeprecatedComment(Doc doc, Tag tag) { - printCommentTags(doc, tag.firstSentenceTags(), true, true); - } - public void addSummaryDeprecatedComment(Doc doc, Tag tag, Content htmltree) { addCommentTags(doc, tag.firstSentenceTags(), true, true, htmltree); } - public void printInlineComment(Doc doc) { - printCommentTags(doc, doc.inlineTags(), false, false); - p(); - } - /** * Adds the inline comment. * @@ -2272,34 +1407,13 @@ public class HtmlDocletWriter extends HtmlDocWriter { addCommentTags(doc, doc.inlineTags(), false, false, htmltree); } - public void printInlineDeprecatedComment(Doc doc) { - printCommentTags(doc, doc.inlineTags(), true, false); - } - - private void printCommentTags(Doc doc, Tag[] tags, boolean depr, boolean first) { - if(configuration.nocomment){ - return; - } - if (depr) { - italic(); - } - String result = commentTagsToString(null, doc, tags, first); - print(result); - if (depr) { - italicEnd(); - } - if (tags.length == 0) { - space(); - } - } - /** * Adds the comment tags. * * @param doc the doc for which the comment tags will be generated * @param tags the first sentence tags for the doc * @param depr true if it is deprecated - * @param first true if the first sentenge tags should be added + * @param first true if the first sentence tags should be added * @param htmltree the documentation tree to which the comment tags will be added */ private void addCommentTags(Doc doc, Tag[] tags, boolean depr, @@ -2385,7 +1499,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { text = removeNonInlineHtmlTags(text); } StringTokenizer lines = new StringTokenizer(text, "\r\n", true); - StringBuffer textBuff = new StringBuffer(); + StringBuilder textBuff = new StringBuilder(); while (lines.hasMoreTokens()) { StringBuilder line = new StringBuilder(lines.nextToken()); Util.replaceTabs(configuration.sourcetab, line); @@ -2410,7 +1524,7 @@ public class HtmlDocletWriter extends HtmlDocWriter { /** * Suppose a piece of documentation has a relative link. When you copy - * that documetation to another place such as the index or class-use page, + * that documentation to another place such as the index or class-use page, * that relative link will no longer work. We should redirect those links * so that they will work again. *

@@ -2436,25 +1550,21 @@ public class HtmlDocletWriter extends HtmlDocWriter { return text; } - String redirectPathFromRoot; + DocPath redirectPathFromRoot; if (doc instanceof ClassDoc) { - redirectPathFromRoot = DirectoryManager.getDirectoryPath(((ClassDoc) doc).containingPackage()); + redirectPathFromRoot = DocPath.forPackage(((ClassDoc) doc).containingPackage()); } else if (doc instanceof MemberDoc) { - redirectPathFromRoot = DirectoryManager.getDirectoryPath(((MemberDoc) doc).containingPackage()); + redirectPathFromRoot = DocPath.forPackage(((MemberDoc) doc).containingPackage()); } else if (doc instanceof PackageDoc) { - redirectPathFromRoot = DirectoryManager.getDirectoryPath((PackageDoc) doc); + redirectPathFromRoot = DocPath.forPackage((PackageDoc) doc); } else { return text; } - if (! redirectPathFromRoot.endsWith(DirectoryManager.URL_FILE_SEPARATOR)) { - redirectPathFromRoot += DirectoryManager.URL_FILE_SEPARATOR; - } - //Redirect all relative links. int end, begin = text.toLowerCase().indexOf("= 0){ - StringBuffer textBuff = new StringBuffer(text); + StringBuilder textBuff = new StringBuilder(text); while(begin >=0){ if (textBuff.length() > begin + 2 && ! Character.isWhitespace(textBuff.charAt(begin+2))) { @@ -2476,22 +1586,21 @@ public class HtmlDocletWriter extends HtmlDocWriter { //might be missing '>' character because the href has an inline tag. break; } - if(textBuff.substring(begin, end).indexOf("\"") != -1){ + if (textBuff.substring(begin, end).indexOf("\"") != -1){ begin = textBuff.indexOf("\"", begin) + 1; end = textBuff.indexOf("\"", begin +1); - if(begin == 0 || end == -1){ + if (begin == 0 || end == -1){ //Link is missing a quote. break; } } String relativeLink = textBuff.substring(begin, end); - if(!(relativeLink.toLowerCase().startsWith("mailto:") || - relativeLink.toLowerCase().startsWith("http:") || - relativeLink.toLowerCase().startsWith("https:") || - relativeLink.toLowerCase().startsWith("file:"))){ - relativeLink = "{@"+(new DocRootTaglet()).getName() + "}" - + redirectPathFromRoot - + relativeLink; + if (!(relativeLink.toLowerCase().startsWith("mailto:") || + relativeLink.toLowerCase().startsWith("http:") || + relativeLink.toLowerCase().startsWith("https:") || + relativeLink.toLowerCase().startsWith("file:"))) { + relativeLink = "{@"+(new DocRootTaglet()).getName() + "}/" + + redirectPathFromRoot.resolve(relativeLink).getPath(); textBuff.replace(begin, end, relativeLink); } begin = textBuff.toString().toLowerCase().indexOf(" 0) { - File stylefile = new File(filename); - String parent = stylefile.getParent(); - filename = (parent == null)? - filename: - filename.substring(parent.length() + 1); - } else { - filename = "stylesheet.css"; - } - filename = relativePath + filename; - link("REL =\"stylesheet\" TYPE=\"text/css\" HREF=\"" + - filename + "\" " + "TITLE=\"Style\""); - } - /** * Returns a link to the stylesheet file. * * @return an HtmlTree for the lINK tag which provides the stylesheet location */ public HtmlTree getStyleSheetProperties() { - String filename = configuration.stylesheetfile; - if (filename.length() > 0) { - File stylefile = new File(filename); - String parent = stylefile.getParent(); - filename = (parent == null)? - filename: - filename.substring(parent.length() + 1); + String stylesheetfile = configuration.stylesheetfile; + DocPath stylesheet; + if (stylesheetfile.isEmpty()) { + stylesheet = DocPaths.STYLESHEET; } else { - filename = "stylesheet.css"; + DocFile file = DocFile.createFileForInput(configuration, stylesheetfile); + stylesheet = DocPath.create(file.getName()); } - filename = relativePath + filename; - HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style"); + HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", + pathToRoot.resolve(stylesheet).getPath(), + "Style"); return link; } @@ -2603,15 +1695,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return cd.containingClass() == null || cd.isStatic(); } - /** - * Write the annotatation types for the given packageDoc. - * - * @param packageDoc the package to write annotations for. - */ - public void writeAnnotationInfo(PackageDoc packageDoc) { - writeAnnotationInfo(packageDoc, packageDoc.annotations()); - } - /** * Adds the annotatation types for the given packageDoc. * @@ -2623,36 +1706,16 @@ public class HtmlDocletWriter extends HtmlDocWriter { addAnnotationInfo(packageDoc, packageDoc.annotations(), htmltree); } - /** - * Write the annotatation types for the given doc. - * - * @param doc the doc to write annotations for. - */ - public void writeAnnotationInfo(ProgramElementDoc doc) { - writeAnnotationInfo(doc, doc.annotations()); - } - /** * Adds the annotatation types for the given doc. * - * @param packageDoc the package to write annotations for + * @param doc the package to write annotations for * @param htmltree the content tree to which the annotation types will be added */ public void addAnnotationInfo(ProgramElementDoc doc, Content htmltree) { addAnnotationInfo(doc, doc.annotations(), htmltree); } - /** - * Write the annotatation types for the given doc and parameter. - * - * @param indent the number of spaced to indent the parameters. - * @param doc the doc to write annotations for. - * @param param the parameter to write annotations for. - */ - public boolean writeAnnotationInfo(int indent, Doc doc, Parameter param) { - return writeAnnotationInfo(indent, doc, param.annotations(), false); - } - /** * Add the annotatation types for the given doc and parameter. * @@ -2666,16 +1729,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { return addAnnotationInfo(indent, doc, param.annotations(), false, tree); } - /** - * Write the annotatation types for the given doc. - * - * @param doc the doc to write annotations for. - * @param descList the array of {@link AnnotationDesc}. - */ - private void writeAnnotationInfo(Doc doc, AnnotationDesc[] descList) { - writeAnnotationInfo(0, doc, descList, true); - } - /** * Adds the annotatation types for the given doc. * @@ -2689,26 +1742,6 @@ public class HtmlDocletWriter extends HtmlDocWriter { addAnnotationInfo(0, doc, descList, true, htmltree); } - /** - * Write the annotatation types for the given doc. - * - * @param indent the number of extra spaces to indent the annotations. - * @param doc the doc to write annotations for. - * @param descList the array of {@link AnnotationDesc}. - */ - private boolean writeAnnotationInfo(int indent, Doc doc, AnnotationDesc[] descList, boolean lineBreak) { - List annotations = getAnnotations(indent, descList, lineBreak); - if (annotations.size() == 0) { - return false; - } - fontNoNewLine("-1"); - for (Iterator iter = annotations.iterator(); iter.hasNext();) { - print(iter.next()); - } - fontEnd(); - return true; - } - /** * Adds the annotatation types for the given doc. * @@ -2744,13 +1777,13 @@ public class HtmlDocletWriter extends HtmlDocWriter { */ private List getAnnotations(int indent, AnnotationDesc[] descList, boolean linkBreak) { List results = new ArrayList(); - StringBuffer annotation; + StringBuilder annotation; for (int i = 0; i < descList.length; i++) { AnnotationTypeDoc annotationDoc = descList[i].annotationType(); if (! Util.isDocumentedAnnotation(annotationDoc)){ continue; } - annotation = new StringBuffer(); + annotation = new StringBuilder(); LinkInfoImpl linkInfo = new LinkInfoImpl( LinkInfoImpl.CONTEXT_ANNOTATION, annotationDoc); linkInfo.label = "@" + annotationDoc.name(); @@ -2815,9 +1848,9 @@ public class HtmlDocletWriter extends HtmlDocWriter { List list = getAnnotations(0, new AnnotationDesc[]{(AnnotationDesc) annotationValue.value()}, false); - StringBuffer buf = new StringBuffer(); - for (Iterator iter = list.iterator(); iter.hasNext(); ) { - buf.append(iter.next()); + StringBuilder buf = new StringBuilder(); + for (String s: list) { + buf.append(s); } return buf.toString(); } else if (annotationValue.value() instanceof MemberDoc) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java index 8f32789444c..b735b01f72f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialFieldWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,15 +28,20 @@ package com.sun.tools.doclets.formats.html; import java.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Generate serialized form for serializable fields. * Documentation denoted by the tags serial and * serialField is processed. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Joe Fialli * @author Bhavesh Patel (Modified) */ @@ -55,18 +60,6 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl return Arrays.asList(cd.serializableFields()); } - protected void printTypeLinkNoDimension(Type type) { - ClassDoc cd = type.asClassDoc(); - //Linking to package private classes in serialized for causes - //broken links. Don't link to them. - if (type.isPrimitive() || cd.isPackagePrivate()) { - print(type.typeName()); - } else { - writer.printLink(new LinkInfoImpl( - LinkInfoImpl.CONTEXT_SERIAL_MEMBER, type)); - } - } - /** * Return the header for serializable fields section. * @@ -121,10 +114,10 @@ public class HtmlSerialFieldWriter extends FieldWriterImpl /** * Add the member header. * - * @param fieldsType the class document to be listed - * @param fieldTypeStr the string for the filed type to be documented + * @param fieldType the class document to be listed + * @param fieldTypeStr the string for the field type to be documented * @param fieldDimensions the dimensions of the field string to be added - * @param firldName name of the field to be added + * @param fieldName name of the field to be added * @param contentTree the content tree to which the member header will be added */ public void addMemberHeader(ClassDoc fieldType, String fieldTypeStr, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java index 6ce01209cf9..2b5bdcfe3a4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/HtmlSerialMethodWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,14 +26,19 @@ package com.sun.tools.doclets.formats.html; import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Generate serialized form for Serializable/Externalizable methods. * Documentation denoted by the serialData tag is processed. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Joe Fialli * @author Bhavesh Patel (Modified) */ @@ -161,14 +166,4 @@ public class HtmlSerialMethodWriter extends MethodWriterImpl implements method.containingClass().qualifiedName(), method.name()); } } - - protected void printTypeLinkNoDimension(Type type) { - ClassDoc cd = type.asClassDoc(); - if (type.isPrimitive() || cd.isPackagePrivate()) { - print(type.typeName()); - } else { - writer.printLink(new LinkInfoImpl( - LinkInfoImpl.CONTEXT_SERIAL_MEMBER,type)); - } - } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java index 3e4b96886d9..f0d0707be0d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,19 @@ package com.sun.tools.doclets.formats.html; -import com.sun.tools.doclets.internal.toolkit.util.links.*; import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; +import com.sun.tools.doclets.internal.toolkit.util.links.*; /** * A factory that returns a link given the information about it. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ @@ -66,18 +71,19 @@ public class LinkFactoryImpl extends LinkFactory { classLinkInfo.type != null && !classDoc.qualifiedTypeName().equals(classLinkInfo.type.qualifiedTypeName())) : ""; - StringBuffer label = new StringBuffer( + StringBuilder label = new StringBuilder( classLinkInfo.getClassLinkLabel(m_writer.configuration)); classLinkInfo.displayLength += label.length(); Configuration configuration = ConfigurationImpl.getInstance(); LinkOutputImpl linkOutput = new LinkOutputImpl(); if (classDoc.isIncluded()) { if (configuration.isGeneratedDoc(classDoc)) { - String filename = pathString(classLinkInfo); + DocPath filename = getPath(classLinkInfo); if (linkInfo.linkToSelf || - !(linkInfo.classDoc.name() + ".html").equals(m_writer.filename)) { - linkOutput.append(m_writer.getHyperLinkString(filename, - classLinkInfo.where, label.toString(), + !(DocPath.forName(classDoc)).equals(m_writer.filename)) { + linkOutput.append(m_writer.getHyperLinkString( + filename.fragment(classLinkInfo.where), + label.toString(), classLinkInfo.isStrong, classLinkInfo.styleName, title, classLinkInfo.target)); if (noLabel && !classLinkInfo.excludeTypeParameterLinks) { @@ -155,18 +161,13 @@ public class LinkFactoryImpl extends LinkFactory { * "../../java/lang/Object.html" * * @param linkInfo the information about the link. - * @param fileName the file name, to which path string is. */ - private String pathString(LinkInfoImpl linkInfo) { + private DocPath getPath(LinkInfoImpl linkInfo) { if (linkInfo.context == LinkInfoImpl.PACKAGE_FRAME) { //Not really necessary to do this but we want to be consistent //with 1.4.2 output. - return linkInfo.classDoc.name() + ".html"; + return DocPath.forName(linkInfo.classDoc); } - StringBuffer buf = new StringBuffer(m_writer.relativePath); - buf.append(DirectoryManager.getPathToPackage( - linkInfo.classDoc.containingPackage(), - linkInfo.classDoc.name() + ".html")); - return buf.toString(); + return m_writer.pathToRoot.resolve(DocPath.forClass(linkInfo.classDoc)); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java index c9a176c1262..ef5f38f5735 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkInfoImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,12 @@ import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.util.links.*; +/** + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ public class LinkInfoImpl extends LinkInfo { /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java index 788fd685773..b4171971709 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/LinkOutputImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.tools.doclets.internal.toolkit.util.links.*; /** * Stores output of a link. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ @@ -38,13 +43,13 @@ public class LinkOutputImpl implements LinkOutput { /** * The output of the link. */ - public StringBuffer output; + public StringBuilder output; /** * Construct a new LinkOutputImpl. */ public LinkOutputImpl() { - output = new StringBuffer(); + output = new StringBuilder(); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java index 87591558482..6b9ff239511 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/MethodWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes method documentation in HTML format. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (rewrite) @@ -395,7 +400,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null)? + return writer.getHyperLink((cd == null)? "method_summary": "methods_inherited_from_class_" + configuration().getClassName(cd), @@ -410,7 +415,7 @@ public class MethodWriterImpl extends AbstractExecutableMemberWriter */ protected void addNavDetailLink(boolean link, Content liNav) { if (link) { - liNav.addContent(writer.getHyperLink("", "method_detail", + liNav.addContent(writer.getHyperLink("method_detail", writer.getResource("doclet.navMethod"))); } else { liNav.addContent(writer.getResource("doclet.navMethod")); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java index dda91ced7d6..5b9cda91b33 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/NestedClassWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Writes nested class documentation in HTML format. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @author Jamie Ho (rewrite) @@ -198,9 +203,8 @@ public class NestedClassWriterImpl extends AbstractMemberWriter */ protected Content getNavSummaryLink(ClassDoc cd, boolean link) { if (link) { - return writer.getHyperLink("", (cd == null) ? "nested_class_summary": - "nested_classes_inherited_from_class_" + - cd.qualifiedName(), + return writer.getHyperLink((cd == null) ? "nested_class_summary": + "nested_classes_inherited_from_class_" + cd.qualifiedName(), writer.getResource("doclet.navNested")); } else { return writer.getResource("doclet.navNested"); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java index 27414e0a276..e218a273d47 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageFrameWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,16 +27,22 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.formats.html.markup.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class to generate file for each package contents in the left-hand bottom * frame. This will list all the Class Kinds in the package. A click on any * class-kind will update the right-hand frame with the clicked class-kind page. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ @@ -53,18 +59,13 @@ public class PackageFrameWriter extends HtmlDocletWriter { */ private Set documentedClasses; - /** - * The name of the output file. - */ - public static final String OUTPUT_FILE_NAME = "package-frame.html"; - /** * Constructor to construct PackageFrameWriter object and to generate * "package-frame.html" file in the respective package directory. * For example for package "java.lang" this will generate file * "package-frame.html" file in the "java/lang" directory. It will also * create "java/lang" directory in the current or the destination directory - * if it doesen't exist. + * if it doesn't exist. * * @param configuration the configuration of the doclet. * @param packageDoc PackageDoc under consideration. @@ -72,7 +73,7 @@ public class PackageFrameWriter extends HtmlDocletWriter { public PackageFrameWriter(ConfigurationImpl configuration, PackageDoc packageDoc) throws IOException { - super(configuration, DirectoryManager.getDirectoryPath(packageDoc), OUTPUT_FILE_NAME, DirectoryManager.getRelativePath(packageDoc)); + super(configuration, DocPath.forPackage(packageDoc).resolve(DocPaths.PACKAGE_FRAME)); this.packageDoc = packageDoc; if (configuration.root.specifiedPackages().length == 0) { documentedClasses = new HashSet(Arrays.asList(configuration.root.classes())); @@ -107,7 +108,7 @@ public class PackageFrameWriter extends HtmlDocletWriter { } catch (IOException exc) { configuration.standardmessage.error( "doclet.exception_encountered", - exc.toString(), OUTPUT_FILE_NAME); + exc.toString(), DocPaths.PACKAGE_FRAME.getPath()); throw new DocletAbortException(); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java index 3ac4b98fee1..6e066a8a3a0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexFrameWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,22 @@ package com.sun.tools.doclets.formats.html; import java.io.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Generate the package index for the left-hand frame in the generated output. * A click on the package name in this frame will update the page in the bottom * left hand frame with the listing of contents of the clicked package. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar */ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { @@ -46,7 +52,7 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { * @param filename Name of the package index file to be generated. */ public PackageIndexFrameWriter(ConfigurationImpl configuration, - String filename) throws IOException { + DocPath filename) throws IOException { super(configuration, filename); } @@ -56,7 +62,7 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { */ public static void generate(ConfigurationImpl configuration) { PackageIndexFrameWriter packgen; - String filename = "overview-frame.html"; + DocPath filename = DocPaths.OVERVIEW_FRAME; try { packgen = new PackageIndexFrameWriter(configuration, filename); packgen.buildPackageIndexFile("doclet.Window_Overview", false); @@ -103,12 +109,12 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { if (pd.name().length() > 0) { packageLabel = getPackageLabel(pd.name()); packageLinkContent = getHyperLink(pathString(pd, - "package-frame.html"), "", packageLabel, "", + DocPaths.PACKAGE_FRAME), packageLabel, "", "packageFrame"); } else { packageLabel = new RawHtml("<unnamed package>"); - packageLinkContent = getHyperLink("package-frame.html", - "", packageLabel, "", "packageFrame"); + packageLinkContent = getHyperLink(DocPaths.PACKAGE_FRAME, + packageLabel, "", "packageFrame"); } Content li = HtmlTree.LI(packageLinkContent); return li; @@ -142,7 +148,7 @@ public class PackageIndexFrameWriter extends AbstractPackageIndexWriter { * @param body the Content object to which the all classes link should be added */ protected void addAllClassesLink(Content body) { - Content linkContent = getHyperLink("allclasses-frame.html", "", + Content linkContent = getHyperLink(DocPaths.ALLCLASSES_FRAME, allclassesLabel, "", "packageFrame"); Content div = HtmlTree.DIV(HtmlStyle.indexHeader, linkContent); body.addContent(div); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java index 7b9be91ddcc..77d2bae2fe4 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,15 +27,21 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Generate the package index page "overview-summary.html" for the right-hand * frame. A click on the package name on this page will update the same frame - * with the "pacakge-summary.html" file for the clicked package. + * with the "package-summary.html" file for the clicked package. + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) @@ -67,7 +73,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { * @see Group */ public PackageIndexWriter(ConfigurationImpl configuration, - String filename) + DocPath filename) throws IOException { super(configuration, filename); this.root = configuration.root; @@ -82,7 +88,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { */ public static void generate(ConfigurationImpl configuration) { PackageIndexWriter packgen; - String filename = "overview-summary.html"; + DocPath filename = DocPaths.OVERVIEW_SUMMARY; try { packgen = new PackageIndexWriter(configuration, filename); packgen.buildPackageIndexFile("doclet.Window_Overview_Summary", true); @@ -172,7 +178,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { Content see = seeLabel; see.addContent(" "); Content descPara = HtmlTree.P(see); - Content descLink = getHyperLink("", "overview_description", + Content descLink = getHyperLink(DocLink.fragment("overview_description"), descriptionLabel, "", ""); descPara.addContent(descLink); div.addContent(descPara); @@ -228,7 +234,7 @@ public class PackageIndexWriter extends AbstractPackageIndexWriter { * Adds the lower navigation bar and the bottom text * (from the -bottom option) at the bottom of page. * - * @param the documentation tree to which the navigation bar footer will be added + * @param body the documentation tree to which the navigation bar footer will be added */ protected void addNavigationBarFooter(Content body) { addNavLinks(false, body); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java index 7996655559b..e95c370502c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageTreeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,14 +28,19 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class to generate Tree page for a package. The name of the file generated is * "package-tree.html" and it is generated in the respective package directory. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ @@ -62,15 +67,14 @@ public class PackageTreeWriter extends AbstractTreeWriter { * @throws DocletAbortException */ public PackageTreeWriter(ConfigurationImpl configuration, - String path, String filename, + DocPath path, PackageDoc packagedoc, PackageDoc prev, PackageDoc next) throws IOException { - super(configuration, path, filename, + super(configuration, path, new ClassTree( configuration.classDocCatalog.allClasses(packagedoc), - configuration), - packagedoc); + configuration)); this.packagedoc = packagedoc; this.prev = prev; this.next = next; @@ -91,17 +95,16 @@ public class PackageTreeWriter extends AbstractTreeWriter { PackageDoc pkg, PackageDoc prev, PackageDoc next, boolean noDeprecated) { PackageTreeWriter packgen; - String path = DirectoryManager.getDirectoryPath(pkg); - String filename = "package-tree.html"; + DocPath path = DocPath.forPackage(pkg).resolve(DocPaths.PACKAGE_TREE); try { - packgen = new PackageTreeWriter(configuration, path, filename, pkg, + packgen = new PackageTreeWriter(configuration, path, pkg, prev, next); packgen.generatePackageTreeFile(); packgen.close(); } catch (IOException exc) { configuration.standardmessage.error( "doclet.exception_encountered", - exc.toString(), filename); + exc.toString(), path.getPath()); throw new DocletAbortException(); } } @@ -170,9 +173,8 @@ public class PackageTreeWriter extends AbstractTreeWriter { if (prev == null) { return getNavLinkPrevious(null); } else { - String path = DirectoryManager.getRelativePath(packagedoc.name(), - prev.name()); - return getNavLinkPrevious(path + "package-tree.html"); + DocPath path = DocPath.relativePath(packagedoc, prev); + return getNavLinkPrevious(path.resolve(DocPaths.PACKAGE_TREE)); } } @@ -185,9 +187,8 @@ public class PackageTreeWriter extends AbstractTreeWriter { if (next == null) { return getNavLinkNext(null); } else { - String path = DirectoryManager.getRelativePath(packagedoc.name(), - next.name()); - return getNavLinkNext(path + "package-tree.html"); + DocPath path = DocPath.relativePath(packagedoc, next); + return getNavLinkNext(path.resolve(DocPaths.PACKAGE_TREE)); } } @@ -197,7 +198,7 @@ public class PackageTreeWriter extends AbstractTreeWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java index 579aee25a93..4545484e451 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageUseWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,14 +27,20 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate package usage information. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert G. Field * @author Bhavesh Patel (Modified) */ @@ -51,11 +57,9 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @throws DocletAbortException */ public PackageUseWriter(ConfigurationImpl configuration, - ClassUseMapper mapper, String filename, + ClassUseMapper mapper, DocPath filename, PackageDoc pkgdoc) throws IOException { - super(configuration, DirectoryManager.getDirectoryPath(pkgdoc), - filename, - DirectoryManager.getRelativePath(pkgdoc.name())); + super(configuration, DocPath.forPackage(pkgdoc).resolve(filename)); this.pkgdoc = pkgdoc; // by examining all classes in this package, find what packages @@ -92,7 +96,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { public static void generate(ConfigurationImpl configuration, ClassUseMapper mapper, PackageDoc pkgdoc) { PackageUseWriter pkgusegen; - String filename = "package-use.html"; + DocPath filename = DocPaths.PACKAGE_USE; try { pkgusegen = new PackageUseWriter(configuration, mapper, filename, pkgdoc); @@ -226,10 +230,10 @@ public class PackageUseWriter extends SubWriterHolderWriter { */ protected void addClassRow(ClassDoc usedClass, String packageName, Content contentTree) { - String path = pathString(usedClass, - "class-use/" + usedClass.name() + ".html"); + DocPath dp = pathString(usedClass, + DocPaths.CLASS_USE.resolve(DocPath.forName(usedClass))); Content td = HtmlTree.TD(HtmlStyle.colOne, - getHyperLink(path, packageName, new StringContent(usedClass.name()))); + getHyperLink(dp.fragment(packageName), new StringContent(usedClass.name()))); addIndexComment(usedClass, td); contentTree.addContent(td); } @@ -242,7 +246,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { */ protected void addPackageUse(PackageDoc pkg, Content contentTree) throws IOException { Content tdFirst = HtmlTree.TD(HtmlStyle.colFirst, - getHyperLink("", Util.getPackageName(pkg), + getHyperLink(Util.getPackageName(pkg), new RawHtml(Util.getPackageName(pkg)))); contentTree.addContent(tdFirst); HtmlTree tdLast = new HtmlTree(HtmlTag.TD); @@ -282,7 +286,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @return a content tree for the package link */ protected Content getNavLinkPackage() { - Content linkContent = getHyperLink("package-summary.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_SUMMARY, packageLabel); Content li = HtmlTree.LI(linkContent); return li; @@ -304,7 +308,7 @@ public class PackageUseWriter extends SubWriterHolderWriter { * @return a content tree for the tree link */ protected Content getNavLinkTree() { - Content linkContent = getHyperLink("package-tree.html", "", + Content linkContent = getHyperLink(DocPaths.PACKAGE_TREE, treeLabel); Content li = HtmlTree.LI(linkContent); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java index bc3531803b4..64f367e62e3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/PackageWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,16 +27,22 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import java.util.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Class to generate file for each package contents in the right-hand * frame. This will list all the Class Kinds in the package. A click on any * class-kind will update the frame with the clicked class-kind page. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ @@ -58,18 +64,13 @@ public class PackageWriterImpl extends HtmlDocletWriter */ protected PackageDoc packageDoc; - /** - * The name of the output file. - */ - private static final String OUTPUT_FILE_NAME = "package-summary.html"; - /** * Constructor to construct PackageWriter object and to generate * "package-summary.html" file in the respective package directory. * For example for package "java.lang" this will generate file * "package-summary.html" file in the "java/lang" directory. It will also * create "java/lang" directory in the current or the destination directory - * if it doesen't exist. + * if it doesn't exist. * * @param configuration the configuration of the doclet. * @param packageDoc PackageDoc under consideration. @@ -77,24 +78,14 @@ public class PackageWriterImpl extends HtmlDocletWriter * @param next Next package in the sorted array. */ public PackageWriterImpl(ConfigurationImpl configuration, - PackageDoc packageDoc, PackageDoc prev, PackageDoc next) - throws IOException { - super(configuration, DirectoryManager.getDirectoryPath(packageDoc), OUTPUT_FILE_NAME, - DirectoryManager.getRelativePath(packageDoc.name())); + PackageDoc packageDoc, PackageDoc prev, PackageDoc next) + throws IOException { + super(configuration, DocPath.forPackage(packageDoc).resolve(DocPaths.PACKAGE_SUMMARY)); this.prev = prev; this.next = next; this.packageDoc = packageDoc; } - /** - * Return the name of the output file. - * - * @return the name of the output file. - */ - public String getOutputFileName() { - return OUTPUT_FILE_NAME; - } - /** * {@inheritDoc} */ @@ -121,7 +112,7 @@ public class PackageWriterImpl extends HtmlDocletWriter addSummaryComment(packageDoc, docSummaryDiv); div.addContent(docSummaryDiv); Content space = getSpace(); - Content descLink = getHyperLink("", "package_description", + Content descLink = getHyperLink(DocLink.fragment("package_description"), descriptionLabel, "", ""); Content descPara = new HtmlTree(HtmlTag.P, seeLabel, space, descLink); div.addContent(descPara); @@ -248,7 +239,7 @@ public class PackageWriterImpl extends HtmlDocletWriter /** * {@inheritDoc} */ - public void printDocument(Content contentTree) { + public void printDocument(Content contentTree) throws IOException { printHtmlDocument(configuration.metakeywords.getMetaKeywords(packageDoc), true, contentTree); } @@ -259,7 +250,7 @@ public class PackageWriterImpl extends HtmlDocletWriter * @return a content tree for the class use link */ protected Content getNavLinkClassUse() { - Content useLink = getHyperLink("package-use.html", "", + Content useLink = getHyperLink(DocPaths.PACKAGE_USE, useLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; @@ -275,9 +266,8 @@ public class PackageWriterImpl extends HtmlDocletWriter if (prev == null) { li = HtmlTree.LI(prevpackageLabel); } else { - String path = DirectoryManager.getRelativePath(packageDoc.name(), - prev.name()); - li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "", + DocPath path = DocPath.relativePath(packageDoc, prev); + li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), prevpackageLabel, "", "")); } return li; @@ -293,9 +283,8 @@ public class PackageWriterImpl extends HtmlDocletWriter if (next == null) { li = HtmlTree.LI(nextpackageLabel); } else { - String path = DirectoryManager.getRelativePath(packageDoc.name(), - next.name()); - li = HtmlTree.LI(getHyperLink(path + "package-summary.html", "", + DocPath path = DocPath.relativePath(packageDoc, next); + li = HtmlTree.LI(getHyperLink(path.resolve(DocPaths.PACKAGE_SUMMARY), nextpackageLabel, "", "")); } return li; @@ -308,7 +297,7 @@ public class PackageWriterImpl extends HtmlDocletWriter * @return a content tree for the tree link */ protected Content getNavLinkTree() { - Content useLink = getHyperLink("package-tree.html", "", + Content useLink = getHyperLink(DocPaths.PACKAGE_TREE, treeLabel, "", ""); Content li = HtmlTree.LI(useLink); return li; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java index 6d39f0a4cc7..c1df94a8728 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SerializedFormWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,40 +29,28 @@ import java.io.*; import com.sun.javadoc.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.DocPaths; +import com.sun.tools.doclets.internal.toolkit.util.DocletAbortException; /** * Generate the Serialized Form Information Page. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar */ public class SerializedFormWriterImpl extends SubWriterHolderWriter - implements com.sun.tools.doclets.internal.toolkit.SerializedFormWriter { - - private static final String FILE_NAME = "serialized-form.html"; + implements SerializedFormWriter { /** * @throws IOException * @throws DocletAbortException */ public SerializedFormWriterImpl() throws IOException { - super(ConfigurationImpl.getInstance(), FILE_NAME); - } - - /** - * Writes the given header. - * - * @param header the header to write. - */ - public void writeHeader(String header) { - printHtmlHeader(header, null, true); - printTop(); - navLinks(true); - hr(); - center(); - h1(); - print(header); - h1End(); - centerEnd(); + super(ConfigurationImpl.getInstance(), DocPaths.SERIALIZED_FORM); } /** @@ -225,20 +213,10 @@ public class SerializedFormWriterImpl extends SubWriterHolderWriter /** * {@inheritDoc} */ - public void printDocument(Content serializedTree) { + public void printDocument(Content serializedTree) throws IOException { printHtmlDocument(null, true, serializedTree); } - private void tableHeader() { - tableIndexSummary(); - trBgcolorStyle("#CCCCFF", "TableSubHeadingColor"); - } - - private void tableFooter() { - fontEnd(); - thEnd(); trEnd(); tableEnd(); - } - /** * Return an instance of a SerialFieldWriter. * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java index 6bbcae6c14f..924557c95df 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SingleIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,15 +26,21 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate only one index file for all the Member Names with Indexing in * Unicode Order. The name of the generated file is "index-all.html" and it is * generated in current or the destination directory. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see java.lang.Character * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) @@ -49,11 +55,9 @@ public class SingleIndexWriter extends AbstractIndexWriter { * @param indexbuilder Unicode based Index from {@link IndexBuilder} */ public SingleIndexWriter(ConfigurationImpl configuration, - String filename, + DocPath filename, IndexBuilder indexbuilder) throws IOException { super(configuration, filename, indexbuilder); - relativepathNoSlash = "."; - relativePath = "./"; } /** @@ -65,7 +69,7 @@ public class SingleIndexWriter extends AbstractIndexWriter { public static void generate(ConfigurationImpl configuration, IndexBuilder indexbuilder) { SingleIndexWriter indexgen; - String filename = "index-all.html"; + DocPath filename = DocPaths.INDEX_ALL; try { indexgen = new SingleIndexWriter(configuration, filename, indexbuilder); @@ -111,7 +115,7 @@ public class SingleIndexWriter extends AbstractIndexWriter { for (int i = 0; i < indexbuilder.elements().length; i++) { String unicode = (indexbuilder.elements())[i].toString(); contentTree.addContent( - getHyperLink("#_" + unicode + "_", new StringContent(unicode))); + getHyperLink("_" + unicode + "_", new StringContent(unicode))); contentTree.addContent(getSpace()); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java index 5fd7f887683..299f4f53313 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SourceToHTMLConverter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,18 +26,21 @@ package com.sun.tools.doclets.formats.html; import java.io.*; + import javax.tools.FileObject; + import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * Converts Java Source Code to HTML. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -61,7 +64,7 @@ public class SourceToHTMLConverter { * Relative path from the documentation root to the file that is being * generated. */ - private static String relativePath = ""; + private static DocPath relativePath = DocPath.empty; /** * Source is converted to HTML using static methods below. @@ -76,7 +79,7 @@ public class SourceToHTMLConverter { * @param outputdir the name of the directory to output to. */ public static void convertRoot(ConfigurationImpl configuration, RootDoc rd, - String outputdir) { + DocPath outputdir) { if (rd == null || outputdir == null) { return; } @@ -94,8 +97,7 @@ public class SourceToHTMLConverter { // package files to HTML. if (!(configuration.nodeprecated && (Util.isDeprecated(cds[i]) || Util.isDeprecated(cds[i].containingPackage())))) - convertClass(configuration, cds[i], - getPackageOutputDir(outputdir, cds[i].containingPackage())); + convertClass(configuration, cds[i], outputdir); } } @@ -107,11 +109,10 @@ public class SourceToHTMLConverter { * @param outputdir the name of the directory to output to. */ public static void convertPackage(ConfigurationImpl configuration, PackageDoc pd, - String outputdir) { - if (pd == null || outputdir == null) { + DocPath outputdir) { + if (pd == null) { return; } - String classOutputdir = getPackageOutputDir(outputdir, pd); ClassDoc[] cds = pd.allClasses(); for (int i = 0; i < cds.length; i++) { // If -nodeprecated option is set and the class is marked as deprecated, @@ -119,22 +120,10 @@ public class SourceToHTMLConverter { // containing package deprecation since it is already check in // the calling method above. if (!(configuration.nodeprecated && Util.isDeprecated(cds[i]))) - convertClass(configuration, cds[i], classOutputdir); + convertClass(configuration, cds[i], outputdir); } } - /** - * Return the directory write output to for the given package. - * - * @param outputDir the directory to output to. - * @param pd the Package to generate output for. - * @return the package output directory as a String. - */ - private static String getPackageOutputDir(String outputDir, PackageDoc pd) { - return outputDir + File.separator + - DirectoryManager.getDirectoryPath(pd) + File.separator; - } - /** * Convert the given Class to an HTML. * @@ -143,8 +132,8 @@ public class SourceToHTMLConverter { * @param outputdir the name of the directory to output to. */ public static void convertClass(ConfigurationImpl configuration, ClassDoc cd, - String outputdir) { - if (cd == null || outputdir == null) { + DocPath outputdir) { + if (cd == null) { return; } try { @@ -167,8 +156,9 @@ public class SourceToHTMLConverter { LineNumberReader reader = new LineNumberReader(r); int lineno = 1; String line; - relativePath = DirectoryManager.getRelativePath(DocletConstants.SOURCE_OUTPUT_DIR_NAME) + - DirectoryManager.getRelativePath(cd.containingPackage()); + relativePath = DocPaths.SOURCE_OUTPUT + .resolve(DocPath.forPackage(cd)) + .invert(); Content body = getHeader(); Content pre = new HtmlTree(HtmlTag.PRE); try { @@ -183,8 +173,8 @@ public class SourceToHTMLConverter { addBlankLines(pre); Content div = HtmlTree.DIV(HtmlStyle.sourceContainer, pre); body.addContent(div); - writeToFile(body, outputdir, cd.name(), configuration); - } catch (Exception e){ + writeToFile(body, outputdir.resolve(DocPath.forClass(cd)), configuration); + } catch (IOException e) { e.printStackTrace(); } } @@ -193,12 +183,11 @@ public class SourceToHTMLConverter { * Write the output to the file. * * @param body the documentation content to be written to the file. - * @param outputDir the directory to output to. - * @param className the name of the class that I am converting to HTML. + * @param path the path for the file. * @param configuration the Doclet configuration to pass notices to. */ - private static void writeToFile(Content body, String outputDir, - String className, ConfigurationImpl configuration) throws IOException { + private static void writeToFile(Content body, DocPath path, + ConfigurationImpl configuration) throws IOException { Content htmlDocType = DocType.Transitional(); Content head = new HtmlTree(HtmlTag.HEAD); head.addContent(HtmlTree.TITLE(new StringContent( @@ -207,15 +196,15 @@ public class SourceToHTMLConverter { Content htmlTree = HtmlTree.HTML(configuration.getLocale().getLanguage(), head, body); Content htmlDocument = new HtmlDocument(htmlDocType, htmlTree); - File dir = new File(outputDir); - dir.mkdirs(); - File newFile = new File(dir, className + ".html"); - configuration.message.notice("doclet.Generating_0", newFile.getPath()); - FileOutputStream fout = new FileOutputStream(newFile); - BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fout)); - bw.write(htmlDocument.toString()); - bw.close(); - fout.close(); + configuration.message.notice("doclet.Generating_0", path.getPath()); + DocFile df = DocFile.createFileForOutput(configuration, path); + Writer w = df.openWriter(); + try { + htmlDocument.write(w, true); + } finally { + w.close(); + } + } /** @@ -226,17 +215,15 @@ public class SourceToHTMLConverter { */ public static HtmlTree getStyleSheetProperties(ConfigurationImpl configuration) { String filename = configuration.stylesheetfile; + DocPath stylesheet; if (filename.length() > 0) { - File stylefile = new File(filename); - String parent = stylefile.getParent(); - filename = (parent == null)? - filename: - filename.substring(parent.length() + 1); + DocFile file = DocFile.createFileForInput(configuration, filename); + stylesheet = DocPath.create(file.getName()); } else { - filename = "stylesheet.css"; + stylesheet = DocPaths.STYLESHEET; } - filename = relativePath + filename; - HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", filename, "Style"); + DocPath p = relativePath.resolve(stylesheet); + HtmlTree link = HtmlTree.LINK("stylesheet", "text/css", p.getPath(), "Style"); return link; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java index 9d608730654..69f273e7f69 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SplitIndexWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,15 +26,21 @@ package com.sun.tools.doclets.formats.html; import java.io.*; -import com.sun.tools.doclets.internal.toolkit.util.*; + import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate Separate Index Files for all the member names with Indexing in * Unicode Order. This will create "index-files" directory in the current or * destination directory and will generate separate file for each unicode index. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see java.lang.Character * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) @@ -56,15 +62,13 @@ public class SplitIndexWriter extends AbstractIndexWriter { * from this file. * * @param path Path to the file which is getting generated. - * @param filename Name of the file which is getting genrated. - * @param relpath Relative path from this file to the current directory. * @param indexbuilder Unicode based Index from {@link IndexBuilder} */ public SplitIndexWriter(ConfigurationImpl configuration, - String path, String filename, - String relpath, IndexBuilder indexbuilder, + DocPath path, + IndexBuilder indexbuilder, int prev, int next) throws IOException { - super(configuration, path, filename, relpath, indexbuilder); + super(configuration, path, indexbuilder); this.prev = prev; this.next = next; } @@ -79,17 +83,16 @@ public class SplitIndexWriter extends AbstractIndexWriter { public static void generate(ConfigurationImpl configuration, IndexBuilder indexbuilder) { SplitIndexWriter indexgen; - String filename = ""; - String path = DirectoryManager.getPath("index-files"); - String relpath = DirectoryManager.getRelativePath("index-files"); + DocPath filename = DocPath.empty; + DocPath path = DocPaths.INDEX_FILES; try { for (int i = 0; i < indexbuilder.elements().length; i++) { int j = i + 1; int prev = (j == 1)? -1: i; int next = (j == indexbuilder.elements().length)? -1: j + 1; - filename = "index-" + j +".html"; + filename = DocPaths.indexN(j); indexgen = new SplitIndexWriter(configuration, - path, filename, relpath, + path.resolve(filename), indexbuilder, prev, next); indexgen.generateIndexFile((Character)indexbuilder. elements()[i]); @@ -98,7 +101,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { } catch (IOException exc) { configuration.standardmessage.error( "doclet.exception_encountered", - exc.toString(), filename); + exc.toString(), filename.getPath()); throw new DocletAbortException(); } } @@ -136,7 +139,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { Object[] unicodeChars = indexbuilder.elements(); for (int i = 0; i < unicodeChars.length; i++) { int j = i + 1; - contentTree.addContent(getHyperLink("index-" + j + ".html", + contentTree.addContent(getHyperLink(DocPaths.indexN(j), new StringContent(unicodeChars[i].toString()))); contentTree.addContent(getSpace()); } @@ -153,7 +156,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { return HtmlTree.LI(prevletterLabel); } else { - Content prevLink = getHyperLink("index-" + prev + ".html", "", + Content prevLink = getHyperLink(DocPaths.indexN(prev), prevletterLabel); return HtmlTree.LI(prevLink); } @@ -170,7 +173,7 @@ public class SplitIndexWriter extends AbstractIndexWriter { return HtmlTree.LI(nextletterLabel); } else { - Content nextLink = getHyperLink("index-" + next + ".html","", + Content nextLink = getHyperLink(DocPaths.indexN(next), nextletterLabel); return HtmlTree.LI(nextLink); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java index 6790b739ef6..8f00a359a83 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/SubWriterHolderWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,11 @@ package com.sun.tools.doclets.formats.html; import java.io.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.formats.html.markup.*; /** * This abstract class exists to provide functionality needed in the @@ -39,6 +40,11 @@ import com.sun.tools.doclets.formats.html.markup.*; * can not be used effectively to change formatting. The concrete * class subclass of this class can be subclassed to change formatting. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see AbstractMemberWriter * @see ClassWriterImpl * @@ -48,30 +54,11 @@ import com.sun.tools.doclets.formats.html.markup.*; */ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { - public SubWriterHolderWriter(ConfigurationImpl configuration, - String filename) throws IOException { + public SubWriterHolderWriter(ConfigurationImpl configuration, DocPath filename) + throws IOException { super(configuration, filename); } - - public SubWriterHolderWriter(ConfigurationImpl configuration, - String path, String filename, String relpath) - throws IOException { - super(configuration, path, filename, relpath); - } - - public void printTypeSummaryHeader() { - tdIndex(); - font("-1"); - code(); - } - - public void printTypeSummaryFooter() { - codeEnd(); - fontEnd(); - tdEnd(); - } - /** * Add the summary header. * @@ -99,14 +86,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { return table; } - public void printTableHeadingBackground(String str) { - tableIndexDetail(); - tableHeaderStart("#CCCCFF", 1); - strong(str); - tableHeaderEnd(); - tableEnd(); - } - /** * Add the inherited summary header. * @@ -120,19 +99,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { mw.addInheritedSummaryLabel(cd, inheritedTree); } - public void printSummaryFooter(AbstractMemberWriter mw, ClassDoc cd) { - tableEnd(); - space(); - } - - public void printInheritedSummaryFooter(AbstractMemberWriter mw, ClassDoc cd) { - codeEnd(); - summaryRowEnd(); - trEnd(); - tableEnd(); - space(); - } - /** * Add the index comment. * @@ -143,24 +109,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { addIndexComment(member, member.firstSentenceTags(), contentTree); } - protected void printIndexComment(Doc member, Tag[] firstSentenceTags) { - Tag[] deprs = member.tags("deprecated"); - if (Util.isDeprecated((ProgramElementDoc) member)) { - strongText("doclet.Deprecated"); - space(); - if (deprs.length > 0) { - printInlineDeprecatedComment(member, deprs[0]); - } - return; - } else { - ClassDoc cd = ((ProgramElementDoc)member).containingClass(); - if (cd != null && Util.isDeprecated(cd)) { - strongText("doclet.Deprecated"); space(); - } - } - printSummaryComment(member, firstSentenceTags); - } - /** * Add the index comment. * @@ -217,18 +165,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { addSummaryLinkComment(mw, member, member.firstSentenceTags(), contentTree); } - public void printSummaryLinkComment(AbstractMemberWriter mw, - ProgramElementDoc member, - Tag[] firstSentenceTags) { - codeEnd(); - println(); - br(); - printNbsps(); - printIndexComment(member, firstSentenceTags); - summaryRowEnd(); - trEnd(); - } - /** * Add the summary link comment. * @@ -259,13 +195,6 @@ public abstract class SubWriterHolderWriter extends HtmlDocletWriter { mw.addInheritedSummaryLink(cd, member, linksTree); } - public void printMemberHeader() { - hr(); - } - - public void printMemberFooter() { - } - /** * Get the document content header tree * diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java index 9fb3bcdade1..0dfb46787f5 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletOutputImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,13 +30,18 @@ import com.sun.tools.doclets.internal.toolkit.taglets.*; /** * The output for HTML taglets. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.5 * @author Jamie Ho */ public class TagletOutputImpl implements TagletOutput { - private StringBuffer output; + private StringBuilder output; public TagletOutputImpl(String o) { setOutput(o); @@ -46,7 +51,7 @@ public class TagletOutputImpl implements TagletOutput { * {@inheritDoc} */ public void setOutput (Object o) { - output = new StringBuffer(o == null ? "" : (String) o); + output = new StringBuilder(o == null ? "" : (String) o); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java index f0b49781e42..ce158d443d0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TagletWriterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * The taglet writer that writes HTML. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.5 * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -61,15 +66,17 @@ public class TagletWriterImpl extends TagletWriter { public TagletOutput getDocRootOutput() { if (htmlWriter.configuration.docrootparent.length() > 0) return new TagletOutputImpl(htmlWriter.configuration.docrootparent); + else if (htmlWriter.pathToRoot.isEmpty()) + return new TagletOutputImpl("."); else - return new TagletOutputImpl(htmlWriter.relativepathNoSlash); + return new TagletOutputImpl(htmlWriter.pathToRoot.getPath()); } /** * {@inheritDoc} */ public TagletOutput deprecatedTagOutput(Doc doc) { - StringBuffer output = new StringBuffer(); + StringBuilder output = new StringBuilder(); Tag[] deprs = doc.tags("deprecated"); if (doc instanceof ClassDoc) { if (Util.isDeprecated((ProgramElementDoc) doc)) { @@ -120,9 +127,9 @@ public class TagletWriterImpl extends TagletWriter { * {@inheritDoc} */ public TagletOutput getParamHeader(String header) { - StringBuffer result = new StringBuffer(); + StringBuilder result = new StringBuilder(); result.append("

"); - result.append("" + header + "
"); + result.append("").append(header).append(""); return new TagletOutputImpl(result.toString()); } @@ -165,19 +172,24 @@ public class TagletWriterImpl extends TagletWriter { htmlWriter instanceof ClassWriterImpl) { //Automatically add link to constant values page for constant fields. result = addSeeHeader(result); - result += htmlWriter.getHyperLinkString(htmlWriter.relativePath + - ConfigurationImpl.CONSTANTS_FILE_NAME - + "#" + ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName() - + "." + ((FieldDoc) holder).name(), - htmlWriter.configuration.getText("doclet.Constants_Summary")); + DocPath constantsPath = + htmlWriter.pathToRoot.resolve(DocPaths.CONSTANT_VALUES); + String whichConstant = + ((ClassWriterImpl) htmlWriter).getClassDoc().qualifiedName() + "." + ((FieldDoc) holder).name(); + DocLink link = constantsPath.fragment(whichConstant); + result += htmlWriter.getHyperLinkString(link, + htmlWriter.configuration.getText("doclet.Constants_Summary"), + false); } if (holder.isClass() && ((ClassDoc)holder).isSerializable()) { //Automatically add link to serialized form page for serializable classes. if ((SerializedFormBuilder.serialInclude(holder) && SerializedFormBuilder.serialInclude(((ClassDoc)holder).containingPackage()))) { result = addSeeHeader(result); - result += htmlWriter.getHyperLinkString(htmlWriter.relativePath + "serialized-form.html", - ((ClassDoc)holder).qualifiedName(), htmlWriter.configuration.getText("doclet.Serialized_Form"), false); + DocPath serialPath = htmlWriter.pathToRoot.resolve(DocPaths.SERIALIZED_FORM); + DocLink link = serialPath.fragment(((ClassDoc)holder).qualifiedName()); + result += htmlWriter.getHyperLinkString(link, + htmlWriter.configuration.getText("doclet.Serialized_Form"), false); } } return result.equals("") ? null : new TagletOutputImpl(result + ""); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java index e116fe4e9a7..f51a834db81 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/TreeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,9 @@ package com.sun.tools.doclets.formats.html; import java.io.*; import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.formats.html.markup.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Generate Class Hierarchy page for all the Classes in this run. Use @@ -38,6 +38,11 @@ import com.sun.tools.doclets.internal.toolkit.*; * the generated file is "overview-tree.html" and it is generated in the * current or the destination directory. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ @@ -62,7 +67,7 @@ public class TreeWriter extends AbstractTreeWriter { * @param classtree the tree being built. */ public TreeWriter(ConfigurationImpl configuration, - String filename, ClassTree classtree) + DocPath filename, ClassTree classtree) throws IOException { super(configuration, filename, classtree); packages = configuration.packages; @@ -79,7 +84,7 @@ public class TreeWriter extends AbstractTreeWriter { public static void generate(ConfigurationImpl configuration, ClassTree classtree) { TreeWriter treegen; - String filename = "overview-tree.html"; + DocPath filename = DocPaths.OVERVIEW_TREE; try { treegen = new TreeWriter(configuration, filename, classtree); treegen.generateTreeFile(); @@ -139,9 +144,9 @@ public class TreeWriter extends AbstractTreeWriter { (configuration.nodeprecated && Util.isDeprecated(packages[i]))) { continue; } - String link = pathString(packages[i], "package-tree.html"); + DocPath link = pathString(packages[i], DocPaths.PACKAGE_TREE); Content li = HtmlTree.LI(getHyperLink( - link, "", new StringContent(packages[i].name()))); + link, new StringContent(packages[i].name()))); if (i < packages.length - 1) { li.addContent(", "); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java index 99c0fb0a983..573abe0462f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/WriterFactoryImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ package com.sun.tools.doclets.formats.html; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; /** * The factory that returns HTML writers. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java index 86fea133c2b..533c9b7a48c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/Comment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,23 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating a comment for HTML pages of javadoc output. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ -public class Comment extends Content{ +public class Comment extends Content { private String commentText; @@ -80,11 +88,13 @@ public class Comment extends Content{ /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - if (!endsWithNewLine(contentBuilder)) - contentBuilder.append(DocletConstants.NL); - contentBuilder.append("" + DocletConstants.NL); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + if (!atNewline) + out.write(DocletConstants.NL); + out.write("" + DocletConstants.NL); + return true; } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java index 03265d29e6f..e923333dba2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/DocType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,20 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating document type for HTML pages of javadoc output. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public class DocType extends Content{ @@ -107,7 +115,9 @@ public class DocType extends Content{ /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - contentBuilder.append(docType); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + out.write(docType); + return true; // guaranteed by constructor } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java index 96895531dd6..62b0f600283 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlAttr.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.formats.html.markup; /** * Enum representing HTML tag attributes. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public enum HtmlAttr { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java index c85927e0b67..8b4b400c819 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.tools.doclets.internal.toolkit.Content; /** * Stores constants for Html Doclet. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public class HtmlConstants { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java index 979c72b9211..376bfdcfeb2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,11 @@ import java.io.*; import java.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.formats.html.ConfigurationImpl; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.DocLink; +import com.sun.tools.doclets.internal.toolkit.util.DocPath; +import com.sun.tools.doclets.internal.toolkit.util.DocPaths; /** @@ -38,6 +42,11 @@ import com.sun.tools.doclets.internal.toolkit.*; * are used by the Sub-Classes in the package com.sun.tools.doclets.standard * and com.sun.tools.doclets.oneone. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Atul M Dambalkar * @author Robert Field @@ -50,25 +59,11 @@ public abstract class HtmlDocWriter extends HtmlWriter { * * @param filename String file name. */ - public HtmlDocWriter(Configuration configuration, - String filename) throws IOException { - super(configuration, - null, configuration.destDirName + filename, - configuration.docencoding); - // use File to normalize file separators + public HtmlDocWriter(Configuration configuration, DocPath filename) + throws IOException { + super(configuration, filename); configuration.message.notice("doclet.Generating_0", - new File(configuration.destDirName, filename)); - } - - public HtmlDocWriter(Configuration configuration, - String path, String filename) throws IOException { - super(configuration, - configuration.destDirName + path, filename, - configuration.docencoding); - // use File to normalize file separators - configuration.message.notice("doclet.Generating_0", - new File(configuration.destDirName, - ((path.length() > 0)? path + File.separator: "") + filename)); + filename.resolveAgainst(configuration.destDirName)); } /** @@ -76,123 +71,103 @@ public abstract class HtmlDocWriter extends HtmlWriter { */ public abstract Configuration configuration(); - /** - * Print Html Hyper Link. - * - * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. - * @param label Tag for the link. - * @param strong Boolean that sets label to strong. - */ - public void printHyperLink(String link, String where, - String label, boolean strong) { - print(getHyperLinkString(link, where, label, strong, "", "", "")); - } - - /** - * Print Html Hyper Link. - * - * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. - * @param label Tag for the link. - */ - public void printHyperLink(String link, String where, String label) { - printHyperLink(link, where, label, false); - } - - /** - * Print Html Hyper Link. - * - * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. - * @param label Tag for the link. - * @param strong Boolean that sets label to strong. - * @param stylename String style of text defined in style sheet. - */ - public void printHyperLink(String link, String where, - String label, boolean strong, - String stylename) { - print(getHyperLinkString(link, where, label, strong, stylename, "", "")); - } - /** * Return Html Hyper Link string. * * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. * @param label Tag for the link. * @param strong Boolean that sets label to strong. * @return String Hyper Link. */ - public String getHyperLinkString(String link, String where, + public String getHyperLinkString(DocPath link, String label, boolean strong) { - return getHyperLinkString(link, where, label, strong, "", "", ""); + return getHyperLinkString(link, label, strong, "", "", ""); + } + + public String getHyperLinkString(DocLink link, + String label, boolean strong) { + return getHyperLinkString(link, label, strong, "", "", ""); } /** * Get Html Hyper Link string. * * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. * @param label Tag for the link. * @param strong Boolean that sets label to strong. * @param stylename String style of text defined in style sheet. * @return String Hyper Link. */ - public String getHyperLinkString(String link, String where, + public String getHyperLinkString(DocPath link, String label, boolean strong, String stylename) { - return getHyperLinkString(link, where, label, strong, stylename, "", ""); + return getHyperLinkString(link, label, strong, stylename, "", ""); + } + + public String getHyperLinkString(DocLink link, + String label, boolean strong, + String stylename) { + return getHyperLinkString(link, label, strong, stylename, "", ""); } /** * Get Html Hyper Link string. * - * @param link String name of the file. * @param where Position of the link in the file. Character '#' is not * needed. * @param label Tag for the link. * @return a content tree for the hyper link */ - public Content getHyperLink(String link, String where, + public Content getHyperLink(String where, Content label) { - return getHyperLink(link, where, label, "", ""); + return getHyperLink(DocLink.fragment(where), label, "", ""); + } + + /** + * Get Html Hyper Link string. + * + * @param link String name of the file. + * @param label Tag for the link. + * @return a content tree for the hyper link + */ + public Content getHyperLink(DocPath link, + Content label) { + return getHyperLink(link, label, "", ""); + } + + public Content getHyperLink(DocLink link, + Content label) { + return getHyperLink(link, label, "", ""); } /** * Get Html Hyper Link string. * * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. * @param label Tag for the link. * @param strong Boolean that sets label to strong. * @param stylename String style of text defined in style sheet. - * @param title String that describes the link's content for accessibility. + * @param title String that describes the links content for accessibility. * @param target Target frame. * @return String Hyper Link. */ - public String getHyperLinkString(String link, String where, + public String getHyperLinkString(DocPath link, String label, boolean strong, String stylename, String title, String target) { - StringBuffer retlink = new StringBuffer(); - retlink.append(""); if (stylename != null && stylename.length() != 0) { @@ -218,19 +193,19 @@ public abstract class HtmlDocWriter extends HtmlWriter { * Get Html Hyper Link. * * @param link String name of the file. - * @param where Position of the link in the file. Character '#' is not - * needed. * @param label Tag for the link. * @param title String that describes the link's content for accessibility. * @param target Target frame. * @return a content tree for the hyper link. */ - public Content getHyperLink(String link, String where, + public Content getHyperLink(DocPath link, Content label, String title, String target) { - if (where != null && where.length() != 0) { - link += "#" + where; - } - HtmlTree anchor = HtmlTree.A(link, label); + return getHyperLink(new DocLink(link), label, title, target); + } + + public Content getHyperLink(DocLink link, + Content label, String title, String target) { + HtmlTree anchor = HtmlTree.A(link.toString(), label); if (title != null && title.length() != 0) { anchor.addAttr(HtmlAttr.TITLE, title); } @@ -240,17 +215,6 @@ public abstract class HtmlDocWriter extends HtmlWriter { return anchor; } - /** - * Get a hyperlink to a file. - * - * @param link String name of the file - * @param label Label for the link - * @return a content for the hyperlink to the file - */ - public Content getHyperLink(String link, Content label) { - return getHyperLink(link, "", label); - } - /** * Get link string without positioning in the file. * @@ -258,17 +222,8 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param label Tag for the link. * @return Strign Hyper link. */ - public String getHyperLinkString(String link, String label) { - return getHyperLinkString(link, "", label, false); - } - - /** - * Print the name of the package, this class is in. - * - * @param cd ClassDoc. - */ - public void printPkgName(ClassDoc cd) { - print(getPkgName(cd)); + public String getHyperLinkString(DocPath link, String label) { + return getHyperLinkString(link, label, false); } /** @@ -285,27 +240,6 @@ public abstract class HtmlDocWriter extends HtmlWriter { return ""; } - /** - * Keep track of member details list. Print the definition list start tag - * if it is not printed yet. - */ - public void printMemberDetailsListStartTag () { - if (!getMemberDetailsListPrinted()) { - dl(); - memberDetailsListPrinted = true; - } - } - - /** - * Print the definition list end tag if the list start tag was printed. - */ - public void printMemberDetailsListEndTag () { - if (getMemberDetailsListPrinted()) { - dlEnd(); - memberDetailsListPrinted = false; - } - } - public boolean getMemberDetailsListPrinted() { return memberDetailsListPrinted; } @@ -319,12 +253,12 @@ public abstract class HtmlDocWriter extends HtmlWriter { * @param frameset the frameset to be added to the HTML document */ public void printFramesetDocument(String title, boolean noTimeStamp, - Content frameset) { + Content frameset) throws IOException { Content htmlDocType = DocType.Frameset(); Content htmlComment = new Comment(configuration.getText("doclet.New_Page")); Content head = new HtmlTree(HtmlTag.HEAD); if (! noTimeStamp) { - Content headComment = new Comment("Generated by javadoc on " + today()); + Content headComment = new Comment(getGeneratedByString()); head.addContent(headComment); } if (configuration.charset.length() > 0) { @@ -339,7 +273,7 @@ public abstract class HtmlDocWriter extends HtmlWriter { head, frameset); Content htmlDocument = new HtmlDocument(htmlDocType, htmlComment, htmlTree); - print(htmlDocument.toString()); + write(htmlDocument); } /** @@ -356,46 +290,9 @@ public abstract class HtmlDocWriter extends HtmlWriter { return space; } - /** - * Print the closing </body> and </html> tags. - */ - public void printBodyHtmlEnd() { - println(); - bodyEnd(); - htmlEnd(); - } - - /** - * Calls {@link #printBodyHtmlEnd()} method. - */ - public void printFooter() { - printBodyHtmlEnd(); - } - - /** - * Print closing </html> tag. - */ - public void printFrameFooter() { - htmlEnd(); - } - - /** - * Print ten non-breaking spaces("&nbsp;"). - */ - public void printNbsps() { - print("          "); - } - - /** - * Get the day and date information for today, depending upon user option. - * - * @return String Today. - * @see java.util.Calendar - * @see java.util.GregorianCalendar - * @see java.util.TimeZone - */ - public String today() { + protected String getGeneratedByString() { Calendar calendar = new GregorianCalendar(TimeZone.getDefault()); - return calendar.getTime().toString(); + Date today = calendar.getTime(); + return "Generated by javadoc ("+ ConfigurationImpl.BUILD_DATE + ") on " + today; } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java index 458c174ba46..b62fe754309 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlDocument.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,21 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; import java.util.*; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating an HTML document for javadoc output. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public class HtmlDocument extends Content { @@ -69,7 +77,7 @@ public class HtmlDocument extends Content { * * @param htmlContent html content to be added */ - public void addContent(Content htmlContent) { + public final void addContent(Content htmlContent) { if (htmlContent.isValid()) docContent.add(htmlContent); } @@ -96,8 +104,9 @@ public class HtmlDocument extends Content { /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { + public boolean write(Writer out, boolean atNewline) throws IOException { for (Content c : docContent) - c.write(contentBuilder); + atNewline = c.write(out, atNewline); + return atNewline; } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java index 8d53c464e8d..61bb800cbef 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlStyle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.formats.html.markup; /** * Enum representing HTML styles. The name map to values in the CSS file. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public enum HtmlStyle { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java index 6a58bb0b3d8..a4ee63d772b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.formats.html.markup; /** * Enum representing HTML tags. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public enum HtmlTag { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java index ba6d623ef22..99543d1fdf0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,21 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; import java.util.*; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating HTML tree for javadoc output. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public class HtmlTree extends Content { @@ -423,9 +431,9 @@ public class HtmlTree extends Content { /** * Generates a META tag with the http-equiv, content and charset attributes. * - * @param http-equiv http equiv attribute for the META tag + * @param httpEquiv http equiv attribute for the META tag * @param content type of content - * @param charset character set used + * @param charSet character set used * @return an HtmlTree object for the META tag */ public static HtmlTree META(String httpEquiv, String content, String charSet) { @@ -751,35 +759,41 @@ public class HtmlTree extends Content { /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - if (!isInline() && !endsWithNewLine(contentBuilder)) - contentBuilder.append(DocletConstants.NL); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + if (!isInline() && !atNewline) + out.write(DocletConstants.NL); String tagString = htmlTag.toString(); - contentBuilder.append("<"); - contentBuilder.append(tagString); + out.write("<"); + out.write(tagString); Iterator iterator = attrs.keySet().iterator(); HtmlAttr key; String value = ""; while (iterator.hasNext()) { key = iterator.next(); value = attrs.get(key); - contentBuilder.append(" "); - contentBuilder.append(key.toString()); + out.write(" "); + out.write(key.toString()); if (!value.isEmpty()) { - contentBuilder.append("=\""); - contentBuilder.append(value); - contentBuilder.append("\""); + out.write("=\""); + out.write(value); + out.write("\""); } } - contentBuilder.append(">"); + out.write(">"); + boolean nl = false; for (Content c : content) - c.write(contentBuilder); + nl = c.write(out, nl); if (htmlTag.endTagRequired()) { - contentBuilder.append(""); + out.write(""); + } + if (!isInline()) { + out.write(DocletConstants.NL); + return true; + } else { + return false; } - if (!isInline()) - contentBuilder.append(DocletConstants.NL); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java index 166f9ef8c1a..bd6be7a5c36 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/HtmlWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,31 +32,25 @@ import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for the Html format code generation. - * Initilizes PrintWriter with FileWriter, to enable print + * Initializes PrintWriter with FileWriter, to enable print * related methods to generate the code to the named File through FileWriter. * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Atul M Dambalkar * @author Bhavesh Patel (Modified) */ -public class HtmlWriter extends PrintWriter { - - /** - * Name of the file, to which this writer is writing to. - */ - protected final String htmlFilename; +public class HtmlWriter { /** * The window title of this file */ protected String winTitle; - /** - * URL file separator string("/"). - */ - public static final String fileseparator = - DirectoryManager.URL_FILE_SEPARATOR; - /** * The configuration */ @@ -148,25 +142,22 @@ public class HtmlWriter extends PrintWriter { public final Content descfrmInterfaceLabel; + private final Writer writer; + /** * Constructor. * * @param path The directory path to be created for this file * or null if none to be created. - * @param filename File Name to which the PrintWriter will - * do the Output. - * @param docencoding Encoding to be used for this file. * @exception IOException Exception raised by the FileWriter is passed on * to next level. - * @exception UnSupportedEncodingException Exception raised by the + * @exception UnsupportedEncodingException Exception raised by the * OutputStreamWriter is passed on to next level. */ - public HtmlWriter(Configuration configuration, - String path, String filename, String docencoding) - throws IOException, UnsupportedEncodingException { - super(Util.genWriter(configuration, path, filename, docencoding)); + public HtmlWriter(Configuration configuration, DocPath path) + throws IOException, UnsupportedEncodingException { + writer = DocFile.createFileForOutput(configuration, path).openWriter(); this.configuration = configuration; - htmlFilename = filename; this.memberDetailsListPrinted = false; packageTableHeader = new String[] { configuration.getText("doclet.Package"), @@ -213,6 +204,14 @@ public class HtmlWriter extends PrintWriter { descfrmInterfaceLabel = getResource("doclet.Description_From_Interface"); } + public void write(Content c) throws IOException { + c.write(writer, true); + } + + public void close() throws IOException { + writer.close(); + } + /** * Get the configuration string as a content. * @@ -246,38 +245,6 @@ public class HtmlWriter extends PrintWriter { return new RawHtml(configuration.getText(key, a1, a2)); } - /** - * Print <HTML> tag. Add a newline character at the end. - */ - public void html() { - println(""); - } - - /** - * Print </HTML> tag. Add a newline character at the end. - */ - public void htmlEnd() { - println(""); - } - - /** - * Print the script code to be embeded before the </HEAD> tag. - */ - protected void printWinTitleScript(String winTitle){ - if(winTitle != null && winTitle.length() > 0) { - script(); - println("function windowTitle()"); - println("{"); - println(" if (location.href.indexOf('is-external=true') == -1) {"); - println(" parent.document.title=\"" + winTitle + "\";"); - println(" }"); - println("}"); - scriptEnd(); - noScript(); - noScriptEnd(); - } - } - /** * Returns an HtmlTree for the SCRIPT tag. * @@ -320,64 +287,6 @@ public class HtmlWriter extends PrintWriter { return script; } - /** - * Print the Javascript <SCRIPT> start tag with its type - * attribute. - */ - public void script() { - println(""); - } - - /** - * Print the Javascript <NOSCRIPT> start tag. - */ - public void noScript() { - println(""); - } - - /** - * Return the Javascript call to be embedded in the <BODY> tag. - * Return nothing if winTitle is empty. - * @return the Javascript call to be embedded in the <BODY> tag. - */ - protected String getWindowTitleOnload(){ - if(winTitle != null && winTitle.length() > 0) { - return " onload=\"windowTitle();\""; - } else { - return ""; - } - } - - /** - * Print <BODY BGCOLOR="bgcolor">, including JavaScript - * "onload" call to load windowtitle script. This script shows the name - * of the document in the window title bar when frames are on. - * - * @param bgcolor Background color. - * @param includeScript boolean set true if printing windowtitle script - */ - public void body(String bgcolor, boolean includeScript) { - print(""); - } - /** * Returns an HtmlTree for the BODY tag. * @@ -400,31 +309,6 @@ public class HtmlWriter extends PrintWriter { return body; } - /** - * Print </BODY> tag. Add a newline character at the end. - */ - public void bodyEnd() { - println(""); - } - - /** - * Print <TITLE> tag. Add a newline character at the end. - */ - public void title() { - println(""); - } - - /** - * Print <TITLE> tag. Add a newline character at the end. - * - * @param winTitle The title of this document. - */ - public void title(String winTitle) { - // Set window title string which is later printed - this.winTitle = winTitle; - title(); - } - /** * Returns an HtmlTree for the TITLE tag. * @@ -435,295 +319,6 @@ public class HtmlWriter extends PrintWriter { return title; } - /** - * Print </TITLE> tag. Add a newline character at the end. - */ - public void titleEnd() { - println(""); - } - - /** - * Print <UL> tag. Add a newline character at the end. - */ - public void ul() { - println("

"); - } - - /** - * Print <LI> tag. - */ - public void li() { - print("
  • "); - } - - /** - * Print <LI TYPE="type"> tag. - * - * @param type Type string. - */ - public void li(String type) { - print("
  • "); - } - - /** - * Print <H1> tag. Add a newline character at the end. - */ - public void h1() { - println("

    "); - } - - /** - * Print </H1> tag. Add a newline character at the end. - */ - public void h1End() { - println("

    "); - } - - /** - * Print text with <H1> tag. Also adds </H1> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H1> format. - */ - public void h1(String text) { - h1(); - println(text); - h1End(); - } - - /** - * Print <H2> tag. Add a newline character at the end. - */ - public void h2() { - println("

    "); - } - - /** - * Print text with <H2> tag. Also adds </H2> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H2> format. - */ - public void h2(String text) { - h2(); - println(text); - h2End(); - } - - /** - * Print </H2> tag. Add a newline character at the end. - */ - public void h2End() { - println("

    "); - } - - /** - * Print <H3> tag. Add a newline character at the end. - */ - public void h3() { - println("

    "); - } - - /** - * Print text with <H3> tag. Also adds </H3> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H3> format. - */ - public void h3(String text) { - h3(); - println(text); - h3End(); - } - - /** - * Print </H3> tag. Add a newline character at the end. - */ - public void h3End() { - println("

    "); - } - - /** - * Print <H4> tag. Add a newline character at the end. - */ - public void h4() { - println("

    "); - } - - /** - * Print </H4> tag. Add a newline character at the end. - */ - public void h4End() { - println("

    "); - } - - /** - * Print text with <H4> tag. Also adds </H4> tag. Add a newline character - * at the end of the text. - * - * @param text Text to be printed with <H4> format. - */ - public void h4(String text) { - h4(); - println(text); - h4End(); - } - - /** - * Print <H5> tag. Add a newline character at the end. - */ - public void h5() { - println("
    "); - } - - /** - * Print </H5> tag. Add a newline character at the end. - */ - public void h5End() { - println("
    "); - } - - /** - * Print HTML <IMG SRC="imggif" WIDTH="width" HEIGHT="height" ALT="imgname> - * tag. It prepends the "images" directory name to the "imggif". This - * method is used for oneone format generation. Add a newline character - * at the end. - * - * @param imggif Image GIF file. - * @param imgname Image name. - * @param width Width of the image. - * @param height Height of the image. - */ - public void img(String imggif, String imgname, int width, int height) { - println("\"""); - } - - /** - * Print <MENU> tag. Add a newline character at the end. - */ - public void menu() { - println(""); - } - - /** - * Print </MENU> tag. Add a newline character at the end. - */ - public void menuEnd() { - println(""); - } - - /** - * Print <PRE> tag. Add a newline character at the end. - */ - public void pre() { - println("
    ");
    -    }
    -
    -    /**
    -     * Print <PRE> tag without adding new line character at th eend.
    -     */
    -    public void preNoNewLine() {
    -        print("
    ");
    -    }
    -
    -    /**
    -     * Print </PRE> tag. Add a newline character at the end.
    -     */
    -    public void preEnd() {
    -        println("
    "); - } - - /** - * Print <HR> tag. Add a newline character at the end. - */ - public void hr() { - println("
    "); - } - - /** - * Print <HR SIZE="size" WIDTH="widthpercent%"> tag. Add a newline - * character at the end. - * - * @param size Size of the ruler. - * @param widthPercent Percentage Width of the ruler - */ - public void hr(int size, int widthPercent) { - println("
    "); - } - - /** - * Print <HR SIZE="size" NOSHADE> tag. Add a newline character at the end. - * - * @param size Size of the ruler. - * @param noshade noshade string. - */ - public void hr(int size, String noshade) { - println("
    "); - } - - /** - * Get the "<STRONG>" string. - * - * @return String Return String "<STRONG>"; - */ - public String getStrong() { - return ""; - } - - /** - * Get the "</STRONG>" string. - * - * @return String Return String "</STRONG>"; - */ - public String getStrongEnd() { - return ""; - } - - /** - * Print <STRONG> tag. - */ - public void strong() { - print(""); - } - - /** - * Print </STRONG> tag. - */ - public void strongEnd() { - print(""); - } - - /** - * Print text passed, in strong format using <STRONG> and </STRONG> tags. - * - * @param text String to be printed in between <STRONG> and </STRONG> tags. - */ - public void strong(String text) { - strong(); - print(text); - strongEnd(); - } - - /** - * Print text passed, in Italics using <I> and </I> tags. - * - * @param text String to be printed in between <I> and </I> tags. - */ - public void italics(String text) { - print(""); - print(text); - println(""); - } - /** * Return, text passed, with Italics <i> and </i> tags, surrounding it. * So if the text passed is "Hi", then string returned will be "<i>Hi</i>". @@ -738,13 +333,6 @@ public class HtmlWriter extends PrintWriter { return "" + text + ""; } - /** - * Print "&nbsp;", non-breaking space. - */ - public void space() { - print(" "); - } - /** * Return "&nbsp;", non-breaking space. */ @@ -752,677 +340,10 @@ public class HtmlWriter extends PrintWriter { return RawHtml.nbsp; } - /** - * Print <DL> tag. Add a newline character at the end. - */ - public void dl() { - println("
    "); - } - - /** - * Print </DL> tag. Add a newline character at the end. - */ - public void dlEnd() { - println("
    "); - } - - /** - * Print <DT> tag. - */ - public void dt() { - print("
    "); - } - - /** - * Print </DT> tag. - */ - public void dtEnd() { - print("
    "); - } - - /** - * Print <DD> tag. - */ - public void dd() { - print("
    "); - } - - /** - * Print </DD> tag. Add a newline character at the end. - */ - public void ddEnd() { - println("
    "); - } - - /** - * Print <SUP> tag. Add a newline character at the end. - */ - public void sup() { - println(""); - } - - /** - * Print </SUP> tag. Add a newline character at the end. - */ - public void supEnd() { - println(""); - } - - /** - * Print <FONT SIZE="size"> tag. Add a newline character at the end. - * - * @param size String size. - */ - public void font(String size) { - println(""); - } - - /** - * Print <FONT SIZE="size"> tag. - * - * @param size String size. - */ - public void fontNoNewLine(String size) { - print(""); - } - - /** - * Print <FONT CLASS="stylename"> tag. Add a newline character at the end. - * - * @param stylename String stylename. - */ - public void fontStyle(String stylename) { - print(""); - } - - /** - * Print <FONT SIZE="size" CLASS="stylename"> tag. Add a newline character - * at the end. - * - * @param size String size. - * @param stylename String stylename. - */ - public void fontSizeStyle(String size, String stylename) { - println(""); - } - - /** - * Print </FONT> tag. - */ - public void fontEnd() { - print(""); - } - - /** - * Get the "<FONT COLOR="color">" string. - * - * @param color String color. - * @return String Return String "<FONT COLOR="color">". - */ - public String getFontColor(String color) { - return ""; - } - - /** - * Get the "</FONT>" string. - * - * @return String Return String "</FONT>"; - */ - public String getFontEnd() { - return ""; - } - - /** - * Print <CENTER> tag. Add a newline character at the end. - */ - public void center() { - println("
    "); - } - - /** - * Print </CENTER> tag. Add a newline character at the end. - */ - public void centerEnd() { - println("
    "); - } - - /** - * Print anchor <A NAME="name"> tag. - * - * @param name Name String. - */ - public void aName(String name) { - print("
    "); - } - - /** - * Print </A> tag. - */ - public void aEnd() { - print(""); - } - - /** - * Print <I> tag. - */ - public void italic() { - print(""); - } - - /** - * Print </I> tag. - */ - public void italicEnd() { - print(""); - } - - /** - * Print contents within anchor <A NAME="name"> tags. - * - * @param name String name. - * @param content String contents. - */ - public void anchor(String name, String content) { - aName(name); - print(content); - aEnd(); - } - - /** - * Print anchor <A NAME="name"> and </A>tags. Print comment string - * "<!-- -->" within those tags. - * - * @param name String name. - */ - public void anchor(String name) { - anchor(name, ""); - } - - /** - * Print newline and then print <P> tag. Add a newline character at the - * end. - */ - public void p() { - println(); - println("

    "); - } - - /** - * Print newline and then print </P> tag. Add a newline character at the - * end. - */ - public void pEnd() { - println(); - println("

    "); - } - - /** - * Print newline and then print <BR> tag. Add a newline character at the - * end. - */ - public void br() { - println(); - println("
    "); - } - - /** - * Print <ADDRESS> tag. Add a newline character at the end. - */ - public void address() { - println("
    "); - } - - /** - * Print </ADDRESS> tag. Add a newline character at the end. - */ - public void addressEnd() { - println("
    "); - } - - /** - * Print <HEAD> tag. Add a newline character at the end. - */ - public void head() { - println(""); - } - - /** - * Print </HEAD> tag. Add a newline character at the end. - */ - public void headEnd() { - println(""); - } - - /** - * Print <CODE> tag. - */ - public void code() { - print(""); - } - - /** - * Print </CODE> tag. - */ - public void codeEnd() { - print(""); - } - - /** - * Print <EM> tag. Add a newline character at the end. - */ - public void em() { - println(""); - } - - /** - * Print </EM> tag. Add a newline character at the end. - */ - public void emEnd() { - println(""); - } - - /** - * Print HTML <TABLE BORDER="border" WIDTH="width" - * CELLPADDING="cellpadding" CELLSPACING="cellspacing"> tag. - * - * @param border Border size. - * @param width Width of the table. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - */ - public void table(int border, String width, int cellpadding, - int cellspacing) { - println(DocletConstants.NL + - ""); - } - - /** - * Print HTML <TABLE BORDER="border" WIDTH="width" - * CELLPADDING="cellpadding" CELLSPACING="cellspacing" SUMMARY="summary"> tag. - * - * @param border Border size. - * @param width Width of the table. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - * @param summary Table summary. - */ - public void table(int border, String width, int cellpadding, - int cellspacing, String summary) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print HTML <TABLE BORDER="border" CELLPADDING="cellpadding" - * CELLSPACING="cellspacing"> tag. - * - * @param border Border size. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - */ - public void table(int border, int cellpadding, int cellspacing) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print HTML <TABLE BORDER="border" CELLPADDING="cellpadding" - * CELLSPACING="cellspacing" SUMMARY="summary"> tag. - * - * @param border Border size. - * @param cellpadding Cellpadding for the table cells. - * @param cellspacing Cellspacing for the table cells. - * @param summary Table summary. - */ - public void table(int border, int cellpadding, int cellspacing, String summary) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print HTML <TABLE BORDER="border" WIDTH="width"> - * - * @param border Border size. - * @param width Width of the table. - */ - public void table(int border, String width) { - println(DocletConstants.NL + - "
    "); - } - - /** - * Print the HTML table tag with border size 0 and width 100%. - */ - public void table() { - table(0, "100%"); - } - - /** - * Print </TABLE> tag. Add a newline character at the end. - */ - public void tableEnd() { - println("
    "); - } - - /** - * Print <TR> tag. Add a newline character at the end. - */ - public void tr() { - println("
  • "); - } - - /** - * Print <TD NOWRAP> tag. - */ - public void tdNowrap() { - print(""); - } - - /** - * Print <TD WIDTH="width"> tag. - * - * @param width String width. - */ - public void tdWidth(String width) { - print(""); - } - - /** - * Print </TD> tag. Add a newline character at the end. - */ - public void tdEnd() { - println("
    "); - } - - /** - * Print </CAPTION> tag. Add a newline character at the end. - */ - public void captionEnd() { - println("
    "); - } - - /** - * Print <TH CLASS="stylename" SCOPE="scope" NOWRAP> tag. - * - * @param stylename style to be applied. - * @param scope the scope attribute. - */ - public void thScopeNoWrap(String stylename, String scope) { - print(""); - } - /* * Returns a header for Modifier and Type column of a table. */ public String getModifierTypeHeader() { return modifierTypeHeader; } - - /** - * Print <TH align="align" COLSPAN=i> tag. - * - * @param align the align attribute. - * @param i integer. - */ - public void thAlignColspan(String align, int i) { - print(""); - } - - /** - * Print <TH align="align" NOWRAP> tag. - * - * @param align the align attribute. - */ - public void thAlignNowrap(String align) { - print(""); - } - - /** - * Print </TH> tag. Add a newline character at the end. - */ - public void thEnd() { - println(""); - } - - /** - * Print <TD BGCOLOR="color" CLASS="stylename"> tag. - * - * @param color String color. - * @param stylename String stylename. - */ - public void tdBgcolorStyle(String color, String stylename) { - print(""); - } - - /** - * Print <TD COLSPAN=i BGCOLOR="color" CLASS="stylename"> tag. - * - * @param i integer. - * @param color String color. - * @param stylename String stylename. - */ - public void tdColspanBgcolorStyle(int i, String color, String stylename) { - print(""); - } - - /** - * Print <TD ALIGN="align"> tag. Adds a newline character - * at the end. - * - * @param align String align. - */ - public void tdAlign(String align) { - print(""); - } - - /** - * Print <TD ALIGN="align" CLASS="stylename"> tag. - * - * @param align String align. - * @param stylename String stylename. - */ - public void tdVAlignClass(String align, String stylename) { - print(""); - } - - /** - * Print <TD VALIGN="valign"> tag. - * - * @param valign String valign. - */ - public void tdVAlign(String valign) { - print(""); - } - - /** - * Print <TD ALIGN="align" VALIGN="valign"> tag. - * - * @param align String align. - * @param valign String valign. - */ - public void tdAlignVAlign(String align, String valign) { - print(""); - } - - /** - * Print <TD ALIGN="align" ROWSPAN=rowspan> tag. - * - * @param align String align. - * @param rowspan integer rowspan. - */ - public void tdAlignRowspan(String align, int rowspan) { - print(""); - } - - /** - * Print <TD ALIGN="align" VALIGN="valign" ROWSPAN=rowspan> tag. - * - * @param align String align. - * @param valign String valign. - * @param rowspan integer rowspan. - */ - public void tdAlignVAlignRowspan(String align, String valign, - int rowspan) { - print(""); - } - - /** - * Print <BLOCKQUOTE> tag. Add a newline character at the end. - */ - public void blockquote() { - println("
    "); - } - - /** - * Print </BLOCKQUOTE> tag. Add a newline character at the end. - */ - public void blockquoteEnd() { - println("
    "); - } - - /** - * Get the "<code>" string. - * - * @return String Return String "<code>"; - */ - public String getCode() { - return ""; - } - - /** - * Get the "</code>" string. - * - * @return String Return String "</code>"; - */ - public String getCodeEnd() { - return ""; - } - - /** - * Print <NOFRAMES> tag. Add a newline character at the end. - */ - public void noFrames() { - println(""); - } - - /** - * Print &lt;/NOFRAMES&gt; tag. Add a newline character at the end. - */ - public void noFramesEnd() { - println(""); - } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java index 56c23965534..8ad3c404023 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/RawHtml.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,20 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating raw HTML content to be added to HTML pages of javadoc output. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public class RawHtml extends Content{ @@ -82,7 +90,16 @@ public class RawHtml extends Content{ /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - contentBuilder.append(rawHtmlContent); + public String toString() { + return rawHtmlContent; + } + + /** + * {@inheritDoc} + */ + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + out.write(rawHtmlContent); + return rawHtmlContent.endsWith(DocletConstants.NL); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java index 2bf4437fb31..adddb32f993 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/formats/html/markup/StringContent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,20 @@ package com.sun.tools.doclets.formats.html.markup; +import java.io.IOException; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.Content; import com.sun.tools.doclets.internal.toolkit.util.*; /** * Class for generating string content for HTML tags of javadoc output. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public class StringContent extends Content{ @@ -93,7 +101,10 @@ public class StringContent extends Content{ /** * {@inheritDoc} */ - public void write(StringBuilder contentBuilder) { - contentBuilder.append(stringContent); + @Override + public boolean write(Writer out, boolean atNewline) throws IOException { + String s = stringContent.toString(); + out.write(s); + return s.endsWith(DocletConstants.NL); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java index 39f3af891a8..4ae4cce1722 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AbstractDoclet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,18 +25,19 @@ package com.sun.tools.doclets.internal.toolkit; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.builders.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; +import java.io.File; +import java.util.StringTokenizer; /** * An abstract implementation of a Doclet. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho */ @@ -105,7 +106,7 @@ public abstract class AbstractDoclet { /** * Start the generation of files. Call generate methods in the individual - * writers, which will in turn genrate the documentation files. Call the + * writers, which will in turn generate the documentation files. Call the * TreeWriter generation first to ensure the Class Hierarchy is built * first and then can be used in the later generation. * @@ -123,17 +124,7 @@ public abstract class AbstractDoclet { ClassTree classtree = new ClassTree(configuration, configuration.nodeprecated); generateClassFiles(root, classtree); - if (configuration.sourcepath != null && configuration.sourcepath.length() > 0) { - StringTokenizer pathTokens = new StringTokenizer(configuration.sourcepath, - String.valueOf(File.pathSeparatorChar)); - boolean first = true; - while(pathTokens.hasMoreTokens()){ - Util.copyDocFiles(configuration, - pathTokens.nextToken() + File.separator, - DocletConstants.DOC_FILES_DIR_NAME, first); - first = false; - } - } + Util.copyDocFiles(configuration, DocPaths.DOC_FILES); PackageListWriter.generate(configuration); generatePackageFiles(classtree); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java index 64f4b34e10b..18ada19f80b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeOptionalMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * The interface for writing annotation type optional member output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java index fb83c2a5688..28a18f9eaad 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeRequiredMemberWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,11 @@ import com.sun.javadoc.*; /** * The interface for writing annotation type required member output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java index 9ef63b50258..b65740edf87 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/AnnotationTypeWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing annotation type output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -152,7 +153,7 @@ public interface AnnotationTypeWriter { * * @param contentTree content tree that will be printed as a document */ - public void printDocument(Content contentTree); + public void printDocument(Content contentTree) throws IOException; /** * Close the writer. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java index c5bfb13e41b..f5904b3aef3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ClassWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing class output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -179,7 +180,7 @@ public interface ClassWriter { * * @param contentTree content tree that will be printed as a document */ - public void printDocument(Content contentTree); + public void printDocument(Content contentTree) throws IOException; /** * Close the writer. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java index e3d15ebd768..d94b7bef826 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Configuration.java @@ -25,12 +25,13 @@ package com.sun.tools.doclets.internal.toolkit; +import java.io.*; +import java.util.*; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory; import com.sun.tools.doclets.internal.toolkit.taglets.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.builders.BuilderFactory; -import com.sun.javadoc.*; -import java.util.*; -import java.io.*; /** * Configure the output based on the options. Doclets should sub-class @@ -38,9 +39,10 @@ import java.io.*; * all user options which are supported by the 1.1 doclet and the standard * doclet. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Robert Field. * @author Atul Dambalkar. @@ -406,11 +408,11 @@ public abstract class Configuration { group.checkPackageGroups(os[1], os[2]); } else if (opt.equals("-link")) { String url = os[1]; - extern.url(url, url, root, false); + extern.link(url, url, root, false); } else if (opt.equals("-linkoffline")) { String url = os[1]; String pkglisturl = os[2]; - extern.url(url, pkglisturl, root, true); + extern.link(url, pkglisturl, root, true); } } if (sourcepath.length() == 0) { @@ -454,7 +456,7 @@ public abstract class Configuration { tagletManager.addCustomTag(args[1], tagletpath); continue; } - String[] tokens = Util.tokenize(args[1], + String[] tokens = tokenize(args[1], TagletManager.SIMPLE_TAGLET_OPT_SEPERATOR, 3); if (tokens.length == 1) { String tagName = args[1]; @@ -463,7 +465,7 @@ public abstract class Configuration { tagletManager.addNewSimpleCustomTag(tagName, null, ""); } else { //Create a simple tag with the heading that has the same name as the tag. - StringBuffer heading = new StringBuffer(tagName + ":"); + StringBuilder heading = new StringBuilder(tagName + ":"); heading.setCharAt(0, Character.toUpperCase(tagName.charAt(0))); tagletManager.addNewSimpleCustomTag(tagName, heading.toString(), "a"); } @@ -478,6 +480,47 @@ public abstract class Configuration { } } + /** + * Given a string, return an array of tokens. The separator can be escaped + * with the '\' character. The '\' character may also be escaped by the + * '\' character. + * + * @param s the string to tokenize. + * @param separator the separator char. + * @param maxTokens the maximum number of tokens returned. If the + * max is reached, the remaining part of s is appended + * to the end of the last token. + * + * @return an array of tokens. + */ + private String[] tokenize(String s, char separator, int maxTokens) { + List tokens = new ArrayList(); + StringBuilder token = new StringBuilder (); + boolean prevIsEscapeChar = false; + for (int i = 0; i < s.length(); i += Character.charCount(i)) { + int currentChar = s.codePointAt(i); + if (prevIsEscapeChar) { + // Case 1: escaped character + token.appendCodePoint(currentChar); + prevIsEscapeChar = false; + } else if (currentChar == separator && tokens.size() < maxTokens-1) { + // Case 2: separator + tokens.add(token.toString()); + token = new StringBuilder(); + } else if (currentChar == '\\') { + // Case 3: escape character + prevIsEscapeChar = true; + } else { + // Case 4: regular character + token.appendCodePoint(currentChar); + } + } + if (token.length() > 0) { + tokens.add(token.toString()); + } + return tokens.toArray(new String[] {}); + } + private void addToSet(Set s, String str){ StringTokenizer st = new StringTokenizer(str, ":"); String current; @@ -530,12 +573,12 @@ public abstract class Configuration { String opt = os[0].toLowerCase(); if (opt.equals("-d")) { String destdirname = addTrailingFileSep(os[1]); - File destDir = new File(destdirname); + DocFile destDir = DocFile.createFileForDirectory(this, destdirname); if (!destDir.exists()) { //Create the output directory (in case it doesn't exist yet) reporter.printNotice(getText("doclet.dest_dir_create", destdirname)); - (new File(destdirname)).mkdirs(); + destDir.mkdirs(); } else if (!destDir.isDirectory()) { reporter.printError(getText( "doclet.destination_directory_not_directory_0", @@ -709,7 +752,7 @@ public abstract class Configuration { public InputStream getBuilderXML() throws FileNotFoundException { return builderXMLPath == null ? Configuration.class.getResourceAsStream(DEFAULT_BUILDER_XML) : - new FileInputStream(new File(builderXMLPath)); + DocFile.createFileForInput(this, builderXMLPath).openInputStream(); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java index a2eab1b46ec..1318a130177 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstantsSummaryWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,18 @@ package com.sun.tools.doclets.internal.toolkit; -import java.util.*; import java.io.*; +import java.util.*; + import com.sun.javadoc.*; /** * The interface for writing constants summary output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -137,6 +139,6 @@ public interface ConstantsSummaryWriter { * * @param contentTree content tree which should be printed */ - public abstract void printDocument(Content contentTree); + public abstract void printDocument(Content contentTree) throws IOException; } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java index 8ad48246377..f784b4ae4ec 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/ConstructorWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing constructor output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java index a7bdf96e0f0..836f7cf9e5f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/Content.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,20 @@ package com.sun.tools.doclets.internal.toolkit; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + import com.sun.tools.doclets.internal.toolkit.util.*; /** * A class to create content for javadoc output pages. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Bhavesh Patel */ public abstract class Content { @@ -39,10 +48,16 @@ public abstract class Content { * * @return string representation of the content */ + @Override public String toString() { - StringBuilder contentBuilder = new StringBuilder(); - write(contentBuilder); - return contentBuilder.toString(); + StringWriter out = new StringWriter(); + try { + write(out, true); + } catch (IOException e) { + // cannot happen from StringWriter + throw new DocletAbortException(); + } + return out.toString(); } /** @@ -60,10 +75,10 @@ public abstract class Content { public abstract void addContent(String stringContent); /** - * Writes content to a StringBuilder. + * Writes content to a writer. * */ - public abstract void write(StringBuilder contentBuilder); + public abstract boolean write(Writer writer, boolean atNewline) throws IOException ; /** * Returns true if the content is empty. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java index 8b14267880c..987c52f07ad 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/EnumConstantWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing enum constant output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -56,7 +57,7 @@ public interface EnumConstantWriter { * Get the enum constants documentation tree header. * * @param enumConstant the enum constant being documented - * @param enumConstantDetailsTree the content tree representing enum constant details + * @param enumConstantsDetailsTree the content tree representing enum constant details * @return content tree for the enum constant documentation header */ public Content getEnumConstantsTreeHeader(FieldDoc enumConstant, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java index c17ac269b32..554f1999e27 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/FieldWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing field output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java index 76baf59a1cd..53e0b5b260f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MemberSummaryWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing member summary output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java index 1864bf94364..ce4b90e1956 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/MethodWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import com.sun.javadoc.*; /** * The interface for writing method output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java index a5a023a3f8e..4aea9097955 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/NestedClassWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import java.io.*; /** * The interface for writing class output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java index eb8bf7be0d0..e6ce1ff4fe1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/PackageSummaryWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,17 @@ package com.sun.tools.doclets.internal.toolkit; -import com.sun.javadoc.*; import java.io.*; +import com.sun.javadoc.*; + /** * The interface for writing package summary output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -42,13 +44,6 @@ import java.io.*; public interface PackageSummaryWriter { - /** - * Return the name of the output file. - * - * @return the name of the output file. - */ - public abstract String getOutputFileName(); - /** * Get the header for the summary. * @@ -113,7 +108,7 @@ public interface PackageSummaryWriter { * * @param contentTree the content tree that will be printed */ - public abstract void printDocument(Content contentTree); + public abstract void printDocument(Content contentTree) throws IOException; /** * Close the writer. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java index 84454acdf24..89add8a363a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/SerializedFormWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; /** * The interface for writing serialized form output. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.5 @@ -150,7 +151,7 @@ public interface SerializedFormWriter { * * @param serializedTree the content tree that will be printed */ - public abstract void printDocument(Content serializedTree); + public abstract void printDocument(Content serializedTree) throws IOException; /** * Write the serialized form for a given field. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java index 252a54c561d..6c2fb5bd0f9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/WriterFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,16 @@ package com.sun.tools.doclets.internal.toolkit; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * The interface for a factory creates writers. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java index c016775a546..ef7b0d99ee3 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,13 @@ package com.sun.tools.doclets.internal.toolkit.builders; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import java.io.*; import java.lang.reflect.*; import java.util.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * The superclass for all builders. A builder is a class that provides * the structure and content of API documentation. A builder is completely @@ -41,9 +42,10 @@ import java.util.*; * do is implement the ConstantsSummaryWriter interface and pass it to the * builder using a WriterFactory. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java index 6a4be60532a..b7454d96879 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AbstractMemberBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,16 +27,16 @@ package com.sun.tools.doclets.internal.toolkit.builders; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * The superclass for all member builders. Member builders are only executed * within Class Builders. They essentially build sub-components. For example, * method documentation is a sub-component of class documentation. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java index a92ea569bcd..acde3af8d2f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,16 +27,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given annotation type. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -138,12 +140,7 @@ public class AnnotationTypeBuilder extends AbstractBuilder { //Only copy doc files dir if the containing package is not //documented AND if we have not documented a class from the same //package already. Otherwise, we are making duplicate copies. - Util.copyDocFiles(configuration, - Util.getPackageSourcePath(configuration, - annotationTypeDoc.containingPackage()) + - DirectoryManager.getDirectoryPath( - annotationTypeDoc.containingPackage()) - + File.separator, DocletConstants.DOC_FILES_DIR_NAME, true); + Util.copyDocFiles(configuration, containingPackage); containingPackagesSeen.add(containingPackage.name()); } } @@ -177,7 +174,7 @@ public class AnnotationTypeBuilder extends AbstractBuilder { * @param annotationInfoTree the content tree to which the documentation will be added */ public void buildAnnotationTypeSignature(XMLNode node, Content annotationInfoTree) { - StringBuffer modifiers = new StringBuffer( + StringBuilder modifiers = new StringBuilder( annotationTypeDoc.modifiers() + " "); writer.addAnnotationTypeSignature(Util.replaceText( modifiers.toString(), "interface", "@interface"), annotationInfoTree); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java index b0abbc305dd..edcfbe2094f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeOptionalMemberBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for optional annotation type members. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java index ec9c4f2a961..733eac39aa7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/AnnotationTypeRequiredMemberBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for required annotation type members. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java index e35be117bb5..71fb5a36b1b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/BuilderFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,17 @@ package com.sun.tools.doclets.internal.toolkit.builders; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; /** * The factory for constructing builders. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java index d050cab700e..83b0b85dd4d 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ClassBuilder.java @@ -27,16 +27,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given class. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -264,11 +266,7 @@ public class ClassBuilder extends AbstractBuilder { //Only copy doc files dir if the containing package is not //documented AND if we have not documented a class from the same //package already. Otherwise, we are making duplicate copies. - Util.copyDocFiles(configuration, - Util.getPackageSourcePath(configuration, - classDoc.containingPackage()) + - DirectoryManager.getDirectoryPath(classDoc.containingPackage()) - + File.separator, DocletConstants.DOC_FILES_DIR_NAME, true); + Util.copyDocFiles(configuration, containingPackage); containingPackagesSeen.add(containingPackage.name()); } } @@ -280,18 +278,18 @@ public class ClassBuilder extends AbstractBuilder { * @param classInfoTree the content tree to which the documentation will be added */ public void buildClassSignature(XMLNode node, Content classInfoTree) { - StringBuffer modifiers = new StringBuffer(classDoc.modifiers() + " "); + StringBuilder modifiers = new StringBuilder(classDoc.modifiers() + " "); if (isEnum) { modifiers.append("enum "); int index; if ((index = modifiers.indexOf("abstract")) >= 0) { - modifiers.delete(index, index + (new String("abstract")).length()); - modifiers = new StringBuffer( + modifiers.delete(index, index + "abstract".length()); + modifiers = new StringBuilder( Util.replaceText(modifiers.toString(), " ", " ")); } if ((index = modifiers.indexOf("final")) >= 0) { - modifiers.delete(index, index + (new String("final")).length()); - modifiers = new StringBuffer( + modifiers.delete(index, index + "final".length()); + modifiers = new StringBuilder( Util.replaceText(modifiers.toString(), " ", " ")); } //} else if (classDoc.isAnnotationType()) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java index bded1e85e09..6de9f78920f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstantsSummaryBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,16 +27,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the Constants Summary Page. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -345,7 +347,6 @@ public class ConstantsSummaryBuilder extends AbstractBuilder { /** * Return the list of visible constant fields for the given classdoc. - * @param cd the classdoc to examine. * @return the list of visible constant fields for the given classdoc. */ protected List members() { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java index 68efe8c124b..20f93081562 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/ConstructorBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a constructor. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java index 868297bc034..36f5d397441 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/EnumConstantBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a enum constants. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java index 0416ba98555..4f05027f672 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/FieldBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a field. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java index 3445d9617af..f6e2f339dda 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/LayoutParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,18 +24,26 @@ */ package com.sun.tools.doclets.internal.toolkit.builders; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import java.io.*; import java.util.*; + +import javax.xml.parsers.*; + import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; -import javax.xml.parsers.*; + +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Parse the XML that specified the order of operation for the builders. This * Parser uses SAX parsing. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 * @see SAXParser diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java index 8ad4c58f527..2d81a4caefd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MemberSummaryBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the member summary. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -165,7 +167,6 @@ public class MemberSummaryBuilder extends AbstractMemberBuilder { * This information can be used for doclet specific documentation * generation. * - * @param classDoc the {@link ClassDoc} we want to check. * @param type the type of members to return. * @return a list of methods that will be documented. * @see VisibleMemberMap diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java index 0a28d8928ea..ed933351fe1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/MethodBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.util.*; -import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.tools.doclets.internal.toolkit.*; + import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds documentation for a method. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java index 3f4494ae3c8..290d1fbc24f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/PackageSummaryBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,16 +26,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the summary for a given package. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -117,13 +119,7 @@ public class PackageSummaryBuilder extends AbstractBuilder { packageWriter.addPackageFooter(contentTree); packageWriter.printDocument(contentTree); packageWriter.close(); - Util.copyDocFiles( - configuration, - Util.getPackageSourcePath(configuration, packageDoc), - DirectoryManager.getDirectoryPath(packageDoc) - + File.separator - + DocletConstants.DOC_FILES_DIR_NAME, - true); + Util.copyDocFiles(configuration, packageDoc); } /** diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java index 013120b439b..3b50d6c00e7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/SerializedFormBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,16 +27,18 @@ package com.sun.tools.doclets.internal.toolkit.builders; import java.io.*; import java.util.*; + import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.tools.doclets.internal.toolkit.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * Builds the serialized form. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Bhavesh Patel (Modified) @@ -472,6 +474,8 @@ public class SerializedFormBuilder extends AbstractBuilder { Arrays.sort(tags); int tagsLength = tags.length; for (int i = 0; i < tagsLength; i++) { + if (tags[i].fieldName() == null || tags[i].fieldType() == null) // ignore malformed @serialField tags + continue; Content fieldsContentTree = fieldWriter.getFieldsContentHeader( (i == tagsLength - 1)); fieldWriter.addMemberHeader(tags[i].fieldTypeDoc(), diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java index 4b414dadd52..ae335b99cd9 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/builders/XMLNode.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,6 +32,11 @@ import java.util.Map; /** * Simple class to represent the attribute and elements of an XML node. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. */ public class XMLNode { XMLNode(XMLNode parent, String qname) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java index a3b53f32aa4..ce15461cc99 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseExecutableMemberTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,9 +29,10 @@ package com.sun.tools.doclets.internal.toolkit.taglets; * An abstract class for that implements the {@link Taglet} interface * for tags in ExecutableMembers. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java index 2dff8417c3c..24383b8a0c2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseInlineTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,9 +28,10 @@ package com.sun.tools.doclets.internal.toolkit.taglets; /** * An abstract inline taglet that outputs HTML. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java index c0c6bff552e..e83ac8303a1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/BaseTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,15 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; /** * An abstract class for that implements the {@link Taglet} interface. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java index 444771be25c..4fec56505d8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/CodeTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,6 +40,11 @@ import com.sun.tools.doclets.Taglet; * displays as: *

    The type {@code List

    }

    * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java index b2035b31890..fc7fc2451b0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DeprecatedTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * A taglet that represents the @deprecated tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java index f895b676683..8998f26121f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/DocRootTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,9 +32,10 @@ import com.sun.javadoc.*; * used to get the relative path to the document's root output * directory. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @author Doug Kramer diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java index 554756b5633..e737f9c7698 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritDocTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,9 +33,10 @@ import com.sun.tools.doclets.internal.toolkit.util.*; * be used with a method. It is used to inherit documentation from overriden * and implemented methods. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java index 20a265d208f..89518e8f002 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/InheritableTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.util.DocFinder; * A taglet should implement this interface if it supports the inheritDoc * tag or is automatically inherited if it is missing. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java index b8cfa6fcaec..2955406575c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LegacyTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,9 +36,10 @@ import com.sun.javadoc.*; * This taglet is able to wrap most most legacy taglets because * the standard doclet is the only known doclet to use legacy taglets. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @since 1.5 * @author Jamie Ho diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java index 7a465e33bf0..75cc3cf6ec2 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/LiteralTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,6 +38,11 @@ import com.sun.tools.doclets.Taglet; * displays as: *

    {@literal ac}
    * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ @@ -79,7 +84,7 @@ public class LiteralTaglet implements Taglet { * Replace occurrences of the following characters: < > & */ protected static String textToString(String text) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); for (int i = 0; i < text.length(); i++) { char c = text.charAt(i); switch (c) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java index 449bc1fb15d..ad4bf8bebdb 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ParamTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,18 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * A taglet that represents the @param tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 @@ -182,7 +184,7 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet { * Given an array of ParamTags,return its string representation. * Try to inherit the param tags that are missing. * - * @param doc the doc that holds the param tags. + * @param holder the doc that holds the param tags. * @param writer the TagletWriter that will write this tag. * @param formalParameters The array of parmeters (from type or executable * member) to check. @@ -255,7 +257,7 @@ public class ParamTaglet extends BaseTaglet implements InheritableTaglet { * been documented. * @param rankMap a {@link java.util.Map} which holds ordering * information about the parameters. - * @param nameMap a {@link java.util.Map} which holds a mapping + * @param rankMap a {@link java.util.Map} which holds a mapping * of a rank of a parameter to its name. This is * used to ensure that the right name is used * when parameter documentation is inherited. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java index f5e90c8f0e3..9d98a9691b7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ReturnTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,16 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @return tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java index bca2707f20c..4e3e8107c05 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SeeTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,16 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.tools.doclets.internal.toolkit.util.*; import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; /** * A taglet that represents the @see tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java index 3051503ba45..4b21cbd4172 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/SimpleTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * A simple single argument custom tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java index 70cee399648..4637b92a9ca 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletManager.java @@ -25,20 +25,21 @@ package com.sun.tools.doclets.internal.toolkit.taglets; -import com.sun.javadoc.*; -import com.sun.tools.doclets.internal.toolkit.util.*; - import java.io.*; import java.lang.reflect.*; import java.net.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.util.*; + /** * Manages theTaglets used by doclets. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 @@ -160,7 +161,7 @@ public class TagletManager { * @param message the message retriever to print warnings. */ public TagletManager(boolean nosince, boolean showversion, - boolean showauthor, MessageRetriever message){ + boolean showauthor, MessageRetriever message) { overridenStandardTags = new HashSet(); potentiallyConflictingTags = new HashSet(); standardTags = new HashSet(); @@ -252,47 +253,17 @@ public class TagletManager { * @param path the search path string * @return the resulting array of directory and JAR file URLs */ - private static URL[] pathToURLs(String path) { - StringTokenizer st = new StringTokenizer(path, File.pathSeparator); - URL[] urls = new URL[st.countTokens()]; - int count = 0; - while (st.hasMoreTokens()) { - URL url = fileToURL(new File(st.nextToken())); - if (url != null) { - urls[count++] = url; + private URL[] pathToURLs(String path) { + Set urls = new LinkedHashSet(); + for (String s: path.split(File.pathSeparator)) { + if (s.isEmpty()) continue; + try { + urls.add(new File(s).getAbsoluteFile().toURI().toURL()); + } catch (MalformedURLException e) { + message.error("doclet.MalformedURL", s); } } - urls = Arrays.copyOf(urls, count); - return urls; - } - - /** - * Returns the directory or JAR file URL corresponding to the specified - * local file name. - * - * @param file the File object - * @return the resulting directory or JAR file URL, or null if unknown - */ - private static URL fileToURL(File file) { - String name; - try { - name = file.getCanonicalPath(); - } catch (IOException e) { - name = file.getAbsolutePath(); - } - name = name.replace(File.separatorChar, '/'); - if (!name.startsWith("/")) { - name = "/" + name; - } - // If the file does not exist, then assume that it's a directory - if (!file.isFile()) { - name = name + "/"; - } - try { - return new URL("file", "", name); - } catch (MalformedURLException e) { - throw new IllegalArgumentException("file"); - } + return urls.toArray(new URL[urls.size()]); } @@ -448,7 +419,7 @@ public class TagletManager { //This known tag is excluded. return; } - StringBuffer combined_locations = new StringBuffer(); + StringBuilder combined_locations = new StringBuilder(); for (int i = 0; i < locations.length; i++) { if (i > 0) { combined_locations.append(", "); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java index e0dabc2b0c4..c7bbef457c1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletOutput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ package com.sun.tools.doclets.internal.toolkit.taglets; * different doclets work with different formats of output. A single taglet can * work with any doclet that provides an implementation of taglet output. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java index b26845c27e0..2e594db8e77 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/TagletWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,18 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import com.sun.javadoc.*; /** * The interface for the taglet writer. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.5 * @author Jamie Ho */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java index d25618aa119..7b8b365b165 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ThrowsTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,18 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * A taglet that represents the @throws tag. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java index e07bc1500a6..90794bff625 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/taglets/ValueTaglet.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.tools.doclets.internal.toolkit.taglets; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; import com.sun.tools.doclets.internal.toolkit.util.*; -import java.util.*; /** * An inline Taglet representing the value tag. This tag should only be used with @@ -39,9 +40,10 @@ import java.util.*; * is retrieved for the field that the inline tag appears on. The name is specifed * in the following format: [fully qualified class name]#[constant field name]. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 @@ -107,7 +109,7 @@ public class ValueTaglet extends BaseInlineTaglet { * @param config the current configuration of the doclet. * @param tag the value tag. * @param name the name of the field to search for. The name should be in - * # format. If the class name is omitted, + * {@code #} format. If the class name is omitted, * it is assumed that the field is in the current class. * * @return the corresponding FieldDoc. If the name is null or empty string, diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java index 529d4fc4432..9e83edffc0b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassDocCatalog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,9 +36,10 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; * those classes so that we can retrieve all of the classes from a particular * package later. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.4 @@ -184,7 +185,7 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; /** * Return all of the classes specified on the command-line that * belong to the given package. - * @param packageDoc the package to return the classes for. + * @param pkgDoc the package to return the classes for. */ public ClassDoc[] allClasses(PackageDoc pkgDoc) { return pkgDoc.isIncluded() ? diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java index 5da917e2c27..39f9adf765f 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,17 +25,19 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Build Class Hierarchy for all the Classes. This class builds the Class * Tree and the Interface Tree separately. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @see java.util.HashMap * @see java.util.List diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java index 017ed72833f..a7eb4f660f6 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ClassUseMapper.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,17 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; + /** * Map all class uses for a given class. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @since 1.2 * @author Robert G. Field diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java index d74c08ee742..5c8821450fd 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/CommentedMethodFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * Find a commented method. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * */ public class CommentedMethodFinder extends MethodFinder { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java index 5c64a8f19aa..8f8a096e019 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DeprecatedAPIListBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,19 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.javadoc.*; import java.util.*; + +import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; /** * Build list of all the deprecated packages, classes, constructors, fields and methods. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Atul M Dambalkar */ public class DeprecatedAPIListBuilder { @@ -145,7 +151,7 @@ public class DeprecatedAPIListBuilder { /** * Return the list of deprecated Doc objects of a given type. * - * @param the constant representing the type of list being returned. + * @param type the constant representing the type of list being returned. */ public List getList(int type) { return deprecatedLists.get(type); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java deleted file mode 100644 index fd50d8f0501..00000000000 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DirectoryManager.java +++ /dev/null @@ -1,317 +0,0 @@ -/* - * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.doclets.internal.toolkit.util; - -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; -import java.io.*; - - -/** - * Handle the directory creations and the path string generations. - * All static - never instaniated. - * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API - * - * @since 1.2 - * @author Atul M Dambalkar - */ -public class DirectoryManager { - - /** - * The file separator string, "/", used in the formation of the URL path. - */ - public static final String URL_FILE_SEPARATOR = "/"; - - /** - * Never instaniated. - */ - private DirectoryManager() { - } - - /** - * Given a PackageDoc, return its URL path string. - * - * @param pd PackageDoc - * @see #getPath(String) - */ - public static String createPathString(PackageDoc pd) { - if (pd == null) { - return ""; - } - return getPath(pd.name()); - } - - /** - * Given a ClassDoc, return its URL path string. - * - * @param cd ClassDoc - * @see #getPath(String) - */ - public static String createPathString(ClassDoc cd) { - if (cd == null) { - return ""; - } - PackageDoc pd = cd.containingPackage(); - return (pd == null)? "": getPath(pd.name()); - } - - /** - * Given a PackageDoc, return the corresponding directory name - * with the platform-dependent file separator between subdirectory names. - * For example, if name of the package is "java.lang" , then it - * returns "java/lang" on Unix and "java\lang" on Windows. - * If name of the package contains no dot, then the value - * will be returned unchanged. Because package names cannot - * end in a dot, the return value will never end with a slash. - *

    - * Also see getPath for the URL separator version of this method - * that takes a string instead of a PackageDoc. - * - * @param pd the PackageDoc - * @return the platform-dependent directory path for the package - */ - public static String getDirectoryPath(PackageDoc pd) { - return pd == null || pd.name().length() == 0 ? "" : getDirectoryPath(pd.name()); - } - - /** - * Given a package name, return the corresponding directory name - * with the platform-dependent file separator between subdirectory names. - * For example, if name of the package is "java.lang" , then it - * returns "java/lang" on Unix and "java\lang" on Windows. - * If name of the package contains no dot, then the value - * will be returned unchanged. Because package names cannot - * end in a dot, the return value will never end with a slash. - *

    - * Also see getPath for the URL separator version of this method - * that takes a string instead of a PackageDoc. - * - * @param packageName the name of the package - * @return the platform-dependent directory path for the package - */ - public static String getDirectoryPath(String packageName) { - if (packageName == null || packageName.length() == 0) { - return ""; - } - StringBuffer pathstr = new StringBuffer(); - for (int i = 0; i < packageName.length(); i++) { - char ch = packageName.charAt(i); - if (ch == '.') { - pathstr.append(URL_FILE_SEPARATOR); - } else { - pathstr.append(ch); - } - } - if (pathstr.length() > 0 && ! pathstr.toString().endsWith(URL_FILE_SEPARATOR)) { - pathstr.append(URL_FILE_SEPARATOR); - } - return pathstr.toString(); - } - - /** - * Given a package name (a string), return the path string, - * with the URL separator "/" separating the subdirectory names. - * If name of the package contains no dot, then the value - * will be returned unchanged. Because package names cannot - * end in a dot, the return value will never end with a slash. - *

    - * For example if the string is "com.sun.javadoc" then the URL - * path string will be "com/sun/javadoc". - * - * @param name the package name as a String - * @return the String URL path - */ - public static String getPath(String name) { - if (name == null || name.length() == 0) { - return ""; - } - StringBuffer pathstr = new StringBuffer(); - for (int i = 0; i < name.length(); i++) { - char ch = name.charAt(i); - if (ch == '.') { - pathstr.append(URL_FILE_SEPARATOR); - } else { - pathstr.append(ch); - } - } - return pathstr.toString(); - } - - /** - * Given two package names as strings, return the relative path - * from the package directory corresponding to the first string - * to the package directory corresponding to the second string, - * with the URL file separator "/" separating subdirectory names. - *

    - * For example, if the parameter "from" is "java.lang" - * and parameter "to" is "java.applet", return string - * "../../java/applet". - * - * @param from the package name from which path is calculated - * @param to the package name to which path is calculated - * @return relative path between "from" and "to" with URL - * separators - * @see #getRelativePath(String) - * @see #getPath(String) - */ - public static String getRelativePath(String from, String to) { - StringBuffer pathstr = new StringBuffer(); - pathstr.append(getRelativePath(from)); - pathstr.append(getPath(to)); - pathstr.append(URL_FILE_SEPARATOR); - return pathstr.toString(); - } - - /** - * Given a package name as a string, return relative path string - * from the corresponding package directory to the root of - * the documentation, using the URL separator "/" between - * subdirectory names. - *

    - * For example, if the string "from" is "java.lang", - * return "../../" - * - * @param from the package - * @return String relative path from "from". - * @see #getRelativePath(String, String) - */ - public static String getRelativePath(PackageDoc from) { - return from == null || from.name().length() == 0 ? "" : getRelativePath(from.name()); - } - - /** - * Given a package name as a string, return relative path string - * from the corresponding package directory to the root of - * the documentation, using the URL separator "/" between - * subdirectory names. - *

    - * For example, if the string "from" is "java.lang", - * return "../../" - * - * @param from the package name - * @return String relative path from "from". - * @see #getRelativePath(String, String) - */ - public static String getRelativePath(String from) { - if (from == null || from.length() == 0) { - return ""; - } - StringBuffer pathstr = new StringBuffer(); - for (int i = 0; i < from.length(); i++) { - char ch = from.charAt(i); - if (ch == '.') { - pathstr.append(".." + URL_FILE_SEPARATOR); - } - } - pathstr.append(".." + URL_FILE_SEPARATOR); - return pathstr.toString(); - } - - /** - * Given a relative or absolute path that might be empty, - * convert it to a path that does not end with a - * URL separator "/". Used for converting - * HtmlStandardWriter.relativepath when replacing {@docRoot}. - * - * @param path the path to convert. An empty path represents - * the current directory. - */ - public static String getPathNoTrailingSlash(String path) { - if ( path.equals("") ) { - return "."; - } - if ( path.equals("/") ) { - return "/."; - } - if ( path.endsWith("/") ) { - // Remove trailing slash - path = path.substring(0, path.length() -1); - } - return path; - } - - /** - * Given a path string create all the directories in the path. For example, - * if the path string is "java/applet", the method will create directory - * "java" and then "java/applet" if they don't exist. The file separator - * string "/" is platform dependent system property. - * - * @param path Directory path string. - */ - public static void createDirectory(Configuration configuration, - String path) { - if (path == null || path.length() == 0) { - return; - } - File dir = new File(path); - if (dir.exists()) { - return; - } else { - if (dir.mkdirs()) { - return; - } else { - configuration.message.error( - "doclet.Unable_to_create_directory_0", path); - throw new DocletAbortException(); - } - } - } - - /** - * Given a package name and a file name, return the full path to that file. - * For example, if PackageDoc passed is for "java.lang" and the filename - * passed is "package-summary.html", then the string returned is - * "java/lang/package-summary.html". - * - * @param pd PackageDoc. - * @param filename File name to be appended to the path of the package. - */ - public static String getPathToPackage(PackageDoc pd, String filename) { - StringBuffer buf = new StringBuffer(); - String pathstr = createPathString(pd); - if (pathstr.length() > 0) { - buf.append(pathstr); - buf.append(URL_FILE_SEPARATOR); - } - buf.append(filename); - return buf.toString(); - } - - /** - * Given a class name return the full path to the class file. - * For example, if ClassDoc passed is for "java.lang.Object" then the - * string returned is "java/lang/Object.html". - * - * @param cd ClassDoc. - */ - public static String getPathToClass(ClassDoc cd) { - return getPathToPackage(cd.containingPackage(), cd.name() + ".html"); - } - -} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFile.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFile.java new file mode 100644 index 00000000000..33781c73174 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFile.java @@ -0,0 +1,399 @@ +/* + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.doclets.internal.toolkit.util; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.UnsupportedEncodingException; +import java.io.Writer; +import java.util.ArrayList; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + +import javax.tools.JavaFileManager.Location; +import javax.tools.StandardLocation; + +import com.sun.tools.doclets.internal.toolkit.Configuration; + +/** + * Abstraction for handling files, which may be specified directly + * (e.g. via a path on the command line) or relative to a Location. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + * @since 8 + */ +public class DocFile { + + /** + * The doclet configuration. + * Provides access to options such as docencoding, output directory, etc. + */ + private final Configuration configuration; + + /** + * The location for this file. Maybe null if the file was created without + * a location or path. + */ + private final Location location; + + /** + * The path relative to the (output) location. Maybe null if the file was + * created without a location or path. + */ + private final DocPath path; + + /** + * The file object itself. + * This is temporary, until we create different subtypes of DocFile. + */ + private final File file; + + /** Create a DocFile for a directory. */ + public static DocFile createFileForDirectory(Configuration configuration, String file) { + return new DocFile(configuration, new File(file)); + } + + /** Create a DocFile for a file that will be opened for reading. */ + public static DocFile createFileForInput(Configuration configuration, String file) { + return new DocFile(configuration, new File(file)); + } + + /** Create a DocFile for a file that will be opened for writing. */ + public static DocFile createFileForOutput(Configuration configuration, DocPath path) { + return new DocFile(configuration, StandardLocation.CLASS_OUTPUT, path); + } + + /** + * List the directories and files found in subdirectories along the + * elements of the given location. + * @param configuration the doclet configuration + * @param location currently, only {@link StandardLocation#SOURCE_PATH} is supported. + * @param path the subdirectory of the directories of the location for which to + * list files + */ + public static Iterable list(Configuration configuration, Location location, DocPath path) { + if (location != StandardLocation.SOURCE_PATH) + throw new IllegalArgumentException(); + + Set files = new LinkedHashSet(); + for (String s : configuration.sourcepath.split(File.pathSeparator)) { + if (s.isEmpty()) + continue; + File f = new File(s); + if (f.isDirectory()) { + f = new File(f, path.getPath()); + if (f.exists()) + files.add(new DocFile(configuration, f)); + } + } + return files; + } + + /** Create a DocFile for a given file. */ + private DocFile(Configuration configuration, File file) { + this.configuration = configuration; + this.location = null; + this.path = null; + this.file = file; + } + + /** Create a DocFile for a given location and relative path. */ + private DocFile(Configuration configuration, Location location, DocPath path) { + this.configuration = configuration; + this.location = location; + this.path = path; + this.file = path.resolveAgainst(configuration.destDirName); + } + + /** Open an input stream for the file. */ + public InputStream openInputStream() throws FileNotFoundException { + return new BufferedInputStream(new FileInputStream(file)); + } + + /** + * Open an output stream for the file. + * The file must have been created with a location of + * {@link StandardLocation#CLASS_OUTPUT} and a corresponding relative path. + */ + public OutputStream openOutputStream() throws IOException, UnsupportedEncodingException { + if (location != StandardLocation.CLASS_OUTPUT) + throw new IllegalStateException(); + + createDirectoryForFile(file); + return new BufferedOutputStream(new FileOutputStream(file)); + } + + /** + * Open an writer for the file, using the encoding (if any) given in the + * doclet configuration. + * The file must have been created with a location of + * {@link StandardLocation#CLASS_OUTPUT} and a corresponding relative path. + */ + public Writer openWriter() throws IOException, UnsupportedEncodingException { + if (location != StandardLocation.CLASS_OUTPUT) + throw new IllegalStateException(); + + createDirectoryForFile(file); + FileOutputStream fos = new FileOutputStream(file); + if (configuration.docencoding == null) { + return new BufferedWriter(new OutputStreamWriter(fos)); + } else { + return new BufferedWriter(new OutputStreamWriter(fos, configuration.docencoding)); + } + } + + /** + * Copy the contents of another file directly to this file. + */ + public void copyFile(DocFile fromFile) throws IOException { + if (location != StandardLocation.CLASS_OUTPUT) + throw new IllegalStateException(); + + createDirectoryForFile(file); + + InputStream input = fromFile.openInputStream(); + OutputStream output = openOutputStream(); + try { + byte[] bytearr = new byte[1024]; + int len; + while ((len = input.read(bytearr)) != -1) { + output.write(bytearr, 0, len); + } + } catch (FileNotFoundException exc) { + } catch (SecurityException exc) { + } finally { + input.close(); + output.close(); + } + } + + /** + * Copy the contents of a resource file to this file. + * @param resource the path of the resource, relative to the package of this class + * @param overwrite whether or not to overwrite the file if it already exists + * @param replaceNewLine if false, the file is copied as a binary file; + * if true, the file is written line by line, using the platform line + * separator + */ + public void copyResource(DocPath resource, boolean overwrite, boolean replaceNewLine) { + if (location != StandardLocation.CLASS_OUTPUT) + throw new IllegalStateException(); + + if (file.exists() && !overwrite) + return; + + createDirectoryForFile(file); + + try { + InputStream in = Configuration.class.getResourceAsStream(resource.getPath()); + if (in == null) + return; + + OutputStream out = new FileOutputStream(file); + try { + if (!replaceNewLine) { + byte[] buf = new byte[2048]; + int n; + while((n = in.read(buf))>0) out.write(buf,0,n); + } else { + BufferedReader reader = new BufferedReader(new InputStreamReader(in)); + BufferedWriter writer; + if (configuration.docencoding == null) { + writer = new BufferedWriter(new OutputStreamWriter(out)); + } else { + writer = new BufferedWriter(new OutputStreamWriter(out, + configuration.docencoding)); + } + try { + String line; + while ((line = reader.readLine()) != null) { + writer.write(line); + writer.write(DocletConstants.NL); + } + } finally { + reader.close(); + writer.close(); + } + } + } finally { + in.close(); + out.close(); + } + } catch (IOException e) { + e.printStackTrace(System.err); + throw new DocletAbortException(); + } + } + + /** Return true if the file can be read. */ + public boolean canRead() { + return file.canRead(); + } + + /** Return true if the file can be written. */ + public boolean canWrite() { + return file.canRead(); + } + + /** Return true if the file exists. */ + public boolean exists() { + return file.exists(); + } + + /** Return the base name (last component) of the file name. */ + public String getName() { + return file.getName(); + } + + /** Return the file system path for this file. */ + public String getPath() { + return file.getPath(); + } + + /** Return true is file has an absolute path name. */ + boolean isAbsolute() { + return file.isAbsolute(); + } + + /** Return true is file identifies a directory. */ + public boolean isDirectory() { + return file.isDirectory(); + } + + /** Return true is file identifies a file. */ + public boolean isFile() { + return file.isFile(); + } + + /** Return true if this file is the same as another. */ + public boolean isSameFile(DocFile other) { + try { + return file.exists() + && file.getCanonicalFile().equals(other.file.getCanonicalFile()); + } catch (IOException e) { + return false; + } + } + + /** If the file is a directory, list its contents. */ + public Iterable list() { + List files = new ArrayList(); + for (File f: file.listFiles()) { + files.add(new DocFile(configuration, f)); + } + return files; + } + + /** Create the file as a directory, including any parent directories. */ + public boolean mkdirs() { + return file.mkdirs(); + } + + /** + * Derive a new file by resolving a relative path against this file. + * The new file will inherit the configuration and location of this file + * If this file has a path set, the new file will have a corresponding + * new path. + */ + public DocFile resolve(DocPath p) { + return resolve(p.getPath()); + } + + /** + * Derive a new file by resolving a relative path against this file. + * The new file will inherit the configuration and location of this file + * If this file has a path set, the new file will have a corresponding + * new path. + */ + public DocFile resolve(String p) { + if (location == null && path == null) { + return new DocFile(configuration, new File(file, p)); + } else { + return new DocFile(configuration, location, path.resolve(p)); + } + } + + /** + * Resolve a relative file against the given output location. + * @param locn Currently, only SOURCE_OUTPUT is supported. + */ + public DocFile resolveAgainst(StandardLocation locn) { + if (locn != StandardLocation.CLASS_OUTPUT) + throw new IllegalArgumentException(); + return new DocFile(configuration, + new File(configuration.destDirName, file.getPath())); + } + + /** + * Given a path string create all the directories in the path. For example, + * if the path string is "java/applet", the method will create directory + * "java" and then "java/applet" if they don't exist. The file separator + * string "/" is platform dependent system property. + * + * @param path Directory path string. + */ + private void createDirectoryForFile(File file) { + File dir = file.getParentFile(); + if (dir == null || dir.exists() || dir.mkdirs()) + return; + + configuration.message.error( + "doclet.Unable_to_create_directory_0", dir.getPath()); + throw new DocletAbortException(); + } + + /** Return a string to identify the contents of this object, + * for debugging purposes. + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append("DocFile["); + if (location != null) + sb.append("locn:").append(location).append(","); + if (path != null) + sb.append("path:").append(path.getPath()).append(","); + sb.append("file:").append(file); + sb.append("]"); + return sb.toString(); + } +} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java index b23e5db3505..a0e4015d045 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,19 @@ package com.sun.tools.doclets.internal.toolkit.util; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.taglets.*; -import java.util.*; /** * Search for the requested documentation. Inherit documentation if necessary. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocLink.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocLink.java new file mode 100644 index 00000000000..48ff3d492bd --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocLink.java @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. 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 com.sun.tools.doclets.internal.toolkit.util; + +/** + * Abstraction for simple relative URIs, consisting of a path, + * an optional query, and an optional fragment. DocLink objects can + * be created by the constructors below or from a DocPath using the + * convenience methods, {@link DocPath#fragment fragment} and + * {@link DocPath#query query}. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + */ +public class DocLink { + final String path; + final String query; + final String fragment; + + /** Create a DocLink representing the URI {@code #fragment}. */ + public static DocLink fragment(String fragment) { + return new DocLink((String) null, (String) null, fragment); + } + + /** Create a DocLink representing the URI {@code path}. */ + public DocLink(DocPath path) { + this(path.getPath(), null, null); + } + + /** + * Create a DocLink representing the URI {@code path?query#fragment}. + * query and fragment may be null. + */ + public DocLink(DocPath path, String query, String fragment) { + this(path.getPath(), query, fragment); + } + + /** + * Create a DocLink representing the URI {@code path?query#fragment}. + * Any of the component parts may be null. + */ + public DocLink(String path, String query, String fragment) { + this.path = path; + this.query = query; + this.fragment = fragment; + } + + /** + * Return the link in the form "path?query#fragment", omitting any empty + * components. + */ + @Override + public String toString() { + // common fast path + if (path != null && isEmpty(query) && isEmpty(fragment)) + return path; + + StringBuilder sb = new StringBuilder(); + if (path != null) + sb.append(path); + if (!isEmpty(query)) + sb.append("?").append(query); + if (!isEmpty(fragment)) + sb.append("#").append(fragment); + return sb.toString(); + } + + private static boolean isEmpty(String s) { + return (s == null) || s.isEmpty(); + } +} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java new file mode 100644 index 00000000000..fb7d1fa96d7 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPath.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.doclets.internal.toolkit.util; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.PackageDoc; +import java.io.File; + +/** + * Abstraction for immutable relative paths. + * Paths always use '/' as a separator, and never begin or end with '/'. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class DocPath { + private final String path; + + /** The empty path. */ + public static final DocPath empty = new DocPath(""); + + /** The empty path. */ + public static final DocPath parent = new DocPath(".."); + + /** + * Create a path from a string. + */ + public static DocPath create(String p) { + return (p == null) || p.isEmpty() ? empty : new DocPath(p); + } + + /** + * Return the path for a class. + * For example, if the class is java.lang.Object, + * the path is java/lang/Object.html. + */ + public static DocPath forClass(ClassDoc cd) { + return (cd == null) ? empty : + forPackage(cd.containingPackage()).resolve(forName(cd)); + } + + /** + * Return the path for the simple name of the class. + * For example, if the class is java.lang.Object, + * the path is Object.html. + */ + public static DocPath forName(ClassDoc cd) { + return (cd == null) ? empty : new DocPath(cd.name() + ".html"); + } + + /** + * Return the path for the package of a class. + * For example, if the class is java.lang.Object, + * the path is java/lang. + */ + public static DocPath forPackage(ClassDoc cd) { + return (cd == null) ? empty : forPackage(cd.containingPackage()); + } + + /** + * Return the path for a package. + * For example, if the package is java.lang, + * the path is java/lang. + */ + public static DocPath forPackage(PackageDoc pd) { + return (pd == null) ? empty : DocPath.create(pd.name().replace('.', '/')); + } + + /** + * Return the inverse path for a package. + * For example, if the package is java.lang, + * the inverse path is ../... + */ + public static DocPath forRoot(PackageDoc pd) { + String name = (pd == null) ? "" : pd.name(); + if (name.isEmpty()) + return empty; + return new DocPath(name.replace('.', '/').replaceAll("[^/]+", "..")); + } + + /** + * Return the relative path from one package to another. + */ + public static DocPath relativePath(PackageDoc from, PackageDoc to) { + return forRoot(from).resolve(forPackage(to)); + } + + protected DocPath(String p) { + path = (p.endsWith("/") ? p.substring(0, p.length() - 1) : p); + } + + /** {@inheritDoc} */ + @Override + public boolean equals(Object other) { + return (other instanceof DocPath) && path.equals(((DocPath)other).path); + } + + /** {@inheritDoc} */ + @Override + public int hashCode() { + return path.hashCode(); + } + + public DocPath basename() { + int sep = path.lastIndexOf("/"); + return (sep == -1) ? this : new DocPath(path.substring(sep + 1)); + } + + public DocPath parent() { + int sep = path.lastIndexOf("/"); + return (sep == -1) ? empty : new DocPath(path.substring(0, sep)); + } + + /** + * Return the path formed by appending the specified string to the current path. + */ + public DocPath resolve(String p) { + if (p == null || p.isEmpty()) + return this; + if (path.isEmpty()) + return new DocPath(p); + return new DocPath(path + "/" + p); + } + + /** + * Return the path by appending the specified path to the current path. + */ + public DocPath resolve(DocPath p) { + if (p == null || p.isEmpty()) + return this; + if (path.isEmpty()) + return p; + return new DocPath(path + "/" + p.getPath()); + } + + /** + * Get the file created by evaluating the path against a specified directory. + */ + // Temporary: this signature should not use String for dir. + // Eventually, this should involve javax.tools.Location. + public File resolveAgainst(String dir) { + return dir.isEmpty() ? new File(path) : new File(dir, path); + } + + /** + * Return the inverse path for this path. + * For example, if the path is a/b/c, the inverse path is ../../.. + */ + public DocPath invert() { + return new DocPath(path.replaceAll("[^/]+", "..")); + } + + /** + * Return true if this path is empty. + */ + public boolean isEmpty() { + return path.isEmpty(); + } + + public DocLink fragment(String fragment) { + return new DocLink(path, null, fragment); + } + + public DocLink query(String query) { + return new DocLink(path, query, null); + } + + /** + * Return this path as a string. + */ + // This is provided instead of using toString() to help catch + // unintended use of toString() in string concatenation sequences. + public String getPath() { + return path; + } +} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java new file mode 100644 index 00000000000..9625be7b346 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocPaths.java @@ -0,0 +1,115 @@ +/* + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.doclets.internal.toolkit.util; + +/** + * Standard DocPath objects. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + * @since 8 + */ +public class DocPaths { + + /** The name of the file for all classes, using frames. */ + public static final DocPath ALLCLASSES_FRAME = DocPath.create("allclasses-frame.html"); + + /** The name of the file for all classes, without using frames. */ + public static final DocPath ALLCLASSES_NOFRAME = DocPath.create("allclasses-noframe.html"); + + /** The name of the sub-directory for storing class usage info. */ + public static final DocPath CLASS_USE = DocPath.create("class-use"); + + /** The name of the file for constant values. */ + public static final DocPath CONSTANT_VALUES = DocPath.create("constant-values.html"); + + /** The name of the fie for deprecated elements. */ + public static final DocPath DEPRECATED_LIST = DocPath.create("deprecated-list.html"); + + /** The name of the subdirectory for user-provided additional documentation files. */ + public static final DocPath DOC_FILES = DocPath.create("doc-files"); + + /** The name of the file for help info. */ + public static final DocPath HELP_DOC = DocPath.create("help-doc.html"); + + /** The name of the main index file. */ + public static final DocPath INDEX = DocPath.create("index.html"); + + /** The name of the single index file for all classes. */ + public static final DocPath INDEX_ALL = DocPath.create("index-all.html"); + + /** The name of the directory for the split index files. */ + public static final DocPath INDEX_FILES = DocPath.create("index-files"); + + /** Generate the name of one of the files in the split index. */ + public static final DocPath indexN(int n) { + return DocPath.create("index-" + n + ".html"); + } + + /** The name of the file for the overview frame. */ + public static final DocPath OVERVIEW_FRAME = DocPath.create("overview-frame.html"); + + /** The name of the file for the overview summary. */ + public static final DocPath OVERVIEW_SUMMARY = DocPath.create("overview-summary.html"); + + /** The name of the file for the overview tree. */ + public static final DocPath OVERVIEW_TREE = DocPath.create("overview-tree.html"); + + /** The name of the file for the package frame. */ + public static final DocPath PACKAGE_FRAME = DocPath.create("package-frame.html"); + + /** The name of the file for the package list. */ + public static final DocPath PACKAGE_LIST = DocPath.create("package-list"); + + /** The name of the file for the package summary. */ + public static final DocPath PACKAGE_SUMMARY = DocPath.create("package-summary.html"); + + /** The name of the file for the package tree. */ + public static final DocPath PACKAGE_TREE = DocPath.create("package-tree.html"); + + /** The name of the file for the package usage info. */ + public static final DocPath PACKAGE_USE = DocPath.create("package-use.html"); + + /** The name of the directory in which resources are generated. + * Also the name of the sub-package from which resources are read. + */ + public static final DocPath RESOURCES = DocPath.create("resources"); + + /** The name of the file for the serialized form info. */ + public static final DocPath SERIALIZED_FORM = DocPath.create("serialized-form.html"); + + /** The name of the directory in which HTML versions of the source code + * are generated. + */ + public static final DocPath SOURCE_OUTPUT = DocPath.create("src-html"); + + /** The name of the default stylesheet. */ + public static final DocPath STYLESHEET = DocPath.create("stylesheet.css"); + +} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java index c93d5bc1093..6261caec4ed 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletAbortException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,6 +25,12 @@ package com.sun.tools.doclets.internal.toolkit.util; +/** + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ public class DocletAbortException extends RuntimeException { private static final long serialVersionUID = -9131058909576418984L; diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java index f962080e4d5..878a06bcb3c 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/DocletConstants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,15 +29,26 @@ package com.sun.tools.doclets.internal.toolkit.util; * Stores all constants for a Doclet. Extend this class if you have doclet * specific constants to add. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.5 */ public class DocletConstants { + /** + * The default amount of space between tab stops. + */ + public static final int DEFAULT_TAB_STOP_LENGTH = 8; + + /** + * The line separator for the current operating system. + */ + public static final String NL = System.getProperty("line.separator"); + /** * The default package name. */ @@ -52,34 +63,4 @@ public class DocletConstants { * The anchor for the default package. */ public static final String UNNAMED_PACKAGE_ANCHOR = "unnamed_package"; - - /** - * The name of the doc files directory. - */ - public static final String DOC_FILES_DIR_NAME = "doc-files"; - - /** - * The default amount of space between tab stops. - */ - public static final int DEFAULT_TAB_STOP_LENGTH = 8; - - /** - * The name of the directory where we will copy resource files to. - */ - public static final String RESOURE_DIR_NAME = "resources"; - - /** - * The source output directory name - */ - public static final String SOURCE_OUTPUT_DIR_NAME = "src-html/"; - - /** - * The name of the package list file. - */ - public static final String PACKAGE_LIST_FILE_NAME = "package-list"; - - /** - * The line seperator for the current operating system. - */ - public static final String NL = System.getProperty("line.separator"); } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java index 32a4a0dcf69..5aa768876d7 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Extern.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,15 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; - -import com.sun.javadoc.*; -import java.util.Map; -import java.util.HashMap; import java.io.*; import java.net.*; +import java.util.HashMap; +import java.util.Map; + +import javax.tools.StandardLocation; + +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; /** * Process and manage "-link" and "-linkoffline" to external packages. The @@ -40,9 +42,10 @@ import java.net.*; * documented) file in the current or the destination directory, while * generating the documentation. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Atul M Dambalkar * @author Robert Field @@ -91,7 +94,7 @@ public class Extern { * If the same package name is found in the map, then the first mapped * Item object or offline location will be retained. * - * @param packagename Package name found in the "package-list" file. + * @param packageName Package name found in the "package-list" file. * @param path URL or Directory path from where the "package-list" * file is picked. * @param relative True if path is URL, false if directory path. @@ -137,21 +140,25 @@ public class Extern { * * @param pkgName The package name. * @param relativepath The relative path. - * @param link The link to convert. + * @param filename The link to convert. * @return if external return converted link else return null */ - public String getExternalLink(String pkgName, - String relativepath, String link) { + public DocLink getExternalLink(String pkgName, + DocPath relativepath, String filename) { + return getExternalLink(pkgName, relativepath, filename, null); + } + + public DocLink getExternalLink(String pkgName, + DocPath relativepath, String filename, String memberName) { Item fnd = findPackageItem(pkgName); - if (fnd != null) { - String externlink = fnd.path + link; - if (fnd.relative) { // it's a relative path. - return relativepath + externlink; - } else { - return externlink; - } - } - return null; + if (fnd == null) + return null; + + DocPath p = fnd.relative ? + relativepath.resolve(fnd.path).resolve(filename) : + DocPath.create(fnd.path).resolve(filename); + + return new DocLink(p, "is-external=true", memberName); } /** @@ -162,24 +169,45 @@ public class Extern { * @param pkglisturl This can be another URL for "package-list" or ordinary * file. * @param reporter The DocErrorReporter used to report errors. - * @param linkoffline True if -linkoffline isused and false if -link is used. + * @param linkoffline True if -linkoffline is used and false if -link is used. */ - public boolean url(String url, String pkglisturl, + public boolean link(String url, String pkglisturl, DocErrorReporter reporter, boolean linkoffline) { this.linkoffline = linkoffline; - String errMsg = composeExternPackageList(url, pkglisturl); - if (errMsg != null) { - reporter.printWarning(errMsg); - return false; - } else { + try { + url = adjustEndFileSeparator(url); + if (isUrl(pkglisturl)) { + readPackageListFromURL(url, toURL(pkglisturl)); + } else { + readPackageListFromFile(url, DocFile.createFileForInput(configuration, pkglisturl)); + } return true; + } catch (Fault f) { + reporter.printWarning(f.getMessage()); + return false; + } + } + + private URL toURL(String url) throws Fault { + try { + return new URL(url); + } catch (MalformedURLException e) { + throw new Fault(configuration.getText("doclet.MalformedURL", url), e); + } + } + + private class Fault extends Exception { + private static final long serialVersionUID = 0; + + Fault(String msg, Exception cause) { + super(msg, cause); } } /** * Get the Extern Item object associated with this package name. * - * @param pkgname Package name. + * @param pkgName Package name. */ private Item findPackageItem(String pkgName) { if (packageToItemMap == null) { @@ -188,32 +216,11 @@ public class Extern { return packageToItemMap.get(pkgName); } - /** - * Adjusts the end file separator if it is missing from the URL or the - * directory path and depending upon the URL or file path, fetch or - * read the "package-list" file. - * - * @param urlOrDirPath URL or the directory path. - * @param pkgListUrlOrDirPath URL or directory path for the "package-list" file or the "package-list" - * file itself. - */ - private String composeExternPackageList(String urlOrDirPath, String pkgListUrlOrDirPath) { - urlOrDirPath = adjustEndFileSeparator(urlOrDirPath); - pkgListUrlOrDirPath = adjustEndFileSeparator(pkgListUrlOrDirPath); - return isUrl(pkgListUrlOrDirPath) ? - fetchURLComposeExternPackageList(urlOrDirPath, pkgListUrlOrDirPath) : - readFileComposeExternPackageList(urlOrDirPath, pkgListUrlOrDirPath); - } - /** * If the URL or Directory path is missing end file separator, add that. */ private String adjustEndFileSeparator(String url) { - String filesep = "/"; - if (!url.endsWith(filesep)) { - url += filesep; - } - return url; + return url.endsWith("/") ? url : url + '/'; } /** @@ -222,17 +229,18 @@ public class Extern { * @param urlpath Path to the packages. * @param pkglisturlpath URL or the path to the "package-list" file. */ - private String fetchURLComposeExternPackageList(String urlpath, - String pkglisturlpath) { - String link = pkglisturlpath + "package-list"; + private void readPackageListFromURL(String urlpath, URL pkglisturlpath) + throws Fault { try { - readPackageList((new URL(link)).openStream(), urlpath, false); + URL link = pkglisturlpath.toURI().resolve(DocPaths.PACKAGE_LIST.getPath()).toURL(); + readPackageList(link.openStream(), urlpath, false); + } catch (URISyntaxException exc) { + throw new Fault(configuration.getText("doclet.MalformedURL", pkglisturlpath.toString()), exc); } catch (MalformedURLException exc) { - return configuration.getText("doclet.MalformedURL", link); + throw new Fault(configuration.getText("doclet.MalformedURL", pkglisturlpath.toString()), exc); } catch (IOException exc) { - return configuration.getText("doclet.URL_error", link); + throw new Fault(configuration.getText("doclet.URL_error", pkglisturlpath.toString()), exc); } - return null; } /** @@ -241,27 +249,24 @@ public class Extern { * @param path URL or directory path to the packages. * @param pkgListPath Path to the local "package-list" file. */ - private String readFileComposeExternPackageList(String path, - String pkgListPath) { - - String link = pkgListPath + "package-list"; - if (! ((new File(pkgListPath)).isAbsolute() || linkoffline)){ - link = configuration.destDirName + link; + private void readPackageListFromFile(String path, DocFile pkgListPath) + throws Fault { + DocFile file = pkgListPath.resolve(DocPaths.PACKAGE_LIST); + if (! (file.isAbsolute() || linkoffline)){ + file = file.resolveAgainst(StandardLocation.CLASS_OUTPUT); } try { - File file = new File(link); if (file.exists() && file.canRead()) { - readPackageList(new FileInputStream(file), path, - ! ((new File(path)).isAbsolute() || isUrl(path))); + boolean pathIsRelative = + !DocFile.createFileForInput(configuration, path).isAbsolute() + && !isUrl(path); + readPackageList(file.openInputStream(), path, pathIsRelative); } else { - return configuration.getText("doclet.File_error", link); + throw new Fault(configuration.getText("doclet.File_error", file.getPath()), null); } - } catch (FileNotFoundException exc) { - return configuration.getText("doclet.File_error", link); } catch (IOException exc) { - return configuration.getText("doclet.File_error", link); + throw new Fault(configuration.getText("doclet.File_error", file.getPath()), exc); } - return null; } /** @@ -276,7 +281,7 @@ public class Extern { boolean relative) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(input)); - StringBuffer strbuf = new StringBuffer(); + StringBuilder strbuf = new StringBuilder(); try { int c; while ((c = in.read()) >= 0) { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java index 5893f302e40..be5284e91da 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Group.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,11 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Process and manage grouping of packages, as specified by "-group" option on * the command line. @@ -48,9 +49,10 @@ import java.util.*; * will put the package java.lang in the group "Lang" and not in group "Core". *

    * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Atul M Dambalkar */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java index 37834420aa1..c2bfc1359e6 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/ImplementedMethods.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,17 +25,19 @@ package com.sun.tools.doclets.internal.toolkit.util; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; -import java.util.*; /** * For a given class method, build an array of interface methods which it * implements. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Atul M Dambalkar */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java index 7e62722f513..e6958217be0 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/IndexBuilder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,19 +25,21 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Build the mapping of each Unicode character with it's member lists * containing members names starting with it. Also build a list for all the * Unicode characters which start a member name. Member name is * classkind or field or method or constructor name. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @since 1.2 * @see java.lang.Character diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java index 7e264c8b47b..d761cfebc69 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MessageRetriever.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,18 +24,20 @@ */ package com.sun.tools.doclets.internal.toolkit.util; +import java.text.MessageFormat; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.Configuration; -import java.util.*; -import java.text.MessageFormat; /** * Retrieve and format messages stored in a resource. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @since 1.2 * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java index e9fd61e19dc..2f814252c2b 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MetaKeywords.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,19 +25,21 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Provides methods for creating an array of class, method and * field names to be included as meta keywords in the HTML header * of class pages. These keywords improve search results * on browsers that look for keywords. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Doug Kramer */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java index a19e8c1ce1d..68e082701a1 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/MethodFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,9 +33,10 @@ import com.sun.javadoc.*; * superclasses and interfaces(subsequently super-interfaces also) * recursively. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API. + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. */ public abstract class MethodFinder { diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java index a32f04890e9..0d1b63e5679 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/PackageListWriter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,17 +25,19 @@ package com.sun.tools.doclets.internal.toolkit.util; -import com.sun.tools.doclets.internal.toolkit.*; -import com.sun.javadoc.*; import java.io.*; import java.util.*; +import com.sun.javadoc.*; +import com.sun.tools.doclets.internal.toolkit.*; + /** * Write out the package index. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @see com.sun.javadoc.PackageDoc * @author Atul M Dambalkar @@ -50,8 +52,7 @@ public class PackageListWriter extends PrintWriter { * @param configuration the current configuration of the doclet. */ public PackageListWriter(Configuration configuration) throws IOException { - super(Util.genWriter(configuration, configuration.destDirName, - DocletConstants.PACKAGE_LIST_FILE_NAME, configuration.docencoding)); + super(DocFile.createFileForOutput(configuration, DocPaths.PACKAGE_LIST).openWriter()); this.configuration = configuration; } @@ -69,7 +70,7 @@ public class PackageListWriter extends PrintWriter { packgen.close(); } catch (IOException exc) { configuration.message.error("doclet.exception_encountered", - exc.toString(), DocletConstants.PACKAGE_LIST_FILE_NAME); + exc.toString(), DocPaths.PACKAGE_LIST); throw new DocletAbortException(); } } diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java deleted file mode 100644 index 64c9d7e5fd5..00000000000 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/SourcePath.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (c) 1998, 2003, Oracle and/or its affiliates. All rights reserved. - * 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 com.sun.tools.doclets.internal.toolkit.util; - -import java.io.File; - -/** - * This class is used to represent a source path which can contain only - * directories no zip files. If a zip file is specified in the command line it - * will not get reflected in the SourcePath. - * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API - * - * @author Atul M Dambalkar - */ -public - class SourcePath { - private final char dirSeparator = File.pathSeparatorChar; - - /** - * The original class path string - */ - private String pathstr; - - /** - * List of source path entries. Each entry is a directory. - */ - private File[] sourcePath; - - - /** - * Build a source path from the specified path string on the command line. - */ - public SourcePath(String pathstr) { - init(pathstr); - } - - /** - * Build a default source path from the path strings specified by - * the properties env.class.path. - */ - public SourcePath() { - init(System.getProperty("env.class.path")); - } - - /** - * Initialize the SourcePath File array, which will contain only the - * directory names from the given path string. - * - * @param pathstr Path String. - */ - private void init(String pathstr) { - if (pathstr == null || pathstr.length() == 0) { - pathstr = "."; - } - - int noOfFileSep = 0; - int index = 0; - this.pathstr = pathstr; // Save original class path string - - // Count the number of path separators - while ((index = pathstr.indexOf(dirSeparator, index)) != -1) { - noOfFileSep++; - index++; - } - // Build the source path - File[] tempPath = new File[noOfFileSep + 1]; - int tempPathIndex = 0; - int len = pathstr.length(); - int sepPos = 0; - for (index = 0; index < len; index = sepPos + 1) { - sepPos = pathstr.indexOf(dirSeparator, index); - if (sepPos < 0) { - sepPos = len; - } - File file = new File(pathstr.substring(index, sepPos)); - if (file.isDirectory()) { - tempPath[tempPathIndex++] = file; - } // if it is really a file, ignore it. - } - sourcePath = new File[tempPathIndex]; - System.arraycopy((Object)tempPath, 0, (Object)sourcePath, - 0, tempPathIndex); - } - - /** - * Find the specified directory in the source path. - * - * @param name Name of the directory to be searched for in the source path. - * @return File Return the directory if found else return null. - */ - public File getDirectory(String name) { - for (int i = 0; i < sourcePath.length; i++) { - File directoryNeeded = new File(sourcePath[i], name); - if (directoryNeeded.isDirectory()) { - return directoryNeeded; - } - } - return null; - } - - /** - * Return original source path string. - */ - public String toString() { - return pathstr; - } -} diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java index e4c7fbc3b3d..2854b493f1a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TaggedMethodFinder.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; /** * Find a tagged method. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Atul M Dambalkar */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java index a9e2aa0f0ac..074718f7979 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/TextTag.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,9 +30,10 @@ import com.sun.javadoc.*; * A tag that holds nothing but plain text. This is useful for passing * text to methods that only accept inline tags as a parameter. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Jamie Ho * @since 1.5 diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java index 25b8db94733..1e8da4906d8 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/Util.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,13 +30,15 @@ import java.util.*; import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; +import javax.tools.StandardLocation; /** * Utilities Class for Doclets. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Atul M Dambalkar * @author Jamie Ho @@ -50,11 +52,6 @@ public class Util { public static final String[][] HTML_ESCAPE_CHARS = {{"&", "&"}, {"<", "<"}, {">", ">"}}; - /** - * Name of the resource directory. - */ - public static final String RESOURCESDIR = "resources"; - /** * Return array of class members whose documentation is to be generated. * If the member is deprecated do not include such a member in the @@ -195,32 +192,6 @@ public class Util { } } - /** - * Copy source file to destination file. - * - * @throws SecurityException - * @throws IOException - */ - public static void copyFile(File destfile, File srcfile) - throws IOException { - byte[] bytearr = new byte[512]; - int len = 0; - FileInputStream input = new FileInputStream(srcfile); - File destDir = destfile.getParentFile(); - destDir.mkdirs(); - FileOutputStream output = new FileOutputStream(destfile); - try { - while ((len = input.read(bytearr)) != -1) { - output.write(bytearr, 0, len); - } - } catch (FileNotFoundException exc) { - } catch (SecurityException exc) { - } finally { - input.close(); - output.close(); - } - } - /** * Copy the given directory contents from the source package directory * to the generated documentation directory. For example for a package @@ -234,45 +205,45 @@ public class Util { * @param dir The original directory name to copy from. * @param overwrite Overwrite files if true. */ - public static void copyDocFiles(Configuration configuration, - String path, String dir, boolean overwrite) { - if (checkCopyDocFilesErrors(configuration, path, dir)) { - return; - } - String destname = configuration.docFileDestDirName; - File srcdir = new File(path + dir); - if (destname.length() > 0 && !destname.endsWith( - DirectoryManager.URL_FILE_SEPARATOR)) { - destname += DirectoryManager.URL_FILE_SEPARATOR; - } - String dest = destname + dir; + public static void copyDocFiles(Configuration configuration, PackageDoc pd) { + copyDocFiles(configuration, DocPath.forPackage(pd).resolve(DocPaths.DOC_FILES)); + } + + public static void copyDocFiles(Configuration configuration, DocPath dir) { try { - File destdir = new File(dest); - DirectoryManager.createDirectory(configuration, dest); - String[] files = srcdir.list(); - for (int i = 0; i < files.length; i++) { - File srcfile = new File(srcdir, files[i]); - File destfile = new File(destdir, files[i]); - if (srcfile.isFile()) { - if(destfile.exists() && ! overwrite) { - configuration.message.warning((SourcePosition) null, - "doclet.Copy_Overwrite_warning", - srcfile.toString(), destdir.toString()); - } else { - configuration.message.notice( - "doclet.Copying_File_0_To_Dir_1", - srcfile.toString(), destdir.toString()); - Util.copyFile(destfile, srcfile); - } - } else if(srcfile.isDirectory()) { - if(configuration.copydocfilesubdirs - && ! configuration.shouldExcludeDocFileDir( - srcfile.getName())){ - copyDocFiles(configuration, path, dir + - DirectoryManager.URL_FILE_SEPARATOR + srcfile.getName(), - overwrite); + boolean first = true; + for (DocFile f : DocFile.list(configuration, StandardLocation.SOURCE_PATH, dir)) { + if (!f.isDirectory()) { + continue; + } + DocFile srcdir = f; + DocFile destdir = DocFile.createFileForOutput(configuration, dir); + if (srcdir.isSameFile(destdir)) { + continue; + } + + for (DocFile srcfile: srcdir.list()) { + DocFile destfile = destdir.resolve(srcfile.getName()); + if (srcfile.isFile()) { + if (destfile.exists() && !first) { + configuration.message.warning((SourcePosition) null, + "doclet.Copy_Overwrite_warning", + srcfile.getPath(), destdir.getPath()); + } else { + configuration.message.notice( + "doclet.Copying_File_0_To_Dir_1", + srcfile.getPath(), destdir.getPath()); + destfile.copyFile(srcfile); + } + } else if (srcfile.isDirectory()) { + if (configuration.copydocfilesubdirs + && !configuration.shouldExcludeDocFileDir(srcfile.getName())) { + copyDocFiles(configuration, dir.resolve(srcfile.getName())); + } } } + + first = false; } } catch (SecurityException exc) { throw new DocletAbortException(); @@ -281,136 +252,6 @@ public class Util { } } - /** - * Given the parameters for copying doc-files, check for errors. - * - * @param configuration The configuration of the current doclet. - * @param path The relative path to the directory to be copied. - * @param dirName The original directory name to copy from. - */ - private static boolean checkCopyDocFilesErrors (Configuration configuration, - String path, String dirName) { - if ((configuration.sourcepath == null || configuration.sourcepath.length() == 0) && - (configuration.destDirName == null || configuration.destDirName.length() == 0)) { - //The destination path and source path are definitely equal. - return true; - } - File sourcePath, destPath = new File(configuration.destDirName); - StringTokenizer pathTokens = new StringTokenizer( - configuration.sourcepath == null ? "" : configuration.sourcepath, - File.pathSeparator); - //Check if the destination path is equal to the source path. If yes, - //do not copy doc-file directories. - while(pathTokens.hasMoreTokens()){ - sourcePath = new File(pathTokens.nextToken()); - if(destPath.equals(sourcePath)){ - return true; - } - } - //Make sure the doc-file being copied exists. - File srcdir = new File(path + dirName); - if (! srcdir.exists()) { - return true; - } - return false; - } - - /** - * Copy a file in the resources directory to the destination - * directory (if it is not there already). If - * overwrite is true and the destination file - * already exists, overwrite it. - * - * @param configuration Holds the destination directory and error message - * @param resourcefile The name of the resource file to copy - * @param overwrite A flag to indicate whether the file in the - * destination directory will be overwritten if - * it already exists. - */ - public static void copyResourceFile(Configuration configuration, - String resourcefile, boolean overwrite) { - String destresourcesdir = configuration.destDirName + RESOURCESDIR; - copyFile(configuration, resourcefile, RESOURCESDIR, destresourcesdir, - overwrite, false); - } - - /** - * Copy a file from a source directory to a destination directory - * (if it is not there already). If overwrite is true and - * the destination file already exists, overwrite it. - * - * @param configuration Holds the error message - * @param file The name of the file to copy - * @param source The source directory - * @param destination The destination directory where the file needs to be copied - * @param overwrite A flag to indicate whether the file in the - * destination directory will be overwritten if - * it already exists. - * @param replaceNewLine true if the newline needs to be replaced with platform- - * specific newline. - */ - public static void copyFile(Configuration configuration, String file, String source, - String destination, boolean overwrite, boolean replaceNewLine) { - DirectoryManager.createDirectory(configuration, destination); - File destfile = new File(destination, file); - if(destfile.exists() && (! overwrite)) return; - try { - InputStream in = Configuration.class.getResourceAsStream( - source + DirectoryManager.URL_FILE_SEPARATOR + file); - if(in==null) return; - OutputStream out = new FileOutputStream(destfile); - try { - if (!replaceNewLine) { - byte[] buf = new byte[2048]; - int n; - while((n = in.read(buf))>0) out.write(buf,0,n); - } else { - BufferedReader reader = new BufferedReader(new InputStreamReader(in)); - BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(out)); - try { - String line; - while ((line = reader.readLine()) != null) { - writer.write(line); - writer.write(DocletConstants.NL); - } - } finally { - reader.close(); - writer.close(); - } - } - } finally { - in.close(); - out.close(); - } - } catch (IOException ie) { - ie.printStackTrace(System.err); - throw new DocletAbortException(); - } - } - - /** - * Given a PackageDoc, return the source path for that package. - * @param configuration The Configuration for the current Doclet. - * @param pkgDoc The package to seach the path for. - * @return A string representing the path to the given package. - */ - public static String getPackageSourcePath(Configuration configuration, - PackageDoc pkgDoc){ - try{ - String pkgPath = DirectoryManager.getDirectoryPath(pkgDoc); - String completePath = new SourcePath(configuration.sourcepath). - getDirectory(pkgPath) + DirectoryManager.URL_FILE_SEPARATOR; - //Make sure that both paths are using the same separators. - completePath = Util.replaceText(completePath, File.separator, - DirectoryManager.URL_FILE_SEPARATOR); - pkgPath = Util.replaceText(pkgPath, File.separator, - DirectoryManager.URL_FILE_SEPARATOR); - return completePath.substring(0, completePath.lastIndexOf(pkgPath)); - } catch (Exception e){ - return ""; - } - } - /** * We want the list of types in alphabetical order. However, types are not * comparable. We need a comparator for now. @@ -545,7 +386,7 @@ public class Util { } /** - * Given a package, return it's name. + * Given a package, return its name. * @param packageDoc the package to check. * @return the name of the given package. */ @@ -555,7 +396,7 @@ public class Util { } /** - * Given a package, return it's file name without the extension. + * Given a package, return its file name without the extension. * @param packageDoc the package to check. * @return the file name of the given package. */ @@ -565,7 +406,7 @@ public class Util { } /** - * Given a string, replace all occurraces of 'newStr' with 'oldStr'. + * Given a string, replace all occurrences of 'newStr' with 'oldStr'. * @param originalStr the string to modify. * @param oldStr the string to replace. * @param newStr the string to insert in place of the old string. @@ -615,40 +456,6 @@ public class Util { return rawString.trim(); } - /** - * Create the directory path for the file to be generated, construct - * FileOutputStream and OutputStreamWriter depending upon docencoding. - * - * @param path The directory path to be created for this file. - * @param filename File Name to which the PrintWriter will do the Output. - * @param docencoding Encoding to be used for this file. - * @exception IOException Exception raised by the FileWriter is passed on - * to next level. - * @exception UnsupportedEncodingException Exception raised by the - * OutputStreamWriter is passed on to next level. - * @return Writer Writer for the file getting generated. - * @see java.io.FileOutputStream - * @see java.io.OutputStreamWriter - */ - public static Writer genWriter(Configuration configuration, - String path, String filename, - String docencoding) - throws IOException, UnsupportedEncodingException { - FileOutputStream fos; - if (path != null) { - DirectoryManager.createDirectory(configuration, path); - fos = new FileOutputStream(((path.length() > 0)? - path + File.separator: "") + filename); - } else { - fos = new FileOutputStream(filename); - } - if (docencoding == null) { - return new OutputStreamWriter(fos); - } else { - return new OutputStreamWriter(fos, docencoding); - } - } - /** * Given an annotation, return true if it should be documented and false * otherwise. @@ -668,47 +475,6 @@ public class Util { return false; } - /** - * Given a string, return an array of tokens. The separator can be escaped - * with the '\' character. The '\' character may also be escaped by the - * '\' character. - * - * @param s the string to tokenize. - * @param separator the separator char. - * @param maxTokens the maxmimum number of tokens returned. If the - * max is reached, the remaining part of s is appended - * to the end of the last token. - * - * @return an array of tokens. - */ - public static String[] tokenize(String s, char separator, int maxTokens) { - List tokens = new ArrayList(); - StringBuilder token = new StringBuilder (); - boolean prevIsEscapeChar = false; - for (int i = 0; i < s.length(); i += Character.charCount(i)) { - int currentChar = s.codePointAt(i); - if (prevIsEscapeChar) { - // Case 1: escaped character - token.appendCodePoint(currentChar); - prevIsEscapeChar = false; - } else if (currentChar == separator && tokens.size() < maxTokens-1) { - // Case 2: separator - tokens.add(token.toString()); - token = new StringBuilder(); - } else if (currentChar == '\\') { - // Case 3: escape character - prevIsEscapeChar = true; - } else { - // Case 4: regular character - token.appendCodePoint(currentChar); - } - } - if (token.length() > 0) { - tokens.add(token.toString()); - } - return tokens.toArray(new String[] {}); - } - /** * Return true if this class is linkable and false if we can't link to the * desired class. diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java index 4d88a7e1734..e8004c1af72 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/VisibleMemberMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.doclets.internal.toolkit.util; +import java.util.*; + import com.sun.javadoc.*; import com.sun.tools.doclets.internal.toolkit.*; -import java.util.*; /** * A data structure that encapsulates the visible members of a particular @@ -36,9 +37,10 @@ import java.util.*; * or method) and the leaf of the class tree. The data structure will map * all visible members in the leaf and classes above the leaf in the tree. * - * This code is not part of an API. - * It is implementation that is subject to change. - * Do not use it as an API + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @author Atul M Dambalkar * @author Jamie Ho (rewrite) @@ -125,7 +127,7 @@ public class VisibleMemberMap { * Return the package private members inherited by the class. Only return * if parent is package private and not documented. * - * @param configuation the current configuration of the doclet. + * @param configuration the current configuration of the doclet. * @return the package private members inherited by the class. */ private List getInheritedPackagePrivateMethods(Configuration configuration) { @@ -148,7 +150,7 @@ public class VisibleMemberMap { * end of the list members that are inherited by inaccessible parents. We * document these members in the child because the parent is not documented. * - * @param configuation the current configuration of the doclet. + * @param configuration the current configuration of the doclet. */ public List getLeafClassMembers(Configuration configuration) { List result = getMembersFor(classdoc); diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java index 37855ae2181..e9539a44e15 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkFactory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,6 +30,11 @@ import com.sun.javadoc.*; /** * A factory that constructs links from given link information. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java index 4e3517d91f2..53acdd5e5ee 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkInfo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import com.sun.tools.doclets.internal.toolkit.Configuration; /** * Encapsulates information about a link. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java index 156a0094a9c..cb58ae4667a 100644 --- a/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java +++ b/langtools/src/share/classes/com/sun/tools/doclets/internal/toolkit/util/links/LinkOutput.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,6 +28,11 @@ package com.sun.tools.doclets.internal.toolkit.util.links; /** * Stores output of a link. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Jamie Ho * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java b/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java index 01838e9c196..e485804e124 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/BasicJavacTask.java @@ -26,6 +26,7 @@ package com.sun.tools.javac.api; import java.io.IOException; +import java.util.Collection; import java.util.Locale; import javax.annotation.processing.Processor; @@ -43,7 +44,6 @@ import com.sun.tools.javac.model.JavacElements; import com.sun.tools.javac.model.JavacTypes; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.util.Context; -import java.util.Collection; /** * Provides basic functionality for implementations of JavacTask. diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java index 18aafee6a15..fab0adae508 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/DiagnosticFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -138,7 +138,7 @@ public interface DiagnosticFormatter> { /** * Configure the set of diagnostic parts that should be displayed * by the formatter. - * @param options options to set + * @param visibleParts the parts to be set */ public void setVisible(Set visibleParts); diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java index 0be82fb8a27..0a7a4617250 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ public final class JavacTool implements JavaCompiler { * Constructor used by service provider mechanism. The recommended way to * obtain an instance of this class is by using {@link #create} or the * service provider mechanism. - * @see javax.tools.JavaCompilerTool + * @see javax.tools.JavaCompiler * @see javax.tools.ToolProvider * @see #create */ diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java index c446e0a9947..174b3ffa971 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/JavacTrees.java @@ -60,8 +60,8 @@ import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.comp.MemberEnter; import com.sun.tools.javac.comp.Resolve; import com.sun.tools.javac.model.JavacElements; -import com.sun.tools.javac.tree.EndPosTable; import com.sun.tools.javac.processing.JavacProcessingEnvironment; +import com.sun.tools.javac.tree.EndPosTable; import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.tree.TreeCopier; diff --git a/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java index 41d987480f5..247283440ed 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javac/api/WrappingJavaFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,8 +31,9 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; -import javax.tools.JavaFileObject.Kind; + import javax.tools.*; +import javax.tools.JavaFileObject.Kind; /** * Wraps all calls to a given file manager. Subclasses of this class diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java b/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java index 486e9b6a4a4..84d9108b5d3 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Annotations.java @@ -26,18 +26,18 @@ package com.sun.tools.javac.code; import java.util.Map; + import javax.tools.JavaFileObject; import com.sun.tools.javac.comp.Annotate; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; +import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Pair; - import static com.sun.tools.javac.code.Kinds.PCK; -import com.sun.tools.javac.util.*; /** * Container for all annotations (attributes in javac) on a Symbol. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java index 0460ac9aa1e..f827006a036 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Attribute.java @@ -34,8 +34,6 @@ import javax.lang.model.type.DeclaredType; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.util.*; -import static com.sun.tools.javac.code.TypeTags.*; - /** An annotation value. * *

    This is NOT part of any supported API. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java b/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java index 3d8f00eb67f..022681bd8f6 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/DeferredLintHandler.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,8 +30,8 @@ import java.util.Map; import com.sun.tools.javac.util.Assert; import com.sun.tools.javac.util.Context; -import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; +import com.sun.tools.javac.util.ListBuffer; /** * diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java index f9dfc13e970..8c9d9000af4 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Flags.java @@ -25,10 +25,11 @@ package com.sun.tools.javac.code; -import java.util.EnumSet; import java.util.Collections; +import java.util.EnumSet; import java.util.Map; import java.util.Set; + import javax.lang.model.element.Modifier; /** Access flags and other modifiers for Java classes and members. @@ -66,6 +67,7 @@ public class Flags { if ((mask&NATIVE) != 0) flags.add(Flag.NATIVE); if ((mask&INTERFACE) != 0) flags.add(Flag.INTERFACE); if ((mask&ABSTRACT) != 0) flags.add(Flag.ABSTRACT); + if ((mask&DEFAULT) != 0) flags.add(Flag.DEFAULT); if ((mask&STRICTFP) != 0) flags.add(Flag.STRICTFP); if ((mask&BRIDGE) != 0) flags.add(Flag.BRIDGE); if ((mask&SYNTHETIC) != 0) flags.add(Flag.SYNTHETIC); @@ -251,6 +253,17 @@ public class Flags { */ public static final long CLASH = 1L<<42; + /** + * Flag that marks either a default method or an interface containing default methods + */ + public static final long DEFAULT = 1L<<43; + + /** + * Flag that marks class as auxiliary, ie a non-public class following + * the public class in a source file, that could block implicit compilation. + */ + public static final long AUXILIARY = 1L<<43; + /** Modifier masks. */ public static final int @@ -266,7 +279,10 @@ public class Flags { MethodFlags = AccessFlags | ABSTRACT | STATIC | NATIVE | SYNCHRONIZED | FINAL | STRICTFP; public static final long - LocalVarFlags = FINAL | PARAMETER; + ExtendedStandardFlags = (long)StandardFlags | DEFAULT, + InterfaceDefaultMethodMask = ABSTRACT | PUBLIC | STRICTFP | SYNCHRONIZED | DEFAULT, + LocalVarFlags = FINAL | PARAMETER; + public static Set asModifierSet(long flags) { Set modifiers = modifierSets.get(flags); @@ -319,6 +335,7 @@ public class Flags { NATIVE("native"), INTERFACE("interface"), ABSTRACT("abstract"), + DEFAULT("default"), STRICTFP("strictfp"), BRIDGE("bridge"), SYNTHETIC("synthetic"), diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java index 9495ddf1be4..12d3703d1fd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Kinds.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,9 +31,10 @@ import java.util.Locale; import com.sun.source.tree.MemberReferenceTree; import com.sun.tools.javac.api.Formattable; import com.sun.tools.javac.api.Messages; - -import static com.sun.tools.javac.code.TypeTags.*; import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.PACKAGE; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; /** Internal symbol kinds, which distinguish between elements of * different subclasses of Symbol. Symbol kinds are organized so they can be diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java b/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java index e3ed0f35983..88573c593ca 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Lint.java @@ -128,6 +128,13 @@ public class Lint * Categories of warnings that can be generated by the compiler. */ public enum LintCategory { + /** + * Warn when code refers to a auxiliary class that is hidden in a source file (ie source file name is + * different from the class name, and the type is not properly nested) and the referring code + * is not located in the same source file. + */ + AUXILIARYCLASS("auxiliaryclass"), + /** * Warn about use of unnecessary casts. */ diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java index 644955c646a..3e6b15998c3 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Printer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -28,18 +28,16 @@ package com.sun.tools.javac.code; import java.util.Locale; import com.sun.tools.javac.api.Messages; -import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.comp.DeferredAttr.DeferredType; -import com.sun.tools.javac.tree.JCTree; -import com.sun.tools.javac.tree.Pretty; -import com.sun.tools.javac.util.Assert; +import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; -import static com.sun.tools.javac.code.TypeTags.*; import static com.sun.tools.javac.code.BoundKind.*; import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.TypeTag.ARRAY; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.FORALL; /** * A combined type/symbol visitor for generating non-trivial localized string @@ -129,7 +127,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi /** * Get a localized string represenation for a given type. * - * @param ts type to be displayed + * @param t type to be displayed * @param locale the locale in which the string is to be rendered * @return localized string representation */ @@ -140,7 +138,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi /** * Get a localized string represenation for a given symbol. * - * @param ts symbol to be displayed + * @param s symbol to be displayed * @param locale the locale in which the string is to be rendered * @return localized string representation */ @@ -187,7 +185,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi @Override public String visitClassType(ClassType t, Locale locale) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (t.getEnclosingType().tag == CLASS && t.tsym.owner.kind == Kinds.TYP) { buf.append(visit(t.getEnclosingType(), locale)); buf.append("."); @@ -215,7 +213,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi @Override public String visitWildcardType(WildcardType t, Locale locale) { - StringBuffer s = new StringBuffer(); + StringBuilder s = new StringBuilder(); s.append(t.kind); if (t.kind != UNBOUND) { s.append(visit(t.type, locale)); @@ -253,7 +251,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi protected String className(ClassType t, boolean longform, Locale locale) { Symbol sym = t.tsym; if (sym.name.length() == 0 && (sym.flags() & COMPOUND) != 0) { - StringBuffer s = new StringBuffer(visit(t.supertype_field, locale)); + StringBuilder s = new StringBuilder(visit(t.supertype_field, locale)); for (List is = t.interfaces_field; is.nonEmpty(); is = is.tail) { s.append("&"); s.append(visit(is.head, locale)); @@ -292,7 +290,7 @@ public abstract class Printer implements Type.Visitor, Symbol.Vi if (!varArgs) { return visitTypes(args, locale); } else { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); while (args.tail.nonEmpty()) { buf.append(visit(args.head, locale)); args = args.tail; diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java b/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java index db96649e99a..e8153da2703 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Scope.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,10 @@ package com.sun.tools.javac.code; -import com.sun.tools.javac.util.*; import java.util.Iterator; +import com.sun.tools.javac.util.*; + /** A scope represents an area of visibility in a Java program. The * Scope class is a container for symbols which provides * efficient access to symbols given their names. Scopes are implemented diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java index f83823af270..04a59cec522 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Source.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Source.java @@ -26,12 +26,12 @@ package com.sun.tools.javac.code; import java.util.*; + import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; -import com.sun.tools.javac.util.*; import com.sun.tools.javac.jvm.Target; - +import com.sun.tools.javac.util.*; import static com.sun.tools.javac.main.Option.*; /** The source language version accepted. @@ -203,6 +203,9 @@ public enum Source { public boolean allowMethodReferences() { return compareTo(JDK1_8) >= 0; } + public boolean allowDefaultMethods() { + return compareTo(JDK1_8) >= 0; + } public boolean allowEffectivelyFinalInInnerClasses() { return compareTo(JDK1_8) >= 0; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java index 010d441cb71..3c2dce90873 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symbol.java @@ -27,11 +27,10 @@ package com.sun.tools.javac.code; import java.util.Set; import java.util.concurrent.Callable; + import javax.lang.model.element.*; import javax.tools.JavaFileObject; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.Name; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.comp.Attr; import com.sun.tools.javac.comp.AttrContext; @@ -39,10 +38,13 @@ import com.sun.tools.javac.comp.Env; import com.sun.tools.javac.jvm.*; import com.sun.tools.javac.model.*; import com.sun.tools.javac.tree.JCTree; - +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.Name; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.FORALL; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; /** Root class for Java symbols. It contains subclasses * for specific sorts of symbols, such as variables, methods and operators, @@ -161,7 +163,7 @@ public abstract class Symbol implements Element { if (owner.name == null || owner.name.isEmpty()) { return location(); } - if (owner.type.tag == CLASS) { + if (owner.type.hasTag(CLASS)) { Type ownertype = types.asOuterSuper(site, owner); if (ownertype != null) return ownertype.tsym; } @@ -256,7 +258,7 @@ public abstract class Symbol implements Element { /** A class is an inner class if it it has an enclosing instance class. */ public boolean isInner() { - return type.getEnclosingType().tag == CLASS; + return type.getEnclosingType().hasTag(CLASS); } /** An inner class has an outer instance if it is not an interface @@ -269,7 +271,7 @@ public abstract class Symbol implements Element { */ public boolean hasOuterInstance() { return - type.getEnclosingType().tag == CLASS && (flags() & (INTERFACE | NOOUTERTHIS)) == 0; + type.getEnclosingType().hasTag(CLASS) && (flags() & (INTERFACE | NOOUTERTHIS)) == 0; } /** The closest enclosing class of this symbol's declaration. @@ -277,7 +279,7 @@ public abstract class Symbol implements Element { public ClassSymbol enclClass() { Symbol c = this; while (c != null && - ((c.kind & TYP) == 0 || c.type.tag != CLASS)) { + ((c.kind & TYP) == 0 || !c.type.hasTag(CLASS))) { c = c.owner; } return (ClassSymbol)c; @@ -346,7 +348,7 @@ public abstract class Symbol implements Element { e = e.next(); } Type superType = types.supertype(clazz.type); - if (superType.tag != TypeTags.CLASS) return false; + if (!superType.hasTag(CLASS)) return false; clazz = (ClassSymbol)superType.tsym; } } @@ -373,7 +375,7 @@ public abstract class Symbol implements Element { for (Symbol sup = clazz; sup != null && sup != this.owner; sup = types.supertype(sup.type).tsym) { - while (sup.type.tag == TYPEVAR) + while (sup.type.hasTag(TYPEVAR)) sup = sup.type.getUpperBound().tsym; if (sup.type.isErroneous()) return true; // error recovery @@ -520,7 +522,7 @@ public abstract class Symbol implements Element { if (owner == null) return name; if (((owner.kind != ERR)) && ((owner.kind & (VAR | MTH)) != 0 - || (owner.kind == TYP && owner.type.tag == TYPEVAR) + || (owner.kind == TYP && owner.type.hasTag(TYPEVAR)) )) return name; Name prefix = owner.getQualifiedName(); if (prefix == null || prefix == prefix.table.names.empty) @@ -534,7 +536,7 @@ public abstract class Symbol implements Element { static public Name formFlatName(Name name, Symbol owner) { if (owner == null || (owner.kind & (VAR | MTH)) != 0 - || (owner.kind == TYP && owner.type.tag == TYPEVAR) + || (owner.kind == TYP && owner.type.hasTag(TYPEVAR)) ) return name; char sep = owner.kind == TYP ? '$' : '.'; Name prefix = owner.flatName(); @@ -553,16 +555,16 @@ public abstract class Symbol implements Element { if (this == that) return false; if (this.type.tag == that.type.tag) { - if (this.type.tag == CLASS) { + if (this.type.hasTag(CLASS)) { return types.rank(that.type) < types.rank(this.type) || types.rank(that.type) == types.rank(this.type) && that.getQualifiedName().compareTo(this.getQualifiedName()) < 0; - } else if (this.type.tag == TYPEVAR) { + } else if (this.type.hasTag(TYPEVAR)) { return types.isSubtype(this.type, that.type); } } - return this.type.tag == TYPEVAR; + return this.type.hasTag(TYPEVAR); } // For type params; overridden in subclasses. @@ -572,7 +574,7 @@ public abstract class Symbol implements Element { public java.util.List getEnclosedElements() { List list = List.nil(); - if (kind == TYP && type.tag == TYPEVAR) { + if (kind == TYP && type.hasTag(TYPEVAR)) { return list; } for (Scope.Entry e = members().elems; e != null; e = e.sibling) { @@ -591,7 +593,7 @@ public abstract class Symbol implements Element { } public R accept(ElementVisitor v, P p) { - Assert.check(type.tag == TYPEVAR); // else override will be invoked + Assert.check(type.hasTag(TYPEVAR)); // else override will be invoked return v.visitTypeParameter(this, p); } @@ -798,13 +800,13 @@ public abstract class Symbol implements Element { if (this == base) { return true; } else if ((base.flags() & INTERFACE) != 0) { - for (Type t = type; t.tag == CLASS; t = types.supertype(t)) + for (Type t = type; t.hasTag(CLASS); t = types.supertype(t)) for (List is = types.interfaces(t); is.nonEmpty(); is = is.tail) if (is.head.tsym.isSubClass(base, types)) return true; } else { - for (Type t = type; t.tag == CLASS; t = types.supertype(t)) + for (Type t = type; t.hasTag(CLASS); t = types.supertype(t)) if (t.tsym == base) return true; } return false; @@ -1048,7 +1050,7 @@ public abstract class Symbol implements Element { */ public MethodSymbol(long flags, Name name, Type type, Symbol owner) { super(MTH, flags, name, type, owner); - if (owner.type.tag == TYPEVAR) Assert.error(owner + "." + name); + if (owner.type.hasTag(TYPEVAR)) Assert.error(owner + "." + name); } /** Clone this symbol with new owner. @@ -1074,7 +1076,7 @@ public abstract class Symbol implements Element { ? owner.name.toString() : name.toString(); if (type != null) { - if (type.tag == FORALL) + if (type.hasTag(FORALL)) s = "<" + ((ForAll)type).getTypeArguments() + ">" + s; s += "(" + type.argtypes((flags() & VARARGS) != 0) + ")"; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java index c09d31eb083..3002a9dfc2d 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Symtab.java @@ -26,17 +26,18 @@ package com.sun.tools.javac.code; import java.util.*; -import javax.lang.model.type.TypeVisitor; -import javax.lang.model.element.ElementVisitor; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.List; +import javax.lang.model.element.ElementVisitor; +import javax.lang.model.type.TypeVisitor; + import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.jvm.*; - -import static com.sun.tools.javac.jvm.ByteCodes.*; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.jvm.ByteCodes.*; +import static com.sun.tools.javac.code.TypeTag.*; /** A class that defines all predefined constants and operators * as well as special classes such as java.lang.Object, which need @@ -64,16 +65,16 @@ public class Symtab { /** Builtin types. */ - public final Type byteType = new Type(TypeTags.BYTE, null); - public final Type charType = new Type(TypeTags.CHAR, null); - public final Type shortType = new Type(TypeTags.SHORT, null); - public final Type intType = new Type(TypeTags.INT, null); - public final Type longType = new Type(TypeTags.LONG, null); - public final Type floatType = new Type(TypeTags.FLOAT, null); - public final Type doubleType = new Type(TypeTags.DOUBLE, null); - public final Type booleanType = new Type(TypeTags.BOOLEAN, null); + public final Type byteType = new Type(BYTE, null); + public final Type charType = new Type(CHAR, null); + public final Type shortType = new Type(SHORT, null); + public final Type intType = new Type(INT, null); + public final Type longType = new Type(LONG, null); + public final Type floatType = new Type(FLOAT, null); + public final Type doubleType = new Type(DOUBLE, null); + public final Type booleanType = new Type(BOOLEAN, null); public final Type botType = new BottomType(); - public final JCNoType voidType = new JCNoType(TypeTags.VOID); + public final JCNoType voidType = new JCNoType(VOID); private final Names names; private final ClassReader reader; @@ -126,6 +127,7 @@ public class Symtab { public final Type cloneableType; public final Type serializableType; public final Type methodHandleType; + public final Type methodHandleLookupType; public final Type methodTypeType; public final Type nativeHeaderType; public final Type throwableType; @@ -157,6 +159,7 @@ public class Symtab { public final Type systemType; public final Type autoCloseableType; public final Type trustMeType; + public final Type lambdaMetafactory; public final Type containedByType; public final Type containerForType; public final Type documentedType; @@ -177,11 +180,11 @@ public class Symtab { /** The predefined type that belongs to a tag. */ - public final Type[] typeOfTag = new Type[TypeTags.TypeTagCount]; + public final Type[] typeOfTag = new Type[TypeTag.getTypeTagCount()]; /** The name of the class that belongs to a basix type tag. */ - public final Name[] boxedName = new Name[TypeTags.TypeTagCount]; + public final Name[] boxedName = new Name[TypeTag.getTypeTagCount()]; /** A set containing all operator names. */ @@ -202,7 +205,7 @@ public class Symtab { public void initType(Type type, ClassSymbol c) { type.tsym = c; - typeOfTag[type.tag] = type; + typeOfTag[type.tag.ordinal()] = type; } public void initType(Type type, String name) { @@ -214,7 +217,7 @@ public class Symtab { public void initType(Type type, String name, String bname) { initType(type, name); - boxedName[type.tag] = names.fromString("java.lang." + bname); + boxedName[type.tag.ordinal()] = names.fromString("java.lang." + bname); } /** The class symbol that owns all predefined symbols. @@ -301,7 +304,7 @@ public class Symtab { } /** Enter a class into symbol table. - * @param The name of the class. + * @param s The name of the class. */ private Type enterClass(String s) { return reader.enterClass(names.fromString(s)).type; @@ -324,7 +327,7 @@ public class Symtab { } public void synthesizeBoxTypeIfMissing(final Type type) { - ClassSymbol sym = reader.enterClass(boxedName[type.tag]); + ClassSymbol sym = reader.enterClass(boxedName[type.tag.ordinal()]); final Completer completer = sym.completer; if (completer != null) { sym.completer = new Completer() { @@ -366,7 +369,7 @@ public class Symtab { target = Target.instance(context); // Create the unknown type - unknownType = new Type(TypeTags.UNKNOWN, null) { + unknownType = new Type(UNKNOWN, null) { @Override public R accept(TypeVisitor v, P p) { return v.visitUnknown(this, p); @@ -455,6 +458,7 @@ public class Symtab { throwableType = enterClass("java.lang.Throwable"); serializableType = enterClass("java.io.Serializable"); methodHandleType = enterClass("java.lang.invoke.MethodHandle"); + methodHandleLookupType = enterClass("java.lang.invoke.MethodHandles$Lookup"); methodTypeType = enterClass("java.lang.invoke.MethodType"); errorType = enterClass("java.lang.Error"); illegalArgumentExceptionType = enterClass("java.lang.IllegalArgumentException"); @@ -502,10 +506,12 @@ public class Symtab { autoCloseableType.tsym); trustMeType = enterClass("java.lang.SafeVarargs"); nativeHeaderType = enterClass("javax.tools.annotation.GenerateNativeHeader"); + lambdaMetafactory = enterClass("java.lang.invoke.LambdaMetafactory"); synthesizeEmptyInterfaceIfMissing(autoCloseableType); synthesizeEmptyInterfaceIfMissing(cloneableType); synthesizeEmptyInterfaceIfMissing(serializableType); + synthesizeEmptyInterfaceIfMissing(lambdaMetafactory); synthesizeBoxTypeIfMissing(doubleType); synthesizeBoxTypeIfMissing(floatType); synthesizeBoxTypeIfMissing(voidType); diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java b/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java index 6c242879c57..573f6275ddd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TargetType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,11 @@ package com.sun.tools.javac.code; -import static com.sun.tools.javac.code.TargetType.TargetAttribute.*; - import java.util.EnumSet; import java.util.Set; +import static com.sun.tools.javac.code.TargetType.TargetAttribute.*; + /** * Describes the type of program element an extended annotation (or extended * compound attribute) targets. diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java index eefbf90c85d..f75bbf3e8b6 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Type.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Type.java @@ -26,10 +26,6 @@ package com.sun.tools.javac.code; import java.util.Collections; - -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.util.*; - import java.util.EnumMap; import java.util.EnumSet; import java.util.Map; @@ -37,10 +33,12 @@ import java.util.Set; import javax.lang.model.type.*; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.util.*; import static com.sun.tools.javac.code.BoundKind.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; /** This class represents Java types. The class itself defines the behavior of * the following types: @@ -68,7 +66,7 @@ import static com.sun.tools.javac.code.TypeTags.*; * This code and its internal interfaces are subject to change or * deletion without notice. * - * @see TypeTags + * @see TypeTag */ public class Type implements PrimitiveType { @@ -85,14 +83,76 @@ public class Type implements PrimitiveType { /** The tag of this type. * - * @see TypeTags + * @see TypeTag */ - public int tag; + protected TypeTag tag; /** The defining class / interface / package / type variable */ public TypeSymbol tsym; + /** + * Checks if the current type tag is equal to the given tag. + * @return true if tag is equal to the current type tag. + */ + public boolean hasTag(TypeTag tag) { + return this.tag == tag; + } + + /** + * Returns the current type tag. + * @return the value of the current type tag. + */ + public TypeTag getTag() { + return tag; + } + + public boolean isNumeric() { + switch (tag) { + case BYTE: case CHAR: + case SHORT: + case INT: case LONG: + case FLOAT: case DOUBLE: + return true; + default: + return false; + } + } + + public boolean isPrimitive() { + return (isNumeric() || tag == BOOLEAN); + } + + public boolean isPrimitiveOrVoid() { + return (isPrimitive() || tag == VOID); + } + + public boolean isReference() { + switch (tag) { + case CLASS: + case ARRAY: + case TYPEVAR: + case WILDCARD: + case ERROR: + return true; + default: + return false; + } + } + + public boolean isNullOrReference() { + return (tag == BOT || isReference()); + } + + public boolean isPartial() { + switch(tag) { + case ERROR: case UNKNOWN: case UNDETVAR: + return true; + default: + return false; + } + } + /** * The constant value of this type, null if this type does not * have a constant value attribute. Only primitive types and @@ -123,7 +183,7 @@ public class Type implements PrimitiveType { /** Define a type given its tag and type symbol */ - public Type(int tag, TypeSymbol tsym) { + public Type(TypeTag tag, TypeSymbol tsym) { this.tag = tag; this.tsym = tsym; } @@ -164,7 +224,7 @@ public class Type implements PrimitiveType { */ public Type constType(Object constValue) { final Object value = constValue; - Assert.check(tag <= BOOLEAN); + Assert.check(isPrimitive()); return new Type(tag, tsym) { @Override public Object constValue() { @@ -354,10 +414,6 @@ public class Type implements PrimitiveType { return (tsym.flags() & FINAL) != 0; } - public boolean isPrimitive() { - return tag < VOID; - } - /** * Does this type contain occurrences of type t? */ @@ -810,7 +866,7 @@ public class Type implements PrimitiveType { } public int hashCode() { - return (ARRAY << 5) + elemtype.hashCode(); + return (ARRAY.ordinal() << 5) + elemtype.hashCode(); } public boolean isVarargs() { @@ -917,7 +973,7 @@ public class Type implements PrimitiveType { } public int hashCode() { - int h = METHOD; + int h = METHOD.ordinal(); for (List thisargs = this.argtypes; thisargs.tail != null; /*inlined: thisargs.nonEmpty()*/ thisargs = thisargs.tail) @@ -1101,7 +1157,7 @@ public class Type implements PrimitiveType { public static abstract class DelegatedType extends Type { public Type qtype; - public DelegatedType(int tag, Type qtype) { + public DelegatedType(TypeTag tag, Type qtype) { super(tag, qtype.tsym); this.qtype = qtype; } @@ -1287,7 +1343,7 @@ public class Type implements PrimitiveType { /** Represents VOID or NONE. */ static class JCNoType extends Type implements NoType { - public JCNoType(int tag) { + public JCNoType(TypeTag tag) { super(tag, null); } @@ -1309,7 +1365,7 @@ public class Type implements PrimitiveType { static class BottomType extends Type implements NullType { public BottomType() { - super(TypeTags.BOT, null); + super(BOT, null); } @Override diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java new file mode 100644 index 00000000000..da6affeec42 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTag.java @@ -0,0 +1,226 @@ +/* + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.tools.javac.code; + +import com.sun.source.tree.Tree.Kind; + +import javax.lang.model.type.TypeKind; + +/** An interface for type tag values, which distinguish between different + * sorts of types. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public enum TypeTag { + /** The tag of the basic type `byte'. + */ + BYTE(1), + + /** The tag of the basic type `char'. + */ + CHAR(2), + + /** The tag of the basic type `short'. + */ + SHORT(3), + + /** The tag of the basic type `int'. + */ + INT(4), + + /** The tag of the basic type `long'. + */ + LONG(5), + + /** The tag of the basic type `float'. + */ + FLOAT(6), + + /** The tag of the basic type `double'. + */ + DOUBLE(7), + + /** The tag of the basic type `boolean'. + */ + BOOLEAN, + + /** The tag of the type `void'. + */ + VOID, + + /** The tag of all class and interface types. + */ + CLASS, + + /** The tag of all array types. + */ + ARRAY, + + /** The tag of all (monomorphic) method types. + */ + METHOD, + + /** The tag of all package "types". + */ + PACKAGE, + + /** The tag of all (source-level) type variables. + */ + TYPEVAR, + + /** The tag of all type arguments. + */ + WILDCARD, + + /** The tag of all polymorphic (method-) types. + */ + FORALL, + + /** The tag of deferred expression types in method context + */ + DEFERRED, + + /** The tag of the bottom type {@code }. + */ + BOT, + + /** The tag of a missing type. + */ + NONE, + + /** The tag of the error type. + */ + ERROR, + + /** The tag of an unknown type + */ + UNKNOWN, + + /** The tag of all instantiatable type variables. + */ + UNDETVAR, + + /** Pseudo-types, these are special tags + */ + UNINITIALIZED_THIS, + + UNINITIALIZED_OBJECT; + + /** This field will only be used for tags related with numeric types for + * optimization reasons. + */ + private int order = 0; + + private TypeTag() {} + + private TypeTag(int order) { + this.order = order; + } + + private static final int MIN_NUMERIC_TAG_ORDER = 1; + private static final int MAX_NUMERIC_TAG_ORDER = 7; + + /** Returns the number of type tags. + */ + public static int getTypeTagCount() { + // last two tags are not included in the total as long as they are pseudo-types + return (UNDETVAR.ordinal() + 1); + } + + public boolean isSubRangeOf(TypeTag range) { + return (this == range) || isStrictSubRangeOf(range); + } + + public boolean isStrictSubRangeOf(TypeTag range) { + if (this.order >= MIN_NUMERIC_TAG_ORDER && this.order <= MAX_NUMERIC_TAG_ORDER && + range.order >= MIN_NUMERIC_TAG_ORDER && this.order <= MAX_NUMERIC_TAG_ORDER) { + if (this == range) + return false; + switch (this) { + case BYTE: + return true; + case CHAR: case SHORT: case INT: + case LONG: case FLOAT: + return this.order < range.order && range.order <= MAX_NUMERIC_TAG_ORDER; + default: + return false; + } + } + else + return false; + } + + public Kind getKindLiteral() { + switch (this) { + case INT: + return Kind.INT_LITERAL; + case LONG: + return Kind.LONG_LITERAL; + case FLOAT: + return Kind.FLOAT_LITERAL; + case DOUBLE: + return Kind.DOUBLE_LITERAL; + case BOOLEAN: + return Kind.BOOLEAN_LITERAL; + case CHAR: + return Kind.CHAR_LITERAL; + case CLASS: + return Kind.STRING_LITERAL; + case BOT: + return Kind.NULL_LITERAL; + default: + throw new AssertionError("unknown literal kind " + this); + } + } + + public TypeKind getPrimitiveTypeKind() { + switch (this) { + case BOOLEAN: + return TypeKind.BOOLEAN; + case BYTE: + return TypeKind.BYTE; + case SHORT: + return TypeKind.SHORT; + case INT: + return TypeKind.INT; + case LONG: + return TypeKind.LONG; + case CHAR: + return TypeKind.CHAR; + case FLOAT: + return TypeKind.FLOAT; + case DOUBLE: + return TypeKind.DOUBLE; + case VOID: + return TypeKind.VOID; + default: + throw new AssertionError("unknown primitive type " + this); + } + } +} diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java b/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java deleted file mode 100644 index d46286ade81..00000000000 --- a/langtools/src/share/classes/com/sun/tools/javac/code/TypeTags.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 1999, 2005, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package com.sun.tools.javac.code; - - -/** An interface for type tag values, which distinguish between different - * sorts of types. - * - *

    This is NOT part of any supported API. - * If you write code that depends on this, you do so at your own risk. - * This code and its internal interfaces are subject to change or - * deletion without notice. - */ -public class TypeTags { - - private TypeTags() {} // uninstantiable - - /** The tag of the basic type `byte'. - */ - public static final int BYTE = 1; - - /** The tag of the basic type `char'. - */ - public static final int CHAR = BYTE+1; - - /** The tag of the basic type `short'. - */ - public static final int SHORT = CHAR+1; - - /** The tag of the basic type `int'. - */ - public static final int INT = SHORT+1; - - /** The tag of the basic type `long'. - */ - public static final int LONG = INT+1; - - /** The tag of the basic type `float'. - */ - public static final int FLOAT = LONG+1; - - /** The tag of the basic type `double'. - */ - public static final int DOUBLE = FLOAT+1; - - /** The tag of the basic type `boolean'. - */ - public static final int BOOLEAN = DOUBLE+1; - - /** The tag of the type `void'. - */ - public static final int VOID = BOOLEAN+1; - - /** The tag of all class and interface types. - */ - public static final int CLASS = VOID+1; - - /** The tag of all array types. - */ - public static final int ARRAY = CLASS+1; - - /** The tag of all (monomorphic) method types. - */ - public static final int METHOD = ARRAY+1; - - /** The tag of all package "types". - */ - public static final int PACKAGE = METHOD+1; - - /** The tag of all (source-level) type variables. - */ - public static final int TYPEVAR = PACKAGE+1; - - /** The tag of all type arguments. - */ - public static final int WILDCARD = TYPEVAR+1; - - /** The tag of all polymorphic (method-) types. - */ - public static final int FORALL = WILDCARD+1; - - /** The tag of deferred expression types in method context - */ - public static final int DEFERRED = FORALL+1; - - /** The tag of the bottom type . - */ - public static final int BOT = DEFERRED+1; - - /** The tag of a missing type. - */ - public static final int NONE = BOT+1; - - /** The tag of the error type. - */ - public static final int ERROR = NONE+1; - - /** The tag of an unknown type - */ - public static final int UNKNOWN = ERROR+1; - - /** The tag of all instantiatable type variables. - */ - public static final int UNDETVAR = UNKNOWN+1; - - /** The number of type tags. - */ - public static final int TypeTagCount = UNDETVAR+1; - - /** The maximum tag of a basic type. - */ - public static final int lastBaseTag = BOOLEAN; - - /** The minimum tag of a partial type - */ - public static final int firstPartialTag = ERROR; -} diff --git a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java index 0cb2b07b248..988a25d01ff 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/code/Types.java +++ b/langtools/src/share/classes/com/sun/tools/javac/code/Types.java @@ -28,21 +28,19 @@ package com.sun.tools.javac.code; import java.lang.ref.SoftReference; import java.util.*; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.List; - -import com.sun.tools.javac.jvm.ClassReader; import com.sun.tools.javac.code.Attribute.RetentionPolicy; import com.sun.tools.javac.code.Lint.LintCategory; import com.sun.tools.javac.code.Type.UndetVar.InferenceBound; import com.sun.tools.javac.comp.Check; - -import static com.sun.tools.javac.code.Scope.*; -import static com.sun.tools.javac.code.Type.*; -import static com.sun.tools.javac.code.TypeTags.*; -import static com.sun.tools.javac.code.Symbol.*; -import static com.sun.tools.javac.code.Flags.*; +import com.sun.tools.javac.jvm.ClassReader; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.BoundKind.*; +import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.Scope.*; +import static com.sun.tools.javac.code.Symbol.*; +import static com.sun.tools.javac.code.Type.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.util.ListBuffer.lb; /** @@ -607,8 +605,8 @@ public class Types { } //where private boolean isSubtypeUncheckedInternal(Type t, Type s, Warner warn) { - if (t.tag == ARRAY && s.tag == ARRAY) { - if (((ArrayType)t).elemtype.tag <= lastBaseTag) { + if (t.hasTag(ARRAY) && s.hasTag(ARRAY)) { + if (((ArrayType)t).elemtype.isPrimitive()) { return isSameType(elemtype(t), elemtype(s)); } else { return isSubtypeUnchecked(elemtype(t), elemtype(s), warn); @@ -666,7 +664,7 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return isSuperType(s, t); if (s.isCompound()) { @@ -688,25 +686,27 @@ public class Types { { public Boolean visitType(Type t, Type s) { switch (t.tag) { - case BYTE: case CHAR: - return (t.tag == s.tag || - t.tag + 2 <= s.tag && s.tag <= DOUBLE); - case SHORT: case INT: case LONG: case FLOAT: case DOUBLE: - return t.tag <= s.tag && s.tag <= DOUBLE; - case BOOLEAN: case VOID: - return t.tag == s.tag; - case TYPEVAR: - return isSubtypeNoCapture(t.getUpperBound(), s); - case BOT: - return - s.tag == BOT || s.tag == CLASS || - s.tag == ARRAY || s.tag == TYPEVAR; - case WILDCARD: //we shouldn't be here - avoids crash (see 7034495) - case NONE: - return false; - default: - throw new AssertionError("isSubtype " + t.tag); - } + case BYTE: + return (!s.hasTag(CHAR) && t.getTag().isSubRangeOf(s.getTag())); + case CHAR: + return (!s.hasTag(SHORT) && t.getTag().isSubRangeOf(s.getTag())); + case SHORT: case INT: case LONG: + case FLOAT: case DOUBLE: + return t.getTag().isSubRangeOf(s.getTag()); + case BOOLEAN: case VOID: + return t.hasTag(s.getTag()); + case TYPEVAR: + return isSubtypeNoCapture(t.getUpperBound(), s); + case BOT: + return + s.hasTag(BOT) || s.hasTag(CLASS) || + s.hasTag(ARRAY) || s.hasTag(TYPEVAR); + case WILDCARD: //we shouldn't be here - avoids crash (see 7034495) + case NONE: + return false; + default: + throw new AssertionError("isSubtype " + t.tag); + } } private Set cache = new HashSet(); @@ -776,7 +776,7 @@ public class Types { @Override public Boolean visitArrayType(ArrayType t, Type s) { if (s.tag == ARRAY) { - if (t.elemtype.tag <= lastBaseTag) + if (t.elemtype.isPrimitive()) return isSameType(t.elemtype, elemtype(s)); else return isSubtypeNoCapture(t.elemtype, elemtype(s)); @@ -909,7 +909,7 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); switch (t.tag) { @@ -938,7 +938,7 @@ public class Types { @Override public Boolean visitWildcardType(WildcardType t, Type s) { - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); else return false; @@ -949,7 +949,7 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); if (s.isSuperBound() && !s.isExtendsBound()) @@ -978,10 +978,10 @@ public class Types { if (t == s) return true; - if (s.tag >= firstPartialTag) + if (s.isPartial()) return visit(s, t); - return s.tag == ARRAY + return s.hasTag(ARRAY) && containsTypeEquivalent(t.elemtype, elemtype(s)); } @@ -1122,7 +1122,7 @@ public class Types { } public Boolean visitType(Type t, Type s) { - if (s.tag >= firstPartialTag) + if (s.isPartial()) return containedBy(s, t); else return isSameType(t, s); @@ -1144,7 +1144,7 @@ public class Types { @Override public Boolean visitWildcardType(WildcardType t, Type s) { - if (s.tag >= firstPartialTag) + if (s.isPartial()) return containedBy(s, t); else { // debugContainsType(t, s); @@ -1234,7 +1234,7 @@ public class Types { switch (t.tag) { case BYTE: case CHAR: case SHORT: case INT: case LONG: case FLOAT: case DOUBLE: - return s.tag <= DOUBLE; + return s.isNumeric(); case BOOLEAN: return s.tag == BOOLEAN; case VOID: @@ -1375,8 +1375,7 @@ public class Types { case CLASS: return isSubtype(t, s); case ARRAY: - if (elemtype(t).tag <= lastBaseTag || - elemtype(s).tag <= lastBaseTag) { + if (elemtype(t).isPrimitive() || elemtype(s).isPrimitive()) { return elemtype(t).tag == elemtype(s).tag; } else { return visit(elemtype(t), elemtype(s)); @@ -1429,8 +1428,8 @@ public class Types { * conservative in that it is allowed to say that two types are * not disjoint, even though they actually are. * - * The type C is castable to C exactly if X and Y are not - * disjoint. + * The type {@code C} is castable to {@code C} exactly if + * {@code X} and {@code Y} are not disjoint. */ public boolean disjointType(Type t, Type s) { return disjointType.visit(t, s); @@ -1525,7 +1524,7 @@ public class Types { * something of type `t' can be a subtype of `s'? This is * different from the question "is `t' not a subtype of `s'?" * when type variables are involved: Integer is not a subtype of T - * where but it is not true that Integer cannot + * where {@code } but it is not true that Integer cannot * possibly be a subtype of T. */ public boolean notSoftSubtype(Type t, Type s) { @@ -1650,8 +1649,8 @@ public class Types { */ public ArrayType makeArrayType(Type t) { if (t.tag == VOID || - t.tag >= PACKAGE) { - Assert.error("Type t must not be a a VOID or PACKAGE type, " + t.toString()); + t.tag == PACKAGE) { + Assert.error("Type t must not be a VOID or PACKAGE type, " + t.toString()); } return new ArrayType(t, syms.arrayClass); } @@ -1849,7 +1848,7 @@ public class Types { public boolean isAssignable(Type t, Type s, Warner warn) { if (t.tag == ERROR) return true; - if (t.tag <= INT && t.constValue() != null) { + if (t.tag.isSubRangeOf(INT) && t.constValue() != null) { int value = ((Number)t.constValue()).intValue(); switch (s.tag) { case BYTE: @@ -1893,11 +1892,11 @@ public class Types { // We don't want to erase primitive types and String type as that // operation is idempotent. Also, erasing these could result in loss // of information such as constant values attached to such types. - return (t.tag <= lastBaseTag) || (syms.stringType.tsym == t.tsym); + return (t.isPrimitive()) || (syms.stringType.tsym == t.tsym); } private Type erasure(Type t, boolean recurse) { - if (t.tag <= lastBaseTag) + if (t.isPrimitive()) return t; /* fast special case */ else return erasure.visit(t, recurse); @@ -1905,7 +1904,7 @@ public class Types { // where private SimpleVisitor erasure = new SimpleVisitor() { public Type visitType(Type t, Boolean recurse) { - if (t.tag <= lastBaseTag) + if (t.isPrimitive()) return t; /*fast special case*/ else return t.map(recurse ? erasureRecFun : erasureFun); @@ -3316,7 +3315,7 @@ public class Types { private static final UnaryVisitor hashCode = new UnaryVisitor() { public Integer visitType(Type t, Void ignored) { - return t.tag; + return t.tag.ordinal(); } @Override @@ -3432,7 +3431,7 @@ public class Types { * Return the class that boxes the given primitive. */ public ClassSymbol boxedClass(Type t) { - return reader.enterClass(syms.boxedName[t.tag]); + return reader.enterClass(syms.boxedName[t.tag.ordinal()]); } /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java index e9cad76d473..cc3ea1e2f96 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Annotate.java @@ -34,6 +34,8 @@ import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.tree.*; import com.sun.tools.javac.tree.JCTree.*; +import static com.sun.tools.javac.code.TypeTag.ARRAY; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** Enter annotations on symbols. Annotations accumulate in a queue, @@ -289,7 +291,7 @@ public class Annotate { } return enterAnnotation((JCAnnotation)tree, expected, env); } - if (expected.tag == TypeTags.ARRAY) { // should really be isArray() + if (expected.hasTag(ARRAY)) { // should really be isArray() if (!tree.hasTag(NEWARRAY)) { tree = make.at(tree.pos). NewArray(null, List.nil(), List.of(tree)); @@ -309,7 +311,7 @@ public class Annotate { return new Attribute. Array(expected, buf.toArray(new Attribute[buf.length()])); } - if (expected.tag == TypeTags.CLASS && + if (expected.hasTag(CLASS) && (expected.tsym.flags() & Flags.ENUM) != 0) { attr.attribExpr(tree, env, expected); Symbol sym = TreeInfo.symbol(tree); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java index e11297309c3..ca8d2a4fe87 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Attr.java @@ -25,41 +25,39 @@ package com.sun.tools.javac.comp; -import com.sun.tools.javac.code.*; -import com.sun.tools.javac.comp.DeferredAttr.AttrMode; -import com.sun.tools.javac.comp.Infer.InferenceContext; -import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener; -import com.sun.tools.javac.jvm.*; -import com.sun.tools.javac.tree.*; -import com.sun.tools.javac.util.*; -import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; -import com.sun.tools.javac.util.List; +import java.util.*; +import java.util.Set; -import com.sun.tools.javac.jvm.Target; -import com.sun.tools.javac.code.Lint.LintCategory; -import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.tree.JCTree.*; -import com.sun.tools.javac.code.Type.*; -import com.sun.tools.javac.comp.Check.CheckContext; +import javax.lang.model.element.ElementKind; +import javax.tools.JavaFileObject; import com.sun.source.tree.IdentifierTree; import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.source.tree.MemberSelectTree; import com.sun.source.tree.TreeVisitor; import com.sun.source.util.SimpleTreeVisitor; - -import java.util.*; -import java.util.Set; -import javax.lang.model.element.ElementKind; -import javax.tools.JavaFileObject; - +import com.sun.tools.javac.code.*; +import com.sun.tools.javac.code.Lint.LintCategory; +import com.sun.tools.javac.code.Symbol.*; +import com.sun.tools.javac.code.Type.*; +import com.sun.tools.javac.comp.Check.CheckContext; +import com.sun.tools.javac.comp.DeferredAttr.AttrMode; +import com.sun.tools.javac.comp.Infer.InferenceContext; +import com.sun.tools.javac.comp.Infer.InferenceContext.FreeTypeListener; +import com.sun.tools.javac.jvm.*; +import com.sun.tools.javac.jvm.Target; +import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.tree.JCTree.*; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; +import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; import static com.sun.tools.javac.code.Kinds.ERRONEOUS; -import static com.sun.tools.javac.code.TypeTags.*; -import static com.sun.tools.javac.code.TypeTags.WILDCARD; +import static com.sun.tools.javac.code.TypeTag.*; +import static com.sun.tools.javac.code.TypeTag.WILDCARD; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** This is the main context-dependent analysis phase in GJC. It @@ -229,14 +227,13 @@ public class Attr extends JCTree.Visitor { * are correct. * * @param tree The tree whose kind and type is checked - * @param owntype The computed type of the tree * @param ownkind The computed kind of the tree * @param resultInfo The expected result of the tree */ Type check(final JCTree tree, final Type found, final int ownkind, final ResultInfo resultInfo) { InferenceContext inferenceContext = resultInfo.checkContext.inferenceContext(); Type owntype = found; - if (owntype.tag != ERROR && resultInfo.pt.tag != METHOD && resultInfo.pt.tag != FORALL) { + if (!owntype.hasTag(ERROR) && !resultInfo.pt.hasTag(METHOD) && !resultInfo.pt.hasTag(FORALL)) { if (inferenceContext.free(found)) { inferenceContext.addFreeTypeListener(List.of(found, resultInfo.pt), new FreeTypeListener() { @Override @@ -608,7 +605,7 @@ public class Attr extends JCTree.Visitor { /** Derived visitor method: attribute an expression tree. */ public Type attribExpr(JCTree tree, Env env, Type pt) { - return attribTree(tree, env, new ResultInfo(VAL, pt.tag != ERROR ? pt : Type.noType)); + return attribTree(tree, env, new ResultInfo(VAL, !pt.hasTag(ERROR) ? pt : Type.noType)); } /** Derived visitor method: attribute an expression tree with @@ -742,7 +739,7 @@ public class Attr extends JCTree.Visitor { * @param env The env for the const value * @param initializer The initializer for the const value * @param type The expected type, or null - * @see VarSymbol#setlazyConstValue + * @see VarSymbol#setLazyConstValue */ public Object attribLazyConstantValue(Env env, JCTree.JCExpression initializer, @@ -808,7 +805,7 @@ public class Attr extends JCTree.Visitor { boolean checkExtensible) { if (t.isErroneous()) return t; - if (t.tag == TYPEVAR && !classExpected && !interfaceExpected) { + if (t.hasTag(TYPEVAR) && !classExpected && !interfaceExpected) { // check that type variable is already visible if (t.getUpperBound() == null) { log.error(tree.pos(), "illegal.forward.ref"); @@ -875,6 +872,7 @@ public class Attr extends JCTree.Visitor { public void visitMethodDef(JCMethodDecl tree) { MethodSymbol m = tree.sym; + boolean isDefaultMethod = (m.flags() & DEFAULT) != 0; Lint lint = env.info.lint.augment(m.annotations, m.flags()); Lint prevLint = chk.setLint(lint); @@ -954,8 +952,8 @@ public class Attr extends JCTree.Visitor { // Empty bodies are only allowed for // abstract, native, or interface methods, or for methods // in a retrofit signature class. - if ((owner.flags() & INTERFACE) == 0 && - (tree.mods.flags & (ABSTRACT | NATIVE)) == 0 && + if (isDefaultMethod || ((owner.flags() & INTERFACE) == 0 && + (tree.mods.flags & (ABSTRACT | NATIVE)) == 0) && !relax) log.error(tree.pos(), "missing.meth.body.or.decl.abstract"); if (tree.defaultValue != null) { @@ -963,7 +961,7 @@ public class Attr extends JCTree.Visitor { log.error(tree.pos(), "default.allowed.in.intf.annotation.member"); } - } else if ((owner.flags() & INTERFACE) != 0) { + } else if ((owner.flags() & INTERFACE) != 0 && !isDefaultMethod) { log.error(tree.body.pos(), "intf.meth.cant.have.body"); } else if ((tree.mods.flags & ABSTRACT) != 0) { log.error(tree.pos(), "abstract.meth.cant.have.body"); @@ -1209,7 +1207,7 @@ public class Attr extends JCTree.Visitor { } } else { Type pattype = attribExpr(c.pat, switchEnv, seltype); - if (pattype.tag != ERROR) { + if (!pattype.hasTag(ERROR)) { if (pattype.constValue() == null) { log.error(c.pat.pos(), (stringSwitch ? "string.const.req" : "const.expr.req")); @@ -1380,10 +1378,10 @@ public class Attr extends JCTree.Visitor { Type condtype = attribExpr(tree.cond, env, syms.booleanType); boolean standaloneConditional = !allowPoly || - pt().tag == NONE && pt() != Type.recoveryType || + pt().hasTag(NONE) && pt() != Type.recoveryType || isBooleanOrNumeric(env, tree); - if (!standaloneConditional && resultInfo.pt.tag == VOID) { + if (!standaloneConditional && resultInfo.pt.hasTag(VOID)) { //cannot get here (i.e. it means we are returning from void method - which is already an error) result = tree.type = types.createErrorType(resultInfo.pt); return; @@ -1417,7 +1415,8 @@ public class Attr extends JCTree.Visitor { @SuppressWarnings("fallthrough") private boolean isBooleanOrNumeric(Env env, JCExpression tree) { switch (tree.getTag()) { - case LITERAL: return ((JCLiteral)tree).typetag < CLASS; + case LITERAL: return ((JCLiteral)tree).typetag.isSubRangeOf(DOUBLE) || + ((JCLiteral)tree).typetag == BOOLEAN; case LAMBDA: case REFERENCE: return false; case PARENS: return isBooleanOrNumeric(env, ((JCParens)tree).expr); case CONDEXPR: @@ -1427,7 +1426,7 @@ public class Attr extends JCTree.Visitor { default: Type speculativeType = deferredAttr.attribSpeculative(tree, env, unknownExprInfo).type; speculativeType = types.unboxedTypeOrType(speculativeType); - return speculativeType.tag <= BOOLEAN; + return speculativeType.isPrimitive(); } } @@ -1460,16 +1459,19 @@ public class Attr extends JCTree.Visitor { // If one arm has an integer subrange type (i.e., byte, // short, or char), and the other is an integer constant // that fits into the subrange, return the subrange type. - if (thenUnboxed.tag < INT && elseUnboxed.tag == INT && + if (thenUnboxed.getTag().isStrictSubRangeOf(INT) && elseUnboxed.hasTag(INT) && types.isAssignable(elseUnboxed, thenUnboxed)) return thenUnboxed.baseType(); - if (elseUnboxed.tag < INT && thenUnboxed.tag == INT && + if (elseUnboxed.getTag().isStrictSubRangeOf(INT) && thenUnboxed.hasTag(INT) && types.isAssignable(thenUnboxed, elseUnboxed)) return elseUnboxed.baseType(); - for (int i = BYTE; i < VOID; i++) { - Type candidate = syms.typeOfTag[i]; - if (types.isSubtype(thenUnboxed, candidate) && + for (TypeTag tag : TypeTag.values()) { + if (tag.ordinal() >= TypeTag.getTypeTagCount()) break; + Type candidate = syms.typeOfTag[tag.ordinal()]; + if (candidate != null && + candidate.isPrimitive() && + types.isSubtype(thenUnboxed, candidate) && types.isSubtype(elseUnboxed, candidate)) return candidate; } @@ -1488,7 +1490,7 @@ public class Attr extends JCTree.Visitor { if (types.isSubtype(elsetype, thentype)) return thentype.baseType(); - if (!allowBoxing || thentype.tag == VOID || elsetype.tag == VOID) { + if (!allowBoxing || thentype.hasTag(VOID) || elsetype.hasTag(VOID)) { log.error(pos, "neither.conditional.subtype", thentype, elsetype); return thentype.baseType(); @@ -1602,12 +1604,12 @@ public class Attr extends JCTree.Visitor { // Attribute return expression, if it exists, and check that // it conforms to result type of enclosing method. if (tree.expr != null) { - if (env.info.returnResult.pt.tag == VOID) { + if (env.info.returnResult.pt.hasTag(VOID)) { log.error(tree.expr.pos(), "cant.ret.val.from.meth.decl.void"); } attribTree(tree.expr, env, env.info.returnResult); - } else if (env.info.returnResult.pt.tag != VOID) { + } else if (!env.info.returnResult.pt.hasTag(VOID)) { log.error(tree.pos(), "missing.ret.val"); } } @@ -1672,11 +1674,11 @@ public class Attr extends JCTree.Visitor { } } - if (site.tag == CLASS) { + if (site.hasTag(CLASS)) { Type encl = site.getEnclosingType(); - while (encl != null && encl.tag == TYPEVAR) + while (encl != null && encl.hasTag(TYPEVAR)) encl = encl.getUpperBound(); - if (encl.tag == CLASS) { + if (encl.hasTag(CLASS)) { // we are calling a nested class if (tree.meth.hasTag(SELECT)) { @@ -1741,7 +1743,7 @@ public class Attr extends JCTree.Visitor { // Compute the result type. Type restype = mtype.getReturnType(); - if (restype.tag == WILDCARD) + if (restype.hasTag(WILDCARD)) throw new AssertionError(mtype); Type qualifier = (tree.meth.hasTag(SELECT)) @@ -1871,7 +1873,7 @@ public class Attr extends JCTree.Visitor { } } } else if (!clazztype.tsym.isInterface() && - clazztype.getEnclosingType().tag == CLASS) { + clazztype.getEnclosingType().hasTag(CLASS)) { // Check for the existence of an apropos outer instance rs.resolveImplicitThis(tree.pos(), env, clazztype); } @@ -1881,7 +1883,7 @@ public class Attr extends JCTree.Visitor { List typeargtypes = attribTypes(tree.typeargs, localEnv); // If we have made no mistakes in the class type... - if (clazztype.tag == CLASS) { + if (clazztype.hasTag(CLASS)) { // Enums may not be instantiated except implicitly if (allowEnums && (clazztype.tsym.flags_field&Flags.ENUM) != 0 && @@ -2059,7 +2061,7 @@ public class Attr extends JCTree.Visitor { resultInfo.checkContext.inferenceContext().free(resultInfo.pt) ? Type.noType : pt()); Type inferred = deferredAttr.attribSpeculative(tree, env, findDiamondResult).type; if (!inferred.isErroneous() && - types.isAssignable(inferred, pt().tag == NONE ? syms.objectType : pt(), Warner.noWarnings)) { + types.isAssignable(inferred, pt().hasTag(NONE) ? syms.objectType : pt(), Warner.noWarnings)) { String key = types.isSameType(clazztype, inferred) ? "diamond.redundant.args" : "diamond.redundant.args.1"; @@ -2074,8 +2076,8 @@ public class Attr extends JCTree.Visitor { private void checkLambdaCandidate(JCNewClass tree, ClassSymbol csym, Type clazztype) { if (allowLambda && identifyLambdaCandidate && - clazztype.tag == CLASS && - pt().tag != NONE && + clazztype.hasTag(CLASS) && + !pt().hasTag(NONE) && types.isFunctionalInterface(clazztype.tsym)) { Symbol descriptor = types.findDescriptorSymbol(clazztype.tsym); int count = 0; @@ -2126,10 +2128,10 @@ public class Attr extends JCTree.Visitor { } else { // we are seeing an untyped aggregate { ... } // this is allowed only if the prototype is an array - if (pt().tag == ARRAY) { + if (pt().hasTag(ARRAY)) { elemtype = types.elemtype(pt()); } else { - if (pt().tag != ERROR) { + if (!pt().hasTag(ERROR)) { log.error(tree.pos(), "illegal.initializer.for.type", pt()); } @@ -2153,8 +2155,8 @@ public class Attr extends JCTree.Visitor { */ @Override public void visitLambda(final JCLambda that) { - if (pt().isErroneous() || (pt().tag == NONE && pt() != Type.recoveryType)) { - if (pt().tag == NONE) { + if (pt().isErroneous() || (pt().hasTag(NONE) && pt() != Type.recoveryType)) { + if (pt().hasTag(NONE)) { //lambda only allowed in assignment or method invocation/cast context log.error(that.pos(), "unexpected.lambda"); } @@ -2329,7 +2331,7 @@ public class Attr extends JCTree.Visitor { //this amounts at checking that, if a lambda body can complete normally, //the descriptor's return type must be void if (tree.getBodyKind() == JCLambda.BodyKind.STATEMENT && tree.canCompleteNormally && - returnType.tag != VOID && returnType != Type.recoveryType) { + !returnType.hasTag(VOID) && returnType != Type.recoveryType) { checkContext.report(tree, diags.fragment("incompatible.ret.type.in.lambda", diags.fragment("missing.ret.val", returnType))); } @@ -2364,8 +2366,8 @@ public class Attr extends JCTree.Visitor { @Override public void visitReference(final JCMemberReference that) { - if (pt().isErroneous() || (pt().tag == NONE && pt() != Type.recoveryType)) { - if (pt().tag == NONE) { + if (pt().isErroneous() || (pt().hasTag(NONE) && pt() != Type.recoveryType)) { + if (pt().hasTag(NONE)) { //method reference only allowed in assignment or method invocation/cast context log.error(that.pos(), "unexpected.mref"); } @@ -2466,7 +2468,7 @@ public class Attr extends JCTree.Visitor { ResultInfo checkInfo = resultInfo.dup(newMethodTemplate( - desc.getReturnType().tag == VOID ? Type.noType : desc.getReturnType(), + desc.getReturnType().hasTag(VOID) ? Type.noType : desc.getReturnType(), lookupHelper.argtypes, typeargtypes)); @@ -2511,11 +2513,11 @@ public class Attr extends JCTree.Visitor { Type incompatibleReturnType = resType; - if (returnType.tag == VOID) { + if (returnType.hasTag(VOID)) { incompatibleReturnType = null; } - if (returnType.tag != VOID && resType.tag != VOID) { + if (!returnType.hasTag(VOID) && !resType.hasTag(VOID)) { if (resType.isErroneous() || new LambdaReturnContext(checkContext).compatible(resType, returnType, Warner.noWarnings)) { incompatibleReturnType = null; @@ -2712,7 +2714,7 @@ public class Attr extends JCTree.Visitor { attribExpr(tree.index, env, syms.intType); if (types.isArray(atype)) owntype = types.elemtype(atype); - else if (atype.tag != ERROR) + else if (!atype.hasTag(ERROR)) log.error(tree.pos(), "array.req.but.found", atype); if ((pkind() & VAR) == 0) owntype = capture(owntype); result = check(tree, owntype, VAR, resultInfo); @@ -2722,7 +2724,7 @@ public class Attr extends JCTree.Visitor { Symbol sym; // Find symbol - if (pt().tag == METHOD || pt().tag == FORALL) { + if (pt().hasTag(METHOD) || pt().hasTag(FORALL)) { // If we are looking for a method, the prototype `pt' will be a // method type with the type of the call's arguments as parameters. env.info.pendingResolutionPhase = null; @@ -2812,9 +2814,9 @@ public class Attr extends JCTree.Visitor { // don't allow T.class T[].class, etc if (skind == TYP) { Type elt = site; - while (elt.tag == ARRAY) + while (elt.hasTag(ARRAY)) elt = ((ArrayType)elt).elemtype; - if (elt.tag == TYPEVAR) { + if (elt.hasTag(TYPEVAR)) { log.error(tree.pos(), "type.var.cant.be.deref"); result = types.createErrorType(tree.type); return; @@ -2840,8 +2842,8 @@ public class Attr extends JCTree.Visitor { boolean varArgs = env.info.lastResolveVarargs(); tree.sym = sym; - if (site.tag == TYPEVAR && !isType(sym) && sym.kind != ERR) { - while (site.tag == TYPEVAR) site = site.getUpperBound(); + if (site.hasTag(TYPEVAR) && !isType(sym) && sym.kind != ERR) { + while (site.hasTag(TYPEVAR)) site = site.getUpperBound(); site = capture(site); } @@ -2930,14 +2932,14 @@ public class Attr extends JCTree.Visitor { ResultInfo resultInfo) { DiagnosticPosition pos = tree.pos(); Name name = tree.name; - switch (site.tag) { + switch (site.getTag()) { case PACKAGE: return rs.accessBase( rs.findIdentInPackage(env, site.tsym, name, resultInfo.pkind), pos, location, site, name, true); case ARRAY: case CLASS: - if (resultInfo.pt.tag == METHOD || resultInfo.pt.tag == FORALL) { + if (resultInfo.pt.hasTag(METHOD) || resultInfo.pt.hasTag(FORALL)) { return rs.resolveQualifiedMethod( pos, env, location, site, name, resultInfo.pt.getParameterTypes(), resultInfo.pt.getTypeArguments()); } else if (name == names._this || name == names._super) { @@ -3030,7 +3032,7 @@ public class Attr extends JCTree.Visitor { Symbol sym, Env env, ResultInfo resultInfo) { - Type pt = resultInfo.pt.tag == FORALL || resultInfo.pt.tag == METHOD ? + Type pt = resultInfo.pt.hasTag(FORALL) || resultInfo.pt.hasTag(METHOD) ? resultInfo.pt.map(deferredAttr.new DeferredTypeMap(AttrMode.SPECULATIVE, sym, env.info.pendingResolutionPhase)) : resultInfo.pt; @@ -3047,7 +3049,8 @@ public class Attr extends JCTree.Visitor { // For types, the computed type equals the symbol's type, // except for two situations: owntype = sym.type; - if (owntype.tag == CLASS) { + if (owntype.hasTag(CLASS)) { + chk.checkForBadAuxiliaryClassAccess(tree.pos(), env, (ClassSymbol)sym); Type ownOuter = owntype.getEnclosingType(); // (a) If the symbol's type is parameterized, erase it @@ -3067,9 +3070,9 @@ public class Attr extends JCTree.Visitor { // // Then the type of the last expression above is // Tree.Visitor. - else if (ownOuter.tag == CLASS && site != ownOuter) { + else if (ownOuter.hasTag(CLASS) && site != ownOuter) { Type normOuter = site; - if (normOuter.tag == CLASS) + if (normOuter.hasTag(CLASS)) normOuter = types.asEnclosingSuper(site, ownOuter.tsym); if (normOuter == null) // perhaps from an import normOuter = types.erasure(ownOuter); @@ -3088,7 +3091,7 @@ public class Attr extends JCTree.Visitor { resultInfo.pkind == VAR && v.owner.kind == TYP && (v.flags() & STATIC) == 0 && - (site.tag == CLASS || site.tag == TYPEVAR)) { + (site.hasTag(CLASS) || site.hasTag(TYPEVAR))) { Type s = types.asOuterSuper(site, v.owner); if (s != null && s.isRaw() && @@ -3267,7 +3270,7 @@ public class Attr extends JCTree.Visitor { // an unchecked warning if its argument types change under erasure. if (allowGenerics && (sym.flags() & STATIC) == 0 && - (site.tag == CLASS || site.tag == TYPEVAR)) { + (site.hasTag(CLASS) || site.hasTag(TYPEVAR))) { Type s = types.asOuterSuper(site, sym.owner); if (s != null && s.isRaw() && !types.isSameTypes(sym.type.getParameterTypes(), @@ -3313,12 +3316,12 @@ public class Attr extends JCTree.Visitor { //where /** Return the type of a literal with given type tag. */ - Type litType(int tag) { - return (tag == TypeTags.CLASS) ? syms.stringType : syms.typeOfTag[tag]; + Type litType(TypeTag tag) { + return (tag == CLASS) ? syms.stringType : syms.typeOfTag[tag.ordinal()]; } public void visitTypeIdent(JCPrimitiveTypeTree tree) { - result = check(tree, syms.typeOfTag[tree.typetag], TYP, resultInfo); + result = check(tree, syms.typeOfTag[tree.typetag.ordinal()], TYP, resultInfo); } public void visitTypeArray(JCArrayTypeTree tree) { @@ -3340,7 +3343,7 @@ public class Attr extends JCTree.Visitor { // Attribute type parameters List actuals = attribTypes(tree.arguments, env); - if (clazztype.tag == CLASS) { + if (clazztype.hasTag(CLASS)) { List formals = clazztype.tsym.type.getTypeArguments(); if (actuals.isEmpty()) //diamond actuals = formals; @@ -3355,7 +3358,7 @@ public class Attr extends JCTree.Visitor { } // Compute the proper generic outer Type clazzOuter = clazztype.getEnclosingType(); - if (clazzOuter.tag == CLASS) { + if (clazzOuter.hasTag(CLASS)) { Type site; JCExpression clazz = TreeInfo.typeIn(tree.clazz); if (clazz.hasTag(IDENT)) { @@ -3363,8 +3366,8 @@ public class Attr extends JCTree.Visitor { } else if (clazz.hasTag(SELECT)) { site = ((JCFieldAccess) clazz).selected.type; } else throw new AssertionError(""+tree); - if (clazzOuter.tag == CLASS && site != clazzOuter) { - if (site.tag == CLASS) + if (clazzOuter.hasTag(CLASS) && site != clazzOuter) { + if (site.hasTag(CLASS)) site = types.asOuterSuper(site, clazzOuter.tsym); if (site == null) site = types.erasure(clazzOuter); @@ -3420,7 +3423,7 @@ public class Attr extends JCTree.Visitor { } } Type t = check(tree, types.lub(multicatchTypes.toList()), TYP, resultInfo); - if (t.tag == CLASS) { + if (t.hasTag(CLASS)) { List alternatives = ((all_multicatchTypes == null) ? multicatchTypes : all_multicatchTypes).toList(); t = new UnionClassType((ClassType) t, alternatives); @@ -3441,7 +3444,7 @@ public class Attr extends JCTree.Visitor { if (b.isErroneous()) { a.bound = b; } - else if (b.tag == TYPEVAR) { + else if (b.hasTag(TYPEVAR)) { // if first bound was a typevar, do not accept further bounds. if (tree.bounds.tail.nonEmpty()) { log.error(tree.bounds.tail.head.pos(), @@ -3457,7 +3460,7 @@ public class Attr extends JCTree.Visitor { Type i = checkBase(bs.head, bound, env, false, true, false); if (i.isErroneous()) a.bound = i; - else if (i.tag == CLASS) + else if (i.hasTag(CLASS)) chk.checkNotRepeated(bound.pos(), types.erasure(i), boundSet); } } @@ -3569,7 +3572,7 @@ public class Attr extends JCTree.Visitor { * @param c The class symbol whose definition will be attributed. */ void attribClass(ClassSymbol c) throws CompletionFailure { - if (c.type.tag == ERROR) return; + if (c.type.hasTag(ERROR)) return; // Check for cycles in the inheritance graph, which can arise from // ill-formed class files. @@ -3578,11 +3581,11 @@ public class Attr extends JCTree.Visitor { Type st = types.supertype(c.type); if ((c.flags_field & Flags.COMPOUND) == 0) { // First, attribute superclass. - if (st.tag == CLASS) + if (st.hasTag(CLASS)) attribClass((ClassSymbol)st.tsym); // Next attribute owner, if it is a class. - if (c.owner.kind == TYP && c.owner.type.tag == CLASS) + if (c.owner.kind == TYP && c.owner.type.hasTag(CLASS)) attribClass((ClassSymbol)c.owner); } @@ -3794,7 +3797,7 @@ public class Attr extends JCTree.Visitor { TreeInfo.diagnosticPositionFor(svuid, tree), "improper.SVUID", c); // check that it is long - else if (svuid.type.tag != TypeTags.LONG) + else if (!svuid.type.hasTag(LONG)) log.warning(LintCategory.SERIAL, TreeInfo.diagnosticPositionFor(svuid, tree), "long.SVUID", c); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java index 87651481548..8e0d6aa7bdc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Check.java @@ -27,6 +27,7 @@ package com.sun.tools.javac.comp; import java.util.*; import java.util.Set; +import javax.tools.JavaFileManager; import com.sun.tools.javac.code.*; import com.sun.tools.javac.jvm.*; @@ -48,8 +49,8 @@ import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Flags.SYNCHRONIZED; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; -import static com.sun.tools.javac.code.TypeTags.WILDCARD; +import static com.sun.tools.javac.code.TypeTag.*; +import static com.sun.tools.javac.code.TypeTag.WILDCARD; import static com.sun.tools.javac.tree.JCTree.Tag.*; @@ -77,6 +78,7 @@ public class Check { private boolean suppressAbortOnBadClassFile; private boolean enableSunApiLintControl; private final TreeInfo treeinfo; + private final JavaFileManager fileManager; // The set of lint options currently in effect. It is initialized // from the context, and then is set/reset as needed by Attr as it @@ -109,6 +111,7 @@ public class Check { Options options = Options.instance(context); lint = Lint.instance(context); treeinfo = TreeInfo.instance(context); + fileManager = context.get(JavaFileManager.class); Source source = Source.instance(context); allowGenerics = source.allowGenerics(); @@ -230,7 +233,6 @@ public class Check { /** Warn about unsafe vararg method decl. * @param pos Position to be used for error reporting. - * @param sym The deprecated symbol. */ void warnUnsafeVararg(DiagnosticPosition pos, String key, Object... args) { if (lint.isEnabled(LintCategory.VARARGS) && allowSimplifiedVarargs) @@ -281,7 +283,7 @@ public class Check { Type typeTagError(DiagnosticPosition pos, Object required, Object found) { // this error used to be raised by the parser, // but has been delayed to this point: - if (found instanceof Type && ((Type)found).tag == VOID) { + if (found instanceof Type && ((Type)found).hasTag(VOID)) { log.error(pos, "illegal.start.of.type"); return syms.errType; } @@ -359,7 +361,7 @@ public class Check { for (Scope.Entry e = s.next.lookup(c.name); e.scope != null && e.sym.owner == c.owner; e = e.next()) { - if (e.sym.kind == TYP && e.sym.type.tag != TYPEVAR && + if (e.sym.kind == TYP && !e.sym.type.hasTag(TYPEVAR) && (e.sym.owner.kind & (VAR | MTH)) != 0 && c.name != names.error) { duplicateError(pos, e.sym); @@ -397,7 +399,7 @@ public class Check { **************************************************************************/ /** Return name of local class. - * This is of the form $ n + * This is of the form {@code $ n } * where * enclClass is the flat name of the enclosing class, * classname is the simple name of the local class @@ -528,14 +530,14 @@ public class Check { } }); } - if (req.tag == ERROR) + if (req.hasTag(ERROR)) return req; - if (req.tag == NONE) + if (req.hasTag(NONE)) return found; if (checkContext.compatible(found, req, checkContext.checkWarner(pos, found, req))) { return found; } else { - if (found.tag <= DOUBLE && req.tag <= DOUBLE) { + if (found.getTag().isSubRangeOf(DOUBLE) && req.getTag().isSubRangeOf(DOUBLE)) { checkContext.report(pos, diags.fragment("possible.loss.of.precision", found, req)); return types.createErrorType(found); } @@ -595,21 +597,20 @@ public class Check { * type variables? */ boolean isTypeVar(Type t) { - return t.tag == TYPEVAR || t.tag == ARRAY && isTypeVar(types.elemtype(t)); + return t.hasTag(TYPEVAR) || t.hasTag(ARRAY) && isTypeVar(types.elemtype(t)); } /** Check that a type is within some bounds. * - * Used in TypeApply to verify that, e.g., X in V is a valid + * Used in TypeApply to verify that, e.g., X in {@code V} is a valid * type argument. - * @param pos Position to be used for error reporting. * @param a The type that should be bounded by bs. - * @param bs The bound. + * @param bound The bound. */ private boolean checkExtends(Type a, Type bound) { if (a.isUnbound()) { return true; - } else if (a.tag != WILDCARD) { + } else if (!a.hasTag(WILDCARD)) { a = types.upperBound(a); return types.isSubtype(a, bound); } else if (a.isExtendsBound()) { @@ -625,7 +626,7 @@ public class Check { * @param t The type to be checked. */ Type checkNonVoid(DiagnosticPosition pos, Type t) { - if (t.tag == VOID) { + if (t.hasTag(VOID)) { log.error(pos, "void.not.allowed.here"); return types.createErrorType(t); } else { @@ -638,10 +639,10 @@ public class Check { * @param t The type to be checked. */ Type checkClassType(DiagnosticPosition pos, Type t) { - if (t.tag != CLASS && t.tag != ERROR) + if (!t.hasTag(CLASS) && !t.hasTag(ERROR)) return typeTagError(pos, diags.fragment("type.req.class"), - (t.tag == TYPEVAR) + (t.hasTag(TYPEVAR)) ? diags.fragment("type.parameter", t) : t); else @@ -652,7 +653,7 @@ public class Check { */ Type checkConstructorRefType(DiagnosticPosition pos, Type t) { t = checkClassType(pos, t); - if (t.tag == CLASS) { + if (t.hasTag(CLASS)) { if ((t.tsym.flags() & (ABSTRACT | INTERFACE)) != 0) { log.error(pos, "abstract.cant.be.instantiated"); t = types.createErrorType(t); @@ -674,7 +675,7 @@ public class Check { if (noBounds && t.isParameterized()) { List args = t.getTypeArguments(); while (args.nonEmpty()) { - if (args.head.tag == WILDCARD) + if (args.head.hasTag(WILDCARD)) return typeTagError(pos, diags.fragment("type.req.exact"), args.head); @@ -689,7 +690,7 @@ public class Check { * @param t The type to be checked. */ Type checkReifiableReferenceType(DiagnosticPosition pos, Type t) { - if (t.tag != CLASS && t.tag != ARRAY && t.tag != ERROR) { + if (!t.hasTag(CLASS) && !t.hasTag(ARRAY) && !t.hasTag(ERROR)) { return typeTagError(pos, diags.fragment("type.req.class.array"), t); @@ -707,18 +708,12 @@ public class Check { * @param t The type to be checked. */ Type checkRefType(DiagnosticPosition pos, Type t) { - switch (t.tag) { - case CLASS: - case ARRAY: - case TYPEVAR: - case WILDCARD: - case ERROR: + if (t.isReference()) return t; - default: + else return typeTagError(pos, diags.fragment("type.req.ref"), t); - } } /** Check that each type is a reference type, i.e. a class, interface or array type @@ -740,19 +735,12 @@ public class Check { * @param t The type to be checked. */ Type checkNullOrRefType(DiagnosticPosition pos, Type t) { - switch (t.tag) { - case CLASS: - case ARRAY: - case TYPEVAR: - case WILDCARD: - case BOT: - case ERROR: + if (t.isNullOrReference()) return t; - default: + else return typeTagError(pos, diags.fragment("type.req.ref"), t); - } } /** Check that flag set does not contain elements of two conflicting sets. s @@ -1056,7 +1044,7 @@ public class Check { bounds = bounds_buf.toList(); for (Type arg : types.capture(type).getTypeArguments()) { - if (arg.tag == TYPEVAR && + if (arg.hasTag(TYPEVAR) && arg.getUpperBound().isErroneous() && !bounds.head.isErroneous() && !isTypeArgErroneous(args.head)) { @@ -1123,8 +1111,14 @@ public class Check { mask = PRIVATE; } else mask = ConstructorFlags; - } else if ((sym.owner.flags_field & INTERFACE) != 0) - mask = implicit = InterfaceMethodFlags; + } else if ((sym.owner.flags_field & INTERFACE) != 0) { + if ((flags & DEFAULT) != 0) { + mask = InterfaceDefaultMethodMask; + implicit = PUBLIC; + } else { + mask = implicit = InterfaceMethodFlags; + } + } else { mask = MethodFlags; } @@ -1171,7 +1165,7 @@ public class Check { default: throw new AssertionError(); } - long illegal = flags & StandardFlags & ~mask; + long illegal = flags & ExtendedStandardFlags & ~mask; if (illegal != 0) { if ((illegal & INTERFACE) != 0) { log.error(pos, "intf.not.allowed.here"); @@ -1187,7 +1181,7 @@ public class Check { // in the presence of inner classes. Should it be deleted here? checkDisjoint(pos, flags, ABSTRACT, - PRIVATE | STATIC)) + PRIVATE | STATIC | DEFAULT)) && checkDisjoint(pos, flags, ABSTRACT | INTERFACE, @@ -1211,7 +1205,7 @@ public class Check { STRICTFP))) { // skip } - return flags & (mask | ~StandardFlags) | implicit; + return flags & (mask | ~ExtendedStandardFlags) | implicit; } @@ -1262,8 +1256,10 @@ public class Check { * their bounds. This must be done in a second phase after type attributon * since a class might have a subclass as type parameter bound. E.g: * + *

    {@code
          *  class B { ... }
          *  class C extends B { ... }
    +     *  }
    * * and we can't make sure that the bound is already attributed because * of possible cycles. @@ -1303,7 +1299,7 @@ public class Check { @Override public void visitTypeApply(JCTypeApply tree) { - if (tree.type.tag == CLASS) { + if (tree.type.hasTag(CLASS)) { List args = tree.arguments; List forms = tree.type.tsym.type.getTypeArguments(); @@ -1354,7 +1350,7 @@ public class Check { @Override public void visitSelect(JCFieldAccess tree) { - if (tree.type.tag == CLASS) { + if (tree.type.hasTag(CLASS)) { visitSelectInternal(tree); // Check that this type is either fully parameterized, or @@ -1403,7 +1399,7 @@ public class Check { void checkRaw(JCTree tree, Env env) { if (lint.isEnabled(LintCategory.RAW) && - tree.type.tag == CLASS && + tree.type.hasTag(CLASS) && !TreeInfo.isDiamond(tree) && !withinAnonConstr(env) && tree.type.isRaw()) { @@ -1505,9 +1501,9 @@ public class Check { */ boolean isUnchecked(Type exc) { return - (exc.tag == TYPEVAR) ? isUnchecked(types.supertype(exc)) : - (exc.tag == CLASS) ? isUnchecked((ClassSymbol)exc.tsym) : - exc.tag == BOT; + (exc.hasTag(TYPEVAR)) ? isUnchecked(types.supertype(exc)) : + (exc.hasTag(CLASS)) ? isUnchecked((ClassSymbol)exc.tsym) : + exc.hasTag(BOT); } /** Same, but handling completion failures. @@ -1753,7 +1749,7 @@ public class Check { // case, we will have dealt with when examining the supertype classes ClassSymbol mc = m.enclClass(); Type st = types.supertype(origin.type); - if (st.tag != CLASS) + if (!st.hasTag(CLASS)) return true; MethodSymbol stimpl = m.implementation((ClassSymbol)st.tsym, types, false); @@ -1776,7 +1772,7 @@ public class Check { */ public void checkCompatibleConcretes(DiagnosticPosition pos, Type site) { Type sup = types.supertype(site); - if (sup.tag != CLASS) return; + if (!sup.hasTag(CLASS)) return; for (Type t1 = sup; t1.tsym.type.isParameterized(); @@ -1797,7 +1793,7 @@ public class Check { if (st1 == s1.type) continue; for (Type t2 = sup; - t2.tag == CLASS; + t2.hasTag(CLASS); t2 = types.supertype(t2)) { for (Scope.Entry e2 = t2.tsym.members().lookup(s1.name); e2.scope != null; @@ -1870,7 +1866,7 @@ public class Check { /** Compute all the supertypes of t, indexed by type symbol. */ private void closure(Type t, Map typeMap) { - if (t.tag != CLASS) return; + if (!t.hasTag(CLASS)) return; if (typeMap.put(t.tsym, t) == null) { closure(types.supertype(t), typeMap); for (Type i : types.interfaces(t)) @@ -1880,7 +1876,7 @@ public class Check { /** Compute all the supertypes of t, indexed by type symbol (except thise in typesSkip). */ private void closure(Type t, Map typesSkip, Map typeMap) { - if (t.tag != CLASS) return; + if (!t.hasTag(CLASS)) return; if (typesSkip.get(t.tsym) != null) return; if (typeMap.put(t.tsym, t) == null) { closure(types.supertype(t), typesSkip, typeMap); @@ -1910,7 +1906,8 @@ public class Check { Type rt2 = types.subst(st2.getReturnType(), tvars2, tvars1); boolean compat = types.isSameType(rt1, rt2) || - rt1.tag >= CLASS && rt2.tag >= CLASS && + !rt1.isPrimitiveOrVoid() && + !rt2.isPrimitiveOrVoid() && (types.covariantReturnType(rt1, rt2, Warner.noWarnings) || types.covariantReturnType(rt2, rt1, Warner.noWarnings)) || checkCommonOverriderIn(s1,s2,site); @@ -1955,7 +1952,8 @@ public class Check { Type rt13 = types.subst(st3.getReturnType(), tvars3, tvars1); Type rt23 = types.subst(st3.getReturnType(), tvars3, tvars2); boolean compat = - rt13.tag >= CLASS && rt23.tag >= CLASS && + !rt13.isPrimitiveOrVoid() && + !rt23.isPrimitiveOrVoid() && (types.covariantReturnType(rt13, rt1, Warner.noWarnings) && types.covariantReturnType(rt23, rt2, Warner.noWarnings)); if (compat) @@ -1978,7 +1976,7 @@ public class Check { log.error(tree.pos(), "enum.no.finalize"); return; } - for (Type t = origin.type; t.tag == CLASS; + for (Type t = origin.type; t.hasTag(CLASS); t = types.supertype(t)) { if (t != origin.type) { checkOverride(tree, t, origin, m); @@ -2058,7 +2056,7 @@ public class Check { } if (undef == null) { Type st = types.supertype(c.type); - if (st.tag == CLASS) + if (st.hasTag(CLASS)) undef = firstUndef(impl, (ClassSymbol)st.tsym); } for (List l = types.interfaces(c.type); @@ -2149,7 +2147,7 @@ public class Check { } else if (!c.type.isErroneous()) { try { seenClasses = seenClasses.prepend(c); - if (c.type.tag == CLASS) { + if (c.type.hasTag(CLASS)) { if (supertypes.nonEmpty()) { scan(supertypes); } @@ -2194,13 +2192,13 @@ public class Check { private void checkNonCyclic1(DiagnosticPosition pos, Type t, List seen) { final TypeVar tv; - if (t.tag == TYPEVAR && (t.tsym.flags() & UNATTRIBUTED) != 0) + if (t.hasTag(TYPEVAR) && (t.tsym.flags() & UNATTRIBUTED) != 0) return; if (seen.contains(t)) { tv = (TypeVar)t; tv.bound = types.createErrorType(t); log.error(pos, "cyclic.inheritance", t); - } else if (t.tag == TYPEVAR) { + } else if (t.hasTag(TYPEVAR)) { tv = (TypeVar)t; seen = seen.prepend(tv); for (Type b : types.getBounds(tv)) @@ -2226,14 +2224,14 @@ public class Check { } else if (!c.type.isErroneous()) { try { c.flags_field |= LOCKED; - if (c.type.tag == CLASS) { + if (c.type.hasTag(CLASS)) { ClassType clazz = (ClassType)c.type; if (clazz.interfaces_field != null) for (List l=clazz.interfaces_field; l.nonEmpty(); l=l.tail) complete &= checkNonCyclicInternal(pos, l.head); if (clazz.supertype_field != null) { Type st = clazz.supertype_field; - if (st != null && st.tag == CLASS) + if (st != null && st.hasTag(CLASS)) complete &= checkNonCyclicInternal(pos, st); } if (c.owner.kind == TYP) @@ -2255,7 +2253,7 @@ public class Check { for (List l=types.interfaces(c.type); l.nonEmpty(); l=l.tail) l.head = types.createErrorType((ClassSymbol)l.head.tsym, Type.noType); Type st = types.supertype(c.type); - if (st.tag == CLASS) + if (st.hasTag(CLASS)) ((ClassType)c.type).supertype_field = types.createErrorType((ClassSymbol)st.tsym, Type.noType); c.type = types.createErrorType(c, c.type); c.flags_field |= ACYCLIC; @@ -2307,7 +2305,7 @@ public class Check { void checkCompatibleSupertypes(DiagnosticPosition pos, Type c) { List supertypes = types.interfaces(c); Type supertype = types.supertype(c); - if (supertype.tag == CLASS && + if (supertype.hasTag(CLASS) && (supertype.tsym.flags() & ABSTRACT) != 0) supertypes = supertypes.prepend(supertype); for (List l = supertypes; l.nonEmpty(); l = l.tail) { @@ -2536,7 +2534,7 @@ public class Check { * @jls 9.6 Annotation Types */ void validateAnnotationMethod(DiagnosticPosition pos, MethodSymbol m) { - for (Type sup = syms.annotationType; sup.tag == CLASS; sup = types.supertype(sup)) { + for (Type sup = syms.annotationType; sup.hasTag(CLASS); sup = types.supertype(sup)) { Scope s = sup.tsym.members(); for (Scope.Entry e = s.lookup(m.name); e.scope != null; e = e.next()) { if (e.sym.kind == MTH && @@ -2574,7 +2572,7 @@ public class Check { * 'pos'. * * @param s The (annotation)type declaration annotated with a @ContainedBy - * @param containerAnno the @ContainedBy on 's' + * @param containedBy the @ContainedBy on 's' * @param pos where to report errors */ public void validateContainedBy(TypeSymbol s, Attribute.Compound containedBy, DiagnosticPosition pos) { @@ -2849,7 +2847,7 @@ public class Check { { if (s.kind == TYP || s.kind == VAR || (s.kind == MTH && !s.isConstructor() && - s.type.getReturnType().tag != VOID)) + !s.type.getReturnType().hasTag(VOID))) return true; } else @@ -3010,12 +3008,12 @@ public class Check { } void checkAnnotationResType(DiagnosticPosition pos, Type type) { - switch (type.tag) { - case TypeTags.CLASS: + switch (type.getTag()) { + case CLASS: if ((type.tsym.flags() & ANNOTATION) != 0) checkNonCyclicElementsInternal(pos, type.tsym); break; - case TypeTags.ARRAY: + case ARRAY: checkAnnotationResType(pos, types.elemtype(type)); break; default: @@ -3108,7 +3106,7 @@ public class Check { void checkDivZero(DiagnosticPosition pos, Symbol operator, Type operand) { if (operand.constValue() != null && lint.isEnabled(LintCategory.DIVZERO) - && operand.tag <= LONG + && (operand.getTag().isSubRangeOf(LONG)) && ((Number) (operand.constValue())).longValue() == 0) { int opc = ((OperatorSymbol)operator).opcode; if (opc == ByteCodes.idiv || opc == ByteCodes.imod @@ -3181,7 +3179,6 @@ public class Check { * @param pos Position for error reporting. * @param sym The symbol. * @param s The scope - * @param staticImport Whether or not this was a static import */ boolean checkUniqueStaticImport(DiagnosticPosition pos, Symbol sym, Scope s) { return checkUniqueImport(pos, sym, s, true); @@ -3236,6 +3233,19 @@ public class Check { return true; } + /** Check that an auxiliary class is not accessed from any other file than its own. + */ + void checkForBadAuxiliaryClassAccess(DiagnosticPosition pos, Env env, ClassSymbol c) { + if (lint.isEnabled(Lint.LintCategory.AUXILIARYCLASS) && + (c.flags() & AUXILIARY) != 0 && + rs.isAccessible(env, c) && + !fileManager.isSameFile(c.sourcefile, env.toplevel.sourcefile)) + { + log.warning(pos, "auxiliary.class.accessed.from.outside.of.its.source.file", + c, c.sourcefile); + } + } + private class ConversionWarner extends Warner { final String uncheckedKey; final Type found; diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java b/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java index cd017d4e5e6..a0f9ec1b04b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/ConstFold.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,8 @@ import com.sun.tools.javac.util.*; import com.sun.tools.javac.code.Type.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; + import static com.sun.tools.javac.jvm.ByteCodes.*; /** Helper class for constant folding, used by the attribution phase. @@ -176,19 +177,19 @@ strictfp class ConstFold { case imod: return syms.intType.constType(intValue(l) % intValue(r)); case iand: - return (left.tag == BOOLEAN + return (left.hasTag(BOOLEAN) ? syms.booleanType : syms.intType) .constType(intValue(l) & intValue(r)); case bool_and: return syms.booleanType.constType(b2i((intValue(l) & intValue(r)) != 0)); case ior: - return (left.tag == BOOLEAN + return (left.hasTag(BOOLEAN) ? syms.booleanType : syms.intType) .constType(intValue(l) | intValue(r)); case bool_or: return syms.booleanType.constType(b2i((intValue(l) | intValue(r)) != 0)); case ixor: - return (left.tag == BOOLEAN + return (left.hasTag(BOOLEAN) ? syms.booleanType : syms.intType) .constType(intValue(l) ^ intValue(r)); case ishl: case ishll: @@ -326,7 +327,7 @@ strictfp class ConstFold { /** Coerce constant type to target type. * @param etype The source type of the coercion, - * which is assumed to be a constant type compatble with + * which is assumed to be a constant type compatible with * ttype. * @param ttype The target type of the coercion. */ @@ -334,9 +335,9 @@ strictfp class ConstFold { // WAS if (etype.baseType() == ttype.baseType()) if (etype.tsym.type == ttype.tsym.type) return etype; - if (etype.tag <= DOUBLE) { + if (etype.isNumeric()) { Object n = etype.constValue(); - switch (ttype.tag) { + switch (ttype.getTag()) { case BYTE: return syms.byteType.constType(0 + (byte)intValue(n)); case CHAR: diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java index 7405ca109a3..d9ef24ffedc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/DeferredAttr.java @@ -44,9 +44,9 @@ import java.util.Queue; import java.util.Set; import java.util.WeakHashMap; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.DEFERRED; +import static com.sun.tools.javac.code.TypeTag.NONE; import static com.sun.tools.javac.tree.JCTree.Tag.*; -import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; /** * This is an helper class that is used to perform deferred type-analysis. @@ -204,7 +204,7 @@ public class DeferredAttr extends JCTree.Visitor { case SPECULATIVE: Assert.check(mode == null || (mode == AttrMode.SPECULATIVE && - speculativeType(deferredAttrContext.msym, deferredAttrContext.phase).tag == NONE)); + speculativeType(deferredAttrContext.msym, deferredAttrContext.phase).hasTag(NONE))); JCTree speculativeTree = attribSpeculative(tree, env, resultInfo); speculativeCache.put(deferredAttrContext.msym, speculativeTree, deferredAttrContext.phase); return speculativeTree.type; @@ -443,7 +443,7 @@ public class DeferredAttr extends JCTree.Visitor { @Override public Type apply(Type t) { - if (t.tag != DEFERRED) { + if (!t.hasTag(DEFERRED)) { return t.map(this); } else { DeferredType dt = (DeferredType)t; @@ -480,7 +480,7 @@ public class DeferredAttr extends JCTree.Visitor { @Override protected Type typeOf(DeferredType dt) { Type owntype = super.typeOf(dt); - return owntype.tag == NONE ? + return owntype.hasTag(NONE) ? recover(dt) : owntype; } @@ -517,7 +517,7 @@ public class DeferredAttr extends JCTree.Visitor { */ @SuppressWarnings("fallthrough") List stuckVars(JCTree tree, ResultInfo resultInfo) { - if (resultInfo.pt.tag == NONE || resultInfo.pt.isErroneous()) { + if (resultInfo.pt.hasTag(NONE) || resultInfo.pt.isErroneous()) { return List.nil(); } else { StuckChecker sc = new StuckChecker(resultInfo); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java index 00534ce9c46..ccf7a82badd 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Enter.java @@ -49,7 +49,7 @@ import static com.sun.tools.javac.code.Kinds.*; * the symbol table. The pass consists of two phases, organized as * follows: * - *

    In the first phase, all class symbols are intered into their + *

    In the first phase, all class symbols are entered into their * enclosing scope, descending recursively down the tree for classes * which are members of other classes. The class symbols are given a * MemberEnter object as completer. diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java index 55e2e7144f1..3ea31c9b9e8 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Flow.java @@ -40,7 +40,8 @@ import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; +import static com.sun.tools.javac.code.TypeTag.VOID; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** This pass implements dataflow analysis for Java programs though @@ -148,7 +149,7 @@ import static com.sun.tools.javac.tree.JCTree.Tag.*; * exception to this [no pun intended] is that checked exceptions that * are known to be caught or declared to be caught in the enclosing * method are not recorded in the queue, but instead are recorded in a - * global variable "Set thrown" that records the type of all + * global variable "{@code Set thrown}" that records the type of all * exceptions that can be thrown. * *

    Other minor issues the treatment of members of other classes @@ -473,7 +474,7 @@ public class Flow { alive = true; scanStat(tree.body); - if (alive && tree.sym.type.getReturnType().tag != VOID) + if (alive && !tree.sym.type.getReturnType().hasTag(VOID)) log.error(TreeInfo.diagEndPos(tree.body), "missing.ret.stmt"); List exits = pendingExits.toList(); @@ -1976,8 +1977,8 @@ public class Flow { Bits uninitsBeforeElse = uninitsWhenFalse; inits = initsWhenTrue; uninits = uninitsWhenTrue; - if (tree.truepart.type.tag == BOOLEAN && - tree.falsepart.type.tag == BOOLEAN) { + if (tree.truepart.type.hasTag(BOOLEAN) && + tree.falsepart.type.hasTag(BOOLEAN)) { // if b and c are boolean valued, then // v is (un)assigned after a?b:c when true iff // v is (un)assigned after b when true and diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java index 548bb9d8479..31e7ade9185 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Infer.java @@ -41,9 +41,8 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import java.util.HashMap; import java.util.Map; -import java.util.Set; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; /** Helper class for type parameter inference, used by the attribution phase. * @@ -146,7 +145,7 @@ public class Infer { private Filter boundFilter = new Filter() { @Override public boolean accepts(Type t) { - return !t.isErroneous() && t.tag != BOT; + return !t.isErroneous() && !t.hasTag(BOT); } }; @@ -164,7 +163,7 @@ public class Infer { else { that.inst = types.lub(lobounds); } - if (that.inst == null || that.inst.tag == ERROR) + if (that.inst == null || that.inst.hasTag(ERROR)) throw inferenceException .setMessage("no.unique.minimal.instance.exists", that.qtype, lobounds); @@ -190,13 +189,13 @@ public class Infer { Attr.ResultInfo resultInfo, Warner warn) throws InferenceException { Type to = resultInfo.pt; - if (to.tag == NONE || resultInfo.checkContext.inferenceContext().free(resultInfo.pt)) { - to = mtype.getReturnType().tag <= VOID ? + if (to.hasTag(NONE) || resultInfo.checkContext.inferenceContext().free(resultInfo.pt)) { + to = mtype.getReturnType().isPrimitiveOrVoid() ? mtype.getReturnType() : syms.objectType; } Type qtype1 = inferenceContext.asFree(mtype.getReturnType(), types); if (!types.isSubtype(qtype1, - qtype1.tag == UNDETVAR ? types.boxedTypeOrType(to) : to)) { + qtype1.hasTag(UNDETVAR) ? types.boxedTypeOrType(to) : to)) { throw inferenceException .setMessage("infer.no.conforming.instance.exists", inferenceContext.restvars(), mtype.getReturnType(), to); @@ -516,7 +515,7 @@ public class Infer { //for remaining uninferred type-vars in the functional interface type, //simply replace the wildcards with its bound for (Type t : formalInterface.getTypeArguments()) { - if (actualTypeargs.head.tag == WILDCARD) { + if (actualTypeargs.head.hasTag(WILDCARD)) { WildcardType wt = (WildcardType)actualTypeargs.head; typeargs.append(wt.type); } else { @@ -593,7 +592,7 @@ public class Infer { public Type apply(Type t) { t = types.erasure(super.apply(t)); - if (t.tag == BOT) + if (t.hasTag(BOT)) // nulls type as the marker type Null (which has no instances) // infer as java.lang.Void for now t = types.boxedClass(syms.voidType).type; @@ -615,7 +614,7 @@ public class Infer { } public Type apply(Type t) { - if (t.tag == TYPEVAR) return new UndetVar((TypeVar)t, types, includeBounds); + if (t.hasTag(TYPEVAR)) return new UndetVar((TypeVar)t, types, includeBounds); else return t.map(this); } }; diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java b/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java new file mode 100644 index 00000000000..faf421af560 --- /dev/null +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/LambdaToMethod.java @@ -0,0 +1,1398 @@ +/* + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package com.sun.tools.javac.comp; + +import com.sun.tools.javac.tree.*; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.JCTree.*; +import com.sun.tools.javac.tree.JCTree.JCMemberReference.ReferenceKind; +import com.sun.tools.javac.tree.TreeMaker; +import com.sun.tools.javac.tree.TreeScanner; +import com.sun.tools.javac.tree.TreeTranslator; +import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.code.Kinds; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.ClassSymbol; +import com.sun.tools.javac.code.Symbol.DynamicMethodSymbol; +import com.sun.tools.javac.code.Symbol.MethodSymbol; +import com.sun.tools.javac.code.Symbol.VarSymbol; +import com.sun.tools.javac.code.Symtab; +import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.code.Type.ClassType; +import com.sun.tools.javac.code.Type.MethodType; +import com.sun.tools.javac.code.Types; +import com.sun.tools.javac.comp.LambdaToMethod.LambdaAnalyzer.*; +import com.sun.tools.javac.jvm.*; +import com.sun.tools.javac.util.*; +import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; +import com.sun.source.tree.MemberReferenceTree.ReferenceMode; + +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; + +import static com.sun.tools.javac.comp.LambdaToMethod.LambdaSymbolKind.*; +import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.Kinds.*; +import static com.sun.tools.javac.code.TypeTag.BOT; +import static com.sun.tools.javac.code.TypeTag.NONE; +import static com.sun.tools.javac.code.TypeTag.VOID; +import static com.sun.tools.javac.tree.JCTree.Tag.*; + +/** + * This pass desugars lambda expressions into static methods + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class LambdaToMethod extends TreeTranslator { + + private Names names; + private Symtab syms; + private Resolve rs; + private TreeMaker make; + private Types types; + private TransTypes transTypes; + private Env attrEnv; + + /** the analyzer scanner */ + private LambdaAnalyzer analyzer; + + /** map from lambda trees to translation contexts */ + private Map> contextMap; + + /** current translation context (visitor argument) */ + private TranslationContext context; + + /** list of translated methods + **/ + private ListBuffer translatedMethodList; + + // + private static final Context.Key unlambdaKey = + new Context.Key(); + + public static LambdaToMethod instance(Context context) { + LambdaToMethod instance = context.get(unlambdaKey); + if (instance == null) { + instance = new LambdaToMethod(context); + } + return instance; + } + + private LambdaToMethod(Context context) { + names = Names.instance(context); + syms = Symtab.instance(context); + rs = Resolve.instance(context); + make = TreeMaker.instance(context); + types = Types.instance(context); + transTypes = TransTypes.instance(context); + this.analyzer = makeAnalyzer(); + } + + private LambdaAnalyzer makeAnalyzer() { + return new LambdaAnalyzer(); + } + // + + // + @Override + public T translate(T tree) { + TranslationContext newContext = contextMap.get(tree); + return translate(tree, newContext != null ? newContext : context); + } + + public T translate(T tree, TranslationContext newContext) { + TranslationContext prevContext = context; + try { + context = newContext; + return super.translate(tree); + } + finally { + context = prevContext; + } + } + + public List translate(List trees, TranslationContext newContext) { + ListBuffer buf = ListBuffer.lb(); + for (T tree : trees) { + buf.append(translate(tree, newContext)); + } + return buf.toList(); + } + + public JCTree translateTopLevelClass(Env env, JCTree cdef, TreeMaker make) { + this.make = make; + this.attrEnv = env; + this.context = null; + this.contextMap = new HashMap>(); + return translate(cdef); + } + // + + // + /** + * Visit a class. + * Maintain the translatedMethodList across nested classes. + * Append the translatedMethodList to the class after it is translated. + * @param tree + */ + @Override + public void visitClassDef(JCClassDecl tree) { + if (tree.sym.owner.kind == PCK) { + //analyze class + analyzer.analyzeClass(tree); + } + ListBuffer prevTranslated = translatedMethodList; + try { + translatedMethodList = ListBuffer.lb(); + super.visitClassDef(tree); + //add all translated instance methods here + tree.defs = tree.defs.appendList(translatedMethodList.toList()); + for (JCTree lambda : translatedMethodList) { + tree.sym.members().enter(((JCMethodDecl)lambda).sym); + } + result = tree; + } finally { + translatedMethodList = prevTranslated; + } + } + + /** + * Translate a lambda into a method to be inserted into the class. + * Then replace the lambda site with an invokedynamic call of to lambda + * meta-factory, which will use the lambda method. + * @param tree + */ + @Override + public void visitLambda(JCLambda tree) { + LambdaTranslationContext localContext = (LambdaTranslationContext)context; + MethodSymbol sym = (MethodSymbol)localContext.translatedSym; + MethodType lambdaType = (MethodType) sym.type; + + //create the method declaration hoisting the lambda body + JCMethodDecl lambdaDecl = make.MethodDef(make.Modifiers(sym.flags_field), + sym.name, + make.QualIdent(lambdaType.getReturnType().tsym), + List.nil(), + localContext.syntheticParams, + lambdaType.getThrownTypes() == null ? + List.nil() : + make.Types(lambdaType.getThrownTypes()), + null, + null); + lambdaDecl.sym = sym; + lambdaDecl.type = lambdaType; + + //translate lambda body + //As the lambda body is translated, all references to lambda locals, + //captured variables, enclosing members are adjusted accordingly + //to refer to the static method parameters (rather than i.e. acessing to + //captured members directly). + lambdaDecl.body = translate(makeLambdaBody(tree, lambdaDecl)); + + //Add the method to the list of methods to be added to this class. + translatedMethodList = translatedMethodList.prepend(lambdaDecl); + + //now that we have generated a method for the lambda expression, + //we can translate the lambda into a method reference pointing to the newly + //created method. + // + //Note that we need to adjust the method handle so that it will match the + //signature of the SAM descriptor - this means that the method reference + //should be added the following synthetic arguments: + // + // * the "this" argument if it is an instance method + // * enclosing locals captured by the lambda expression + + ListBuffer syntheticInits = ListBuffer.lb(); + + if (!sym.isStatic()) { + syntheticInits.append(makeThis( + sym.owner.asType(), + localContext.owner.enclClass())); + } + + //add captured locals + for (Symbol fv : localContext.getSymbolMap(CAPTURED_VAR).keySet()) { + if (fv != localContext.self) { + JCTree captured_local = make.Ident(fv).setType(fv.type); + syntheticInits.append((JCExpression) captured_local); + } + } + + //then, determine the arguments to the indy call + List indy_args = translate(syntheticInits.toList(), localContext.prev); + + //build a sam instance using an indy call to the meta-factory + int refKind = referenceKind(sym); + + //convert to an invokedynamic call + result = makeMetaFactoryIndyCall(tree, tree.targetType, refKind, sym, indy_args); + } + + private JCIdent makeThis(Type type, Symbol owner) { + VarSymbol _this = new VarSymbol(PARAMETER | FINAL | SYNTHETIC, + names._this, + type, + owner); + return make.Ident(_this); + } + + /** + * Translate a method reference into an invokedynamic call to the + * meta-factory. + * @param tree + */ + @Override + public void visitReference(JCMemberReference tree) { + ReferenceTranslationContext localContext = (ReferenceTranslationContext)context; + + //first determine the method symbol to be used to generate the sam instance + //this is either the method reference symbol, or the bridged reference symbol + Symbol refSym = localContext.needsBridge() ? + localContext.bridgeSym : + tree.sym; + + //build the bridge method, if needed + if (localContext.needsBridge()) { + bridgeMemberReference(tree, localContext); + } + + //the qualifying expression is treated as a special captured arg + JCExpression init; + switch(tree.kind) { + + case IMPLICIT_INNER: /** Inner # new */ + case SUPER: /** super # instMethod */ + init = makeThis( + localContext.owner.owner.asType(), + localContext.owner); + break; + + case BOUND: /** Expr # instMethod */ + init = tree.getQualifierExpression(); + break; + + case STATIC_EVAL: /** Expr # staticMethod */ + case UNBOUND: /** Type # instMethod */ + case STATIC: /** Type # staticMethod */ + case TOPLEVEL: /** Top level # new */ + init = null; + break; + + default: + throw new InternalError("Should not have an invalid kind"); + } + + List indy_args = init==null? List.nil() : translate(List.of(init), localContext.prev); + + + //build a sam instance using an indy call to the meta-factory + result = makeMetaFactoryIndyCall(tree, tree.targetType, localContext.referenceKind(), refSym, indy_args); + + //if we had a static reference with non-static qualifier, add a let + //expression to force the evaluation of the qualifier expr + if (tree.hasKind(ReferenceKind.STATIC_EVAL)) { + VarSymbol rec = new VarSymbol(0, names.fromString("rec$"), tree.getQualifierExpression().type, localContext.owner); + JCVariableDecl recDef = make.VarDef(rec, tree.getQualifierExpression()); + result = make.LetExpr(recDef, result).setType(tree.type); + } + } + + /** + * Translate identifiers within a lambda to the mapped identifier + * @param tree + */ + @Override + public void visitIdent(JCIdent tree) { + if (context == null || !analyzer.lambdaIdentSymbolFilter(tree.sym)) { + super.visitIdent(tree); + } else { + LambdaTranslationContext lambdaContext = (LambdaTranslationContext) context; + if (lambdaContext.getSymbolMap(PARAM).containsKey(tree.sym)) { + Symbol translatedSym = lambdaContext.getSymbolMap(PARAM).get(tree.sym); + result = make.Ident(translatedSym).setType(tree.type); + } else if (lambdaContext.getSymbolMap(LOCAL_VAR).containsKey(tree.sym)) { + Symbol translatedSym = lambdaContext.getSymbolMap(LOCAL_VAR).get(tree.sym); + result = make.Ident(translatedSym).setType(tree.type); + } else if (lambdaContext.getSymbolMap(CAPTURED_VAR).containsKey(tree.sym)) { + Symbol translatedSym = lambdaContext.getSymbolMap(CAPTURED_VAR).get(tree.sym); + result = make.Ident(translatedSym).setType(tree.type); + } else { + if (tree.sym.owner.kind == Kinds.TYP) { + for (Map.Entry encl_entry : lambdaContext.getSymbolMap(CAPTURED_THIS).entrySet()) { + if (tree.sym.isMemberOf((ClassSymbol) encl_entry.getKey(), types)) { + JCExpression enclRef = make.Ident(encl_entry.getValue()); + result = tree.sym.name == names._this + ? enclRef.setType(tree.type) + : make.Select(enclRef, tree.sym).setType(tree.type); + result = tree; + return; + } + } + } + //access to untranslated symbols (i.e. compile-time constants, + //members defined inside the lambda body, etc.) ) + super.visitIdent(tree); + } + } + } + + @Override + public void visitVarDef(JCVariableDecl tree) { + LambdaTranslationContext lambdaContext = (LambdaTranslationContext)context; + if (context != null && lambdaContext.getSymbolMap(LOCAL_VAR).containsKey(tree.sym)) { + JCExpression init = translate(tree.init); + result = make.VarDef((VarSymbol)lambdaContext.getSymbolMap(LOCAL_VAR).get(tree.sym), init); + } else { + super.visitVarDef(tree); + } + } + + // + + // + + private JCBlock makeLambdaBody(JCLambda tree, JCMethodDecl lambdaMethodDecl) { + return tree.getBodyKind() == JCLambda.BodyKind.EXPRESSION ? + makeLambdaExpressionBody((JCExpression)tree.body, lambdaMethodDecl) : + makeLambdaStatementBody((JCBlock)tree.body, lambdaMethodDecl, tree.canCompleteNormally); + } + + private JCBlock makeLambdaExpressionBody(JCExpression expr, JCMethodDecl lambdaMethodDecl) { + Type restype = lambdaMethodDecl.type.getReturnType(); + boolean isLambda_void = expr.type.hasTag(VOID); + boolean isTarget_void = restype.hasTag(VOID); + boolean isTarget_Void = types.isSameType(restype, types.boxedClass(syms.voidType).type); + if (isTarget_void) { + //target is void: + // BODY; + JCStatement stat = make.Exec(expr); + return make.Block(0, List.of(stat)); + } else if (isLambda_void && isTarget_Void) { + //void to Void conversion: + // BODY; return null; + ListBuffer stats = ListBuffer.lb(); + stats.append(make.Exec(expr)); + stats.append(make.Return(make.Literal(BOT, null).setType(syms.botType))); + return make.Block(0, stats.toList()); + } else { + //non-void to non-void conversion: + // return (TYPE)BODY; + JCExpression retExpr = transTypes.coerce(attrEnv, expr, restype); + return make.Block(0, List.of(make.Return(retExpr))); + } + } + + private JCBlock makeLambdaStatementBody(JCBlock block, final JCMethodDecl lambdaMethodDecl, boolean completeNormally) { + final Type restype = lambdaMethodDecl.type.getReturnType(); + final boolean isTarget_void = restype.hasTag(VOID); + boolean isTarget_Void = types.isSameType(restype, types.boxedClass(syms.voidType).type); + + class LambdaBodyTranslator extends TreeTranslator { + + @Override + public void visitClassDef(JCClassDecl tree) { + //do NOT recurse on any inner classes + result = tree; + } + + @Override + public void visitLambda(JCLambda tree) { + //do NOT recurse on any nested lambdas + result = tree; + } + + @Override + public void visitReturn(JCReturn tree) { + boolean isLambda_void = tree.expr == null; + if (isTarget_void && !isLambda_void) { + //Void to void conversion: + // { TYPE $loc = RET-EXPR; return; } + VarSymbol loc = makeSyntheticVar(0, names.fromString("$loc"), tree.expr.type, lambdaMethodDecl.sym); + JCVariableDecl varDef = make.VarDef(loc, tree.expr); + result = make.Block(0, List.of(varDef, make.Return(null))); + } else if (!isTarget_void || !isLambda_void) { + //non-void to non-void conversion: + // return (TYPE)RET-EXPR; + tree.expr = transTypes.coerce(attrEnv, tree.expr, restype); + result = tree; + } else { + result = tree; + } + + } + } + + JCBlock trans_block = new LambdaBodyTranslator().translate(block); + if (completeNormally && isTarget_Void) { + //there's no return statement and the lambda (possibly inferred) + //return type is java.lang.Void; emit a synthetic return statement + trans_block.stats = trans_block.stats.append(make.Return(make.Literal(BOT, null).setType(syms.botType))); + } + return trans_block; + } + + /** + * Create new synthetic method with given flags, name, type, owner + */ + private MethodSymbol makeSyntheticMethod(long flags, Name name, Type type, Symbol owner) { + return new MethodSymbol(flags | SYNTHETIC, name, type, owner); + } + + /** + * Create new synthetic variable with given flags, name, type, owner + */ + private VarSymbol makeSyntheticVar(long flags, String name, Type type, Symbol owner) { + return makeSyntheticVar(flags, names.fromString(name), type, owner); + } + + /** + * Create new synthetic variable with given flags, name, type, owner + */ + private VarSymbol makeSyntheticVar(long flags, Name name, Type type, Symbol owner) { + return new VarSymbol(flags | SYNTHETIC, name, type, owner); + } + + /** + * Set varargsElement field on a given tree (must be either a new class tree + * or a method call tree) + */ + private void setVarargsIfNeeded(JCTree tree, Type varargsElement) { + if (varargsElement != null) { + switch (tree.getTag()) { + case APPLY: ((JCMethodInvocation)tree).varargsElement = varargsElement; break; + case NEWCLASS: ((JCNewClass)tree).varargsElement = varargsElement; break; + default: throw new AssertionError(); + } + } + } + + /** + * Convert method/constructor arguments by inserting appropriate cast + * as required by type-erasure - this is needed when bridging a lambda/method + * reference, as the bridged signature might require downcast to be compatible + * with the generated signature. + */ + private List convertArgs(Symbol meth, List args, Type varargsElement) { + Assert.check(meth.kind == Kinds.MTH); + List formals = types.erasure(meth.type).getParameterTypes(); + if (varargsElement != null) { + Assert.check((meth.flags() & VARARGS) != 0); + } + return transTypes.translateArgs(args, formals, varargsElement, attrEnv); + } + + // + + private MethodSymbol makeSamDescriptor(Type targetType) { + return (MethodSymbol)types.findDescriptorSymbol(targetType.tsym); + } + + private Type makeFunctionalDescriptorType(Type targetType, MethodSymbol samDescriptor, boolean erased) { + Type descType = types.memberType(targetType, samDescriptor); + return erased ? types.erasure(descType) : descType; + } + + private Type makeFunctionalDescriptorType(Type targetType, boolean erased) { + return makeFunctionalDescriptorType(targetType, makeSamDescriptor(targetType), erased); + } + + /** + * Generate an adapter method "bridge" for a method reference which cannot + * be used directly. + */ + private class MemberReferenceBridger { + + private final JCMemberReference tree; + private final ReferenceTranslationContext localContext; + private final ListBuffer args = ListBuffer.lb(); + private final ListBuffer params = ListBuffer.lb(); + + MemberReferenceBridger(JCMemberReference tree, ReferenceTranslationContext localContext) { + this.tree = tree; + this.localContext = localContext; + } + + /** + * Generate the bridge + */ + JCMethodDecl bridge() { + int prevPos = make.pos; + try { + make.at(tree); + Type samDesc = localContext.bridgedRefSig(); + List samPTypes = samDesc.getParameterTypes(); + + //an extra argument is prepended to the signature of the bridge in case + //the member reference is an instance method reference (in which case + //the receiver expression is passed to the bridge itself). + Type recType = null; + switch (tree.kind) { + case IMPLICIT_INNER: + recType = tree.sym.owner.type.getEnclosingType(); + break; + case BOUND: + recType = tree.getQualifierExpression().type; + break; + case UNBOUND: + recType = samPTypes.head; + samPTypes = samPTypes.tail; + break; + } + + //generate the parameter list for the bridged member reference - the + //bridge signature will match the signature of the target sam descriptor + + VarSymbol rcvr = (recType == null) + ? null + : addParameter("rec$", recType, false); + + List refPTypes = tree.sym.type.getParameterTypes(); + int refSize = refPTypes.size(); + int samSize = samPTypes.size(); + int last = localContext.needsVarArgsConversion() ? refSize - 1 : refSize; // Last parameter to copy from referenced method + + List l = refPTypes; + // Use parameter types of the referenced method, excluding final var args + for (int i = 0; l.nonEmpty() && i < last; ++i) { + addParameter("x$" + i, l.head, true); + l = l.tail; + } + // Flatten out the var args + for (int i = last; i < samSize; ++i) { + addParameter("xva$" + i, tree.varargsElement, true); + } + + //generate the bridge method declaration + JCMethodDecl bridgeDecl = make.MethodDef(make.Modifiers(localContext.bridgeSym.flags()), + localContext.bridgeSym.name, + make.QualIdent(samDesc.getReturnType().tsym), + List.nil(), + params.toList(), + tree.sym.type.getThrownTypes() == null + ? List.nil() + : make.Types(tree.sym.type.getThrownTypes()), + null, + null); + bridgeDecl.sym = (MethodSymbol) localContext.bridgeSym; + bridgeDecl.type = localContext.bridgeSym.type = types.createMethodTypeWithParameters(samDesc, TreeInfo.types(params.toList())); + + //bridge method body generation - this can be either a method call or a + //new instance creation expression, depending on the member reference kind + JCExpression bridgeExpr = (tree.getMode() == ReferenceMode.INVOKE) + ? bridgeExpressionInvoke(rcvr) + : bridgeExpressionNew(); + + //the body is either a return expression containing a method call, + //or the method call itself, depending on whether the return type of + //the bridge is non-void/void. + bridgeDecl.body = makeLambdaExpressionBody(bridgeExpr, bridgeDecl); + + return bridgeDecl; + } finally { + make.at(prevPos); + } + } + + /** + * determine the receiver of the bridged method call - the receiver can + * be either the synthetic receiver parameter or a type qualifier; the + * original qualifier expression is never used here, as it might refer + * to symbols not available in the static context of the bridge + */ + private JCExpression bridgeExpressionInvoke(VarSymbol rcvr) { + JCExpression qualifier = + tree.sym.isStatic() ? + make.Type(tree.sym.owner.type) : + (rcvr != null) ? + make.Ident(rcvr) : + tree.getQualifierExpression(); + + //create the qualifier expression + JCFieldAccess select = make.Select(qualifier, tree.sym.name); + select.sym = tree.sym; + select.type = tree.sym.erasure(types); + + //create the method call expression + JCExpression apply = make.Apply(List.nil(), select, + convertArgs(tree.sym, args.toList(), tree.varargsElement)).setType(tree.sym.erasure(types).getReturnType()); + + apply = transTypes.coerce(apply, localContext.generatedRefSig().getReturnType()); + setVarargsIfNeeded(apply, tree.varargsElement); + return apply; + } + + /** + * the enclosing expression is either 'null' (no enclosing type) or set + * to the first bridge synthetic parameter + */ + private JCExpression bridgeExpressionNew() { + JCExpression encl = null; + switch (tree.kind) { + case UNBOUND: + case IMPLICIT_INNER: + encl = make.Ident(params.first()); + } + + //create the instance creation expression + JCNewClass newClass = make.NewClass(encl, + List.nil(), + make.Type(tree.getQualifierExpression().type), + convertArgs(tree.sym, args.toList(), tree.varargsElement), + null); + newClass.constructor = tree.sym; + newClass.constructorType = tree.sym.erasure(types); + newClass.type = tree.getQualifierExpression().type; + setVarargsIfNeeded(newClass, tree.varargsElement); + return newClass; + } + + private VarSymbol addParameter(String name, Type p, boolean genArg) { + VarSymbol vsym = new VarSymbol(0, names.fromString(name), p, localContext.bridgeSym); + params.append(make.VarDef(vsym, null)); + if (genArg) { + args.append(make.Ident(vsym)); + } + return vsym; + } + } + + /** + * Bridges a member reference - this is needed when: + * * Var args in the referenced method need to be flattened away + * * super is used + */ + private void bridgeMemberReference(JCMemberReference tree, ReferenceTranslationContext localContext) { + JCMethodDecl bridgeDecl = (new MemberReferenceBridger(tree, localContext).bridge()); + translatedMethodList = translatedMethodList.prepend(bridgeDecl); + } + + /** + * Generate an indy method call to the meta factory + */ + private JCExpression makeMetaFactoryIndyCall(JCExpression tree, Type targetType, int refKind, Symbol refSym, List indy_args) { + //determine the static bsm args + Type mtype = makeFunctionalDescriptorType(targetType, true); + List staticArgs = List.of( + new Pool.MethodHandle(ClassFile.REF_invokeInterface, types.findDescriptorSymbol(targetType.tsym)), + new Pool.MethodHandle(refKind, refSym), + new MethodType(mtype.getParameterTypes(), + mtype.getReturnType(), + mtype.getThrownTypes(), + syms.methodClass)); + + //computed indy arg types + ListBuffer indy_args_types = ListBuffer.lb(); + for (JCExpression arg : indy_args) { + indy_args_types.append(arg.type); + } + + //finally, compute the type of the indy call + MethodType indyType = new MethodType(indy_args_types.toList(), + tree.type, + List.nil(), + syms.methodClass); + + return makeIndyCall(tree, syms.lambdaMetafactory, names.metaFactory, staticArgs, indyType, indy_args); + } + + /** + * Generate an indy method call with given name, type and static bootstrap + * arguments types + */ + private JCExpression makeIndyCall(DiagnosticPosition pos, Type site, Name bsmName, List staticArgs, MethodType indyType, List indyArgs) { + int prevPos = make.pos; + try { + make.at(pos); + List bsm_staticArgs = List.of(syms.methodHandleLookupType, + syms.stringType, + syms.methodTypeType).appendList(bsmStaticArgToTypes(staticArgs)); + + Symbol bsm = rs.resolveInternalMethod(pos, attrEnv, site, + bsmName, bsm_staticArgs, List.nil()); + + DynamicMethodSymbol dynSym = + new DynamicMethodSymbol(names.lambda, + syms.noSymbol, + bsm.isStatic() ? ClassFile.REF_invokeStatic : ClassFile.REF_invokeVirtual, + (MethodSymbol)bsm, + indyType, + staticArgs.toArray()); + + JCFieldAccess qualifier = make.Select(make.QualIdent(site.tsym), bsmName); + qualifier.sym = dynSym; + qualifier.type = indyType.getReturnType(); + + JCMethodInvocation proxyCall = make.Apply(List.nil(), qualifier, indyArgs); + proxyCall.type = indyType.getReturnType(); + return proxyCall; + } finally { + make.at(prevPos); + } + } + //where + private List bsmStaticArgToTypes(List args) { + ListBuffer argtypes = ListBuffer.lb(); + for (Object arg : args) { + argtypes.append(bsmStaticArgToType(arg)); + } + return argtypes.toList(); + } + + private Type bsmStaticArgToType(Object arg) { + Assert.checkNonNull(arg); + if (arg instanceof ClassSymbol) { + return syms.classType; + } else if (arg instanceof Integer) { + return syms.intType; + } else if (arg instanceof Long) { + return syms.longType; + } else if (arg instanceof Float) { + return syms.floatType; + } else if (arg instanceof Double) { + return syms.doubleType; + } else if (arg instanceof String) { + return syms.stringType; + } else if (arg instanceof Pool.MethodHandle) { + return syms.methodHandleType; + } else if (arg instanceof MethodType) { + return syms.methodTypeType; + } else { + Assert.error("bad static arg " + arg.getClass()); + return null; + } + } + + /** + * Get the opcode associated with this method reference + */ + private int referenceKind(Symbol refSym) { + if (refSym.isConstructor()) { + return ClassFile.REF_newInvokeSpecial; + } else { + if (refSym.isStatic()) { + return ClassFile.REF_invokeStatic; + } else if (refSym.enclClass().isInterface()) { + return ClassFile.REF_invokeInterface; + } else { + return ClassFile.REF_invokeVirtual; + } + } + } + // + + // \ + /** + * This visitor collects information about translation of a lambda expression. + * More specifically, it keeps track of the enclosing contexts and captured locals + * accessed by the lambda being translated (as well as other useful info). + */ + class LambdaAnalyzer extends TreeScanner { + + /** the frame stack - used to reconstruct translation info about enclosing scopes */ + private List frameStack; + + /** + * keep the count of lambda expression (used to generate unambiguous + * names) + */ + private int lambdaCount = 0; + + private void analyzeClass(JCClassDecl tree) { + frameStack = List.nil(); + scan(tree); + } + + @Override + public void visitBlock(JCBlock tree) { + List prevStack = frameStack; + try { + if (frameStack.nonEmpty() && frameStack.head.tree.hasTag(CLASSDEF)) { + frameStack = frameStack.prepend(new Frame(tree)); + } + super.visitBlock(tree); + } + finally { + frameStack = prevStack; + } + } + + @Override + public void visitClassDef(JCClassDecl tree) { + List prevStack = frameStack; + try { + if (frameStack.nonEmpty() && enclosingLambda() != null) { + tree.sym.owner = owner(); + LambdaTranslationContext lambdaContext = (LambdaTranslationContext)contextMap.get(enclosingLambda()); + Type encl = lambdaContext.enclosingType(); + if (encl.hasTag(NONE)) { + //if the translated lambda body occurs in a static context, + //any class declaration within it must be made static + tree.sym.flags_field |= STATIC; + ((ClassType)tree.sym.type).setEnclosingType(Type.noType); + } else { + //if the translated lambda body is in an instance context + //the enclosing type of any class declaration within it + //must be updated to point to the new enclosing type (if any) + ((ClassType)tree.sym.type).setEnclosingType(encl); + } + } + frameStack = frameStack.prepend(new Frame(tree)); + super.visitClassDef(tree); + } + finally { + frameStack = prevStack; + } + if (frameStack.nonEmpty() && enclosingLambda() != null) { + // Any class defined within a lambda is an implicit 'this' reference + // because its constructor will reference the enclosing class + ((LambdaTranslationContext) context()).addSymbol(tree.sym.type.getEnclosingType().tsym, CAPTURED_THIS); + } + } + + @Override + public void visitIdent(JCIdent tree) { + if (context() == null || !lambdaIdentSymbolFilter(tree.sym)) { + super.visitIdent(tree); + } else { + if (tree.sym.kind == VAR && + tree.sym.owner.kind == MTH && + tree.type.constValue() == null) { + TranslationContext localContext = context(); + while (localContext != null) { + if (localContext.tree.getTag() == LAMBDA) { + JCTree block = capturedDecl(localContext.depth, tree.sym); + if (block == null) break; + ((LambdaTranslationContext)localContext).addSymbol(tree.sym, CAPTURED_VAR); + } + localContext = localContext.prev; + } + } else if (tree.sym.owner.kind == TYP) { + TranslationContext localContext = context(); + while (localContext != null) { + if (localContext.tree.hasTag(LAMBDA)) { + JCTree block = capturedDecl(localContext.depth, tree.sym); + if (block == null) break; + switch (block.getTag()) { + case CLASSDEF: + JCClassDecl cdecl = (JCClassDecl)block; + ((LambdaTranslationContext)localContext).addSymbol(cdecl.sym, CAPTURED_THIS); + break; + default: + Assert.error("bad block kind"); + } + } + localContext = localContext.prev; + } + } + } + } + + @Override + public void visitLambda(JCLambda tree) { + List prevStack = frameStack; + try { + LambdaTranslationContext context = (LambdaTranslationContext)makeLambdaContext(tree); + frameStack = frameStack.prepend(new Frame(tree)); + for (JCVariableDecl param : tree.params) { + context.addSymbol(param.sym, PARAM); + frameStack.head.addLocal(param.sym); + } + contextMap.put(tree, context); + scan(tree.body); + context.complete(); + } + finally { + frameStack = prevStack; + } + } + + @Override + public void visitMethodDef(JCMethodDecl tree) { + List prevStack = frameStack; + try { + frameStack = frameStack.prepend(new Frame(tree)); + super.visitMethodDef(tree); + } + finally { + frameStack = prevStack; + } + } + + @Override + public void visitNewClass(JCNewClass tree) { + if (lambdaNewClassFilter(context(), tree)) { + ((LambdaTranslationContext) context()).addSymbol(tree.type.getEnclosingType().tsym, CAPTURED_THIS); + } + super.visitNewClass(tree); + } + + @Override + public void visitReference(JCMemberReference tree) { + scan(tree.getQualifierExpression()); + contextMap.put(tree, makeReferenceContext(tree)); + } + + @Override + public void visitSelect(JCFieldAccess tree) { + if (context() != null && lambdaSelectSymbolFilter(tree.sym)) { + TranslationContext localContext = context(); + while (localContext != null) { + if (localContext.tree.hasTag(LAMBDA)) { + JCClassDecl clazz = (JCClassDecl)capturedDecl(localContext.depth, tree.sym); + if (clazz == null) break; + ((LambdaTranslationContext)localContext).addSymbol(clazz.sym, CAPTURED_THIS); + } + localContext = localContext.prev; + } + scan(tree.selected); + } else { + super.visitSelect(tree); + } + } + + @Override + public void visitVarDef(JCVariableDecl tree) { + if (frameStack.head.tree.hasTag(LAMBDA)) { + ((LambdaTranslationContext)context()).addSymbol(tree.sym, LOCAL_VAR); + } + List prevStack = frameStack; + try { + if (tree.sym.owner.kind == MTH) { + frameStack.head.addLocal(tree.sym); + } + frameStack = frameStack.prepend(new Frame(tree)); + super.visitVarDef(tree); + } + finally { + frameStack = prevStack; + } + } + + private Name lambdaName() { + return names.lambda.append(names.fromString("$" + lambdaCount++)); + } + + /** + * Return a valid owner given the current declaration stack + * (required to skip synthetic lambda symbols) + */ + private Symbol owner() { + List frameStack2 = frameStack; + while (frameStack2.nonEmpty()) { + switch (frameStack2.head.tree.getTag()) { + case VARDEF: + if (((JCVariableDecl)frameStack2.head.tree).sym.isLocal()) { + frameStack2 = frameStack2.tail; + break; + } + JCClassDecl cdecl = (JCClassDecl)frameStack2.tail.head.tree; + return makeSyntheticMethod(((JCVariableDecl)frameStack2.head.tree).sym.flags() & STATIC, names.empty, null, cdecl.sym); + case BLOCK: + JCClassDecl cdecl2 = (JCClassDecl)frameStack2.tail.head.tree; + return makeSyntheticMethod(((JCBlock)frameStack2.head.tree).flags & STATIC | Flags.BLOCK, names.empty, null, cdecl2.sym); + case CLASSDEF: + return ((JCClassDecl)frameStack2.head.tree).sym; + case METHODDEF: + return ((JCMethodDecl)frameStack2.head.tree).sym; + case LAMBDA: + return ((LambdaTranslationContext)contextMap.get(frameStack2.head.tree)).translatedSym; + default: + frameStack2 = frameStack2.tail; + } + } + Assert.error(); + return null; + } + + private JCTree enclosingLambda() { + List frameStack2 = frameStack; + while (frameStack2.nonEmpty()) { + switch (frameStack2.head.tree.getTag()) { + case CLASSDEF: + case METHODDEF: + return null; + case LAMBDA: + return frameStack2.head.tree; + default: + frameStack2 = frameStack2.tail; + } + } + Assert.error(); + return null; + } + + /** + * Return the declaration corresponding to a symbol in the enclosing + * scope; the depth parameter is used to filter out symbols defined + * in nested scopes (which do not need to undergo capture). + */ + private JCTree capturedDecl(int depth, Symbol sym) { + int currentDepth = frameStack.size() - 1; + for (Frame block : frameStack) { + switch (block.tree.getTag()) { + case CLASSDEF: + ClassSymbol clazz = ((JCClassDecl)block.tree).sym; + if (sym.isMemberOf(clazz, types)) { + return currentDepth > depth ? null : block.tree; + } + break; + case VARDEF: + if (((JCVariableDecl)block.tree).sym == sym && + sym.owner.kind == MTH) { //only locals are captured + return currentDepth > depth ? null : block.tree; + } + break; + case BLOCK: + case METHODDEF: + case LAMBDA: + if (block.locals != null && block.locals.contains(sym)) { + return currentDepth > depth ? null : block.tree; + } + break; + default: + Assert.error("bad decl kind " + block.tree.getTag()); + } + currentDepth--; + } + return null; + } + + private TranslationContext context() { + for (Frame frame : frameStack) { + TranslationContext context = contextMap.get(frame.tree); + if (context != null) { + return context; + } + } + return null; + } + + /** + * This is used to filter out those identifiers that needs to be adjusted + * when translating away lambda expressions + */ + private boolean lambdaIdentSymbolFilter(Symbol sym) { + return (sym.kind == VAR || sym.kind == MTH) + && !sym.isStatic() + && sym.name != names.init; + } + + private boolean lambdaSelectSymbolFilter(Symbol sym) { + return (sym.kind == VAR || sym.kind == MTH) && + !sym.isStatic() && + (sym.name == names._this || + sym.name == names._super); + } + + /** + * This is used to filter out those new class expressions that need to + * be qualified with an enclosing tree + */ + private boolean lambdaNewClassFilter(TranslationContext context, JCNewClass tree) { + if (context != null + && tree.encl == null + && tree.def == null + && tree.type.getEnclosingType().hasTag(NONE)) { + Type encl = tree.type.getEnclosingType(); + Type current = context.owner.enclClass().type; + while (current.hasTag(NONE)) { + if (current.tsym.isSubClass(encl.tsym, types)) { + return true; + } + current = current.getEnclosingType(); + } + return false; + } else { + return false; + } + } + + private TranslationContext makeLambdaContext(JCLambda tree) { + return new LambdaTranslationContext(tree); + } + + private TranslationContext makeReferenceContext(JCMemberReference tree) { + return new ReferenceTranslationContext(tree); + } + + private class Frame { + final JCTree tree; + List locals; + + public Frame(JCTree tree) { + this.tree = tree; + } + + void addLocal(Symbol sym) { + if (locals == null) { + locals = List.nil(); + } + locals = locals.prepend(sym); + } + } + + /** + * This class is used to store important information regarding translation of + * lambda expression/method references (see subclasses). + */ + private abstract class TranslationContext { + + /** the underlying (untranslated) tree */ + T tree; + + /** points to the adjusted enclosing scope in which this lambda/mref expression occurs */ + Symbol owner; + + /** the depth of this lambda expression in the frame stack */ + int depth; + + /** the enclosing translation context (set for nested lambdas/mref) */ + TranslationContext prev; + + TranslationContext(T tree) { + this.tree = tree; + this.owner = owner(); + this.depth = frameStack.size() - 1; + this.prev = context(); + } + } + + /** + * This class retains all the useful information about a lambda expression; + * the contents of this class are filled by the LambdaAnalyzer visitor, + * and the used by the main translation routines in order to adjust references + * to captured locals/members, etc. + */ + private class LambdaTranslationContext extends TranslationContext { + + /** variable in the enclosing context to which this lambda is assigned */ + Symbol self; + + /** map from original to translated lambda parameters */ + Map lambdaParams = new LinkedHashMap(); + + /** map from original to translated lambda locals */ + Map lambdaLocals = new LinkedHashMap(); + + /** map from variables in enclosing scope to translated synthetic parameters */ + Map capturedLocals = new LinkedHashMap(); + + /** map from class symbols to translated synthetic parameters (for captured member access) */ + Map capturedThis = new LinkedHashMap(); + + /** the synthetic symbol for the method hoisting the translated lambda */ + Symbol translatedSym; + + List syntheticParams; + + LambdaTranslationContext(JCLambda tree) { + super(tree); + Frame frame = frameStack.head; + if (frame.tree.hasTag(VARDEF)) { + self = ((JCVariableDecl)frame.tree).sym; + } + this.translatedSym = makeSyntheticMethod(0, lambdaName(), null, owner.enclClass()); + } + + /** + * Translate a symbol of a given kind into something suitable for the + * synthetic lambda body + */ + Symbol translate(String name, Symbol sym, LambdaSymbolKind skind) { + if (skind == CAPTURED_THIS) { + return sym; // self represented + } else { + return makeSyntheticVar(FINAL, name, types.erasure(sym.type), translatedSym); + } + } + + void addSymbol(Symbol sym, LambdaSymbolKind skind) { + Map transMap = null; + String preferredName; + switch (skind) { + case CAPTURED_THIS: + transMap = capturedThis; + preferredName = "encl$" + capturedThis.size(); + break; + case CAPTURED_VAR: + transMap = capturedLocals; + preferredName = "cap$" + capturedLocals.size(); + break; + case LOCAL_VAR: + transMap = lambdaLocals; + preferredName = sym.name.toString(); + break; + case PARAM: + transMap = lambdaParams; + preferredName = sym.name.toString(); + break; + default: throw new AssertionError(); + } + if (!transMap.containsKey(sym)) { + transMap.put(sym, translate(preferredName, sym, skind)); + } + } + + Map getSymbolMap(LambdaSymbolKind... skinds) { + LinkedHashMap translationMap = new LinkedHashMap(); + for (LambdaSymbolKind skind : skinds) { + switch (skind) { + case CAPTURED_THIS: + translationMap.putAll(capturedThis); + break; + case CAPTURED_VAR: + translationMap.putAll(capturedLocals); + break; + case LOCAL_VAR: + translationMap.putAll(lambdaLocals); + break; + case PARAM: + translationMap.putAll(lambdaParams); + break; + default: throw new AssertionError(); + } + } + return translationMap; + } + + /** + * The translatedSym is not complete/accurate until the analysis is + * finished. Once the analysis is finished, the translatedSym is + * "completed" -- updated with type information, access modifiers, + * and full parameter list. + */ + void complete() { + if (syntheticParams != null) { + return; + } + boolean inInterface = translatedSym.owner.isInterface(); + boolean thisReferenced = !getSymbolMap(CAPTURED_THIS).isEmpty(); + boolean needInstance = thisReferenced || inInterface; + + // If instance access isn't needed, make it static + // Interface methods much be public default methods, otherwise make it private + translatedSym.flags_field = SYNTHETIC | (needInstance? 0 : STATIC) | (inInterface? PUBLIC | DEFAULT : PRIVATE); + + //compute synthetic params + ListBuffer params = ListBuffer.lb(); + + // The signature of the method is augmented with the following + // synthetic parameters: + // + // 1) reference to enclosing contexts captured by the lambda expression + // 2) enclosing locals captured by the lambda expression + for (Symbol thisSym : getSymbolMap(CAPTURED_VAR, PARAM).values()) { + params.append(make.VarDef((VarSymbol) thisSym, null)); + } + + syntheticParams = params.toList(); + + //prepend synthetic args to translated lambda method signature + translatedSym.type = (MethodType) types.createMethodTypeWithParameters( + (MethodType) generatedLambdaSig(), + TreeInfo.types(syntheticParams)); + } + + Type enclosingType() { + //local inner classes defined inside a lambda are always non-static + return owner.enclClass().type; + } + + Type generatedLambdaSig() { + return types.erasure(types.findDescriptorType(tree.targetType)); + } + } + + /** + * This class retains all the useful information about a method reference; + * the contents of this class are filled by the LambdaAnalyzer visitor, + * and the used by the main translation routines in order to adjust method + * references (i.e. in case a bridge is needed) + */ + private class ReferenceTranslationContext extends TranslationContext { + + final boolean isSuper; + final Symbol bridgeSym; + + ReferenceTranslationContext(JCMemberReference tree) { + super(tree); + this.isSuper = tree.hasKind(ReferenceKind.SUPER); + this.bridgeSym = needsBridge() + ? makeSyntheticMethod(isSuper ? 0 : STATIC, + lambdaName().append(names.fromString("$bridge")), null, + owner.enclClass()) + : null; + } + + /** + * Get the opcode associated with this method reference + */ + int referenceKind() { + return LambdaToMethod.this.referenceKind(needsBridge() ? bridgeSym : tree.sym); + } + + boolean needsVarArgsConversion() { + return tree.varargsElement != null; + } + + /** + * @return Is this an array operation like clone() + */ + boolean isArrayOp() { + return tree.sym.owner == syms.arrayClass; + } + + /** + * Does this reference needs a bridge (i.e. var args need to be + * expanded or "super" is used) + */ + final boolean needsBridge() { + return isSuper || needsVarArgsConversion() || isArrayOp(); + } + + Type generatedRefSig() { + return types.erasure(tree.sym.type); + } + + Type bridgedRefSig() { + return types.erasure(types.findDescriptorSymbol(tree.targetType.tsym).type); + } + } + } + // + + enum LambdaSymbolKind { + CAPTURED_VAR, + CAPTURED_THIS, + LOCAL_VAR, + PARAM; + } +} diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java index 57604cbe557..c52ffb76460 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Lower.java @@ -45,7 +45,7 @@ import com.sun.tools.javac.tree.EndPosTable; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.tree.JCTree.Tag.*; @@ -485,7 +485,7 @@ public class Lower extends TreeTranslator { * @param value The literal's value. */ JCExpression makeLit(Type type, Object value) { - return make.Literal(type.tag, value).setType(type.constType(value)); + return make.Literal(type.getTag(), value).setType(type.constType(value)); } /** Make an attributed tree representing null. @@ -549,7 +549,7 @@ public class Lower extends TreeTranslator { * reference type.. */ JCExpression makeString(JCExpression tree) { - if (tree.type.tag >= CLASS) { + if (!tree.type.isPrimitiveOrVoid()) { return tree; } else { Symbol valueOfSym = lookupMethod(tree.pos(), @@ -671,7 +671,7 @@ public class Lower extends TreeTranslator { }; /** Look up a synthetic name in a given scope. - * @param scope The scope. + * @param s The scope. * @param name The name. */ private Symbol lookupSynthetic(Name name, Scope s) { @@ -747,7 +747,7 @@ public class Lower extends TreeTranslator { * This numbering scheme is used by the backend to decide whether * to issue an invokevirtual or invokespecial call. * - * @see Gen.visitSelect(Select tree) + * @see Gen#visitSelect(JCFieldAccess tree) */ private static final int DEREFcode = 0, @@ -1405,7 +1405,7 @@ public class Lower extends TreeTranslator { Name outerThisName(Type type, Symbol owner) { Type t = type.getEnclosingType(); int nestingLevel = 0; - while (t.tag == CLASS) { + while (t.hasTag(CLASS)) { t = t.getEnclosingType(); nestingLevel++; } @@ -1529,7 +1529,7 @@ public class Lower extends TreeTranslator { new VarSymbol(SYNTHETIC | FINAL, makeSyntheticName(names.fromString("twrVar" + depth), twrVars), - (resource.type.tag == TypeTags.BOT) ? + (resource.type.hasTag(BOT)) ? syms.autoCloseableType : resource.type, currentMethodSym); twrVars.enter(syntheticTwrVar); @@ -1945,7 +1945,7 @@ public class Lower extends TreeTranslator { * @param sig The signature of type T. */ private Name cacheName(String sig) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); if (sig.startsWith("[")) { buf = buf.append("array"); while (sig.startsWith("[")) { @@ -1992,7 +1992,7 @@ public class Lower extends TreeTranslator { } private JCExpression classOfType(Type type, DiagnosticPosition pos) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: case SHORT: case CHAR: case INT: case LONG: case FLOAT: case DOUBLE: case BOOLEAN: case VOID: // replace with .TYPE @@ -2761,7 +2761,7 @@ public class Lower extends TreeTranslator { } //where private JCTree convert(JCTree tree, Type pt) { - if (tree.type == pt || tree.type.tag == TypeTags.BOT) + if (tree.type == pt || tree.type.hasTag(BOT)) return tree; JCTree result = make_at(tree.pos()).TypeCast(make.Type(pt), (JCExpression)tree); result.type = (tree.type.constValue() != null) ? cfolder.coerce(tree.type, pt) @@ -2934,7 +2934,7 @@ public class Lower extends TreeTranslator { return tree; if (havePrimitive) { Type unboxedTarget = types.unboxedType(type); - if (unboxedTarget.tag != NONE) { + if (!unboxedTarget.hasTag(NONE)) { if (!types.isSubtype(tree.type, unboxedTarget)) //e.g. Character c = 89; tree.type = unboxedTarget.constType(tree.type.constValue()); return (T)boxPrimitive((JCExpression)tree, type); @@ -2974,7 +2974,7 @@ public class Lower extends TreeTranslator { /** Unbox an object to a primitive value. */ JCExpression unbox(JCExpression tree, Type primitive) { Type unboxedType = types.unboxedType(tree.type); - if (unboxedType.tag == NONE) { + if (unboxedType.hasTag(NONE)) { unboxedType = primitive; if (!unboxedType.isPrimitive()) throw new AssertionError(unboxedType); @@ -3292,7 +3292,7 @@ public class Lower extends TreeTranslator { iteratorTarget = types.erasure(iterableType.getTypeArguments().head); Type eType = tree.expr.type; tree.expr.type = types.erasure(eType); - if (eType.tag == TYPEVAR && eType.getUpperBound().isCompound()) + if (eType.hasTag(TYPEVAR) && eType.getUpperBound().isCompound()) tree.expr = make.TypeCast(types.erasure(iterableType), tree.expr); Symbol iterator = lookupMethod(tree.expr.pos(), names.iterator, diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java index a57f3ba8019..b2e9997bfce 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/MemberEnter.java @@ -42,7 +42,9 @@ import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.ANNOTATION; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.ERROR; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; import static com.sun.tools.javac.tree.JCTree.Tag.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; @@ -128,8 +130,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { /** Import all classes of a class or package on demand. * @param pos Position to be used for error reporting. * @param tsym The class or package the members of which are imported. - * @param toScope The (import) scope in which imported classes - * are entered. + * @param env The env in which the imported classes will be entered. */ private void importAll(int pos, final TypeSymbol tsym, @@ -150,8 +151,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { /** Import all static members of a class or package on demand. * @param pos Position to be used for error reporting. * @param tsym The class or package the members of which are imported. - * @param toScope The (import) scope in which imported classes - * are entered. + * @param env The env in which the imported classes will be entered. */ private void importStaticAll(int pos, final TypeSymbol tsym, @@ -372,7 +372,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { ListBuffer thrownbuf = new ListBuffer(); for (List l = thrown; l.nonEmpty(); l = l.tail) { Type exc = attr.attribType(l.head, env); - if (exc.tag != TYPEVAR) + if (!exc.hasTag(TYPEVAR)) exc = chk.checkClassType(l.head.pos(), exc); thrownbuf.append(exc); } @@ -923,7 +923,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { } for (JCExpression iface : interfaceTrees) { Type i = attr.attribBase(iface, baseEnv, false, true, true); - if (i.tag == CLASS) { + if (i.hasTag(CLASS)) { interfaces.append(i); if (all_interfaces != null) all_interfaces.append(i); chk.checkNotRepeated(iface.pos(), types.erasure(i), interfaceSet); @@ -1008,7 +1008,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { new VarSymbol(FINAL | HASINIT, names._this, c.type, c); thisSym.pos = Position.FIRSTPOS; env.info.scope.enter(thisSym); - if (ct.supertype_field.tag == CLASS) { + if (ct.supertype_field.hasTag(CLASS)) { VarSymbol superSym = new VarSymbol(FINAL | HASINIT, names._super, ct.supertype_field, c); @@ -1022,11 +1022,13 @@ public class MemberEnter extends JCTree.Visitor implements Completer { // name as a top-level package. if (checkClash && c.owner.kind == PCK && c.owner != syms.unnamedPackage && - reader.packageExists(c.fullname)) - { - log.error(tree.pos, "clash.with.pkg.of.same.name", Kinds.kindName(sym), c); - } - + reader.packageExists(c.fullname)) { + log.error(tree.pos, "clash.with.pkg.of.same.name", Kinds.kindName(sym), c); + } + if (c.owner.kind == PCK && (c.flags_field & PUBLIC) == 0 && + !env.toplevel.sourcefile.isNameCompatible(c.name.toString(),JavaFileObject.Kind.SOURCE)) { + c.flags_field |= AUXILIARY; + } } catch (CompletionFailure ex) { chk.completionError(tree.pos(), ex); } finally { @@ -1096,7 +1098,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { } Type modelMissingTypes(Type t, final JCExpression tree, final boolean interfaceExpected) { - if (t.tag != ERROR) + if (!t.hasTag(ERROR)) return t; return new ErrorType(((ErrorType) t).getOriginalType(), t.tsym) { @@ -1141,7 +1143,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { @Override public void visitIdent(JCIdent tree) { - if (tree.type.tag != ERROR) { + if (!tree.type.hasTag(ERROR)) { result = tree.type; } else { result = synthesizeClass(tree.name, syms.unnamedPackage).type; @@ -1150,7 +1152,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { @Override public void visitSelect(JCFieldAccess tree) { - if (tree.type.tag != ERROR) { + if (!tree.type.hasTag(ERROR)) { result = tree.type; } else { Type selectedType; @@ -1168,7 +1170,7 @@ public class MemberEnter extends JCTree.Visitor implements Completer { @Override public void visitTypeApply(JCTypeApply tree) { - if (tree.type.tag != ERROR) { + if (!tree.type.hasTag(ERROR)) { result = tree.type; } else { ClassType clazzType = (ClassType) visit(tree.clazz); diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java index ba02bb77e80..448ecfd474a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/Resolve.java @@ -59,7 +59,7 @@ import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Flags.BLOCK; import static com.sun.tools.javac.code.Kinds.*; import static com.sun.tools.javac.code.Kinds.ERRONEOUS; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.comp.Resolve.MethodResolutionPhase.*; import static com.sun.tools.javac.tree.JCTree.Tag.*; @@ -228,7 +228,7 @@ public class Resolve { JCDiagnostic getVerboseApplicableCandidateDiag(int pos, Symbol sym, Type inst) { JCDiagnostic subDiag = null; - if (sym.type.tag == FORALL) { + if (sym.type.hasTag(FORALL)) { subDiag = diags.fragment("partial.inst.sig", inst); } @@ -331,7 +331,7 @@ public class Resolve { } boolean isAccessible(Env env, Type t, boolean checkInner) { - return (t.tag == ARRAY) + return (t.hasTag(ARRAY)) ? isAccessible(env, types.elemtype(t)) : isAccessible(env, t.tsym, checkInner); } @@ -467,10 +467,10 @@ public class Resolve { // need to inferred. List tvars = List.nil(); if (typeargtypes == null) typeargtypes = List.nil(); - if (mt.tag != FORALL && typeargtypes.nonEmpty()) { + if (!mt.hasTag(FORALL) && typeargtypes.nonEmpty()) { // This is not a polymorphic method, but typeargs are supplied // which is fine, see JLS 15.12.2.1 - } else if (mt.tag == FORALL && typeargtypes.nonEmpty()) { + } else if (mt.hasTag(FORALL) && typeargtypes.nonEmpty()) { ForAll pmt = (ForAll) mt; if (typeargtypes.length() != pmt.tvars.length()) throw inapplicableMethodException.setMessage("arg.length.mismatch"); // not enough args @@ -487,7 +487,7 @@ public class Resolve { actuals = actuals.tail; } mt = types.subst(pmt.qtype, pmt.tvars, typeargtypes); - } else if (mt.tag == FORALL) { + } else if (mt.hasTag(FORALL)) { ForAll pmt = (ForAll) mt; List tvars1 = types.newInstances(pmt.tvars); tvars = tvars.appendList(tvars1); @@ -499,7 +499,7 @@ public class Resolve { for (List l = argtypes; l.tail != null/*inlined: l.nonEmpty()*/ && !instNeeded; l = l.tail) { - if (l.head.tag == FORALL) instNeeded = true; + if (l.head.hasTag(FORALL)) instNeeded = true; } if (instNeeded) @@ -807,7 +807,7 @@ public class Resolve { @Override protected Type check(DiagnosticPosition pos, Type found) { - if (found.tag == DEFERRED) { + if (found.hasTag(DEFERRED)) { DeferredType dt = (DeferredType)found; return dt.check(this); } else { @@ -875,7 +875,7 @@ public class Resolve { Type site, Name name, TypeSymbol c) { - while (c.type.tag == TYPEVAR) + while (c.type.hasTag(TYPEVAR)) c = c.type.getUpperBound().tsym; Symbol bestSoFar = varNotFound; Symbol sym; @@ -888,7 +888,7 @@ public class Resolve { e = e.next(); } Type st = types.supertype(c.type); - if (st != null && (st.tag == CLASS || st.tag == TYPEVAR)) { + if (st != null && (st.hasTag(CLASS) || st.hasTag(TYPEVAR))) { sym = findField(env, site, name, st.tsym); if (sym.kind < bestSoFar.kind) bestSoFar = sym; } @@ -1184,7 +1184,7 @@ public class Resolve { lastFormal2 : formals2.head; //is this a structural actual argument? - boolean isStructuralPoly = actual.tag == DEFERRED && + boolean isStructuralPoly = actual.hasTag(DEFERRED) && (((DeferredType)actual).tree.hasTag(LAMBDA) || ((DeferredType)actual).tree.hasTag(REFERENCE)); @@ -1301,7 +1301,7 @@ public class Resolve { Type rt1 = mt1.getReturnType(); Type rt2 = mt2.getReturnType(); - if (mt1.tag == FORALL && mt2.tag == FORALL) { + if (mt1.hasTag(FORALL) && mt2.hasTag(FORALL)) { //if both are generic methods, adjust return type ahead of subtyping check rt1 = types.subst(rt1, mt1.getTypeArguments(), mt2.getTypeArguments()); } @@ -1448,11 +1448,11 @@ public class Resolve { } TypeSymbol symbolFor(Type t) { - if (t.tag != CLASS && - t.tag != TYPEVAR) { + if (!t.hasTag(CLASS) && + !t.hasTag(TYPEVAR)) { return null; } - while (t.tag == TYPEVAR) + while (t.hasTag(TYPEVAR)) t = t.getUpperBound(); if (seen.contains(t.tsym)) { //degenerate case in which we have a circular @@ -1610,7 +1610,7 @@ public class Resolve { e = e.next(); } Type st = types.supertype(c.type); - if (st != null && st.tag == CLASS) { + if (st != null && st.hasTag(CLASS)) { sym = findMemberType(env, site, name, st.tsym); if (sym.kind < bestSoFar.kind) bestSoFar = sym; } @@ -1660,7 +1660,7 @@ public class Resolve { e = e.next()) { if (e.sym.kind == TYP) { if (staticOnly && - e.sym.type.tag == TYPEVAR && + e.sym.type.hasTag(TYPEVAR) && e.sym.owner.kind == TYP) return new StaticError(e.sym); return e.sym; } @@ -1669,8 +1669,8 @@ public class Resolve { sym = findMemberType(env1, env1.enclClass.sym.type, name, env1.enclClass.sym); if (staticOnly && sym.kind == TYP && - sym.type.tag == CLASS && - sym.type.getEnclosingType().tag == CLASS && + sym.type.hasTag(CLASS) && + sym.type.getEnclosingType().hasTag(CLASS) && env1.enclClass.sym.type.isParameterized() && sym.type.getEnclosingType().isParameterized()) return new StaticError(sym); @@ -1906,7 +1906,7 @@ public class Resolve { //method symbol that can be used for lookups in the speculative cache, //causing problems in Attr.checkId() for (Type t : argtypes) { - if (t.tag == DEFERRED) { + if (t.hasTag(DEFERRED)) { DeferredType dt = (DeferredType)t; dt.speculativeCache.dupAllTo(msym, accessedSym); } @@ -1955,7 +1955,7 @@ public class Resolve { } public void printscopes(Type t) { - while (t.tag == CLASS) { + while (t.hasTag(CLASS)) { printscopes(t.tsym.members()); t = types.supertype(t); } @@ -2259,7 +2259,7 @@ public class Resolve { //- System.out.println(" e " + e.sym); if (sym.kind == MTH && (sym.flags_field & SYNTHETIC) == 0) { - List oldParams = e.sym.type.tag == FORALL ? + List oldParams = e.sym.type.hasTag(FORALL) ? ((ForAll)sym.type).tvars : List.nil(); Type constrType = new ForAll(site.tsym.type.getTypeArguments().appendList(oldParams), @@ -2565,7 +2565,7 @@ public class Resolve { findMethod(env, site, name, argtypes, typeargtypes, phase.isBoxingRequired(), phase.isVarargsRequired(), syms.operatorNames.contains(name)); return sym.kind != MTH || - site.getEnclosingType().tag == NONE || + site.getEnclosingType().hasTag(NONE) || hasEnclosingInstance(env, site) ? sym : new InvalidSymbolError(Kinds.MISSING_ENCL, sym, null) { @Override @@ -2578,7 +2578,7 @@ public class Resolve { @Override ReferenceKind referenceKind(Symbol sym) { - return site.getEnclosingType().tag == NONE ? + return site.getEnclosingType().hasTag(NONE) ? ReferenceKind.TOPLEVEL : ReferenceKind.IMPLICIT_INNER; } } @@ -2847,7 +2847,7 @@ public class Resolve { } else { ListBuffer diagArgs = ListBuffer.lb(); for (Type t : argtypes) { - if (t.tag == DEFERRED) { + if (t.hasTag(DEFERRED)) { diagArgs.append(((DeferredAttr.DeferredType)t).tree); } else { diagArgs.append(t); @@ -3222,7 +3222,7 @@ public class Resolve { Name name, List argtypes, List typeargtypes) { - if (sym.owner.type.tag == ERROR) + if (sym.owner.type.hasTag(ERROR)) return null; if (sym.name == names.init && sym.owner != site.tsym) { @@ -3267,7 +3267,7 @@ public class Resolve { Name name, List argtypes, List typeargtypes) { - Symbol errSym = ((sym.kind == TYP && sym.type.tag == CLASS) + Symbol errSym = ((sym.kind == TYP && sym.type.hasTag(CLASS)) ? types.erasure(sym.type).tsym : sym); return diags.create(dkind, log.currentSource(), pos, diff --git a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java index e3afbb757e5..e06da066d14 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java +++ b/langtools/src/share/classes/com/sun/tools/javac/comp/TransTypes.java @@ -27,8 +27,6 @@ package com.sun.tools.javac.comp; import java.util.*; -import javax.lang.model.element.ElementKind; - import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.tree.*; @@ -39,7 +37,9 @@ import com.sun.tools.javac.util.List; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; +import static com.sun.tools.javac.code.TypeTag.TYPEVAR; +import static com.sun.tools.javac.code.TypeTag.VOID; /** This pass translates Generic Java to conventional Java. * @@ -120,6 +120,16 @@ public class TransTypes extends TreeTranslator { * @param tree The expression tree. * @param target The target type. */ + public JCExpression coerce(Env env, JCExpression tree, Type target) { + Env prevEnv = this.env; + try { + this.env = env; + return coerce(tree, target); + } + finally { + this.env = prevEnv; + } + } JCExpression coerce(JCExpression tree, Type target) { Type btarget = target.baseType(); if (tree.type.isPrimitive() == target.isPrimitive()) { @@ -134,17 +144,21 @@ public class TransTypes extends TreeTranslator { * Then, coerce to some given target type unless target type is null. * This operation is used in situations like the following: * + *
    {@code
          *  class Cell { A value; }
          *  ...
          *  Cell cell;
          *  Integer x = cell.value;
    +     *  }
    * * Since the erasure of Cell.value is Object, but the type * of cell.value in the assignment is Integer, we need to * adjust the original type of cell.value to Object, and insert * a cast to Integer. That is, the last assignment becomes: * + *
    {@code
          *  Integer x = (Integer)cell.value;
    +     *  }
    * * @param tree The expression tree whose type might need adjustment. * @param erasedType The expression's type after erasure. @@ -153,7 +167,7 @@ public class TransTypes extends TreeTranslator { */ JCExpression retype(JCExpression tree, Type erasedType, Type target) { // System.err.println("retype " + tree + " to " + erasedType);//DEBUG - if (erasedType.tag > lastBaseTag) { + if (!erasedType.isPrimitive()) { if (target != null && target.isPrimitive()) target = erasure(tree.type); tree.type = erasedType; @@ -192,6 +206,20 @@ public class TransTypes extends TreeTranslator { return _args; } + public List translateArgs(List _args, + List parameters, + Type varargsElement, + Env localEnv) { + Env prevEnv = env; + try { + env = localEnv; + return translateArgs(_args, parameters, varargsElement); + } + finally { + env = prevEnv; + } + } + /** Add a bridge definition and enter corresponding method symbol in * local scope of origin. * @@ -243,7 +271,7 @@ public class TransTypes extends TreeTranslator { make.Select(receiver, impl).setType(calltype), translateArgs(make.Idents(md.params), origErasure.getParameterTypes(), null)) .setType(calltype); - JCStatement stat = (origErasure.getReturnType().tag == VOID) + JCStatement stat = (origErasure.getReturnType().hasTag(VOID)) ? make.Exec(call) : make.Return(coerce(call, bridgeType.getReturnType())); md.body = make.Block(0, List.of(stat)); @@ -398,7 +426,7 @@ public class TransTypes extends TreeTranslator { */ void addBridges(DiagnosticPosition pos, ClassSymbol origin, ListBuffer bridges) { Type st = types.supertype(origin.type); - while (st.tag == CLASS) { + while (st.hasTag(CLASS)) { // if (isSpecialization(st)) addBridges(pos, st.tsym, origin, bridges); st = types.supertype(st); @@ -447,9 +475,9 @@ public class TransTypes extends TreeTranslator { result = tree; } - JCMethodDecl currentMethod = null; + JCTree currentMethod = null; public void visitMethodDef(JCMethodDecl tree) { - JCMethodDecl previousMethod = currentMethod; + JCTree previousMethod = currentMethod; try { currentMethod = tree; tree.restype = translate(tree.restype, null); @@ -515,6 +543,22 @@ public class TransTypes extends TreeTranslator { result = tree; } + public void visitLambda(JCLambda tree) { + JCTree prevMethod = currentMethod; + try { + currentMethod = null; + tree.params = translate(tree.params); + tree.body = translate(tree.body, null); + //save non-erased target + tree.targetType = tree.type; + tree.type = erasure(tree.type); + result = tree; + } + finally { + currentMethod = prevMethod; + } + } + public void visitSwitch(JCSwitch tree) { Type selsuper = types.supertype(tree.selector.type); boolean enumSwitch = selsuper != null && @@ -566,7 +610,7 @@ public class TransTypes extends TreeTranslator { } public void visitReturn(JCReturn tree) { - tree.expr = translate(tree.expr, currentMethod.sym.erasure(types).getReturnType()); + tree.expr = translate(tree.expr, currentMethod != null ? types.erasure(currentMethod.type).getReturnType() : null); result = tree; } @@ -597,6 +641,7 @@ public class TransTypes extends TreeTranslator { Assert.check(tree.args.length() == argtypes.length()); tree.args = translateArgs(tree.args, argtypes, tree.varargsElement); + tree.type = types.erasure(tree.type); // Insert casts of method invocation results as needed. result = retype(tree, mt.getReturnType(), pt); } @@ -610,6 +655,8 @@ public class TransTypes extends TreeTranslator { tree.args = translateArgs( tree.args, tree.constructor.erasure(types).getParameterTypes(), tree.varargsElement); tree.def = translate(tree.def, null); + if (tree.constructorType != null) + tree.constructorType = erasure(tree.constructorType); tree.type = erasure(tree.type); result = tree; } @@ -627,16 +674,6 @@ public class TransTypes extends TreeTranslator { result = tree; } - @Override - public void visitLambda(JCLambda tree) { - Assert.error("Translation of lambda expression not supported yet"); - } - - @Override - public void visitReference(JCMemberReference tree) { - Assert.error("Translation of method reference not supported yet"); - } - public void visitParens(JCParens tree) { tree.expr = translate(tree.expr, pt); tree.type = erasure(tree.type); @@ -699,7 +736,7 @@ public class TransTypes extends TreeTranslator { Type et = tree.sym.erasure(types); // Map type variables to their bounds. - if (tree.sym.kind == TYP && tree.sym.type.tag == TYPEVAR) { + if (tree.sym.kind == TYP && tree.sym.type.hasTag(TYPEVAR)) { result = make.at(tree.pos).Type(et); } else // Map constants expressions to themselves. @@ -718,7 +755,7 @@ public class TransTypes extends TreeTranslator { public void visitSelect(JCFieldAccess tree) { Type t = tree.selected.type; - while (t.tag == TYPEVAR) + while (t.hasTag(TYPEVAR)) t = t.getUpperBound(); if (t.isCompound()) { if ((tree.sym.flags() & IPROXY) != 0) { @@ -745,6 +782,14 @@ public class TransTypes extends TreeTranslator { } } + public void visitReference(JCMemberReference tree) { + tree.expr = translate(tree.expr, null); + //save non-erased target + tree.targetType = tree.type; + tree.type = erasure(tree.type); + result = tree; + } + public void visitTypeArray(JCArrayTypeTree tree) { tree.elemtype = translate(tree.elemtype, null); tree.type = erasure(tree.type); @@ -842,7 +887,7 @@ public class TransTypes extends TreeTranslator { translateArgs(make.Idents(md.params), implErasure.getParameterTypes(), null)) .setType(calltype); - JCStatement stat = (member.getReturnType().tag == VOID) + JCStatement stat = (member.getReturnType().hasTag(VOID)) ? make.Exec(call) : make.Return(coerce(call, member.erasure(types).getReturnType())); md.body = make.Block(0, List.of(stat)); @@ -860,7 +905,7 @@ public class TransTypes extends TreeTranslator { Type st = types.supertype(c.type); // process superclass before derived - if (st.tag == CLASS) + if (st.hasTag(CLASS)) translateClass((ClassSymbol)st.tsym); Env myEnv = enter.typeEnvs.remove(c); diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java index 78774566915..e49e9e0234b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/JavacFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil EnumSet.of(JavaFileObject.Kind.SOURCE, JavaFileObject.Kind.CLASS); protected boolean mmappedIO; - protected boolean ignoreSymbolFile; + protected boolean symbolFileEnabled; protected enum SortFiles implements Comparator { FORWARD { @@ -142,7 +142,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil zipFileIndexCache = ZipFileIndexCache.getSharedInstance(); mmappedIO = options.isSet("mmappedIO"); - ignoreSymbolFile = options.isSet("ignore.symbol.file"); + symbolFileEnabled = !options.isSet("ignore.symbol.file"); String sf = options.get("sortFiles"); if (sf != null) { @@ -150,6 +150,13 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil } } + /** + * Set whether or not to use ct.sym as an alternate to rt.jar. + */ + public void setSymbolFileEnabled(boolean b) { + symbolFileEnabled = b; + } + @Override public boolean isDefaultBootClassPath() { return locations.isDefaultBootClassPath(); @@ -466,7 +473,7 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil */ private Archive openArchive(File zipFileName, boolean useOptimizedZip) throws IOException { File origZipFileName = zipFileName; - if (!ignoreSymbolFile && locations.isDefaultBootClassPathRtJar(zipFileName)) { + if (symbolFileEnabled && locations.isDefaultBootClassPathRtJar(zipFileName)) { File file = zipFileName.getParentFile().getParentFile(); // ${java.home} if (new File(file.getName()).equals(new File("jre"))) file = file.getParentFile(); @@ -805,8 +812,8 @@ public class JavacFileManager extends BaseFileManager implements StandardJavaFil } /** - * Enforces the specification of a "relative" URI as used in - * {@linkplain #getFileForInput(Location,String,URI) + * Enforces the specification of a "relative" name as used in + * {@linkplain #getFileForInput(Location,String,String) * getFileForInput}. This method must follow the rules defined in * that method, do not make any changes without consulting the * specification. diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java index 1e29f916742..7ee850bb4d5 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/Locations.java @@ -53,13 +53,14 @@ import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Options; import javax.tools.JavaFileManager; +import javax.tools.StandardJavaFileManager; import static javax.tools.StandardLocation.*; import static com.sun.tools.javac.main.Option.*; /** This class converts command line arguments, environment variables * and system properties (in File.pathSeparator-separated String form) * into a boot class path, user class path, and source path (in - * Collection form). + * {@code Collection} form). * *

    This is NOT part of any supported API. * If you write code that depends on this, you do so at your own risk. @@ -342,11 +343,11 @@ public class Locations { } } - /** @see JavaFileManager#handleOption. */ + /** @see JavaFileManager#handleOption */ abstract boolean handleOption(Option option, String value); - /** @see JavaFileManager#getLocation. */ + /** @see StandardJavaFileManager#getLocation */ abstract Collection getLocation(); - /** @see JavaFileManager#setLocation. */ + /** @see StandardJavaFileManager#setLocation */ abstract void setLocation(Iterable files) throws IOException; } @@ -419,14 +420,10 @@ public class Locations { if (!options.contains(option)) return false; searchPath = value == null ? null : - Collections.unmodifiableCollection(computePath(value)); + Collections.unmodifiableCollection(createPath().addFiles(value)); return true; } - protected Path computePath(String value) { - return new Path().addFiles(value); - } - @Override Collection getLocation() { return searchPath; @@ -438,10 +435,18 @@ public class Locations { if (files == null) { p = computePath(null); } else { - p = new Path().addFiles(files); + p = createPath().addFiles(files); } searchPath = Collections.unmodifiableCollection(p); } + + protected Path computePath(String value) { + return createPath().addFiles(value); + } + + protected Path createPath() { + return new Path(); + } } /** @@ -476,11 +481,15 @@ public class Locations { // Default to current working directory. if (cp == null) cp = "."; + return createPath().addFiles(cp); + } + + @Override + protected Path createPath() { return new Path() - .expandJarClassPaths(true) // Only search user jars for Class-Paths - .emptyPathDefault(new File(".")) // Empty path elt ==> current directory - .addFiles(cp); - } + .expandJarClassPaths(true) // Only search user jars for Class-Paths + .emptyPathDefault(new File(".")); // Empty path elt ==> current directory + } private void lazy() { if (searchPath == null) @@ -590,7 +599,6 @@ public class Locations { String extdirsOpt = optionValues.get(EXTDIRS); String xbootclasspathPrependOpt = optionValues.get(XBOOTCLASSPATH_PREPEND); String xbootclasspathAppendOpt = optionValues.get(XBOOTCLASSPATH_APPEND); - path.addFiles(xbootclasspathPrependOpt); if (endorseddirsOpt != null) diff --git a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java index 1ca860e95d4..dbb9f68a91f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java +++ b/langtools/src/share/classes/com/sun/tools/javac/file/ZipFileIndex.java @@ -38,7 +38,6 @@ import java.util.Calendar; import java.util.Collections; import java.util.LinkedHashMap; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; @@ -60,7 +59,7 @@ import com.sun.tools.javac.file.RelativePath.RelativeFile; * the command line.) * * Location where to look for/generate optimized zip index files can be - * provided using "-XDcachezipindexdir=". If this flag is not + * provided using "{@code -XDcachezipindexdir=}". If this flag is not * provided, the default location is the value of the "java.io.tmpdir" system * property. * diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java index b221ba5b705..f2b8ab56d16 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassReader.java @@ -55,7 +55,7 @@ import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.jvm.ClassFile.*; import static com.sun.tools.javac.jvm.ClassFile.Version.*; @@ -1018,6 +1018,15 @@ public class ClassReader implements Completer { ClassSymbol c = (ClassSymbol) sym; Name n = readName(nextChar()); c.sourcefile = new SourceFileObject(n, c.flatname); + // If the class is a toplevel class, originating from a Java source file, + // but the class name does not match the file name, then it is + // an auxiliary class. + String sn = n.toString(); + if (c.owner.kind == Kinds.PCK && + sn.endsWith(".java") && + !sn.equals(c.name.toString()+".java")) { + c.flags_field |= AUXILIARY; + } } }, @@ -1870,7 +1879,7 @@ public class ClassReader implements Completer { * `typevars'. */ protected void enterTypevars(Type t) { - if (t.getEnclosingType() != null && t.getEnclosingType().tag == CLASS) + if (t.getEnclosingType() != null && t.getEnclosingType().hasTag(CLASS)) enterTypevars(t.getEnclosingType()); for (List xs = t.getTypeArguments(); xs.nonEmpty(); xs = xs.tail) typevars.enter(xs.head.tsym); @@ -1895,7 +1904,7 @@ public class ClassReader implements Completer { // prepare type variable table typevars = typevars.dup(currentOwner); - if (ct.getEnclosingType().tag == CLASS) + if (ct.getEnclosingType().hasTag(CLASS)) enterTypevars(ct.getEnclosingType()); // read flags, or skip if this is an inner class diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java index 463ce4c07bf..bf9b0d67509 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/ClassWriter.java @@ -45,7 +45,7 @@ import com.sun.tools.javac.util.*; import static com.sun.tools.javac.code.BoundKind.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.jvm.UninitializedType.*; import static com.sun.tools.javac.main.Option.*; import static javax.tools.StandardLocation.CLASS_OUTPUT; @@ -274,7 +274,7 @@ public class ClassWriter extends ClassFile { /** Assemble signature of given type in string buffer. */ void assembleSig(Type type) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: sigbuf.appendByte('B'); break; @@ -361,13 +361,13 @@ public class ClassWriter extends ClassFile { assembleSig(types.erasure(((UninitializedType)type).qtype)); break; default: - throw new AssertionError("typeSig " + type.tag); + throw new AssertionError("typeSig " + type.getTag()); } } boolean hasTypeVar(List l) { while (l.nonEmpty()) { - if (l.head.tag == TypeTags.TYPEVAR) return true; + if (l.head.hasTag(TYPEVAR)) return true; l = l.tail; } return false; @@ -439,9 +439,9 @@ public class ClassWriter extends ClassFile { * external representation. */ public Name xClassName(Type t) { - if (t.tag == CLASS) { + if (t.hasTag(CLASS)) { return names.fromUtf(externalize(t.tsym.flatName())); - } else if (t.tag == ARRAY) { + } else if (t.hasTag(ARRAY)) { return typeSig(types.erasure(t)); } else { throw new AssertionError("xClassName"); @@ -521,7 +521,7 @@ public class ClassWriter extends ClassFile { ClassSymbol c = (ClassSymbol)value; if (c.owner.kind == TYP) pool.put(c.owner); poolbuf.appendByte(CONSTANT_Class); - if (c.type.tag == ARRAY) { + if (c.type.hasTag(ARRAY)) { poolbuf.appendChar(pool.put(typeSig(c.type))); } else { poolbuf.appendChar(pool.put(names.fromUtf(externalize(c.flatname)))); @@ -555,7 +555,7 @@ public class ClassWriter extends ClassFile { poolbuf.appendChar(pool.put(typeSig(mtype))); } else if (value instanceof Type) { Type type = (Type)value; - if (type.tag == CLASS) enterInner((ClassSymbol)type.tsym); + if (type.hasTag(CLASS)) enterInner((ClassSymbol)type.tsym); poolbuf.appendByte(CONSTANT_Class); poolbuf.appendChar(pool.put(xClassName(type))); } else if (value instanceof Pool.MethodHandle) { @@ -815,7 +815,7 @@ public class ClassWriter extends ClassFile { class AttributeWriter implements Attribute.Visitor { public void visitConstant(Attribute.Constant _value) { Object value = _value.value; - switch (_value.type.tag) { + switch (_value.type.getTag()) { case BYTE: databuf.appendByte('B'); break; @@ -901,7 +901,7 @@ public class ClassWriter extends ClassFile { System.err.println("error: " + c + ": " + ex.getMessage()); throw ex; } - if (c.type.tag != CLASS) return; // arrays + if (!c.type.hasTag(CLASS)) return; // arrays if (pool != null && // pool might be null if called from xClassName c.owner.enclClass() != null && (innerClasses == null || !innerClasses.contains(c))) { @@ -1207,7 +1207,7 @@ public class ClassWriter extends ClassFile { if (debugstackmap) System.out.print("empty"); databuf.appendByte(0); } - else switch(t.tag) { + else switch(t.getTag()) { case BYTE: case CHAR: case SHORT: @@ -1430,7 +1430,7 @@ public class ClassWriter extends ClassFile { } static boolean isInt(Type t) { - return (t.tag < TypeTags.INT || t.tag == TypeTags.BOOLEAN); + return (t.getTag().isStrictSubRangeOf(INT) || t.hasTag(BOOLEAN)); } static boolean isSameType(Type t1, Type t2, Types types) { @@ -1439,15 +1439,15 @@ public class ClassWriter extends ClassFile { if (isInt(t1) && isInt(t2)) { return true; } - if (t1.tag == UNINITIALIZED_THIS) { - return t2.tag == UNINITIALIZED_THIS; - } else if (t1.tag == UNINITIALIZED_OBJECT) { - if (t2.tag == UNINITIALIZED_OBJECT) { + if (t1.hasTag(UNINITIALIZED_THIS)) { + return t2.hasTag(UNINITIALIZED_THIS); + } else if (t1.hasTag(UNINITIALIZED_OBJECT)) { + if (t2.hasTag(UNINITIALIZED_OBJECT)) { return ((UninitializedType)t1).offset == ((UninitializedType)t2).offset; } else { return false; } - } else if (t2.tag == UNINITIALIZED_THIS || t2.tag == UNINITIALIZED_OBJECT) { + } else if (t2.hasTag(UNINITIALIZED_THIS) || t2.hasTag(UNINITIALIZED_OBJECT)) { return false; } @@ -1554,7 +1554,7 @@ public class ClassWriter extends ClassFile { databuf.appendChar(flags); databuf.appendChar(pool.put(c)); - databuf.appendChar(supertype.tag == CLASS ? pool.put(supertype.tsym) : 0); + databuf.appendChar(supertype.hasTag(CLASS) ? pool.put(supertype.tsym) : 0); databuf.appendChar(interfaces.length()); for (List l = interfaces; l.nonEmpty(); l = l.tail) databuf.appendChar(pool.put(l.head.tsym)); diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java index a3cffbc58e1..59788f2a1d5 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Code.java @@ -30,7 +30,8 @@ import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.BOT; +import static com.sun.tools.javac.code.TypeTag.INT; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.jvm.UninitializedType.*; import static com.sun.tools.javac.jvm.ClassWriter.StackMapTableFrame; @@ -224,7 +225,7 @@ public class Code { * JVM architecture). */ public static int typecode(Type type) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: return BYTEcode; case SHORT: return SHORTcode; case CHAR: return CHARcode; @@ -242,7 +243,7 @@ public class Code { case UNINITIALIZED_THIS: case UNINITIALIZED_OBJECT: return OBJECTcode; - default: throw new AssertionError("typecode " + type.tag); + default: throw new AssertionError("typecode " + type.getTag()); } } @@ -281,7 +282,7 @@ public class Code { /** Given a type, return its code for allocating arrays of that type. */ public static int arraycode(Type type) { - switch (type.tag) { + switch (type.getTag()) { case BYTE: return 8; case BOOLEAN: return 4; case SHORT: return 9; @@ -477,7 +478,7 @@ public class Code { state.pop(1); //sometimes 'null type' is treated as a one-dimensional array type //see Gen.visitLiteral - we should handle this case accordingly - Type stackType = a.tag == BOT ? + Type stackType = a.hasTag(BOT) ? syms.objectType : types.erasure(types.elemtype(a)); state.push(stackType); } @@ -1656,13 +1657,13 @@ public class Code { void push(Type t) { if (debugCode) System.err.println(" pushing " + t); - switch (t.tag) { - case TypeTags.VOID: + switch (t.getTag()) { + case VOID: return; - case TypeTags.BYTE: - case TypeTags.CHAR: - case TypeTags.SHORT: - case TypeTags.BOOLEAN: + case BYTE: + case CHAR: + case SHORT: + case BOOLEAN: t = syms.intType; break; default: @@ -1722,7 +1723,7 @@ public class Code { * of its current type. */ void forceStackTop(Type t) { if (!alive) return; - switch (t.tag) { + switch (t.getTag()) { case CLASS: case ARRAY: int width = width(t); @@ -1824,7 +1825,7 @@ public class Code { } } - static Type jsrReturnValue = new Type(TypeTags.INT, null); + static Type jsrReturnValue = new Type(INT, null); /* ************************************************************************** diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java index 9a59e0de5b6..4bbab1eb709 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/Gen.java @@ -42,7 +42,7 @@ import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.jvm.ByteCodes.*; import static com.sun.tools.javac.jvm.CRTFlags.*; import static com.sun.tools.javac.main.Option.*; @@ -258,7 +258,7 @@ public class Gen extends JCTree.Visitor { */ Symbol binaryQualifier(Symbol sym, Type site) { - if (site.tag == ARRAY) { + if (site.hasTag(ARRAY)) { if (sym == syms.lengthVar || sym.owner != syms.arrayClass) return sym; @@ -305,13 +305,13 @@ public class Gen extends JCTree.Visitor { */ int makeRef(DiagnosticPosition pos, Type type) { checkDimension(pos, type); - return pool.put(type.tag == CLASS ? (Object)type.tsym : (Object)type); + return pool.put(type.hasTag(CLASS) ? (Object)type.tsym : (Object)type); } /** Check if the given type is an array with too many dimensions. */ private void checkDimension(DiagnosticPosition pos, Type t) { - switch (t.tag) { + switch (t.getTag()) { case METHOD: checkDimension(pos, t.getReturnType()); for (List args = t.getParameterTypes(); args.nonEmpty(); args = args.tail) @@ -446,7 +446,7 @@ public class Gen extends JCTree.Visitor { * Normalizing class-members. *************************************************************************/ - /** Distribute member initializer code into constructors and + /** Distribute member initializer code into constructors and {@code } * method. * @param defs The list of class member declarations. * @param c The enclosing class. @@ -689,7 +689,7 @@ public class Gen extends JCTree.Visitor { * should be emitted, if so, put a new entry into CRTable * and call method to generate bytecode. * If not, just call method to generate bytecode. - * @see #genStat(Tree, Env) + * @see #genStat(JCTree, Env) * * @param tree The tree to be visited. * @param env The environment to use. @@ -756,7 +756,7 @@ public class Gen extends JCTree.Visitor { * should be emitted, if so, put a new entry into CRTable * and call method to generate bytecode. * If not, just call method to generate bytecode. - * @see #genCond(Tree,boolean) + * @see #genCond(JCTree,boolean) * * @param tree The tree to be visited. * @param crtFlags The CharacterRangeTable flags @@ -922,7 +922,7 @@ public class Gen extends JCTree.Visitor { if (code.isAlive()) { code.statBegin(TreeInfo.endPos(tree.body)); if (env.enclMethod == null || - env.enclMethod.sym.type.getReturnType().tag == VOID) { + env.enclMethod.sym.type.getReturnType().hasTag(VOID)) { code.emitop0(return_); } else { // sometime dead code seems alive (4415991); @@ -1110,7 +1110,7 @@ public class Gen extends JCTree.Visitor { public void visitSwitch(JCSwitch tree) { int limit = code.nextreg; - Assert.check(tree.selector.type.tag != CLASS); + Assert.check(!tree.selector.type.hasTag(CLASS)); int startpcCrt = genCrt ? code.curPc() : 0; Item sel = genExpr(tree.selector, syms.intType); List cases = tree.cases; @@ -1817,8 +1817,8 @@ public class Gen extends JCTree.Visitor { // proceeding further. if ((tree.hasTag(PLUS_ASG) || tree.hasTag(MINUS_ASG)) && l instanceof LocalItem && - tree.lhs.type.tag <= INT && - tree.rhs.type.tag <= INT && + tree.lhs.type.getTag().isSubRangeOf(INT) && + tree.rhs.type.getTag().isSubRangeOf(INT) && tree.rhs.type.constValue() != null) { int ival = ((Number) tree.rhs.type.constValue()).intValue(); if (tree.hasTag(MINUS_ASG)) ival = -ival; @@ -1969,7 +1969,7 @@ public class Gen extends JCTree.Visitor { */ void appendString(JCTree tree) { Type t = tree.type.baseType(); - if (t.tag > lastBaseTag && t.tsym != syms.stringType.tsym) { + if (!t.isPrimitive() && t.tsym != syms.stringType.tsym) { t = syms.objectType; } items.makeMemberItem(getStringBufferAppend(tree, t), false).invoke(); @@ -2067,7 +2067,7 @@ public class Gen extends JCTree.Visitor { // which is not statically a supertype of the expression's type. // For basic types, the coerce(...) in genExpr(...) will do // the conversion. - if (tree.clazz.type.tag > lastBaseTag && + if (!tree.clazz.type.isPrimitive() && types.asSuper(tree.expr.type, tree.clazz.type.tsym) == null) { code.emitop2(checkcast, makeRef(tree.pos(), tree.clazz.type)); } @@ -2185,7 +2185,7 @@ public class Gen extends JCTree.Visitor { } public void visitLiteral(JCLiteral tree) { - if (tree.type.tag == TypeTags.BOT) { + if (tree.type.hasTag(BOT)) { code.emitop0(aconst_null); if (types.dimensions(pt) > 1) { code.emitop2(checkcast, makeRef(tree.pos(), pt)); diff --git a/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java b/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java index 82ba522cd4b..73614a0c022 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java +++ b/langtools/src/share/classes/com/sun/tools/javac/jvm/UninitializedType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,8 @@ package com.sun.tools.javac.jvm; import com.sun.tools.javac.code.*; +import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_OBJECT; +import static com.sun.tools.javac.code.TypeTag.UNINITIALIZED_THIS; /** These pseudo-types appear in the generated verifier tables to * indicate objects that have been allocated but not yet constructed. @@ -37,8 +39,6 @@ import com.sun.tools.javac.code.*; * deletion without notice. */ class UninitializedType extends Type.DelegatedType { - public static final int UNINITIALIZED_THIS = TypeTags.TypeTagCount; - public static final int UNINITIALIZED_OBJECT = UNINITIALIZED_THIS + 1; public static UninitializedType uninitializedThis(Type qtype) { return new UninitializedType(UNINITIALIZED_THIS, qtype, -1); @@ -49,7 +49,7 @@ class UninitializedType extends Type.DelegatedType { } public final int offset; // PC where allocation took place - private UninitializedType(int tag, Type qtype, int offset) { + private UninitializedType(TypeTag tag, Type qtype, int offset) { super(tag, qtype); this.offset = offset; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java index 65c16f08522..b62da0f4b46 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java +++ b/langtools/src/share/classes/com/sun/tools/javac/main/JavaCompiler.java @@ -63,6 +63,7 @@ import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.Log.WriterKind; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.main.Option.*; import static com.sun.tools.javac.util.JCDiagnostic.DiagnosticFlag.*; import static com.sun.tools.javac.util.ListBuffer.lb; @@ -270,6 +271,10 @@ public class JavaCompiler implements ClassReader.SourceCompleter { */ protected TransTypes transTypes; + /** The lambda translator. + */ + protected LambdaToMethod lambdaToMethod; + /** The syntactic sugar desweetener. */ protected Lower lower; @@ -368,6 +373,8 @@ public class JavaCompiler implements ClassReader.SourceCompleter { options = Options.instance(context); + lambdaToMethod = LambdaToMethod.instance(context); + verbose = options.isSet(VERBOSE); sourceOutput = options.isSet(PRINTSOURCE); // used to be -s stubOutput = options.isSet("-stubs"); @@ -523,8 +530,10 @@ public class JavaCompiler implements ClassReader.SourceCompleter { ATTR(4), FLOW(5), TRANSTYPES(6), - LOWER(7), - GENERATE(8); + UNLAMBDA(7), + LOWER(8), + GENERATE(9); + CompileState(int value) { this.value = value; } @@ -607,7 +616,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { /** Parse contents of input stream. * @param filename The name of the file from which input stream comes. - * @param input The input stream to be parsed. + * @param content The characters to be parsed. */ protected JCCompilationUnit parse(JavaFileObject filename, CharSequence content) { long msec = now(); @@ -755,8 +764,6 @@ public class JavaCompiler implements ClassReader.SourceCompleter { /** Complete compiling a source file that has been accessed * by the class file reader. * @param c The class the source file of which needs to be compiled. - * @param filename The name of the source file. - * @param f An input stream that reads the source file. */ public void complete(ClassSymbol c) throws CompletionFailure { // System.err.println("completing " + c);//DEBUG @@ -1351,7 +1358,7 @@ public class JavaCompiler implements ClassReader.SourceCompleter { @Override public void visitClassDef(JCClassDecl node) { Type st = types.supertype(node.sym.type); - if (st.tag == TypeTags.CLASS) { + if (st.hasTag(CLASS)) { ClassSymbol c = st.tsym.outermostClass(); Env stEnv = enter.getEnv(c); if (stEnv != null && env != stEnv) { @@ -1419,6 +1426,12 @@ public class JavaCompiler implements ClassReader.SourceCompleter { env.tree = transTypes.translateTopLevelClass(env.tree, localMake); compileStates.put(env, CompileState.TRANSTYPES); + if (shouldStop(CompileState.UNLAMBDA)) + return; + + env.tree = lambdaToMethod.translateTopLevelClass(env, env.tree, localMake); + compileStates.put(env, CompileState.UNLAMBDA); + if (shouldStop(CompileState.LOWER)) return; diff --git a/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java b/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java index 92e1c1790e1..dd86ec20978 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javac/model/AnnotationProxyMaker.java @@ -25,9 +25,8 @@ package com.sun.tools.javac.model; -import com.sun.tools.javac.util.*; -import java.io.ObjectInputStream; import java.io.IOException; +import java.io.ObjectInputStream; import java.lang.annotation.*; import java.lang.reflect.Array; import java.lang.reflect.Method; @@ -35,12 +34,14 @@ import java.util.LinkedHashMap; import java.util.Map; import sun.reflect.annotation.*; -import javax.lang.model.type.TypeMirror; import javax.lang.model.type.MirroredTypeException; import javax.lang.model.type.MirroredTypesException; +import javax.lang.model.type.TypeMirror; + import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type.ArrayType; +import com.sun.tools.javac.util.*; /** diff --git a/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java b/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java index 4f036bd9d17..168cef93e72 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java +++ b/langtools/src/share/classes/com/sun/tools/javac/model/JavacElements.java @@ -38,7 +38,7 @@ import static javax.lang.model.util.ElementFilter.methodsIn; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.code.TypeTags; +import com.sun.tools.javac.code.TypeTag; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Enter; import com.sun.tools.javac.comp.Env; @@ -50,6 +50,7 @@ import com.sun.tools.javac.tree.TreeInfo; import com.sun.tools.javac.tree.TreeScanner; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.Name; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** @@ -124,7 +125,7 @@ public class JavacElements implements Elements { if (result != null || !inherited) break; Type sup = annotated.getSuperclass(); - if (sup.tag != TypeTags.CLASS || sup.isErroneous()) + if (!sup.hasTag(CLASS) || sup.isErroneous()) break; annotated = (ClassSymbol) sup.tsym; } @@ -444,7 +445,7 @@ public class JavacElements implements Elements { List annos = sym.getAnnotationMirrors(); while (sym.getKind() == ElementKind.CLASS) { Type sup = ((ClassSymbol) sym).getSuperclass(); - if (sup.tag != TypeTags.CLASS || sup.isErroneous() || + if (!sup.hasTag(CLASS) || sup.isErroneous() || sup.tsym == syms.objectType.tsym) { break; } diff --git a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java index 4aff5616231..762b8ed21fe 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,14 @@ package com.sun.tools.javac.nio; import java.io.IOException; import java.nio.file.FileSystem; +import java.nio.file.FileSystems; import java.nio.file.Path; import javax.tools.FileObject; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; /** - * File manager based on {@linkplain File java.nio.file.Path}. + * File manager based on {@link java.nio.file.Path}. * * Eventually, this should be moved to javax.tools. * Also, JavaCompiler might reasonably provide a method getPathFileManager, diff --git a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java index a46e639ae16..357fc77f40b 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java +++ b/langtools/src/share/classes/com/sun/tools/javac/nio/PathFileObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2009, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2009, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,6 @@ import java.nio.charset.CharsetDecoder; import java.nio.file.Files; import java.nio.file.LinkOption; import java.nio.file.Path; -import java.nio.file.attribute.BasicFileAttributes; import javax.lang.model.element.Modifier; import javax.lang.model.element.NestingKind; import javax.tools.JavaFileObject; diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java index 7b6ca57cc34..2048c1cd48a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavaTokenizer.java @@ -108,8 +108,7 @@ public class JavaTokenizer { * {@code input[input.length -1]} is a white space character. * * @param fac the factory which created this Scanner - * @param input the input, might be modified - * @param inputLength the size of the input. + * @param buf the input, might be modified * Must be positive and less than or equal to input.length. */ protected JavaTokenizer(ScannerFactory fac, CharBuffer buf) { @@ -663,7 +662,10 @@ public class JavaTokenizer { tk = TokenKind.EOF; pos = reader.buflen; } else { - lexError(pos, "illegal.char", String.valueOf((int)reader.ch)); + String arg = (32 < reader.ch && reader.ch < 127) ? + String.format("%s", reader.ch) : + String.format("\\u%04x", (int)reader.ch); + lexError(pos, "illegal.char", arg); reader.scanChar(); } } diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java index aac80c53fe2..7e71133db60 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java @@ -116,6 +116,8 @@ public class JavacParser implements Parser { fac.options.isSet("allowLambda"); //pre-lambda guard this.allowMethodReferences = source.allowMethodReferences() && fac.options.isSet("allowMethodReferences"); //pre-lambda guard + this.allowDefaultMethods = source.allowDefaultMethods() && + fac.options.isSet("allowDefaultMethods"); //pre-lambda guard this.keepDocComments = keepDocComments; docComments = newDocCommentTable(keepDocComments); this.keepLineMap = keepLineMap; @@ -185,6 +187,10 @@ public class JavacParser implements Parser { */ boolean allowMethodReferences; + /** Switch: should we allow default methods in interfaces? + */ + boolean allowDefaultMethods; + /** Switch: should we keep docComments? */ boolean keepDocComments; @@ -554,7 +560,7 @@ public class JavacParser implements Parser { case INTLITERAL: try { t = F.at(pos).Literal( - TypeTags.INT, + TypeTag.INT, Convert.string2int(strval(prefix), token.radix())); } catch (NumberFormatException ex) { error(token.pos, "int.number.too.large", strval(prefix)); @@ -563,7 +569,7 @@ public class JavacParser implements Parser { case LONGLITERAL: try { t = F.at(pos).Literal( - TypeTags.LONG, + TypeTag.LONG, new Long(Convert.string2long(strval(prefix), token.radix()))); } catch (NumberFormatException ex) { error(token.pos, "int.number.too.large", strval(prefix)); @@ -585,7 +591,7 @@ public class JavacParser implements Parser { else if (n.floatValue() == Float.POSITIVE_INFINITY) error(token.pos, "fp.number.too.large"); else - t = F.at(pos).Literal(TypeTags.FLOAT, n); + t = F.at(pos).Literal(TypeTag.FLOAT, n); break; } case DOUBLELITERAL: { @@ -604,27 +610,27 @@ public class JavacParser implements Parser { else if (n.doubleValue() == Double.POSITIVE_INFINITY) error(token.pos, "fp.number.too.large"); else - t = F.at(pos).Literal(TypeTags.DOUBLE, n); + t = F.at(pos).Literal(TypeTag.DOUBLE, n); break; } case CHARLITERAL: t = F.at(pos).Literal( - TypeTags.CHAR, + TypeTag.CHAR, token.stringVal().charAt(0) + 0); break; case STRINGLITERAL: t = F.at(pos).Literal( - TypeTags.CLASS, + TypeTag.CLASS, token.stringVal()); break; case TRUE: case FALSE: t = F.at(pos).Literal( - TypeTags.BOOLEAN, + TypeTag.BOOLEAN, (token.kind == TRUE ? 1 : 0)); break; case NULL: t = F.at(pos).Literal( - TypeTags.BOT, + TypeTag.BOT, null); break; default: @@ -806,9 +812,9 @@ public class JavacParser implements Parser { t = odStack[0]; if (t.hasTag(JCTree.Tag.PLUS)) { - StringBuffer buf = foldStrings(t); + StringBuilder buf = foldStrings(t); if (buf != null) { - t = toP(F.at(startPos).Literal(TypeTags.CLASS, buf.toString())); + t = toP(F.at(startPos).Literal(TypeTag.CLASS, buf.toString())); } } @@ -833,16 +839,16 @@ public class JavacParser implements Parser { /** If tree is a concatenation of string literals, replace it * by a single literal representing the concatenated string. */ - protected StringBuffer foldStrings(JCTree tree) { + protected StringBuilder foldStrings(JCTree tree) { if (!allowStringFolding) return null; List buf = List.nil(); while (true) { if (tree.hasTag(LITERAL)) { JCLiteral lit = (JCLiteral) tree; - if (lit.typetag == TypeTags.CLASS) { - StringBuffer sbuf = - new StringBuffer((String)lit.value); + if (lit.typetag == TypeTag.CLASS) { + StringBuilder sbuf = + new StringBuilder((String)lit.value); while (buf.nonEmpty()) { sbuf.append(buf.head); buf = buf.tail; @@ -853,7 +859,7 @@ public class JavacParser implements Parser { JCBinary op = (JCBinary)tree; if (op.rhs.hasTag(LITERAL)) { JCLiteral lit = (JCLiteral) op.rhs; - if (lit.typetag == TypeTags.CLASS) { + if (lit.typetag == TypeTag.CLASS) { buf = buf.prepend((String) lit.value); tree = op.lhs; continue; @@ -1205,7 +1211,7 @@ public class JavacParser implements Parser { if ((mode & EXPR) != 0) { nextToken(); if (token.kind == DOT) { - JCPrimitiveTypeTree ti = toP(F.at(pos).TypeIdent(TypeTags.VOID)); + JCPrimitiveTypeTree ti = toP(F.at(pos).TypeIdent(TypeTag.VOID)); t = bracketsSuffix(ti); } else { return illegal(pos); @@ -1214,7 +1220,7 @@ public class JavacParser implements Parser { // Support the corner case of myMethodHandle.invoke() by passing // a void type (like other primitive types) to the next phase. // The error will be reported in Attr.attribTypes or Attr.visitApply. - JCPrimitiveTypeTree ti = to(F.at(pos).TypeIdent(TypeTags.VOID)); + JCPrimitiveTypeTree ti = to(F.at(pos).TypeIdent(TypeTag.VOID)); nextToken(); return ti; //return illegal(); @@ -2311,6 +2317,7 @@ public class JavacParser implements Parser { case SYNCHRONIZED: flag = Flags.SYNCHRONIZED; break; case STRICTFP : flag = Flags.STRICTFP; break; case MONKEYS_AT : flag = Flags.ANNOTATION; break; + case DEFAULT : checkDefaultMethods(); flag = Flags.DEFAULT; break; case ERROR : flag = 0; nextToken(); break; default: break loop; } @@ -2913,7 +2920,7 @@ public class JavacParser implements Parser { JCExpression type; boolean isVoid = token.kind == VOID; if (isVoid) { - type = to(F.at(pos).TypeIdent(TypeTags.VOID)); + type = to(F.at(pos).TypeIdent(TypeTag.VOID)); nextToken(); } else { type = parseType(); @@ -3276,28 +3283,28 @@ public class JavacParser implements Parser { } /** Return type tag of basic type represented by token, - * -1 if token is not a basic type identifier. + * NONE if token is not a basic type identifier. */ - static int typetag(TokenKind token) { + static TypeTag typetag(TokenKind token) { switch (token) { case BYTE: - return TypeTags.BYTE; + return TypeTag.BYTE; case CHAR: - return TypeTags.CHAR; + return TypeTag.CHAR; case SHORT: - return TypeTags.SHORT; + return TypeTag.SHORT; case INT: - return TypeTags.INT; + return TypeTag.INT; case LONG: - return TypeTags.LONG; + return TypeTag.LONG; case FLOAT: - return TypeTags.FLOAT; + return TypeTag.FLOAT; case DOUBLE: - return TypeTags.DOUBLE; + return TypeTag.DOUBLE; case BOOLEAN: - return TypeTags.BOOLEAN; + return TypeTag.BOOLEAN; default: - return -1; + return TypeTag.NONE; } } @@ -3361,6 +3368,12 @@ public class JavacParser implements Parser { allowMethodReferences = true; } } + void checkDefaultMethods() { + if (!allowDefaultMethods) { + log.error(token.pos, "default.methods.not.supported.in.source", source.name); + allowDefaultMethods = true; + } + } /* * a functional source tree and end position mappings diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java b/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java index 93b2e8adecf..20c49e6cfc2 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/Scanner.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,8 +66,7 @@ public class Scanner implements Lexer { * {@code input[input.length -1]} is a white space character. * * @param fac the factory which created this Scanner - * @param input the input, might be modified - * @param inputLength the size of the input. + * @param buf the input, might be modified * Must be positive and less than or equal to input.length. */ protected Scanner(ScannerFactory fac, CharBuffer buf) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java b/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java index 07b8c5cda8b..84e6792cdd1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java +++ b/langtools/src/share/classes/com/sun/tools/javac/parser/UnicodeReader.java @@ -77,9 +77,8 @@ public class UnicodeReader { * that {@code inputLength < input.length} or * {@code input[input.length -1]} is a white space character. * - * @param fac the factory which created this Scanner - * @param input the input, might be modified - * @param inputLength the size of the input. + * @param sf the factory which created this Scanner + * @param buffer the input, might be modified * Must be positive and less than or equal to input.length. */ protected UnicodeReader(ScannerFactory sf, CharBuffer buffer) { @@ -255,16 +254,16 @@ public class UnicodeReader { /** * Returns a copy of a character array subset of the input buffer. - * The returned array begins at the beginIndex and - * extends to the character at index endIndex - 1. - * Thus the length of the substring is endIndex-beginIndex. + * The returned array begins at the {@code beginIndex} and + * extends to the character at index {@code endIndex - 1}. + * Thus the length of the substring is {@code endIndex-beginIndex}. * This behavior is like - * String.substring(beginIndex, endIndex). + * {@code String.substring(beginIndex, endIndex)}. * Unicode escape sequences are not translated. * * @param beginIndex the beginning index, inclusive. * @param endIndex the ending index, exclusive. - * @throws IndexOutOfBounds if either offset is outside of the + * @throws ArrayIndexOutOfBoundsException if either offset is outside of the * array bounds */ public char[] getRawCharacters(int beginIndex, int endIndex) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java index 18779a25ceb..157f7eb0125 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/JavacRoundEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -105,7 +105,7 @@ public class JavacRoundEnvironment implements RoundEnvironment { * Only type elements included in this round of annotation * processing, or declarations of members, parameters, or type * parameters declared within those, are returned. Included type - * elements are {@linkplain #getSpecifiedTypeElements specified + * elements are {@linkplain #getRootElements specified * types} and any types nested within them. * * @param a annotation type being requested diff --git a/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java b/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java index e3cd7ade45a..ea6d9a07dae 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java +++ b/langtools/src/share/classes/com/sun/tools/javac/processing/ServiceProxy.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -72,7 +72,7 @@ class ServiceProxy { * The service class for which providers are being sought; * used to construct error detail strings * - * @param url + * @param u * The URL naming the configuration file to be parsed * * @return true if the name of a service is found diff --git a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties index 5140de268de..e8dd77889cc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties +++ b/langtools/src/share/classes/com/sun/tools/javac/resources/compiler.properties @@ -475,7 +475,7 @@ compiler.err.icls.cant.have.static.decl=\ # 0: string compiler.err.illegal.char=\ - illegal character: \\{0} + illegal character: ''{0}'' compiler.err.illegal.char.for.encoding=\ unmappable character for encoding {0} @@ -1847,6 +1847,11 @@ compiler.misc.varargs.argument.mismatch=\ ##### +# 0: type, 1: file name +compiler.warn.auxiliary.class.accessed.from.outside.of.its.source.file=\ + auxiliary class {0} in {1} should not be accessed from outside its own source file + + ## The first argument ({0}) is a "kindname". # 0: symbol kind, 1: symbol, 2: symbol compiler.err.abstract.cant.be.accessed.directly=\ @@ -2174,6 +2179,11 @@ compiler.err.method.references.not.supported.in.source=\ method references are not supported in -source {0}\n\ (use -source 8 or higher to enable method references) +# 0: string +compiler.err.default.methods.not.supported.in.source=\ + default methods are not supported in -source {0}\n\ + (use -source 8 or higher to enable default methods) + ######################################## # Diagnostics for verbose resolution # used by Resolve (debug only) diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java index 3494f3b52cf..22926654a00 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/JCTree.java @@ -81,7 +81,7 @@ import static com.sun.tools.javac.tree.JCTree.Tag.*; public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /* Tree tag values, identifying kinds of trees */ - public enum Tag{ + public enum Tag { /** For methods that return an invalid tag if a given condition is not met */ NO_TAG, @@ -464,32 +464,29 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { } /** - * Everything in one source file is kept in a TopLevel structure. - * @param pid The tree representing the package clause. - * @param sourcefile The source file name. - * @param defs All definitions in this file (ClassDef, Import, and Skip) - * @param packge The package it belongs to. - * @param namedImportScope A scope for all named imports. - * @param starImportScope A scope for all import-on-demands. - * @param lineMap Line starting positions, defined only - * if option -g is set. - * @param docComments A hashtable that stores all documentation comments - * indexed by the tree nodes they refer to. - * defined only if option -s is set. - * @param endPositions An object encapsulating ending positions of source - * ranges indexed by the tree nodes they belong to. - * Defined only if option -Xjcov is set. + * Everything in one source file is kept in a {@linkplain JCCompilationUnit} structure. */ public static class JCCompilationUnit extends JCTree implements CompilationUnitTree { public List packageAnnotations; + /** The tree representing the package clause. */ public JCExpression pid; + /** All definitions in this file (ClassDef, Import, and Skip) */ public List defs; + /* The source file name. */ public JavaFileObject sourcefile; + /** The package to which this compilation unit belongs. */ public PackageSymbol packge; + /** A scope for all named imports. */ public ImportScope namedImportScope; + /** A scope for all import-on-demands. */ public StarImportScope starImportScope; + /** Line starting positions, defined only if option -g is set. */ public Position.LineMap lineMap = null; + /** A table that stores all documentation comments indexed by the tree + * nodes they refer to. defined only if option -s is set. */ public DocCommentTable docComments = null; + /* An object encapsulating ending positions of source ranges indexed by + * the tree nodes they belong to. Defined only if option -Xjcov is set. */ public EndPosTable endPositions = null; protected JCCompilationUnit(List packageAnnotations, JCExpression pid, @@ -550,10 +547,10 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * An import clause. - * @param qualid The imported class(es). */ public static class JCImport extends JCTree implements ImportTree { public boolean staticImport; + /** The imported class(es). */ public JCTree qualid; protected JCImport(JCTree qualid, boolean importStatic) { this.qualid = qualid; @@ -605,21 +602,21 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A class definition. - * @param modifiers the modifiers - * @param name the name of the class - * @param typarams formal class parameters - * @param extending the classes this class extends - * @param implementing the interfaces implemented by this class - * @param defs all variables and methods defined in this class - * @param sym the symbol */ public static class JCClassDecl extends JCStatement implements ClassTree { + /** the modifiers */ public JCModifiers mods; + /** the name of the class */ public Name name; + /** formal class parameters */ public List typarams; + /** the classes this class extends */ public JCExpression extending; + /** the interfaces implemented by this class */ public List implementing; + /** all variables and methods defined in this class */ public List defs; + /** the symbol */ public ClassSymbol sym; protected JCClassDecl(JCModifiers mods, Name name, @@ -676,24 +673,25 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A method definition. - * @param modifiers method modifiers - * @param name method name - * @param restype type of method return value - * @param typarams type parameters - * @param params value parameters - * @param thrown exceptions thrown by this method - * @param stats statements in the method - * @param sym method symbol */ public static class JCMethodDecl extends JCTree implements MethodTree { + /** method modifiers */ public JCModifiers mods; + /** method name */ public Name name; + /** type of method return value */ public JCExpression restype; + /** type parameters */ public List typarams; + /** value parameters */ public List params; + /** exceptions thrown by this method */ public List thrown; + /** statements in the method */ public JCBlock body; - public JCExpression defaultValue; // for annotation types + /** default value, for annotation types */ + public JCExpression defaultValue; + /** method symbol */ public MethodSymbol sym; protected JCMethodDecl(JCModifiers mods, Name name, @@ -748,17 +746,17 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A variable definition. - * @param modifiers variable modifiers - * @param name variable name - * @param vartype type of the variable - * @param init variables initial value - * @param sym symbol */ public static class JCVariableDecl extends JCStatement implements VariableTree { + /** variable modifiers */ public JCModifiers mods; + /** variable name */ public Name name; + /** type of the variable */ public JCExpression vartype; + /** variable's initial value */ public JCExpression init; + /** symbol */ public VarSymbol sym; protected JCVariableDecl(JCModifiers mods, Name name, @@ -815,11 +813,11 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A statement block. - * @param stats statements - * @param flags flags */ public static class JCBlock extends JCStatement implements BlockTree { + /** flags */ public long flags; + /** statements */ public List stats; /** Position of closing brace, optional. */ public int endpos = Position.NOPOS; @@ -1206,9 +1204,9 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * an expression statement - * @param expr expression structure */ public static class JCExpressionStatement extends JCStatement implements ExpressionStatementTree { + /** expression structure */ public JCExpression expr; protected JCExpressionStatement(JCExpression expr) { @@ -1776,13 +1774,13 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * Selects through packages and classes - * @param selected selected Tree hierarchie - * @param selector name of field to select thru - * @param sym symbol of the selected class */ public static class JCFieldAccess extends JCExpression implements MemberSelectTree { + /** selected Tree hierarchy */ public JCExpression selected; + /** name of field to select thru */ public Name name; + /** symbol of the selected class */ public Symbol sym; protected JCFieldAccess(JCExpression selected, Name name, Symbol sym) { this.selected = selected; @@ -1885,11 +1883,11 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * An identifier - * @param idname the name - * @param sym the symbol */ public static class JCIdent extends JCExpression implements IdentifierTree { + /** the name */ public Name name; + /** the symbol */ public Symbol sym; protected JCIdent(Name name, Symbol sym) { this.name = name; @@ -1912,12 +1910,12 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A constant value given literally. - * @param value value representation */ public static class JCLiteral extends JCExpression implements LiteralTree { - public int typetag; + public TypeTag typetag; + /** value representation */ public Object value; - protected JCLiteral(int typetag, Object value) { + protected JCLiteral(TypeTag typetag, Object value) { this.typetag = typetag; this.value = value; } @@ -1925,33 +1923,15 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { public void accept(Visitor v) { v.visitLiteral(this); } public Kind getKind() { - switch (typetag) { - case TypeTags.INT: - return Kind.INT_LITERAL; - case TypeTags.LONG: - return Kind.LONG_LITERAL; - case TypeTags.FLOAT: - return Kind.FLOAT_LITERAL; - case TypeTags.DOUBLE: - return Kind.DOUBLE_LITERAL; - case TypeTags.BOOLEAN: - return Kind.BOOLEAN_LITERAL; - case TypeTags.CHAR: - return Kind.CHAR_LITERAL; - case TypeTags.CLASS: - return Kind.STRING_LITERAL; - case TypeTags.BOT: - return Kind.NULL_LITERAL; - default: - throw new AssertionError("unknown literal kind " + this); - } + return typetag.getKindLiteral(); } + public Object getValue() { switch (typetag) { - case TypeTags.BOOLEAN: + case BOOLEAN: int bi = (Integer) value; return (bi != 0); - case TypeTags.CHAR: + case CHAR: int ci = (Integer) value; char c = (char) ci; if (c != ci) @@ -1978,12 +1958,12 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * Identifies a basic type. - * @param tag the basic type id - * @see TypeTags + * @see TypeTag */ public static class JCPrimitiveTypeTree extends JCExpression implements PrimitiveTypeTree { - public int typetag; - protected JCPrimitiveTypeTree(int typetag) { + /** the basic type id */ + public TypeTag typetag; + protected JCPrimitiveTypeTree(TypeTag typetag) { this.typetag = typetag; } @Override @@ -1991,29 +1971,9 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { public Kind getKind() { return Kind.PRIMITIVE_TYPE; } public TypeKind getPrimitiveTypeKind() { - switch (typetag) { - case TypeTags.BOOLEAN: - return TypeKind.BOOLEAN; - case TypeTags.BYTE: - return TypeKind.BYTE; - case TypeTags.SHORT: - return TypeKind.SHORT; - case TypeTags.INT: - return TypeKind.INT; - case TypeTags.LONG: - return TypeKind.LONG; - case TypeTags.CHAR: - return TypeKind.CHAR; - case TypeTags.FLOAT: - return TypeKind.FLOAT; - case TypeTags.DOUBLE: - return TypeKind.DOUBLE; - case TypeTags.VOID: - return TypeKind.VOID; - default: - throw new AssertionError("unknown primitive type " + this); - } + return typetag.getPrimitiveTypeKind(); } + @Override public R accept(TreeVisitor v, D d) { return v.visitPrimitiveType(this, d); @@ -2105,11 +2065,11 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { /** * A formal class parameter. - * @param name name - * @param bounds bounds */ public static class JCTypeParameter extends JCTree implements TypeParameterTree { + /** name */ public Name name; + /** bounds */ public List bounds; protected JCTypeParameter(Name name, List bounds) { this.name = name; @@ -2163,7 +2123,7 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { } @Override public Tag getTag() { - return WILDCARD; + return Tag.WILDCARD; } } @@ -2364,8 +2324,8 @@ public abstract class JCTree implements Tree, Cloneable, DiagnosticPosition { JCArrayAccess Indexed(JCExpression indexed, JCExpression index); JCFieldAccess Select(JCExpression selected, Name selector); JCIdent Ident(Name idname); - JCLiteral Literal(int tag, Object value); - JCPrimitiveTypeTree TypeIdent(int typetag); + JCLiteral Literal(TypeTag tag, Object value); + JCPrimitiveTypeTree TypeIdent(TypeTag typetag); JCArrayTypeTree TypeArray(JCExpression elemtype); JCTypeApply TypeApply(JCExpression clazz, List arguments); JCTypeParameter TypeParameter(Name name, List bounds); diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java index 04f4d47c3a9..5fc31dc733f 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/Pretty.java @@ -26,12 +26,10 @@ package com.sun.tools.javac.tree; import java.io.*; -import java.util.*; import com.sun.source.tree.MemberReferenceTree.ReferenceMode; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.parser.Tokens.Comment; import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.List; @@ -250,7 +248,7 @@ public class Pretty extends JCTree.Visitor { public void printFlags(long flags) throws IOException { if ((flags & SYNTHETIC) != 0) print("/*synthetic*/ "); print(TreeInfo.flagNames(flags)); - if ((flags & StandardFlags) != 0) print(" "); + if ((flags & ExtendedStandardFlags) != 0) print(" "); if ((flags & ANNOTATION) != 0) print("@"); } @@ -1135,28 +1133,28 @@ public class Pretty extends JCTree.Visitor { public void visitLiteral(JCLiteral tree) { try { switch (tree.typetag) { - case TypeTags.INT: + case INT: print(tree.value.toString()); break; - case TypeTags.LONG: + case LONG: print(tree.value + "L"); break; - case TypeTags.FLOAT: + case FLOAT: print(tree.value + "F"); break; - case TypeTags.DOUBLE: + case DOUBLE: print(tree.value.toString()); break; - case TypeTags.CHAR: + case CHAR: print("\'" + Convert.quote( String.valueOf((char)((Number)tree.value).intValue())) + "\'"); break; - case TypeTags.BOOLEAN: + case BOOLEAN: print(((Number)tree.value).intValue() == 1 ? "true" : "false"); break; - case TypeTags.BOT: + case BOT: print("null"); break; default: @@ -1171,31 +1169,31 @@ public class Pretty extends JCTree.Visitor { public void visitTypeIdent(JCPrimitiveTypeTree tree) { try { switch(tree.typetag) { - case TypeTags.BYTE: + case BYTE: print("byte"); break; - case TypeTags.CHAR: + case CHAR: print("char"); break; - case TypeTags.SHORT: + case SHORT: print("short"); break; - case TypeTags.INT: + case INT: print("int"); break; - case TypeTags.LONG: + case LONG: print("long"); break; - case TypeTags.FLOAT: + case FLOAT: print("float"); break; - case TypeTags.DOUBLE: + case DOUBLE: print("double"); break; - case TypeTags.BOOLEAN: + case BOOLEAN: print("boolean"); break; - case TypeTags.VOID: + case VOID: print("void"); break; default: diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java index 120bf2ae434..a68c719a7dc 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeInfo.java @@ -34,6 +34,7 @@ import com.sun.tools.javac.tree.JCTree.*; import com.sun.tools.javac.util.*; import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition; import static com.sun.tools.javac.code.Flags.*; +import static com.sun.tools.javac.code.TypeTag.BOT; import static com.sun.tools.javac.tree.JCTree.Tag.*; import static com.sun.tools.javac.tree.JCTree.Tag.BLOCK; import static com.sun.tools.javac.tree.JCTree.Tag.SYNCHRONIZED; @@ -300,7 +301,7 @@ public class TreeInfo { if (!tree.hasTag(LITERAL)) return false; JCLiteral lit = (JCLiteral) tree; - return (lit.typetag == TypeTags.BOT); + return (lit.typetag == BOT); } public static String getCommentText(Env env, JCTree tree) { @@ -790,8 +791,8 @@ public class TreeInfo { * pre: flags != 0 */ public static long firstFlag(long flags) { - int flag = 1; - while ((flag & StandardFlags) != 0 && (flag & flags) == 0) + long flag = 1; + while ((flag & flags & ExtendedStandardFlags) == 0) flag = flag << 1; return flag; } @@ -799,7 +800,7 @@ public class TreeInfo { /** Return flags as a string, separated by " ". */ public static String flagNames(long flags) { - return Flags.toString(flags & StandardFlags).trim(); + return Flags.toString(flags & ExtendedStandardFlags).trim(); } /** Operator precedences values. diff --git a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java index 25f064ec85b..3182d6ed954 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java @@ -35,7 +35,7 @@ import com.sun.tools.javac.tree.JCTree.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.code.Kinds.*; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; /** Factory class for trees. * @@ -426,13 +426,13 @@ public class TreeMaker implements JCTree.Factory { return tree; } - public JCLiteral Literal(int tag, Object value) { + public JCLiteral Literal(TypeTag tag, Object value) { JCLiteral tree = new JCLiteral(tag, value); tree.pos = pos; return tree; } - public JCPrimitiveTypeTree TypeIdent(int typetag) { + public JCPrimitiveTypeTree TypeIdent(TypeTag typetag) { JCPrimitiveTypeTree tree = new JCPrimitiveTypeTree(typetag); tree.pos = pos; return tree; @@ -629,10 +629,10 @@ public class TreeMaker implements JCTree.Factory { public JCExpression Type(Type t) { if (t == null) return null; JCExpression tp; - switch (t.tag) { + switch (t.getTag()) { case BYTE: case CHAR: case SHORT: case INT: case LONG: case FLOAT: case DOUBLE: case BOOLEAN: case VOID: - tp = TypeIdent(t.tag); + tp = TypeIdent(t.getTag()); break; case TYPEVAR: tp = Ident(t.tsym); @@ -644,7 +644,7 @@ public class TreeMaker implements JCTree.Factory { } case CLASS: Type outer = t.getEnclosingType(); - JCExpression clazz = outer.tag == CLASS && t.tsym.owner.kind == TYP + JCExpression clazz = outer.hasTag(CLASS) && t.tsym.owner.kind == TYP ? Select(Type(outer), t.tsym) : QualIdent(t.tsym); tp = t.getTypeArguments().isEmpty() @@ -849,7 +849,7 @@ public class TreeMaker implements JCTree.Factory { * depending on whether the method invocation expression's type is void. */ public JCStatement Call(JCExpression apply) { - return apply.type.tag == VOID ? Exec(apply) : Return(apply); + return apply.type.hasTag(VOID) ? Exec(apply) : Return(apply); } /** Construct an assignment from a variable symbol and a right hand side. diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java index cec43bdd412..06e6e46d76c 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractDiagnosticFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -484,7 +484,7 @@ public abstract class AbstractDiagnosticFormatter implements DiagnosticFormatter /** * Tells whether the caret display is active or not. * - * @param caretEnabled if true the caret is enabled + * @return true if the caret is enabled */ public boolean isCaretEnabled() { return caretEnabled; diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java index ca25a5b3636..07f244a94d2 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/AbstractLog.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -132,7 +132,6 @@ public abstract class AbstractLog { /** Report a warning, unless suppressed by the -nowarn option or the * maximum number of warnings has been reached. - * @param pos The source position at which to report the warning. * @param key The key for the localized warning message. * @param args Fields of the warning message. */ diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java index cec4b954b4e..7b12009695a 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/BasicDiagnosticFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -69,7 +69,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { /** * Create a basic formatter based on the supplied options. * - * @param opts list of command-line options + * @param options list of command-line options * @param msgs JavacMessages object used for i18n */ public BasicDiagnosticFormatter(Options options, JavacMessages msgs) { @@ -329,7 +329,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { * Set the indentation level for various element of a given diagnostic - * this might lead to more readable diagnostics * - * @param indentationKind kind of indentation to be set + * @param diagPart * @param nSpaces amount of spaces for the specified diagnostic part */ public void setIndentation(DiagnosticPart diagPart, int nSpaces) { @@ -384,7 +384,7 @@ public class BasicDiagnosticFormatter extends AbstractDiagnosticFormatter { /** * Get a metachar string for a specific format * - * @param sourcePos a positioning value for source line + * @param kind the format kind for which to get the metachar string */ public String getFormat(BasicFormatKind kind) { return availableFormats.get(kind); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java b/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java index 36a473df5c7..30753d7dfec 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Constants.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,8 +27,6 @@ package com.sun.tools.javac.util; import com.sun.tools.javac.code.Type; -import static com.sun.tools.javac.code.TypeTags.*; - /** * Utilities for operating on constant values. * @@ -48,7 +46,7 @@ public class Constants { public static Object decode(Object value, Type type) { if (value instanceof Integer) { int i = (Integer) value; - switch (type.tag) { + switch (type.getTag()) { case BOOLEAN: return i != 0; case CHAR: return (char) i; case BYTE: return (byte) i; @@ -64,7 +62,7 @@ public class Constants { */ public static String format(Object value, Type type) { value = decode(value, type); - switch (type.tag) { + switch (type.getTag()) { case BYTE: return formatByte((Byte) value); case LONG: return formatLong((Long) value); case FLOAT: return formatFloat((Float) value); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Context.java b/langtools/src/share/classes/com/sun/tools/javac/util/Context.java index 91a4e6340ca..93026633f34 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Context.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Context.java @@ -44,7 +44,7 @@ import java.util.*; * instance method that is overridden in extended components. A base * phase supporting extension would look something like this: * - *

    + * 

    {@code
      * public class Phase {
      *     protected static final Context.Key phaseKey =
      *         new Context.Key();
    @@ -62,7 +62,7 @@ import java.util.*;
      *         // other intitialization follows...
      *     }
      * }
    - * 
    + * }
    * *

    In the compiler, we simply use Phase.instance(context) to get * the reference to the phase. But in extensions of the compiler, we @@ -70,7 +70,7 @@ import java.util.*; * and this must be done before any reference to the phase is accessed * using Phase.instance(). An extended phase might be declared thus: * - *

    + * 

    {@code
      * public class NewPhase extends Phase {
      *     protected NewPhase(Context context) {
      *         super(context);
    @@ -83,7 +83,7 @@ import java.util.*;
      *         });
      *     }
      * }
    - * 
    + * }
    * *

    And is registered early in the extended compiler like this * diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Convert.java b/langtools/src/share/classes/com/sun/tools/javac/util/Convert.java index 0c9f2542b36..b2253aab2e7 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Convert.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Convert.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -260,7 +260,7 @@ public class Convert { while (i < len) { char ch = s.charAt(i); if (ch > 255) { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append(s.substring(0, i)); while (i < len) { ch = s.charAt(i); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java b/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java index d8c94def6ee..7f1bad3b163 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/DiagnosticSource.java @@ -28,12 +28,10 @@ package com.sun.tools.javac.util; import java.io.IOException; import java.lang.ref.SoftReference; import java.nio.CharBuffer; -import java.util.Map; import javax.tools.JavaFileObject; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.tree.EndPosTable; -import com.sun.tools.javac.tree.JCTree; import static com.sun.tools.javac.util.LayoutCharacters.*; diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java index 770ee0ba18b..17ce2319dc1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/JCDiagnostic.java @@ -27,7 +27,6 @@ package com.sun.tools.javac.util; import java.util.EnumSet; import java.util.Locale; -import java.util.Map; import java.util.Set; import javax.tools.Diagnostic; @@ -214,7 +213,6 @@ public class JCDiagnostic implements Diagnostic { * Create a new diagnostic of the given kind, which is not mandatory and which has * no lint category. * @param kind The diagnostic kind - * @param ls The lint category, if applicable, or null * @param source The source of the compilation unit, if any, in which to report the message. * @param pos The source position at which to report the message. * @param key The key for the localized message. @@ -229,7 +227,7 @@ public class JCDiagnostic implements Diagnostic { * Create a new diagnostic of the given kind. * @param kind The diagnostic kind * @param lc The lint category, if applicable, or null - * @param isMandatory is diagnostic mandatory? + * @param flags The set of flags for the diagnostic * @param source The source of the compilation unit, if any, in which to report the message. * @param pos The source position at which to report the message. * @param key The key for the localized message. @@ -364,7 +362,7 @@ public class JCDiagnostic implements Diagnostic { /** * Create a diagnostic object. - * @param fomatter the formatter to use for the diagnostic + * @param formatter the formatter to use for the diagnostic * @param dt the type of diagnostic * @param lc the lint category for the diagnostic * @param source the name of the source file, or null if none. diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/List.java b/langtools/src/share/classes/com/sun/tools/javac/util/List.java index e256c3755af..72e36c87201 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/List.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/List.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -287,7 +287,7 @@ public class List extends AbstractCollection implements java.util.List if (isEmpty()) { return ""; } else { - StringBuffer buf = new StringBuffer(); + StringBuilder buf = new StringBuilder(); buf.append(head); for (List l = tail; l.nonEmpty(); l = l.tail) { buf.append(sep); diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Names.java b/langtools/src/share/classes/com/sun/tools/javac/util/Names.java index 53827d2ce65..77d7d4097b1 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Names.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Names.java @@ -170,6 +170,10 @@ public class Names { public final Name ex; public final Name package_info; + //lambda-related + public final Name lambda; + public final Name metaFactory; + public final Name.Table table; public Names(Context context) { @@ -298,6 +302,10 @@ public class Names { deprecated = fromString("deprecated"); ex = fromString("ex"); package_info = fromString("package-info"); + + //lambda-related + lambda = fromString("lambda"); + metaFactory = fromString("metaFactory"); } protected Name.Table createTable(Options options) { diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/Position.java b/langtools/src/share/classes/com/sun/tools/javac/util/Position.java index 271467180f0..f5fc39f1250 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/Position.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/Position.java @@ -80,11 +80,11 @@ public class Position { /** Encode line and column numbers in an integer as: * {@code line-number << LINESHIFT + column-number }. - * {@link Position.NOPOS} represents an undefined position. + * {@link Position#NOPOS} represents an undefined position. * * @param line number of line (first is 1) * @param col number of character on line (first is 1) - * @return an encoded position or {@link Position.NOPOS} + * @return an encoded position or {@link Position#NOPOS} * if the line or column number is too big to * represent in the encoded format * @throws IllegalArgumentException if line or col is less than 1 diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java index b4f373de1f0..00e0b1f4210 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/RawDiagnosticFormatter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -52,7 +52,7 @@ public final class RawDiagnosticFormatter extends AbstractDiagnosticFormatter { /** * Create a formatter based on the supplied options. - * @param msgs + * @param options */ public RawDiagnosticFormatter(Options options) { super(null, new SimpleConfiguration(options, diff --git a/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java b/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java index 106fbcb52fd..6cdbb2447db 100644 --- a/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java +++ b/langtools/src/share/classes/com/sun/tools/javac/util/RichDiagnosticFormatter.java @@ -39,7 +39,7 @@ import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.*; import com.sun.tools.javac.code.Types; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.*; import static com.sun.tools.javac.code.Flags.*; import static com.sun.tools.javac.util.LayoutCharacters.*; import static com.sun.tools.javac.util.RichDiagnosticFormatter.RichConfiguration.*; @@ -295,7 +295,7 @@ public class RichDiagnosticFormatter extends conflicts.contains(s))) { List l = List.nil(); Symbol s2 = s; - while (s2.type.getEnclosingType().tag == CLASS + while (s2.type.getEnclosingType().hasTag(CLASS) && s2.owner.kind == Kinds.TYP) { l = l.prepend(s2.getSimpleName()); s2 = s2.owner; @@ -414,7 +414,7 @@ public class RichDiagnosticFormatter extends ? ownerName : s.name.toString(); if (s.type != null) { - if (s.type.tag == FORALL) { + if (s.type.hasTag(FORALL)) { ms = "<" + visitTypes(s.type.getTypeArguments(), locale) + ">" + ms; } ms += "(" + printMethodArgs( @@ -532,8 +532,8 @@ public class RichDiagnosticFormatter extends nameSimplifier.addUsage(t.tsym); boolean boundErroneous = bounds.head == null || - bounds.head.tag == NONE || - bounds.head.tag == ERROR; + bounds.head.hasTag(NONE) || + bounds.head.hasTag(ERROR); if ((t.tsym.flags() & SYNTHETIC) == 0) { //this is a true typevar diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java index deaf6a190ed..e589bfa8678 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AbstractTypeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Type; @@ -36,6 +35,11 @@ import com.sun.tools.javac.code.Type; * defaults for the methods in Type (and a couple from * ProgramElementDoc). * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java index 8e8f70c0007..7cfbf52425e 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationDescImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; @@ -40,6 +39,11 @@ import com.sun.tools.javac.util.Pair; * Sure it ought to be called "Annotation", but that clashes with * java.lang.annotation.Annotation. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java index 3c2efa3afb2..35ce0dbae60 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol.*; @@ -39,6 +38,11 @@ import com.sun.tools.javac.util.Position; /** * Represents an annotation type. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java index e5632dc4998..4c3fad63f42 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationTypeElementDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,17 +27,18 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; -import static com.sun.javadoc.LanguageVersion.*; - import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.tree.JCTree.*; -import com.sun.tools.javac.util.List; -import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Position; /** * Represents an element of an annotation type. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java index 82014ca96fc..20ed8fdbd5d 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/AnnotationValueImpl.java @@ -25,17 +25,21 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Symbol.*; -import com.sun.tools.javac.code.TypeTags; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; /** * Represents a value of an annotation type element. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ @@ -72,7 +76,7 @@ public class AnnotationValueImpl implements AnnotationValue { public Object value; public void visitConstant(Attribute.Constant c) { - if (c.type.tag == TypeTags.BOOLEAN) { + if (c.type.hasTag(BOOLEAN)) { // javac represents false and true as integers 0 and 1 value = Boolean.valueOf( ((Integer)c.value).intValue() != 0); @@ -129,7 +133,7 @@ public class AnnotationValueImpl implements AnnotationValue { } public void visitConstant(Attribute.Constant c) { - if (c.type.tag == TypeTags.BOOLEAN) { + if (c.type.hasTag(BOOLEAN)) { // javac represents false and true as integers 0 and 1 sb.append(((Integer)c.value).intValue() != 0); } else { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java index a5fed4b059c..37b3547e590 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ClassDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,8 +38,6 @@ import javax.tools.StandardLocation; import com.sun.javadoc.*; -import static com.sun.javadoc.LanguageVersion.*; - import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Scope; @@ -47,7 +45,6 @@ import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.ClassType; -import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; @@ -65,6 +62,7 @@ import com.sun.tools.javac.util.Names; import com.sun.tools.javac.util.Position; import static com.sun.tools.javac.code.Kinds.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; import static com.sun.tools.javac.tree.JCTree.Tag.*; /** @@ -76,6 +74,11 @@ import static com.sun.tools.javac.tree.JCTree.Tag.*; * referred to using Type (which can be converted to ClassDocImpl, * if possible). * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see Type * * @since 1.2 @@ -161,7 +164,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.errorType.tsym || t.tsym == env.syms.exceptionType.tsym) { return false; @@ -198,7 +201,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.exceptionType.tsym) { return true; } @@ -214,7 +217,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.errorType.tsym) { return true; } @@ -229,7 +232,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { if (isEnum() || isInterface() || isAnnotationType()) { return false; } - for (Type t = type; t.tag == TypeTags.CLASS; t = env.types.supertype(t)) { + for (Type t = type; t.hasTag(CLASS); t = env.types.supertype(t)) { if (t.tsym == env.syms.throwableType.tsym) { return true; } @@ -846,7 +849,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { * Note that this is not necessarily what the compiler would do! * * @param methodName the unqualified name to search for. - * @param paramTypeArray the array of Strings for method parameter types. + * @param paramTypes the array of Strings for method parameter types. * @return the first MethodDocImpl which matches, null if not found. */ public MethodDocImpl findMethod(String methodName, String[] paramTypes) { @@ -973,7 +976,7 @@ public class ClassDocImpl extends ProgramElementDocImpl implements ClassDoc { * Find constructor in this class. * * @param constrName the unqualified name to search for. - * @param paramTypeArray the array of Strings for constructor parameters. + * @param paramTypes the array of Strings for constructor parameters. * @return the first ConstructorDocImpl which matches, null if not found. */ public ConstructorDoc findConstructor(String constrName, diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java b/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java index 2c27e8b450a..59236f3ed6c 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Comment.java @@ -33,6 +33,11 @@ import com.sun.tools.javac.util.ListBuffer; * It allows users to get first sentence of this comment, get * comment for different tags... * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Kaiyang Liu (original) * @author Robert Field (rewrite) * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java index 980bd8b38d7..e1f4678c713 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ConstructorDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,11 @@ import com.sun.tools.javac.util.Position; /** * Represents a constructor of a java class. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java index 5887c50d6c2..5cd43067526 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocEnv.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,6 +46,11 @@ import com.sun.tools.javac.util.Position; * run and not the compiler info that could be GC'ed * or ported. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.4 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java index 0936194d315..f263123c2a5 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocImpl.java @@ -26,16 +26,16 @@ package com.sun.tools.javadoc; import java.io.DataInputStream; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; import java.text.CollationKey; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + import javax.tools.FileObject; import com.sun.javadoc.*; - import com.sun.tools.javac.util.Position; -import java.util.regex.Matcher; -import java.util.regex.Pattern; /** * abstract base class of all Doc classes. Doc item's are representations @@ -43,6 +43,11 @@ import java.util.regex.Pattern; * comments and have been processed by this run of javadoc. All Doc items * are unique, that is, they are == comparable. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Robert Field * @author Atul M Dambalkar @@ -262,7 +267,7 @@ public abstract class DocImpl implements Doc, Comparable { *

    * Included so that Doc item are java.lang.Comparable. * - * @param o the Object to be compared. + * @param obj the {@code Object} to be compared. * @return a negative integer, zero, or a positive integer as this Object * is less than, equal to, or greater than the given Object. * @exception ClassCastException the specified Object's type prevents it diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java index 6ac6a1ebd5f..0f8ba32f0be 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocLocale.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,18 @@ package com.sun.tools.javadoc; -import java.util.Locale; -import java.util.HashSet; -import java.text.Collator; import java.text.BreakIterator; +import java.text.Collator; +import java.util.Locale; /** * This class holds the information about locales. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.4 * @author Robert Field */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java index d9b2e69b9e4..308b903c446 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/DocletInvoker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,22 +25,26 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; - -import static com.sun.javadoc.LanguageVersion.*; - -import com.sun.tools.javac.util.List; - import java.io.File; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; -import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.net.URLClassLoader; +import com.sun.javadoc.*; +import com.sun.tools.javac.util.List; +import static com.sun.javadoc.LanguageVersion.*; + /** * Class creates, controls and invokes doclets. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Neal Gafter (rewrite) */ public class DocletInvoker { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java index e024cc01422..600eeb2ee13 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ExecutableMemberDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,11 @@ import com.sun.tools.javac.util.Position; /** * Represents a method or constructor of a java class. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java index c11c84bc7ce..b10992a99b9 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/FieldDocImpl.java @@ -29,20 +29,24 @@ import java.lang.reflect.Modifier; import com.sun.javadoc.*; -import static com.sun.javadoc.LanguageVersion.*; - import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.VarSymbol; -import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.tree.JCTree.JCVariableDecl; import com.sun.tools.javac.util.Position; +import static com.sun.tools.javac.code.TypeTag.BOOLEAN; + /** * Represents a field in a java class. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see MemberDocImpl * * @since 1.2 @@ -100,7 +104,7 @@ public class FieldDocImpl extends MemberDocImpl implements FieldDoc { */ public Object constantValue() { Object result = sym.getConstValue(); - if (result != null && sym.type.tag == TypeTags.BOOLEAN) + if (result != null && sym.type.hasTag(BOOLEAN)) // javac represents false and true as Integers 0 and 1 result = Boolean.valueOf(((Integer)result).intValue() != 0); return result; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java index 67fa61d2315..df5272560d6 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocClassReader.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,12 @@ import com.sun.tools.javac.jvm.ClassReader; import com.sun.tools.javac.util.Context; /** Javadoc uses an extended class reader that records package.html entries + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Neal Gafter */ public class JavadocClassReader extends ClassReader { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java index f2c2884b4bc..d914eefc855 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocEnter.java @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import javax.tools.JavaFileObject; import com.sun.tools.javac.code.Kinds; @@ -40,6 +39,12 @@ import com.sun.tools.javac.util.List; /** * Javadoc's own enter phase does a few things above and beyond that * done by javac. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Neal Gafter */ public class JavadocEnter extends Enter { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java index 4e1d31f2124..e29ae005402 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocMemberEnter.java @@ -37,6 +37,12 @@ import com.sun.tools.javac.util.Position; /** * Javadoc's own memberEnter phase does a few things above and beyond that * done by javac. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Neal Gafter */ public class JavadocMemberEnter extends MemberEnter { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java index 6d69172cbac..cbeaf699376 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTodo.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,12 @@ import com.sun.tools.javac.util.*; /** * Javadoc's own todo queue doesn't queue its inputs, as javadoc * doesn't perform attribution of method bodies or semantic checking. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Neal Gafter */ public class JavadocTodo extends Todo { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java index 81bcdbd3008..4bc1493fa33 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/JavadocTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,6 +54,12 @@ import com.sun.tools.javac.util.Position; * component in a larger software system. It provides operations to * construct a new javadoc processor, and to run it on a set of source * files. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Neal Gafter */ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { @@ -386,7 +392,7 @@ public class JavadocTool extends com.sun.tools.javac.main.JavaCompiler { /** * Return true if given file name is a valid class name * (including "package-info"). - * @param clazzname the name of the class to check. + * @param s the name of the class to check. * @return true if given class name is a valid class name * and false otherwise. */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Main.java b/langtools/src/share/classes/com/sun/tools/javadoc/Main.java index 086e13d9f49..dfc21b27702 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Main.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Main.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,6 +31,11 @@ import java.io.PrintWriter; * Provides external entry points (tool and programmatic) * for the javadoc program. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.4 */ public class Main { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java index 8dcd375db1b..88da9c0d68b 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/MemberDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,6 +37,11 @@ import com.sun.tools.javac.util.Position; * method, constructor and field members. Class members of a class * (nested classes) are represented instead by ClassDocImpl. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see MethodDocImpl * @see FieldDocImpl * @see ClassDocImpl diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java index 5994e76b443..64fa6dbeed8 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Messager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,16 +25,14 @@ package com.sun.tools.javadoc; -import java.io.PrintWriter; +import java.io.PrintWriter; // Access to 'javac' output streams import java.text.MessageFormat; -import java.util.ResourceBundle; import java.util.MissingResourceException; +import java.util.ResourceBundle; import com.sun.javadoc.*; - import com.sun.tools.javac.util.Context; - -import com.sun.tools.javac.util.Log; // Access to 'javac' output streams +import com.sun.tools.javac.util.Log; /** * Utility for integrating with javadoc tools and for localization. @@ -43,6 +41,11 @@ import com.sun.tools.javac.util.Log; // Access to 'javac' output streams *
    * Also provides implementation for DocErrorReporter. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see java.util.ResourceBundle * @see java.text.MessageFormat * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java index 72ed86dae61..025463cf136 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/MethodDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,20 +25,25 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; +import java.lang.reflect.Modifier; +import com.sun.javadoc.*; import com.sun.tools.javac.code.*; import com.sun.tools.javac.code.Symbol.*; import com.sun.tools.javac.code.Type; -import com.sun.tools.javac.code.TypeTags; import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.util.Position; -import java.lang.reflect.Modifier; +import static com.sun.tools.javac.code.TypeTag.CLASS; /** * Represents a method of a java class. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) @@ -125,7 +130,7 @@ public class MethodDocImpl ClassSymbol origin = (ClassSymbol)sym.owner; for (Type t = env.types.supertype(origin.type); - t.tag == TypeTags.CLASS; + t.hasTag(CLASS); t = env.types.supertype(t)) { ClassSymbol c = (ClassSymbol)t.tsym; for (Scope.Entry e = c.members().lookup(sym.name); e.scope != null; e = e.next()) { @@ -157,7 +162,7 @@ public class MethodDocImpl ClassSymbol origin = (ClassSymbol)sym.owner; for (Type t = env.types.supertype(origin.type); - t.tag == TypeTags.CLASS; + t.hasTag(CLASS); t = env.types.supertype(t)) { ClassSymbol c = (ClassSymbol)t.tsym; for (Scope.Entry e = c.members().lookup(sym.name); e.scope != null; e = e.next()) { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java b/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java index 5e9637262ae..40a9040971c 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ModifierFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,7 +32,13 @@ import static com.sun.tools.javac.code.Flags.*; * Filtering is done by returning boolean values. * Classes, methods and fields can be filtered, or filtering * can be done directly on modifier bits. - * @see com.sun.tools.javac.code.Flags; + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * + * @see com.sun.tools.javac.code.Flags * @author Robert Field */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java index 4c7e472275a..9a072250eb2 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PackageDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,12 @@ package com.sun.tools.javadoc; -import java.io.InputStream; import java.io.IOException; +import java.io.InputStream; + import javax.tools.FileObject; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Scope; import com.sun.tools.javac.code.Symbol.ClassSymbol; @@ -47,6 +47,11 @@ import com.sun.tools.javac.util.Position; * about the package, the package's comment and tags, and the * classes in the package. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Kaiyang Liu (original) * @author Robert Field (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java index 60809bbb8a1..8033405365d 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParamTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,11 @@ import com.sun.javadoc.*; * Represents an @param documentation tag. * Parses and stores the name and comment parts of the parameter tag. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * */ @@ -101,8 +106,8 @@ class ParamTagImpl extends TagImpl implements ParamTag { * TagImpls consisting of SeeTagImpl(s) and text containing TagImpl(s). * * @return TagImpl[] Array of tags with inline SeeTagImpls. - * @see TagImpl#inlineTagImpls() - * @see ThrowsTagImpl#inlineTagImpls() + * @see TagImpl#inlineTags() + * @see ThrowsTagImpl#inlineTags() */ @Override public Tag[] inlineTags() { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java index 9ac19a13b77..524a5ead01f 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2005, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,12 +29,16 @@ import com.sun.javadoc.*; import com.sun.tools.javac.code.Attribute; import com.sun.tools.javac.code.Symbol.VarSymbol; -import com.sun.tools.javac.code.Type; /** * ParameterImpl information. * This includes a parameter type and parameter name. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Kaiyang Liu (original) * @author Robert Field (rewrite) * @author Scott Seligman (generics, annotations) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java index 838994f096a..2fac11119d3 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ParameterizedTypeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,13 +31,18 @@ import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Type; import com.sun.tools.javac.code.Type.ClassType; -import static com.sun.tools.javac.code.TypeTags.*; +import static com.sun.tools.javac.code.TypeTag.CLASS; /** * Implementation of ParameterizedType, which * represents an invocation of a generic class or interface. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ @@ -90,7 +95,7 @@ public class ParameterizedTypeImpl * Return null is this is a top-level type. */ public com.sun.javadoc.Type containingType() { - if (type.getEnclosingType().tag == CLASS) { + if (type.getEnclosingType().hasTag(CLASS)) { // This is the type of an inner class. return TypeMaker.getType(env, type.getEnclosingType()); } @@ -129,7 +134,7 @@ public class ParameterizedTypeImpl return TypeMaker.getTypeName(cl, full); } StringBuilder s = new StringBuilder(); - if (cl.getEnclosingType().tag != CLASS) { // if not an inner class... + if (!(cl.getEnclosingType().hasTag(CLASS))) { // if not an inner class... s.append(TypeMaker.getTypeName(cl, full)); } else { ClassType encl = (ClassType)cl.getEnclosingType(); diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java b/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java index be61228f166..15679a79f46 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/PrimitiveType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,13 +27,12 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.ClassSymbol; - -import com.sun.tools.javac.code.Type; -import com.sun.tools.javac.code.TypeTags; -import com.sun.tools.javac.code.Type.ClassType; - +/** + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ class PrimitiveType implements com.sun.javadoc.Type { private final String name; diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java index e6cd0e8c9ba..cdd4a44da15 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ProgramElementDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,26 +25,27 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; - -import com.sun.tools.javac.code.Attribute; -import com.sun.tools.javac.code.Flags; -import com.sun.tools.javac.code.Symbol; -import com.sun.tools.javac.code.Symbol.ClassSymbol; - -import com.sun.tools.javac.tree.JCTree; - -import com.sun.tools.javac.util.Position; - import java.lang.reflect.Modifier; import java.text.CollationKey; +import com.sun.javadoc.*; +import com.sun.tools.javac.code.Attribute; +import com.sun.tools.javac.code.Symbol; +import com.sun.tools.javac.code.Symbol.ClassSymbol; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.util.Position; + /** * Represents a java program element: class, interface, field, * constructor, or method. * This is an abstract class dealing with information common to * these elements. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @see MemberDocImpl * @see ClassDocImpl * diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java index 5f107fab1d3..d6eba2e8f3e 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/RootDocImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,12 @@ import com.sun.tools.javac.util.Position; /** * This class holds the information from one run of javadoc. * Particularly the packages, classes and options specified - * by the user.. + * by the user. + * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. * * @since 1.2 * @author Robert Field diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java index f758b16d477..4994fe66634 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SeeTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,14 +25,18 @@ package com.sun.tools.javadoc; -import com.sun.tools.javac.util.*; - import com.sun.javadoc.*; +import com.sun.tools.javac.util.*; /** * Represents a see also documentation tag. * The @see tag can be plain text, or reference a class or member. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Kaiyang Liu (original) * @author Robert Field (rewrite) * @author Atul M Dambalkar diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java index c429ba7f8c1..e89866d9de9 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SerialFieldTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,11 @@ import com.sun.javadoc.*; * This tag is only allowed in the javadoc for the special member * serialPersistentFields. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Joe Fialli * @author Neal Gafter * diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java index e8b147f9002..76dc6a08fd7 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SerializedForm.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,15 +26,14 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Flags; import com.sun.tools.javac.code.Kinds; import com.sun.tools.javac.code.Scope; -import com.sun.tools.javac.code.Symbol.VarSymbol; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Symbol.MethodSymbol; -import com.sun.tools.javac.util.Name; +import com.sun.tools.javac.code.Symbol.VarSymbol; import com.sun.tools.javac.util.ListBuffer; +import com.sun.tools.javac.util.Name; import com.sun.tools.javac.util.Names; /** @@ -59,6 +58,11 @@ import com.sun.tools.javac.util.Names; * b. For Externalizable, data layout is described by 2(b). * * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Joe Fialli * @author Neal Gafter (rewrite but not too proud) @@ -233,6 +237,9 @@ class SerializedForm { SerialFieldTag[] sfTag = spfDoc.serialFieldTags(); for (int i = 0; i < sfTag.length; i++) { + if (sfTag[i].fieldName() == null || sfTag[i].fieldType() == null) // ignore malformed @serialField tags + continue; + Name fieldName = names.fromString(sfTag[i].fieldName()); // Look for a FieldDocImpl that is documented by serialFieldTagImpl. diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java index d20b579f65e..89106de0163 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/SourcePositionImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.tools.javac.util.Position; /** * A source position: filename, line number, and column number. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since J2SE1.4 * @author Neal M Gafter * @author Michael Van De Vanter (position representation changed to char offsets) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/Start.java b/langtools/src/share/classes/com/sun/tools/javadoc/Start.java index 66514f4f07f..67f5e4cc40a 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/Start.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/Start.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,28 +25,30 @@ package com.sun.tools.javadoc; -import com.sun.javadoc.*; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.StringTokenizer; +import com.sun.javadoc.*; import com.sun.tools.javac.main.CommandLine; import com.sun.tools.javac.util.Context; import com.sun.tools.javac.util.List; import com.sun.tools.javac.util.ListBuffer; import com.sun.tools.javac.util.Log; import com.sun.tools.javac.util.Options; - -import java.io.IOException; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.PrintWriter; - -import java.util.StringTokenizer; - import static com.sun.tools.javac.code.Flags.*; /** * Main program of Javadoc. * Previously named "Main". * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @since 1.2 * @author Robert Field * @author Neal Gafter (rewrite) diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java index 10a2764ced4..a106bb68f40 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2004, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -34,6 +34,11 @@ import com.sun.javadoc.*; * special processing are handled by subclasses (ParamTagImpl, SeeTagImpl, * and ThrowsTagImpl * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @author Neal M Gafter diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java index f63ffece2b2..6da454fdbb8 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/ThrowsTagImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,6 +33,11 @@ import com.sun.javadoc.*; * The exception name my be the name of a type variable. * Note: @exception is a backwards compatible synonymy for @throws. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Robert Field * @author Atul M Dambalkar * @see ExecutableMemberDocImpl#throwsTags() @@ -108,8 +113,8 @@ class ThrowsTagImpl extends TagImpl implements ThrowsTag { * TagImpls consisting of SeeTagImpl(s) and text containing TagImpl(s). * * @return TagImpl[] Array of tags with inline SeeTagImpls. - * @see TagImpl#inlineTagImpls() - * @see ParamTagImpl#inlineTagImpls() + * @see TagImpl#inlineTags() + * @see ParamTagImpl#inlineTags() */ @Override public Tag[] inlineTags() { diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java index 8f7f77c43f6..dd0f355fa24 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeMaker.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,18 +26,21 @@ package com.sun.tools.javadoc; import com.sun.javadoc.*; - import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.code.Symbol.ClassSymbol; import com.sun.tools.javac.code.Type; +import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.code.Type.ClassType; import com.sun.tools.javac.code.Type.TypeVar; -import com.sun.tools.javac.code.Type.ArrayType; import com.sun.tools.javac.util.List; +import static com.sun.tools.javac.code.TypeTag.ARRAY; -import static com.sun.tools.javac.code.TypeTags.*; - - +/** + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ public class TypeMaker { public static com.sun.javadoc.Type getType(DocEnv env, Type t) { @@ -54,7 +57,7 @@ public class TypeMaker { if (env.legacyDoclet) { t = env.types.erasure(t); } - switch (t.tag) { + switch (t.getTag()) { case CLASS: if (ClassDocImpl.isGeneric((ClassSymbol)t.tsym)) { return env.getParameterizedType((ClassType)t); @@ -104,10 +107,10 @@ public class TypeMaker { } public static String getTypeName(Type t, boolean full) { - switch (t.tag) { + switch (t.getTag()) { case ARRAY: StringBuilder s = new StringBuilder(); - while (t.tag == ARRAY) { + while (t.hasTag(ARRAY)) { s.append("[]"); t = ((ArrayType)t).elemtype; } @@ -126,10 +129,10 @@ public class TypeMaker { * Class names are qualified if "full" is true. */ static String getTypeString(DocEnv env, Type t, boolean full) { - switch (t.tag) { + switch (t.getTag()) { case ARRAY: StringBuilder s = new StringBuilder(); - while (t.tag == ARRAY) { + while (t.hasTag(ARRAY)) { s.append("[]"); t = env.types.elemtype(t); } @@ -200,7 +203,7 @@ public class TypeMaker { private com.sun.javadoc.Type skipArrays() { if (skipArraysCache == null) { Type t; - for (t = arrayType; t.tag == ARRAY; t = env.types.elemtype(t)) { } + for (t = arrayType; t.hasTag(ARRAY); t = env.types.elemtype(t)) { } skipArraysCache = TypeMaker.getType(env, t); } return skipArraysCache; @@ -213,7 +216,7 @@ public class TypeMaker { */ public String dimension() { StringBuilder dimension = new StringBuilder(); - for (Type t = arrayType; t.tag == ARRAY; t = env.types.elemtype(t)) { + for (Type t = arrayType; t.hasTag(ARRAY); t = env.types.elemtype(t)) { dimension.append("[]"); } return dimension.toString(); diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java index 55660ac056d..85f946c6bf9 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/TypeVariableImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Kinds; @@ -42,6 +41,11 @@ import com.sun.tools.javac.util.Names; * Implementation of TypeVariable, which * represents a type variable. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java b/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java index dace0e8f5f7..cf458d2335c 100644 --- a/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java +++ b/langtools/src/share/classes/com/sun/tools/javadoc/WildcardTypeImpl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package com.sun.tools.javadoc; - import com.sun.javadoc.*; import com.sun.tools.javac.code.Symbol.ClassSymbol; @@ -37,6 +36,11 @@ import com.sun.tools.javac.util.List; * Implementation of WildcardType, which * represents a wildcard type. * + *

    This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + * * @author Scott Seligman * @since 1.5 */ diff --git a/langtools/src/share/classes/com/sun/tools/javah/Gen.java b/langtools/src/share/classes/com/sun/tools/javah/Gen.java index 56829867387..dc50bae60bc 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/Gen.java +++ b/langtools/src/share/classes/com/sun/tools/javah/Gen.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -287,7 +287,7 @@ public abstract class Gen { constString = value.toString(); } if (constString != null) { - StringBuffer s = new StringBuffer("#undef "); + StringBuilder s = new StringBuilder("#undef "); s.append(cname); s.append("_"); s.append(fname); s.append(lineSep); s.append("#define "); s.append(cname); s.append("_"); s.append(fname); s.append(" "); s.append(constString); @@ -370,7 +370,7 @@ public abstract class Gen { // c.f. MethodDoc.signature String signature(ExecutableElement e) { - StringBuffer sb = new StringBuffer("("); + StringBuilder sb = new StringBuilder("("); String sep = ""; for (VariableElement p: e.getParameters()) { sb.append(sep); diff --git a/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java b/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java index 72160c59992..e27eff2fdc9 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javah/JavahFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ import com.sun.tools.javac.util.Context; class JavahFileManager extends JavacFileManager { private JavahFileManager(Context context, Charset charset) { super(context, true, charset); - setIgnoreSymbolFile(true); + setSymbolFileEnabled(false); } static JavahFileManager create(final DiagnosticListener dl, PrintWriter log) { @@ -56,8 +56,4 @@ class JavahFileManager extends JavacFileManager { return new JavahFileManager(javac_context, null); } - - void setIgnoreSymbolFile(boolean b) { - ignoreSymbolFile = b; - } } diff --git a/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java b/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java index 16c3be898aa..6b8abf9d6d1 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java +++ b/langtools/src/share/classes/com/sun/tools/javah/JavahTask.java @@ -500,7 +500,7 @@ public class JavahTask implements NativeHeaderTool.NativeHeaderTask { g.setForce(force); if (fileManager instanceof JavahFileManager) - ((JavahFileManager) fileManager).setIgnoreSymbolFile(true); + ((JavahFileManager) fileManager).setSymbolFileEnabled(false); JavaCompiler c = ToolProvider.getSystemJavaCompiler(); List opts = new ArrayList(); diff --git a/langtools/src/share/classes/com/sun/tools/javah/LLNI.java b/langtools/src/share/classes/com/sun/tools/javah/LLNI.java index ab67f8c5e12..783648a3ac0 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/LLNI.java +++ b/langtools/src/share/classes/com/sun/tools/javah/LLNI.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -647,7 +647,7 @@ public class LLNI extends Gen { %%% This may not be right, but should be called more often. */ protected final String nameToIdentifier(String name) { int len = name.length(); - StringBuffer buf = new StringBuffer(len); + StringBuilder buf = new StringBuilder(len); for (int i = 0; i < len; i++) { char c = name.charAt(i); if (isASCIILetterOrDigit(c)) diff --git a/langtools/src/share/classes/com/sun/tools/javah/Mangle.java b/langtools/src/share/classes/com/sun/tools/javah/Mangle.java index 616bb746d98..2cc74f5846e 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/Mangle.java +++ b/langtools/src/share/classes/com/sun/tools/javah/Mangle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,7 +66,7 @@ public class Mangle { } public final String mangle(CharSequence name, int mtype) { - StringBuffer result = new StringBuffer(100); + StringBuilder result = new StringBuilder(100); int length = name.length(); for (int i = 0; i < length; i++) { @@ -115,7 +115,7 @@ public class Mangle { public String mangleMethod(ExecutableElement method, TypeElement clazz, int mtype) throws TypeSignature.SignatureException { - StringBuffer result = new StringBuffer(100); + StringBuilder result = new StringBuilder(100); result.append("Java_"); if (mtype == Mangle.Type.METHOD_JDK_1) { @@ -164,7 +164,7 @@ public class Mangle { // Warning: duplicated in Gen private String signature(ExecutableElement e) { - StringBuffer sb = new StringBuffer(); + StringBuilder sb = new StringBuilder(); String sep = "("; for (VariableElement p: e.getParameters()) { sb.append(sep); diff --git a/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java b/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java index 5107dd113c9..1f4adc0c82c 100644 --- a/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java +++ b/langtools/src/share/classes/com/sun/tools/javah/NativeHeaderTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,11 +29,13 @@ import java.io.Writer; import java.nio.charset.Charset; import java.util.Locale; import java.util.concurrent.Callable; +import javax.tools.Diagnostic; import javax.tools.DiagnosticListener; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.OptionChecker; import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; import javax.tools.Tool; /** diff --git a/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java b/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java index 356fc9a4de6..8f7a588b4da 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java +++ b/langtools/src/share/classes/com/sun/tools/javap/DisassemblerTool.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,11 +29,13 @@ import java.io.Writer; import java.nio.charset.Charset; import java.util.Locale; import java.util.concurrent.Callable; +import javax.tools.Diagnostic; import javax.tools.DiagnosticListener; import javax.tools.JavaFileManager; import javax.tools.JavaFileObject; import javax.tools.OptionChecker; import javax.tools.StandardJavaFileManager; +import javax.tools.StandardLocation; import javax.tools.Tool; /** @@ -69,9 +71,7 @@ public interface DisassemblerTool extends Tool, OptionChecker { * @param options compiler options, {@code null} means no options * @param classes class names (for annotation processing), {@code * null} means no class names - * @param compilationUnits the compilation units to compile, {@code - * null} means no compilation units - * @return an object representing the compilation + * @return a task to perform the disassembly * @throws RuntimeException if an unrecoverable error * occurred in a user supplied component. The * {@linkplain Throwable#getCause() cause} will be the error in diff --git a/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java b/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java index 8fa75792dae..cf491bf83fa 100644 --- a/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java +++ b/langtools/src/share/classes/com/sun/tools/javap/JavapFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ import com.sun.tools.javac.util.Context; public class JavapFileManager extends JavacFileManager { private JavapFileManager(Context context, Charset charset) { super(context, true, charset); - setIgnoreSymbolFile(true); + setSymbolFileEnabled(false); } public static JavapFileManager create(final DiagnosticListener dl, PrintWriter log) { @@ -56,8 +56,4 @@ public class JavapFileManager extends JavacFileManager { return new JavapFileManager(javac_context, null); } - - void setIgnoreSymbolFile(boolean b) { - ignoreSymbolFile = b; - } } diff --git a/langtools/src/share/classes/javax/annotation/processing/Completions.java b/langtools/src/share/classes/javax/annotation/processing/Completions.java index 3d96204b36a..044ae20d503 100644 --- a/langtools/src/share/classes/javax/annotation/processing/Completions.java +++ b/langtools/src/share/classes/javax/annotation/processing/Completions.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,6 @@ package javax.annotation.processing; -import java.util.Arrays; - /** * Utility class for assembling {@link Completion} objects. * diff --git a/langtools/src/share/classes/javax/annotation/processing/FilerException.java b/langtools/src/share/classes/javax/annotation/processing/FilerException.java index d33b631704b..30a13886f04 100644 --- a/langtools/src/share/classes/javax/annotation/processing/FilerException.java +++ b/langtools/src/share/classes/javax/annotation/processing/FilerException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package javax.annotation.processing; import java.io.IOException; -import javax.annotation.processing.Filer; /** * Indicates a {@link Filer} detected an attempt to open a file that diff --git a/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java b/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java index 69245648ddf..5ade776487a 100644 --- a/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java +++ b/langtools/src/share/classes/javax/annotation/processing/ProcessingEnvironment.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,12 +26,10 @@ package javax.annotation.processing; import java.util.Map; -import java.util.List; import java.util.Locale; import javax.lang.model.SourceVersion; import javax.lang.model.util.Elements; import javax.lang.model.util.Types; -import java.io.File; /** * An annotation processing tool framework will {@linkplain diff --git a/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java b/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java index 3b66badf6f3..68b54210c61 100644 --- a/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java +++ b/langtools/src/share/classes/javax/lang/model/element/AnnotationValue.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,6 @@ package javax.lang.model.element; - -import java.util.List; -import javax.lang.model.type.*; - /** * Represents a value of an annotation type element. * A value is of one of the following types: diff --git a/langtools/src/share/classes/javax/lang/model/element/Element.java b/langtools/src/share/classes/javax/lang/model/element/Element.java index 6d2743ca324..64fe7eaf33b 100644 --- a/langtools/src/share/classes/javax/lang/model/element/Element.java +++ b/langtools/src/share/classes/javax/lang/model/element/Element.java @@ -32,7 +32,6 @@ import java.lang.annotation.IncompleteAnnotationException; import java.util.List; import java.util.Set; -import javax.lang.model.element.Modifier; import javax.lang.model.type.*; import javax.lang.model.util.*; diff --git a/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java b/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java index 9d514f2d723..138f3584497 100644 --- a/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java +++ b/langtools/src/share/classes/javax/lang/model/element/ExecutableElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package javax.lang.model.element; import java.util.List; -import javax.lang.model.util.Types; import javax.lang.model.type.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/element/VariableElement.java b/langtools/src/share/classes/javax/lang/model/element/VariableElement.java index 77451fab784..cd82efd254b 100644 --- a/langtools/src/share/classes/javax/lang/model/element/VariableElement.java +++ b/langtools/src/share/classes/javax/lang/model/element/VariableElement.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package javax.lang.model.element; -import javax.lang.model.type.TypeMirror; import javax.lang.model.util.Elements; /** diff --git a/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java b/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java index 8f01bed158a..fd79f04e62d 100644 --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypeException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.type; import java.io.ObjectInputStream; import java.io.IOException; -import java.lang.annotation.Annotation; import javax.lang.model.element.Element; diff --git a/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java b/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java index de3e163d382..96209dff2d6 100644 --- a/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java +++ b/langtools/src/share/classes/javax/lang/model/type/MirroredTypesException.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package javax.lang.model.type; -import java.lang.annotation.Annotation; import java.util.ArrayList; import java.util.List; import java.util.Collections; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java index e36a00f93c6..109349aa612 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,10 +26,8 @@ package javax.lang.model.util; -import java.util.List; import javax.lang.model.element.*; -import javax.lang.model.type.TypeMirror; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java index 4a5ac1ccdf2..46fa27f7e35 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor7.java @@ -25,10 +25,6 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java index 21294641ccd..c7a0f7be70f 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractAnnotationValueVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,10 +25,6 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java index 0e4a3438a81..8e1d65613d5 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,10 @@ package javax.lang.model.util; - -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import static javax.lang.model.SourceVersion.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java index 94546db872e..0e5d8daeebc 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,9 @@ package javax.lang.model.util; -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java index 9cf104dd6a3..b4afe113fac 100644 --- a/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/AbstractElementVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,9 @@ package javax.lang.model.util; -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java b/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java index c95ff5fec33..59291026a0e 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementFilter.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,18 +25,14 @@ package javax.lang.model.util; -import java.lang.Iterable; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.EnumSet; import java.util.ArrayList; import java.util.LinkedHashSet; -import java.util.NoSuchElementException; import javax.lang.model.element.*; -import javax.lang.model.type.*; /** diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java index ace1515a71c..25a68a909f7 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,10 @@ package javax.lang.model.util; -import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.element.*; +import static javax.lang.model.SourceVersion.*; /** * A visitor of program elements based on their {@linkplain diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java index 5781875744c..e9a983bf19b 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementKindVisitor8.java @@ -26,7 +26,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; -import static javax.lang.model.element.ElementKind.*; import javax.annotation.processing.SupportedSourceVersion; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java b/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java index 711154f5f96..809b4ddccfc 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementScanner6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java b/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java index 119b3d7afda..f4d84d05cd3 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementScanner7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java b/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java index daea2325431..5bd0b91c8a2 100644 --- a/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java +++ b/langtools/src/share/classes/javax/lang/model/util/ElementScanner8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java index eb392847c2e..2e3cfafcc70 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,9 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; -import static javax.lang.model.SourceVersion.*; -import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** * A simple visitor for annotation values with default behavior diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java index a69f0fe3b46..30823cdd584 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleAnnotationValueVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,9 @@ package javax.lang.model.util; -import java.util.List; -import javax.lang.model.element.*; - -import javax.lang.model.type.TypeMirror; -import static javax.lang.model.SourceVersion.*; -import javax.lang.model.SourceVersion; import javax.annotation.processing.SupportedSourceVersion; +import javax.lang.model.SourceVersion; +import static javax.lang.model.SourceVersion.*; /** * A simple visitor for annotation values with default behavior diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java index 2e92d8fe035..a0055f76cfe 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java index ec7e92abb87..5d54cff9333 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java index db83a38d410..63cacd00f3c 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleElementVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,7 @@ package javax.lang.model.util; -import javax.lang.model.element.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java index 69889996921..fc023d869c2 100644 --- a/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/SimpleTypeVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,7 +25,6 @@ package javax.lang.model.util; -import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; import javax.lang.model.SourceVersion; import static javax.lang.model.SourceVersion.*; diff --git a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java index 7adc993cb6b..9e007fe54f3 100644 --- a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java +++ b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor6.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,10 @@ package javax.lang.model.util; - -import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.type.*; +import static javax.lang.model.SourceVersion.*; /** * A visitor of types based on their {@linkplain TypeKind kind} with diff --git a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java index 701b5253e0e..4bbe1d6635a 100644 --- a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java +++ b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor7.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,7 +27,6 @@ package javax.lang.model.util; import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; diff --git a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java index 26ac9c13bf3..698364f791e 100644 --- a/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java +++ b/langtools/src/share/classes/javax/lang/model/util/TypeKindVisitor8.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,10 @@ package javax.lang.model.util; -import javax.lang.model.type.*; import javax.annotation.processing.SupportedSourceVersion; -import static javax.lang.model.element.ElementKind.*; -import static javax.lang.model.SourceVersion.*; import javax.lang.model.SourceVersion; +import javax.lang.model.type.*; +import static javax.lang.model.SourceVersion.*; /** * A visitor of types based on their {@linkplain TypeKind kind} with diff --git a/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java b/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java index f875b94d1ab..9bf3405b661 100644 --- a/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java +++ b/langtools/src/share/classes/javax/tools/ForwardingJavaFileManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ package javax.tools; import java.io.IOException; -import java.net.URI; import java.util.Iterator; import java.util.Set; import javax.tools.JavaFileObject.Kind; diff --git a/langtools/src/share/classes/javax/tools/JavaFileObject.java b/langtools/src/share/classes/javax/tools/JavaFileObject.java index 9e84b3c5a06..ea9dd75e819 100644 --- a/langtools/src/share/classes/javax/tools/JavaFileObject.java +++ b/langtools/src/share/classes/javax/tools/JavaFileObject.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,6 @@ package javax.tools; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.io.Reader; -import java.io.Writer; -import java.nio.CharBuffer; import javax.lang.model.element.NestingKind; import javax.lang.model.element.Modifier; diff --git a/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java b/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java index eadf1ca527d..e4cb0107c04 100644 --- a/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java +++ b/langtools/test/com/sun/javadoc/VersionNumber/VersionNumber.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2012, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -84,7 +84,7 @@ public class VersionNumber { // Test the proper DOCTYPE element is present: { - "