OpenJDK / jdk / hs
changeset 44711:af3c856d50b6
Merge
author | duke |
---|---|
date | Wed, 05 Jul 2017 23:16:05 +0200 |
parents | cafa63b809fb e90763b428c6 |
children | 2604fd725a3d |
files | jdk/test/java/net/MulticastSocket/JoinGroup.java jdk/test/java/net/MulticastSocket/Leave.java |
diffstat | 231 files changed, 5185 insertions(+), 1279 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgtags-top-repo Sat Apr 22 00:22:27 2017 +0000 +++ b/.hgtags-top-repo Wed Jul 05 23:16:05 2017 +0200 @@ -409,3 +409,4 @@ c38c6b270ccc8e2b86d1631bcf42248241b54d2c jdk-9+163 7810f75d016a52e32295c4233009de5ca90e31af jdk-9+164 aff4f339acd40942d3dab499846b52acd87b3af1 jdk-9+165 +ba5b16c9c6d80632b61959a33d424b1c3398ce62 jdk-9+166
--- a/common/conf/jib-profiles.js Sat Apr 22 00:22:27 2017 +0000 +++ b/common/conf/jib-profiles.js Wed Jul 05 23:16:05 2017 +0200 @@ -231,7 +231,8 @@ // List of the main profile names used for iteration common.main_profile_names = [ "linux-x64", "linux-x86", "macosx-x64", "solaris-x64", - "solaris-sparcv9", "windows-x64", "windows-x86" + "solaris-sparcv9", "windows-x64", "windows-x86", + "linux-arm64", "linux-arm-vfp-hflt", "linux-arm-vfp-hflt-dyn" ]; // These are the base setttings for all the main build profiles. @@ -391,7 +392,7 @@ // on such hardware. if (input.build_cpu == "sparcv9") { var cpu_brand = $EXEC("bash -c \"kstat -m cpu_info | grep brand | head -n1 | awk '{ print \$2 }'\""); - if (cpu_brand.trim() == 'SPARC-M7') { + if (cpu_brand.trim().match('SPARC-.7')) { boot_jdk_revision = "8u20"; boot_jdk_subdirpart = "1.8.0_20"; } @@ -471,8 +472,43 @@ build_cpu: "x64", dependencies: ["devkit", "freetype"], configure_args: concat(common.configure_args_32bit), + }, + + "linux-arm64": { + target_os: "linux", + target_cpu: "aarch64", + build_cpu: "x64", + dependencies: ["devkit", "build_devkit", "cups", "headless_stubs"], + configure_args: [ + "--with-cpu-port=arm64", + "--with-jvm-variants=server", + "--openjdk-target=aarch64-linux-gnu", + "--enable-headless-only" + ], + }, + + "linux-arm-vfp-hflt": { + target_os: "linux", + target_cpu: "arm", + build_cpu: "x64", + dependencies: ["devkit", "build_devkit", "cups"], + configure_args: [ + "--with-jvm-variants=minimal1,client", + "--with-x=" + input.get("devkit", "install_path") + "/arm-linux-gnueabihf/libc/usr/X11R6-PI", + "--openjdk-target=arm-linux-gnueabihf", + "--with-abi-profile=arm-vfp-hflt" + ], + }, + + // Special version of the SE profile adjusted to be testable on arm64 hardware. + "linux-arm-vfp-hflt-dyn": { + configure_args: "--with-stdc++lib=dynamic" } }; + // Let linux-arm-vfp-hflt-dyn inherit everything from linux-arm-vfp-hflt + profiles["linux-arm-vfp-hflt-dyn"] = concatObjects( + profiles["linux-arm-vfp-hflt-dyn"], profiles["linux-arm-vfp-hflt"]); + // Add the base settings to all the main profiles common.main_profile_names.forEach(function (name) { profiles[name] = concatObjects(common.main_profile_base, profiles[name]); @@ -584,7 +620,7 @@ var testOnlyProfilesPrebuilt = { "run-test-prebuilt": { src: "src.conf", - dependencies: [ "jtreg", "gnumake", testedProfile + ".jdk", + dependencies: [ "jtreg", "gnumake", "boot_jdk", testedProfile + ".jdk", testedProfile + ".test", "src.full" ], work_dir: input.get("src.full", "install_path") + "/test", @@ -658,16 +694,28 @@ "windows-x86": { platform: "windows-x86", demo_ext: "zip" + }, + "linux-arm64": { + platform: "linux-arm64-vfp-hflt", + demo_ext: "tar.gz" + }, + "linux-arm-vfp-hflt": { + platform: "linux-arm32-vfp-hflt", + demo_ext: "tar.gz" + }, + "linux-arm-vfp-hflt-dyn": { + platform: "linux-arm32-vfp-hflt-dyn", + demo_ext: "tar.gz" } } // Generate common artifacts for all main profiles - common.main_profile_names.forEach(function (name) { + Object.keys(artifactData).forEach(function (name) { profiles[name] = concatObjects(profiles[name], common.main_profile_artifacts(artifactData[name].platform, artifactData[name].demo_ext)); }); // Generate common artifacts for all debug profiles - common.main_profile_names.forEach(function (name) { + Object.keys(artifactData).forEach(function (name) { var debugName = name + common.debug_suffix; profiles[debugName] = concatObjects(profiles[debugName], common.debug_profile_artifacts(artifactData[name].platform)); @@ -839,7 +887,11 @@ macosx_x64: "Xcode6.3-MacOSX10.9+1.0", solaris_x64: "SS12u4-Solaris11u1+1.0", solaris_sparcv9: "SS12u4-Solaris11u1+1.0", - windows_x64: "VS2013SP4+1.0" + windows_x64: "VS2013SP4+1.0", + linux_aarch64: "gcc-linaro-aarch64-linux-gnu-4.8-2013.11_linux+1.0", + linux_arm: (input.profile != null && input.profile.indexOf("hflt") >= 0 + ? "gcc-linaro-arm-linux-gnueabihf-raspbian-2012.09-20120921_linux+1.0" + : "arm-linaro-4.7+1.0") }; var devkit_platform = (input.target_cpu == "x86"
--- a/corba/.hgtags Sat Apr 22 00:22:27 2017 +0000 +++ b/corba/.hgtags Wed Jul 05 23:16:05 2017 +0200 @@ -409,3 +409,4 @@ 493011dee80e51c2a2b064d049183c047df36d80 jdk-9+163 965bbae3072702f7c0d95c240523b65e6bb19261 jdk-9+164 a510b2201154abdd12ede42788086b5283bfb9a6 jdk-9+165 +934c18145915b06d3fcc0de1a30f91f5aab8a192 jdk-9+166
--- a/hotspot/.hgtags Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/.hgtags Wed Jul 05 23:16:05 2017 +0200 @@ -569,3 +569,4 @@ 983fe207555724d98f4876991e1cbafbcf2733e8 jdk-9+163 0af429be8bbaeaaf0cb838e9af28c953dda6a9c8 jdk-9+164 c92c6416ca03b1464d5ed99cf6201e52b5ba0a70 jdk-9+165 +560d7aa083a24b6a56443feb8de0f40435d33aa9 jdk-9+166
--- a/hotspot/src/cpu/s390/vm/c1_Runtime1_s390.cpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/cpu/s390/vm/c1_Runtime1_s390.cpp Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2016 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. *
--- a/hotspot/src/share/vm/oops/metadata.hpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/share/vm/oops/metadata.hpp Wed Jul 05 23:16:05 2017 +0200 @@ -47,6 +47,7 @@ virtual bool is_method() const volatile { return false; } virtual bool is_methodData() const volatile { return false; } virtual bool is_constantPool() const volatile { return false; } + virtual bool is_methodCounters() const volatile { return false; } virtual const char* internal_name() const = 0;
--- a/hotspot/src/share/vm/oops/methodCounters.cpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/share/vm/oops/methodCounters.cpp Wed Jul 05 23:16:05 2017 +0200 @@ -73,3 +73,11 @@ #endif } + +void MethodCounters::print_value_on(outputStream* st) const { + assert(is_methodCounters(), "must be methodCounters"); + st->print("method counters"); + print_address_on(st); +} + +
--- a/hotspot/src/share/vm/oops/methodCounters.hpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/share/vm/oops/methodCounters.hpp Wed Jul 05 23:16:05 2017 +0200 @@ -30,7 +30,7 @@ #include "interpreter/invocationCounter.hpp" #include "runtime/arguments.hpp" -class MethodCounters: public MetaspaceObj { +class MethodCounters : public Metadata { friend class VMStructs; friend class JVMCIVMStructs; private: @@ -109,10 +109,11 @@ } public: + virtual bool is_methodCounters() const volatile { return true; } + static MethodCounters* allocate(methodHandle mh, TRAPS); void deallocate_contents(ClassLoaderData* loader_data) {} - DEBUG_ONLY(bool on_stack() { return false; }) // for template AOT_ONLY(Method* method() const { return _method; }) @@ -120,8 +121,6 @@ return align_size_up(sizeof(MethodCounters), wordSize) / wordSize; } - bool is_klass() const { return false; } - void clear_counters(); #if defined(COMPILER2) || INCLUDE_JVMCI @@ -253,5 +252,9 @@ static ByteSize backedge_mask_offset() { return byte_offset_of(MethodCounters, _backedge_mask); } + + virtual const char* internal_name() const { return "{method counters}"; } + virtual void print_value_on(outputStream* st) const; + }; #endif //SHARE_VM_OOPS_METHODCOUNTERS_HPP
--- a/hotspot/src/share/vm/opto/library_call.cpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/share/vm/opto/library_call.cpp Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1668,6 +1668,9 @@ } Node* adr = array_element_address(value, index, T_CHAR); + if (adr->is_top()) { + return false; + } if (is_store) { (void) store_to_memory(control(), adr, ch, T_CHAR, TypeAryPtr::BYTES, MemNode::unordered, false, false, true /* mismatched */);
--- a/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.cpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.cpp Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.hpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/share/vm/runtime/commandLineFlagConstraintsRuntime.hpp Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it
--- a/hotspot/src/share/vm/runtime/deoptimization.cpp Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/src/share/vm/runtime/deoptimization.cpp Wed Jul 05 23:16:05 2017 +0200 @@ -189,19 +189,6 @@ assert(vf->is_compiled_frame(), "Wrong frame type"); chunk->push(compiledVFrame::cast(vf)); - ScopeDesc* trap_scope = chunk->at(0)->scope(); - Handle exceptionObject; - if (trap_scope->rethrow_exception()) { - if (PrintDeoptimizationDetails) { - tty->print_cr("Exception to be rethrown in the interpreter for method %s::%s at bci %d", trap_scope->method()->method_holder()->name()->as_C_string(), trap_scope->method()->name()->as_C_string(), trap_scope->bci()); - } - GrowableArray<ScopeValue*>* expressions = trap_scope->expressions(); - guarantee(expressions != NULL && expressions->length() > 0, "must have exception to throw"); - ScopeValue* topOfStack = expressions->top(); - exceptionObject = StackValue::create_stack_value(&deoptee, &map, topOfStack)->get_obj(); - assert(exceptionObject() != NULL, "exception oop can not be null"); - } - bool realloc_failures = false; #if defined(COMPILER2) || INCLUDE_JVMCI @@ -296,6 +283,19 @@ #endif // INCLUDE_JVMCI #endif // COMPILER2 || INCLUDE_JVMCI + ScopeDesc* trap_scope = chunk->at(0)->scope(); + Handle exceptionObject; + if (trap_scope->rethrow_exception()) { + if (PrintDeoptimizationDetails) { + tty->print_cr("Exception to be rethrown in the interpreter for method %s::%s at bci %d", trap_scope->method()->method_holder()->name()->as_C_string(), trap_scope->method()->name()->as_C_string(), trap_scope->bci()); + } + GrowableArray<ScopeValue*>* expressions = trap_scope->expressions(); + guarantee(expressions != NULL && expressions->length() > 0, "must have exception to throw"); + ScopeValue* topOfStack = expressions->top(); + exceptionObject = StackValue::create_stack_value(&deoptee, &map, topOfStack)->get_obj(); + guarantee(exceptionObject() != NULL, "exception oop can not be null"); + } + // Ensure that no safepoint is taken after pointers have been stored // in fields of rematerialized objects. If a safepoint occurs from here on // out the java state residing in the vframeArray will be missed.
--- a/hotspot/test/compiler/ciReplay/SABase.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/compiler/ciReplay/SABase.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -141,7 +141,7 @@ if (Platform.isSolaris()) { try { OutputAnalyzer oa = ProcessTools.executeProcess("coreadm", "-p", "core", - "" + ProcessHandle.current().getPid()); + "" + ProcessHandle.current().pid()); oa.shouldHaveExitValue(0); } catch (Throwable t) { throw new Error("Can't launch coreadm: " + t, t);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/hotspot/test/compiler/intrinsics/string/TestStringUTF16IntrinsicRangeChecks.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,320 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8158168 + * @summary Verifies that callers of StringUTF16 intrinsics throw array out of bounds exceptions. + * @library /compiler/patches /test/lib + * @build java.base/java.lang.Helper + * @run main/othervm -Xbatch -XX:CompileThreshold=100 -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_getCharStringU,_putCharStringU compiler.intrinsics.string.TestStringUTF16IntrinsicRangeChecks + * @run main/othervm -Xbatch -XX:CompileThreshold=100 -esa -ea -XX:+UnlockDiagnosticVMOptions -XX:DisableIntrinsic=_getCharStringU,_putCharStringU compiler.intrinsics.string.TestStringUTF16IntrinsicRangeChecks + */ +package compiler.intrinsics.string; + +import java.lang.reflect.Field; +import java.util.Arrays; + +public class TestStringUTF16IntrinsicRangeChecks { + + public static void main(String[] args) throws Exception { + byte[] val = new byte[2]; + byte[] b4 = new byte[4]; + char[] c4 = new char[4]; + String s4 = new String(c4); + byte[] valHigh = new byte[2]; + byte[] valLow = new byte[2]; + Helper.putCharSB(valHigh, 0, Character.MIN_HIGH_SURROGATE); + Helper.putCharSB(valLow, 0, Character.MIN_LOW_SURROGATE); + + for (int i = 0; i < 1000; ++i) { + getChars((int)1234, -5, -5 + 4, val); + getChars((int)1234, -1, -1 + 4, val); + getChars((int)1234, 0, 0 + 4, val); + getChars((int)1234, 1, 1 + 4, val); + + getChars((long)1234, -5, -5 + 4, val); + getChars((long)1234, -1, -1 + 4, val); + getChars((long)1234, 0, 0 + 4, val); + getChars((long)1234, 1, 1 + 4, val); + + byte[] val2 = Arrays.copyOf(val, val.length); + putCharSB(val2, -1, '!'); + putCharSB(val2, 1, '!'); + + byte[] val4 = Arrays.copyOf(b4, b4.length); + char[] c2 = new char[2]; + String s2 = new String(c2); + + putCharsSB(val4, -3, c2, 0, 2); + putCharsSB(val4, -1, c2, 0, 2); + putCharsSB(val4, 0, c4, 0, 4); + putCharsSB(val4, 1, c2, 0, 2); + putCharsSB(val4, -3, s2, 0, 2); + putCharsSB(val4, -1, s2, 0, 2); + putCharsSB(val4, 0, s4, 0, 4); + putCharsSB(val4, 1, s2, 0, 2); + + codePointAtSB(valHigh, -1, 1); + codePointAtSB(valHigh, -1, 2); + codePointAtSB(valHigh, 0, 2); + codePointAtSB(valHigh, 1, 2); + + codePointBeforeSB(valLow, 0); + codePointBeforeSB(valLow, -1); + codePointBeforeSB(valLow, 2); + + if (Helper.codePointCountSB(valHigh, 0, 1) != 1) { + throw new AssertionError("codePointCountSB"); + } + if (Helper.codePointCountSB(valLow, 0, 1) != 1) { + throw new AssertionError("codePointCountSB"); + } + codePointCountSB(valHigh, -1, 0); + codePointCountSB(valHigh, -1, 2); + codePointCountSB(valHigh, 0, 2); + + charAt(val, -1); + charAt(val, 1); + + contentEquals(b4, val, -1); + contentEquals(b4, val, 2); + contentEquals(val, s4, 2); + contentEquals(val, s4, -1); + + StringBuilder sb = new StringBuilder(); + sb.append((String)null).append(true).append(false); + if (!sb.toString().equals("nulltruefalse")) { + throw new AssertionError("append"); + } + + putCharsAt(val2, -1, '1', '2', '3', '4'); + putCharsAt(val2, 0, '1', '2', '3', '4'); + putCharsAt(val2, 2, '1', '2', '3', '4'); + putCharsAt(val2, -1, '1', '2', '3', '4', '5'); + putCharsAt(val2, 0, '1', '2', '3', '4', '5'); + putCharsAt(val2, 2, '1', '2', '3', '4', '5'); + + reverse(valHigh, -1); + reverse(valHigh, 2); + reverse(valLow, -1); + reverse(valLow, 2); + + byte[] d4 = new byte[4]; + inflate(b4, 0, d4, -1, 2); + inflate(b4, 0, d4, 3, 2); + inflate(b4, 0, d4, 4, 1); + + byte[] b0 = new byte[0]; + byte[] b1 = new byte[1]; + byte[] b2 = new byte[2]; + byte[] t1 = new byte[] {1}; + byte[] t2 = new byte[] {1, 2}; + byte[] t4 = new byte[] {1, 2, 3, 4}; + indexOf(b1, 1, t2, 1, 0); + indexOf(b2, 1, t1, 1, 0); + indexOf(b2, 2, t2, 1, 0); + indexOf(b2, 1, t2, 2, 0); + indexOf(b2, -1, t2, 1, 0); + indexOf(b2, 1, t2, -1, 0); + indexOf(b2, 1, t2, 1, 1); + + indexOfLatin1(b1, 1, t1, 1, 0); + indexOfLatin1(b2, 2, t1, 1, 0); + indexOfLatin1(b2, 1, b0, 1, 0); + indexOfLatin1(b2, 1, t1, 2, 0); + indexOfLatin1(b2, -1, t1, 1, 0); + indexOfLatin1(b2, 2, t1, 1, 0); + indexOfLatin1(b2, 1, t1, -1, 0); + indexOfLatin1(b2, 1, t1, 2, 0); + + lastIndexOf(b1, t2, 1, 0); + lastIndexOf(b2, t4, 2, 0); + lastIndexOf(b2, t2, 1, 0); + lastIndexOf(b2, t2, 1, 1); + + lastIndexOfLatin1(b1, t1, 1, 0); + lastIndexOfLatin1(b2, t2, 2, 0); + lastIndexOfLatin1(b2, t1, 1, 0); + lastIndexOfLatin1(b2, t1, 1, 1); + } + } + + static void getChars(int i, int begin, int end, byte[] value) { + try { + Helper.getChars(i, begin, end, value); + throw new AssertionError("getChars"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void getChars(long l, int begin, int end, byte[] value) { + try { + Helper.getChars(l, begin, end, value); + throw new AssertionError("getChars"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void putCharSB(byte[] val, int index, int c) { + try { + Helper.putCharSB(val, index, c); + throw new AssertionError("putCharSB"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void putCharsSB(byte[] val, int index, char[] ca, int off, int end) { + try { + Helper.putCharsSB(val, index, ca, off, end); + throw new AssertionError("putCharsSB"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void putCharsSB(byte[] val, int index, CharSequence s, int off, int end) { + try { + Helper.putCharsSB(val, index, s, off, end); + throw new AssertionError("putCharsSB"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void codePointAtSB(byte[] val, int index, int end) { + try { + Helper.codePointAtSB(val, index, end); + throw new AssertionError("codePointAtSB"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void codePointBeforeSB(byte[] val, int index) { + try { + Helper.codePointBeforeSB(val, index); + throw new AssertionError("codePointBeforeSB"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void codePointCountSB(byte[] val, int beginIndex, int endIndex) { + try { + Helper.codePointCountSB(val, beginIndex, endIndex); + throw new AssertionError("codePointCountSB"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void charAt(byte[] v, int index) { + try { + Helper.charAt(v, index); + throw new AssertionError("charAt"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void contentEquals(byte[] v1, byte[] v2, int len) { + try { + Helper.contentEquals(v1, v2, len); + throw new AssertionError("contentEquals"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void contentEquals(byte[] v, CharSequence cs, int len) { + try { + Helper.contentEquals(v, cs, len); + throw new AssertionError("contentEquals"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void putCharsAt(byte[] v, int i, char c1, char c2, char c3, char c4) { + try { + Helper.putCharsAt(v, i, c1, c2, c3, c4); + throw new AssertionError("putCharsAt"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void putCharsAt(byte[] v, int i, char c1, char c2, char c3, char c4, char c5) { + try { + Helper.putCharsAt(v, i, c1, c2, c3, c4, c5); + throw new AssertionError("putCharsAt"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void reverse(byte[] v, int len) { + try { + Helper.reverse(v, len); + throw new AssertionError("reverse"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void inflate(byte[] v1, int o1, byte[] v2, int o2, int len) { + try { + Helper.inflate(v1, o1, v2, o2, len); + throw new AssertionError("inflate"); + } catch (IndexOutOfBoundsException io) { + } + } + + static void indexOf(byte[] v1, int l1, byte[] v2, int l2, int from) { + try { + if (Helper.indexOf(v1, l1, v2, l2, from) != -1) { + throw new AssertionError("indexOf"); + } + } catch (IndexOutOfBoundsException io) { + } + } + + static void lastIndexOf(byte[] v1, byte[] v2, int l2, int from) { + try { + if (Helper.lastIndexOf(v1, v2, l2, from) != -1) { + throw new AssertionError("lastIndexOf"); + } + } catch (IndexOutOfBoundsException io) { + } + } + + static void indexOfLatin1(byte[] v1, int l1, byte[] v2, int l2, int from) { + try { + if (Helper.indexOfLatin1(v1, l1, v2, l2, from) != -1) { + throw new AssertionError("indexOfLatin1"); + } + } catch (IndexOutOfBoundsException io) { + } + } + + static void lastIndexOfLatin1(byte[] v1, byte[] v2, int l2, int from) { + try { + if (Helper.lastIndexOfLatin1(v1, v2, l2, from) != -1) { + throw new AssertionError("lastIndexOfLatin1"); + } + } catch (IndexOutOfBoundsException io) { + } + } +}
--- a/hotspot/test/compiler/patches/java.base/java/lang/Helper.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/compiler/patches/java.base/java/lang/Helper.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,4 +73,84 @@ StringUTF16.getChars(value, srcBegin, srcEnd, dst, dstBegin); return dst; } + + public static void putCharSB(byte[] val, int index, int c) { + StringUTF16.putCharSB(val, index, c); + } + + public static void putCharsSB(byte[] val, int index, char[] ca, int off, int end) { + StringUTF16.putCharsSB(val, index, ca, off, end); + } + + public static void putCharsSB(byte[] val, int index, CharSequence s, int off, int end) { + StringUTF16.putCharsSB(val, index, s, off, end); + } + + public static int codePointAtSB(byte[] val, int index, int end) { + return StringUTF16.codePointAtSB(val, index, end); + } + + public static int codePointBeforeSB(byte[] val, int index) { + return StringUTF16.codePointBeforeSB(val, index); + } + + public static int codePointCountSB(byte[] val, int beginIndex, int endIndex) { + return StringUTF16.codePointCountSB(val, beginIndex, endIndex); + } + + public static int getChars(int i, int begin, int end, byte[] value) { + return StringUTF16.getChars(i, begin, end, value); + } + + public static int getChars(long l, int begin, int end, byte[] value) { + return StringUTF16.getChars(l, begin, end, value); + } + + public static boolean contentEquals(byte[] v1, byte[] v2, int len) { + return StringUTF16.contentEquals(v1, v2, len); + } + + public static boolean contentEquals(byte[] value, CharSequence cs, int len) { + return StringUTF16.contentEquals(value, cs, len); + } + + public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4) { + return StringUTF16.putCharsAt(value, i, c1, c2, c3, c4); + } + + public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4, char c5) { + return StringUTF16.putCharsAt(value, i, c1, c2, c3, c4, c5); + } + + public static char charAt(byte[] value, int index) { + return StringUTF16.charAt(value, index); + } + + public static void reverse(byte[] value, int count) { + StringUTF16.reverse(value, count); + } + + public static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { + StringUTF16.inflate(src, srcOff, dst, dstOff, len); + } + + public static int indexOf(byte[] src, int srcCount, + byte[] tgt, int tgtCount, int fromIndex) { + return StringUTF16.indexOf(src, srcCount, tgt, tgtCount, fromIndex); + } + + public static int indexOfLatin1(byte[] src, int srcCount, + byte[] tgt, int tgtCount, int fromIndex) { + return StringUTF16.indexOfLatin1(src, srcCount, tgt, tgtCount, fromIndex); + } + public static int lastIndexOf(byte[] src, byte[] tgt, int tgtCount, int fromIndex) { + int srcCount = StringUTF16.length(src); // ignored + return StringUTF16.lastIndexOf(src, srcCount, tgt, tgtCount, fromIndex); + } + + public static int lastIndexOfLatin1(byte[] src, byte[] tgt, int tgtCount, int fromIndex) { + int srcCount = StringUTF16.length(src); // ignored + return StringUTF16.lastIndexOfLatin1(src, srcCount, tgt, tgtCount, fromIndex); + } + }
--- a/hotspot/test/runtime/libadimalloc.solaris.sparc/Testlibadimalloc.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/runtime/libadimalloc.solaris.sparc/Testlibadimalloc.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,7 +67,7 @@ // Start the process, get the pid and then wait for the test to finish Process process = builder.start(); - long pid = process.getPid(); + long pid = process.pid(); int retval = process.waitFor(); // make sure the SEGVOverflow test crashed
--- a/hotspot/test/serviceability/attach/AttachSetGetFlag.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/attach/AttachSetGetFlag.java Wed Jul 05 23:16:05 2017 +0200 @@ -80,7 +80,7 @@ try { waitForReady(target); - int pid = (int)target.getPid(); + int pid = (int)target.pid(); HotSpotVirtualMachine vm = (HotSpotVirtualMachine)VirtualMachine.attach(((Integer)pid).toString()); @@ -116,7 +116,7 @@ try { waitForReady(target); - int pid = (int)target.getPid(); + int pid = (int)target.pid(); HotSpotVirtualMachine vm = (HotSpotVirtualMachine)VirtualMachine.attach(((Integer)pid).toString());
--- a/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/sa/sadebugd/SADebugDTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -60,7 +60,7 @@ return; } - long ourPid = ProcessHandle.current().getPid(); + long ourPid = ProcessHandle.current().pid(); // The string we are expecting in the debugd ouput String golden = String.format(GOLDEN, ourPid);
--- a/hotspot/test/serviceability/tmtools/jstack/DaemonThreadTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstack/DaemonThreadTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -78,7 +78,7 @@ thread.start(); // Run jstack tool and collect the output - JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid()); + JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid()); ToolResults results = jstackTool.measure(); // Analyze the jstack output for the correct thread type
--- a/hotspot/test/serviceability/tmtools/jstack/SpreadLockTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstack/SpreadLockTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -96,7 +96,7 @@ debuggee.start(); // Collect output from the jstack tool - JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid()); + JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid()); ToolResults results1 = jstackTool.measure(); // Go to method b()
--- a/hotspot/test/serviceability/tmtools/jstack/ThreadNamesTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstack/ThreadNamesTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,7 +61,7 @@ thread.start(); // Run jstack tool and collect the output - JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid()); + JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid()); ToolResults results = jstackTool.measure(); // Analyze the jstack output for the strange thread name
--- a/hotspot/test/serviceability/tmtools/jstack/TraveledLockTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstack/TraveledLockTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -95,7 +95,7 @@ debuggee.start(); // Collect output from the jstack tool - JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid()); + JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid()); ToolResults results1 = jstackTool.measure(); // Go to method b()
--- a/hotspot/test/serviceability/tmtools/jstack/WaitNotifyThreadTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstack/WaitNotifyThreadTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -105,7 +105,7 @@ waitThread.start(); // Collect output from the jstack tool - JstackTool jstackTool = new JstackTool(ProcessHandle.current().getPid()); + JstackTool jstackTool = new JstackTool(ProcessHandle.current().pid()); ToolResults results = jstackTool.measure(); // Analyze the jstack output for the patterns needed
--- a/hotspot/test/serviceability/tmtools/jstat/GcCapacityTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstat/GcCapacityTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ public static void main(String[] args) throws Exception { // We will be running "jstat -gc" tool - JstatGcCapacityTool jstatGcTool = new JstatGcCapacityTool(ProcessHandle.current().getPid()); + JstatGcCapacityTool jstatGcTool = new JstatGcCapacityTool(ProcessHandle.current().pid()); // Run once and get the results asserting that they are reasonable JstatGcCapacityResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcCauseTest01.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstat/GcCauseTest01.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ public static void main(String[] args) throws Exception { // We will be running "jstat -gc" tool - JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().getPid()); + JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().pid()); // Run once and get the results asserting that they are reasonable JstatGcCauseResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcCauseTest02.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstat/GcCauseTest02.java Wed Jul 05 23:16:05 2017 +0200 @@ -38,6 +38,6 @@ public class GcCauseTest02 { public static void main(String[] args) throws Exception { - new GarbageProducerTest(new JstatGcCauseTool(ProcessHandle.current().getPid())).run(); + new GarbageProducerTest(new JstatGcCauseTool(ProcessHandle.current().pid())).run(); } }
--- a/hotspot/test/serviceability/tmtools/jstat/GcCauseTest03.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstat/GcCauseTest03.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ public static void main(String[] args) throws Exception { // We will be running "jstat -gc" tool - JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().getPid()); + JstatGcCauseTool jstatGcTool = new JstatGcCauseTool(ProcessHandle.current().pid()); System.gc();
--- a/hotspot/test/serviceability/tmtools/jstat/GcNewTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstat/GcNewTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ public static void main(String[] args) throws Exception { // We will be running "jstat -gc" tool - JstatGcNewTool jstatGcTool = new JstatGcNewTool(ProcessHandle.current().getPid()); + JstatGcNewTool jstatGcTool = new JstatGcNewTool(ProcessHandle.current().pid()); // Run once and get the results asserting that they are reasonable JstatGcNewResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcTest01.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstat/GcTest01.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ public static void main(String[] args) throws Exception { // We will be running "jstat -gc" tool - JstatGcTool jstatGcTool = new JstatGcTool(ProcessHandle.current().getPid()); + JstatGcTool jstatGcTool = new JstatGcTool(ProcessHandle.current().pid()); // Run once and get the results asserting that they are reasonable JstatGcResults measurement1 = jstatGcTool.measure();
--- a/hotspot/test/serviceability/tmtools/jstat/GcTest02.java Sat Apr 22 00:22:27 2017 +0000 +++ b/hotspot/test/serviceability/tmtools/jstat/GcTest02.java Wed Jul 05 23:16:05 2017 +0200 @@ -38,6 +38,6 @@ public class GcTest02 { public static void main(String[] args) throws Exception { - new GarbageProducerTest(new JstatGcTool(ProcessHandle.current().getPid())).run(); + new GarbageProducerTest(new JstatGcTool(ProcessHandle.current().pid())).run(); } }
--- a/jdk/.hgtags Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/.hgtags Wed Jul 05 23:16:05 2017 +0200 @@ -409,3 +409,4 @@ 50171f8c47961710cbf87aead6f03fa431d8d240 jdk-9+163 6dea581453d7c0e767e3169cfec8b423a381e71d jdk-9+164 a7942c3b1e59495dbf51dc7c41aab355fcd253d7 jdk-9+165 +5d2b48f1f0a322aca719b49ff02ab421705bffc7 jdk-9+166
--- a/jdk/make/data/charsetmapping/stdcs-linux Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/make/data/charsetmapping/stdcs-linux Wed Jul 05 23:16:05 2017 +0200 @@ -24,3 +24,5 @@ JIS_X_0212 JIS_X_0208_Solaris JIS_X_0212_Solaris +MS932 +SJIS # SJIS must go together with MS932 to support sun.nio.cs.map
--- a/jdk/src/java.base/linux/native/libnio/ch/EPoll.c Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/linux/native/libnio/ch/EPoll.c Wed Jul 05 23:16:05 2017 +0200 @@ -95,9 +95,3 @@ } return res; } - -JNIEXPORT void JNICALL -Java_sun_nio_ch_EPoll_close0(JNIEnv *env, jclass c, jint epfd) { - int res; - RESTARTABLE(close(epfd), res); -}
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/CounterMode.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/CounterMode.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,10 +42,10 @@ * @author Andreas Sterbenz * @since 1.4.2 */ -final class CounterMode extends FeedbackCipher { +class CounterMode extends FeedbackCipher { // current counter value - private final byte[] counter; + final byte[] counter; // encrypted bytes of the previous counter value private final byte[] encryptedCounter;
--- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,52 +29,43 @@ package com.sun.crypto.provider; -import java.security.*; -import javax.crypto.*; +import javax.crypto.IllegalBlockSizeException; import static com.sun.crypto.provider.AESConstants.AES_BLOCK_SIZE; /** * This class represents the GCTR function defined in NIST 800-38D - * under section 6.5. It needs to be constructed w/ an initialized - * cipher object, and initial counter block(ICB). Given an input X - * of arbitrary length, it processes and returns an output which has - * the same length as X. The invariants of this class are: - * - * (1) The length of intialCounterBlk (and also of its clones, e.g., - * fields counter and counterSave) is equal to AES_BLOCK_SIZE. - * - * (2) After construction, the field counter never becomes null, it - * always contains a byte array of length AES_BLOCK_SIZE. + * under section 6.5. With a given cipher object and initial counter + * block, a counter mode operation is performed. Blocksize is limited + * to 16 bytes. * * If any invariant is broken, failures can occur because the * AESCrypt.encryptBlock method can be intrinsified on the HotSpot VM * (see JDK-8067648 for details). * + * The counter mode operations can be intrinsified and parallelized + * by using CounterMode.implCrypt() if HotSpot VM supports it on the + * architecture. + * * <p>This function is used in the implementation of GCM mode. * * @since 1.8 */ -final class GCTR { - - // these fields should not change after the object has been constructed - private final SymmetricCipher aes; - private final byte[] icb; +final class GCTR extends CounterMode { - // the current counter value - private byte[] counter; - - // needed for save/restore calls - private byte[] counterSave = null; - - // NOTE: cipher should already be initialized GCTR(SymmetricCipher cipher, byte[] initialCounterBlk) { - this.aes = cipher; + super(cipher); if (initialCounterBlk.length != AES_BLOCK_SIZE) { throw new RuntimeException("length of initial counter block (" + initialCounterBlk.length + ") not equal to AES_BLOCK_SIZE (" + AES_BLOCK_SIZE + ")"); } - this.icb = initialCounterBlk; - this.counter = icb.clone(); + + iv = initialCounterBlk; + reset(); + } + + @Override + String getFeedback() { + return "GCTR"; } // input must be multiples of 128-bit blocks when calling update @@ -89,23 +80,11 @@ throw new RuntimeException("output buffer too small"); } - byte[] encryptedCntr = new byte[AES_BLOCK_SIZE]; - - int numOfCompleteBlocks = inLen / AES_BLOCK_SIZE; - for (int i = 0; i < numOfCompleteBlocks; i++) { - aes.encryptBlock(counter, 0, encryptedCntr, 0); - for (int n = 0; n < AES_BLOCK_SIZE; n++) { - int index = (i * AES_BLOCK_SIZE + n); - out[outOfs + index] = - (byte) ((in[inOfs + index] ^ encryptedCntr[n])); - } - GaloisCounterMode.increment32(counter); - } - return inLen; + return encrypt(in, inOfs, inLen, out, outOfs); } // input can be arbitrary size when calling doFinal - protected int doFinal(byte[] in, int inOfs, int inLen, byte[] out, + int doFinal(byte[] in, int inOfs, int inLen, byte[] out, int outOfs) throws IllegalBlockSizeException { try { if (inLen < 0) { @@ -118,7 +97,7 @@ if (lastBlockSize != 0) { // do the last partial block byte[] encryptedCntr = new byte[AES_BLOCK_SIZE]; - aes.encryptBlock(counter, 0, encryptedCntr, 0); + embeddedCipher.encryptBlock(counter, 0, encryptedCntr, 0); for (int n = 0; n < lastBlockSize; n++) { out[outOfs + completeBlkLen + n] = (byte) ((in[inOfs + completeBlkLen + n] ^ @@ -131,28 +110,4 @@ } return inLen; } - - /** - * Resets the content of this object to when it's first constructed. - */ - void reset() { - System.arraycopy(icb, 0, counter, 0, icb.length); - counterSave = null; - } - - /** - * Save the current content of this object. - */ - void save() { - this.counterSave = this.counter.clone(); - } - - /** - * Restores the content of this object to the previous saved one. - */ - void restore() { - if (this.counterSave != null) { - this.counter = this.counterSave; - } - } }
--- a/jdk/src/java.base/share/classes/java/io/FilePermission.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/io/FilePermission.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -209,6 +209,10 @@ private static final Path here = builtInFS.getPath( GetPropertyAction.privilegedGetProperty("user.dir")); + private static final Path EMPTY_PATH = builtInFS.getPath(""); + private static final Path DASH_PATH = builtInFS.getPath("-"); + private static final Path DOTDOT_PATH = builtInFS.getPath(".."); + /** * A private constructor that clones some and updates some, * always with a different name. @@ -341,7 +345,7 @@ .normalize(); // lastName should always be non-null now Path lastName = npath.getFileName(); - if (lastName != null && lastName.toString().equals("-")) { + if (lastName != null && lastName.equals(DASH_PATH)) { directory = true; recursive = !rememberStar; npath = npath.getParent(); @@ -679,23 +683,76 @@ * @return the depth in between */ private static int containsPath(Path p1, Path p2) { - Path p; - try { - p = p2.relativize(p1).normalize(); - if (p.getName(0).toString().isEmpty()) { - return 0; - } else { - for (Path item: p) { - String s = item.toString(); - if (!s.equals("..")) { - return -1; - } - } - return p.getNameCount(); - } - } catch (IllegalArgumentException iae) { + + // Two paths must have the same root. For example, + // there is no contains relation between any two of + // "/x", "x", "C:/x", "C:x", and "//host/share/x". + if (!Objects.equals(p1.getRoot(), p2.getRoot())) { return -1; } + + // Empty path (i.e. "." or "") is a strange beast, + // because its getNameCount()==1 but getName(0) is null. + // It's better to deal with it separately. + if (p1.equals(EMPTY_PATH)) { + if (p2.equals(EMPTY_PATH)) { + return 0; + } else if (p2.getName(0).equals(DOTDOT_PATH)) { + // "." contains p2 iif p2 has no "..". Since a + // a normalized path can only have 0 or more + // ".." at the beginning. We only need to look + // at the head. + return -1; + } else { + // and the distance is p2's name count. i.e. + // 3 between "." and "a/b/c". + return p2.getNameCount(); + } + } else if (p2.equals(EMPTY_PATH)) { + int c1 = p1.getNameCount(); + if (!p1.getName(c1 - 1).equals(DOTDOT_PATH)) { + // "." is inside p1 iif p1 is 1 or more "..". + // For the same reason above, we only need to + // look at the tail. + return -1; + } + // and the distance is the count of ".." + return c1; + } + + // Good. No more empty paths. + + // Common heads are removed + + int c1 = p1.getNameCount(); + int c2 = p2.getNameCount(); + + int n = Math.min(c1, c2); + int i = 0; + while (i < n) { + if (!p1.getName(i).equals(p2.getName(i))) + break; + i++; + } + + // for p1 containing p2, p1 must be 0-or-more "..", + // and p2 cannot have "..". For the same reason, we only + // check tail of p1 and head of p2. + if (i < c1 && !p1.getName(c1 - 1).equals(DOTDOT_PATH)) { + return -1; + } + + if (i < c2 && p2.getName(i).equals(DOTDOT_PATH)) { + return -1; + } + + // and the distance is the name counts added (after removing + // the common heads). + + // For example: p1 = "../../..", p2 = "../a". + // After removing the common heads, they become "../.." and "a", + // and the distance is (3-1)+(2-1) = 3. + return c1 - i + c2 - i; } /**
--- a/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/AbstractStringBuilder.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -307,6 +307,8 @@ * sequence. */ public int codePointAt(int index) { + int count = this.count; + byte[] value = this.value; checkIndex(index, count); if (isLatin1()) { return value[index] & 0xff; @@ -560,11 +562,7 @@ val[count++] = 'l'; val[count++] = 'l'; } else { - checkOffset(count + 4, val.length >> 1); - StringUTF16.putChar(val, count++, 'n'); - StringUTF16.putChar(val, count++, 'u'); - StringUTF16.putChar(val, count++, 'l'); - StringUTF16.putChar(val, count++, 'l'); + count = StringUTF16.putCharsAt(val, count, 'n', 'u', 'l', 'l'); } this.count = count; return this; @@ -695,18 +693,9 @@ } } else { if (b) { - checkOffset(count + 4, val.length >> 1); - StringUTF16.putChar(val, count++, 't'); - StringUTF16.putChar(val, count++, 'r'); - StringUTF16.putChar(val, count++, 'u'); - StringUTF16.putChar(val, count++, 'e'); + count = StringUTF16.putCharsAt(val, count, 't', 'r', 'u', 'e'); } else { - checkOffset(count + 5, val.length >> 1); - StringUTF16.putChar(val, count++, 'f'); - StringUTF16.putChar(val, count++, 'a'); - StringUTF16.putChar(val, count++, 'l'); - StringUTF16.putChar(val, count++, 's'); - StringUTF16.putChar(val, count++, 'e'); + count = StringUTF16.putCharsAt(val, count, 'f', 'a', 'l', 's', 'e'); } } this.count = count; @@ -755,16 +744,15 @@ * @return a reference to this object. */ public AbstractStringBuilder append(int i) { + int count = this.count; int spaceNeeded = count + Integer.stringSize(i); ensureCapacityInternal(spaceNeeded); if (isLatin1()) { Integer.getChars(i, spaceNeeded, value); } else { - byte[] val = this.value; - checkOffset(spaceNeeded, val.length >> 1); - Integer.getCharsUTF16(i, spaceNeeded, val); + StringUTF16.getChars(i, count, spaceNeeded, value); } - count = spaceNeeded; + this.count = spaceNeeded; return this; } @@ -781,16 +769,15 @@ * @return a reference to this object. */ public AbstractStringBuilder append(long l) { + int count = this.count; int spaceNeeded = count + Long.stringSize(l); ensureCapacityInternal(spaceNeeded); if (isLatin1()) { Long.getChars(l, spaceNeeded, value); } else { - byte[] val = this.value; - checkOffset(spaceNeeded, val.length >> 1); - Long.getCharsUTF16(l, spaceNeeded, val); + StringUTF16.getChars(l, count, spaceNeeded, value); } - count = spaceNeeded; + this.count = spaceNeeded; return this; } @@ -843,6 +830,7 @@ * greater than {@code end}. */ public AbstractStringBuilder delete(int start, int end) { + int count = this.count; if (end > count) { end = count; } @@ -850,7 +838,7 @@ int len = end - start; if (len > 0) { shift(end, -len); - count -= len; + this.count = count - len; } return this; } @@ -925,6 +913,7 @@ * greater than {@code end}. */ public AbstractStringBuilder replace(int start, int end, String str) { + int count = this.count; if (end > count) { end = count; } @@ -933,7 +922,7 @@ int newCount = count + len - (end - start); ensureCapacityInternal(newCount); shift(end, newCount - count); - count = newCount; + this.count = newCount; putStringAt(start, str); return this; } @@ -1500,40 +1489,11 @@ val[k] = cj; } } else { - checkOffset(count, val.length >> 1); - boolean hasSurrogates = false; - for (int j = (n-1) >> 1; j >= 0; j--) { - int k = n - j; - char cj = StringUTF16.getChar(val, j); - char ck = StringUTF16.getChar(val, k); - StringUTF16.putChar(val, j, ck); - StringUTF16.putChar(val, k, cj); - if (Character.isSurrogate(cj) || - Character.isSurrogate(ck)) { - hasSurrogates = true; - } - } - if (hasSurrogates) { - reverseAllValidSurrogatePairs(val, count); - } + StringUTF16.reverse(val, count); } return this; } - /** Outlined helper method for reverse() */ - private void reverseAllValidSurrogatePairs(byte[] val, int count) { - for (int i = 0; i < count - 1; i++) { - char c2 = StringUTF16.getChar(val, i); - if (Character.isLowSurrogate(c2)) { - char c1 = StringUTF16.getChar(val, i + 1); - if (Character.isHighSurrogate(c1)) { - StringUTF16.putChar(val, i++, c1); - StringUTF16.putChar(val, i, c2); - } - } - } - } - /** * Returns a string representing the data in this sequence. * A new {@code String} object is allocated and initialized to @@ -1682,6 +1642,7 @@ } private final void appendChars(char[] s, int off, int end) { + int count = this.count; if (isLatin1()) { byte[] val = this.value; for (int i = off, j = count; i < end; i++) { @@ -1689,17 +1650,17 @@ if (StringLatin1.canEncode(c)) { val[j++] = (byte)c; } else { - count = j; + this.count = count = j; inflate(); StringUTF16.putCharsSB(this.value, j, s, i, end); - count += end - i; + this.count = count + end - i; return; } } } else { StringUTF16.putCharsSB(this.value, count, s, off, end); } - count += end - off; + this.count = count + end - off; } private final void appendChars(CharSequence s, int off, int end) {
--- a/jdk/src/java.base/share/classes/java/lang/Integer.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/Integer.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -386,7 +386,7 @@ } /** byte[]/UTF16 version */ - static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int offset, int len) { + private static void formatUnsignedIntUTF16(int val, int shift, byte[] buf, int offset, int len) { int charPos = offset + len; int radix = 1 << shift; int mask = radix - 1; @@ -442,7 +442,7 @@ return new String(buf, LATIN1); } else { byte[] buf = new byte[size * 2]; - getCharsUTF16(i, size, buf); + StringUTF16.getChars(i, size, buf); return new String(buf, UTF16); } } @@ -516,49 +516,6 @@ return charPos; } - /** - * This is a variant of {@link #getChars(int, int, byte[])}, but for - * UTF-16 coder. - * - * @param i value to convert - * @param index next index, after the least significant digit - * @param buf target buffer, UTF16-coded. - * @return index of the most significant digit or minus sign, if present - */ - static int getCharsUTF16(int i, int index, byte[] buf) { - int q, r; - int charPos = index; - - boolean negative = (i < 0); - if (!negative) { - i = -i; - } - - // Get 2 digits/iteration using ints - while (i <= -100) { - q = i / 100; - r = (q * 100) - i; - i = q; - StringUTF16.putChar(buf, --charPos, DigitOnes[r]); - StringUTF16.putChar(buf, --charPos, DigitTens[r]); - } - - // We know there are at most two digits left at this point. - q = i / 10; - r = (q * 10) - i; - StringUTF16.putChar(buf, --charPos, '0' + r); - - // Whatever left is the remaining digit. - if (q < 0) { - StringUTF16.putChar(buf, --charPos, '0' - q); - } - - if (negative) { - StringUTF16.putChar(buf, --charPos, '-'); - } - return charPos; - } - // Left here for compatibility reasons, see JDK-8143900. static final int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE };
--- a/jdk/src/java.base/share/classes/java/lang/Long.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/Long.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -414,7 +414,7 @@ } /** byte[]/UTF16 version */ - static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, int offset, int len) { + private static void formatUnsignedLong0UTF16(long val, int shift, byte[] buf, int offset, int len) { int charPos = offset + len; int radix = 1 << shift; int mask = radix - 1; @@ -475,7 +475,7 @@ return new String(buf, LATIN1); } else { byte[] buf = new byte[size * 2]; - getCharsUTF16(i, size, buf); + StringUTF16.getChars(i, size, buf); return new String(buf, UTF16); } } @@ -562,61 +562,6 @@ } /** - * This is a variant of {@link #getChars(long, int, byte[])}, but for - * UTF-16 coder. - * - * @param i value to convert - * @param index next index, after the least significant digit - * @param buf target buffer, UTF16-coded. - * @return index of the most significant digit or minus sign, if present - */ - static int getCharsUTF16(long i, int index, byte[] buf) { - long q; - int r; - int charPos = index; - - boolean negative = (i < 0); - if (!negative) { - i = -i; - } - - // Get 2 digits/iteration using longs until quotient fits into an int - while (i <= Integer.MIN_VALUE) { - q = i / 100; - r = (int)((q * 100) - i); - i = q; - StringUTF16.putChar(buf, --charPos, Integer.DigitOnes[r]); - StringUTF16.putChar(buf, --charPos, Integer.DigitTens[r]); - } - - // Get 2 digits/iteration using ints - int q2; - int i2 = (int)i; - while (i2 <= -100) { - q2 = i2 / 100; - r = (q2 * 100) - i2; - i2 = q2; - StringUTF16.putChar(buf, --charPos, Integer.DigitOnes[r]); - StringUTF16.putChar(buf, --charPos, Integer.DigitTens[r]); - } - - // We know there are at most two digits left at this point. - q2 = i2 / 10; - r = (q2 * 10) - i2; - StringUTF16.putChar(buf, --charPos, '0' + r); - - // Whatever left is the remaining digit. - if (q2 < 0) { - StringUTF16.putChar(buf, --charPos, '0' - q2); - } - - if (negative) { - StringUTF16.putChar(buf, --charPos, '-'); - } - return charPos; - } - - /** * Returns the string representation size for a given long value. * * @param x long value
--- a/jdk/src/java.base/share/classes/java/lang/Process.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/Process.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,10 +80,10 @@ * * <p>Subclasses of Process should override the {@link #onExit()} and * {@link #toHandle()} methods to provide a fully functional Process including the - * {@link #getPid() process id}, - * {@link #info() information about the process}, - * {@link #children() direct children}, and - * {@link #descendants() direct children plus descendants of those children} of the process. + * {@linkplain #pid() process id}, + * {@linkplain #info() information about the process}, + * {@linkplain #children() direct children}, and + * {@linkplain #descendants() direct children plus descendants of those children} of the process. * Delegating to the underlying Process or ProcessHandle is typically * easiest and most efficient. * @@ -237,14 +237,14 @@ /** * Kills the process. * Whether the process represented by this {@code Process} object is - * {@link #supportsNormalTermination normally terminated} or not is + * {@linkplain #supportsNormalTermination normally terminated} or not is * implementation dependent. * Forcible process destruction is defined as the immediate termination of a * process, whereas normal termination allows the process to shut down cleanly. * If the process is not alive, no action is taken. * <p> * The {@link java.util.concurrent.CompletableFuture} from {@link #onExit} is - * {@link java.util.concurrent.CompletableFuture#complete completed} + * {@linkplain java.util.concurrent.CompletableFuture#complete completed} * when the process has terminated. */ public abstract void destroy(); @@ -257,7 +257,7 @@ * If the process is not alive, no action is taken. * <p> * The {@link java.util.concurrent.CompletableFuture} from {@link #onExit} is - * {@link java.util.concurrent.CompletableFuture#complete completed} + * {@linkplain java.util.concurrent.CompletableFuture#complete completed} * when the process has terminated. * <p> * Invoking this method on {@code Process} objects returned by @@ -335,15 +335,15 @@ * * @implSpec * The implementation of this method returns the process id as: - * {@link #toHandle toHandle().getPid()}. + * {@link #toHandle toHandle().pid()}. * * @return the native process id of the process * @throws UnsupportedOperationException if the Process implementation * does not support this operation * @since 9 */ - public long getPid() { - return toHandle().getPid(); + public long pid() { + return toHandle().pid(); } /** @@ -357,9 +357,9 @@ * <p> * Calling {@code onExit().get()} waits for the process to terminate and returns * the Process. The future can be used to check if the process is - * {@link java.util.concurrent.CompletableFuture#isDone done} or to - * {@link java.util.concurrent.CompletableFuture#get() wait} for it to terminate. - * {@link java.util.concurrent.CompletableFuture#cancel(boolean) Cancelling} + * {@linkplain java.util.concurrent.CompletableFuture#isDone done} or to + * {@linkplain java.util.concurrent.CompletableFuture#get() wait} for it to terminate. + * {@linkplain java.util.concurrent.CompletableFuture#cancel(boolean) Cancelling} * the CompletableFuture does not affect the Process. * <p> * Processes returned from {@link ProcessBuilder#start} override the @@ -389,7 +389,7 @@ * {@code waitFor} is interrupted, the thread's interrupt status is preserved. * <p> * When {@link #waitFor()} returns successfully the CompletableFuture is - * {@link java.util.concurrent.CompletableFuture#complete completed} regardless + * {@linkplain java.util.concurrent.CompletableFuture#complete completed} regardless * of the exit status of the process. * * This implementation may consume a lot of memory for thread stacks if a @@ -463,7 +463,7 @@ * This implementation throws an instance of * {@link java.lang.UnsupportedOperationException} and performs no other action. * Subclasses should override this method to provide a ProcessHandle for the - * process. The methods {@link #getPid}, {@link #info}, {@link #children}, + * process. The methods {@link #pid}, {@link #info}, {@link #children}, * and {@link #descendants}, unless overridden, operate on the ProcessHandle. * * @return Returns a ProcessHandle for the Process @@ -500,10 +500,10 @@ /** * Returns a snapshot of the direct children of the process. * The parent of a direct child process is the process. - * Typically, a process that is {@link #isAlive not alive} has no children. + * Typically, a process that is {@linkplain #isAlive not alive} has no children. * <p> * <em>Note that processes are created and terminate asynchronously. - * There is no guarantee that a process is {@link #isAlive alive}. + * There is no guarantee that a process is {@linkplain #isAlive alive}. * </em> * * @implSpec @@ -526,10 +526,10 @@ * Returns a snapshot of the descendants of the process. * The descendants of a process are the children of the process * plus the descendants of those children, recursively. - * Typically, a process that is {@link #isAlive not alive} has no children. + * Typically, a process that is {@linkplain #isAlive not alive} has no children. * <p> * <em>Note that processes are created and terminate asynchronously. - * There is no guarantee that a process is {@link #isAlive alive}. + * There is no guarantee that a process is {@linkplain #isAlive alive}. * </em> * * @implSpec
--- a/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandle.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -104,7 +104,7 @@ * @throws UnsupportedOperationException if the implementation * does not support this operation */ - long getPid(); + long pid(); /** * Returns an {@code Optional<ProcessHandle>} for an existing native process. @@ -383,7 +383,7 @@ /** * Returns a hash code value for this ProcessHandle. * The hashcode value follows the general contract for {@link Object#hashCode()}. - * The value is a function of the {@link #getPid getPid()} value and + * The value is a function of the {@link #pid pid()} value and * may be a function of additional information to uniquely identify the process. * If two ProcessHandles are equal according to the {@link #equals(Object) equals} * method, then calling the hashCode method on each of the two objects
--- a/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/ProcessHandleImpl.java Wed Jul 05 23:16:05 2017 +0200 @@ -35,11 +35,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.Executor; import java.util.concurrent.Executors; -import java.util.concurrent.ForkJoinPool; -import java.util.concurrent.SynchronousQueue; import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; import java.util.stream.IntStream; import java.util.stream.Stream; @@ -176,7 +172,7 @@ throw new IllegalStateException("onExit for current process not allowed"); } - return ProcessHandleImpl.completion(getPid(), false) + return ProcessHandleImpl.completion(pid(), false) .handleAsync((exitStatus, unusedThrowable) -> this); } @@ -259,7 +255,7 @@ * @return the native process ID */ @Override - public long getPid() { + public long pid() { return pid; }
--- a/jdk/src/java.base/share/classes/java/lang/String.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/String.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1994, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1994, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1064,11 +1064,7 @@ if (!isLatin1()) { // utf16 str and latin1 abs can never be "equal" return false; } - for (int i = 0; i < len; i++) { - if ((char)(v1[i] & 0xff) != StringUTF16.getChar(v2, i)) { - return false; - } - } + return StringUTF16.contentEquals(v1, v2, len); } return true; } @@ -1120,10 +1116,8 @@ } } } else { - for (int i = 0; i < n; i++) { - if (StringUTF16.getChar(val, i) != cs.charAt(i)) { - return false; - } + if (!StringUTF16.contentEquals(val, cs, n)) { + return false; } } return true; @@ -1734,6 +1728,9 @@ if (tgtCount == 0) { return fromIndex; } + if (tgtCount > srcCount) { + return -1; + } if (srcCoder == tgtCoder) { return srcCoder == LATIN1 ? StringLatin1.indexOf(src, srcCount, tgt, tgtCount, fromIndex) @@ -1792,7 +1789,7 @@ * is the string being searched for. * * @param src the characters being searched. - * @param srcCoder coder handles the mapping between bytes/chars + * @param srcCoder coder handles the mapping between bytes/chars * @param srcCount count of the source string. * @param tgt the characters being searched for. * @param fromIndex the index to begin searching from. @@ -1807,12 +1804,12 @@ * consistency, don't check for null str. */ int rightIndex = srcCount - tgtCount; + if (fromIndex > rightIndex) { + fromIndex = rightIndex; + } if (fromIndex < 0) { return -1; } - if (fromIndex > rightIndex) { - fromIndex = rightIndex; - } /* Empty string always matches. */ if (tgtCount == 0) { return fromIndex; @@ -1825,31 +1822,8 @@ if (srcCoder == LATIN1) { // && tgtCoder == UTF16 return -1; } - // srcCoder == UTF16 && tgtCoder == LATIN1 - int min = tgtCount - 1; - int i = min + fromIndex; - int strLastIndex = tgtCount - 1; - - char strLastChar = (char)(tgt[strLastIndex] & 0xff); - startSearchForLastChar: - while (true) { - while (i >= min && StringUTF16.getChar(src, i) != strLastChar) { - i--; - } - if (i < min) { - return -1; - } - int j = i - 1; - int start = j - strLastIndex; - int k = strLastIndex - 1; - while (j > start) { - if (StringUTF16.getChar(src, j--) != (tgt[k--] & 0xff)) { - i--; - continue startSearchForLastChar; - } - } - return start + 1; - } + // srcCoder == UTF16 && tgtCoder == LATIN1 + return StringUTF16.lastIndexOfLatin1(src, srcCount, tgt, tgtCount, fromIndex); } /** @@ -3078,7 +3052,8 @@ */ static void checkIndex(int index, int length) { if (index < 0 || index >= length) { - throw new StringIndexOutOfBoundsException("index " + index); + throw new StringIndexOutOfBoundsException("index " + index + + ",length " + length); } } @@ -3116,7 +3091,7 @@ * If {@code begin} is negative, {@code begin} is greater than * {@code end}, or {@code end} is greater than {@code length}. */ - private static void checkBoundsBeginEnd(int begin, int end, int length) { + static void checkBoundsBeginEnd(int begin, int end, int length) { if (begin < 0 || begin > end || end > length) { throw new StringIndexOutOfBoundsException( "begin " + begin + ", end " + end + ", length " + length);
--- a/jdk/src/java.base/share/classes/java/lang/StringConcatHelper.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/StringConcatHelper.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -293,7 +293,7 @@ if (coder == String.LATIN1) { return Integer.getChars(value, index, buf); } else { - return Integer.getCharsUTF16(value, index, buf); + return StringUTF16.getChars(value, index, buf); } } @@ -311,7 +311,7 @@ if (coder == String.LATIN1) { return Long.getChars(value, index, buf); } else { - return Long.getCharsUTF16(value, index, buf); + return StringUTF16.getChars(value, index, buf); } }
--- a/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/StringLatin1.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,6 @@ import static java.lang.String.LATIN1; import static java.lang.String.UTF16; import static java.lang.String.checkOffset; -import static java.lang.String.checkBoundsOffCount; final class StringLatin1 { @@ -566,11 +565,7 @@ // inflatedCopy byte[] -> byte[] @HotSpotIntrinsicCandidate public static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { - // We need a range check here because 'putChar' has no checks - checkBoundsOffCount(dstOff << 1, len << 1, dst.length); - for (int i = 0; i < len; i++) { - StringUTF16.putChar(dst, dstOff++, src[srcOff++] & 0xff); - } + StringUTF16.inflate(src, srcOff, dst, dstOff, len); } static class CharsSpliterator implements Spliterator.OfInt {
--- a/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/StringUTF16.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -30,12 +30,11 @@ import java.util.Spliterator; import java.util.function.IntConsumer; import jdk.internal.HotSpotIntrinsicCandidate; +import jdk.internal.vm.annotation.ForceInline; +import jdk.internal.vm.annotation.DontInline; import static java.lang.String.UTF16; import static java.lang.String.LATIN1; -import static java.lang.String.checkIndex; -import static java.lang.String.checkOffset; -import static java.lang.String.checkBoundsOffCount; final class StringUTF16 { @@ -51,33 +50,37 @@ } @HotSpotIntrinsicCandidate - public static void putChar(byte[] val, int index, int c) { + // intrinsic performs no bounds checks + static void putChar(byte[] val, int index, int c) { + assert index >= 0 && index < length(val) : "Trusted caller missed bounds check"; index <<= 1; val[index++] = (byte)(c >> HI_BYTE_SHIFT); val[index] = (byte)(c >> LO_BYTE_SHIFT); } @HotSpotIntrinsicCandidate - public static char getChar(byte[] val, int index) { + // intrinsic performs no bounds checks + static char getChar(byte[] val, int index) { + assert index >= 0 && index < length(val) : "Trusted caller missed bounds check"; index <<= 1; return (char)(((val[index++] & 0xff) << HI_BYTE_SHIFT) | ((val[index] & 0xff) << LO_BYTE_SHIFT)); } - public static char charAt(byte[] value, int index) { - if (index < 0 || index >= value.length >> 1) { - throw new StringIndexOutOfBoundsException(index); - } - return getChar(value, index); - } - public static int length(byte[] value) { return value.length >> 1; } - public static int codePointAt(byte[] value, int index, int end) { + private static int codePointAt(byte[] value, int index, int end, boolean checked) { + assert index < end; + if (checked) { + checkIndex(index, value); + } char c1 = getChar(value, index); if (Character.isHighSurrogate(c1) && ++index < end) { + if (checked) { + checkIndex(index, value); + } char c2 = getChar(value, index); if (Character.isLowSurrogate(c2)) { return Character.toCodePoint(c1, c2); @@ -86,10 +89,22 @@ return c1; } - public static int codePointBefore(byte[] value, int index) { - char c2 = getChar(value, --index); + public static int codePointAt(byte[] value, int index, int end) { + return codePointAt(value, index, end, false /* unchecked */); + } + + private static int codePointBefore(byte[] value, int index, boolean checked) { + --index; + if (checked) { + checkIndex(index, value); + } + char c2 = getChar(value, index); if (Character.isLowSurrogate(c2) && index > 0) { - char c1 = getChar(value, --index); + --index; + if (checked) { + checkIndex(index, value); + } + char c1 = getChar(value, index); if (Character.isHighSurrogate(c1)) { return Character.toCodePoint(c1, c2); } @@ -97,11 +112,19 @@ return c2; } - public static int codePointCount(byte[] value, int beginIndex, int endIndex) { + public static int codePointBefore(byte[] value, int index) { + return codePointBefore(value, index, false /* unchecked */); + } + + private static int codePointCount(byte[] value, int beginIndex, int endIndex, boolean checked) { + assert beginIndex <= endIndex; int count = endIndex - beginIndex; - for (int i = beginIndex; i < endIndex; ) { + int i = beginIndex; + if (checked && i < endIndex) { + checkBoundsBeginEnd(i, endIndex, value); + } + for (; i < endIndex - 1; ) { if (Character.isHighSurrogate(getChar(value, i++)) && - i < endIndex && Character.isLowSurrogate(getChar(value, i))) { count--; i++; @@ -110,6 +133,10 @@ return count; } + public static int codePointCount(byte[] value, int beginIndex, int endIndex) { + return codePointCount(value, beginIndex, endIndex, false /* unchecked */); + } + public static char[] toChars(byte[] value) { char[] dst = new char[value.length >> 1]; getChars(value, 0, dst.length, dst, 0); @@ -162,7 +189,7 @@ @HotSpotIntrinsicCandidate public static int compress(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { // We need a range check here because 'getChar' has no checks - checkBoundsOffCount(srcOff << 1, len << 1, src.length); + checkBoundsOffCount(srcOff, len, src); for (int i = 0; i < len; i++) { char c = getChar(src, srcOff); if (c > 0xFF) { @@ -212,7 +239,7 @@ public static void getChars(byte[] value, int srcBegin, int srcEnd, char dst[], int dstBegin) { // We need a range check here because 'getChar' has no checks if (srcBegin < srcEnd) { - checkBoundsOffCount(srcBegin << 1, (srcEnd - srcBegin) << 1, value.length); + checkBoundsOffCount(srcBegin, srcEnd - srcBegin, value); } for (int i = srcBegin; i < srcEnd; i++) { dst[dstBegin++] = getChar(value, i); @@ -319,14 +346,25 @@ if (str.length == 0) { return 0; } - if (value.length == 0) { + if (value.length < str.length) { return -1; } - return indexOf(value, length(value), str, length(str), 0); + return indexOfUnsafe(value, length(value), str, length(str), 0); } @HotSpotIntrinsicCandidate public static int indexOf(byte[] value, int valueCount, byte[] str, int strCount, int fromIndex) { + checkBoundsBeginEnd(fromIndex, valueCount, value); + checkBoundsBeginEnd(0, strCount, str); + return indexOfUnsafe(value, valueCount, str, strCount, fromIndex); + } + + + private static int indexOfUnsafe(byte[] value, int valueCount, byte[] str, int strCount, int fromIndex) { + assert fromIndex >= 0; + assert strCount > 0; + assert strCount <= length(str); + assert valueCount >= strCount; char first = getChar(str, 0); int max = (valueCount - strCount); for (int i = fromIndex; i <= max; i++) { @@ -348,6 +386,7 @@ return -1; } + /** * Handles indexOf Latin1 substring in UTF16 string. */ @@ -356,14 +395,24 @@ if (str.length == 0) { return 0; } - if (value.length == 0) { + if (length(value) < str.length) { return -1; } - return indexOfLatin1(value, length(value), str, str.length, 0); + return indexOfLatin1Unsafe(value, length(value), str, str.length, 0); } @HotSpotIntrinsicCandidate public static int indexOfLatin1(byte[] src, int srcCount, byte[] tgt, int tgtCount, int fromIndex) { + checkBoundsBeginEnd(fromIndex, srcCount, src); + String.checkBoundsBeginEnd(0, tgtCount, tgt.length); + return indexOfLatin1Unsafe(src, srcCount, tgt, tgtCount, fromIndex); + } + + public static int indexOfLatin1Unsafe(byte[] src, int srcCount, byte[] tgt, int tgtCount, int fromIndex) { + assert fromIndex >= 0; + assert tgtCount > 0; + assert tgtCount <= tgt.length; + assert srcCount >= tgtCount; char first = (char)(tgt[0] & 0xff); int max = (srcCount - tgtCount); for (int i = fromIndex; i <= max; i++) { @@ -389,6 +438,11 @@ @HotSpotIntrinsicCandidate private static int indexOfChar(byte[] value, int ch, int fromIndex, int max) { + checkBoundsBeginEnd(fromIndex, max, value); + return indexOfCharUnsafe(value, ch, fromIndex, max); + } + + private static int indexOfCharUnsafe(byte[] value, int ch, int fromIndex, int max) { for (int i = fromIndex; i < max; i++) { if (getChar(value, i) == ch) { return i; @@ -404,6 +458,7 @@ if (Character.isValidCodePoint(ch)) { final char hi = Character.highSurrogate(ch); final char lo = Character.lowSurrogate(ch); + checkBoundsBeginEnd(fromIndex, max, value); for (int i = fromIndex; i < max - 1; i++) { if (getChar(value, i) == hi && getChar(value, i + 1 ) == lo) { return i; @@ -413,13 +468,21 @@ return -1; } + // srcCoder == UTF16 && tgtCoder == UTF16 public static int lastIndexOf(byte[] src, int srcCount, byte[] tgt, int tgtCount, int fromIndex) { + assert fromIndex >= 0; + assert tgtCount > 0; + assert tgtCount <= length(tgt); int min = tgtCount - 1; int i = min + fromIndex; int strLastIndex = tgtCount - 1; + + checkIndex(strLastIndex, tgt); char strLastChar = getChar(tgt, strLastIndex); + checkIndex(i, src); + startSearchForLastChar: while (true) { while (i >= min && getChar(src, i) != strLastChar) { @@ -509,6 +572,9 @@ public static boolean regionMatchesCI(byte[] value, int toffset, byte[] other, int ooffset, int len) { int last = toffset + len; + assert toffset >= 0 && ooffset >= 0; + assert ooffset + len <= length(other); + assert last <= length(value); while (toffset < last) { char c1 = getChar(value, toffset++); char c2 = getChar(other, ooffset++); @@ -599,6 +665,8 @@ private static String toLowerCaseEx(String str, byte[] value, byte[] result, int first, Locale locale, boolean localeDependent) { + assert(result.length == value.length); + assert(first >= 0); int resultOffset = first; int length = value.length >> 1; int srcCount; @@ -633,6 +701,8 @@ System.arraycopy(result, 0, result2, 0, resultOffset << 1); result = result2; } + assert resultOffset >= 0; + assert resultOffset + mapLen <= length(result); for (int x = 0; x < mapLen; ++x) { putChar(result, resultOffset++, lowerCharArray[x]); } @@ -697,6 +767,8 @@ byte[] result, int first, Locale locale, boolean localeDependent) { + assert(result.length == value.length); + assert(first >= 0); int resultOffset = first; int length = value.length >> 1; int srcCount; @@ -733,10 +805,12 @@ byte[] result2 = newBytesFor((result.length >> 1) + mapLen - srcCount); System.arraycopy(result, 0, result2, 0, resultOffset << 1); result = result2; - } - for (int x = 0; x < mapLen; ++x) { + } + assert resultOffset >= 0; + assert resultOffset + mapLen <= length(result); + for (int x = 0; x < mapLen; ++x) { putChar(result, resultOffset++, upperCharArray[x]); - } + } } } return newString(result, 0, resultOffset); @@ -757,7 +831,7 @@ null; } - public static void putChars(byte[] val, int index, char[] str, int off, int end) { + private static void putChars(byte[] val, int index, char[] str, int off, int end) { while (off < end) { putChar(val, index++, str[off++]); } @@ -927,35 +1001,172 @@ //////////////////////////////////////////////////////////////// public static void putCharSB(byte[] val, int index, int c) { - checkIndex(index, val.length >> 1); + checkIndex(index, val); putChar(val, index, c); } public static void putCharsSB(byte[] val, int index, char[] ca, int off, int end) { - checkOffset(index + end - off, val.length >> 1); + checkBoundsBeginEnd(index, index + end - off, val); putChars(val, index, ca, off, end); } public static void putCharsSB(byte[] val, int index, CharSequence s, int off, int end) { - checkOffset(index + end - off, val.length >> 1); + checkBoundsBeginEnd(index, index + end - off, val); for (int i = off; i < end; i++) { putChar(val, index++, s.charAt(i)); } } public static int codePointAtSB(byte[] val, int index, int end) { - checkOffset(end, val.length >> 1); - return codePointAt(val, index, end); + return codePointAt(val, index, end, true /* checked */); } public static int codePointBeforeSB(byte[] val, int index) { - checkOffset(index, val.length >> 1); - return codePointBefore(val, index); + return codePointBefore(val, index, true /* checked */); } public static int codePointCountSB(byte[] val, int beginIndex, int endIndex) { - checkOffset(endIndex, val.length >> 1); - return codePointCount(val, beginIndex, endIndex); + return codePointCount(val, beginIndex, endIndex, true /* checked */); + } + + public static int getChars(int i, int begin, int end, byte[] value) { + checkBoundsBeginEnd(begin, end, value); + int pos = getChars(i, end, value); + assert begin == pos; + return pos; + } + + public static int getChars(long l, int begin, int end, byte[] value) { + checkBoundsBeginEnd(begin, end, value); + int pos = getChars(l, end, value); + assert begin == pos; + return pos; + } + + public static boolean contentEquals(byte[] v1, byte[] v2, int len) { + checkBoundsOffCount(0, len, v2); + for (int i = 0; i < len; i++) { + if ((char)(v1[i] & 0xff) != getChar(v2, i)) { + return false; + } + } + return true; + } + + public static boolean contentEquals(byte[] value, CharSequence cs, int len) { + checkOffset(len, value); + for (int i = 0; i < len; i++) { + if (getChar(value, i) != cs.charAt(i)) { + return false; + } + } + return true; + } + + public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4) { + int end = i + 4; + checkBoundsBeginEnd(i, end, value); + putChar(value, i++, c1); + putChar(value, i++, c2); + putChar(value, i++, c3); + putChar(value, i++, c4); + assert(i == end); + return end; + } + + public static int putCharsAt(byte[] value, int i, char c1, char c2, char c3, char c4, char c5) { + int end = i + 5; + checkBoundsBeginEnd(i, end, value); + putChar(value, i++, c1); + putChar(value, i++, c2); + putChar(value, i++, c3); + putChar(value, i++, c4); + putChar(value, i++, c5); + assert(i == end); + return end; + } + + public static char charAt(byte[] value, int index) { + checkIndex(index, value); + return getChar(value, index); + } + + public static void reverse(byte[] val, int count) { + checkOffset(count, val); + int n = count - 1; + boolean hasSurrogates = false; + for (int j = (n-1) >> 1; j >= 0; j--) { + int k = n - j; + char cj = getChar(val, j); + char ck = getChar(val, k); + putChar(val, j, ck); + putChar(val, k, cj); + if (Character.isSurrogate(cj) || + Character.isSurrogate(ck)) { + hasSurrogates = true; + } + } + if (hasSurrogates) { + reverseAllValidSurrogatePairs(val, count); + } + } + + /** Outlined helper method for reverse() */ + private static void reverseAllValidSurrogatePairs(byte[] val, int count) { + for (int i = 0; i < count - 1; i++) { + char c2 = getChar(val, i); + if (Character.isLowSurrogate(c2)) { + char c1 = getChar(val, i + 1); + if (Character.isHighSurrogate(c1)) { + putChar(val, i++, c1); + putChar(val, i, c2); + } + } + } + } + + // inflatedCopy byte[] -> byte[] + public static void inflate(byte[] src, int srcOff, byte[] dst, int dstOff, int len) { + // We need a range check here because 'putChar' has no checks + checkBoundsOffCount(dstOff, len, dst); + for (int i = 0; i < len; i++) { + putChar(dst, dstOff++, src[srcOff++] & 0xff); + } + } + + // srcCoder == UTF16 && tgtCoder == LATIN1 + public static int lastIndexOfLatin1(byte[] src, int srcCount, + byte[] tgt, int tgtCount, int fromIndex) { + assert fromIndex >= 0; + assert tgtCount > 0; + assert tgtCount <= tgt.length; + int min = tgtCount - 1; + int i = min + fromIndex; + int strLastIndex = tgtCount - 1; + + char strLastChar = (char)(tgt[strLastIndex] & 0xff); + + checkIndex(i, src); + + startSearchForLastChar: + while (true) { + while (i >= min && getChar(src, i) != strLastChar) { + i--; + } + if (i < min) { + return -1; + } + int j = i - 1; + int start = j - strLastIndex; + int k = strLastIndex - 1; + while (j > start) { + if (getChar(src, j--) != (tgt[k--] & 0xff)) { + i--; + continue startSearchForLastChar; + } + } + return start + 1; + } } //////////////////////////////////////////////////////////////// @@ -975,4 +1186,123 @@ } static final int MAX_LENGTH = Integer.MAX_VALUE >> 1; + + // Used by trusted callers. Assumes all necessary bounds checks have + // been done by the caller. + + /** + * This is a variant of {@link Integer#getChars(int, int, byte[])}, but for + * UTF-16 coder. + * + * @param i value to convert + * @param index next index, after the least significant digit + * @param buf target buffer, UTF16-coded. + * @return index of the most significant digit or minus sign, if present + */ + static int getChars(int i, int index, byte[] buf) { + int q, r; + int charPos = index; + + boolean negative = (i < 0); + if (!negative) { + i = -i; + } + + // Get 2 digits/iteration using ints + while (i <= -100) { + q = i / 100; + r = (q * 100) - i; + i = q; + putChar(buf, --charPos, Integer.DigitOnes[r]); + putChar(buf, --charPos, Integer.DigitTens[r]); + } + + // We know there are at most two digits left at this point. + q = i / 10; + r = (q * 10) - i; + putChar(buf, --charPos, '0' + r); + + // Whatever left is the remaining digit. + if (q < 0) { + putChar(buf, --charPos, '0' - q); + } + + if (negative) { + putChar(buf, --charPos, '-'); + } + return charPos; + } + + /** + * This is a variant of {@link Long#getChars(long, int, byte[])}, but for + * UTF-16 coder. + * + * @param i value to convert + * @param index next index, after the least significant digit + * @param buf target buffer, UTF16-coded. + * @return index of the most significant digit or minus sign, if present + */ + static int getChars(long i, int index, byte[] buf) { + long q; + int r; + int charPos = index; + + boolean negative = (i < 0); + if (!negative) { + i = -i; + } + + // Get 2 digits/iteration using longs until quotient fits into an int + while (i <= Integer.MIN_VALUE) { + q = i / 100; + r = (int)((q * 100) - i); + i = q; + putChar(buf, --charPos, Integer.DigitOnes[r]); + putChar(buf, --charPos, Integer.DigitTens[r]); + } + + // Get 2 digits/iteration using ints + int q2; + int i2 = (int)i; + while (i2 <= -100) { + q2 = i2 / 100; + r = (q2 * 100) - i2; + i2 = q2; + putChar(buf, --charPos, Integer.DigitOnes[r]); + putChar(buf, --charPos, Integer.DigitTens[r]); + } + + // We know there are at most two digits left at this point. + q2 = i2 / 10; + r = (q2 * 10) - i2; + putChar(buf, --charPos, '0' + r); + + // Whatever left is the remaining digit. + if (q2 < 0) { + putChar(buf, --charPos, '0' - q2); + } + + if (negative) { + putChar(buf, --charPos, '-'); + } + return charPos; + } + // End of trusted methods. + + public static void checkIndex(int off, byte[] val) { + String.checkIndex(off, length(val)); + } + + public static void checkOffset(int off, byte[] val) { + String.checkOffset(off, length(val)); + } + + public static void checkBoundsBeginEnd(int begin, int end, byte[] val) { + String.checkBoundsBeginEnd(begin, end, length(val)); + } + + public static void checkBoundsOffCount(int offset, int count, byte[] val) { + String.checkBoundsOffCount(offset, count, length(val)); + } + }
--- a/jdk/src/java.base/share/classes/java/lang/System.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/lang/System.java Wed Jul 05 23:16:05 2017 +0200 @@ -1766,6 +1766,7 @@ * @since 1.1 */ @Deprecated(since="1.2", forRemoval=true) + @SuppressWarnings("removal") public static void runFinalizersOnExit(boolean value) { Runtime.runFinalizersOnExit(value); }
--- a/jdk/src/java.base/share/classes/java/time/temporal/ValueRange.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/share/classes/java/time/temporal/ValueRange.java Wed Jul 05 23:16:05 2017 +0200 @@ -385,7 +385,7 @@ } if (obj instanceof ValueRange) { ValueRange other = (ValueRange) obj; - return minSmallest == other.minSmallest && minLargest == other.minLargest && + return minSmallest == other.minSmallest && minLargest == other.minLargest && maxSmallest == other.maxSmallest && maxLargest == other.maxLargest; } return false; @@ -398,8 +398,9 @@ */ @Override public int hashCode() { - long hash = minSmallest + minLargest << 16 + minLargest >> 48 + maxSmallest << 32 + - maxSmallest >> 32 + maxLargest << 48 + maxLargest >> 16; + long hash = minSmallest + (minLargest << 16) + (minLargest >> 48) + + (maxSmallest << 32) + (maxSmallest >> 32) + (maxLargest << 48) + + (maxLargest >> 16); return (int) (hash ^ (hash >>> 32)); }
--- a/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/unix/classes/java/lang/ProcessImpl.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -617,7 +617,7 @@ } @Override - public long getPid() { + public long pid() { return pid; }
--- a/jdk/src/java.base/windows/classes/java/lang/ProcessImpl.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.base/windows/classes/java/lang/ProcessImpl.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -523,7 +523,7 @@ @Override public CompletableFuture<Process> onExit() { - return ProcessHandleImpl.completion(getPid(), false) + return ProcessHandleImpl.completion(pid(), false) .handleAsync((exitStatus, unusedThrowable) -> this); } @@ -550,8 +550,8 @@ private static native void terminateProcess(long handle); @Override - public long getPid() { - return processHandle.getPid(); + public long pid() { + return processHandle.pid(); } private static native int getProcessId0(long handle); @@ -572,7 +572,7 @@ @Override public String toString() { int exitCode = getExitCodeProcess(handle); - return new StringBuilder("Process[pid=").append(getPid()) + return new StringBuilder("Process[pid=").append(pid()) .append(", exitValue=").append(exitCode == STILL_ACTIVE ? "\"not exited\"" : exitCode) .append("]").toString(); }
--- a/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/DataFlavor.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.datatransfer/share/classes/java/awt/datatransfer/DataFlavor.java Wed Jul 05 23:16:05 2017 +0200 @@ -211,6 +211,9 @@ * representationClass = java.awt.Image * mimeType = "image/x-java-image" * </pre> + * Will be {@code null} if {@code java.awt.Image} is not visible, the + * {@code java.desktop} module is not loaded, or the {@code java.desktop} + * module is not in the run-time image. */ public static final DataFlavor imageFlavor = createConstant("image/x-java-image; class=java.awt.Image", "Image");
--- a/jdk/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/apple/laf/JRSUIConstants.java Wed Jul 05 23:16:05 2017 +0200 @@ -78,7 +78,7 @@ return "THUMB_START"; } else if (hit == WINDOW_TITLE_BAR_HEIGHT) { return "WINDOW_TITLE_BAR_HEIGHT"; - } else if (hit == THUMB_START) { + } else if (hit == ANIMATION_FRAME) { return "ANIMATION_FRAME"; } return getClass().getSimpleName();
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/Application.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/Application.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,24 @@ import java.awt.PopupMenu; import java.awt.Toolkit; import java.awt.Window; -import java.awt.desktop.*; +import java.awt.desktop.AboutHandler; +import java.awt.desktop.AppForegroundListener; +import java.awt.desktop.AppHiddenListener; +import java.awt.desktop.AppReopenedListener; +import java.awt.desktop.OpenFilesEvent; +import java.awt.desktop.OpenFilesHandler; +import java.awt.desktop.OpenURIEvent; +import java.awt.desktop.OpenURIHandler; +import java.awt.desktop.PreferencesHandler; +import java.awt.desktop.PrintFilesEvent; +import java.awt.desktop.PrintFilesHandler; +import java.awt.desktop.QuitHandler; +import java.awt.desktop.QuitResponse; +import java.awt.desktop.QuitStrategy; +import java.awt.desktop.ScreenSleepListener; +import java.awt.desktop.SystemEventListener; +import java.awt.desktop.SystemSleepListener; +import java.awt.desktop.UserSessionListener; import java.beans.Beans; import javax.swing.JMenuBar; @@ -108,10 +125,10 @@ * * @see AppForegroundListener * @see AppHiddenListener - * @see AppReOpenedListener - * @see AppScreenSleepListener - * @see AppSystemSleepListener - * @see AppUserSessionListener + * @see AppReopenedListener + * @see ScreenSleepListener + * @see SystemSleepListener + * @see UserSessionListener * * @param listener * @since Java for Mac OS X 10.6 Update 3 @@ -126,10 +143,10 @@ * * @see AppForegroundListener * @see AppHiddenListener - * @see AppReOpenedListener - * @see AppScreenSleepListener - * @see AppSystemSleepListener - * @see AppUserSessionListener + * @see AppReopenedListener + * @see ScreenSleepListener + * @see SystemSleepListener + * @see UserSessionListener * * @param listener * @since Java for Mac OS X 10.6 Update 3 @@ -144,7 +161,7 @@ * * Setting the {@link AboutHandler} to {@code null} reverts it to the default Cocoa About window. * - * @param aboutHandler the handler to respond to the {@link AboutHandler#handleAbout()} message + * @param aboutHandler the handler to respond to the {@link AboutHandler#handleAbout} message * @since Java for Mac OS X 10.6 Update 3 * @since Java for Mac OS X 10.5 Update 8 */ @@ -167,7 +184,7 @@ /** * Installs the handler which is notified when the application is asked to open a list of files. - * The {@link OpenFilesHandler#openFiles(AppEvent.OpenFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist. + * The {@link OpenFilesHandler#openFiles(OpenFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist. * See the <a href="http://developer.apple.com/mac/library/documentation/General/Reference/InfoPlistKeyReference">Info.plist Key Reference</a> for more information about adding a {@code CFBundleDocumentTypes} key to your app's Info.plist. * * @param openFileHandler @@ -180,7 +197,7 @@ /** * Installs the handler which is notified when the application is asked to print a list of files. - * The {@link PrintFilesHandler#printFiles(AppEvent.PrintFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist. + * The {@link PrintFilesHandler#printFiles(PrintFilesEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleDocumentTypes} array present in it's Info.plist. * See the <a href="http://developer.apple.com/mac/library/documentation/General/Reference/InfoPlistKeyReference">Info.plist Key Reference</a> for more information about adding a {@code CFBundleDocumentTypes} key to your app's Info.plist. * * @param printFileHandler @@ -193,10 +210,10 @@ /** * Installs the handler which is notified when the application is asked to open a URL. - * The {@link OpenURIHandler#openURI(AppEvent.OpenURIEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleURLTypes} array present in it's Info.plist. + * The {@link OpenURIHandler#openURI(OpenURIEvent)} notifications are only sent if the Java app is a bundled application, with a {@code CFBundleURLTypes} array present in it's Info.plist. * See the <a href="http://developer.apple.com/mac/library/documentation/General/Reference/InfoPlistKeyReference">Info.plist Key Reference</a> for more information about adding a {@code CFBundleURLTypes} key to your app's Info.plist. * - * Setting the handler to {@code null} causes all {@link OpenURIHandler#openURI(AppEvent.OpenURIEvent)} requests to be enqueued until another handler is set. + * Setting the handler to {@code null} causes all {@link OpenURIHandler#openURI(OpenURIEvent)} requests to be enqueued until another handler is set. * * @param openURIHandler * @since Java for Mac OS X 10.6 Update 3
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationAdapter.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationAdapter.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,26 @@ package com.apple.eawt; +import java.awt.desktop.AboutHandler; +import java.awt.desktop.AppForegroundListener; +import java.awt.desktop.AppHiddenListener; +import java.awt.desktop.AppReopenedListener; +import java.awt.desktop.OpenFilesHandler; +import java.awt.desktop.OpenURIHandler; +import java.awt.desktop.PreferencesHandler; +import java.awt.desktop.PrintFilesHandler; +import java.awt.desktop.QuitHandler; +import java.awt.desktop.ScreenSleepListener; +import java.awt.desktop.SystemEventListener; +import java.awt.desktop.SystemSleepListener; +import java.awt.desktop.UserSessionListener; + /** * An abstract adapter class for receiving {@code ApplicationEvents}. * * ApplicationEvents are deprecated. Use individual app event listeners or handlers instead. * - * @see Application#addAppEventListener(AppEventListener) + * @see Application#addAppEventListener(SystemEventListener) * * @see AboutHandler * @see PreferencesHandler @@ -39,14 +53,14 @@ * @see PrintFilesHandler * @see QuitHandler * - * @see AppReOpenedListener + * @see AppReopenedListener * @see AppForegroundListener * @see AppHiddenListener * @see UserSessionListener * @see ScreenSleepListener * @see SystemSleepListener * - * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReOpenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}. + * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReopenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse}. * @since 1.4 */ @SuppressWarnings("deprecation")
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationEvent.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationEvent.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,18 @@ package com.apple.eawt; +import java.awt.desktop.AboutHandler; +import java.awt.desktop.AppReopenedListener; +import java.awt.desktop.OpenFilesHandler; +import java.awt.desktop.PreferencesHandler; +import java.awt.desktop.PrintFilesHandler; +import java.awt.desktop.QuitHandler; import java.util.EventObject; /** * The class of events sent to the deprecated ApplicationListener callbacks. * - * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReOpenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse} + * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReopenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse} * @since 1.4 */ @Deprecated
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/ApplicationListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,12 +25,25 @@ package com.apple.eawt; +import java.awt.desktop.AboutHandler; +import java.awt.desktop.AppForegroundListener; +import java.awt.desktop.AppHiddenListener; +import java.awt.desktop.AppReopenedListener; +import java.awt.desktop.OpenFilesHandler; +import java.awt.desktop.OpenURIHandler; +import java.awt.desktop.PreferencesHandler; +import java.awt.desktop.PrintFilesHandler; +import java.awt.desktop.QuitHandler; +import java.awt.desktop.ScreenSleepListener; +import java.awt.desktop.SystemEventListener; +import java.awt.desktop.SystemSleepListener; +import java.awt.desktop.UserSessionListener; import java.util.EventListener; /** * ApplicationEvents are deprecated. Use individual AppEvent listeners or handlers instead. * - * @see Application#addAppEventListener(AppEventListener) + * @see Application#addAppEventListener(SystemEventListener) * * @see AboutHandler * @see PreferencesHandler @@ -39,7 +52,7 @@ * @see PrintFilesHandler * @see QuitHandler * - * @see AppReOpenedListener + * @see AppReopenedListener * @see AppForegroundListener * @see AppHiddenListener * @see UserSessionListener @@ -47,7 +60,7 @@ * @see SystemSleepListener * * @since 1.4 - * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReOpenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse} + * @deprecated replaced by {@link AboutHandler}, {@link PreferencesHandler}, {@link AppReopenedListener}, {@link OpenFilesHandler}, {@link PrintFilesHandler}, {@link QuitHandler}, {@link MacQuitResponse} */ @SuppressWarnings("deprecation") @Deprecated @@ -146,7 +159,7 @@ * event is sent from another application, include that code as part of this handler. * * @param event the Reopen Application event - * @deprecated use {@link AppReOpenedListener} + * @deprecated use {@link AppReopenedListener} */ @Deprecated public void handleReOpenApplication(ApplicationEvent event);
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenAdapter.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenAdapter.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,13 +25,15 @@ package com.apple.eawt; +import java.awt.Window; + import com.apple.eawt.event.FullScreenEvent; /** * Abstract adapter class for receiving fullscreen events. This class is provided * as a convenience for creating listeners. * - * Subclasses registered with {@link FullScreenUtilities#addFullScreenListenerTo(javax.swing.RootPaneContainer, FullScreenListener)} + * Subclasses registered with {@link FullScreenUtilities#addFullScreenListenerTo(Window, FullScreenListener)} * will receive all entering/entered/exiting/exited full screen events. * * @see FullScreenUtilities
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,25 +37,25 @@ public interface FullScreenListener extends EventListener { /** * Invoked when a window has started to enter full screen. - * @param event containing the specific window entering full screen. + * @param e containing the specific window entering full screen. */ public void windowEnteringFullScreen(final FullScreenEvent e); /** * Invoked when a window has fully entered full screen. - * @param event containing the specific window which has entered full screen. + * @param e containing the specific window which has entered full screen. */ public void windowEnteredFullScreen(final FullScreenEvent e); /** * Invoked when a window has started to exit full screen. - * @param event containing the specific window exiting full screen. + * @param e containing the specific window exiting full screen. */ public void windowExitingFullScreen(final FullScreenEvent e); /** * Invoked when a window has fully exited full screen. - * @param event containing the specific window which has exited full screen. + * @param e containing the specific window which has exited full screen. */ public void windowExitedFullScreen(final FullScreenEvent e); }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenUtilities.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/FullScreenUtilities.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,7 +36,7 @@ /** * Utility class perform animated full screen actions to top-level {@link Window}s. * - * This class manages the relationship between {@link Windows}s and the {@link FullScreenListener}s + * This class manages the relationship between {@link Window}s and the {@link FullScreenListener}s * attached to them. It's design is similar to the Java SE 6u10 {@link com.sun.awt.AWTUtilities} * class which adds additional functionality to AWT Windows, without adding new API to the * {@link java.awt.Window} class.
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/MacQuitResponse.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/MacQuitResponse.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,11 +25,14 @@ package com.apple.eawt; +import java.awt.desktop.QuitEvent; +import java.awt.desktop.QuitHandler; import java.awt.desktop.QuitResponse; +import java.awt.desktop.QuitStrategy; /** * Used to respond to a request to quit the application. - * The QuitResponse may be used after the {@link QuitHandler#handleQuitRequestWith(AppEvent.QuitEvent, MacQuitResponse)} method has returned, and may be used from any thread. + * The QuitResponse may be used after the {@link QuitHandler#handleQuitRequestWith(QuitEvent, QuitResponse)} method has returned, and may be used from any thread. * * @see Application#setQuitHandler(QuitHandler) * @see QuitHandler
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureAdapter.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureAdapter.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,7 @@ * Abstract adapter class for receiving gesture events. This class is provided * as a convenience for creating listeners. * - * Subclasses registered with {@link GestureUtilities#addGestureListenerTo()} + * Subclasses registered with {@link GestureUtilities#addGestureListenerTo} * will receive all phase, magnification, rotation, and swipe events. * * @see GestureUtilities
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureEvent.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GestureEvent.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package com.apple.eawt.event; import java.awt.*; +import java.awt.event.InputEvent; /** * Abstract event all gestures inherit from.
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GesturePhaseListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/GesturePhaseListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,13 +39,13 @@ public interface GesturePhaseListener extends GestureListener { /** * Invoked when the user has started a continuous gesture. - * @param event representing the start of a continuous gesture. + * @param e representing the start of a continuous gesture. */ public void gestureBegan(final GesturePhaseEvent e); /** * Invoked when the user has stopped a continuous gesture. - * @param event representing the end of a continuous gesture. + * @param e representing the end of a continuous gesture. */ public void gestureEnded(final GesturePhaseEvent e); }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/MagnificationListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/MagnificationListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ public interface MagnificationListener extends GestureListener { /** * Invoked when a magnification gesture is performed by the user. - * @param event containing the scale of the magnification. + * @param e containing the scale of the magnification. */ public void magnify(final MagnificationEvent e); }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/RotationListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/RotationListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -37,7 +37,7 @@ public interface RotationListener extends GestureListener { /** * Invoked when a rotation gesture is performed by the user. - * @param event containing an abstract measure of rotation. + * @param e containing an abstract measure of rotation. */ public void rotate(final RotationEvent e); }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/SwipeListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/eawt/event/SwipeListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,25 +38,25 @@ public interface SwipeListener extends GestureListener { /** * Invoked when an upwards swipe gesture is performed by the user. - * @param event representing the occurrence of a swipe. + * @param e representing the occurrence of a swipe. */ public void swipedUp(final SwipeEvent e); /** * Invoked when a downward swipe gesture is performed by the user. - * @param event representing the occurrence of a swipe. + * @param e representing the occurrence of a swipe. */ public void swipedDown(final SwipeEvent e); /** * Invoked when a leftward swipe gesture is performed by the user. - * @param event representing the occurrence of a swipe. + * @param e representing the occurrence of a swipe. */ public void swipedLeft(final SwipeEvent e); /** * Invoked when a rightward swipe gesture is performed by the user. - * @param event representing the occurrence of a swipe. + * @param e representing the occurrence of a swipe. */ public void swipedRight(final SwipeEvent e); }
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/AquaTabbedPaneCopyFromBasicUI.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -3732,7 +3732,6 @@ * <p> * This should be used if the ActionMap can be shared. * - * @param c JComponent to install the ActionMap on. * @param loaderClass Class object that gets loadActionMap invoked * on. * @param defaultsKey Key to use to defaults table to check for
--- a/jdk/src/java.desktop/macosx/classes/com/apple/laf/ScreenMenuPropertyListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/com/apple/laf/ScreenMenuPropertyListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ /** * This method gets called when a bound property is changed. - * @param evt A PropertyChangeEvent object describing the event source + * @param e A PropertyChangeEvent object describing the event source * and the property that has changed. */ public void propertyChange(final PropertyChangeEvent e) {
--- a/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/classes/sun/lwawt/macosx/CPlatformWindow.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -232,6 +232,7 @@ private volatile boolean isInFullScreen; private volatile boolean isIconifyAnimationActive; + private volatile boolean isZoomed; private Window target; private LWWindowPeer peer; @@ -506,7 +507,7 @@ private boolean isMaximized() { return undecorated ? this.normalBounds != null - : CWrapper.NSWindow.isZoomed(getNSWindowPtr()); + : isZoomed; } private void maximize() { @@ -974,6 +975,7 @@ protected void deliverMoveResizeEvent(int x, int y, int width, int height, boolean byUser) { + isZoomed = CWrapper.NSWindow.isZoomed(getNSWindowPtr()); checkZoom(); final Rectangle oldB = nativeBounds;
--- a/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CPrinterJob.m Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/macosx/native/libawt_lwawt/awt/CPrinterJob.m Wed Jul 05 23:16:05 2017 +0200 @@ -376,7 +376,7 @@ static JNF_MEMBER_CACHE(jm_getMaxPage, sjc_CPrinterJob, "getMaxPageAttrib", "()I"); static JNF_MEMBER_CACHE(jm_getSelectAttrib, sjc_CPrinterJob, "getSelectAttrib", "()I"); static JNF_MEMBER_CACHE(jm_getNumberOfPages, jc_Pageable, "getNumberOfPages", "()I"); - static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormatFromAttributes", "()Ljava/awt/print/PageFormat;"); + static JNF_MEMBER_CACHE(jm_getPageFormat, sjc_CPrinterJob, "getPageFormat", "(I)Ljava/awt/print/PageFormat;"); NSMutableDictionary* printingDictionary = [dst dictionary]; @@ -412,7 +412,7 @@ [printingDictionary setObject:[NSNumber numberWithInteger:fromPage] forKey:NSPrintFirstPage]; [printingDictionary setObject:[NSNumber numberWithInteger:toPage] forKey:NSPrintLastPage]; - jobject page = JNFCallObjectMethod(env, srcPrinterJob, jm_getPageFormat); + jobject page = JNFCallObjectMethod(env, srcPrinterJob, jm_getPageFormat, (jint)0); if (page != NULL) { javaPageFormatToNSPrintInfo(env, NULL, page, dst); }
--- a/jdk/src/java.desktop/share/classes/com/sun/awt/AWTUtilities.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/awt/AWTUtilities.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,8 @@ import java.awt.*; +import javax.swing.JRootPane; + import sun.awt.AWTAccessor; import sun.awt.SunToolkit; @@ -323,7 +325,7 @@ * is thrown. * <p>If the window is a {@code Frame} or a {@code Dialog}, the window must * be undecorated prior to enabling the per-pixel translucency effect (see - * {@link Frame#setUndecorated()} and/or {@link Dialog#setUndecorated()}). + * {@link Frame#setUndecorated} and/or {@link Dialog#setUndecorated}). * If the window becomes decorated through a subsequent call to the * corresponding {@code setUndecorated()} method, the per-pixel * translucency effect will be disabled and the opaque property reset to @@ -431,7 +433,7 @@ * </ul> * <p> * The most common example when the 'mixing-cutout' shape is needed is a - * glass pane component. The {@link JRootPane#setGlassPane()} method + * glass pane component. The {@link JRootPane#setGlassPane} method * automatically sets the <i>empty-shape</i> as the 'mixing-cutout' shape * for the given glass pane component. If a developer needs some other * 'mixing-cutout' shape for the glass pane (which is rare), this must be
--- a/jdk/src/java.desktop/share/classes/com/sun/awt/SecurityWarning.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/awt/SecurityWarning.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ * * The returned value is not valid until the peer has been created. Before * invoking this method a developer must call the {@link Window#pack()}, - * {@link Window#setVisible()}, or some other method that creates the peer. + * {@link Window#setVisible}, or some other method that creates the peer. * * @param window the window to get the security warning size for *
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/PaletteBuilder.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/PaletteBuilder.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2006, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -84,10 +84,8 @@ * is unable to create approximation of {@code src} * and {@code canCreatePalette} returns {@code false}. * - * @see createIndexColorModel - * - * @see canCreatePalette - * + * @see #createIndexColorModel + * @see #canCreatePalette */ public static RenderedImage createIndexedImage(RenderedImage src) { PaletteBuilder pb = new PaletteBuilder(src); @@ -107,10 +105,8 @@ * is unable to create approximation of {@code img} * and {@code canCreatePalette} returns {@code false}. * - * @see createIndexedImage - * - * @see canCreatePalette - * + * @see #createIndexedImage + * @see #canCreatePalette */ public static IndexColorModel createIndexColorModel(RenderedImage img) { PaletteBuilder pb = new PaletteBuilder(img);
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SingleTileRenderedImage.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/common/SingleTileRenderedImage.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ * and a ColorModel. * * @param ras A Raster that will define tile (0, 0) of the image. - * @param cm A ColorModel that will serve as the image's + * @param colorModel A ColorModel that will serve as the image's * ColorModel. */ public SingleTileRenderedImage(Raster ras, ColorModel colorModel) {
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/gif/GIFImageWriter.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -729,7 +729,8 @@ /** * Writes any extension blocks, the Image Descriptor, and the image data * - * @param iioimage The image and image metadata. + * @param image The image. + * @param imageMetadata The image metadata. * @param param The write parameters. * @param globalColorTable The Global Color Table. * @param sourceBounds The source region.
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/jpeg/JPEGMetadata.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -99,7 +99,7 @@ * of the list if it is present, and any JFXX or APP2ICC marker * segments are subordinate to the JFIF marker segment. This * list is package visible so that the writer can access it. - * @see #MarkerSegment + * @see MarkerSegment */ List<MarkerSegment> markerSequence = new ArrayList<>();
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFBaseJPEGCompressor.java Wed Jul 05 23:16:05 2017 +0200 @@ -74,13 +74,13 @@ /** * ImageWriteParam for JPEG writer. - * May be initialized by {@link #initJPEGWriter()}. + * May be initialized by {@link #initJPEGWriter}. */ protected JPEGImageWriteParam JPEGParam = null; /** * The JPEG writer. - * May be initialized by {@link #initJPEGWriter()}. + * May be initialized by {@link #initJPEGWriter}. */ protected ImageWriter JPEGWriter = null; @@ -95,7 +95,7 @@ * Stream metadata equivalent to a tables-only stream such as in * the {@code JPEGTables}. Default value is {@code null}. * This should be set by any subclass which sets - * {@link writeAbbreviatedStream} to {@code true}. + * {@link #writeAbbreviatedStream} to {@code true}. */ protected IIOMetadata JPEGStreamMetadata = null;
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/tiff/TIFFDecompressor.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1322,7 +1322,7 @@ * Sets the index of the planar configuration band to be decoded. This value * is ignored for chunky (interleaved) images. * - * @param the index of the planar band to decode + * @param planarBand the index of the planar band to decode */ public void setPlanarBand(int planarBand) { this.planarBand = planarBand; } @@ -2069,7 +2069,7 @@ * <p> The default implementation calls {@code decodeRaw(byte[] b, * ...)} and copies the resulting data into {@code f}. * - * @param f a {@code double} array to be written. + * @param d a {@code double} array to be written. * @param dstOffset the starting offset in {@code f} to be * written. * @param bitsPerPixel the number of bits for each pixel.
--- a/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageWriter.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/imageio/plugins/wbmp/WBMPImageWriter.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,8 +58,6 @@ * * The encoding process may clip, subsample using the parameters * specified in the {@code ImageWriteParam}. - * - * @see com.sun.media.imageio.plugins.WBMPImageWriteParam */ public class WBMPImageWriter extends ImageWriter { /** The output stream to write into */
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKColorType.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKColorType.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -138,9 +138,9 @@ * arguments to scale. * * @param color Color to alter - * @param hFactory Amount to scale the hue + * @param hFactor Amount to scale the hue * @param lFactor Amount to scale the lightness - * @param sFactory Amount to sacle saturation + * @param sFactor Amount to sacle saturation * @return newly created color */ static Color adjustColor(Color color, float hFactor, float lFactor,
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKGraphicsUtils.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -82,7 +82,7 @@ * render the text as html nor will it offset by the insets of the * component. * - * @param ss SynthContext + * @param context SynthContext * @param g Graphics used to render string in. * @param text Text to render * @param bounds Bounds of the text to be drawn.
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/gtk/GTKStyle.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -319,7 +319,7 @@ * insets will be placed in it, otherwise a new Insets object will be * created and returned. * - * @param context SynthContext identifying requestor + * @param state SynthContext identifying requestor * @param insets Where to place Insets * @return Insets. */
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/motif/MotifGraphicsUtils.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,7 +89,6 @@ * <b>drawStringInRect()</b> does not clip to the rectangle, but instead * uses this rectangle and the desired justification to compute the point * at which to begin drawing the text. - * @see #drawString */ public static void drawStringInRect(Graphics g, String aString, int x, int y, int width, int height, int justification) {
--- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/XPStyle.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -127,7 +127,7 @@ * * @param part a <code>Part</code> * @param state a <code>String</code> - * @param attributeKey a <code>String</code> + * @param prop a <code>String</code> * @return a <code>String</code> or null if key is not found * in the current style * @@ -172,7 +172,6 @@ /** Get a named <code>Dimension</code> value from the current style * - * @param key a <code>String</code> * @return a <code>Dimension</code> or null if key is not found * in the current style * @@ -189,7 +188,6 @@ /** Get a named <code>Point</code> (e.g. a location or an offset) value * from the current style * - * @param key a <code>String</code> * @return a <code>Point</code> or null if key is not found * in the current style * @@ -205,7 +203,6 @@ /** Get a named <code>Insets</code> value from the current style * - * @param key a <code>String</code> * @return an <code>Insets</code> object or null if key is not found * in the current style * @@ -223,7 +220,6 @@ /** Get a named <code>Color</code> value from the current style * - * @param part a <code>Part</code> * @return a <code>Color</code> or null if key is not found * in the current style */
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AbstractMixer.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -90,7 +90,7 @@ /** * Constructs a new AbstractMixer. - * @param mixer the mixer with which this line is associated + * @param mixerInfo the mixer with which this line is associated * @param controls set of supported controls */ protected AbstractMixer(Mixer.Info mixerInfo,
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/AudioSynthesizer.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,6 +27,7 @@ import java.util.Map; +import javax.sound.midi.MidiSystem; import javax.sound.midi.MidiUnavailableException; import javax.sound.midi.Synthesizer; import javax.sound.sampled.AudioFormat;
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileReader.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -163,7 +163,6 @@ * rllong * Protected helper method to read 64 bits and changing the order of * each bytes. - * @param DataInputStream * @return 32 bits swapped value. * @exception IOException */ @@ -187,7 +186,6 @@ /** * big2little * Protected helper method to swap the order of bytes in a 32 bit int - * @param int * @return 32 bits swapped value */ final int big2little(int i) { @@ -207,7 +205,6 @@ /** * rlshort * Protected helper method to read 16 bits value. Swap high with low byte. - * @param DataInputStream * @return the swapped value. * @exception IOException */ @@ -229,7 +226,6 @@ /** * big2little * Protected helper method to swap the order of bytes in a 16 bit short - * @param int * @return 16 bits swapped value */ final short big2littleShort(short i) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/SunFileWriter.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -69,7 +69,6 @@ * rllong * Protected helper method to read 64 bits and changing the order of * each bytes. - * @param DataInputStream * @return 32 bits swapped value. * @exception IOException */ @@ -93,7 +92,6 @@ /** * big2little * Protected helper method to swap the order of bytes in a 32 bit int - * @param int * @return 32 bits swapped value */ final int big2little(int i) { @@ -113,7 +111,6 @@ /** * rlshort * Protected helper method to read 16 bits value. Swap high with low byte. - * @param DataInputStream * @return the swapped value. * @exception IOException */ @@ -135,7 +132,6 @@ /** * big2little * Protected helper method to swap the order of bytes in a 16 bit short - * @param int * @return 16 bits swapped value */ final short big2littleShort(short i) {
--- a/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/com/sun/media/sound/Toolkit.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ /** * Swaps bytes. - * @throws ArrayOutOfBoundsException if len is not a multiple of 2. + * @throws ArrayIndexOutOfBoundsException if len is not a multiple of 2. */ static void getByteSwapped(byte[] b, int off, int len) {
--- a/jdk/src/java.desktop/share/classes/java/awt/Component.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/Component.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -58,6 +58,7 @@ import javax.accessibility.*; import java.applet.Applet; import javax.swing.JComponent; +import javax.swing.JRootPane; import sun.awt.ComponentFactory; import sun.security.action.GetPropertyAction; @@ -6232,7 +6233,7 @@ /** * Indicates whether a class or its superclasses override coalesceEvents. * Must be called with lock on coalesceMap and privileged. - * @see checkCoalescing + * @see #checkCoalescing */ private static boolean isCoalesceEventsOverriden(Class<?> clazz) { assert Thread.holdsLock(coalesceMap); @@ -10406,7 +10407,7 @@ * </ul> * <p> * The most common example when the 'mixing-cutout' shape is needed is a - * glass pane component. The {@link JRootPane#setGlassPane()} method + * glass pane component. The {@link JRootPane#setGlassPane} method * automatically sets the <i>empty-shape</i> as the 'mixing-cutout' shape * for the given glass pane component. If a developer needs some other * 'mixing-cutout' shape for the glass pane (which is rare), this must be
--- a/jdk/src/java.desktop/share/classes/java/awt/Desktop.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/Desktop.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,9 +25,12 @@ package java.awt; +import java.awt.desktop.AboutEvent; import java.awt.desktop.AboutHandler; import java.awt.desktop.OpenFilesHandler; +import java.awt.desktop.OpenURIEvent; import java.awt.desktop.OpenURIHandler; +import java.awt.desktop.PreferencesEvent; import java.awt.desktop.PreferencesHandler; import java.awt.desktop.PrintFilesHandler; import java.awt.desktop.QuitHandler; @@ -42,8 +45,9 @@ import java.net.URISyntaxException; import java.net.URL; +import javax.swing.JMenuBar; + import sun.awt.SunToolkit; -import javax.swing.JMenuBar; import sun.security.util.SecurityConstants; /**
--- a/jdk/src/java.desktop/share/classes/java/awt/Font.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/Font.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,6 +41,7 @@ import java.security.PrivilegedExceptionAction; import java.text.AttributedCharacterIterator.Attribute; import java.text.CharacterIterator; +import java.util.EventListener; import java.util.Hashtable; import java.util.Locale; import java.util.Map;
--- a/jdk/src/java.desktop/share/classes/java/awt/Menu.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/Menu.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,9 @@ import java.awt.peer.MenuPeer; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.util.Enumeration; +import java.util.EventListener; import java.util.Vector; import javax.accessibility.Accessible;
--- a/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -29,7 +29,9 @@ import java.awt.peer.MenuBarPeer; import java.io.IOException; import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; import java.util.Enumeration; +import java.util.EventListener; import java.util.Vector; import javax.accessibility.Accessible;
--- a/jdk/src/java.desktop/share/classes/java/awt/PaintContext.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/PaintContext.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2007, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,8 +25,10 @@ package java.awt; +import java.awt.geom.AffineTransform; +import java.awt.geom.Rectangle2D; +import java.awt.image.ColorModel; import java.awt.image.Raster; -import java.awt.image.ColorModel; /** * The {@code PaintContext} interface defines the encapsulated
--- a/jdk/src/java.desktop/share/classes/java/awt/SystemTray.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/SystemTray.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -25,15 +25,17 @@ package java.awt; -import java.util.Vector; +import java.awt.event.ActionListener; import java.awt.peer.SystemTrayPeer; import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; -import sun.awt.AppContext; -import sun.awt.SunToolkit; -import sun.awt.HeadlessToolkit; +import java.util.Vector; + import sun.awt.AWTAccessor; import sun.awt.AWTPermissions; +import sun.awt.AppContext; +import sun.awt.HeadlessToolkit; +import sun.awt.SunToolkit; /** * The {@code SystemTray} class represents the system tray for a
--- a/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/Toolkit.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -451,7 +451,7 @@ * * @param s the error message * @param e the original exception - * @throws the new AWTError including the cause (the original exception) + * @throws AWTError the new AWTError including the cause (the original exception) */ private static void newAWTError(Throwable e, String s) { AWTError newAWTError = new AWTError(s);
--- a/jdk/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/color/ICC_Profile.java Wed Jul 05 23:16:05 2017 +0200 @@ -1081,7 +1081,7 @@ * when loading this profile. * If deferring is enabled, then the deferred activation * code will take care of access privileges. - * @see activateDeferredProfile() + * @see #activateDeferredProfile() */ static ICC_Profile getDeferredInstance(ProfileDeferralInfo pdi) { if (!ProfileDeferralMgr.deferring) {
--- a/jdk/src/java.desktop/share/classes/java/awt/desktop/FilesEvent.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/desktop/FilesEvent.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,6 @@ /** * Constructs a {@code FilesEvent} * @param files files - * @param searchTerm searchTerm */ FilesEvent(final List<File> files) { this.files = files;
--- a/jdk/src/java.desktop/share/classes/java/awt/font/CharArrayIterator.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/font/CharArrayIterator.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,7 +47,7 @@ * Sets the position to getBeginIndex() and returns the character at that * position. * @return the first character in the text, or DONE if the text is empty - * @see getBeginIndex + * @see #getBeginIndex */ public char first() { @@ -59,7 +59,7 @@ * Sets the position to getEndIndex()-1 (getEndIndex() if the text is empty) * and returns the character at that position. * @return the last character in the text, or DONE if the text is empty - * @see getEndIndex + * @see #getEndIndex */ public char last() { @@ -76,7 +76,7 @@ * Gets the character at the current position (as returned by getIndex()). * @return the character at the current position or DONE if the current * position is off the end of the text. - * @see getIndex + * @see #getIndex */ public char current() {
--- a/jdk/src/java.desktop/share/classes/java/awt/peer/DesktopPeer.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/peer/DesktopPeer.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,18 +24,21 @@ */ package java.awt.peer; -import java.io.File; -import java.io.IOException; -import java.net.URI; import java.awt.Desktop.Action; import java.awt.desktop.AboutHandler; -import java.awt.desktop.SystemEventListener; import java.awt.desktop.OpenFilesHandler; +import java.awt.desktop.OpenURIEvent; import java.awt.desktop.OpenURIHandler; +import java.awt.desktop.PreferencesEvent; import java.awt.desktop.PreferencesHandler; import java.awt.desktop.PrintFilesHandler; import java.awt.desktop.QuitHandler; import java.awt.desktop.QuitStrategy; +import java.awt.desktop.SystemEventListener; +import java.io.File; +import java.io.IOException; +import java.net.URI; + import javax.swing.JMenuBar; /** @@ -162,7 +165,7 @@ * the default behavior * * @param preferencesHandler the handler to respond to the - * {@link java.awt.desktop.PreferencesHandler#handlePreferences(java.awt.PreferencesEvent) } + * {@link java.awt.desktop.PreferencesHandler#handlePreferences(PreferencesEvent) } */ default void setPreferencesHandler(final PreferencesHandler preferencesHandler) { } @@ -191,7 +194,7 @@ * open a URL. * * Setting the handler to {@code null} causes all - * {@link OpenURIHandler#openURI(AppEvent.OpenURIEvent)} requests to be + * {@link OpenURIHandler#openURI(OpenURIEvent)} requests to be * enqueued until another handler is set. * * @param openURIHandler handler
--- a/jdk/src/java.desktop/share/classes/java/awt/print/PrinterJob.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/awt/print/PrinterJob.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,12 +27,12 @@ import java.awt.AWTError; import java.awt.HeadlessException; -import java.util.Enumeration; import javax.print.DocFlavor; import javax.print.PrintService; import javax.print.PrintServiceLookup; import javax.print.StreamPrintServiceFactory; +import javax.print.attribute.AttributeSet; import javax.print.attribute.PrintRequestAttributeSet; import javax.print.attribute.standard.Media; import javax.print.attribute.standard.MediaPrintableArea; @@ -40,8 +40,6 @@ import javax.print.attribute.standard.MediaSizeName; import javax.print.attribute.standard.OrientationRequested; -import sun.security.action.GetPropertyAction; - /** * The {@code PrinterJob} class is the principal class that controls * printing. An application calls methods in this class to set up a job,
--- a/jdk/src/java.desktop/share/classes/java/beans/ChangeListenerMap.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/java/beans/ChangeListenerMap.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,8 +39,8 @@ * for the {@link PropertyChangeSupport PropertyChangeSupport} class * and the {@link VetoableChangeSupport VetoableChangeSupport} class. * - * @see PropertyChangeListenerMap - * @see VetoableChangeListenerMap + * @see PropertyChangeSupport.PropertyChangeListenerMap + * @see VetoableChangeSupport.VetoableChangeListenerMap * * @author Sergey A. Malenkov */
--- a/jdk/src/java.desktop/share/classes/javax/accessibility/AccessibleContext.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/accessibility/AccessibleContext.java Wed Jul 05 23:16:05 2017 +0200 @@ -413,7 +413,7 @@ * * @see #addPropertyChangeListener * @see #removePropertyChangeListener - * @see #firePropertyChangeListener + * @see #firePropertyChange */ private PropertyChangeSupport accessibleChangeSupport = null;
--- a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MediaPrintableArea.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MediaPrintableArea.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,7 +24,9 @@ */ package javax.print.attribute.standard; +import javax.print.DocFlavor; import javax.print.attribute.Attribute; +import javax.print.attribute.AttributeSet; import javax.print.attribute.DocAttribute; import javax.print.attribute.PrintJobAttribute; import javax.print.attribute.PrintRequestAttribute;
--- a/jdk/src/java.desktop/share/classes/javax/swing/Action.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/Action.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -384,8 +384,8 @@ * @param sender the object to check, can be null * @return {@code true} if the action should be performed with the sender * object, must be false if the action is disabled. - * @see isEnabled - * @see setEnabled + * @see #isEnabled + * @see #setEnabled */ default boolean accept(Object sender) { return isEnabled();
--- a/jdk/src/java.desktop/share/classes/javax/swing/ActionPropertyChangeListener.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/ActionPropertyChangeListener.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -45,7 +45,7 @@ * a strong reference will be held to the containing class, which in most * cases defeats the purpose of this class. * - * @param T the type of JComponent the underlying Action is attached to + * @param <T> the type of JComponent the underlying Action is attached to * * @author Georges Saab * @see AbstractButton
--- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java Wed Jul 05 23:16:05 2017 +0200 @@ -3733,7 +3733,11 @@ * Fire PropertyChange listener, if one is registered, * when focus events happen * @since 1.3 + * @deprecated This class is no longer used or needed. + * {@code java.awt.Component.AccessibleAWTComponent} provides + * the same functionality and it is handled in {@Component}. */ + @Deprecated protected class AccessibleFocusHandler implements FocusListener { public void focusGained(FocusEvent event) { if (accessibleContext != null) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/JSpinner.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/JSpinner.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1202,7 +1202,7 @@ * on the new <code>JFormattedTextField</code>. * * @param spinner the spinner whose model <code>this</code> editor will monitor - * @param decimalFormatPattern the initial pattern for the + * @param format the initial pattern for the * <code>DecimalFormat</code> object that's used to display * and parse the value of the text field. * @exception IllegalArgumentException if the spinners model is not
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1783,7 +1783,7 @@ * * @param axis may be either X_AXIS or Y_AXIS * @param len specifies where a break is desired in the span - * @param the current allocation of the view + * @param a the current allocation of the view * @return the fragment of the view that represents the given span * if the view can be broken, otherwise null */
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/LazyActionMap.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/LazyActionMap.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,7 +73,6 @@ * <p> * This should be used if the ActionMap can be shared. * - * @param c JComponent to install the ActionMap on. * @param loaderClass Class object that gets loadActionMap invoked * on. * @param defaultsKey Key to use to defaults table to check for
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFontDesktopProperty.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalFontDesktopProperty.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2009, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,8 +65,6 @@ * Creates a MetalFontDesktopProperty. * * @param key Key used in looking up desktop value. - * @param toolkit Toolkit used to fetch property from, can be null - * in which default will be used. * @param type Type of font being used, corresponds to MetalTheme font * type. */
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalRootPaneUI.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalRootPaneUI.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -338,7 +338,7 @@ * and sets this value; the default is null, implying a native operating * system window title pane. * - * @param content the <code>JComponent</code> to use for the window title pane. + * @param titlePane the <code>JComponent</code> to use for the window title pane. */ private void setTitlePane(JRootPane root, JComponent titlePane) { JLayeredPane layeredPane = root.getLayeredPane(); @@ -434,7 +434,7 @@ /** * Returns the amount of space the layout would like to have. * - * @param the Container for which this layout manager is being used + * @param parent the Container for which this layout manager is being used * @return a Dimension object containing the layout's preferred size */ public Dimension preferredLayoutSize(Container parent) { @@ -486,7 +486,7 @@ /** * Returns the minimum amount of space the layout needs. * - * @param the Container for which this layout manager is being used + * @param parent the Container for which this layout manager is being used * @return a Dimension object containing the layout's minimum size */ public Dimension minimumLayoutSize(Container parent) { @@ -537,7 +537,7 @@ /** * Returns the maximum amount of space the layout can use. * - * @param the Container for which this layout manager is being used + * @param target the Container for which this layout manager is being used * @return a Dimension object containing the layout's maximum size */ public Dimension maximumLayoutSize(Container target) { @@ -601,7 +601,7 @@ * Instructs the layout manager to perform the layout for the specified * container. * - * @param the Container for which this layout manager is being used + * @param parent the Container for which this layout manager is being used */ public void layoutContainer(Container parent) { JRootPane root = (JRootPane) parent;
--- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/nimbus/NimbusStyle.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -934,9 +934,7 @@ * <p>The actual code path for determining the proper state is the same as * in Synth.</p> * - * @param ctx * @param lastState a 1 element array, allowing me to do pass-by-reference. - * @return */ private RuntimeState getNextState(RuntimeState[] states, int[] lastState,
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultEditorKit.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -2179,9 +2179,6 @@ /** * Create this action with the appropriate identifier. - * @param nm the name of the action, Action.NAME. - * @param select whether to extend the selection when - * changing the caret position. */ SelectWordAction() { super(selectWordAction); @@ -2209,9 +2206,6 @@ /** * Create this action with the appropriate identifier. - * @param nm the name of the action, Action.NAME. - * @param select whether to extend the selection when - * changing the caret position. */ SelectLineAction() { super(selectLineAction); @@ -2239,9 +2233,6 @@ /** * Create this action with the appropriate identifier. - * @param nm the name of the action, Action.NAME. - * @param select whether to extend the selection when - * changing the caret position. */ SelectParagraphAction() { super(selectParagraphAction); @@ -2269,9 +2260,6 @@ /** * Create this action with the appropriate identifier. - * @param nm the name of the action, Action.NAME. - * @param select whether to extend the selection when - * changing the caret position. */ SelectAllAction() { super(selectAllAction);
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultStyledDocument.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/DefaultStyledDocument.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1797,8 +1797,6 @@ /** * Pushes a new element onto the stack that represents * the current path. - * @param record Whether or not the push should be - * recorded as an element change or not. * @param isFracture true if pushing on an element that was created * as the result of a fracture. */
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter1.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter1.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -198,7 +198,7 @@ * @param v the view * @param p0 the location in the model where the * fragment should start its representation >= 0 - * @param pos the graphic location along the axis that the + * @param x the graphic location along the axis that the * broken view would occupy >= 0; this may be useful for * things like tab calculations * @param len specifies the distance into the view
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter2.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/GlyphPainter2.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -193,7 +193,7 @@ * @param v the view to find the model location to break at. * @param p0 the location in the model where the * fragment should start it's representation >= 0. - * @param pos the graphic location along the axis that the + * @param x the graphic location along the axis that the * broken view would occupy >= 0. This may be useful for * things like tab calculations. * @param len specifies the distance into the view
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/ParagraphView.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/ParagraphView.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -899,7 +899,6 @@ /** * Range represented by a row in the paragraph is only * a subset of the total range of the paragraph element. - * @see View#getRange */ public int getStartOffset() { int offs = Integer.MAX_VALUE;
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/PlainView.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/PlainView.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -510,8 +510,8 @@ * Provides a mapping from the view coordinate space to the logical * coordinate space of the model. * - * @param fx the X coordinate >= 0 - * @param fy the Y coordinate >= 0 + * @param x the X coordinate >= 0 + * @param y the Y coordinate >= 0 * @param a the allocated region to render into * @return the location within the model that best represents the * given point in the view >= 0
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/TextLayoutStrategy.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/TextLayoutStrategy.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -88,9 +88,8 @@ * Gives notification from the document that attributes were changed * in a location that this view is responsible for. * - * @param changes the change information from the associated document - * @param a the current allocation of the view - * @param f the factory to use to rebuild if the view has children + * @param e the change information from the associated document + * @param alloc the current allocation of the view inside of the insets. * @see View#changedUpdate */ public void changedUpdate(FlowView fv, DocumentEvent e, Rectangle alloc) { @@ -117,9 +116,9 @@ * views or view fragments) and follow that with bidi reordering * of the unidirectional view fragments. * - * @param row the row to fill in with views. This is assumed + * @param rowIndex the row to fill in with views. This is assumed * to be empty on entry. - * @param pos The current position in the children of + * @param p0 The current position in the children of * this views element from which to start. * @return the position to start the next row */ @@ -157,7 +156,7 @@ * calculated by the LineBreakMeasurer, this is implemented * to do nothing. * - * @param r the row to adjust to the current layout + * @param rowIndex the row to adjust to the current layout * span. * @param desiredSpan the current layout span >= 0 * @param x the location r starts at.
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/Utilities.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/Utilities.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1245,7 +1245,7 @@ * * @param v View to query * @param pos the position to convert >= 0 - * @param a the allocated region to render into + * @param alloc the allocated region to render into * @param direction the direction from the current position that can * be thought of as the arrow keys typically found on a keyboard; * this may be one of the following:
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/CSS.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/CSS.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -948,7 +948,6 @@ * Returns the size of a font from the passed in string. * * @param size CSS string describing font size - * @param baseFontSize size to use for relative units. */ float getPointSize(String size, StyleSheet ss) { int relSize, absSize, diff, index; @@ -1658,8 +1657,8 @@ * value, this method returns a CssValue object to associate with the * CSS attribute. * - * @param the CSS.Attribute - * @param a String containing the value associated HTML.Attribtue. + * @param cssAttr the CSS.Attribute + * @param htmlAttrValue a String containing the value associated HTML.Attribute. */ Object getCssValue(CSS.Attribute cssAttr, String htmlAttrValue) { CssValue value = (CssValue)valueConvertor.get(cssAttr); @@ -1670,7 +1669,7 @@ /** * Maps an HTML.Attribute object to its appropriate CSS.Attributes. * - * @param HTML.Attribute + * @param hAttr HTML.Attribute * @return CSS.Attribute[] */ private CSS.Attribute[] getCssAttribute(HTML.Attribute hAttr) { @@ -1685,7 +1684,7 @@ * based on the tag associated with the attribute and the * value of the attribute. * - * @param AttributeSet containing HTML attributes. + * @param tag the AttributeSet containing HTML attributes. * @return CSS.Attribute mapping for HTML.Attribute.ALIGN. */ private CSS.Attribute getCssAlignAttribute(HTML.Tag tag, @@ -1711,7 +1710,7 @@ /** * Fetches the tag associated with the HTML AttributeSet. * - * @param AttributeSet containing the HTML attributes. + * @param htmlAttrSet the AttributeSet containing the HTML attributes. * @return HTML.Tag */ private HTML.Tag getHTMLTag(AttributeSet htmlAttrSet) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/FormView.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/FormView.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -209,7 +209,7 @@ * Creates a component for an <INPUT> element based on the * value of the "type" attribute. * - * @param set of attributes associated with the <INPUT> element. + * @param attr set of attributes associated with the <INPUT> element. * @param model the value of the StyleConstants.ModelAttribute * @return the component. */ @@ -653,8 +653,6 @@ * action. * * @param buffer the buffer that contains that data to submit - * @param targetElement the element that triggered the - * form submission */ private void getFormData(StringBuilder buffer) { Element formE = getFormElement();
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/FrameView.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/FrameView.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -143,8 +143,7 @@ * contains it is editable. And then proceeds to call * the superclass to do the paint(). * - * @param parent View - * @see text.ComponentView#paint + * @see javax.swing.text.ComponentView#paint */ public void paint(Graphics g, Shape allocation) { @@ -289,8 +288,6 @@ * firing the event to the outermost JEditorPane, this * method also invokes the setPage() method and explicitly * replaces the current document with the destination url. - * - * @param HyperlinkEvent */ public void hyperlinkUpdate(HyperlinkEvent evt) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/NoFramesView.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/NoFramesView.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2000, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -59,7 +59,7 @@ * @param g the rendering surface to use * @param allocation the allocated region to render into * @see #isVisible - * @see text.ParagraphView#paint + * @see javax.swing.text.ParagraphView#paint */ public void paint(Graphics g, Shape allocation) { Container host = getContainer(); @@ -126,7 +126,7 @@ * typically the view is told to render into the span * that is returned, although there is no guarantee; * the parent may choose to resize or break the view - * @see text.ParagraphView#getPreferredSpan + * @see javax.swing.text.ParagraphView#getPreferredSpan */ public float getPreferredSpan(int axis) { if (!visible) { @@ -143,7 +143,7 @@ * @param axis may be either <code>View.X_AXIS</code> or * <code>View.Y_AXIS</code> * @return the minimum span the view can be rendered into - * @see text.ParagraphView#getMinimumSpan + * @see javax.swing.text.ParagraphView#getMinimumSpan */ public float getMinimumSpan(int axis) { if (!visible) { @@ -160,7 +160,7 @@ * @param axis may be either <code>View.X_AXIS</code> or * <code>View.Y_AXIS</code> * @return the maximum span the view can be rendered into - * @see text.ParagraphView#getMaximumSpan + * @see javax.swing.text.ParagraphView#getMaximumSpan */ public float getMaximumSpan(int axis) { if (!visible) {
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/Parser.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/parser/Parser.java Wed Jul 05 23:16:05 2017 +0200 @@ -2119,8 +2119,11 @@ } /* To account for extra read()'s that happened */ - for (int j = 0; j < i; j++) { - addString(charsToAdd[j]); + if (i > 0) { + for (int j = 0; j < i; j++) { + addString(charsToAdd[j]); + } + continue; } switch (ch) { case -1:
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFGenerator.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFGenerator.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,12 +42,8 @@ * <p>Note that this is a lossy conversion since RTF's model of * text does not exactly correspond with LightText's. * - * @see LTAttributedText - * @see LTRTFFilter - * @see LTTextAcceptor * @see java.io.OutputStream */ - class RTFGenerator extends Object { /* These dictionaries map Colors, font names, or Style objects
--- a/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFParser.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/rtf/RTFParser.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -32,11 +32,11 @@ * and passes a stream of control words, text, and begin/end group * indications to its subclass. * - * Normally programmers will only use <b>RTFFilter</b>, a subclass of this class that knows what to + * Normally programmers will only use <b>RTFReader</b>, a subclass of this class that knows what to * do with the tokens this class parses. * * @see AbstractFilter - * @see RTFFilter + * @see RTFReader */ abstract class RTFParser extends AbstractFilter {
--- a/jdk/src/java.desktop/share/classes/sun/applet/AppletSecurity.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/applet/AppletSecurity.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -109,7 +109,8 @@ /** * get the current (first) instance of an AppletClassLoader on the stack. */ - @SuppressWarnings("deprecation") + @SuppressWarnings({"deprecation", + "removal"}) // SecurityManager.currentClassLoader() private AppletClassLoader currentAppletClassLoader() { // try currentClassLoader first @@ -298,7 +299,8 @@ * @exception SecurityException if the caller does not have * permission to access the AWT event queue. */ - @SuppressWarnings("deprecation") + @SuppressWarnings({"deprecation", + "removal"}) // SecurityManager.checkAwtEventQueueAccess public void checkAwtEventQueueAccess() { AppContext appContext = AppContext.getAppContext(); AppletClassLoader appletClassLoader = currentAppletClassLoader();
--- a/jdk/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/awt/image/BytePackedRaster.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -24,14 +24,16 @@ */ package sun.awt.image; + +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.image.DataBuffer; +import java.awt.image.DataBufferByte; +import java.awt.image.MultiPixelPackedSampleModel; import java.awt.image.Raster; -import java.awt.image.WritableRaster; import java.awt.image.RasterFormatException; import java.awt.image.SampleModel; -import java.awt.image.MultiPixelPackedSampleModel; -import java.awt.image.DataBufferByte; -import java.awt.Rectangle; -import java.awt.Point; +import java.awt.image.WritableRaster; /** * This class is useful for describing 1, 2, or 4 bit image data
--- a/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/java2d/marlin/MarlinRenderingEngine.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -153,11 +153,11 @@ * The specified {@code src} {@link Shape} is widened according * to the parameters specified by the {@link BasicStroke} object. * Adjustments are made to the path as appropriate for the - * {@link VALUE_STROKE_NORMALIZE} hint if the {@code normalize} - * boolean parameter is true. + * {@link java.awt.RenderingHints#VALUE_STROKE_NORMALIZE} hint if the + * {@code normalize} boolean parameter is true. * Adjustments are made to the path as appropriate for the - * {@link VALUE_ANTIALIAS_ON} hint if the {@code antialias} - * boolean parameter is true. + * {@link java.awt.RenderingHints#VALUE_ANTIALIAS_ON} hint if the + * {@code antialias} boolean parameter is true. * <p> * The geometry of the widened path is forwarded to the indicated * {@link PathConsumer2D} object as it is calculated.
--- a/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/share/classes/sun/print/RasterPrinterJob.java Wed Jul 05 23:16:05 2017 +0200 @@ -886,14 +886,6 @@ } } - protected PageFormat getPageFormatFromAttributes() { - if (attributes == null || attributes.isEmpty()) { - return null; - } - return attributeToPageFormat(getPrintService(), this.attributes); - } - - /** * Presents the user a dialog for changing properties of the * print job interactively.
--- a/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.cpp Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.desktop/windows/native/libawt/windows/awt_Window.cpp Wed Jul 05 23:16:05 2017 +0200 @@ -239,7 +239,9 @@ fullScreenExclusiveModeState = FALSE; m_winSizeMove = FALSE; - prevScaleRec = { -1, -1, -1 }; + prevScaleRec.screen = -1; + prevScaleRec.scaleX = -1.0f; + prevScaleRec.scaleY = -1.0f; } AwtWindow::~AwtWindow()
--- a/jdk/src/java.se.ee/share/classes/module-info.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/java.se.ee/share/classes/module-info.java Wed Jul 05 23:16:05 2017 +0200 @@ -32,7 +32,8 @@ * @moduleGraph * @since 9 */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // java.corba and other modules module java.se.ee { requires transitive java.se;
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Exchange.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,6 +26,7 @@ package jdk.incubator.http; import java.io.IOException; +import java.io.UncheckedIOException; import java.net.InetSocketAddress; import java.net.ProxySelector; import java.net.SocketPermission; @@ -64,6 +65,9 @@ final HttpRequestImpl request; final HttpClientImpl client; volatile ExchangeImpl<T> exchImpl; + // used to record possible cancellation raised before the exchImpl + // has been established. + private volatile IOException failed; final List<SocketPermission> permissions = new LinkedList<>(); final AccessControlContext acc; final MultiExchange<?,T> multi; @@ -143,14 +147,80 @@ } public void cancel() { + // cancel can be called concurrently before or at the same time + // that the exchange impl is being established. + // In that case we won't be able to propagate the cancellation + // right away if (exchImpl != null) { exchImpl.cancel(); + } else { + // no impl - can't cancel impl yet. + // call cancel(IOException) instead which takes care + // of race conditions between impl/cancel. + cancel(new IOException("Request cancelled")); } } public void cancel(IOException cause) { - if (exchImpl != null) { - exchImpl.cancel(cause); + // If the impl is non null, propagate the exception right away. + // Otherwise record it so that it can be propagated once the + // exchange impl has been established. + ExchangeImpl<?> impl = exchImpl; + if (impl != null) { + // propagate the exception to the impl + impl.cancel(cause); + } else { + try { + // no impl yet. record the exception + failed = cause; + // now call checkCancelled to recheck the impl. + // if the failed state is set and the impl is not null, reset + // the failed state and propagate the exception to the impl. + checkCancelled(false); + } catch (IOException x) { + // should not happen - we passed 'false' above + throw new UncheckedIOException(x); + } + } + } + + // This method will raise an exception if one was reported and if + // it is possible to do so. If the exception can be raised, then + // the failed state will be reset. Otherwise, the failed state + // will persist until the exception can be raised and the failed state + // can be cleared. + // Takes care of possible race conditions. + private void checkCancelled(boolean throwIfNoImpl) throws IOException { + ExchangeImpl<?> impl = null; + IOException cause = null; + if (failed != null) { + synchronized(this) { + cause = failed; + impl = exchImpl; + if (throwIfNoImpl || impl != null) { + // The exception will be raised by one of the two methods + // below: reset the failed state. + failed = null; + } + } + } + if (cause == null) return; + if (impl != null) { + // The exception is raised by propagating it to the impl. + impl.cancel(cause); + } else if (throwIfNoImpl) { + // The exception is raised by throwing it immediately + throw cause; + } else { + Log.logTrace("Exchange: request [{0}/timeout={1}ms] no impl is set." + + "\n\tCan''t cancel yet with {2}", + request.uri(), + request.duration() == null ? -1 : + // calling duration.toMillis() can throw an exception. + // this is just debugging, we don't care if it overflows. + (request.duration().getSeconds() * 1000 + + request.duration().getNano() / 1000000), + cause); } } @@ -191,10 +261,26 @@ } } + // get/set the exchange impl, solving race condition issues with + // potential concurrent calls to cancel() or cancel(IOException) + private void establishExchange(HttpConnection connection) + throws IOException, InterruptedException + { + // check if we have been cancelled first. + checkCancelled(true); + // not yet cancelled: create/get a new impl + exchImpl = ExchangeImpl.get(this, connection); + // recheck for cancelled, in case of race conditions + checkCancelled(true); + // now we're good to go. because exchImpl is no longer null + // cancel() will be able to propagate directly to the impl + // after this point. + } + private Response responseImpl0(HttpConnection connection) throws IOException, InterruptedException { - exchImpl = ExchangeImpl.get(this, connection); + establishExchange(connection); exchImpl.setClientForRequest(requestProcessor); if (request.expectContinue()) { Log.logTrace("Sending Expect: 100-Continue"); @@ -257,7 +343,7 @@ CompletableFuture<Response> responseAsyncImpl0(HttpConnection connection) { try { - exchImpl = ExchangeImpl.get(this, connection); + establishExchange(connection); } catch (IOException | InterruptedException e) { return MinimalFuture.failedFuture(e); }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Http1Exchange.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,9 +46,12 @@ class Http1Exchange<T> extends ExchangeImpl<T> { final HttpRequestImpl request; // main request - final List<CompletableFuture<?>> operations; // used for cancel + private final List<CompletableFuture<?>> operations; // used for cancel final Http1Request requestAction; - volatile Http1Response<T> response; + private volatile Http1Response<T> response; + // use to record possible cancellation raised before any operation + // has been initiated. + private IOException failed; final HttpConnection connection; final HttpClientImpl client; final Executor executor; @@ -70,7 +73,7 @@ this.request = exchange.request(); this.client = exchange.client(); this.executor = exchange.executor(); - this.operations = Collections.synchronizedList(new LinkedList<>()); + this.operations = new LinkedList<>(); this.buffer = exchange.getBuffer(); if (connection != null) { this.connection = connection; @@ -186,9 +189,22 @@ } connection.close(); int count = 0; - for (CompletableFuture<?> cf : operations) { - cf.completeExceptionally(cause); - count++; + if (operations.isEmpty()) { + failed = cause; + Log.logTrace("Http1Exchange: request [{0}/timeout={1}ms] no pending operation." + + "\n\tCan''t cancel yet with {2}", + request.uri(), + request.duration() == null ? -1 : + // calling duration.toMillis() can throw an exception. + // this is just debugging, we don't care if it overflows. + (request.duration().getSeconds() * 1000 + + request.duration().getNano() / 1000000), + cause); + } else { + for (CompletableFuture<?> cf : operations) { + cf.completeExceptionally(cause); + count++; + } } Log.logError("Http1Exchange.cancel: count=" + count); } @@ -206,8 +222,24 @@ CompletableFuture<Response> cf = connection.whenReceivingResponse() .thenCompose((v) -> getResponseAsyncImpl(executor)); - - operations.add(cf); + IOException cause; + synchronized(this) { + operations.add(cf); + cause = failed; + failed = null; + } + if (cause != null) { + Log.logTrace("Http1Exchange: request [{0}/timeout={1}ms]" + + "\n\tCompleting exceptionally with {2}\n", + request.uri(), + request.duration() == null ? -1 : + // calling duration.toMillis() can throw an exception. + // this is just debugging, we don't care if it overflows. + (request.duration().getSeconds() * 1000 + + request.duration().getNano() / 1000000), + cause); + cf.completeExceptionally(cause); + } return cf; } }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpClientImpl.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/HttpClientImpl.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -582,12 +582,14 @@ // Timers are implemented through timed Selector.select() calls. synchronized void registerTimer(TimeoutEvent event) { + Log.logTrace("Registering timer {0}", event); timeouts.add(event); selmgr.wakeupSelector(); } synchronized void cancelTimer(TimeoutEvent event) { - timeouts.stream().filter(e -> e == event).forEach(timeouts::remove); + Log.logTrace("Canceling timer {0}", event); + timeouts.remove(event); } /** @@ -595,23 +597,61 @@ * returns the amount of time, in milliseconds, until the next earliest * event. A return value of 0 means that there are no events. */ - private synchronized long purgeTimeoutsAndReturnNextDeadline() { - if (timeouts.isEmpty()) - return 0L; + private long purgeTimeoutsAndReturnNextDeadline() { + long diff = 0L; + List<TimeoutEvent> toHandle = null; + int remaining = 0; + // enter critical section to retrieve the timeout event to handle + synchronized(this) { + if (timeouts.isEmpty()) return 0L; + + Instant now = Instant.now(); + Iterator<TimeoutEvent> itr = timeouts.iterator(); + while (itr.hasNext()) { + TimeoutEvent event = itr.next(); + diff = now.until(event.deadline(), ChronoUnit.MILLIS); + if (diff <= 0) { + itr.remove(); + toHandle = (toHandle == null) ? new ArrayList<>() : toHandle; + toHandle.add(event); + } else { + break; + } + } + remaining = timeouts.size(); + } - Instant now = Instant.now(); - Iterator<TimeoutEvent> itr = timeouts.iterator(); - while (itr.hasNext()) { - TimeoutEvent event = itr.next(); - long diff = now.until(event.deadline(), ChronoUnit.MILLIS); - if (diff <= 0) { - itr.remove(); - event.handle(); // TODO: release lock. - } else { - return diff; + // can be useful for debugging + if (toHandle != null && Log.trace()) { + Log.logTrace("purgeTimeoutsAndReturnNextDeadline: handling " + + (toHandle == null ? 0 : toHandle.size()) + " events, " + + "remaining " + remaining + + ", next deadline: " + (diff < 0 ? 0L : diff)); + } + + // handle timeout events out of critical section + if (toHandle != null) { + Throwable failed = null; + for (TimeoutEvent event : toHandle) { + try { + Log.logTrace("Firing timer {0}", event); + event.handle(); + } catch (Error | RuntimeException e) { + // Not expected. Handle remaining events then throw... + // If e is an OOME or SOE it might simply trigger a new + // error from here - but in this case there's not much we + // could do anyway. Just let it flow... + if (failed == null) failed = e; + else failed.addSuppressed(e); + Log.logTrace("Failed to handle event {0}: {1}", event, e); + } } + if (failed instanceof Error) throw (Error) failed; + if (failed instanceof RuntimeException) throw (RuntimeException) failed; } - return 0L; + + // return time to wait until next event. 0L if there's no more events. + return diff < 0 ? 0L : diff; } // used for the connection window
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/MultiExchange.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/MultiExchange.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -357,9 +357,5 @@ public void handle() { cancel(new HttpTimeoutException("request timed out")); } - @Override - public String toString() { - return "[deadline = " + deadline() + "]"; - } } }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/PlainHttpConnection.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -54,7 +54,7 @@ */ class PlainHttpConnection extends HttpConnection implements AsyncConnection { - protected SocketChannel chan; + protected final SocketChannel chan; private volatile boolean connected; private boolean closed; @@ -100,6 +100,7 @@ chan.finishConnect(); } catch (IOException e) { cf.completeExceptionally(e); + return; } connected = true; cf.complete(null);
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/Stream.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -670,11 +670,21 @@ @Override CompletableFuture<Response> getResponseAsync(Executor executor) { - CompletableFuture<Response> cf; + CompletableFuture<Response> cf = null; + // The code below deals with race condition that can be caused when + // completeResponse() is being called before getResponseAsync() synchronized (response_cfs) { if (!response_cfs.isEmpty()) { + // This CompletableFuture was created by completeResponse(). + // it will be already completed. cf = response_cfs.remove(0); + // if we find a cf here it should be already completed. + // finding a non completed cf should not happen. just assert it. + assert cf.isDone() : "Removing uncompleted response: could cause code to hang!"; } else { + // getResponseAsync() is called first. Create a CompletableFuture + // that will be completed by completeResponse() when + // completeResponse() is called. cf = new MinimalFuture<>(); response_cfs.add(cf); } @@ -708,7 +718,7 @@ cf.complete(resp); response_cfs.remove(cf); return; - } + } // else we found the previous response: just leave it alone. } cf = MinimalFuture.completedFuture(resp); Log.logTrace("Created completed future (streamid={0}): {1}", @@ -742,10 +752,13 @@ */ void completeResponseExceptionally(Throwable t) { synchronized (response_cfs) { - for (CompletableFuture<Response> cf : response_cfs) { + // use index to avoid ConcurrentModificationException + // caused by removing the CF from within the loop. + for (int i = 0; i < response_cfs.size(); i++) { + CompletableFuture<Response> cf = response_cfs.get(i); if (!cf.isDone()) { cf.completeExceptionally(t); - response_cfs.remove(cf); + response_cfs.remove(i); return; } }
--- a/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/TimeoutEvent.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.incubator.httpclient/share/classes/jdk/incubator/http/TimeoutEvent.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,10 +27,11 @@ import java.time.Duration; import java.time.Instant; +import java.util.concurrent.atomic.AtomicLong; /** * Timeout event notified by selector thread. Executes the given handler if - * the timer not cancelled first. + * the timer not canceled first. * * Register with {@link HttpClientImpl#registerTimer(TimeoutEvent)}. * @@ -38,6 +39,10 @@ */ abstract class TimeoutEvent implements Comparable<TimeoutEvent> { + private static final AtomicLong COUNTER = new AtomicLong(); + // we use id in compareTo to make compareTo consistent with equals + // see TimeoutEvent::compareTo below; + private final long id = COUNTER.incrementAndGet(); private final Instant deadline; TimeoutEvent(Duration duration) { @@ -52,6 +57,24 @@ @Override public int compareTo(TimeoutEvent other) { - return this.deadline.compareTo(other.deadline); + if (other == this) return 0; + // if two events have the same deadline, but are not equals, then the + // smaller is the one that was created before (has the smaller id). + // This is arbitrary and we don't really care which is smaller or + // greater, but we need a total order, so two events with the + // same deadline cannot compare == 0 if they are not equals. + final int compareDeadline = this.deadline.compareTo(other.deadline); + if (compareDeadline == 0 && !this.equals(other)) { + long diff = this.id - other.id; // should take care of wrap around + if (diff < 0) return -1; + else if (diff > 0) return 1; + else assert false : "Different events with same id and deadline"; + } + return compareDeadline; + } + + @Override + public String toString() { + return "TimeoutEvent[id=" + id + ", deadline=" + deadline + "]"; } }
--- a/jdk/src/jdk.internal.jvmstat/share/classes/module-info.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.internal.jvmstat/share/classes/module-info.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,6 +23,12 @@ * questions. */ +/** + * Defines an internal API for monitoring a HotSpot Java Virtual Machine using + * its shared memory instrumentation buffer + * + * @since 9 + */ module jdk.internal.jvmstat { exports sun.jvmstat.monitor to jdk.attach,
--- a/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/extra/EditingHistory.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.internal.le/share/classes/jdk/internal/jline/extra/EditingHistory.java Wed Jul 05 23:16:05 2017 +0200 @@ -264,9 +264,8 @@ } public boolean previousSnippet() { - for (int i = index() - 1; i >= 0; i--) { - if (get(i) instanceof NarrowingHistoryLine) { - moveTo(i); + while (previous()) { + if (current() instanceof NarrowingHistoryLine) { return true; } } @@ -275,19 +274,17 @@ } public boolean nextSnippet() { - for (int i = index() + 1; i < size(); i++) { - if (get(i) instanceof NarrowingHistoryLine) { - moveTo(i); + boolean success = false; + + while (next()) { + success = true; + + if (current() instanceof NarrowingHistoryLine) { return true; } } - if (index() < size()) { - moveToEnd(); - return true; - } - - return false; + return success; } public final void load(Iterable<? extends String> originalHistory) {
--- a/jdk/src/jdk.management/share/classes/com/sun/management/VMOption.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.management/share/classes/com/sun/management/VMOption.java Wed Jul 05 23:16:05 2017 +0200 @@ -47,8 +47,6 @@ * object was constructed. The value of the VM option * may be changed after the {@code VMOption} object was constructed, * - * @see <a href="{@docRoot}/../../../../technotes/guides/vm/index.html"> - * Java Virtual Machine</a> * @author Mandy Chung * @since 1.6 */
--- a/jdk/src/jdk.policytool/share/classes/sun/security/tools/policytool/PolicyTool.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.policytool/share/classes/sun/security/tools/policytool/PolicyTool.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -71,6 +71,7 @@ */ @Deprecated(since="9", forRemoval=true) +@SuppressWarnings("removal") public class PolicyTool { // for i18n @@ -879,7 +880,8 @@ * The Permission contains the (Type, Name, Action) triplet. * */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class PolicyEntry { private CodeSource codesource; @@ -1019,7 +1021,8 @@ /** * The main window for the PolicyTool */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class ToolWindow extends JFrame { // use serialVersionUID from JDK 1.2.2 for interoperability private static final long serialVersionUID = 5682568601210376777L; @@ -1553,7 +1556,8 @@ /** * General dialog window */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class ToolDialog extends JDialog { // use serialVersionUID from JDK 1.2.2 for interoperability private static final long serialVersionUID = -372244357011301190L; @@ -2917,7 +2921,8 @@ /** * Event handler for the PolicyTool window */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class ToolWindowListener implements WindowListener { private PolicyTool tool; @@ -2962,7 +2967,8 @@ /** * Event handler for the Policy List */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class PolicyListListener extends MouseAdapter implements ActionListener { private PolicyTool tool; @@ -2992,7 +2998,8 @@ /** * Event handler for the File Menu */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class FileMenuListener implements ActionListener { private PolicyTool tool; @@ -3091,7 +3098,8 @@ /** * Event handler for the main window buttons and Edit Menu */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class MainWindowListener implements ActionListener { private PolicyTool tool; @@ -3167,7 +3175,8 @@ * if edit is FALSE, then we are ADDing a new PolicyEntry, * so we only need to update the GUI listing. */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class AddEntryDoneButtonListener implements ActionListener { private PolicyTool tool; @@ -3234,7 +3243,8 @@ /** * Event handler for ChangeKeyStoreOKButton button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class ChangeKeyStoreOKButtonListener implements ActionListener { private PolicyTool tool; @@ -3281,7 +3291,8 @@ /** * Event handler for AddPrinButton button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class AddPrinButtonListener implements ActionListener { private PolicyTool tool; @@ -3307,7 +3318,8 @@ /** * Event handler for AddPermButton button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class AddPermButtonListener implements ActionListener { private PolicyTool tool; @@ -3333,7 +3345,8 @@ /** * Event handler for AddPrinOKButton button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class NewPolicyPrinOKButtonListener implements ActionListener { private PolicyTool tool; @@ -3397,7 +3410,8 @@ /** * Event handler for AddPermOKButton button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class NewPolicyPermOKButtonListener implements ActionListener { private PolicyTool tool; @@ -3461,7 +3475,8 @@ /** * Event handler for RemovePrinButton button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class RemovePrinButtonListener implements ActionListener { private PolicyTool tool; @@ -3497,7 +3512,8 @@ /** * Event handler for RemovePermButton button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class RemovePermButtonListener implements ActionListener { private PolicyTool tool; @@ -3540,7 +3556,8 @@ * GUI listing. If the user is editing an existing PolicyEntry, we * update both the GUI listing and the actual PolicyEntry. */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class EditPrinButtonListener extends MouseAdapter implements ActionListener { private PolicyTool tool; @@ -3587,7 +3604,8 @@ * GUI listing. If the user is editing an existing PolicyEntry, we * update both the GUI listing and the actual PolicyEntry. */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class EditPermButtonListener extends MouseAdapter implements ActionListener { private PolicyTool tool; @@ -3628,7 +3646,8 @@ /** * Event handler for Principal Popup Menu */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class PrincipalTypeMenuListener implements ItemListener { private ToolDialog td; @@ -3680,7 +3699,8 @@ /** * Event handler for Permission Popup Menu */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class PermissionMenuListener implements ItemListener { private ToolDialog td; @@ -3755,7 +3775,8 @@ /** * Event handler for Permission Name Popup Menu */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class PermissionNameMenuListener implements ItemListener { private ToolDialog td; @@ -3909,7 +3930,8 @@ /** * Event handler for UserSaveYes button */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class UserSaveYesButtonListener implements ActionListener { private ToolDialog us; @@ -3964,7 +3986,8 @@ /** * Event handler for UserSaveNoButton */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class UserSaveNoButtonListener implements ActionListener { private PolicyTool tool; @@ -4013,7 +4036,8 @@ /** * Event handler for ConfirmRemovePolicyEntryOKButtonListener */ -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class ConfirmRemovePolicyEntryOKButtonListener implements ActionListener { private PolicyTool tool; @@ -4169,7 +4193,8 @@ } } -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class AuthPerm extends Perm { AuthPerm() { super(javax.security.auth.AuthPermission.class, @@ -4242,7 +4267,8 @@ } } -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class URLPerm extends Perm { URLPerm() { super(java.net.URLPermission.class, @@ -4407,7 +4433,8 @@ } } -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class RuntimePerm extends Perm { RuntimePerm() { super(java.lang.RuntimePermission.class, @@ -4448,7 +4475,8 @@ } } -@SuppressWarnings("deprecation") +@SuppressWarnings({"deprecation", + "removal"}) // PolicyTool class SecurityPerm extends Perm { SecurityPerm() { super(java.security.SecurityPermission.class,
--- a/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/SolarisLoginModule.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.security.auth/share/classes/com/sun/security/auth/module/SolarisLoginModule.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,6 +66,7 @@ private boolean debug = true; // SolarisSystem to retrieve underlying system info + @SuppressWarnings("removal") private SolarisSystem ss; // the authentication status @@ -73,9 +74,13 @@ private boolean commitSucceeded = false; // Underlying system info + @SuppressWarnings("removal") private SolarisPrincipal userPrincipal; + @SuppressWarnings("removal") private SolarisNumericUserPrincipal UIDPrincipal; + @SuppressWarnings("removal") private SolarisNumericGroupPrincipal GIDPrincipal; + @SuppressWarnings("removal") private LinkedList<SolarisNumericGroupPrincipal> supplementaryGroups = new LinkedList<>(); @@ -121,6 +126,7 @@ * @return true in all cases (this {@code LoginModule} * should not be ignored). */ + @SuppressWarnings("removal") public boolean login() throws LoginException { long[] solarisGroups = null; @@ -234,6 +240,7 @@ * @return false if this LoginModule's own login and/or commit attempts * failed, and true otherwise. */ + @SuppressWarnings("removal") public boolean abort() throws LoginException { if (debug) { System.out.println("\t\t[SolarisLoginModule]: " + @@ -271,6 +278,7 @@ * @return true in all cases (this {@code LoginModule} * should not be ignored). */ + @SuppressWarnings("removal") public boolean logout() throws LoginException { if (debug) { System.out.println("\t\t[SolarisLoginModule]: " +
--- a/jdk/src/jdk.unsupported/share/classes/sun/reflect/Reflection.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/src/jdk.unsupported/share/classes/sun/reflect/Reflection.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -35,6 +35,7 @@ * with {@link StackWalker.StackFrame#getDeclaringClass} instead. */ @Deprecated(forRemoval=true) + @SuppressWarnings("removal") // Reflection.getCallerClass public static Class<?> getCallerClass(int depth) { if (depth < 0) throw new InternalError("depth must be positive");
--- a/jdk/test/ProblemList.txt Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/ProblemList.txt Wed Jul 05 23:16:05 2017 +0200 @@ -124,6 +124,7 @@ # jdk_lang java/lang/StringCoding/CheckEncodings.sh 7008363 generic-all +java/lang/Class/getDeclaredField/FieldSetAccessibleTest.java 8178776 generic-all jdk/internal/misc/JavaLangAccess/NewUnsafeString.java 8176188 generic-all @@ -170,8 +171,6 @@ java/net/DatagramSocket/SendDatagramToBadAddress.java 7143960 macosx-all -java/net/httpclient/TimeoutOrdering.java 8170940 solaris-all,windows-all - ############################################################################ # jdk_nio @@ -257,8 +256,7 @@ tools/jimage/JImageListTest.java 8170120 generic-all tools/jimage/JImageVerifyTest.java 8170120 generic-all - -tools/jlink/multireleasejar/JLinkMultiReleaseJarTest.java 8169971 windows-x64 +tools/jimage/VerifyJimage.java 8178776 generic-all tools/jar/multiRelease/RuntimeTest.java 8173905 generic-all
--- a/jdk/test/com/sun/jdi/ProcessAttachTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/com/sun/jdi/ProcessAttachTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -23,13 +23,11 @@ import java.io.IOException; import java.io.InputStream; -import java.util.List; import java.util.Map; import jdk.testlibrary.ProcessTools; import com.sun.jdi.Bootstrap; -import com.sun.jdi.ThreadReference; import com.sun.jdi.VirtualMachine; import com.sun.jdi.connect.AttachingConnector; import com.sun.jdi.connect.Connector; @@ -86,7 +84,7 @@ is.read(); // Attach a debugger - tryDebug(p.getPid()); + tryDebug(p.pid()); } finally { p.destroyForcibly(); }
--- a/jdk/test/java/awt/MouseInfo/JContainerMousePositionTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/awt/MouseInfo/JContainerMousePositionTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017 Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -67,15 +67,19 @@ robot.waitForIdle(); AtomicReference<Rectangle> frameBounds = new AtomicReference<>(); + AtomicReference<Insets> frameInsets = new AtomicReference<>(); AtomicReference<Dimension> button1Size = new AtomicReference<>(); SwingUtilities.invokeAndWait(() -> { frameBounds.set(frame1.getBounds()); + frameInsets.set(frame1.getInsets()); button1Size.set(jButton1.getSize()); }); //point mouse to center of top-left Component (button1) - robot.mouseMove(frameBounds.get().x + button1Size.get().width / 2, - frameBounds.get().y + button1Size.get().height / 2); + robot.mouseMove(frameBounds.get().x + frameInsets.get().left + + button1Size.get().width / 2, + frameBounds.get().y + frameInsets.get().top + + button1Size.get().height / 2); AtomicReference<Point> pFalse = new AtomicReference<>(); AtomicReference<Point> pTrue = new AtomicReference<>(); @@ -108,10 +112,12 @@ System.out.println("Test stage completed: Container.getMousePosition(boolean) returned null result outside Container. Passed."); //point mouse in place free from child components (right-botton component) - robot.mouseMove(frameBounds.get().x + centerC4.get().x, - frameBounds.get().y + centerC4.get().y); + robot.mouseMove(frameBounds.get().x + frameInsets.get().left + + centerC4.get().x, + frameBounds.get().y + frameInsets.get().top + + centerC4.get().y); - robot.delay(3000); + robot.waitForIdle(); SwingUtilities.invokeAndWait(() -> { pFalse.set(contentPane.getMousePosition(false)); pTrue.set(frame1.getMousePosition(true)); @@ -123,7 +129,8 @@ } System.out.println("Test stage completed: Container.getMousePosition(boolean) returned non-null results inside Container. Passed."); - if (pTrue.get().x != centerC4.get().x || pTrue.get().y != centerC4.get().y) { + if (pTrue.get().x != frameInsets.get().left + centerC4.get().x || + pTrue.get().y != frameInsets.get().top + centerC4.get().y) { throw new RuntimeException("Test failed: Container.getMousePosition(true) returned incorrect result inside Container."); } System.out.println("Test stage completed: Container.getMousePosition(true) returned correct result inside Container. Passed.");
--- a/jdk/test/java/awt/TextField/DisabledUndoTest/DisabledUndoTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/awt/TextField/DisabledUndoTest/DisabledUndoTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -24,7 +24,7 @@ /* * @test * @key headful - * @bug 4302718 6753165 + * @bug 4302718 6753165 8177386 * @summary verifies that undo does not work in a disabled TextField on windows * @requires (os.family == "windows") * @run main/manual DisabledUndoTest @@ -42,12 +42,12 @@ private static void init() throws Exception { String[] instructions - = { - "1.Type a few symbols in the textfield.", - "2.Then click the button Disable textfield to disable the textfield.", - "3.Right-click on the textfield to invoke context menu and select \"Undo\".", - "4.Verify that the symbols you typed are NOT undone.", - "5.If they are not, press Pass, else press Fail." + = { + "1.Type a few symbols in the textfield.", + "2.Right-click on the textfield to invoke context menu and select \"Undo\". Make sure the typed symbol is undone.", + "3.Then click the button Disable textfield to disable the textfield.", + "4.Right-click on the textfield to invoke context menu.Verify that Undo option is disabled in context menu and you can't undo the text", + "5.If they are not, press Pass, else press Fail." }; Sysout.createDialog();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/Window/WindowDeadlockTest/WindowDeadlockTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8176490 + * @summary Tests that there is no hang or deadlock when the visibility + * of parent and child windows is changed. + * @library ../../regtesthelpers + * @build Util + * @run main/timeout=20 WindowDeadlockTest + */ + +import java.awt.Dialog; +import java.awt.Frame; +import java.awt.Robot; + +import test.java.awt.regtesthelpers.Util; + +public class WindowDeadlockTest { + public static void main(String[] args) throws Exception { + Robot robot = Util.createRobot(); + + Frame main = new Frame("Main"); + main.setBounds(0, 0, 200, 100); + main.setVisible(true); + + Dialog first = new Dialog(main, "First"); + first.setBounds(250, 0, 200, 100); + first.setVisible(true); + + Dialog second = new Dialog(first, "Second"); + second.setBounds(0, 150, 200, 100); + second.setVisible(true); + + Util.waitForIdle(robot); + robot.delay(2000); + + Dialog third = new Dialog(first, "Third", false); + third.setBounds(250, 150, 200, 100); + third.setVisible(true); + first.setVisible(false); // the hang takes place here + + Util.waitForIdle(robot); + robot.delay(2000); + + third.dispose(); + second.dispose(); + first.dispose(); + main.dispose(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/awt/print/PageFormat/WrongPaperPrintingTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,238 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + @bug 8167102 + @summary PrintRequestAttributeSet breaks page size set using PageFormat + @run main/manual WrongPaperPrintingTest + */ + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.FlowLayout; +import java.awt.Graphics; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.print.PageFormat; +import java.awt.print.Paper; +import java.awt.print.Printable; +import java.awt.print.PrinterException; +import java.awt.print.PrinterJob; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; +import javax.print.attribute.HashPrintRequestAttributeSet; +import javax.print.attribute.PrintRequestAttributeSet; +import javax.print.attribute.Size2DSyntax; +import javax.print.attribute.standard.Chromaticity; +import javax.print.attribute.standard.MediaSize; +import javax.print.attribute.standard.MediaSizeName; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextArea; +import javax.swing.SwingUtilities; +import javax.swing.Timer; +import javax.swing.WindowConstants; + +public class WrongPaperPrintingTest implements Printable { + private static final CountDownLatch testEndedSignal = new CountDownLatch(1); + private static final int testTimeout = 300000; + private static volatile String testFailureMsg; + private static volatile boolean testPassed; + private static volatile boolean testFinished; + + public static void main(String[] args) { + SwingUtilities.invokeLater(() -> createAndShowTestDialog()); + + try { + if (!testEndedSignal.await(testTimeout, TimeUnit.MILLISECONDS)) { + throw new RuntimeException(String.format( + "Test timeout '%d ms' elapsed.", testTimeout)); + } + if (!testPassed) { + String failureMsg = testFailureMsg; + if ((failureMsg != null) && (!failureMsg.trim().isEmpty())) { + throw new RuntimeException(failureMsg); + } else { + throw new RuntimeException("Test failed."); + } + } + } catch (InterruptedException ie) { + throw new RuntimeException(ie); + } finally { + testFinished = true; + } + } + + private static void doTest() { + PrintRequestAttributeSet aset = new HashPrintRequestAttributeSet(); + aset.add(Chromaticity.MONOCHROME); + + MediaSize isoA5Size = MediaSize.getMediaSizeForName(MediaSizeName.ISO_A5); + float[] size = isoA5Size.getSize(Size2DSyntax.INCH); + Paper paper = new Paper(); + paper.setSize(size[0] * 72.0, size[1] * 72.0); + paper.setImageableArea(0.0, 0.0, size[0] * 72.0, size[1] * 72.0); + PageFormat pf = new PageFormat(); + pf.setPaper(paper); + + PrinterJob job = PrinterJob.getPrinterJob(); + job.setPrintable(new WrongPaperPrintingTest(), job.validatePage(pf)); + if (job.printDialog()) { + try { + job.print(aset); + } catch (PrinterException pe) { + throw new RuntimeException(pe); + } + } + } + + private static void pass() { + testPassed = true; + testEndedSignal.countDown(); + } + + private static void fail(String failureMsg) { + testFailureMsg = failureMsg; + testPassed = false; + testEndedSignal.countDown(); + } + + private static String convertMillisToTimeStr(int millis) { + if (millis < 0) { + return "00:00:00"; + } + int hours = millis / 3600000; + int minutes = (millis - hours * 3600000) / 60000; + int seconds = (millis - hours * 3600000 - minutes * 60000) / 1000; + return String.format("%02d:%02d:%02d", hours, minutes, seconds); + } + + private static void createAndShowTestDialog() { + String description = + " To run this test it is required to have a virtual PDF\r\n" + + " printer or any other printer supporting A5 paper size.\r\n" + + "\r\n" + + " 1. Verify that NOT A5 paper size is set as default for the\r\n" + + " printer to be used.\r\n" + + " 2. Click on \"Start Test\" button.\r\n" + + " 3. In the shown print dialog select the printer and click\r\n" + + " on \"Print\" button.\r\n" + + " 4. Verify that a page with a drawn rectangle is printed on\r\n" + + " a paper of A5 size which is (5.8 x 8.3 in) or\r\n" + + " (148 x 210 mm).\r\n" + + "\r\n" + + " If the printed page size is correct, click on \"PASS\"\r\n" + + " button, otherwise click on \"FAIL\" button."; + + final JDialog dialog = new JDialog(); + dialog.setTitle("WrongPaperPrintingTest"); + dialog.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + dialog.addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + dialog.dispose(); + fail("Main dialog was closed."); + } + }); + + final JLabel testTimeoutLabel = new JLabel(String.format( + "Test timeout: %s", convertMillisToTimeStr(testTimeout))); + final long startTime = System.currentTimeMillis(); + final Timer timer = new Timer(0, null); + timer.setDelay(1000); + timer.addActionListener((e) -> { + int leftTime = testTimeout - (int)(System.currentTimeMillis() - startTime); + if ((leftTime < 0) || testFinished) { + timer.stop(); + dialog.dispose(); + } + testTimeoutLabel.setText(String.format( + "Test timeout: %s", convertMillisToTimeStr(leftTime))); + }); + timer.start(); + + JTextArea textArea = new JTextArea(description); + textArea.setEditable(false); + + final JButton testButton = new JButton("Start Test"); + final JButton passButton = new JButton("PASS"); + final JButton failButton = new JButton("FAIL"); + testButton.addActionListener((e) -> { + testButton.setEnabled(false); + new Thread(() -> { + try { + doTest(); + + SwingUtilities.invokeLater(() -> { + passButton.setEnabled(true); + failButton.setEnabled(true); + }); + } catch (Throwable t) { + t.printStackTrace(); + dialog.dispose(); + fail("Exception occurred in a thread executing the test."); + } + }).start(); + }); + passButton.setEnabled(false); + passButton.addActionListener((e) -> { + dialog.dispose(); + pass(); + }); + failButton.setEnabled(false); + failButton.addActionListener((e) -> { + dialog.dispose(); + fail("Size of a printed page is wrong."); + }); + + JPanel mainPanel = new JPanel(new BorderLayout()); + JPanel labelPanel = new JPanel(new FlowLayout()); + labelPanel.add(testTimeoutLabel); + mainPanel.add(labelPanel, BorderLayout.NORTH); + mainPanel.add(textArea, BorderLayout.CENTER); + JPanel buttonPanel = new JPanel(new FlowLayout()); + buttonPanel.add(testButton); + buttonPanel.add(passButton); + buttonPanel.add(failButton); + mainPanel.add(buttonPanel, BorderLayout.SOUTH); + dialog.add(mainPanel); + + dialog.pack(); + dialog.setVisible(true); + } + + @Override + public int print(Graphics g, PageFormat pf, int pageIndex) + throws PrinterException { + if (pageIndex == 0) { + g.setColor(Color.RED); + g.drawRect((int)pf.getImageableX(), (int)pf.getImageableY(), + (int)pf.getImageableWidth(), (int)pf.getImageableHeight()); + return Printable.PAGE_EXISTS; + } else { + return Printable.NO_SUCH_PAGE; + } + } +}
--- a/jdk/test/java/io/FilePermission/Correctness.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/io/FilePermission/Correctness.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -89,12 +89,14 @@ //check("/-", "-"); try { - // containsPath is broken on Windows. containsMethod = FilePermission.class.getDeclaredMethod( "containsPath", Path.class, Path.class); containsMethod.setAccessible(true); System.out.println(); + // The 1st 2 args of contains() must be normalized paths. + // When FilePermission::containsPath is called by implies, + // paths have already been normalized. contains("x", "x", 0); contains("x", "x/y", 1); contains("x", "x/y/z", 2); @@ -160,7 +162,7 @@ } } - static void check(String s1, String s2, boolean expected) { + static void check0(String s1, String s2, boolean expected) { FilePermission fp1 = new FilePermission(s1, "read"); FilePermission fp2 = new FilePermission(s2, "read"); boolean b = fp1.implies(fp2); @@ -173,6 +175,16 @@ } } + static void check(String s1, String s2, boolean expected) { + check0(s1, s2, expected); + if (isWindows) { + check0("C:" + s1, s2, false); + check0(s1, "C:" + s2, false); + check0("C:" + s1, "D:" + s2, false); + check0("C:" + s1, "C:" + s2, expected); + } + } + static void check(String s1, String s2) { check(s1, s2, true); }
--- a/jdk/test/java/lang/ProcessBuilder/Basic.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessBuilder/Basic.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -311,7 +311,7 @@ if (action.equals("sleep")) { Thread.sleep(10 * 60 * 1000L); } else if (action.equals("pid")) { - System.out.println(ProcessHandle.current().getPid()); + System.out.println(ProcessHandle.current().pid()); } else if (action.equals("testIO")) { String expected = "standard input"; char[] buf = new char[expected.length()+1]; @@ -1235,7 +1235,7 @@ Process p = pb.start(); String s = commandOutput(p); long actualPid = Long.valueOf(s.trim()); - long expectedPid = p.getPid(); + long expectedPid = p.pid(); equal(actualPid, expectedPid); } catch (Throwable t) { unexpected(t); @@ -1245,7 +1245,7 @@ // Test the default implementation of Process.getPid DelegatingProcess p = new DelegatingProcess(null); THROWS(UnsupportedOperationException.class, - () -> p.getPid(), + () -> p.pid(), () -> p.toHandle(), () -> p.supportsNormalTermination(), () -> p.children(), @@ -2243,7 +2243,7 @@ // Child process waits until it gets input String s = p.toString(); check(s.contains("not exited")); - check(s.contains("pid=" + p.getPid() + ",")); + check(s.contains("pid=" + p.pid() + ",")); new PrintStream(p.getOutputStream()).print("standard input"); p.getOutputStream().close(); @@ -2251,7 +2251,7 @@ // Check the toString after it exits int exitValue = p.waitFor(); s = p.toString(); - check(s.contains("pid=" + p.getPid() + ",")); + check(s.contains("pid=" + p.pid() + ",")); check(s.contains("exitValue=" + exitValue) && !s.contains("not exited")); }
--- a/jdk/test/java/lang/ProcessBuilder/PipelineTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessBuilder/PipelineTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -212,7 +212,7 @@ static void print(ProcessHandle p) { System.out.printf("process: pid: %d, info: %s%n", - p.getPid(), p.info()); + p.pid(), p.info()); } // Check various aspects of the processes
--- a/jdk/test/java/lang/ProcessBuilder/Zombies.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessBuilder/Zombies.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ ! new File("/bin/ps").canExecute()) return; System.out.println("Looks like a Unix system."); - long mypid = ProcessHandle.current().getPid(); + long mypid = ProcessHandle.current().pid(); System.out.printf("mypid: %d%n", mypid); final Runtime rt = Runtime.getRuntime(); @@ -65,7 +65,7 @@ Process p = rt.exec(TrueCommand); ProcessHandle pp = p.toHandle().parent().orElse(null); - System.out.printf("%s pid: %d, parent: %s%n", TrueCommand, p.getPid(), pp); + System.out.printf("%s pid: %d, parent: %s%n", TrueCommand, p.pid(), pp); p.waitFor(); // Count all the zombies that are children of this Java process
--- a/jdk/test/java/lang/ProcessHandle/Basic.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessHandle/Basic.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -66,13 +66,13 @@ public static void test2() { try { ProcessHandle self = ProcessHandle.current(); - long pid = self.getPid(); // known native process id + long pid = self.pid(); // known native process id Optional<ProcessHandle> self1 = ProcessHandle.of(pid); assertEquals(self1.get(), self, - "ProcessHandle.of(x.getPid()) should be equal getPid() %d: %d"); + "ProcessHandle.of(x.pid()) should be equal pid() %d: %d"); Optional<ProcessHandle> ph = ProcessHandle.of(pid); - assertEquals(pid, ph.get().getPid()); + assertEquals(pid, ph.get().pid()); } finally { // Cleanup any left over processes ProcessHandle.current().children().forEach(ProcessHandle::destroy); @@ -98,7 +98,7 @@ Process p = new ProcessBuilder("sleep", "0").start(); p.waitFor(); - long deadPid = p.getPid(); + long deadPid = p.pid(); p = null; // Forget the process Optional<ProcessHandle> t = ProcessHandle.of(deadPid);
--- a/jdk/test/java/lang/ProcessHandle/JavaChild.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessHandle/JavaChild.java Wed Jul 05 23:16:05 2017 +0200 @@ -159,7 +159,7 @@ */ CompletableFuture<String> forEachOutputLine(Consumer<String> consumer) { final CompletableFuture<String> future = new CompletableFuture<>(); - String name = "OutputLineReader-" + getPid(); + String name = "OutputLineReader-" + pid(); Thread t = new Thread(() -> { try (BufferedReader reader = outputReader()) { String line; @@ -167,7 +167,7 @@ consumer.accept(line); } } catch (IOException | RuntimeException ex) { - consumer.accept("IOE (" + getPid() + "):" + ex.getMessage()); + consumer.accept("IOE (" + pid() + "):" + ex.getMessage()); future.completeExceptionally(ex); } future.complete("success"); @@ -327,7 +327,7 @@ try { p.getOutputStream().close(); } catch (IOException ie) { - sendResult("stdin_closing", p.getPid(), + sendResult("stdin_closing", p.pid(), "exception", ie.getMessage()); } } @@ -352,9 +352,9 @@ "children to terminate%n"); children.removeAll(completedChildren); for (JavaChild c : children) { - sendResult("stdin_noterm", c.getPid()); + sendResult("stdin_noterm", c.pid()); System.err.printf(" Process not terminated: " + - "pid: %d%n", c.getPid()); + "pid: %d%n", c.pid()); } System.exit(2); } @@ -386,11 +386,11 @@ System.arraycopy(args, nextArg, subargs, 0, subargs.length); for (int i = 0; i < ncount; i++) { JavaChild p = spawnJavaChild(subargs); - sendResult(action, p.getPid()); + sendResult(action, p.pid()); p.forEachOutputLine(JavaChild::sendRaw); p.onJavaChildExit().thenAccept((p1) -> { int excode = p1.exitValue(); - sendResult("child_exit", p1.getPid(), excode); + sendResult("child_exit", p1.pid(), excode); completedChildren.add(p1); }); children.add(p); // Add child to spawned list @@ -410,7 +410,7 @@ if (p.isAlive()) { sentCount++; // overwrite with current pid - result[0] = Long.toString(p.getPid()); + result[0] = Long.toString(p.pid()); sendResult(action, result); p.sendAction(args[nextArg], subargs); } @@ -426,7 +426,7 @@ // ignoring those that are not alive for (JavaChild p : children) { if (p.isAlive()) { - sendResult(action, p.getPid()); + sendResult(action, p.pid()); p.getOutputStream().close(); } } @@ -505,7 +505,7 @@ String command; Object[] results; Event(String command, Object... results) { - this(self.getPid(), ++commandSeq, command, results); + this(self.pid(), ++commandSeq, command, results); } Event(long pid, int seq, String command, Object... results) { this.pid = pid;
--- a/jdk/test/java/lang/ProcessHandle/OnExitTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessHandle/OnExitTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -104,7 +104,7 @@ JavaChild proc = JavaChild.spawnJavaChild("stdin"); procHandle = proc.toHandle(); - printf(" spawned: %d%n", proc.getPid()); + printf(" spawned: %d%n", proc.pid()); proc.forEachOutputLine((s) -> { String[] split = s.trim().split(" "); @@ -235,7 +235,7 @@ } while (!"pid".equals(split[1])); // Tell B to wait for A's pid - B.sendAction("waitpid", A.getPid()); + B.sendAction("waitpid", A.pid()); // Wait a bit to see if B will prematurely report the termination of A try {
--- a/jdk/test/java/lang/ProcessHandle/ProcessUtil.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessHandle/ProcessUtil.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -199,7 +199,7 @@ */ static void printProcess(ProcessHandle ph, String prefix) { printf("%spid %s, alive: %s; parent: %s, %s%n", prefix, - ph.getPid(), ph.isAlive(), ph.parent(), ph.info()); + ph.pid(), ph.isAlive(), ph.parent(), ph.info()); } /**
--- a/jdk/test/java/lang/ProcessHandle/TreeTest.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/ProcessHandle/TreeTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -73,7 +73,7 @@ try { ProcessHandle self = ProcessHandle.current(); - printf("self pid: %d%n", self.getPid()); + printf("self pid: %d%n", self.pid()); printDeep(self, ""); for (int i = 0; i < MAXCHILDREN; i++) { @@ -154,7 +154,7 @@ JavaChild p1 = JavaChild.spawnJavaChild("stdin"); ProcessHandle p1Handle = p1.toHandle(); - printf(" p1 pid: %d%n", p1.getPid()); + printf(" p1 pid: %d%n", p1.pid()); // Gather the PIDs from the output of the spawing process p1.forEachOutputLine((s) -> { @@ -206,7 +206,7 @@ // show the complete list of children (for debug) List<ProcessHandle> descendants = getDescendants(p1Handle); printf(" descendants: %s%n", - descendants.stream().map(p -> p.getPid()) + descendants.stream().map(p -> p.pid()) .collect(Collectors.toList())); // Verify that all spawned children show up in the descendants List @@ -252,7 +252,7 @@ JavaChild p1 = JavaChild.spawnJavaChild("stdin"); ProcessHandle p1Handle = p1.toHandle(); - printf(" p1: %s%n", p1.getPid()); + printf(" p1: %s%n", p1.pid()); int newChildren = 3; CountDownLatch spawnCount = new CountDownLatch(newChildren); @@ -356,11 +356,11 @@ parent[sortindex[i]] = processes[sortindex[i]].parent().orElse(null); } Arrays.sort(sortindex, (i1, i2) -> { - int cmp = Long.compare((parent[i1] == null ? 0L : parent[i1].getPid()), - (parent[i2] == null ? 0L : parent[i2].getPid())); + int cmp = Long.compare((parent[i1] == null ? 0L : parent[i1].pid()), + (parent[i2] == null ? 0L : parent[i2].pid())); if (cmp == 0) { - cmp = Long.compare((processes[i1] == null ? 0L : processes[i1].getPid()), - (processes[i2] == null ? 0L : processes[i2].getPid())); + cmp = Long.compare((processes[i1] == null ? 0L : processes[i1].pid()), + (processes[i2] == null ? 0L : processes[i2].pid())); } return cmp; }); @@ -397,7 +397,7 @@ ProcessHandle p1Handle = p1.toHandle(); printf("Spawning %d x %d x %d processes, pid: %d%n", - factor, factor, factor, p1.getPid()); + factor, factor, factor, p1.pid()); // Start the first tier of subprocesses p1.sendAction("spawn", factor, "stdin"); @@ -448,7 +448,7 @@ List<ProcessHandle> subprocesses = getDescendants(p1Handle); printf(" descendants: %s%n", - subprocesses.stream().map(p -> p.getPid()) + subprocesses.stream().map(p -> p.pid()) .collect(Collectors.toList())); p1.getOutputStream().close(); // Close stdin for the controlling p1
--- a/jdk/test/java/lang/Runtime/exec/SleepyCat.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/lang/Runtime/exec/SleepyCat.java Wed Jul 05 23:16:05 2017 +0200 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -80,10 +80,10 @@ for (Process p : pids) { if (p == null) continue; - String[] pfiles = {"pfiles", Long.toString(p.getPid())}; + String[] pfiles = {"pfiles", Long.toString(p.pid())}; fds = new ProcessBuilder(pfiles).inheritIO().start(); fds.waitFor(); - String[] pstack = {"pstack", Long.toString(p.getPid())}; + String[] pstack = {"pstack", Long.toString(p.pid())}; fds = new ProcessBuilder(pstack).inheritIO().start(); fds.waitFor(); }
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/Base.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,273 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * Base class for tests. + * The tests focuse on that LoggerFinder works well in jigsaw environment, + * i.e. make sure correct Logger can be retrieved, + * also verify that basic functionality of retrieved Logger's works well. + * + * Note: As the test will take long time, to avoid timeout, + * split it as several tests, this class is the base class for tests. + */ +public class Base { + protected static final String JAVA_HOME = System.getProperty("java.home"); + protected static final Path JDK_IMAGE = Paths.get(JAVA_HOME); + protected static final Path JMODS = Paths.get(JAVA_HOME, "jmods"); + + protected static final String TEST_SRC = System.getProperty("test.src"); + + // logger client to get logger from java.base module, it should get a lazy logger + // which wraps the underlying real logger implementation + protected static final Path SRC_PATCHED_USAGE = + Paths.get(TEST_SRC, "patched_usage", "java.base"); + protected static final Path DEST_PATCHED_USAGE = Paths.get("patched_usage", "java.base"); + protected static final Path SRC_PATCHED_CLIENT = Paths.get(TEST_SRC, "patched_client"); + protected static final Path DEST_PATCHED_CLIENT = Paths.get("patched_client"); + + // logger client to get logger from bootclasspath/a, it should get a lazy logger + // which wraps the underlying real logger implementation + protected static final Path SRC_BOOT_USAGE = Paths.get(TEST_SRC, "boot_usage"); + protected static final Path DEST_BOOT_USAGE = Paths.get("boot_usage"); + protected static final Path SRC_BOOT_CLIENT = Paths.get(TEST_SRC, "boot_client"); + protected static final Path DEST_BOOT_CLIENT = Paths.get("boot_client"); + + // logger provider in named module m.l.a + protected static final Path SRC_NAMED_LOGGER = Paths.get(TEST_SRC, "named_logger"); + protected static final Path DEST_NAMED_LOGGER = Paths.get("mods_named_logger"); + + // logger provider in unnamed module + protected static final Path SRC_UNNAMED_LOGGER = Paths.get(TEST_SRC, "unnamed_logger"); + protected static final Path DEST_UNNAMED_LOGGER = Paths.get("cp_unnamed_logger"); + protected static final Path SRC_UNNAMED_LOGGER_SERVICE_FILE = + SRC_UNNAMED_LOGGER.resolve("META-INF/services/java.lang.System$LoggerFinder"); + protected static final Path DEST_UNNAMED_LOGGER_SERVICE_DIR = + DEST_UNNAMED_LOGGER.resolve("META-INF/services"); + protected static final Path DEST_UNNAMED_LOGGER_SERVICE_FILE = + DEST_UNNAMED_LOGGER.resolve("META-INF/services/java.lang.System$LoggerFinder"); + + // logger client in named module m.t.a + protected static final Path SRC_NAMED_CLIENT = Paths.get(TEST_SRC, "named_client"); + protected static final Path DEST_NAMED_CLIENT = Paths.get("mods_named_client"); + + // logger client in unnamed module + protected static final Path SRC_UNNAMED_CLIENT = Paths.get(TEST_SRC, "unnamed_client"); + protected static final Path DEST_UNNAMED_CLIENT = Paths.get("cp_unnamed_client"); + + // customized image with only module java.base + protected static final Path IMAGE = Paths.get("image"); + // customized image with java.base and logger provider module m.l.a + protected static final Path IMAGE_LOGGER = Paths.get("image_logger"); + // customized image with module java.base and logger client module m.t.a + protected static final Path IMAGE_CLIENT = Paths.get("image_client"); + // customized image with module java.base, logger provider module m.l.a + // and logger client module m.t.a + protected static final Path IMAGE_CLIENT_LOGGER = Paths.get("image_all"); + + // lazy logger class which wraps the underlying real logger implementation + protected static final String LAZY_LOGGER = + "jdk.internal.logger.LazyLoggers$JdkLazyLogger"; + // JUL logger class which wraps java.util.logging.Logger + protected static final String JUL_LOGGER = + "sun.util.logging.internal.LoggingProviderImpl$JULWrapper"; + // default simple logger class when no logger provider can be found + protected static final String SIMPLE_LOGGER = + "jdk.internal.logger.SimpleConsoleLogger"; + // logger class in named module m.l.a + protected static final String LOGGER_A = "pkg.a.l.LoggerA"; + // logger class in unnamed module m.l.b + protected static final String LOGGER_B = "pkg.b.l.LoggerB"; + + // logger client in named module + protected static final String CLIENT_A = "m.t.a/pkg.a.t.TestA"; + // logger client in unnamed module + protected static final String CLIENT_B = "pkg.b.t.TestB"; + // logger client which gets logger through boot class BootUsage + protected static final String BOOT_CLIENT = "BootClient"; + // logger client which gets logger through patched class + // java.base/java.lang.PatchedUsage + protected static final String PATCHED_CLIENT = "PatchedClient"; + + protected void setupAllClient() throws Throwable { + // compiles logger client which will get logger through patched + // class java.base/java.lang.PatchedUsage + compile(SRC_BOOT_USAGE, DEST_BOOT_USAGE); + compile(SRC_BOOT_CLIENT, DEST_BOOT_CLIENT, + "--class-path", DEST_BOOT_USAGE.toString()); + + // compiles logger client which will get logger through boot + // class BootUsage + compile(SRC_PATCHED_USAGE, DEST_PATCHED_USAGE, + "--patch-module", "java.base=" + SRC_PATCHED_USAGE.toString()); + compile(SRC_PATCHED_CLIENT, DEST_PATCHED_CLIENT, + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString()); + + // compiles logger client in unnamed module + compile(SRC_UNNAMED_CLIENT, DEST_UNNAMED_CLIENT, + "--source-path", SRC_UNNAMED_CLIENT.toString()); + + // compiles logger client in named module m.t.a + compile(SRC_NAMED_CLIENT, DEST_NAMED_CLIENT, + "--module-source-path", SRC_NAMED_CLIENT.toString()); + } + + protected void setupNamedLogger() throws Throwable { + // compiles logger provider in named module m.l.a + compile(SRC_NAMED_LOGGER, DEST_NAMED_LOGGER, + "--module-source-path", SRC_NAMED_LOGGER.toString()); + } + + protected void setupUnnamedLogger() throws Throwable { + // compiles logger provider in unnamed module + compile(SRC_UNNAMED_LOGGER, DEST_UNNAMED_LOGGER, + "--source-path", SRC_UNNAMED_LOGGER.toString()); + Files.createDirectories(DEST_UNNAMED_LOGGER_SERVICE_DIR); + Files.copy(SRC_UNNAMED_LOGGER_SERVICE_FILE, DEST_UNNAMED_LOGGER_SERVICE_FILE, + StandardCopyOption.REPLACE_EXISTING); + } + + protected boolean checkJMODS() throws Throwable { + // if $JAVA_HOME/jmods does not exist, skip below steps + // as there is no way to build customized images by jlink + if (Files.notExists(JMODS)) { + System.err.println("Skip tests which require image"); + return false; + } + return true; + } + + protected void setupJavaBaseImage() throws Throwable { + if (!checkJMODS()) { + return; + } + + // build image with just java.base module + String mpath = JMODS.toString(); + execTool("jlink", + "--module-path", mpath, + "--add-modules", "java.base", + "--output", IMAGE.toString()); + } + + protected void setupLoggerImage() throws Throwable { + if (!checkJMODS()) { + return; + } + + // build image with java.base + m.l.a modules + String mpath = DEST_NAMED_LOGGER.toString() + File.pathSeparator + JMODS.toString(); + execTool("jlink", + "--module-path", mpath, + "--add-modules", "m.l.a", + "--output", IMAGE_LOGGER.toString()); + } + + protected void setupClientImage() throws Throwable { + if (!checkJMODS()) { + return; + } + + // build image with java.base + m.t.a modules + String mpath = DEST_NAMED_CLIENT.toString() + File.pathSeparator + JMODS.toString(); + execTool("jlink", + "--module-path", mpath, + "--add-modules", "m.t.a", + "--output", IMAGE_CLIENT.toString()); + } + + protected void setupFullImage() throws Throwable { + if (!checkJMODS()) { + return; + } + + // build image with java.base + m.l.a + m.t.a modules + String mpath = DEST_NAMED_LOGGER.toString() + File.pathSeparator + + DEST_NAMED_CLIENT.toString() + File.pathSeparator + JMODS.toString(); + execTool("jlink", + "--module-path", mpath, + "--add-modules", "m.l.a,m.t.a", + "--output", IMAGE_CLIENT_LOGGER.toString()); + + } + + protected static void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("expected true, but get false."); + } + } + + /* + * run test with supplied java image which could be jdk image or customized image + */ + protected void runTest(Path image, String... opts) throws Throwable { + String[] options = Stream.concat(Stream.of(getJava(image)), Stream.of(opts)) + .toArray(String[]::new); + + ProcessBuilder pb = new ProcessBuilder(options); + int exitValue = executeCommand(pb).outputTo(System.out) + .errorTo(System.err) + .getExitValue(); + assertTrue(exitValue == 0); + } + + private void compile(Path src, Path dest, String... params) throws Throwable { + assertTrue(CompilerUtils.compile(src, dest, params)); + } + + private String getJava(Path image) { + boolean isWindows = System.getProperty("os.name").startsWith("Windows"); + Path java = image.resolve("bin").resolve(isWindows ? "java.exe" : "java"); + if (Files.notExists(java)) + throw new RuntimeException(java + " not found"); + return java.toAbsolutePath().toString(); + } + + private void execTool(String tool, String... args) throws Throwable { + String path = JDKToolFinder.getJDKTool(tool); + List<String> commands = new ArrayList<>(); + commands.add(path); + Stream.of(args).forEach(commands::add); + ProcessBuilder pb = new ProcessBuilder(commands); + + int exitValue = executeCommand(pb).outputTo(System.out) + .errorTo(System.out) + .shouldNotContain("no module is recorded in hash") + .getExitValue(); + assertTrue(exitValue == 0); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/JDKLoggerForImageTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * @test + * @modules jdk.compiler + * @summary Test cases which run against customized image, check the situation where + * 1. logger provider is the default one supplied by java.base, + * 2. clients are in named/unnamed module, + * patched system module, or Xbootclasspath + * This test does not require existence of java.logging module, + * but require jdk.compiler module + * @library /lib/testlibrary + * @build Base CompilerUtils jdk.testlibrary.* + * @run main/othervm JDKLoggerForImageTest + */ + +public class JDKLoggerForImageTest extends Base { + + public static void main(String args[]) throws Throwable { + JDKLoggerForImageTest t = new JDKLoggerForImageTest(); + t.setup(); + t.test(); + } + + private void setup() throws Throwable { + setupAllClient(); + + setupJavaBaseImage(); + } + + private void test() throws Throwable { + if (!checkJMODS()) { + return; + } + + // logger client is in named module m.t.a + runTest(IMAGE, + "--module-path", DEST_NAMED_CLIENT.toString(), + "-m", CLIENT_A, "system", SIMPLE_LOGGER); + // logger client is in unnamed module + runTest(IMAGE, + "--class-path", DEST_UNNAMED_CLIENT.toString(), + CLIENT_B, "system", SIMPLE_LOGGER); + // logger client gets logger through boot class BootUsage + runTest(IMAGE, + "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(), + "--class-path", DEST_BOOT_CLIENT.toString(), + BOOT_CLIENT, "system", SIMPLE_LOGGER); + // logger client gets logger through patched class + // java.base/java.lang.PatchedUsage + runTest(IMAGE, + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(), + "--class-path", DEST_PATCHED_CLIENT.toString(), + PATCHED_CLIENT, "system", SIMPLE_LOGGER); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/JDKLoggerForJDKTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * @test + * @modules java.logging + * @modules jdk.compiler + * @summary Test cases which run against the JDK image, check the situation where + * 1. logger provider is the default one supplied by the JDK, + * 2. clients are in named/unnamed module, + * patched system module, or Xbootclasspath + * This test DOES require existence of java.logging module + * @library /lib/testlibrary + * @build Base CompilerUtils jdk.testlibrary.* + * @run main/othervm JDKLoggerForJDKTest + */ + +public class JDKLoggerForJDKTest extends Base { + + public static void main(String args[]) throws Throwable { + JDKLoggerForJDKTest t = new JDKLoggerForJDKTest(); + t.setup(); + t.test(); + } + + private void setup() throws Throwable { + setupAllClient(); + } + + private void test() throws Throwable { + // logger client is in named module m.t.a + runTest(JDK_IMAGE, + "--module-path", DEST_NAMED_CLIENT.toString(), + "-m", CLIENT_A, "system", JUL_LOGGER); + // logger client is in unnamed module + runTest(JDK_IMAGE, + "--class-path", DEST_UNNAMED_CLIENT.toString(), + CLIENT_B, "system", JUL_LOGGER); + // logger client gets logger through boot class BootUsage + runTest(JDK_IMAGE, + "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(), + "--class-path", DEST_BOOT_CLIENT.toString(), + BOOT_CLIENT, "system", LAZY_LOGGER, JUL_LOGGER); + // logger client gets logger through patched class + // java.base/java.lang.PatchedUsage + runTest(JDK_IMAGE, + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(), + "--class-path", DEST_PATCHED_CLIENT.toString(), + PATCHED_CLIENT, "system", LAZY_LOGGER, JUL_LOGGER); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/LoggerInImageTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * @test + * @modules jdk.compiler + * @summary Test cases which run against customized image, check the situation where + * 1. logger providers are in the customized image too, + * 2. clients are in named/unnamed module, image, + * patched system module, or Xbootclasspath + * This test does not require existence of java.logging module, + * but require jdk.compiler module + * @library /lib/testlibrary + * @build Base CompilerUtils jdk.testlibrary.* + * @run main/othervm LoggerInImageTest + */ + +public class LoggerInImageTest extends Base { + + public static void main(String args[]) throws Throwable { + LoggerInImageTest t = new LoggerInImageTest(); + t.setup(); + t.test(); + } + + private void setup() throws Throwable { + setupAllClient(); + + setupNamedLogger(); + + setupLoggerImage(); + setupFullImage(); + } + + private void test() throws Throwable { + if (!checkJMODS()) { + return; + } + + // logger client is in named module m.t.a which is also in customized image + runTest(IMAGE_CLIENT_LOGGER, + "-m", CLIENT_A, "named", LOGGER_A); + // logger client in named module m.t.a + runTest(IMAGE_LOGGER, + "--module-path", DEST_NAMED_CLIENT.toString(), + "-m", CLIENT_A, "named", LOGGER_A); + // logger client is in unnamed module + runTest(IMAGE_LOGGER, + "--class-path", DEST_UNNAMED_CLIENT.toString(), + CLIENT_B, "named", LOGGER_A); + // logger client gets logger through boot class BootUsage + runTest(IMAGE_LOGGER, + "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(), + "--class-path", DEST_BOOT_CLIENT.toString(), + BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_A); + // logger client gets logger through patched class + // java.base/java.lang.PatchedUsage + runTest(IMAGE_LOGGER, + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(), + "--class-path", DEST_PATCHED_CLIENT.toString(), + PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_A); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/NamedLoggerForImageTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * @test + * @modules jdk.compiler + * @summary Test cases which run against customized image, check the situation where + * 1. logger providers are in named module, + * 2. clients are in named/unnamed module, image, + * patched system module, or Xbootclasspath + * This test does not require existence of java.logging module, + * but require jdk.compiler module + * @library /lib/testlibrary + * @build Base CompilerUtils jdk.testlibrary.* + * @run main/othervm NamedLoggerForImageTest + */ + +public class NamedLoggerForImageTest extends Base { + + public static void main(String args[]) throws Throwable { + NamedLoggerForImageTest t = new NamedLoggerForImageTest(); + t.setup(); + t.test(); + } + + private void setup() throws Throwable { + setupAllClient(); + + setupNamedLogger(); + + setupJavaBaseImage(); + setupClientImage(); + } + + private void test() throws Throwable { + if (!checkJMODS()) { + return; + } + + // logger client is in named module m.t.a + runTest(IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString() + + File.pathSeparator + DEST_NAMED_CLIENT.toString(), + "-m", CLIENT_A, "named", LOGGER_A); + // logger client is in unnamed module + runTest(IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString(), + "--class-path", DEST_UNNAMED_CLIENT.toString(), + CLIENT_B, "named", LOGGER_A); + // logger client is in named module m.t.a which is in customized image + runTest(IMAGE_CLIENT, + "--module-path", DEST_NAMED_LOGGER.toString(), + "-m", CLIENT_A, "named", LOGGER_A); + // logger client gets logger through boot class BootUsage + runTest(IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString(), + "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(), + "--class-path", DEST_BOOT_CLIENT.toString(), + BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_A); + // logger client gets logger through patched class + // java.base/java.lang.PatchedUsage + runTest(IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString(), + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(), + "--class-path", DEST_PATCHED_CLIENT.toString(), + PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_A); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/NamedLoggerForJDKTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * @test + * @modules jdk.compiler + * @summary Test cases which run against the JDK image, check the situation where + * 1. logger providers are in named module, + * 2. clients are in named/unnamed module, + * patched system module, or Xbootclasspath + * This test does not require existence of java.logging module, + * but require jdk.compiler module + * @library /lib/testlibrary + * @build Base CompilerUtils jdk.testlibrary.* + * @run main/othervm NamedLoggerForJDKTest + */ + +public class NamedLoggerForJDKTest extends Base { + + public static void main(String args[]) throws Throwable { + NamedLoggerForJDKTest t = new NamedLoggerForJDKTest(); + t.setup(); + t.test(); + } + + private void setup() throws Throwable { + setupAllClient(); + + setupNamedLogger(); + } + + private void test() throws Throwable { + // logger client is in named module m.t.a + runTest(JDK_IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString() + + File.pathSeparator + DEST_NAMED_CLIENT.toString(), + "-m", CLIENT_A, "named", LOGGER_A); + // logger client is in unnamed module + runTest(JDK_IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString(), + "--class-path", DEST_UNNAMED_CLIENT.toString(), + CLIENT_B, "named", LOGGER_A); + // logger client gets logger through boot class BootUsage + runTest(JDK_IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString(), + "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(), + "--class-path", DEST_BOOT_CLIENT.toString(), + BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_A); + // logger client gets logger through patched class + // java.base/java.lang.PatchedUsage + runTest(JDK_IMAGE, + "--module-path", DEST_NAMED_LOGGER.toString(), + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(), + "--class-path", DEST_PATCHED_CLIENT.toString(), + PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_A); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/UnnamedLoggerForImageTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * @test + * @modules jdk.compiler + * @summary Test cases which run against customized image, check the situation where + * 1. logger providers are in unnamed module, + * 2. clients are in named/unnamed module, image, + * patched system module, or Xbootclasspath + * This test does not require existence of java.logging module, + * but require jdk.compiler module + * @library /lib/testlibrary + * @build Base CompilerUtils jdk.testlibrary.* + * @run main/othervm UnnamedLoggerForImageTest + */ + +public class UnnamedLoggerForImageTest extends Base { + + public static void main(String args[]) throws Throwable { + UnnamedLoggerForImageTest t = new UnnamedLoggerForImageTest(); + t.setup(); + t.test(); + } + + private void setup() throws Throwable { + setupAllClient(); + + setupUnnamedLogger(); + + setupJavaBaseImage(); + setupClientImage(); + } + + private void test() throws Throwable { + if (!checkJMODS()) { + return; + } + + // logger client is in unnamed module + runTest(IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString() + + File.pathSeparator + DEST_UNNAMED_CLIENT.toString(), + CLIENT_B, "unnamed", LOGGER_B); + // logger client is in named module m.t.a + runTest(IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString(), + "--module-path", DEST_NAMED_CLIENT.toString(), + "-m", CLIENT_A, "unnamed", LOGGER_B); + // logger client is in named module m.t.a which is in customized image + runTest(IMAGE_CLIENT, + "--class-path", DEST_UNNAMED_LOGGER.toString(), + "-m", CLIENT_A, "unnamed", LOGGER_B); + // logger client gets logger through boot class BootUsage + runTest(IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString() + + File.pathSeparator + DEST_BOOT_CLIENT.toString(), + "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(), + BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_B); + // logger client gets logger through patched class + // java.base/java.lang.PatchedUsage + runTest(IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString() + + File.pathSeparator + DEST_PATCHED_CLIENT.toString(), + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(), + PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_B); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/UnnamedLoggerForJDKTest.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import jdk.testlibrary.JDKToolFinder; + +import static jdk.testlibrary.ProcessTools.executeCommand; + +/* + * @test + * @modules jdk.compiler + * @summary Test cases which run against the JDK image, check the situation where + * 1. logger providers are in unnamed module, + * 2. clients are in named/unnamed module, + * patched system module, or Xbootclasspath + * This test does not require existence of java.logging module, + * but require jdk.compiler module + * @library /lib/testlibrary + * @build Base CompilerUtils jdk.testlibrary.* + * @run main/othervm UnnamedLoggerForJDKTest + */ + +public class UnnamedLoggerForJDKTest extends Base { + + public static void main(String args[]) throws Throwable { + UnnamedLoggerForJDKTest t = new UnnamedLoggerForJDKTest(); + t.setup(); + t.test(); + } + + private void setup() throws Throwable { + setupAllClient(); + + setupUnnamedLogger(); + } + + private void test() throws Throwable { + // logger client is in named module m.t.a + runTest(JDK_IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString(), + "--module-path", DEST_NAMED_CLIENT.toString(), + "-m", CLIENT_A, "unnamed", LOGGER_B); + // logger client is also in unnamed module + runTest(JDK_IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString() + + File.pathSeparator + DEST_UNNAMED_CLIENT.toString(), + CLIENT_B, "unnamed", LOGGER_B); + // logger client gets logger through boot class BootUsage + runTest(JDK_IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString() + + File.pathSeparator + DEST_BOOT_CLIENT.toString(), + "-Xbootclasspath/a:" + DEST_BOOT_USAGE.toString(), + BOOT_CLIENT, "system", LAZY_LOGGER, LOGGER_B); + // logger client gets logger through patched class + // java.base/java.lang.PatchedUsage + runTest(JDK_IMAGE, + "--class-path", DEST_UNNAMED_LOGGER.toString() + + File.pathSeparator + DEST_PATCHED_CLIENT.toString(), + "--patch-module", "java.base=" + DEST_PATCHED_USAGE.toString(), + PATCHED_CLIENT, "system", LAZY_LOGGER, LOGGER_B); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/boot_client/BootClient.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.reflect.Method; +import java.lang.System.Logger; +import java.util.ResourceBundle; +import java.util.ListResourceBundle; + +/* + * Tests when logger client is in Xbootclasspath + */ +public final class BootClient { + + public static void main(String[] args) throws Exception { + assertTrue(args.length >= 2); + String loggerMode = args[0]; + String loggerClassName = args[1]; + String underlyingLoggerClassName = args.length >= 3 ? args[2] : null; + + testLogger(loggerMode, loggerClassName, underlyingLoggerClassName); + testLog(underlyingLoggerClassName); + } + + /* + * Tests System.getLogger(String) get expected logger. + */ + private static void testLogger(String loggerMode, String loggerClassName, + String underlyingLoggerClassName) { + String name = "test.boot"; + Logger logger = getLogger(name); + printLogger(logger); + + final Module lm = logger.getClass().getModule(); + final ClassLoader loggerCL = lm.getClassLoader(); + if (loggerMode.equals("system")) { + assertTrue(lm.isNamed()); + assertTrue(loggerCL == null); + } else if(loggerMode.equals("unnamed")) { + assertTrue(!lm.isNamed()); + assertTrue(loggerCL != null); + } else { + throw new RuntimeException("wrong parameter"); + } + + assertTrue(loggerClassName.equals(logger.getClass().getName())); + if (underlyingLoggerClassName != null) { + String loggerName = logger.getName(); + if (underlyingLoggerClassName.equals( + "sun.util.logging.internal.LoggingProviderImpl$JULWrapper")) { + assertTrue(loggerName.equals(name)); + } else { + assertTrue(loggerName.equals(underlyingLoggerClassName)); + } + } + } + + /* + * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and + * System.getLogger(String) works well. + */ + private static void testLog(String underlyingLoggerClassName) throws Exception { + if (underlyingLoggerClassName == null) { + return; + } + + if (underlyingLoggerClassName.equals("pkg.a.l.LoggerA") + || underlyingLoggerClassName.equals("pkg.b.l.LoggerB")) { + + String name = "test.boot.logger"; + String plainMsg = "this is test log message #1"; + ResourceBundle rb = new MyResourcesBoot(); + Throwable ex = new Throwable("this is an expected exception to be logged"); + Class<?> clazz = Class.forName(underlyingLoggerClassName); + Method method = clazz.getMethod("checkLog", String.class, + System.Logger.Level.class, + ResourceBundle.class, String.class, + Throwable.class, Object[].class); + + Logger logger = getLogger(name); + printLogger(logger); + assertTrue(logger.getClass().getName() + .equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger")); + assertTrue(logger.getName().equals(underlyingLoggerClassName)); + logger.log(Logger.Level.WARNING, plainMsg); + boolean pass = (boolean)method.invoke(null, name, Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesBoot.VALUE, (Throwable)null, + (Object)null); + assertTrue(!pass); + + logger = getLogger(name, rb); + printLogger(logger); + assertTrue(logger.getClass().getName() + .equals("jdk.internal.logger.LocalizedLoggerWrapper")); + assertTrue(logger.getName().equals(underlyingLoggerClassName)); + logger.log(Logger.Level.INFO, MyResourcesBoot.KEY); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesBoot.VALUE, (Throwable)null, + (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + } + } + + private static class MyResourcesBoot extends ListResourceBundle { + static final String KEY = "this is the key in MyResourcesBoot"; + static final String VALUE = "THIS IS THE VALUE IN MyResourcesBoot"; + + @Override + protected Object[][] getContents() { + return new Object[][] { + {KEY, VALUE} + }; + } + } + + private static Logger getLogger(String name) { + return BootUsage.getLogger(name); + } + + private static Logger getLogger(String name, ResourceBundle rb) { + return BootUsage.getLogger(name, rb); + } + + private static void printLogger(Logger logger) { + System.err.println("logger name: " + logger.getName() + + ", logger class: " + logger.getClass()); + } + + private static void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("expected true, but get false."); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/boot_usage/BootUsage.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.System.Logger; +import java.util.ResourceBundle; + +/* + * BootUsage is put to Xbootclasspath, it will be used by + * BootClient to test when logger client is in boot classpath + */ +public final class BootUsage { + + public static Logger getLogger(String name) { + check(); + return System.getLogger(name); + } + + public static Logger getLogger(String name, ResourceBundle rb) { + check(); + return System.getLogger(name, rb); + } + + private static void check() { + final Module m = BootUsage.class.getModule(); + final ClassLoader moduleCL = m.getClassLoader(); + assertTrue(!m.isNamed()); + assertTrue(moduleCL == null); + } + + private static void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("expected true, but get false."); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_client/m.t.a/module-info.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module m.t.a { + exports pkg.a.t; + uses System.LoggerFinder; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_client/m.t.a/pkg/a/t/TestA.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,157 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg.a.t; + +import java.lang.reflect.Method; +import java.lang.System.Logger; +import java.util.ResourceBundle; +import java.util.ListResourceBundle; + +/* + * Tests when logger client is in named module m.l.a + */ +public class TestA { + + public static void main(String[] args) throws Exception { + assertTrue(args.length == 2); + String loggerMode = args[0]; + String loggerClassName = args[1]; + + testLogger(loggerMode, loggerClassName); + testLog(loggerClassName); + } + + /* + * Tests System.getLogger(String) get expected logger. + */ + private static void testLogger(String loggerMode, String loggerClassName) { + final Module m = TestA.class.getModule(); + final ClassLoader moduleCL = m.getClassLoader(); + assertTrue(m.isNamed()); + assertTrue(moduleCL != null); + + String name = "test.a"; + Logger logger = getLogger(name); + printLogger(logger); + + final Module lm = logger.getClass().getModule(); + final ClassLoader loggerCL = lm.getClassLoader(); + if (loggerMode.equals("system")) { + assertTrue(lm.isNamed()); + assertTrue(loggerCL == null); + } else if(loggerMode.equals("named")) { + assertTrue(lm.isNamed()); + assertTrue(loggerCL != null); + } else if(loggerMode.equals("unnamed")) { + assertTrue(!lm.isNamed()); + assertTrue(loggerCL != null); + } else { + throw new RuntimeException("wrong parameter"); + } + + assertTrue(loggerClassName.equals(logger.getClass().getName())); + assertTrue(!loggerClassName.equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger")); + } + + /* + * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and + * System.getLogger(String) works well. + */ + private static void testLog(String loggerClassName) throws Exception { + if (loggerClassName.equals("pkg.a.l.LoggerA") + || loggerClassName.equals("pkg.b.l.LoggerB")) { + + String name = "test.a.A"; + String plainMsg = "this is test log message #1"; + ResourceBundle rb = new MyResourcesA(); + Throwable ex = new Throwable("this is an expected exception to be logged"); + Class<?> clazz = Class.forName(loggerClassName); + Method method = clazz.getMethod("checkLog", String.class, + System.Logger.Level.class, + ResourceBundle.class, String.class, + Throwable.class, Object[].class); + + Logger logger = getLogger(name); + printLogger(logger); + assertTrue(logger.getClass().getName().equals(loggerClassName)); + assertTrue(logger.getName().equals(loggerClassName)); + logger.log(Logger.Level.WARNING, plainMsg); + boolean pass = (boolean)method.invoke(null, name, + Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesA.VALUE, (Throwable)null, + (Object)null); + assertTrue(!pass); + + logger = getLogger(name, rb); + printLogger(logger); + assertTrue(logger.getClass().getName() + .equals("jdk.internal.logger.LocalizedLoggerWrapper")); + assertTrue(logger.getName().equals(loggerClassName)); + logger.log(Logger.Level.INFO, MyResourcesA.KEY); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesA.VALUE, (Throwable)null, + (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + } + } + + private static class MyResourcesA extends ListResourceBundle { + static final String KEY = "this is the key in MyResourcesA"; + static final String VALUE = "THIS IS THE VALUE IN MyResourcesA"; + + @Override + protected Object[][] getContents() { + return new Object[][] { + {KEY, VALUE} + }; + } + } + + private static Logger getLogger(String name) { + return System.getLogger(name); + } + + private static Logger getLogger(String name, ResourceBundle rb) { + return System.getLogger(name, rb); + } + + private static void printLogger(Logger logger) { + System.err.println("logger name: " + logger.getName() + + ", logger class: " + logger.getClass()); + } + + private static void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("expected true, but get false."); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_logger/m.l.a/module-info.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +module m.l.a { + opens pkg.a.l; + provides java.lang.System.LoggerFinder with pkg.a.p.LoggerFinderA; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_logger/m.l.a/pkg/a/l/LoggerA.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg.a.l; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Queue; +import java.util.ResourceBundle; + +public class LoggerA implements System.Logger { + + // ---- test utility fields and methods ---- + + private static Map<String, LoggerA> map = new HashMap<>(); + + public static LoggerA getLogger(String name) { + return map.computeIfAbsent(name, (n) -> new LoggerA()); + } + + public static boolean checkLog(String name, Level level, ResourceBundle bundle, + String format, Throwable throwable, Object... params) { + LoggerA logger = map.get(name); + LogEvent event = new LogEvent(level, bundle, format, null, params); + for (LogEvent l : logger.queue) { + if (l.equals(event)) { + return true; + } + } + return false; + } + + // ---- logger implementation ---- + + private Queue<LogEvent> queue = new LinkedList<>(); + + @Override + public String getName() { + return this.getClass().getName(); + } + + @Override + public boolean isLoggable(Level level) { + return true; + } + + @Override + public void log(Level level, ResourceBundle bundle, String format, Object... params) { + String msg = bundle != null ? bundle.getString(format) : format; + log(new LogEvent(level, bundle, msg, null, params)); + } + + @Override + public void log(Level level, ResourceBundle bundle, String format, Throwable throwable) { + String msg = bundle != null ? bundle.getString(format) : format; + log(new LogEvent(level, bundle, msg, throwable, (Object)null)); + } + + void log(LogEvent l) { + print(l); + queue.add(l); + } + + private void print(LogEvent l) { + System.err.println("LoggerA Message"+ l); + } + + public Queue<LogEvent> getLogEvent() { + return queue; + } + + public static class LogEvent { + public LogEvent(Level level, ResourceBundle bundle, String format, + Throwable throwable, Object... params) { + this.level = level; + this.bundle = bundle; + this.format = format; + this.throwable = throwable; + this.params = params; + } + + @Override + public boolean equals(Object o) { + if (o instanceof LogEvent) { + LogEvent e = (LogEvent)o; + return level == e.level + && bundle == e.bundle + && format == e.format + && params == e.params; + } + return false; + } + + @Override + public String toString() { + return String.format("[level: %s, bundle: %s, format: %s, throwable: %s, object: %s]", + level, bundle, format, throwable, params); + } + + private Level level; + private ResourceBundle bundle; + private String format; + private Throwable throwable; + private Object[] params; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/named_logger/m.l.a/pkg/a/p/LoggerFinderA.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg.a.p; + +import pkg.a.l.LoggerA; + +public class LoggerFinderA extends System.LoggerFinder { + @Override + public System.Logger getLogger(String name, Module module) { + return LoggerA.getLogger(name); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/patched_client/PatchedClient.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +import java.lang.reflect.Method; +import java.lang.System.Logger; +import java.util.ResourceBundle; +import java.util.ListResourceBundle; + +/* + * Tests when logger client is in patched module + */ +public class PatchedClient { + + public static void main(String[] args) throws Exception { + assertTrue(args.length >= 2); + String loggerMode = args[0]; + String loggerClassName = args[1]; + String underlyingLoggerClassName = args.length >= 3 ? args[2] : null; + + testLogger(loggerMode, loggerClassName, underlyingLoggerClassName); + testLog(underlyingLoggerClassName); + } + + /* + * Tests System.getLogger(String) get expected logger. + */ + private static void testLogger(String loggerMode, String loggerClassName, + String underlyingLoggerClassName) { + String name = "test.patched"; + Logger logger = getLogger(name); + printLogger(logger); + + final Module lm = logger.getClass().getModule(); + final ClassLoader loggerCL = lm.getClassLoader(); + if (loggerMode.equals("system")) { + assertTrue(lm.isNamed()); + assertTrue(loggerCL == null); + } else if(loggerMode.equals("unnamed")) { + assertTrue(!lm.isNamed()); + assertTrue(loggerCL != null); + } else { + throw new RuntimeException("wrong parameter"); + } + + assertTrue(loggerClassName.equals(logger.getClass().getName())); + if (underlyingLoggerClassName != null) { + String loggerName = logger.getName(); + if (underlyingLoggerClassName.equals( + "sun.util.logging.internal.LoggingProviderImpl$JULWrapper")) { + assertTrue(loggerName.equals(name)); + } else { + assertTrue(loggerName.equals(underlyingLoggerClassName)); + } + } + } + + /* + * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and + * System.getLogger(String) works well. + */ + private static void testLog(String underlyingLoggerClassName) throws Exception { + if (underlyingLoggerClassName == null) { + return; + } + + if (underlyingLoggerClassName.equals("pkg.a.l.LoggerA") + || underlyingLoggerClassName.equals("pkg.b.l.LoggerB")) { + + String name = "test.patched.logger"; + String plainMsg = "this is test log message #1"; + ResourceBundle rb = new MyResourcesPatched(); + Throwable ex = new Throwable("this is an expected exception to be logged"); + Class<?> clazz = Class.forName(underlyingLoggerClassName); + Method method = clazz.getMethod("checkLog", String.class, + System.Logger.Level.class, + ResourceBundle.class, String.class, + Throwable.class, Object[].class); + + Logger logger = getLogger(name); + printLogger(logger); + assertTrue(logger.getClass().getName() + .equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger")); + assertTrue(logger.getName().equals(underlyingLoggerClassName)); + logger.log(Logger.Level.WARNING, plainMsg); + boolean pass = (boolean)method.invoke(null, name, Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesPatched.VALUE, (Throwable)null, + (Object)null); + assertTrue(!pass); + + logger = getLogger(name, rb); + printLogger(logger); + assertTrue(logger.getClass().getName() + .equals("jdk.internal.logger.LocalizedLoggerWrapper")); + assertTrue(logger.getName().equals(underlyingLoggerClassName)); + logger.log(Logger.Level.INFO, MyResourcesPatched.KEY); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesPatched.VALUE, (Throwable)null, + (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + } + } + + private static class MyResourcesPatched extends ListResourceBundle { + static final String KEY = "this is the key in MyResourcesPatched"; + static final String VALUE = "THIS IS THE VALUE IN MyResourcesPatched"; + + @Override + protected Object[][] getContents() { + return new Object[][] { + {KEY, VALUE} + }; + } + } + + private static Logger getLogger(String name) { + return PatchedUsage.getLogger(name); + } + + private static Logger getLogger(String name, ResourceBundle rb) { + return PatchedUsage.getLogger(name, rb); + } + + private static void printLogger(Logger logger) { + System.err.println("logger name: " + logger.getName() + + ", logger class: " + logger.getClass()); + } + + private static void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("expected true, but get false."); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/patched_usage/java.base/java/lang/PatchedUsage.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.lang; + +import java.lang.System.Logger; +import java.util.ResourceBundle; + +/* + * PatchedUsage is patched into java.base, it will be used by + * PatchedClient to test when logger client is in patched module + */ +public class PatchedUsage { + + public static Logger getLogger(String name) { + check(); + return System.getLogger(name); + } + + public static Logger getLogger(String name, ResourceBundle rb) { + check(); + return System.getLogger(name, rb); + } + + private static void check() { + final Module m = PatchedUsage.class.getModule(); + final ClassLoader moduleCL = m.getClassLoader(); + assertTrue(m.isNamed()); + assertTrue(moduleCL == null); + } + + private static void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("expected true, but get false."); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/unnamed_client/pkg/b/t/TestB.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,156 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg.b.t; + +import java.lang.reflect.Method; +import java.lang.System.Logger; +import java.util.ResourceBundle; +import java.util.ListResourceBundle; + +/* + * Tests when logger client is in unnamed module + */ +public class TestB { + + public static void main(String[] args) throws Exception { + assertTrue(args.length == 2); + String loggerMode = args[0]; + String loggerClassName = args[1]; + + testLogger(loggerMode, loggerClassName); + testLog(loggerClassName); + } + + /* + * Tests System.getLogger(String) get expected logger. + */ + private static void testLogger(String loggerMode, String loggerClassName) { + final Module m = TestB.class.getModule(); + final ClassLoader moduleCL = m.getClassLoader(); + assertTrue(!m.isNamed()); + assertTrue(moduleCL != null); + + String name = "test.b"; + Logger logger = getLogger(name); + printLogger(logger); + + final Module lm = logger.getClass().getModule(); + final ClassLoader loggerCL = lm.getClassLoader(); + if (loggerMode.equals("system")) { + assertTrue(lm.isNamed()); + assertTrue(loggerCL == null); + } else if(loggerMode.equals("named")) { + assertTrue(lm.isNamed()); + assertTrue(loggerCL != null); + } else if(loggerMode.equals("unnamed")) { + assertTrue(!lm.isNamed()); + assertTrue(loggerCL != null); + } else { + throw new RuntimeException("wrong parameter"); + } + + assertTrue(loggerClassName.equals(logger.getClass().getName())); + assertTrue(!loggerClassName.equals("jdk.internal.logger.LazyLoggers$JdkLazyLogger")); + } + + /* + * Tests Logger retrieved by System.getLogger(String, ResourceBundle) and + * System.getLogger(String) works well. + */ + private static void testLog(String loggerClassName) throws Exception { + if (loggerClassName.equals("pkg.a.l.LoggerA") + || loggerClassName.equals("pkg.b.l.LoggerB")) { + + String name = "test.b.B"; + String plainMsg = "this is test log message #1"; + ResourceBundle rb = new MyResourcesB(); + Throwable ex = new Throwable("this is an expected exception to be logged"); + Class<?> clazz = Class.forName(loggerClassName); + Method method = clazz.getMethod("checkLog", String.class, + System.Logger.Level.class, + ResourceBundle.class, String.class, + Throwable.class, Object[].class); + + Logger logger = getLogger(name); + printLogger(logger); + assertTrue(logger.getClass().getName().equals(loggerClassName)); + assertTrue(logger.getName().equals(loggerClassName)); + logger.log(Logger.Level.WARNING, plainMsg); + boolean pass = (boolean)method.invoke(null, name, Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesB.VALUE, (Throwable)null, + (Object)null); + assertTrue(!pass); + + logger = getLogger(name, rb); + printLogger(logger); + assertTrue(logger.getClass().getName() + .equals("jdk.internal.logger.LocalizedLoggerWrapper")); + assertTrue(logger.getName().equals(loggerClassName)); + logger.log(Logger.Level.INFO, MyResourcesB.KEY); + pass = (boolean)method.invoke(null, name, Logger.Level.INFO, + rb, MyResourcesB.VALUE, (Throwable)null, + (Object)null); + assertTrue(pass); + pass = (boolean)method.invoke(null, name, Logger.Level.WARNING, + null, plainMsg, ex, (Object)null); + assertTrue(pass); + } + } + + private static class MyResourcesB extends ListResourceBundle { + static final String KEY = "this is the key in MyResourcesB"; + static final String VALUE = "THIS IS THE VALUE IN MyResourcesB"; + + @Override + protected Object[][] getContents() { + return new Object[][] { + {KEY, VALUE} + }; + } + } + + private static Logger getLogger(String name) { + return System.getLogger(name); + } + + private static Logger getLogger(String name, ResourceBundle rb) { + return System.getLogger(name, rb); + } + + private static void printLogger(Logger logger) { + System.err.println("logger name: " + logger.getName() + + ", logger class: " + logger.getClass()); + } + + private static void assertTrue(boolean b) { + if (!b) { + throw new RuntimeException("expected true, but get false."); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/unnamed_logger/META-INF/services/java.lang.System$LoggerFinder Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,1 @@ +pkg.b.p.LoggerFinderB
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/unnamed_logger/pkg/b/l/LoggerB.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg.b.l; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.Map; +import java.util.Queue; +import java.util.ResourceBundle; + +public class LoggerB implements System.Logger { + + // ---- test utility fields and methods ---- + + private static Map<String, LoggerB> map = new HashMap<>(); + + public static LoggerB getLogger(String name) { + return map.computeIfAbsent(name, (n) -> new LoggerB()); + } + + public static boolean checkLog(String name, Level level, ResourceBundle bundle, + String format, Throwable throwable, Object... params) { + LoggerB logger = map.get(name); + LogEvent event = new LogEvent(level, bundle, format, null, params); + for (LogEvent l : logger.queue) { + if (l.equals(event)) { + return true; + } + } + return false; + } + + // ---- logger implementation ---- + + private Queue<LogEvent> queue = new LinkedList<>(); + + @Override + public String getName() { + return this.getClass().getName(); + } + + @Override + public boolean isLoggable(Level level) { + return true; + } + + @Override + public void log(Level level, ResourceBundle bundle, String format, Object... params) { + String msg = bundle != null ? bundle.getString(format) : format; + log(new LogEvent(level, bundle, msg, null, params)); + } + + @Override + public void log(Level level, ResourceBundle bundle, String format, Throwable throwable) { + String msg = bundle != null ? bundle.getString(format) : format; + log(new LogEvent(level, bundle, msg, throwable, (Object)null)); + } + + void log(LogEvent l) { + print(l); + queue.add(l); + } + + private void print(LogEvent l) { + System.err.println("LoggerB Message"+ l); + } + + public Queue<LogEvent> getLogEvent() { + return queue; + } + + public static class LogEvent { + public LogEvent(Level level, ResourceBundle bundle, String format, + Throwable throwable, Object... params) { + this.level = level; + this.bundle = bundle; + this.format = format; + this.throwable = throwable; + this.params = params; + } + + @Override + public boolean equals(Object o) { + if (o instanceof LogEvent) { + LogEvent e = (LogEvent)o; + return level == e.level + && bundle == e.bundle + && format == e.format + && params == e.params; + } + return false; + } + + private Level level; + private ResourceBundle bundle; + private String format; + private Throwable throwable; + private Object[] params; + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/System/LoggerFinder/modules/unnamed_logger/pkg/b/p/LoggerFinderB.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package pkg.b.p; + +import pkg.b.l.LoggerB; + +public class LoggerFinderB extends System.LoggerFinder { + @Override + public System.Logger getLogger(String name, Module module) { + return LoggerB.getLogger(name); + } +}
--- a/jdk/test/java/net/Inet6Address/B6206527.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/net/Inet6Address/B6206527.java Wed Jul 05 23:16:05 2017 +0200 @@ -25,10 +25,14 @@ * @test 1.1 05/01/05 * @bug 6206527 * @summary "cannot assign address" when binding ServerSocket on Suse 9 + * @library /lib/testlibrary + * @build jdk.testlibrary.NetworkConfiguration + * @run main B6206527 */ import java.net.*; import java.util.*; +import jdk.testlibrary.NetworkConfiguration; public class B6206527 { @@ -53,21 +57,12 @@ ss.bind(new InetSocketAddress(addr, 0)); } - public static Inet6Address getLocalAddr () throws Exception { - Enumeration e = NetworkInterface.getNetworkInterfaces(); - while (e.hasMoreElements()) { - NetworkInterface ifc = (NetworkInterface) e.nextElement(); - Enumeration addrs = ifc.getInetAddresses(); - while (addrs.hasMoreElements()) { - InetAddress a = (InetAddress)addrs.nextElement(); - if (a instanceof Inet6Address) { - Inet6Address ia6 = (Inet6Address) a; - if (ia6.isLinkLocalAddress()) { - return ia6; - } - } - } - } - return null; + public static Inet6Address getLocalAddr() throws Exception { + Optional<Inet6Address> oaddr = NetworkConfiguration.probe() + .ip6Addresses() + .filter(a -> a.isLinkLocalAddress()) + .findFirst(); + + return oaddr.orElseGet(() -> null); } }
--- a/jdk/test/java/net/Inet6Address/B6558853.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/net/Inet6Address/B6558853.java Wed Jul 05 23:16:05 2017 +0200 @@ -21,43 +21,42 @@ * questions. */ -/** +/* * @test * @bug 6558853 * @summary getHostAddress() on connections using IPv6 link-local addrs should have zone id + * @library /lib/testlibrary + * @build jdk.testlibrary.NetworkConfiguration + * @run main B6558853 */ + import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.*; -import java.util.Enumeration; +import java.util.Optional; +import jdk.testlibrary.NetworkConfiguration; public class B6558853 implements Runnable { private InetAddress addr = null; private int port = 0; public static void main(String[] args) throws Exception { - ServerSocket ss = new ServerSocket(0); - int port = ss.getLocalPort(); - Enumeration<NetworkInterface> l = NetworkInterface.getNetworkInterfaces(); - InetAddress dest = null; - while (l.hasMoreElements() && dest == null) { - NetworkInterface nif = l.nextElement(); - if (!nif.isUp()) - continue; + Optional<Inet6Address> oaddr = NetworkConfiguration.probe() + .ip6Addresses() + .filter(a -> a.isLinkLocalAddress()) + .findFirst(); - for (InterfaceAddress a : nif.getInterfaceAddresses()) { - if (a.getAddress() instanceof Inet6Address) { - Inet6Address a6 = (Inet6Address) a.getAddress(); - if (a6.isLinkLocalAddress()) { - dest = a6; - } - break; - } - } + if (!oaddr.isPresent()) { + System.out.println("No suitable interface found. Exiting."); + return; } + + Inet6Address dest = oaddr.get(); System.out.println("Using " + dest); - if (dest != null) { + + try (ServerSocket ss = new ServerSocket(0)) { + int port = ss.getLocalPort(); B6558853 test = new B6558853(dest, port); Thread thread = new Thread(test); thread.start();
--- a/jdk/test/java/net/InetAddress/CheckJNI.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/net/InetAddress/CheckJNI.java Wed Jul 05 23:16:05 2017 +0200 @@ -24,11 +24,15 @@ /* @test @bug 4889870 4890033 @summary java -Xcheck:jni failing in net code on Solaris / [Datagram]Socket.getLocalAddress() failure + @library /lib/testlibrary + @build jdk.testlibrary.NetworkConfiguration @run main/othervm -Xcheck:jni CheckJNI */ import java.net.*; import java.util.*; +import java.util.stream.Collectors; +import jdk.testlibrary.NetworkConfiguration; public class CheckJNI { static Socket s; @@ -49,32 +53,23 @@ dg2 = new DatagramSocket (0, InetAddress.getByName ("127.0.0.1")); testDatagrams (dg1, dg2); - /* Use NetworkInterface to find link local IPv6 addrs to test */ - - Enumeration ifs = NetworkInterface.getNetworkInterfaces(); - server = new ServerSocket (0); + /* Find link local IPv6 addrs to test */ + List<Inet6Address> addrs = NetworkConfiguration.probe() + .ip6Addresses() + .filter(Inet6Address::isLinkLocalAddress) + .collect(Collectors.toList()); - while (ifs.hasMoreElements()) { - NetworkInterface nif = (NetworkInterface)ifs.nextElement(); - if (!nif.isUp()) - continue; - Enumeration addrs = nif.getInetAddresses(); - while (addrs.hasMoreElements()) { - InetAddress addr = (InetAddress) addrs.nextElement(); - if (addr instanceof Inet6Address) { - Inet6Address ia6 = (Inet6Address) addr; - if (ia6.isLinkLocalAddress()) { - System.out.println ("Testing IPv6 Socket"); - s = new Socket (ia6, server.getLocalPort()); - s.close(); + server = new ServerSocket(0); + for (Inet6Address ia6 : addrs) { + System.out.println("Address:" + ia6); + System.out.println("Testing IPv6 Socket"); + s = new Socket(ia6, server.getLocalPort()); + s.close(); - System.out.println ("Testing IPv6 DatagramSocket"); - dg1 = new DatagramSocket (0, ia6); - dg2 = new DatagramSocket (0, ia6); - testDatagrams (dg1, dg2); - } - } - } + System.out.println("Testing IPv6 DatagramSocket"); + dg1 = new DatagramSocket(0, ia6); + dg2 = new DatagramSocket(0, ia6); + testDatagrams(dg1, dg2); } server.close(); System.out.println ("OK");
--- a/jdk/test/java/net/MulticastSocket/B6427403.java Sat Apr 22 00:22:27 2017 +0000 +++ b/jdk/test/java/net/MulticastSocket/B6427403.java Wed Jul 05 23:16:05 2017 +0200 @@ -23,15 +23,12 @@ /* * @test - * * @bug 6427403 - * * @summary java.net.MulticastSocket.joinGroup() reports 'socket closed' - * */ import java.net.*; import java.io.*; -import java.util.*; + public class B6427403 { public static void main( String[] args ) throws IOException { InetAddress lh = InetAddress.getLocalHost(); @@ -39,4 +36,4 @@ ms.joinGroup( InetAddress.getByName("224.80.80.80") ); ms.close(); } -} +} \ No newline at end of file
--- a/jdk/test/java/net/MulticastSocket/JoinGroup.java Sat Apr 22 00:22:27 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute 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 4091811 4148753 - * @summary Test java.net.MulticastSocket joinGroup and leaveGroup - * - */ - -import java.io.*; -import java.net.*; - - -public class JoinGroup { - - public static void main(String args[]) throws Exception { - MulticastSocket soc = null; - InetAddress sin = null; - - soc = new MulticastSocket(); - sin = InetAddress.getByName("224.80.80.80"); - soc.joinGroup(sin); - soc.leaveGroup(sin); - } -}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/net/MulticastSocket/JoinLeave.java Wed Jul 05 23:16:05 2017 +0200 @@ -0,0 +1,62 @@ +/* + * Copyright (c) 1998, 1999, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute 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 4091811 4148753 4102731 + * @summary Test java.net.MulticastSocket joinGroup and leaveGroup + * @library /lib/testlibrary + * @build jdk.testlibrary.NetworkConfiguration + * @run main JoinLeave + */ + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.net.InetAddress; +import java.net.MulticastSocket; +import java.net.NetworkInterface; +import jdk.testlibrary.NetworkConfiguration; + +public class JoinLeave { + + public static void main(String args[]) throws IOException { + InetAddress ip4Group = InetAddress.getByName("224.80.80.80"); + InetAddress ip6Group = InetAddress.getByName("ff02::a"); + + NetworkConfiguration nc = NetworkConfiguration.probe(); + nc.ip4MulticastInterfaces().forEach(nic -> joinLeave(ip4Group, nic)); + nc.ip6MulticastInterfaces().forEach(nic -> joinLeave(ip6Group, nic)); + } + + static void joinLeave(InetAddress group, NetworkInterface nif) + { + System.out.println("Joining:" + group + " on " + nif); + try (MulticastSocket soc = new MulticastSocket()) { + soc.setNetworkInterface(nif); + soc.joinGroup(group); + soc.leaveGroup(group); + } catch (IOException e) { + throw new UncheckedIOException(e); + }