# HG changeset patch # User lana # Date 1461861499 25200 # Node ID b1a0f119f7666cb0b5b475e3fcac6b59d4bfd8f0 # Parent ec60c3290242f51cea8167aa4c8546c758cbcdcc# Parent fb70353ba60b596b040595c17fe1a6438cf2e308 Merge diff -r ec60c3290242 -r b1a0f119f766 jdk/make/launcher/Launcher-jdk.jstatd.gmk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/make/launcher/Launcher-jdk.jstatd.gmk Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,30 @@ +# +# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +include LauncherCommon.gmk + +$(eval $(call SetupBuildLauncher, jstatd, \ + MAIN_CLASS := sun.tools.jstatd.Jstatd, \ +)) diff -r ec60c3290242 -r b1a0f119f766 jdk/make/launcher/Launcher-jdk.jvmstat.rmi.gmk --- a/jdk/make/launcher/Launcher-jdk.jvmstat.rmi.gmk Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,30 +0,0 @@ -# -# Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. -# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. -# -# This code is free software; you can redistribute it and/or modify it -# under the terms of the GNU General Public License version 2 only, as -# published by the Free Software Foundation. Oracle designates this -# particular file as subject to the "Classpath" exception as provided -# by Oracle in the LICENSE file that accompanied this code. -# -# This code is distributed in the hope that it will be useful, but WITHOUT -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License -# version 2 for more details (a copy is included in the LICENSE file that -# accompanied this code). -# -# You should have received a copy of the GNU General Public License version -# 2 along with this work; if not, write to the Free Software Foundation, -# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. -# -# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA -# or visit www.oracle.com if you need additional information or have any -# questions. -# - -include LauncherCommon.gmk - -$(eval $(call SetupBuildLauncher, jstatd, \ - MAIN_CLASS := sun.tools.jstatd.Jstatd, \ -)) diff -r ec60c3290242 -r b1a0f119f766 jdk/make/lib/Lib-jdk.net.gmk --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/make/lib/Lib-jdk.net.gmk Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,51 @@ +# +# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. Oracle designates this +# particular file as subject to the "Classpath" exception as provided +# by Oracle in the LICENSE file that accompanied this code. +# +# This code is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +# version 2 for more details (a copy is included in the LICENSE file that +# accompanied this code). +# +# You should have received a copy of the GNU General Public License version +# 2 along with this work; if not, write to the Free Software Foundation, +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA +# or visit www.oracle.com if you need additional information or have any +# questions. +# + +include LibCommon.gmk + +################################################################################ + +ifeq ($(OPENJDK_TARGET_OS), solaris) + + $(eval $(call SetupNativeCompilation, BUILD_LIBEXTNET, \ + LIBRARY := extnet, \ + OUTPUT_DIR := $(INSTALL_LIBRARIES_HERE), \ + SRC := $(JDK_TOPDIR)/src/jdk.net/solaris/native/libextnet, \ + OPTIMIZATION := LOW, \ + CFLAGS := $(CFLAGS_JDKLIB) -I$(SUPPORT_OUTPUTDIR)/headers/jdk.net, \ + MAPFILE := $(JDK_TOPDIR)/make/mapfiles/libextnet/mapfile-vers, \ + LDFLAGS := $(LDFLAGS_JDKLIB) \ + $(call SET_SHARED_LIBRARY_ORIGIN), \ + LIBS := -lsocket -lc -ljava, \ + OBJECT_DIR := $(SUPPORT_OUTPUTDIR)/native/$(MODULE)/libextnet, \ + )) + + $(BUILD_LIBEXTNET): $(call FindLib, java.base, java) + + TARGETS += $(BUILD_LIBEXTNET) +endif + + +################################################################################ diff -r ec60c3290242 -r b1a0f119f766 jdk/make/mapfiles/libextnet/mapfile-vers --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/make/mapfiles/libextnet/mapfile-vers Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,34 @@ +# +# Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. +# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. +# +# This code is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License version 2 only, as +# published by the Free Software Foundation. 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. +# + +SUNWprivate_1.1 { + global: + Java_jdk_net_SolarisSocketOptions_init; + Java_jdk_net_SolarisSocketOptions_setFlowOption; + Java_jdk_net_SolarisSocketOptions_getFlowOption; + Java_jdk_net_SolarisSocketOptions_flowSupported; + local: + *; +}; diff -r ec60c3290242 -r b1a0f119f766 jdk/make/mapfiles/libnet/mapfile-vers --- a/jdk/make/mapfiles/libnet/mapfile-vers Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/make/mapfiles/libnet/mapfile-vers Thu Apr 28 09:38:19 2016 -0700 @@ -98,10 +98,6 @@ Java_sun_net_sdp_SdpSupport_create0; Java_sun_net_spi_DefaultProxySelector_init; Java_sun_net_spi_DefaultProxySelector_getSystemProxy; - Java_sun_net_ExtendedOptionsImpl_init; - Java_sun_net_ExtendedOptionsImpl_setFlowOption; - Java_sun_net_ExtendedOptionsImpl_getFlowOption; - Java_sun_net_ExtendedOptionsImpl_flowSupported; NET_AllocSockaddr; NET_SockaddrToInetAddress; NET_SockaddrEqualsInetAddress; diff -r ec60c3290242 -r b1a0f119f766 jdk/make/netbeans/client_sanity/nbproject/genfiles.properties --- a/jdk/make/netbeans/client_sanity/nbproject/genfiles.properties Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/make/netbeans/client_sanity/nbproject/genfiles.properties Thu Apr 28 09:38:19 2016 -0700 @@ -3,6 +3,6 @@ build.xml.stylesheet.CRC32=8064a381@1.75.2.48 # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. -nbproject/build-impl.xml.data.CRC32=55414227 +nbproject/build-impl.xml.data.CRC32=16caf60f nbproject/build-impl.xml.script.CRC32=c12f9d04 nbproject/build-impl.xml.stylesheet.CRC32=05530350@1.79.1.48 diff -r ec60c3290242 -r b1a0f119f766 jdk/make/netbeans/client_sanity/nbproject/project.properties --- a/jdk/make/netbeans/client_sanity/nbproject/project.properties Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/make/netbeans/client_sanity/nbproject/project.properties Thu Apr 28 09:38:19 2016 -0700 @@ -76,4 +76,4 @@ src.src.dir=..\\..\\..\\test\\sanity\\client\\SwingSet\\src src.src2.dir=..\\..\\..\\test\\sanity\\client\\lib\\SwingSet3\\src src.src3.dir=..\\..\\..\\test\\sanity\\client\\lib\\jemmy\\src -src.src4.dir=..\\..\\..\\test\\sanity\\client\\lib\\Jemmy2Ext\\src +src.src4.dir=..\\..\\..\\test\\sanity\\client\\lib\\Extensions\\src diff -r ec60c3290242 -r b1a0f119f766 jdk/make/netbeans/client_sanity/nbproject/project.xml --- a/jdk/make/netbeans/client_sanity/nbproject/project.xml Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/make/netbeans/client_sanity/nbproject/project.xml Thu Apr 28 09:38:19 2016 -0700 @@ -6,7 +6,7 @@ SanityTests - + diff -r ec60c3290242 -r b1a0f119f766 jdk/make/src/classes/build/tools/module/GenModuleInfoSource.java --- a/jdk/make/src/classes/build/tools/module/GenModuleInfoSource.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/make/src/classes/build/tools/module/GenModuleInfoSource.java Thu Apr 28 09:38:19 2016 -0700 @@ -52,7 +52,7 @@ "Usage: GenModuleInfoSource [option] -o \n" + "Options are:\n" + " -exports \n" + - " -exports /\n" + + " -exports [/]\n" + " -uses \n" + " -provides /\n"; diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/java/lang/System.java --- a/jdk/src/java.base/share/classes/java/lang/System.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/java/lang/System.java Thu Apr 28 09:38:19 2016 -0700 @@ -1155,8 +1155,9 @@ * @param level the log message level. * @param msg the string message (or a key in the message catalog, if * this logger is a {@link - * LoggerFinder#getLocalizedLogger(java.lang.String, java.util.ResourceBundle, java.lang.Class) - * localized logger}); can be {@code null}. + * LoggerFinder#getLocalizedLogger(java.lang.String, + * java.util.ResourceBundle, java.lang.reflect.Module) localized logger}); + * can be {@code null}. * * @throws NullPointerException if {@code level} is {@code null}. */ @@ -1222,8 +1223,9 @@ * @param level the log message level. * @param msg the string message (or a key in the message catalog, if * this logger is a {@link - * LoggerFinder#getLocalizedLogger(java.lang.String, java.util.ResourceBundle, java.lang.Class) - * localized logger}); can be {@code null}. + * LoggerFinder#getLocalizedLogger(java.lang.String, + * java.util.ResourceBundle, java.lang.reflect.Module) localized logger}); + * can be {@code null}. * @param thrown a {@code Throwable} associated with the log message; * can be {@code null}. * @@ -1270,8 +1272,9 @@ * @param format the string message format in {@link * java.text.MessageFormat} format, (or a key in the message * catalog, if this logger is a {@link - * LoggerFinder#getLocalizedLogger(java.lang.String, java.util.ResourceBundle, java.lang.Class) - * localized logger}); can be {@code null}. + * LoggerFinder#getLocalizedLogger(java.lang.String, + * java.util.ResourceBundle, java.lang.reflect.Module) localized logger}); + * can be {@code null}. * @param params an optional list of parameters to the message (may be * none). * @@ -1453,30 +1456,30 @@ /** * Returns an instance of {@link Logger Logger} - * for the given {@code caller}. + * for the given {@code module}. * * @param name the name of the logger. - * @param caller the class for which the logger is being requested. + * @param module the module for which the logger is being requested. * - * @return a {@link Logger logger} suitable for the given caller's - * use. + * @return a {@link Logger logger} suitable for use within the given + * module. * @throws NullPointerException if {@code name} is {@code null} or - * {@code caller} is {@code null}. + * {@code module} is {@code null}. * @throws SecurityException if a security manager is present and its * {@code checkPermission} method doesn't allow the * {@code RuntimePermission("loggerFinder")}. */ - public abstract Logger getLogger(String name, /* Module */ Class caller); + public abstract Logger getLogger(String name, Module module); /** * Returns a localizable instance of {@link Logger Logger} - * for the given {@code caller}. + * for the given {@code module}. * The returned logger will use the provided resource bundle for * message localization. * * @implSpec By default, this method calls {@link - * #getLogger(java.lang.String, java.lang.Class) - * this.getLogger(name, caller)} to obtain a logger, then wraps that + * #getLogger(java.lang.String, java.lang.reflect.Module) + * this.getLogger(name, module)} to obtain a logger, then wraps that * logger in a {@link Logger} instance where all methods that do not * take a {@link ResourceBundle} as parameter are redirected to one * which does - passing the given {@code bundle} for @@ -1499,19 +1502,19 @@ * * @param name the name of the logger. * @param bundle a resource bundle; can be {@code null}. - * @param caller the class for which the logger is being requested. + * @param module the module for which the logger is being requested. * @return an instance of {@link Logger Logger} which will use the * provided resource bundle for message localization. * * @throws NullPointerException if {@code name} is {@code null} or - * {@code caller} is {@code null}. + * {@code module} is {@code null}. * @throws SecurityException if a security manager is present and its * {@code checkPermission} method doesn't allow the * {@code RuntimePermission("loggerFinder")}. */ public Logger getLocalizedLogger(String name, ResourceBundle bundle, - /* Module */ Class caller) { - return new LocalizedLoggerWrapper<>(getLogger(name, caller), bundle); + Module module) { + return new LocalizedLoggerWrapper<>(getLogger(name, module), bundle); } /** @@ -1558,12 +1561,13 @@ * * @implSpec * Instances returned by this method route messages to loggers - * obtained by calling {@link LoggerFinder#getLogger(java.lang.String, java.lang.Class) - * LoggerFinder.getLogger(name, caller)}. + * obtained by calling {@link LoggerFinder#getLogger(java.lang.String, + * java.lang.reflect.Module) LoggerFinder.getLogger(name, module)}, where + * {@code module} is the caller's module. * * @apiNote * This method may defer calling the {@link - * LoggerFinder#getLogger(java.lang.String, java.lang.Class) + * LoggerFinder#getLogger(java.lang.String, java.lang.reflect.Module) * LoggerFinder.getLogger} method to create an actual logger supplied by * the logging backend, for instance, to allow loggers to be obtained during * the system initialization time. @@ -1579,7 +1583,7 @@ public static Logger getLogger(String name) { Objects.requireNonNull(name); final Class caller = Reflection.getCallerClass(); - return LazyLoggers.getLogger(name, caller); + return LazyLoggers.getLogger(name, caller.getModule()); } /** @@ -1591,8 +1595,9 @@ * @implSpec * The returned logger will perform message localization as specified * by {@link LoggerFinder#getLocalizedLogger(java.lang.String, - * java.util.ResourceBundle, java.lang.Class) - * LoggerFinder.getLocalizedLogger(name, bundle, caller}. + * java.util.ResourceBundle, java.lang.reflect.Module) + * LoggerFinder.getLocalizedLogger(name, bundle, module}, where + * {@code module} is the caller's module. * * @apiNote * This method is intended to be used after the system is fully initialized. @@ -1624,12 +1629,14 @@ // Bootstrap sensitive classes in the JDK do not use resource bundles // when logging. This could be revisited later, if it needs to. if (sm != null) { - return AccessController.doPrivileged((PrivilegedAction) - () -> LoggerFinder.accessProvider().getLocalizedLogger(name, rb, caller), - null, - LoggerFinder.LOGGERFINDER_PERMISSION); + final PrivilegedAction pa = + () -> LoggerFinder.accessProvider() + .getLocalizedLogger(name, rb, caller.getModule()); + return AccessController.doPrivileged(pa, null, + LoggerFinder.LOGGERFINDER_PERMISSION); } - return LoggerFinder.accessProvider().getLocalizedLogger(name, rb, caller); + return LoggerFinder.accessProvider() + .getLocalizedLogger(name, rb, caller.getModule()); } /** diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandleImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -25,6 +25,7 @@ package java.lang.invoke; +import java.lang.reflect.Array; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.Arrays; @@ -1892,7 +1893,8 @@ MH_tryFinallyExec = 12, MH_tryFinallyVoidExec = 13, MH_decrementCounter = 14, - MH_LIMIT = 15; + MH_Array_newInstance = 15, + MH_LIMIT = 16; static MethodHandle getConstantHandle(int idx) { MethodHandle handle = HANDLES[idx]; @@ -1965,6 +1967,9 @@ case MH_decrementCounter: return IMPL_LOOKUP.findStatic(MethodHandleImpl.class, "decrementCounter", MethodType.methodType(int.class, int.class)); + case MH_Array_newInstance: + return IMPL_LOOKUP.findStatic(Array.class, "newInstance", + MethodType.methodType(Object.class, Class.class, int.class)); } } catch (ReflectiveOperationException ex) { throw newInternalError(ex); diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java Thu Apr 28 09:38:19 2016 -0700 @@ -25,34 +25,38 @@ package java.lang.invoke; -import java.lang.reflect.*; +import jdk.internal.org.objectweb.asm.ClassWriter; +import jdk.internal.org.objectweb.asm.Opcodes; +import jdk.internal.reflect.CallerSensitive; +import jdk.internal.reflect.Reflection; +import sun.invoke.util.ValueConversions; +import sun.invoke.util.VerifyAccess; +import sun.invoke.util.Wrapper; +import sun.reflect.misc.ReflectUtil; +import sun.security.util.SecurityConstants; + +import java.lang.invoke.LambdaForm.BasicType; +import java.lang.reflect.Constructor; +import java.lang.reflect.Field; +import java.lang.reflect.Member; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ReflectPermission; +import java.nio.ByteOrder; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.ArrayList; +import java.util.Arrays; import java.util.BitSet; import java.util.Iterator; import java.util.List; -import java.util.Arrays; import java.util.Objects; -import java.security.AccessController; -import java.security.PrivilegedAction; - -import sun.invoke.util.ValueConversions; -import sun.invoke.util.VerifyAccess; -import sun.invoke.util.Wrapper; -import jdk.internal.reflect.CallerSensitive; -import jdk.internal.reflect.Reflection; -import sun.reflect.misc.ReflectUtil; -import sun.security.util.SecurityConstants; -import java.lang.invoke.LambdaForm.BasicType; - -import static java.lang.invoke.MethodHandleImpl.Intrinsic; -import static java.lang.invoke.MethodHandleNatives.Constants.*; import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import java.util.stream.Stream; -import jdk.internal.org.objectweb.asm.ClassWriter; -import jdk.internal.org.objectweb.asm.Opcodes; - +import static java.lang.invoke.MethodHandleImpl.Intrinsic; +import static java.lang.invoke.MethodHandleNatives.Constants.*; import static java.lang.invoke.MethodHandleStatics.newIllegalArgumentException; import static java.lang.invoke.MethodType.methodType; @@ -741,10 +745,13 @@ if (name.startsWith("java.lang.invoke.")) throw newIllegalArgumentException("illegal lookupClass: "+lookupClass); - // For caller-sensitive MethodHandles.lookup() - // disallow lookup more restricted packages + // For caller-sensitive MethodHandles.lookup() disallow lookup from + // restricted packages. This a fragile and blunt approach. + // TODO replace with a more formal and less fragile mechanism + // that does not bluntly restrict classes under packages within + // java.base from looking up MethodHandles or VarHandles. if (allowedModes == ALL_MODES && lookupClass.getClassLoader() == null) { - if (name.startsWith("java.") || + if ((name.startsWith("java.") && !name.startsWith("java.util.concurrent.")) || (name.startsWith("sun.") && !name.startsWith("sun.invoke."))) { throw newIllegalArgumentException("illegal lookupClass: " + lookupClass); } @@ -1003,6 +1010,9 @@ * @throws NullPointerException if any argument is null */ public MethodHandle findConstructor(Class refc, MethodType type) throws NoSuchMethodException, IllegalAccessException { + if (refc.isArray()) { + throw new NoSuchMethodException("no constructor for array class: " + refc.getName()); + } String name = ""; MemberName ctor = resolveOrFail(REF_newInvokeSpecial, refc, name, type); return getDirectConstructor(refc, ctor); @@ -2214,6 +2224,27 @@ } /** + * Produces a method handle constructing arrays of a desired type. + * The return type of the method handle will be the array type. + * The type of its sole argument will be {@code int}, which specifies the size of the array. + * @param arrayClass an array type + * @return a method handle which can create arrays of the given type + * @throws NullPointerException if the argument is {@code null} + * @throws IllegalArgumentException if {@code arrayClass} is not an array type + * @see java.lang.reflect.Array#newInstance(Class, int) + * @since 9 + */ + public static + MethodHandle arrayConstructor(Class arrayClass) throws IllegalArgumentException { + if (!arrayClass.isArray()) { + throw newIllegalArgumentException("not an array class: " + arrayClass.getName()); + } + MethodHandle ani = MethodHandleImpl.getConstantHandle(MethodHandleImpl.MH_Array_newInstance). + bindTo(arrayClass.getComponentType()); + return ani.asType(ani.type().changeReturnType(arrayClass)); + } + + /** * Produces a method handle giving read access to elements of an array. * The type of the method handle will have a return type of the array's * element type. Its first argument will be the array type, @@ -2337,13 +2368,12 @@ * * @param viewArrayClass the view array class, with a component type of * type {@code T} - * @param bigEndian true if the endianness of the view array elements, as - * stored in the underlying {@code byte} array, is big endian, otherwise - * little endian + * @param byteOrder the endianness of the view array elements, as + * stored in the underlying {@code byte} array * @return a VarHandle giving access to elements of a {@code byte[]} array * viewed as if elements corresponding to the components type of the view * array class - * @throws NullPointerException if viewArrayClass is null + * @throws NullPointerException if viewArrayClass or byteOrder is null * @throws IllegalArgumentException if viewArrayClass is not an array type * @throws UnsupportedOperationException if the component type of * viewArrayClass is not supported as a variable type @@ -2351,8 +2381,10 @@ */ public static VarHandle byteArrayViewVarHandle(Class viewArrayClass, - boolean bigEndian) throws IllegalArgumentException { - return VarHandles.byteArrayViewHandle(viewArrayClass, bigEndian); + ByteOrder byteOrder) throws IllegalArgumentException { + Objects.requireNonNull(byteOrder); + return VarHandles.byteArrayViewHandle(viewArrayClass, + byteOrder == ByteOrder.BIG_ENDIAN); } /** @@ -2422,14 +2454,13 @@ * * @param viewArrayClass the view array class, with a component type of * type {@code T} - * @param bigEndian true if the endianness of the view array elements, as - * stored in the underlying {@code ByteBuffer}, is big endian, otherwise - * little endian (Note this overrides the endianness of a - * {@code ByteBuffer}) + * @param byteOrder the endianness of the view array elements, as + * stored in the underlying {@code ByteBuffer} (Note this overrides the + * endianness of a {@code ByteBuffer}) * @return a VarHandle giving access to elements of a {@code ByteBuffer} * viewed as if elements corresponding to the components type of the view * array class - * @throws NullPointerException if viewArrayClass is null + * @throws NullPointerException if viewArrayClass or byteOrder is null * @throws IllegalArgumentException if viewArrayClass is not an array type * @throws UnsupportedOperationException if the component type of * viewArrayClass is not supported as a variable type @@ -2437,8 +2468,10 @@ */ public static VarHandle byteBufferViewVarHandle(Class viewArrayClass, - boolean bigEndian) throws IllegalArgumentException { - return VarHandles.makeByteBufferViewHandle(viewArrayClass, bigEndian); + ByteOrder byteOrder) throws IllegalArgumentException { + Objects.requireNonNull(byteOrder); + return VarHandles.makeByteBufferViewHandle(viewArrayClass, + byteOrder == ByteOrder.BIG_ENDIAN); } diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java --- a/jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/jdk/internal/logger/DefaultLoggerFinder.java Thu Apr 28 09:38:19 2016 -0700 @@ -33,6 +33,9 @@ import java.lang.System.LoggerFinder; import java.lang.System.Logger; import java.lang.ref.ReferenceQueue; +import java.lang.reflect.Module; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.Collection; import java.util.ResourceBundle; @@ -129,41 +132,49 @@ return w; } - final static SharedLoggers system = new SharedLoggers(); final static SharedLoggers application = new SharedLoggers(); } + public static boolean isSystem(Module m) { + ClassLoader cl = AccessController.doPrivileged(new PrivilegedAction<>() { + @Override + public ClassLoader run() { + return m.getClassLoader(); + } + }); + return cl == null; + } + @Override - public final Logger getLogger(String name, /* Module */ Class caller) { + public final Logger getLogger(String name, Module module) { checkPermission(); - return demandLoggerFor(name, caller); + return demandLoggerFor(name, module); } @Override public final Logger getLocalizedLogger(String name, ResourceBundle bundle, - /* Module */ Class caller) { - return super.getLocalizedLogger(name, bundle, caller); + Module module) { + return super.getLocalizedLogger(name, bundle, module); } - - /** - * Returns a {@link Logger logger} suitable for the caller usage. + * Returns a {@link Logger logger} suitable for use within the + * given {@code module}. * * @implSpec The default implementation for this method is to return a * simple logger that will print all messages of INFO level and above * to the console. That simple logger is not configurable. * * @param name The name of the logger. - * @param caller The class on behalf of which the logger is created. + * @param module The module on behalf of which the logger is created. * @return A {@link Logger logger} suitable for the application usage. * @throws SecurityException if the calling code does not have the * {@code RuntimePermission("loggerFinder")}. */ - protected Logger demandLoggerFor(String name, /* Module */ Class caller) { + protected Logger demandLoggerFor(String name, Module module) { checkPermission(); - if (caller.getClassLoader() == null) { + if (isSystem(module)) { return SharedLoggers.system.get(SimpleConsoleLogger::makeSimpleLogger, name); } else { return SharedLoggers.application.get(SimpleConsoleLogger::makeSimpleLogger, name); diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/jdk/internal/logger/LazyLoggers.java --- a/jdk/src/java.base/share/classes/jdk/internal/logger/LazyLoggers.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/jdk/internal/logger/LazyLoggers.java Thu Apr 28 09:38:19 2016 -0700 @@ -31,6 +31,7 @@ import java.lang.System.LoggerFinder; import java.lang.System.Logger; import java.lang.ref.WeakReference; +import java.lang.reflect.Module; import java.util.Objects; import jdk.internal.misc.VM; import sun.util.logging.PlatformLogger; @@ -59,15 +60,15 @@ * A factory method to create an SPI logger. * Usually, this will be something like LazyLoggers::getSystemLogger. */ - final BiFunction, L> loggerSupplier; + final BiFunction loggerSupplier; - public LazyLoggerFactories(BiFunction, L> loggerSupplier) { + public LazyLoggerFactories(BiFunction loggerSupplier) { this(Objects.requireNonNull(loggerSupplier), (Void)null); } - private LazyLoggerFactories(BiFunction, L> loggerSupplier, + private LazyLoggerFactories(BiFunction loggerSupplier, Void unused) { this.loggerSupplier = loggerSupplier; } @@ -107,8 +108,8 @@ // The factories that will be used to create the logger lazyly final LazyLoggerFactories factories; - // We need to pass the actual caller when creating the logger. - private final WeakReference> callerRef; + // We need to pass the actual caller module when creating the logger. + private final WeakReference moduleRef; // The name of the logger that will be created lazyly final String name; @@ -121,17 +122,17 @@ private LazyLoggerAccessor(String name, LazyLoggerFactories factories, - Class caller) { + Module module) { this(Objects.requireNonNull(name), Objects.requireNonNull(factories), - Objects.requireNonNull(caller), null); + Objects.requireNonNull(module), null); } private LazyLoggerAccessor(String name, LazyLoggerFactories factories, - Class caller, Void unused) { + Module module, Void unused) { this.name = name; this.factories = factories; - this.callerRef = new WeakReference>(caller); + this.moduleRef = new WeakReference<>(module); } /** @@ -270,12 +271,12 @@ // Creates the wrapped logger by invoking the SPI. Logger createLogger() { - final Class caller = callerRef.get(); - if (caller == null) { - throw new IllegalStateException("The class for which this logger" + final Module module = moduleRef.get(); + if (module == null) { + throw new IllegalStateException("The module for which this logger" + " was created has been garbage collected"); } - return this.factories.loggerSupplier.apply(name, caller); + return this.factories.loggerSupplier.apply(name, module); } /** @@ -289,8 +290,8 @@ * @return A new LazyLoggerAccessor. */ public static LazyLoggerAccessor makeAccessor(String name, - LazyLoggerFactories factories, Class caller) { - return new LazyLoggerAccessor(name, factories, caller); + LazyLoggerFactories factories, Module module) { + return new LazyLoggerAccessor(name, factories, module); } } @@ -346,11 +347,11 @@ // Avoid using lambda here as lazy loggers could be created early // in the bootstrap sequence... - private static final BiFunction, Logger> loggerSupplier = + private static final BiFunction loggerSupplier = new BiFunction<>() { @Override - public Logger apply(String name, Class caller) { - return LazyLoggers.getLoggerFromFinder(name, caller); + public Logger apply(String name, Module module) { + return LazyLoggers.getLoggerFromFinder(name, module); } }; @@ -367,8 +368,8 @@ // logger provider until the VM has finished booting. // private static final class JdkLazyLogger extends LazyLoggerWrapper { - JdkLazyLogger(String name, Class caller) { - this(LazyLoggerAccessor.makeAccessor(name, factories, caller), + JdkLazyLogger(String name, Module module) { + this(LazyLoggerAccessor.makeAccessor(name, factories, module), (Void)null); } private JdkLazyLogger(LazyLoggerAccessor holder, Void unused) { @@ -380,16 +381,16 @@ * Gets a logger from the LoggerFinder. Creates the actual concrete * logger. * @param name name of the logger - * @param caller class on behalf of which the logger is created + * @param module module on behalf of which the logger is created * @return The logger returned by the LoggerFinder. */ - static Logger getLoggerFromFinder(String name, Class caller) { + static Logger getLoggerFromFinder(String name, Module module) { final SecurityManager sm = System.getSecurityManager(); if (sm == null) { - return accessLoggerFinder().getLogger(name, caller); + return accessLoggerFinder().getLogger(name, module); } else { return AccessController.doPrivileged((PrivilegedAction) - () -> {return accessLoggerFinder().getLogger(name, caller);}, + () -> {return accessLoggerFinder().getLogger(name, module);}, null, LOGGERFINDER_PERMISSION); } } @@ -398,22 +399,22 @@ * Returns a (possibly lazy) Logger for the caller. * * @param name the logger name - * @param caller The class on behalf of which the logger is created. - * If the caller is not loaded from the Boot ClassLoader, + * @param module The module on behalf of which the logger is created. + * If the module is not loaded from the Boot ClassLoader, * the LoggerFinder is accessed and the logger returned - * by {@link LoggerFinder#getLogger(java.lang.String, java.lang.Class)} + * by {@link LoggerFinder#getLogger(java.lang.String, java.lang.reflect.Module)} * is returned to the caller directly. * Otherwise, the logger returned by - * {@link #getLazyLogger(java.lang.String, java.lang.Class)} + * {@link #getLazyLogger(java.lang.String, java.lang.reflect.Module)} * is returned to the caller. * * @return a (possibly lazy) Logger instance. */ - public static final Logger getLogger(String name, Class caller) { - if (caller.getClassLoader() == null) { - return getLazyLogger(name, caller); + public static final Logger getLogger(String name, Module module) { + if (DefaultLoggerFinder.isSystem(module)) { + return getLazyLogger(name, module); } else { - return getLoggerFromFinder(name, caller); + return getLoggerFromFinder(name, module); } } @@ -423,10 +424,10 @@ * returned by {@link BootstrapLogger#useLazyLoggers()}. * * @param name the logger name - * @param caller the class on behalf of which the logger is created. + * @param module the module on behalf of which the logger is created. * @return a (possibly lazy) Logger instance. */ - public static final Logger getLazyLogger(String name, Class caller) { + public static final Logger getLazyLogger(String name, Module module) { // BootstrapLogger has the logic to determine whether a LazyLogger // should be used. Usually, it is worth it only if: @@ -438,10 +439,10 @@ // configuration, we're not going to delay the creation of loggers... final boolean useLazyLogger = BootstrapLogger.useLazyLoggers(); if (useLazyLogger) { - return new JdkLazyLogger(name, caller); + return new JdkLazyLogger(name, module); } else { // Directly invoke the LoggerFinder. - return getLoggerFromFinder(name, caller); + return getLoggerFromFinder(name, module); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/jdk/net/ExtendedSocketOptions.java --- a/jdk/src/java.base/share/classes/jdk/net/ExtendedSocketOptions.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,61 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.net; - -import java.net.SocketOption; - -/** - * Defines extended socket options, beyond those defined in - * {@link java.net.StandardSocketOptions}. These options may be platform - * specific. - * - * @since 1.8 - */ -public final class ExtendedSocketOptions { - - private static class ExtSocketOption implements SocketOption { - private final String name; - private final Class type; - ExtSocketOption(String name, Class type) { - this.name = name; - this.type = type; - } - @Override public String name() { return name; } - @Override public Class type() { return type; } - @Override public String toString() { return name; } - } - - private ExtendedSocketOptions() {} - - /** - * Service level properties. When a security manager is installed, - * setting or getting this option requires a {@link NetworkPermission} - * {@code ("setOption.SO_FLOW_SLA")} or {@code "getOption.SO_FLOW_SLA"} - * respectively. - */ - public static final SocketOption SO_FLOW_SLA = new - ExtSocketOption("SO_FLOW_SLA", SocketFlow.class); -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/jdk/net/NetworkPermission.java --- a/jdk/src/java.base/share/classes/jdk/net/NetworkPermission.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.net; - -import java.security.BasicPermission; - -/** - * Represents permission to access the extended networking capabilities - * defined in the jdk.net package. These permissions contain a target - * name, but no actions list. Callers either possess the permission or not. - *

- * The following targets are defined: - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *
Permission Target NameWhat the Permission AllowsRisks of Allowing this Permission
setOption.SO_FLOW_SLAset the {@link ExtendedSocketOptions#SO_FLOW_SLA SO_FLOW_SLA} option - * on any socket that supports itallows caller to set a higher priority or bandwidth allocation - * to sockets it creates, than they might otherwise be allowed.
getOption.SO_FLOW_SLAretrieve the {@link ExtendedSocketOptions#SO_FLOW_SLA SO_FLOW_SLA} - * setting from any socket that supports the optionallows caller access to SLA information that it might not - * otherwise have
- * - * @see jdk.net.ExtendedSocketOptions - * - * @since 1.8 - */ - -public final class NetworkPermission extends BasicPermission { - - private static final long serialVersionUID = -2012939586906722291L; - - /** - * Creates a NetworkPermission with the given target name. - * - * @param name the permission target name - * @throws NullPointerException if {@code name} is {@code null}. - * @throws IllegalArgumentException if {@code name} is empty. - */ - public NetworkPermission(String name) - { - super(name); - } - - /** - * Creates a NetworkPermission with the given target name. - * - * @param name the permission target name - * @param actions should be {@code null}. Is ignored if not. - * @throws NullPointerException if {@code name} is {@code null}. - * @throws IllegalArgumentException if {@code name} is empty. - */ - public NetworkPermission(String name, String actions) - { - super(name, actions); - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/jdk/net/SocketFlow.java --- a/jdk/src/java.base/share/classes/jdk/net/SocketFlow.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,167 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.net; - -import java.lang.annotation.Native; - -/** - * Represents the service level properties for the platform specific socket - * option {@link ExtendedSocketOptions#SO_FLOW_SLA}. - *

- * The priority and bandwidth parameters must be set before - * setting the socket option. - *

- * When the {@code SO_FLOW_SLA} option is set then it may not take effect - * immediately. If the value of the socket option is obtained with - * {@code getOption()} then the status may be returned as {@code INPROGRESS} - * until it takes effect. The priority and bandwidth values are only valid when - * the status is returned as OK. - *

- * When a security manager is installed, a {@link NetworkPermission} - * is required to set or get this option. - * - * @since 1.8 - */ -public class SocketFlow { - - private static final int UNSET = -1; - @Native public static final int NORMAL_PRIORITY = 1; - @Native public static final int HIGH_PRIORITY = 2; - - private int priority = NORMAL_PRIORITY; - - private long bandwidth = UNSET; - - private Status status = Status.NO_STATUS; - - private SocketFlow() {} - - /** - * Enumeration of the return values from the SO_FLOW_SLA - * socket option. Both setting and getting the option return - * one of these statuses, which reflect the state of socket's - * flow. - * - * @since 1.8 - */ - public enum Status { - /** - * Set or get socket option has not been called yet. Status - * values can only be retrieved after calling set or get. - */ - NO_STATUS, - /** - * Flow successfully created. - */ - OK, - /** - * Caller has no permission to create flow. - */ - NO_PERMISSION, - /** - * Flow can not be created because socket is not connected. - */ - NOT_CONNECTED, - /** - * Flow creation not supported for this socket. - */ - NOT_SUPPORTED, - /** - * A flow already exists with identical attributes. - */ - ALREADY_CREATED, - /** - * A flow is being created. - */ - IN_PROGRESS, - /** - * Some other unspecified error. - */ - OTHER - } - - /** - * Creates a new SocketFlow that can be used to set the SO_FLOW_SLA - * socket option and create a socket flow. - */ - public static SocketFlow create() { - return new SocketFlow(); - } - - /** - * Sets this SocketFlow's priority. Must be either NORMAL_PRIORITY - * HIGH_PRIORITY. If not set, a flow's priority is normal. - * - * @throws IllegalArgumentException if priority is not NORMAL_PRIORITY or - * HIGH_PRIORITY. - */ - public SocketFlow priority(int priority) { - if (priority != NORMAL_PRIORITY && priority != HIGH_PRIORITY) { - throw new IllegalArgumentException("invalid priority"); - } - this.priority = priority; - return this; - } - - /** - * Sets this SocketFlow's bandwidth. Must be greater than or equal to zero. - * A value of zero drops all packets for the socket. - * - * @throws IllegalArgumentException if bandwidth is less than zero. - */ - public SocketFlow bandwidth(long bandwidth) { - if (bandwidth < 0) { - throw new IllegalArgumentException("invalid bandwidth"); - } else { - this.bandwidth = bandwidth; - } - return this; - } - - /** - * Returns this SocketFlow's priority. - */ - public int priority() { - return priority; - } - - /** - * Returns this SocketFlow's bandwidth. - * - * @return this SocketFlow's bandwidth, or {@code -1} if status is not OK. - */ - public long bandwidth() { - return bandwidth; - } - - /** - * Returns the Status value of this SocketFlow. NO_STATUS is returned - * if the object was not used in a call to set or get the option. - */ - public Status status() { - return status; - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/jdk/net/Sockets.java --- a/jdk/src/java.base/share/classes/jdk/net/Sockets.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,339 +0,0 @@ -/* - * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package jdk.net; - -import java.net.*; -import java.io.IOException; -import java.io.FileDescriptor; -import java.security.PrivilegedAction; -import java.security.AccessController; -import java.lang.reflect.Field; -import java.util.Set; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Collections; -import sun.net.ExtendedOptionsImpl; - -/** - * Defines static methods to set and get socket options defined by the - * {@link java.net.SocketOption} interface. All of the standard options defined - * by {@link java.net.Socket}, {@link java.net.ServerSocket}, and - * {@link java.net.DatagramSocket} can be set this way, as well as additional - * or platform specific options supported by each socket type. - *

- * The {@link #supportedOptions(Class)} method can be called to determine - * the complete set of options available (per socket type) on the - * current system. - *

- * When a security manager is installed, some non-standard socket options - * may require a security permission before being set or get. - * The details are specified in {@link ExtendedSocketOptions}. No permission - * is required for {@link java.net.StandardSocketOptions}. - * - * @see java.nio.channels.NetworkChannel - */ -public class Sockets { - - private static final HashMap,Set>> - options = new HashMap<>(); - - static { - initOptionSets(); - } - - private Sockets() {} - - /** - * Sets the value of a socket option on a {@link java.net.Socket} - * - * @param s the socket - * @param name The socket option - * @param value The value of the socket option. May be null for some - * options. - * - * @throws UnsupportedOperationException if the socket does not support - * the option. - * - * @throws IllegalArgumentException if the value is not valid for - * the option. - * - * @throws IOException if an I/O error occurs, or socket is closed. - * - * @throws SecurityException if a security manager is set and the - * caller does not have any required permission. - * - * @throws NullPointerException if name is null - * - * @see java.net.StandardSocketOptions - */ - public static void setOption(Socket s, SocketOption name, T value) throws IOException - { - s.setOption(name, value); - } - - /** - * Returns the value of a socket option from a {@link java.net.Socket} - * - * @param s the socket - * @param name The socket option - * - * @return The value of the socket option. - * - * @throws UnsupportedOperationException if the socket does not support - * the option. - * - * @throws IOException if an I/O error occurs - * - * @throws SecurityException if a security manager is set and the - * caller does not have any required permission. - * - * @throws NullPointerException if name is null - * - * @see java.net.StandardSocketOptions - */ - public static T getOption(Socket s, SocketOption name) throws IOException - { - return s.getOption(name); - } - - /** - * Sets the value of a socket option on a {@link java.net.ServerSocket} - * - * @param s the socket - * @param name The socket option - * @param value The value of the socket option. - * - * @throws UnsupportedOperationException if the socket does not support - * the option. - * - * @throws IllegalArgumentException if the value is not valid for - * the option. - * - * @throws IOException if an I/O error occurs - * - * @throws NullPointerException if name is null - * - * @throws SecurityException if a security manager is set and the - * caller does not have any required permission. - * - * @see java.net.StandardSocketOptions - */ - public static void setOption(ServerSocket s, SocketOption name, T value) throws IOException - { - s.setOption(name, value); - } - - /** - * Returns the value of a socket option from a {@link java.net.ServerSocket} - * - * @param s the socket - * @param name The socket option - * - * @return The value of the socket option. - * - * @throws UnsupportedOperationException if the socket does not support - * the option. - * - * @throws IOException if an I/O error occurs - * - * @throws NullPointerException if name is null - * - * @throws SecurityException if a security manager is set and the - * caller does not have any required permission. - * - * @see java.net.StandardSocketOptions - */ - public static T getOption(ServerSocket s, SocketOption name) throws IOException - { - return s.getOption(name); - } - - /** - * Sets the value of a socket option on a {@link java.net.DatagramSocket} - * or {@link java.net.MulticastSocket} - * - * @param s the socket - * @param name The socket option - * @param value The value of the socket option. - * - * @throws UnsupportedOperationException if the socket does not support - * the option. - * - * @throws IllegalArgumentException if the value is not valid for - * the option. - * - * @throws IOException if an I/O error occurs - * - * @throws NullPointerException if name is null - * - * @throws SecurityException if a security manager is set and the - * caller does not have any required permission. - * - * @see java.net.StandardSocketOptions - */ - public static void setOption(DatagramSocket s, SocketOption name, T value) throws IOException - { - s.setOption(name, value); - } - - /** - * Returns the value of a socket option from a - * {@link java.net.DatagramSocket} or {@link java.net.MulticastSocket} - * - * @param s the socket - * @param name The socket option - * - * @return The value of the socket option. - * - * @throws UnsupportedOperationException if the socket does not support - * the option. - * - * @throws IOException if an I/O error occurs - * - * @throws NullPointerException if name is null - * - * @throws SecurityException if a security manager is set and the - * caller does not have any required permission. - * - * @see java.net.StandardSocketOptions - */ - public static T getOption(DatagramSocket s, SocketOption name) throws IOException - { - return s.getOption(name); - } - - /** - * Returns a set of {@link java.net.SocketOption}s supported by the - * given socket type. This set may include standard options and also - * non standard extended options. - * - * @param socketType the type of java.net socket - * - * @throws IllegalArgumentException if socketType is not a valid - * socket type from the java.net package. - */ - public static Set> supportedOptions(Class socketType) { - Set> set = options.get(socketType); - if (set == null) { - throw new IllegalArgumentException("unknown socket type"); - } - return set; - } - - private static void checkValueType(Object value, Class type) { - if (!type.isAssignableFrom(value.getClass())) { - String s = "Found: " + value.getClass().toString() + " Expected: " - + type.toString(); - throw new IllegalArgumentException(s); - } - } - - private static volatile boolean checkedReusePort; - private static volatile boolean isReusePortAvailable; - - /** - * Tells whether SO_REUSEPORT is supported. - */ - static boolean isReusePortAvailable() { - if (!checkedReusePort) { - isReusePortAvailable = isReusePortAvailable0(); - checkedReusePort = true; - } - return isReusePortAvailable; - } - - private static void initOptionSets() { - boolean flowsupported = ExtendedOptionsImpl.flowSupported(); - boolean reuseportsupported = isReusePortAvailable(); - // Socket - - Set> set = new HashSet<>(); - set.add(StandardSocketOptions.SO_KEEPALIVE); - set.add(StandardSocketOptions.SO_SNDBUF); - set.add(StandardSocketOptions.SO_RCVBUF); - set.add(StandardSocketOptions.SO_REUSEADDR); - if (reuseportsupported) { - set.add(StandardSocketOptions.SO_REUSEPORT); - } - set.add(StandardSocketOptions.SO_LINGER); - set.add(StandardSocketOptions.IP_TOS); - set.add(StandardSocketOptions.TCP_NODELAY); - if (flowsupported) { - set.add(ExtendedSocketOptions.SO_FLOW_SLA); - } - set = Collections.unmodifiableSet(set); - options.put(Socket.class, set); - - // ServerSocket - - set = new HashSet<>(); - set.add(StandardSocketOptions.SO_RCVBUF); - set.add(StandardSocketOptions.SO_REUSEADDR); - if (reuseportsupported) { - set.add(StandardSocketOptions.SO_REUSEPORT); - } - set.add(StandardSocketOptions.IP_TOS); - set = Collections.unmodifiableSet(set); - options.put(ServerSocket.class, set); - - // DatagramSocket - - set = new HashSet<>(); - set.add(StandardSocketOptions.SO_SNDBUF); - set.add(StandardSocketOptions.SO_RCVBUF); - set.add(StandardSocketOptions.SO_REUSEADDR); - if (reuseportsupported) { - set.add(StandardSocketOptions.SO_REUSEPORT); - } - set.add(StandardSocketOptions.IP_TOS); - if (flowsupported) { - set.add(ExtendedSocketOptions.SO_FLOW_SLA); - } - set = Collections.unmodifiableSet(set); - options.put(DatagramSocket.class, set); - - // MulticastSocket - - set = new HashSet<>(); - set.add(StandardSocketOptions.SO_SNDBUF); - set.add(StandardSocketOptions.SO_RCVBUF); - set.add(StandardSocketOptions.SO_REUSEADDR); - if (reuseportsupported) { - set.add(StandardSocketOptions.SO_REUSEPORT); - } - set.add(StandardSocketOptions.IP_TOS); - set.add(StandardSocketOptions.IP_MULTICAST_IF); - set.add(StandardSocketOptions.IP_MULTICAST_TTL); - set.add(StandardSocketOptions.IP_MULTICAST_LOOP); - if (flowsupported) { - set.add(ExtendedSocketOptions.SO_FLOW_SLA); - } - set = Collections.unmodifiableSet(set); - options.put(MulticastSocket.class, set); - } - - private static native boolean isReusePortAvailable0(); -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/jdk/net/package-info.java --- a/jdk/src/java.base/share/classes/jdk/net/package-info.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. 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. - */ - -/** - * Platform specific socket options for the {@code java.net} and {@code java.nio.channels} - * socket classes. - * - * @since 1.8 - */ - -package jdk.net; diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/module-info.java --- a/jdk/src/java.base/share/classes/module-info.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/module-info.java Thu Apr 28 09:38:19 2016 -0700 @@ -83,8 +83,6 @@ // see JDK-8144062 exports jdk; - // see JDK-8044773 - exports jdk.net; // the service types defined by the APIs in this module @@ -168,6 +166,7 @@ java.sql, java.xml, jdk.charsets, + jdk.net, jdk.scripting.nashorn, jdk.unsupported, jdk.vm.ci; @@ -194,6 +193,8 @@ jdk.jvmstat; exports sun.net to java.httpclient; + exports sun.net.ext to + jdk.net; exports sun.net.dns to java.security.jgss, jdk.naming.dns; diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/net/ExtendedOptionsImpl.java --- a/jdk/src/java.base/share/classes/sun/net/ExtendedOptionsImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.net; - -import java.net.*; -import jdk.net.*; -import java.io.IOException; -import java.io.FileDescriptor; -import java.security.PrivilegedAction; -import java.security.AccessController; -import java.lang.reflect.Field; -import java.util.Set; -import java.util.HashSet; -import java.util.HashMap; -import java.util.Collections; - -/** - * Contains the native implementation for extended socket options - * together with some other static utilities - */ -public class ExtendedOptionsImpl { - - static { - AccessController.doPrivileged((PrivilegedAction)() -> { - System.loadLibrary("net"); - return null; - }); - init(); - } - - private ExtendedOptionsImpl() {} - - public static void checkSetOptionPermission(SocketOption option) { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - return; - } - String check = "setOption." + option.name(); - sm.checkPermission(new NetworkPermission(check)); - } - - public static void checkGetOptionPermission(SocketOption option) { - SecurityManager sm = System.getSecurityManager(); - if (sm == null) { - return; - } - String check = "getOption." + option.name(); - sm.checkPermission(new NetworkPermission(check)); - } - - public static void checkValueType(Object value, Class type) { - if (!type.isAssignableFrom(value.getClass())) { - String s = "Found: " + value.getClass().toString() + " Expected: " - + type.toString(); - throw new IllegalArgumentException(s); - } - } - - private static native void init(); - - /* - * Extension native implementations - * - * SO_FLOW_SLA - */ - public static native void setFlowOption(FileDescriptor fd, SocketFlow f); - public static native void getFlowOption(FileDescriptor fd, SocketFlow f); - public static native boolean flowSupported(); -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/net/ext/ExtendedSocketOptions.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/sun/net/ext/ExtendedSocketOptions.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,110 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.net.ext; + +import java.io.FileDescriptor; +import java.net.SocketException; +import java.net.SocketOption; +import java.util.Collections; +import java.util.Set; + +/** + * Defines the infrastructure to support extended socket options, beyond those + * defined in {@link java.net.StandardSocketOptions}. + * + * Extended socket options are accessed through the jdk.net API, which is in + * the jdk.net module. + */ +public abstract class ExtendedSocketOptions { + + private final Set> options; + + /** Tells whether or not the option is supported. */ + public final boolean isOptionSupported(SocketOption option) { + return options().contains(option); + } + + /** Return the, possibly empty, set of extended socket options available. */ + public final Set> options() { return options; } + + /** Sets the value of a socket option, for the given socket. */ + public abstract void setOption(FileDescriptor fd, SocketOption option, Object value) + throws SocketException; + + /** Returns the value of a socket option, for the given socket. */ + public abstract Object getOption(FileDescriptor fd, SocketOption option) + throws SocketException; + + protected ExtendedSocketOptions(Set> options) { + this.options = options; + } + + private static volatile ExtendedSocketOptions instance; + + public static final ExtendedSocketOptions getInstance() { return instance; } + + /** Registers support for extended socket options. Invoked by the jdk.net module. */ + public static final void register(ExtendedSocketOptions extOptions) { + if (instance != null) + throw new InternalError("Attempting to reregister extended options"); + + instance = extOptions; + } + + static { + try { + // If the class is present, it will be initialized which + // triggers registration of the extended socket options. + Class c = Class.forName("jdk.net.ExtendedSocketOptions"); + } catch (ClassNotFoundException e) { + // the jdk.net module is not present => no extended socket options + instance = new NoExtendedSocketOptions(); + } + } + + static final class NoExtendedSocketOptions extends ExtendedSocketOptions { + + NoExtendedSocketOptions() { + super(Collections.>emptySet()); + } + + @Override + public void setOption(FileDescriptor fd, SocketOption option, Object value) + throws SocketException + { + throw new UnsupportedOperationException( + "no extended options: " + option.name()); + } + + @Override + public Object getOption(FileDescriptor fd, SocketOption option) + throws SocketException + { + throw new UnsupportedOperationException( + "no extended options: " + option.name()); + } + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/nio/ch/AbstractPollSelectorImpl.java --- a/jdk/src/java.base/share/classes/sun/nio/ch/AbstractPollSelectorImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/sun/nio/ch/AbstractPollSelectorImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -29,7 +29,6 @@ import java.nio.channels.*; import java.nio.channels.spi.*; import java.util.*; -import sun.misc.*; /** diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java --- a/jdk/src/java.base/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/sun/nio/ch/AsynchronousSocketChannelImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -39,7 +39,7 @@ import java.util.concurrent.*; import java.util.concurrent.locks.*; import sun.net.NetHooks; -import sun.net.ExtendedOptionsImpl; +import sun.net.ext.ExtendedSocketOptions; /** * Base implementation of AsynchronousSocketChannel @@ -512,9 +512,9 @@ set.add(StandardSocketOptions.SO_REUSEPORT); } set.add(StandardSocketOptions.TCP_NODELAY); - if (ExtendedOptionsImpl.flowSupported()) { - set.add(jdk.net.ExtendedSocketOptions.SO_FLOW_SLA); - } + ExtendedSocketOptions extendedOptions = + ExtendedSocketOptions.getInstance(); + set.addAll(extendedOptions.options()); return Collections.unmodifiableSet(set); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java --- a/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/sun/nio/ch/DatagramChannelImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -33,7 +33,7 @@ import java.nio.channels.spi.*; import java.util.*; import sun.net.ResourceManager; -import sun.net.ExtendedOptionsImpl; +import sun.net.ext.ExtendedSocketOptions; /** * An implementation of DatagramChannels. @@ -306,9 +306,9 @@ set.add(StandardSocketOptions.IP_MULTICAST_IF); set.add(StandardSocketOptions.IP_MULTICAST_TTL); set.add(StandardSocketOptions.IP_MULTICAST_LOOP); - if (ExtendedOptionsImpl.flowSupported()) { - set.add(jdk.net.ExtendedSocketOptions.SO_FLOW_SLA); - } + ExtendedSocketOptions extendedOptions = + ExtendedSocketOptions.getInstance(); + set.addAll(extendedOptions.options()); return Collections.unmodifiableSet(set); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/nio/ch/Net.java --- a/jdk/src/java.base/share/classes/sun/nio/ch/Net.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/sun/nio/ch/Net.java Thu Apr 28 09:38:19 2016 -0700 @@ -27,15 +27,13 @@ import java.io.*; import java.net.*; -import jdk.net.*; import java.nio.channels.*; import java.util.*; import java.security.AccessController; import java.security.PrivilegedAction; -import sun.net.ExtendedOptionsImpl; +import sun.net.ext.ExtendedSocketOptions; import sun.security.action.GetPropertyAction; - public class Net { private Net() { } @@ -281,6 +279,9 @@ // -- Socket options + static final ExtendedSocketOptions extendedOptions = + ExtendedSocketOptions.getInstance(); + static void setSocketOption(FileDescriptor fd, ProtocolFamily family, SocketOption name, Object value) throws IOException @@ -291,12 +292,8 @@ // only simple values supported by this method Class type = name.type(); - if (type == SocketFlow.class) { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(new NetworkPermission("setOption.SO_FLOW_SLA")); - } - ExtendedOptionsImpl.setFlowOption(fd, (SocketFlow)value); + if (extendedOptions.isOptionSupported(name)) { + extendedOptions.setOption(fd, name, value); return; } @@ -353,14 +350,8 @@ { Class type = name.type(); - if (type == SocketFlow.class) { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - sm.checkPermission(new NetworkPermission("getOption.SO_FLOW_SLA")); - } - SocketFlow flow = SocketFlow.create(); - ExtendedOptionsImpl.getFlowOption(fd, flow); - return flow; + if (extendedOptions.isOptionSupported(name)) { + return extendedOptions.getOption(fd, name); } // only simple values supported by this method diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java --- a/jdk/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/sun/nio/ch/SocketChannelImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -33,8 +33,7 @@ import java.nio.channels.spi.*; import java.util.*; import sun.net.NetHooks; -import sun.net.ExtendedOptionsImpl; - +import sun.net.ext.ExtendedSocketOptions; /** * An implementation of SocketChannels @@ -242,9 +241,9 @@ // additional options required by socket adaptor set.add(StandardSocketOptions.IP_TOS); set.add(ExtendedSocketOption.SO_OOBINLINE); - if (ExtendedOptionsImpl.flowSupported()) { - set.add(jdk.net.ExtendedSocketOptions.SO_FLOW_SLA); - } + ExtendedSocketOptions extendedOptions = + ExtendedSocketOptions.getInstance(); + set.addAll(extendedOptions.options()); return Collections.unmodifiableSet(set); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java --- a/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/share/classes/sun/util/logging/PlatformLogger.java Thu Apr 28 09:38:19 2016 -0700 @@ -286,12 +286,15 @@ } if (log == null) { log = new PlatformLogger(PlatformLogger.Bridge.convert( - // We pass PlatformLogger.class rather than the actual caller + // We pass PlatformLogger.class.getModule() (java.base) + // rather than the actual module of the caller // because we want PlatformLoggers to be system loggers: we // won't need to resolve any resource bundles anyway. // Note: Many unit tests depend on the fact that - // PlatformLogger.getLoggerFromFinder is not caller sensitive. - LazyLoggers.getLazyLogger(name, PlatformLogger.class))); + // PlatformLogger.getLoggerFromFinder is not caller + // sensitive, and this strategy ensure that the tests + // still pass. + LazyLoggers.getLazyLogger(name, PlatformLogger.class.getModule()))); loggers.put(name, new WeakReference<>(log)); } return log; diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java --- a/jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/unix/classes/java/net/PlainDatagramSocketImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -27,9 +27,7 @@ import java.io.IOException; import java.util.Set; import java.util.HashSet; -import java.util.Collections; -import jdk.net.*; -import static sun.net.ExtendedOptionsImpl.*; +import sun.net.ext.ExtendedSocketOptions; /* * On Unix systems we simply delegate to native methods. @@ -43,8 +41,11 @@ init(); } + static final ExtendedSocketOptions extendedOptions = + ExtendedSocketOptions.getInstance(); + protected void setOption(SocketOption name, T value) throws IOException { - if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { + if (!extendedOptions.isOptionSupported(name)) { if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) { super.setOption(name, value); } else { @@ -55,21 +56,16 @@ } } } else { - if (!flowSupported()) { - throw new UnsupportedOperationException("unsupported option"); - } if (isClosed()) { throw new SocketException("Socket closed"); } - checkSetOptionPermission(name); - checkValueType(value, SocketFlow.class); - setFlowOption(getFileDescriptor(), (SocketFlow)value); + extendedOptions.setOption(fd, name, value); } } @SuppressWarnings("unchecked") protected T getOption(SocketOption name) throws IOException { - if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { + if (!extendedOptions.isOptionSupported(name)) { if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) { return super.getOption(name); } else { @@ -79,31 +75,23 @@ throw new UnsupportedOperationException("unsupported option"); } } - } - if (!flowSupported()) { - throw new UnsupportedOperationException("unsupported option"); + } else { + if (isClosed()) { + throw new SocketException("Socket closed"); + } + return (T) extendedOptions.getOption(fd, name); } - if (isClosed()) { - throw new SocketException("Socket closed"); - } - checkGetOptionPermission(name); - SocketFlow flow = SocketFlow.create(); - getFlowOption(getFileDescriptor(), flow); - return (T)flow; } protected Set> supportedOptions() { - HashSet> options = new HashSet<>( - super.supportedOptions()); - - if (flowSupported()) { - options.add(ExtendedSocketOptions.SO_FLOW_SLA); - } + HashSet> options = new HashSet<>(super.supportedOptions()); + options.addAll(extendedOptions.options()); return options; } protected void socketSetOption(int opt, Object val) throws SocketException { - if (opt == SocketOptions.SO_REUSEPORT && !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) { + if (opt == SocketOptions.SO_REUSEPORT && + !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) { throw new UnsupportedOperationException("unsupported option"); } try { diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/unix/classes/java/net/PlainSocketImpl.java --- a/jdk/src/java.base/unix/classes/java/net/PlainSocketImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/unix/classes/java/net/PlainSocketImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -28,10 +28,7 @@ import java.io.FileDescriptor; import java.util.Set; import java.util.HashSet; -import java.util.Collections; -import jdk.net.*; - -import static sun.net.ExtendedOptionsImpl.*; +import sun.net.ext.ExtendedSocketOptions; /* * On Unix systems we simply delegate to native methods. @@ -57,8 +54,11 @@ this.fd = fd; } + static final ExtendedSocketOptions extendedOptions = + ExtendedSocketOptions.getInstance(); + protected void setOption(SocketOption name, T value) throws IOException { - if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { + if (!extendedOptions.isOptionSupported(name)) { if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) { super.setOption(name, value); } else { @@ -69,21 +69,19 @@ } } } else { - if (getSocket() == null || !flowSupported()) { + if (getSocket() == null) { throw new UnsupportedOperationException("unsupported option"); } if (isClosedOrPending()) { throw new SocketException("Socket closed"); } - checkSetOptionPermission(name); - checkValueType(value, SocketFlow.class); - setFlowOption(getFileDescriptor(), (SocketFlow)value); + extendedOptions.setOption(fd, name, value); } } @SuppressWarnings("unchecked") protected T getOption(SocketOption name) throws IOException { - if (!name.equals(ExtendedSocketOptions.SO_FLOW_SLA)) { + if (!extendedOptions.isOptionSupported(name)) { if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) { return super.getOption(name); } else { @@ -93,31 +91,28 @@ throw new UnsupportedOperationException("unsupported option"); } } - } - if (getSocket() == null || !flowSupported()) { - throw new UnsupportedOperationException("unsupported option"); + } else { + if (getSocket() == null) { + throw new UnsupportedOperationException("unsupported option"); + } + if (isClosedOrPending()) { + throw new SocketException("Socket closed"); + } + return (T) extendedOptions.getOption(fd, name); } - if (isClosedOrPending()) { - throw new SocketException("Socket closed"); - } - checkGetOptionPermission(name); - SocketFlow flow = SocketFlow.create(); - getFlowOption(getFileDescriptor(), flow); - return (T)flow; } protected Set> supportedOptions() { - HashSet> options = new HashSet<>( - super.supportedOptions()); - - if (getSocket() != null && flowSupported()) { - options.add(ExtendedSocketOptions.SO_FLOW_SLA); + HashSet> options = new HashSet<>(super.supportedOptions()); + if (getSocket() != null) { + options.addAll(extendedOptions.options()); } return options; } protected void socketSetOption(int opt, boolean b, Object val) throws SocketException { - if (opt == SocketOptions.SO_REUSEPORT && !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) { + if (opt == SocketOptions.SO_REUSEPORT && + !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) { throw new UnsupportedOperationException("unsupported option"); } try { diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/unix/classes/sun/nio/ch/PollSelectorImpl.java --- a/jdk/src/java.base/unix/classes/sun/nio/ch/PollSelectorImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/unix/classes/sun/nio/ch/PollSelectorImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2001, 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 @@ -29,7 +29,6 @@ import java.nio.channels.*; import java.nio.channels.spi.*; import java.util.*; -import sun.misc.*; /** diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/unix/native/libnet/ExtendedOptionsImpl.c --- a/jdk/src/java.base/unix/native/libnet/ExtendedOptionsImpl.c Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,344 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include -#include - -#include "net_util.h" -#include "jdk_net_SocketFlow.h" - -static jclass sf_status_class; /* Status enum type */ - -static jfieldID sf_status; -static jfieldID sf_priority; -static jfieldID sf_bandwidth; - -static jfieldID sf_fd_fdID; /* FileDescriptor.fd */ - -/* References to the literal enum values */ - -static jobject sfs_NOSTATUS; -static jobject sfs_OK; -static jobject sfs_NOPERMISSION; -static jobject sfs_NOTCONNECTED; -static jobject sfs_NOTSUPPORTED; -static jobject sfs_ALREADYCREATED; -static jobject sfs_INPROGRESS; -static jobject sfs_OTHER; - -static jobject getEnumField(JNIEnv *env, char *name); -static void setStatus(JNIEnv *env, jobject obj, int errval); - -/* OS specific code is implemented in these three functions */ - -static jboolean flowSupported0() ; - -/* - * Class: sun_net_ExtendedOptionsImpl - * Method: init - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_init - (JNIEnv *env, jclass UNUSED) -{ - static int initialized = 0; - jclass c; - - /* Global class references */ - - if (initialized) { - return; - } - - c = (*env)->FindClass(env, "jdk/net/SocketFlow$Status"); - CHECK_NULL(c); - sf_status_class = (*env)->NewGlobalRef(env, c); - CHECK_NULL(sf_status_class); - - /* int "fd" field of java.io.FileDescriptor */ - - c = (*env)->FindClass(env, "java/io/FileDescriptor"); - CHECK_NULL(c); - sf_fd_fdID = (*env)->GetFieldID(env, c, "fd", "I"); - CHECK_NULL(sf_fd_fdID); - - - /* SocketFlow fields */ - - c = (*env)->FindClass(env, "jdk/net/SocketFlow"); - CHECK_NULL(c); - - /* status */ - - sf_status = (*env)->GetFieldID(env, c, "status", - "Ljdk/net/SocketFlow$Status;"); - CHECK_NULL(sf_status); - - /* priority */ - - sf_priority = (*env)->GetFieldID(env, c, "priority", "I"); - CHECK_NULL(sf_priority); - - /* bandwidth */ - - sf_bandwidth = (*env)->GetFieldID(env, c, "bandwidth", "J"); - CHECK_NULL(sf_bandwidth); - - /* Initialize the static enum values */ - - sfs_NOSTATUS = getEnumField(env, "NO_STATUS"); - CHECK_NULL(sfs_NOSTATUS); - sfs_OK = getEnumField(env, "OK"); - CHECK_NULL(sfs_OK); - sfs_NOPERMISSION = getEnumField(env, "NO_PERMISSION"); - CHECK_NULL(sfs_NOPERMISSION); - sfs_NOTCONNECTED = getEnumField(env, "NOT_CONNECTED"); - CHECK_NULL(sfs_NOTCONNECTED); - sfs_NOTSUPPORTED = getEnumField(env, "NOT_SUPPORTED"); - CHECK_NULL(sfs_NOTSUPPORTED); - sfs_ALREADYCREATED = getEnumField(env, "ALREADY_CREATED"); - CHECK_NULL(sfs_ALREADYCREATED); - sfs_INPROGRESS = getEnumField(env, "IN_PROGRESS"); - CHECK_NULL(sfs_INPROGRESS); - sfs_OTHER = getEnumField(env, "OTHER"); - CHECK_NULL(sfs_OTHER); - initialized = JNI_TRUE; -} - -static jobject getEnumField(JNIEnv *env, char *name) -{ - jobject f; - jfieldID fID = (*env)->GetStaticFieldID(env, sf_status_class, name, - "Ljdk/net/SocketFlow$Status;"); - CHECK_NULL_RETURN(fID, NULL); - - f = (*env)->GetStaticObjectField(env, sf_status_class, fID); - CHECK_NULL_RETURN(f, NULL); - f = (*env)->NewGlobalRef(env, f); - CHECK_NULL_RETURN(f, NULL); - return f; -} - -/* - * Retrieve the int file-descriptor from a public socket type object. - * Gets impl, then the FileDescriptor from the impl, and then the fd - * from that. - */ -static int getFD(JNIEnv *env, jobject fileDesc) { - return (*env)->GetIntField(env, fileDesc, sf_fd_fdID); -} - -/** - * Sets the status field of a SocketFlow to one of the - * canned enum values - */ -static void setStatus (JNIEnv *env, jobject obj, int errval) -{ - switch (errval) { - case 0: /* OK */ - (*env)->SetObjectField(env, obj, sf_status, sfs_OK); - break; - case EPERM: - (*env)->SetObjectField(env, obj, sf_status, sfs_NOPERMISSION); - break; - case ENOTCONN: - (*env)->SetObjectField(env, obj, sf_status, sfs_NOTCONNECTED); - break; - case EOPNOTSUPP: - (*env)->SetObjectField(env, obj, sf_status, sfs_NOTSUPPORTED); - break; - case EALREADY: - (*env)->SetObjectField(env, obj, sf_status, sfs_ALREADYCREATED); - break; - case EINPROGRESS: - (*env)->SetObjectField(env, obj, sf_status, sfs_INPROGRESS); - break; - default: - (*env)->SetObjectField(env, obj, sf_status, sfs_OTHER); - break; - } -} - -#ifdef __solaris__ - -/* - * Class: sun_net_ExtendedOptionsImpl - * Method: setFlowOption - * Signature: (Ljava/io/FileDescriptor;Ljdk/net/SocketFlow;)V - */ -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_setFlowOption - (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) -{ - int fd = getFD(env, fileDesc); - - if (fd < 0) { - NET_ERROR(env, JNU_JAVANETPKG "SocketException", "socket closed"); - return; - } else { - sock_flow_props_t props; - jlong bandwidth; - int rv; - - jint priority = (*env)->GetIntField(env, flow, sf_priority); - memset(&props, 0, sizeof(props)); - props.sfp_version = SOCK_FLOW_PROP_VERSION1; - - if (priority != jdk_net_SocketFlow_UNSET) { - props.sfp_mask |= SFP_PRIORITY; - props.sfp_priority = priority; - } - bandwidth = (*env)->GetLongField(env, flow, sf_bandwidth); - if (bandwidth > -1) { - props.sfp_mask |= SFP_MAXBW; - props.sfp_maxbw = (uint64_t) bandwidth; - } - rv = setsockopt(fd, SOL_SOCKET, SO_FLOW_SLA, &props, sizeof(props)); - if (rv < 0) { - if (errno == ENOPROTOOPT) { - JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", - "unsupported socket option"); - } else if (errno == EACCES || errno == EPERM) { - NET_ERROR(env, JNU_JAVANETPKG "SocketException", - "Permission denied"); - } else { - NET_ERROR(env, JNU_JAVANETPKG "SocketException", - "set option SO_FLOW_SLA failed"); - } - return; - } - setStatus(env, flow, props.sfp_status); - } -} - -/* - * Class: sun_net_ExtendedOptionsImpl - * Method: getFlowOption - * Signature: (Ljava/io/FileDescriptor;Ljdk/net/SocketFlow;)V - */ -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_getFlowOption - (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) -{ - int fd = getFD(env, fileDesc); - - if (fd < 0) { - NET_ERROR(env, JNU_JAVANETPKG "SocketException", "socket closed"); - return; - } else { - sock_flow_props_t props; - int status; - socklen_t sz = sizeof(props); - - int rv = getsockopt(fd, SOL_SOCKET, SO_FLOW_SLA, &props, &sz); - if (rv < 0) { - if (errno == ENOPROTOOPT) { - JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", - "unsupported socket option"); - } else if (errno == EACCES || errno == EPERM) { - NET_ERROR(env, JNU_JAVANETPKG "SocketException", - "Permission denied"); - } else { - NET_ERROR(env, JNU_JAVANETPKG "SocketException", - "set option SO_FLOW_SLA failed"); - } - return; - } - /* first check status to see if flow exists */ - status = props.sfp_status; - setStatus(env, flow, status); - if (status == 0) { /* OK */ - /* can set the other fields now */ - if (props.sfp_mask & SFP_PRIORITY) { - (*env)->SetIntField(env, flow, sf_priority, props.sfp_priority); - } - if (props.sfp_mask & SFP_MAXBW) { - (*env)->SetLongField(env, flow, sf_bandwidth, - (jlong)props.sfp_maxbw); - } - } - } -} - -static jboolean flowsupported; -static jboolean flowsupported_set = JNI_FALSE; - -static jboolean flowSupported0() -{ - /* Do a simple dummy call, and try to figure out from that */ - sock_flow_props_t props; - int rv, s; - if (flowsupported_set) { - return flowsupported; - } - s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); - if (s < 0) { - flowsupported = JNI_FALSE; - flowsupported_set = JNI_TRUE; - return JNI_FALSE; - } - memset(&props, 0, sizeof(props)); - props.sfp_version = SOCK_FLOW_PROP_VERSION1; - props.sfp_mask |= SFP_PRIORITY; - props.sfp_priority = SFP_PRIO_NORMAL; - rv = setsockopt(s, SOL_SOCKET, SO_FLOW_SLA, &props, sizeof(props)); - if (rv != 0 && errno == ENOPROTOOPT) { - rv = JNI_FALSE; - } else { - rv = JNI_TRUE; - } - close(s); - flowsupported = rv; - flowsupported_set = JNI_TRUE; - return flowsupported; -} - -#else /* __solaris__ */ - -/* Non Solaris. Functionality is not supported. So, throw UnsupportedOpExc */ - -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_setFlowOption - (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) -{ - JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", - "unsupported socket option"); -} - -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_getFlowOption - (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) -{ - JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", - "unsupported socket option"); -} - -static jboolean flowSupported0() { - return JNI_FALSE; -} - -#endif /* __solaris__ */ - -JNIEXPORT jboolean JNICALL Java_sun_net_ExtendedOptionsImpl_flowSupported - (JNIEnv *env, jclass UNUSED) -{ - return flowSupported0(); -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/unix/native/libnet/net_util_md.h --- a/jdk/src/java.base/unix/native/libnet/net_util_md.h Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.base/unix/native/libnet/net_util_md.h Thu Apr 28 09:38:19 2016 -0700 @@ -120,47 +120,6 @@ #ifdef __solaris__ int net_getParam(char *driver, char *param); - -#ifndef SO_FLOW_SLA -#define SO_FLOW_SLA 0x1018 - -#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 -#pragma pack(4) #endif -/* - * Used with the setsockopt(SO_FLOW_SLA, ...) call to set - * per socket service level properties. - * When the application uses per-socket API, we will enforce the properties - * on both outbound and inbound packets. - * - * For now, only priority and maxbw are supported in SOCK_FLOW_PROP_VERSION1. - */ -typedef struct sock_flow_props_s { - int sfp_version; - uint32_t sfp_mask; - int sfp_priority; /* flow priority */ - uint64_t sfp_maxbw; /* bandwidth limit in bps */ - int sfp_status; /* flow create status for getsockopt */ -} sock_flow_props_t; - -#define SOCK_FLOW_PROP_VERSION1 1 - -/* bit mask values for sfp_mask */ -#define SFP_MAXBW 0x00000001 /* Flow Bandwidth Limit */ -#define SFP_PRIORITY 0x00000008 /* Flow priority */ - -/* possible values for sfp_priority */ -#define SFP_PRIO_NORMAL 1 -#define SFP_PRIO_HIGH 2 - -#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 -#pragma pack() -#endif /* _LONG_LONG_ALIGNMENT */ - -#endif /* SO_FLOW_SLA */ -#endif /* __solaris__ */ - -JNIEXPORT jboolean JNICALL NET_IsFlowSupported(); - #endif /* NET_UTILS_MD_H */ diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.base/windows/native/libnet/ExtendedOptionsImpl.c --- a/jdk/src/java.base/windows/native/libnet/ExtendedOptionsImpl.c Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -#include -#include - -#include "net_util.h" - -/* - * Class: sun_net_ExtendedOptionsImpl - * Method: init - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_init - (JNIEnv *env, jclass UNUSED) -{ -} - -/* Non Solaris. Functionality is not supported. So, throw UnsupportedOpExc */ - -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_setFlowOption - (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) -{ - JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", - "unsupported socket option"); -} - -JNIEXPORT void JNICALL Java_sun_net_ExtendedOptionsImpl_getFlowOption - (JNIEnv *env, jclass UNUSED, jobject fileDesc, jobject flow) -{ - JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", - "unsupported socket option"); -} - -static jboolean flowSupported0() { - return JNI_FALSE; -} - -JNIEXPORT jboolean JNICALL Java_sun_net_ExtendedOptionsImpl_flowSupported - (JNIEnv *env, jclass UNUSED) -{ - return JNI_FALSE; -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XToolkit.java Thu Apr 28 09:38:19 2016 -0700 @@ -52,7 +52,6 @@ import sun.awt.datatransfer.DataTransferer; import sun.font.FontConfigManager; import sun.java2d.SunGraphicsEnvironment; -import sun.misc.*; import sun.awt.util.PerformanceLogger; import sun.awt.util.ThreadGroupUtils; import sun.print.PrintJob2D; diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.desktop/unix/native/libawt_xawt/java2d/x11/XRBackendNative.c --- a/jdk/src/java.desktop/unix/native/libawt_xawt/java2d/x11/XRBackendNative.c Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.desktop/unix/native/libawt_xawt/java2d/x11/XRBackendNative.c Thu Apr 28 09:38:19 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2010, 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 @@ -72,8 +72,8 @@ #include -#if defined(__solaris__) || defined(_AIX) -/* Solaris 10 and AIX will not have these symbols at runtime */ +#if defined(__solaris__) +/* Solaris 10 will not have these symbols at compile time */ typedef Picture (*XRenderCreateLinearGradientFuncType) (Display *dpy, @@ -147,7 +147,22 @@ return JNI_FALSE; } -#if defined(__solaris__) || defined(_AIX) +#if defined(_AIX) + // On AIX we have to use a special syntax because the shared libraries are packed in + // multi-architecture archives. We first try to load the system default libXrender + // which is contained in the 'X11.base.lib' fileset starting with AIX 6.1 + xrenderlib = dlopen("libXrender.a(shr_64.o)", RTLD_GLOBAL | RTLD_LAZY | RTLD_MEMBER); + if (xrenderlib == NULL) { + // If the latter wasn't successful, we also try to load the version under /opt/freeware + // This may be downloaded from the "AIX Toolbox for Linux Applications" even for AIX 5.3 + xrenderlib = dlopen("libXrender.a(libXrender.so.0)", RTLD_GLOBAL | RTLD_LAZY | RTLD_MEMBER); + } + if (xrenderlib != NULL) { + dlclose(xrenderlib); + } else { + available = JNI_FALSE; + } +#elif defined(__solaris__) xrenderlib = dlopen("libXrender.so",RTLD_GLOBAL|RTLD_LAZY); if (xrenderlib != NULL) { diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.logging/share/classes/java/util/logging/LogManager.java --- a/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.logging/share/classes/java/util/logging/LogManager.java Thu Apr 28 09:38:19 2016 -0700 @@ -43,6 +43,8 @@ import jdk.internal.misc.JavaAWTAccess; import jdk.internal.misc.SharedSecrets; import sun.util.logging.internal.LoggingProviderImpl; +import java.lang.reflect.Module; +import static jdk.internal.logger.DefaultLoggerFinder.isSystem; /** * There is a single global LogManager object that is used to @@ -503,10 +505,16 @@ // as a LogManager subclass may override the addLogger, getLogger, // readConfiguration, and other methods. Logger demandLogger(String name, String resourceBundleName, Class caller) { + final Module module = caller == null ? null : caller.getModule(); + return demandLogger(name, resourceBundleName, module); + } + + Logger demandLogger(String name, String resourceBundleName, Module module) { Logger result = getLogger(name); if (result == null) { // only allocate the new logger once - Logger newLogger = new Logger(name, resourceBundleName, caller, this, false); + Logger newLogger = new Logger(name, resourceBundleName, + module == null ? null : module, this, false); do { if (addLogger(newLogger)) { // We successfully added the new Logger that we @@ -532,9 +540,14 @@ } Logger demandSystemLogger(String name, String resourceBundleName, Class caller) { + final Module module = caller == null ? null : caller.getModule(); + return demandSystemLogger(name, resourceBundleName, module); + } + + Logger demandSystemLogger(String name, String resourceBundleName, Module module) { // Add a system logger in the system context's namespace final Logger sysLogger = getSystemContext() - .demandLogger(name, resourceBundleName, caller); + .demandLogger(name, resourceBundleName, module); // Add the system logger to the LogManager's namespace if not exist // so that there is only one single logger of the given name. @@ -619,11 +632,11 @@ return global; } - Logger demandLogger(String name, String resourceBundleName, Class caller) { + Logger demandLogger(String name, String resourceBundleName, Module module) { // a LogManager subclass may have its own implementation to add and // get a Logger. So delegate to the LogManager to do the work. final LogManager owner = getOwner(); - return owner.demandLogger(name, resourceBundleName, caller); + return owner.demandLogger(name, resourceBundleName, module); } @@ -907,11 +920,13 @@ // one single logger of the given name. System loggers are visible // to applications unless a logger of the same name has been added. @Override - Logger demandLogger(String name, String resourceBundleName, Class caller) { + Logger demandLogger(String name, String resourceBundleName, + Module module) { Logger result = findLogger(name); if (result == null) { // only allocate the new system logger once - Logger newLogger = new Logger(name, resourceBundleName, caller, getOwner(), true); + Logger newLogger = new Logger(name, resourceBundleName, + module, getOwner(), true); do { if (addLocalLogger(newLogger)) { // We successfully added the new Logger that we @@ -2622,18 +2637,18 @@ } /** - * Demands a logger on behalf of the given {@code caller}. + * Demands a logger on behalf of the given {@code module}. *

- * If a named logger suitable for the given caller is found + * If a named logger suitable for the given module is found * returns it. - * Otherwise, creates a new logger suitable for the given caller. + * Otherwise, creates a new logger suitable for the given module. * * @param name The logger name. - * @param caller The caller on which behalf the logger is created/retrieved. - * @return A logger for the given {@code caller}. + * @param module The module on which behalf the logger is created/retrieved. + * @return A logger for the given {@code module}. * * @throws NullPointerException if {@code name} is {@code null} - * or {@code caller} is {@code null}. + * or {@code module} is {@code null}. * @throws IllegalArgumentException if {@code manager} is not the default * LogManager. * @throws SecurityException if a security manager is present and the @@ -2641,7 +2656,7 @@ * {@link LoggingPermission LoggingPermission("demandLogger", null)}. */ @Override - public Logger demandLoggerFor(LogManager manager, String name, /* Module */ Class caller) { + public Logger demandLoggerFor(LogManager manager, String name, Module module) { if (manager != getLogManager()) { // having LogManager as parameter just ensures that the // caller will have initialized the LogManager before reaching @@ -2649,15 +2664,16 @@ throw new IllegalArgumentException("manager"); } Objects.requireNonNull(name); + Objects.requireNonNull(module); SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(controlPermission); } - if (caller.getClassLoader() == null) { + if (isSystem(module)) { return manager.demandSystemLogger(name, - Logger.SYSTEM_LOGGER_RB_NAME, caller); + Logger.SYSTEM_LOGGER_RB_NAME, module); } else { - return manager.demandLogger(name, null, caller); + return manager.demandLogger(name, null, module); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.logging/share/classes/java/util/logging/Logger.java --- a/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.logging/share/classes/java/util/logging/Logger.java Thu Apr 28 09:38:19 2016 -0700 @@ -40,6 +40,7 @@ import java.util.function.Supplier; import jdk.internal.reflect.CallerSensitive; import jdk.internal.reflect.Reflection; +import static jdk.internal.logger.DefaultLoggerFinder.isSystem; /** * A Logger object is used to log messages for a specific @@ -379,7 +380,8 @@ this(name, resourceBundleName, null, LogManager.getLogManager(), false); } - Logger(String name, String resourceBundleName, Class caller, LogManager manager, boolean isSystemLogger) { + Logger(String name, String resourceBundleName, Module caller, + LogManager manager, boolean isSystemLogger) { this.manager = manager; this.isSystemLogger = isSystemLogger; setupResourceInfo(resourceBundleName, caller); @@ -387,10 +389,7 @@ levelValue = Level.INFO.intValue(); } - private void setCallerModuleRef(Class caller) { - Module callerModule = ((caller != null) - ? caller.getModule() - : null); + private void setCallerModuleRef(Module callerModule) { if (callerModule != null) { this.callerModuleRef = new WeakReference<>(callerModule); } @@ -618,7 +617,7 @@ // all loggers in the system context will default to // the system logger's resource bundle - therefore the caller won't // be needed and can be null. - Logger result = manager.demandSystemLogger(name, SYSTEM_LOGGER_RB_NAME, null); + Logger result = manager.demandSystemLogger(name, SYSTEM_LOGGER_RB_NAME, (Module)null); return result; } @@ -681,8 +680,10 @@ LogManager manager = LogManager.getLogManager(); // cleanup some Loggers that have been GC'ed manager.drainLoggerRefQueueBounded(); + final Class callerClass = Reflection.getCallerClass(); + final Module module = callerClass.getModule(); Logger result = new Logger(null, resourceBundleName, - Reflection.getCallerClass(), manager, false); + module, manager, false); result.anonymous = true; Logger root = manager.getLogger(""); result.doSetParent(root); @@ -2046,6 +2047,11 @@ } } + private void setupResourceInfo(String name, Class caller) { + final Module module = caller == null ? null : caller.getModule(); + setupResourceInfo(name, module); + } + // Private utility method to initialize our one entry // resource bundle name cache and the callers Module // Note: for consistency reasons, we are careful to check @@ -2053,7 +2059,7 @@ // resourceBundleName field. // Synchronized to prevent races in setting the fields. private synchronized void setupResourceInfo(String name, - Class callerClass) { + Module callerModule) { final LoggerBundle lb = loggerBundle; if (lb.resourceBundleName != null) { // this Logger already has a ResourceBundle @@ -2072,8 +2078,9 @@ return; } - setCallerModuleRef(callerClass); - if (isSystemLogger && (callerClass != null && callerClass.getClassLoader() != null)) { + setCallerModuleRef(callerModule); + + if (isSystemLogger && (callerModule != null && !isSystem(callerModule))) { checkPermission(); } diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.logging/share/classes/sun/util/logging/internal/LoggingProviderImpl.java --- a/jdk/src/java.logging/share/classes/sun/util/logging/internal/LoggingProviderImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/java.logging/share/classes/sun/util/logging/internal/LoggingProviderImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -32,6 +32,7 @@ import java.util.function.Supplier; import java.lang.System.LoggerFinder; import java.lang.System.Logger; +import java.lang.reflect.Module; import java.util.Objects; import java.util.logging.LogManager; import jdk.internal.logger.DefaultLoggerFinder; @@ -398,21 +399,20 @@ } /** - * Creates a java.util.logging.Logger for the given caller. + * Creates a java.util.logging.Logger for the given module. * @param name the logger name. - * @param caller the caller for which the logger should be created. - * @return a Logger suitable for use in the given caller. + * @param module the module for which the logger should be created. + * @return a Logger suitable for use in the given module. */ private static java.util.logging.Logger demandJULLoggerFor(final String name, - /* Module */ - final Class caller) { + Module module) { final LogManager manager = LogManager.getLogManager(); final SecurityManager sm = System.getSecurityManager(); if (sm == null) { - return logManagerAccess.demandLoggerFor(manager, name, caller); + return logManagerAccess.demandLoggerFor(manager, name, module); } else { final PrivilegedAction pa = - () -> logManagerAccess.demandLoggerFor(manager, name, caller); + () -> logManagerAccess.demandLoggerFor(manager, name, module); return AccessController.doPrivileged(pa, null, LOGGING_CONTROL_PERMISSION); } } @@ -429,17 +429,17 @@ * {@code RuntimePermission("loggerFinder")}. */ @Override - protected Logger demandLoggerFor(String name, /* Module */ Class caller) { + protected Logger demandLoggerFor(String name, Module module) { final SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(LOGGERFINDER_PERMISSION); } - return JULWrapper.of(demandJULLoggerFor(name,caller)); + return JULWrapper.of(demandJULLoggerFor(name,module)); } public static interface LogManagerAccess { java.util.logging.Logger demandLoggerFor(LogManager manager, - String name, /* Module */ Class caller); + String name, Module module); } // Hook for tests diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/java/rmi/server/RMISocketFactory.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/CGIHandler.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/HttpAwareServerSocket.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/HttpInputStream.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/HttpOutputStream.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/HttpReceiveSocket.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/HttpSendInputStream.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/HttpSendOutputStream.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/HttpSendSocket.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/RMIDirectSocketFactory.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/RMIHttpToCGISocketFactory.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/RMIHttpToPortSocketFactory.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/RMIMasterSocketFactory.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/RMISocketInfo.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/proxy/WrappedSocket.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPConnection.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/java.rmi/share/classes/sun/rmi/transport/tcp/TCPTransport.java diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageLocationWriter.java --- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageLocationWriter.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ImageLocationWriter.java Thu Apr 28 09:38:19 2016 -0700 @@ -61,24 +61,32 @@ String baseName; String extensionName = ""; - int offset = fullName.indexOf('/', 1); - if (fullName.length() >= 2 && fullName.charAt(0) == '/' && offset != -1) { - moduleName = fullName.substring(1, offset); - fullName = fullName.substring(offset + 1); - } + if (fullName.startsWith("/modules/")) { + moduleName = "modules"; + baseName = fullName.substring("/modules/".length()); + } else if ( fullName.startsWith("/packages/")) { + moduleName = "packages"; + baseName = fullName.substring("/packages/".length()); + } else { + int offset = fullName.indexOf('/', 1); + if (fullName.length() >= 2 && fullName.charAt(0) == '/' && offset != -1) { + moduleName = fullName.substring(1, offset); + fullName = fullName.substring(offset + 1); + } - offset = fullName.lastIndexOf('/'); - if (1 < offset) { - parentName = fullName.substring(0, offset); - fullName = fullName.substring(offset + 1); - } + offset = fullName.lastIndexOf('/'); + if (1 < offset) { + parentName = fullName.substring(0, offset); + fullName = fullName.substring(offset + 1); + } - offset = fullName.lastIndexOf('.'); - if (offset != -1) { - baseName = fullName.substring(0, offset); - extensionName = fullName.substring(offset + 1); - } else { - baseName = fullName; + offset = fullName.lastIndexOf('.'); + if (offset != -1) { + baseName = fullName.substring(0, offset); + extensionName = fullName.substring(offset + 1); + } else { + baseName = fullName; + } } return new ImageLocationWriter(strings) diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/packager/AppRuntimeImageBuilder.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,146 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.tools.jlink.internal.packager; + + +import jdk.tools.jlink.Jlink; +import jdk.tools.jlink.builder.ImageBuilder; +import jdk.tools.jlink.plugin.Plugin; +import jdk.tools.jlink.builder.*; +import jdk.tools.jlink.plugin.Pool; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintWriter; +import java.io.StringReader; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.ResourceBundle; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.TreeSet; +import java.util.stream.Collectors; + +/** + * AppRuntimeImageBuilder is a private API used only by the Java Packager to generate + * a Java runtime image using jlink. AppRuntimeImageBuilder encapsulates the + * arguments that jlink requires to generate this image. To create the image call the + * build() method. + */ +public final class AppRuntimeImageBuilder { + private Path outputDir = null; + private List modulePath = null; + private Set addModules = null; + private Set limitModules = null; + private String excludeFileList = null; + private Map userArguments = null; + private Boolean stripNativeCommands = null; + + public AppRuntimeImageBuilder() {} + + public void setOutputDir(Path value) { + outputDir = value; + } + + public void setModulePath(List value) { + modulePath = value; + } + + public void setAddModules(Set value) { + addModules = value; + } + + public void setLimitModules(Set value) { + limitModules = value; + } + + public void setExcludeFileList(String value) { + excludeFileList = value; + } + + public void setStripNativeCommands(boolean value) { + stripNativeCommands = value; + } + + public void setUserArguments(Map value) { + userArguments = value; + } + + public void build() throws IOException { + // jlink main arguments + Jlink.JlinkConfiguration jlinkConfig = new Jlink.JlinkConfiguration( + new File("").toPath(), // Unused + modulePath, addModules, limitModules); + + // plugin configuration + List plugins = new ArrayList(); + + if (stripNativeCommands) { + plugins.add(Jlink.newPlugin( + "strip-native-commands", + Collections.singletonMap("strip-native-commands", "on"), + null)); + } + + if (excludeFileList != null && !excludeFileList.isEmpty()) { + plugins.add(Jlink.newPlugin( + "exclude-files", + Collections.singletonMap("exclude-files", excludeFileList), + null)); + } + + // add user supplied jlink arguments + for (Map.Entry entry : userArguments.entrySet()) { + String key = entry.getKey(); + String value = entry.getValue(); + plugins.add(Jlink.newPlugin(key, + Collections.singletonMap(key, value), + null)); + } + + plugins.add(Jlink.newPlugin("installed-modules", Collections.emptyMap(), null)); + + // build the image + Jlink.PluginsConfiguration pluginConfig = new Jlink.PluginsConfiguration( + plugins, new DefaultImageBuilder(true, outputDir), null); + Jlink jlink = new Jlink(); + jlink.build(jlinkConfig, pluginConfig); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/module-info.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,35 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. 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 jdk.jstatd { + requires java.rmi; + requires jdk.jvmstat; + + // RMI needs to serialize types in this package + exports sun.jvmstat.monitor.remote to java.rmi; + + provides sun.jvmstat.monitor.MonitoredHostService with sun.jvmstat.perfdata.monitor.protocol.rmi.MonitoredHostRmiService; +} + diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/monitor/remote/RemoteHost.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/monitor/remote/RemoteHost.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.jvmstat.monitor.remote; + +import sun.jvmstat.monitor.*; +import java.rmi.Remote; +import java.rmi.RemoteException; +import java.io.IOException; + +/** + * Remote Interface for discovering and attaching to remote + * monitorable Java Virtual Machines. + * + * @author Brian Doherty + * @since 1.5 + */ +public interface RemoteHost extends Remote { + + /** + * Remote method to attach to a remote HotSpot Java Virtual Machine + * identified by vmid. + * + * @param vmid The identifier for the target virtual machine. + * @return RemoteVm - A remote object for accessing the remote Java + * Virtual Machine. + * + * @throws MonitorException Thrown when any other error is encountered + * while communicating with the target virtual + * machine. + * @throws RemoteException + * + */ + RemoteVm attachVm(int vmid, String mode) throws RemoteException, + MonitorException; + + /** + * Remote method to detach from a remote HotSpot Java Virtual Machine + * identified by vmid. + * + * @param rvm The remote object for the target Java Virtual + * Machine. + * + * @throws MonitorException Thrown when any other error is encountered + * while communicating with the target virtual + * machine. + * @throws RemoteException + */ + void detachVm(RemoteVm rvm) throws RemoteException, MonitorException; + + /** + * Get a list of Local Virtual Machine Identifiers for the active + * Java Virtual Machine the remote system. A Local Virtual Machine + * Identifier is also known as an lvmid. + * + * @return int[] - A array of lvmids. + * @throws MonitorException Thrown when any other error is encountered + * while communicating with the target virtual + * machine. + * @throws RemoteException + */ + int[] activeVms() throws RemoteException, MonitorException; +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/monitor/remote/RemoteVm.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/monitor/remote/RemoteVm.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,76 @@ +/* + * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.jvmstat.monitor.remote; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +/** + * Interface for accessing the instrumentation exported by a + * Java Virtual Machine running on a remote host. + * + * @author Brian Doherty + * @since 1.5 + */ +public interface RemoteVm extends Remote { + + /** + * Interface to get the bytes associated with the instrumentation + * for the remote Java Virtual Machine. + * + * @return byte[] - a byte array containing the current bytes + * for the instrumentation exported by the + * remote Java Virtual Machine. + * @throws RemoteException Thrown on any communication error + */ + byte[] getBytes() throws RemoteException; + + /** + * Interface to get the size of the instrumentation buffer + * for the target Java Virtual Machine. + * + * @return int - the size of the instrumentation buffer for the + * remote Java Virtual Machine. + * @throws RemoteException Thrown on any communication error + */ + int getCapacity() throws RemoteException; + + /** + * Interface to return the Local Virtual Machine Identifier for + * the remote Java Virtual Machine. The Local Virtual Machine + * Identifier is also know as the lvmid. + * + * @throws RemoteException Thrown on any communication error + */ + int getLocalVmId() throws RemoteException; + + /** + * Interface to detach from the remote Java Virtual Machine. + * + * @throws RemoteException Thrown on any communication error + */ + void detach() throws RemoteException; +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/monitor/remote/package.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/monitor/remote/package.html Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,39 @@ + + + + + + +

+Provides interfaces supporting remote monitoring for instrumented +HotSpot Java Virtual Machines. +

+ + diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostProvider.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostProvider.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,343 @@ +/* + * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.jvmstat.perfdata.monitor.protocol.rmi; + +import sun.jvmstat.monitor.*; +import sun.jvmstat.monitor.event.*; +import sun.jvmstat.monitor.remote.*; +import sun.jvmstat.perfdata.monitor.*; +import java.util.*; +import java.net.*; +import java.io.*; +import java.rmi.*; +import java.util.HashMap; + +/** + * Concrete implementation of the MonitoredHost interface for the + * rmi protocol of the HotSpot PerfData monitoring implementation. + * + * @author Brian Doherty + * @since 1.5 + */ +public class MonitoredHostProvider extends MonitoredHost { + private static final String serverName = "/JStatRemoteHost"; + private static final int DEFAULT_POLLING_INTERVAL = 1000; + + private ArrayList listeners; + private NotifierTask task; + private HashSet activeVms; + private RemoteVmManager vmManager; + private RemoteHost remoteHost; + private Timer timer; + + /** + * Create a MonitoredHostProvider instance using the given HostIdentifier. + * + * @param hostId the host identifier for this MonitoredHost + * @throws MonitorException Thrown on any error encountered while + * communicating with the remote host. + */ + public MonitoredHostProvider(HostIdentifier hostId) + throws MonitorException { + this.hostId = hostId; + this.listeners = new ArrayList(); + this.interval = DEFAULT_POLLING_INTERVAL; + this.activeVms = new HashSet(); + + String rmiName; + String sn = serverName; + String path = hostId.getPath(); + + if ((path != null) && (path.length() > 0)) { + sn = path; + } + + if (hostId.getPort() != -1) { + rmiName = "rmi://" + hostId.getHost() + ":" + hostId.getPort() + sn; + } else { + rmiName = "rmi://" + hostId.getHost() + sn; + } + + try { + remoteHost = (RemoteHost)Naming.lookup(rmiName); + + } catch (RemoteException e) { + /* + * rmi registry not available + * + * Access control exceptions, where the rmi server refuses a + * connection based on policy file configuration, come through + * here on the client side. Unfortunately, the RemoteException + * doesn't contain enough information to determine the true cause + * of the exception. So, we have to output a rather generic message. + */ + String message = "RMI Registry not available at " + + hostId.getHost(); + + if (hostId.getPort() == -1) { + message = message + ":" + + java.rmi.registry.Registry.REGISTRY_PORT; + } else { + message = message + ":" + hostId.getPort(); + } + + if (e.getMessage() != null) { + throw new MonitorException(message + "\n" + e.getMessage(), e); + } else { + throw new MonitorException(message, e); + } + + } catch (NotBoundException e) { + // no server with given name + String message = e.getMessage(); + if (message == null) message = rmiName; + throw new MonitorException("RMI Server " + message + + " not available", e); + } catch (MalformedURLException e) { + // this is a programming problem + e.printStackTrace(); + throw new IllegalArgumentException("Malformed URL: " + rmiName); + } + this.vmManager = new RemoteVmManager(remoteHost); + this.timer = new Timer(true); + } + + /** + * {@inheritDoc} + */ + public MonitoredVm getMonitoredVm(VmIdentifier vmid) + throws MonitorException { + return getMonitoredVm(vmid, DEFAULT_POLLING_INTERVAL); + } + + /** + * {@inheritDoc} + */ + public MonitoredVm getMonitoredVm(VmIdentifier vmid, int interval) + throws MonitorException { + VmIdentifier nvmid = null; + try { + nvmid = hostId.resolve(vmid); + RemoteVm rvm = remoteHost.attachVm(vmid.getLocalVmId(), + vmid.getMode()); + RemoteMonitoredVm rmvm = new RemoteMonitoredVm(rvm, nvmid, timer, + interval); + rmvm.attach(); + return rmvm; + + } catch (RemoteException e) { + throw new MonitorException("Remote Exception attaching to " + + nvmid.toString(), e); + } catch (URISyntaxException e) { + /* + * the VmIdentifier is expected to be a valid and should resolve + * easonably against the host identifier. A URISyntaxException + * here is most likely a programming error. + */ + throw new IllegalArgumentException("Malformed URI: " + + vmid.toString(), e); + } + } + + /** + * {@inheritDoc} + */ + public void detach(MonitoredVm vm) throws MonitorException { + RemoteMonitoredVm rmvm = (RemoteMonitoredVm)vm; + rmvm.detach(); + try { + remoteHost.detachVm(rmvm.getRemoteVm()); + + } catch (RemoteException e) { + throw new MonitorException("Remote Exception detaching from " + + vm.getVmIdentifier().toString(), e); + } + } + + /** + * {@inheritDoc} + */ + public void addHostListener(HostListener listener) { + synchronized(listeners) { + listeners.add(listener); + if (task == null) { + task = new NotifierTask(); + timer.schedule(task, 0, interval); + } + } + } + + /** + * {@inheritDoc} + */ + public void removeHostListener(HostListener listener) { + /* + * XXX: if a disconnect method is added, make sure it calls + * this method to unregister this object from the watcher. otherwise, + * an unused MonitoredHostProvider instance may go uncollected. + */ + synchronized(listeners) { + listeners.remove(listener); + if (listeners.isEmpty() && (task != null)) { + task.cancel(); + task = null; + } + } + } + + public void setInterval(int newInterval) { + synchronized(listeners) { + if (newInterval == interval) { + return; + } + + int oldInterval = interval; + super.setInterval(newInterval); + + if (task != null) { + task.cancel(); + NotifierTask oldTask = task; + task = new NotifierTask(); + CountedTimerTaskUtils.reschedule(timer, oldTask, task, + oldInterval, newInterval); + } + } + } + + /** + * {@inheritDoc} + */ + public Set activeVms() throws MonitorException { + return vmManager.activeVms(); + } + + /** + * Fire VmStatusChangeEvent events to HostListener objects + * + * @param active Set of Integer objects containing the local + * Vm Identifiers of the active JVMs + * @param started Set of Integer objects containing the local + * Vm Identifiers of new JVMs started since last + * interval. + * @param terminated Set of Integer objects containing the local + * Vm Identifiers of terminated JVMs since last + * interval. + */ + @SuppressWarnings("unchecked") // Cast of result of clone + private void fireVmStatusChangedEvents(Set active, Set started, + Set terminated) { + ArrayList registered = null; + VmStatusChangeEvent ev = null; + + synchronized(listeners) { + registered = (ArrayList)listeners.clone(); + } + + for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { + HostListener l = i.next(); + if (ev == null) { + ev = new VmStatusChangeEvent(this, active, started, terminated); + } + l.vmStatusChanged(ev); + } + } + + /** + * Fire hostDisconnectEvent events. + */ + @SuppressWarnings("unchecked") // Cast of result of clone + void fireDisconnectedEvents() { + ArrayList registered = null; + HostEvent ev = null; + + synchronized(listeners) { + registered = (ArrayList)listeners.clone(); + } + + for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { + HostListener l = i.next(); + if (ev == null) { + ev = new HostEvent(this); + } + l.disconnected(ev); + } + } + + /** + * class to poll the remote machine and generate local event notifications. + */ + private class NotifierTask extends CountedTimerTask { + public void run() { + super.run(); + + // save the last set of active JVMs + Set lastActiveVms = activeVms; + + try { + // get the current set of active JVMs + activeVms = (HashSet)vmManager.activeVms(); + + } catch (MonitorException e) { + // XXX: use logging api + System.err.println("MonitoredHostProvider: polling task " + + "caught MonitorException:"); + e.printStackTrace(); + + // mark the HostManager as errored and notify listeners + setLastException(e); + fireDisconnectedEvents(); + } + + if (activeVms.isEmpty()) { + return; + } + + Set startedVms = new HashSet<>(); + Set terminatedVms = new HashSet<>(); + + for (Iterator i = activeVms.iterator(); i.hasNext(); /* empty */ ) { + Integer vmid = i.next(); + if (!lastActiveVms.contains(vmid)) { + // a new file has been detected, add to set + startedVms.add(vmid); + } + } + + for (Iterator i = lastActiveVms.iterator(); i.hasNext(); + /* empty */ ) { + Integer o = i.next(); + if (!activeVms.contains(o)) { + // JVM has terminated, remove it from the active list + terminatedVms.add(o); + } + } + + if (!startedVms.isEmpty() || !terminatedVms.isEmpty()) { + fireVmStatusChangedEvents(activeVms, startedVms, terminatedVms); + } + } + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostRmiService.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostRmiService.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,45 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.jvmstat.perfdata.monitor.protocol.rmi; + +import sun.jvmstat.monitor.HostIdentifier; +import sun.jvmstat.monitor.MonitorException; +import sun.jvmstat.monitor.MonitoredHost; +import sun.jvmstat.monitor.MonitoredHostService; + +public final class MonitoredHostRmiService implements MonitoredHostService { + + @Override + public MonitoredHost getMonitoredHost(HostIdentifier hostId) throws MonitorException { + return new MonitoredHostProvider(hostId); + } + + @Override + public String getScheme() { + return "rmi"; + } + +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/PerfDataBuffer.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/PerfDataBuffer.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.jvmstat.perfdata.monitor.protocol.rmi; + +import sun.jvmstat.monitor.*; +import sun.jvmstat.monitor.remote.*; +import sun.jvmstat.perfdata.monitor.*; +import java.io.*; +import java.rmi.RemoteException; +import java.nio.ByteBuffer; + +/** + * The concrete PerfDataBuffer implementation for the rmi: + * protocol for the HotSpot PerfData monitoring implementation. + *

+ * This class is responsible for acquiring the instrumentation buffer + * data for a remote target HotSpot Java Virtual Machine. + * + * @author Brian Doherty + * @since 1.5 + */ +public class PerfDataBuffer extends AbstractPerfDataBuffer { + + private RemoteVm rvm; + + /** + * Create a PerfDataBuffer instance for accessing the specified + * instrumentation buffer. + * + * @param rvm the proxy to the remote MonitredVm object + * @param lvmid the local Java Virtual Machine Identifier of the + * remote target. + * + * @throws MonitorException + */ + public PerfDataBuffer(RemoteVm rvm, int lvmid) throws MonitorException { + + this.rvm = rvm; + try { + ByteBuffer buffer = ByteBuffer.allocate(rvm.getCapacity()); + sample(buffer); + createPerfDataBuffer(buffer, lvmid); + + } catch (RemoteException e) { + throw new MonitorException("Could not read data for remote JVM " + + lvmid, e); + } + } + + /** + * Get a copy of the remote instrumentation buffer. + *

+ * The data in the remote instrumentation buffer is copied into + * the local byte buffer. + * + * @param buffer the buffer to receive the copy of the remote + * instrumentation buffer. + * @throws RemoteException Thrown on any communications errors with + * the remote system. + */ + public void sample(ByteBuffer buffer) throws RemoteException { + assert buffer != null; + assert rvm != null; + synchronized(buffer) { + buffer.clear(); + buffer.put(rvm.getBytes()); + } + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteMonitoredVm.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteMonitoredVm.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,300 @@ +/* + * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.jvmstat.perfdata.monitor.protocol.rmi; + +import sun.jvmstat.monitor.*; +import sun.jvmstat.monitor.event.*; +import sun.jvmstat.monitor.remote.*; +import sun.jvmstat.perfdata.monitor.*; +import java.lang.reflect.*; +import java.util.*; +import java.io.*; +import java.nio.ByteBuffer; +import java.rmi.*; + +/** + * Concrete implementation of the AbstractMonitoredVm class for the + * rmi: protocol for the HotSpot PerfData monitoring implementation. + *

+ * This class provides the ability to acquire to the instrumentation buffer + * of a live, remote target Java Virtual Machine through an RMI server. + * + * @author Brian Doherty + * @since 1.5 + */ +public class RemoteMonitoredVm extends AbstractMonitoredVm { + + private ArrayList listeners; + private NotifierTask notifierTask; + private SamplerTask samplerTask; + private Timer timer; + + private RemoteVm rvm; + private ByteBuffer updateBuffer; + + /** + * Create a RemoteMonitoredVm instance. + * + * @param rvm the proxy to the remote MonitoredVm instance. + * @param vmid the vm identifier specifying the remot target JVM + * @param timer the timer used to run polling tasks + * @param interval the sampling interval + */ + public RemoteMonitoredVm(RemoteVm rvm, VmIdentifier vmid, + Timer timer, int interval) + throws MonitorException { + super(vmid, interval); + this.rvm = rvm; + pdb = new PerfDataBuffer(rvm, vmid.getLocalVmId()); + this.listeners = new ArrayList(); + this.timer = timer; + } + + /** + * Method to attach to the remote MonitoredVm. + */ + public void attach() throws MonitorException { + updateBuffer = pdb.getByteBuffer().duplicate(); + + // if continuous sampling is requested, register with the sampler thread + if (interval > 0) { + samplerTask = new SamplerTask(); + timer.schedule(samplerTask, 0, interval); + } + } + + /** + * {@inheritDoc} + */ + public void detach() { + try { + if (interval > 0) { + if (samplerTask != null) { + samplerTask.cancel(); + samplerTask = null; + } + if (notifierTask != null) { + notifierTask.cancel(); + notifierTask = null; + } + sample(); + } + } catch (RemoteException e) { + // XXX: - use logging api? throw an exception instead? + System.err.println("Could not read data for remote JVM " + vmid); + e.printStackTrace(); + + } finally { + super.detach(); + } + } + + /** + * Get a copy of the remote instrumentation buffer. + *

+ * The data in the remote instrumentation buffer is copied into + * a local byte buffer. + * + * @throws RemoteException Thrown on any communications errors with + * the remote system. + */ + public void sample() throws RemoteException { + assert updateBuffer != null; + ((PerfDataBuffer)pdb).sample(updateBuffer); + } + + /** + * Get the proxy to the remote MonitoredVm. + * + * @return RemoteVm - the proxy to the remote MonitoredVm. + */ + public RemoteVm getRemoteVm() { + return rvm; + } + + /** + * {@inheritDoc} + */ + public void addVmListener(VmListener l) { + synchronized(listeners) { + listeners.add(l); + if (notifierTask == null) { + notifierTask = new NotifierTask(); + timer.schedule(notifierTask, 0, interval); + } + } + } + + /** + * {@inheritDoc} + */ + public void removeVmListener(VmListener l) { + synchronized(listeners) { + listeners.remove(l); + if (listeners.isEmpty() && (notifierTask != null)) { + notifierTask.cancel(); + notifierTask = null; + } + } + } + + /** + * {@inheritDoc} + */ + public void setInterval(int newInterval) { + synchronized(listeners) { + if (newInterval == interval) { + return; + } + + int oldInterval = interval; + super.setInterval(newInterval); + + if (samplerTask != null) { + samplerTask.cancel(); + SamplerTask oldSamplerTask = samplerTask; + samplerTask = new SamplerTask(); + CountedTimerTaskUtils.reschedule(timer, oldSamplerTask, + samplerTask, oldInterval, + newInterval); + } + if (notifierTask != null) { + notifierTask.cancel(); + NotifierTask oldNotifierTask = notifierTask; + notifierTask = new NotifierTask(); + CountedTimerTaskUtils.reschedule(timer, oldNotifierTask, + notifierTask, oldInterval, + newInterval); + } + } + } + + /** + * Fire MonitoredVmStructureChanged events. + * + * @param inserted List of Monitor objects inserted. + * @param removed List of Monitor objects removed. + */ + @SuppressWarnings("unchecked") // Cast of result of clone + void fireMonitorStatusChangedEvents(List inserted, List removed) { + ArrayList registered = null; + MonitorStatusChangeEvent ev = null; + + synchronized(listeners) { + registered = (ArrayList)listeners.clone(); + } + + for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { + VmListener l = i.next(); + if (ev == null) { + ev = new MonitorStatusChangeEvent(this, inserted, removed); + } + l.monitorStatusChanged(ev); + } + } + + /** + * Fire MonitoredVmStructureChanged events. + */ + @SuppressWarnings("unchecked") // Cast of result of clone + void fireMonitorsUpdatedEvents() { + ArrayList registered = null; + VmEvent ev = null; + + synchronized(listeners) { + registered = (ArrayList)listeners.clone(); + } + + for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { + VmListener l = i.next(); + if (ev == null) { + ev = new VmEvent(this); + } + l.monitorsUpdated(ev); + } + } + + /* + * Timer Tasks. There are two separate timer tasks here. The SamplerTask + * is active whenever we are attached to the remote JVM with a periodic + * sampling interval > 0. The NotifierTask is only active if a VmListener + * has registered with this RemoteMonitoredVm instance. Also, in the future + * we may want to run these tasks at different intervals. Currently, + * they run at the same interval and some significant work may + * need to be done to complete the separation of these two intervals. + */ + + /** + * Class to periodically check the state of the defined monitors + * for the remote MonitoredVm instance and to notify listeners of + * any detected changes. + */ + private class NotifierTask extends CountedTimerTask { + public void run() { + super.run(); + try { + MonitorStatus status = getMonitorStatus(); + + List inserted = status.getInserted(); + List removed = status.getRemoved(); + + if (!inserted.isEmpty() || !removed.isEmpty()) { + fireMonitorStatusChangedEvents(inserted, removed); + } + } catch (MonitorException e) { + // XXX: use logging api? fire disconnect events? mark errored? + // fireDisconnectedEvents(); + System.err.println("Exception updating monitors for " + + getVmIdentifier()); + e.printStackTrace(); + // XXX: should we cancle the notifierTask here? + // this.cancel(); + } + } + } + + /** + * Class to periodically sample the remote instrumentation byte buffer + * and refresh the local copy. Registered listeners are notified of + * the completion of a sampling event. + */ + private class SamplerTask extends CountedTimerTask { + public void run() { + super.run(); + try { + sample(); + fireMonitorsUpdatedEvents(); + + } catch (RemoteException e) { + // XXX: use logging api, mark vm as errored. + System.err.println("Exception taking sample for " + + getVmIdentifier()); + e.printStackTrace(); + this.cancel(); + } + } + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteVmManager.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteVmManager.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.jvmstat.perfdata.monitor.protocol.rmi; + +import java.util.*; +import java.util.regex.*; +import java.io.*; +import java.rmi.RemoteException; +import sun.jvmstat.monitor.*; +import sun.jvmstat.monitor.event.*; +import sun.jvmstat.monitor.remote.*; + +/** + * Class for managing the RemoteMonitoredVm instances on a remote system. + *

+ * This class is responsible for the mechanism that detects the active + * HotSpot Java Virtual Machines on the remote host and possibly for a + * specific user. The ability to detect all possible HotSpot Java Virtual + * Machines on the remote host may be limited by the permissions of the + * principal running the RMI server application on the remote host. + * + * @author Brian Doherty + * @since 1.5 + */ +public class RemoteVmManager { + + private RemoteHost remoteHost; + private String user; + + /** + * Creates a RemoteVmManager instance for the remote system. + *

+ * Manages RemoteMonitordVm instances for which the principal + * running the remote server has appropriate permissions. + * + * @param remoteHost the remote proxy object to the RMI server on + * the remote system. + */ + public RemoteVmManager(RemoteHost remoteHost) { + this(remoteHost, null); + } + + /** + * Creates a RemoteVmManager instance for the given user. + *

+ * Manages RemoteMonitoredVm instances for all remote Java Virtual + * machines owned by the specified user on the remote system. The + * RMI server on the remote system must have the appropriate permissions + * to access the named users Java Virtual Machines. + * + * @param remoteHost the remote proxy object to the RMI server on + * the remote system. + * @param user the name of the user + */ + public RemoteVmManager(RemoteHost remoteHost, String user) { + this.user = user; + this.remoteHost = remoteHost; + } + + /** + * Return the current set of monitorable Java Virtual Machines. + *

+ * The set returned by this method depends on the user name passed + * to the constructor. If no user name was specified, then this + * method will return all candidate JVMs on the system. Otherwise, + * only the JVMs for the given user will be returned. This assumes + * that the RMI server process has the appropriate permissions to + * access the target set of JVMs. + * + * @return Set - the Set of monitorable Java Virtual Machines + */ + public Set activeVms() throws MonitorException { + int[] active = null; + + try { + active = remoteHost.activeVms(); + + } catch (RemoteException e) { + throw new MonitorException("Error communicating with remote host: " + + e.getMessage(), e); + } + + Set activeSet = new HashSet(active.length); + + for (int i = 0; i < active.length; i++) { + activeSet.add(active[i]); + } + + return activeSet; + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/package.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/package.html Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,47 @@ + + + + + + +

+Provides the implementation classes for the rmi: protocol for +the HotSpot PerfData instrumentation buffer monitoring implementation. +

+

+The rmi: protocol is the default protocol for the PerfData +implementation when a hostname is specified as part of a HostIdentifier +or VMIdentifier. It communicates with an RMI server on the remote machine +that provides functions to get a list of available Java Virtual Machines +and to acquire a copy of a Java Virtual Machine's instrumentation buffer. +The RMI server may or may not use the PerfData implementation on the +remote host to acquire this information. The jstatd server +provides a PerfData implementation of the RMI server. + + diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/tools/jstatd/Jstatd.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,164 @@ +/* + * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.tools.jstatd; + +import java.rmi.*; +import java.rmi.server.*; +import java.rmi.registry.Registry; +import java.rmi.registry.LocateRegistry; +import java.net.MalformedURLException; +import sun.jvmstat.monitor.remote.*; + +/** + * Application providing remote access to the jvmstat instrumentation + * exported by local Java Virtual Machine processes. Remote access is + * provided through an RMI interface. + * + * @author Brian Doherty + * @since 1.5 + */ +public class Jstatd { + + private static Registry registry; + private static int port = -1; + private static boolean startRegistry = true; + + private static void printUsage() { + System.err.println("usage: jstatd [-nr] [-p port] [-n rminame]"); + } + + static void bind(String name, RemoteHostImpl remoteHost) + throws RemoteException, MalformedURLException, Exception { + + try { + Naming.rebind(name, remoteHost); + } catch (java.rmi.ConnectException e) { + /* + * either the registry is not running or we cannot contact it. + * start an internal registry if requested. + */ + if (startRegistry && registry == null) { + int localport = (port < 0) ? Registry.REGISTRY_PORT : port; + registry = LocateRegistry.createRegistry(localport); + bind(name, remoteHost); + } else { + throw e; + } + } + } + + @SuppressWarnings("deprecation") // Use of RMISecurityManager + public static void main(String[] args) { + String rminame = null; + int argc = 0; + + for ( ; (argc < args.length) && (args[argc].startsWith("-")); argc++) { + String arg = args[argc]; + + if (arg.compareTo("-nr") == 0) { + startRegistry = false; + } else if (arg.startsWith("-p")) { + if (arg.compareTo("-p") != 0) { + port = Integer.parseInt(arg.substring(2)); + } else { + argc++; + if (argc >= args.length) { + printUsage(); + System.exit(1); + } + port = Integer.parseInt(args[argc]); + } + } else if (arg.startsWith("-n")) { + if (arg.compareTo("-n") != 0) { + rminame = arg.substring(2); + } else { + argc++; + if (argc >= args.length) { + printUsage(); + System.exit(1); + } + rminame = args[argc]; + } + } else { + printUsage(); + System.exit(1); + } + } + + if (argc < args.length) { + printUsage(); + System.exit(1); + } + + if (System.getSecurityManager() == null) { + System.setSecurityManager(new RMISecurityManager()); + } + + StringBuilder name = new StringBuilder(); + + if (port >= 0) { + name.append("//:").append(port); + } + + if (rminame == null) { + rminame = "JStatRemoteHost"; + } + + name.append("/").append(rminame); + + try { + // use 1.5.0 dynamically generated subs. + System.setProperty("java.rmi.server.ignoreSubClasses", "true"); + RemoteHostImpl remoteHost = new RemoteHostImpl(); + RemoteHost stub = (RemoteHost) UnicastRemoteObject.exportObject( + remoteHost, 0); + bind(name.toString(), remoteHost); + System.out.println("jstatd started (bound to " + name.toString() + ")"); + System.out.flush(); + } catch (MalformedURLException e) { + if (rminame != null) { + System.out.println("Bad RMI server name: " + rminame); + } else { + System.out.println("Bad RMI URL: " + name); + } + e.printStackTrace(System.out); + System.exit(1); + } catch (java.rmi.ConnectException e) { + // could not attach to or create a registry + System.out.println("Could not contact RMI registry"); + e.printStackTrace(System.out); + System.exit(1); + } catch (RemoteException e) { + System.out.println("Could not bind " + name + " to RMI Registry"); + e.printStackTrace(System.out); + System.exit(1); + } catch (Exception e) { + System.out.println("Could not create remote object"); + e.printStackTrace(System.out); + System.exit(1); + } + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/tools/jstatd/RemoteHostImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/tools/jstatd/RemoteHostImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.tools.jstatd; + +import java.util.*; +import java.nio.*; +import java.io.*; +import java.net.*; +import java.rmi.*; +import java.rmi.server.*; +import sun.jvmstat.monitor.*; +import sun.jvmstat.monitor.event.*; +import sun.jvmstat.monitor.remote.*; + +/** + * Concrete implementation of the RemoteHost interface for the HotSpot + * PerfData rmi: protocol. + *

+ * This class provides remote access to the instrumentation exported + * by HotSpot Java Virtual Machines through the PerfData shared memory + * interface. + * + * @author Brian Doherty + * @since 1.5 + */ +public class RemoteHostImpl implements RemoteHost, HostListener { + + private MonitoredHost monitoredHost; + private Set activeVms; + + public RemoteHostImpl() throws MonitorException { + try { + monitoredHost = MonitoredHost.getMonitoredHost("localhost"); + } catch (URISyntaxException e) { } + + activeVms = monitoredHost.activeVms(); + monitoredHost.addHostListener(this); + } + + public RemoteVm attachVm(int lvmid, String mode) + throws RemoteException, MonitorException { + Integer v = lvmid; + RemoteVm stub = null; + StringBuilder sb = new StringBuilder(); + + sb.append("local://").append(lvmid).append("@localhost"); + if (mode != null) { + sb.append("?mode=").append(mode); + } + + String vmidStr = sb.toString(); + + try { + VmIdentifier vmid = new VmIdentifier(vmidStr); + MonitoredVm mvm = monitoredHost.getMonitoredVm(vmid); + RemoteVmImpl rvm = new RemoteVmImpl((BufferedMonitoredVm)mvm); + stub = (RemoteVm) UnicastRemoteObject.exportObject(rvm, 0); + } + catch (URISyntaxException e) { + throw new RuntimeException("Malformed VmIdentifier URI: " + + vmidStr, e); + } + return stub; + } + + public void detachVm(RemoteVm rvm) throws RemoteException { + rvm.detach(); + } + + public int[] activeVms() throws MonitorException { + Object[] vms = null; + int[] vmids = null; + + vms = monitoredHost.activeVms().toArray(); + vmids = new int[vms.length]; + + for (int i = 0; i < vmids.length; i++) { + vmids[i] = ((Integer)vms[i]).intValue(); + } + return vmids; + } + + public void vmStatusChanged(VmStatusChangeEvent ev) { + synchronized(this.activeVms) { + activeVms.retainAll(ev.getActive()); + } + } + + public void disconnected(HostEvent ev) { + // we only monitor the local host, so this event shouldn't occur. + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jstatd/share/classes/sun/tools/jstatd/RemoteVmImpl.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.jstatd/share/classes/sun/tools/jstatd/RemoteVmImpl.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package sun.tools.jstatd; + +import sun.jvmstat.monitor.*; +import sun.jvmstat.monitor.remote.*; + +/** + * Concrete implementation of the RemoteVm interface for the HotSpot PerfData + * shared memory implementation of the jvmstat monitoring APIs. This class + * providing remote access to the instrumentation exported by a local HotSpot + * Java Virtual Machine. The instrumentation buffer is shipped in whole to + * the remote machine, which is responsible for parsing and provide access + * to the contained data. + * + * @author Brian Doherty + * @since 1.5 + */ +public class RemoteVmImpl implements RemoteVm { + + private BufferedMonitoredVm mvm; + + RemoteVmImpl(BufferedMonitoredVm mvm) { + this.mvm = mvm; + } + + public byte[] getBytes() { + return mvm.getBytes(); + } + + public int getCapacity() { + return mvm.getCapacity(); + } + + public void detach() { + mvm.detach(); + } + + public int getLocalVmId() { + return mvm.getVmIdentifier().getLocalVmId(); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/module-info.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/module-info.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -module jdk.jvmstat.rmi { - requires java.rmi; - requires jdk.jvmstat; - - // RMI needs to serialize types in this package - exports sun.jvmstat.monitor.remote to java.rmi; - - provides sun.jvmstat.monitor.MonitoredHostService with sun.jvmstat.perfdata.monitor.protocol.rmi.MonitoredHostRmiService; -} - diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/monitor/remote/RemoteHost.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/monitor/remote/RemoteHost.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,85 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.jvmstat.monitor.remote; - -import sun.jvmstat.monitor.*; -import java.rmi.Remote; -import java.rmi.RemoteException; -import java.io.IOException; - -/** - * Remote Interface for discovering and attaching to remote - * monitorable Java Virtual Machines. - * - * @author Brian Doherty - * @since 1.5 - */ -public interface RemoteHost extends Remote { - - /** - * Remote method to attach to a remote HotSpot Java Virtual Machine - * identified by vmid. - * - * @param vmid The identifier for the target virtual machine. - * @return RemoteVm - A remote object for accessing the remote Java - * Virtual Machine. - * - * @throws MonitorException Thrown when any other error is encountered - * while communicating with the target virtual - * machine. - * @throws RemoteException - * - */ - RemoteVm attachVm(int vmid, String mode) throws RemoteException, - MonitorException; - - /** - * Remote method to detach from a remote HotSpot Java Virtual Machine - * identified by vmid. - * - * @param rvm The remote object for the target Java Virtual - * Machine. - * - * @throws MonitorException Thrown when any other error is encountered - * while communicating with the target virtual - * machine. - * @throws RemoteException - */ - void detachVm(RemoteVm rvm) throws RemoteException, MonitorException; - - /** - * Get a list of Local Virtual Machine Identifiers for the active - * Java Virtual Machine the remote system. A Local Virtual Machine - * Identifier is also known as an lvmid. - * - * @return int[] - A array of lvmids. - * @throws MonitorException Thrown when any other error is encountered - * while communicating with the target virtual - * machine. - * @throws RemoteException - */ - int[] activeVms() throws RemoteException, MonitorException; -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/monitor/remote/RemoteVm.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/monitor/remote/RemoteVm.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.jvmstat.monitor.remote; - -import java.rmi.Remote; -import java.rmi.RemoteException; - -/** - * Interface for accessing the instrumentation exported by a - * Java Virtual Machine running on a remote host. - * - * @author Brian Doherty - * @since 1.5 - */ -public interface RemoteVm extends Remote { - - /** - * Interface to get the bytes associated with the instrumentation - * for the remote Java Virtual Machine. - * - * @return byte[] - a byte array containing the current bytes - * for the instrumentation exported by the - * remote Java Virtual Machine. - * @throws RemoteException Thrown on any communication error - */ - byte[] getBytes() throws RemoteException; - - /** - * Interface to get the size of the instrumentation buffer - * for the target Java Virtual Machine. - * - * @return int - the size of the instrumentation buffer for the - * remote Java Virtual Machine. - * @throws RemoteException Thrown on any communication error - */ - int getCapacity() throws RemoteException; - - /** - * Interface to return the Local Virtual Machine Identifier for - * the remote Java Virtual Machine. The Local Virtual Machine - * Identifier is also know as the lvmid. - * - * @throws RemoteException Thrown on any communication error - */ - int getLocalVmId() throws RemoteException; - - /** - * Interface to detach from the remote Java Virtual Machine. - * - * @throws RemoteException Thrown on any communication error - */ - void detach() throws RemoteException; -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/monitor/remote/package.html --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/monitor/remote/package.html Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ - - - - - - -

-Provides interfaces supporting remote monitoring for instrumented -HotSpot Java Virtual Machines. -

- - diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostProvider.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostProvider.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,343 +0,0 @@ -/* - * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.jvmstat.perfdata.monitor.protocol.rmi; - -import sun.jvmstat.monitor.*; -import sun.jvmstat.monitor.event.*; -import sun.jvmstat.monitor.remote.*; -import sun.jvmstat.perfdata.monitor.*; -import java.util.*; -import java.net.*; -import java.io.*; -import java.rmi.*; -import java.util.HashMap; - -/** - * Concrete implementation of the MonitoredHost interface for the - * rmi protocol of the HotSpot PerfData monitoring implementation. - * - * @author Brian Doherty - * @since 1.5 - */ -public class MonitoredHostProvider extends MonitoredHost { - private static final String serverName = "/JStatRemoteHost"; - private static final int DEFAULT_POLLING_INTERVAL = 1000; - - private ArrayList listeners; - private NotifierTask task; - private HashSet activeVms; - private RemoteVmManager vmManager; - private RemoteHost remoteHost; - private Timer timer; - - /** - * Create a MonitoredHostProvider instance using the given HostIdentifier. - * - * @param hostId the host identifier for this MonitoredHost - * @throws MonitorException Thrown on any error encountered while - * communicating with the remote host. - */ - public MonitoredHostProvider(HostIdentifier hostId) - throws MonitorException { - this.hostId = hostId; - this.listeners = new ArrayList(); - this.interval = DEFAULT_POLLING_INTERVAL; - this.activeVms = new HashSet(); - - String rmiName; - String sn = serverName; - String path = hostId.getPath(); - - if ((path != null) && (path.length() > 0)) { - sn = path; - } - - if (hostId.getPort() != -1) { - rmiName = "rmi://" + hostId.getHost() + ":" + hostId.getPort() + sn; - } else { - rmiName = "rmi://" + hostId.getHost() + sn; - } - - try { - remoteHost = (RemoteHost)Naming.lookup(rmiName); - - } catch (RemoteException e) { - /* - * rmi registry not available - * - * Access control exceptions, where the rmi server refuses a - * connection based on policy file configuration, come through - * here on the client side. Unfortunately, the RemoteException - * doesn't contain enough information to determine the true cause - * of the exception. So, we have to output a rather generic message. - */ - String message = "RMI Registry not available at " - + hostId.getHost(); - - if (hostId.getPort() == -1) { - message = message + ":" - + java.rmi.registry.Registry.REGISTRY_PORT; - } else { - message = message + ":" + hostId.getPort(); - } - - if (e.getMessage() != null) { - throw new MonitorException(message + "\n" + e.getMessage(), e); - } else { - throw new MonitorException(message, e); - } - - } catch (NotBoundException e) { - // no server with given name - String message = e.getMessage(); - if (message == null) message = rmiName; - throw new MonitorException("RMI Server " + message - + " not available", e); - } catch (MalformedURLException e) { - // this is a programming problem - e.printStackTrace(); - throw new IllegalArgumentException("Malformed URL: " + rmiName); - } - this.vmManager = new RemoteVmManager(remoteHost); - this.timer = new Timer(true); - } - - /** - * {@inheritDoc} - */ - public MonitoredVm getMonitoredVm(VmIdentifier vmid) - throws MonitorException { - return getMonitoredVm(vmid, DEFAULT_POLLING_INTERVAL); - } - - /** - * {@inheritDoc} - */ - public MonitoredVm getMonitoredVm(VmIdentifier vmid, int interval) - throws MonitorException { - VmIdentifier nvmid = null; - try { - nvmid = hostId.resolve(vmid); - RemoteVm rvm = remoteHost.attachVm(vmid.getLocalVmId(), - vmid.getMode()); - RemoteMonitoredVm rmvm = new RemoteMonitoredVm(rvm, nvmid, timer, - interval); - rmvm.attach(); - return rmvm; - - } catch (RemoteException e) { - throw new MonitorException("Remote Exception attaching to " - + nvmid.toString(), e); - } catch (URISyntaxException e) { - /* - * the VmIdentifier is expected to be a valid and should resolve - * easonably against the host identifier. A URISyntaxException - * here is most likely a programming error. - */ - throw new IllegalArgumentException("Malformed URI: " - + vmid.toString(), e); - } - } - - /** - * {@inheritDoc} - */ - public void detach(MonitoredVm vm) throws MonitorException { - RemoteMonitoredVm rmvm = (RemoteMonitoredVm)vm; - rmvm.detach(); - try { - remoteHost.detachVm(rmvm.getRemoteVm()); - - } catch (RemoteException e) { - throw new MonitorException("Remote Exception detaching from " - + vm.getVmIdentifier().toString(), e); - } - } - - /** - * {@inheritDoc} - */ - public void addHostListener(HostListener listener) { - synchronized(listeners) { - listeners.add(listener); - if (task == null) { - task = new NotifierTask(); - timer.schedule(task, 0, interval); - } - } - } - - /** - * {@inheritDoc} - */ - public void removeHostListener(HostListener listener) { - /* - * XXX: if a disconnect method is added, make sure it calls - * this method to unregister this object from the watcher. otherwise, - * an unused MonitoredHostProvider instance may go uncollected. - */ - synchronized(listeners) { - listeners.remove(listener); - if (listeners.isEmpty() && (task != null)) { - task.cancel(); - task = null; - } - } - } - - public void setInterval(int newInterval) { - synchronized(listeners) { - if (newInterval == interval) { - return; - } - - int oldInterval = interval; - super.setInterval(newInterval); - - if (task != null) { - task.cancel(); - NotifierTask oldTask = task; - task = new NotifierTask(); - CountedTimerTaskUtils.reschedule(timer, oldTask, task, - oldInterval, newInterval); - } - } - } - - /** - * {@inheritDoc} - */ - public Set activeVms() throws MonitorException { - return vmManager.activeVms(); - } - - /** - * Fire VmStatusChangeEvent events to HostListener objects - * - * @param active Set of Integer objects containing the local - * Vm Identifiers of the active JVMs - * @param started Set of Integer objects containing the local - * Vm Identifiers of new JVMs started since last - * interval. - * @param terminated Set of Integer objects containing the local - * Vm Identifiers of terminated JVMs since last - * interval. - */ - @SuppressWarnings("unchecked") // Cast of result of clone - private void fireVmStatusChangedEvents(Set active, Set started, - Set terminated) { - ArrayList registered = null; - VmStatusChangeEvent ev = null; - - synchronized(listeners) { - registered = (ArrayList)listeners.clone(); - } - - for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { - HostListener l = i.next(); - if (ev == null) { - ev = new VmStatusChangeEvent(this, active, started, terminated); - } - l.vmStatusChanged(ev); - } - } - - /** - * Fire hostDisconnectEvent events. - */ - @SuppressWarnings("unchecked") // Cast of result of clone - void fireDisconnectedEvents() { - ArrayList registered = null; - HostEvent ev = null; - - synchronized(listeners) { - registered = (ArrayList)listeners.clone(); - } - - for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { - HostListener l = i.next(); - if (ev == null) { - ev = new HostEvent(this); - } - l.disconnected(ev); - } - } - - /** - * class to poll the remote machine and generate local event notifications. - */ - private class NotifierTask extends CountedTimerTask { - public void run() { - super.run(); - - // save the last set of active JVMs - Set lastActiveVms = activeVms; - - try { - // get the current set of active JVMs - activeVms = (HashSet)vmManager.activeVms(); - - } catch (MonitorException e) { - // XXX: use logging api - System.err.println("MonitoredHostProvider: polling task " - + "caught MonitorException:"); - e.printStackTrace(); - - // mark the HostManager as errored and notify listeners - setLastException(e); - fireDisconnectedEvents(); - } - - if (activeVms.isEmpty()) { - return; - } - - Set startedVms = new HashSet<>(); - Set terminatedVms = new HashSet<>(); - - for (Iterator i = activeVms.iterator(); i.hasNext(); /* empty */ ) { - Integer vmid = i.next(); - if (!lastActiveVms.contains(vmid)) { - // a new file has been detected, add to set - startedVms.add(vmid); - } - } - - for (Iterator i = lastActiveVms.iterator(); i.hasNext(); - /* empty */ ) { - Integer o = i.next(); - if (!activeVms.contains(o)) { - // JVM has terminated, remove it from the active list - terminatedVms.add(o); - } - } - - if (!startedVms.isEmpty() || !terminatedVms.isEmpty()) { - fireVmStatusChangedEvents(activeVms, startedVms, terminatedVms); - } - } - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostRmiService.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/MonitoredHostRmiService.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.jvmstat.perfdata.monitor.protocol.rmi; - -import sun.jvmstat.monitor.HostIdentifier; -import sun.jvmstat.monitor.MonitorException; -import sun.jvmstat.monitor.MonitoredHost; -import sun.jvmstat.monitor.MonitoredHostService; - -public final class MonitoredHostRmiService implements MonitoredHostService { - - @Override - public MonitoredHost getMonitoredHost(HostIdentifier hostId) throws MonitorException { - return new MonitoredHostProvider(hostId); - } - - @Override - public String getScheme() { - return "rmi"; - } - -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/PerfDataBuffer.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/PerfDataBuffer.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.jvmstat.perfdata.monitor.protocol.rmi; - -import sun.jvmstat.monitor.*; -import sun.jvmstat.monitor.remote.*; -import sun.jvmstat.perfdata.monitor.*; -import java.io.*; -import java.rmi.RemoteException; -import java.nio.ByteBuffer; - -/** - * The concrete PerfDataBuffer implementation for the rmi: - * protocol for the HotSpot PerfData monitoring implementation. - *

- * This class is responsible for acquiring the instrumentation buffer - * data for a remote target HotSpot Java Virtual Machine. - * - * @author Brian Doherty - * @since 1.5 - */ -public class PerfDataBuffer extends AbstractPerfDataBuffer { - - private RemoteVm rvm; - - /** - * Create a PerfDataBuffer instance for accessing the specified - * instrumentation buffer. - * - * @param rvm the proxy to the remote MonitredVm object - * @param lvmid the local Java Virtual Machine Identifier of the - * remote target. - * - * @throws MonitorException - */ - public PerfDataBuffer(RemoteVm rvm, int lvmid) throws MonitorException { - - this.rvm = rvm; - try { - ByteBuffer buffer = ByteBuffer.allocate(rvm.getCapacity()); - sample(buffer); - createPerfDataBuffer(buffer, lvmid); - - } catch (RemoteException e) { - throw new MonitorException("Could not read data for remote JVM " - + lvmid, e); - } - } - - /** - * Get a copy of the remote instrumentation buffer. - *

- * The data in the remote instrumentation buffer is copied into - * the local byte buffer. - * - * @param buffer the buffer to receive the copy of the remote - * instrumentation buffer. - * @throws RemoteException Thrown on any communications errors with - * the remote system. - */ - public void sample(ByteBuffer buffer) throws RemoteException { - assert buffer != null; - assert rvm != null; - synchronized(buffer) { - buffer.clear(); - buffer.put(rvm.getBytes()); - } - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteMonitoredVm.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteMonitoredVm.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,300 +0,0 @@ -/* - * Copyright (c) 2004, 2014, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.jvmstat.perfdata.monitor.protocol.rmi; - -import sun.jvmstat.monitor.*; -import sun.jvmstat.monitor.event.*; -import sun.jvmstat.monitor.remote.*; -import sun.jvmstat.perfdata.monitor.*; -import java.lang.reflect.*; -import java.util.*; -import java.io.*; -import java.nio.ByteBuffer; -import java.rmi.*; - -/** - * Concrete implementation of the AbstractMonitoredVm class for the - * rmi: protocol for the HotSpot PerfData monitoring implementation. - *

- * This class provides the ability to acquire to the instrumentation buffer - * of a live, remote target Java Virtual Machine through an RMI server. - * - * @author Brian Doherty - * @since 1.5 - */ -public class RemoteMonitoredVm extends AbstractMonitoredVm { - - private ArrayList listeners; - private NotifierTask notifierTask; - private SamplerTask samplerTask; - private Timer timer; - - private RemoteVm rvm; - private ByteBuffer updateBuffer; - - /** - * Create a RemoteMonitoredVm instance. - * - * @param rvm the proxy to the remote MonitoredVm instance. - * @param vmid the vm identifier specifying the remot target JVM - * @param timer the timer used to run polling tasks - * @param interval the sampling interval - */ - public RemoteMonitoredVm(RemoteVm rvm, VmIdentifier vmid, - Timer timer, int interval) - throws MonitorException { - super(vmid, interval); - this.rvm = rvm; - pdb = new PerfDataBuffer(rvm, vmid.getLocalVmId()); - this.listeners = new ArrayList(); - this.timer = timer; - } - - /** - * Method to attach to the remote MonitoredVm. - */ - public void attach() throws MonitorException { - updateBuffer = pdb.getByteBuffer().duplicate(); - - // if continuous sampling is requested, register with the sampler thread - if (interval > 0) { - samplerTask = new SamplerTask(); - timer.schedule(samplerTask, 0, interval); - } - } - - /** - * {@inheritDoc} - */ - public void detach() { - try { - if (interval > 0) { - if (samplerTask != null) { - samplerTask.cancel(); - samplerTask = null; - } - if (notifierTask != null) { - notifierTask.cancel(); - notifierTask = null; - } - sample(); - } - } catch (RemoteException e) { - // XXX: - use logging api? throw an exception instead? - System.err.println("Could not read data for remote JVM " + vmid); - e.printStackTrace(); - - } finally { - super.detach(); - } - } - - /** - * Get a copy of the remote instrumentation buffer. - *

- * The data in the remote instrumentation buffer is copied into - * a local byte buffer. - * - * @throws RemoteException Thrown on any communications errors with - * the remote system. - */ - public void sample() throws RemoteException { - assert updateBuffer != null; - ((PerfDataBuffer)pdb).sample(updateBuffer); - } - - /** - * Get the proxy to the remote MonitoredVm. - * - * @return RemoteVm - the proxy to the remote MonitoredVm. - */ - public RemoteVm getRemoteVm() { - return rvm; - } - - /** - * {@inheritDoc} - */ - public void addVmListener(VmListener l) { - synchronized(listeners) { - listeners.add(l); - if (notifierTask == null) { - notifierTask = new NotifierTask(); - timer.schedule(notifierTask, 0, interval); - } - } - } - - /** - * {@inheritDoc} - */ - public void removeVmListener(VmListener l) { - synchronized(listeners) { - listeners.remove(l); - if (listeners.isEmpty() && (notifierTask != null)) { - notifierTask.cancel(); - notifierTask = null; - } - } - } - - /** - * {@inheritDoc} - */ - public void setInterval(int newInterval) { - synchronized(listeners) { - if (newInterval == interval) { - return; - } - - int oldInterval = interval; - super.setInterval(newInterval); - - if (samplerTask != null) { - samplerTask.cancel(); - SamplerTask oldSamplerTask = samplerTask; - samplerTask = new SamplerTask(); - CountedTimerTaskUtils.reschedule(timer, oldSamplerTask, - samplerTask, oldInterval, - newInterval); - } - if (notifierTask != null) { - notifierTask.cancel(); - NotifierTask oldNotifierTask = notifierTask; - notifierTask = new NotifierTask(); - CountedTimerTaskUtils.reschedule(timer, oldNotifierTask, - notifierTask, oldInterval, - newInterval); - } - } - } - - /** - * Fire MonitoredVmStructureChanged events. - * - * @param inserted List of Monitor objects inserted. - * @param removed List of Monitor objects removed. - */ - @SuppressWarnings("unchecked") // Cast of result of clone - void fireMonitorStatusChangedEvents(List inserted, List removed) { - ArrayList registered = null; - MonitorStatusChangeEvent ev = null; - - synchronized(listeners) { - registered = (ArrayList)listeners.clone(); - } - - for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { - VmListener l = i.next(); - if (ev == null) { - ev = new MonitorStatusChangeEvent(this, inserted, removed); - } - l.monitorStatusChanged(ev); - } - } - - /** - * Fire MonitoredVmStructureChanged events. - */ - @SuppressWarnings("unchecked") // Cast of result of clone - void fireMonitorsUpdatedEvents() { - ArrayList registered = null; - VmEvent ev = null; - - synchronized(listeners) { - registered = (ArrayList)listeners.clone(); - } - - for (Iterator i = registered.iterator(); i.hasNext(); /* empty */) { - VmListener l = i.next(); - if (ev == null) { - ev = new VmEvent(this); - } - l.monitorsUpdated(ev); - } - } - - /* - * Timer Tasks. There are two separate timer tasks here. The SamplerTask - * is active whenever we are attached to the remote JVM with a periodic - * sampling interval > 0. The NotifierTask is only active if a VmListener - * has registered with this RemoteMonitoredVm instance. Also, in the future - * we may want to run these tasks at different intervals. Currently, - * they run at the same interval and some significant work may - * need to be done to complete the separation of these two intervals. - */ - - /** - * Class to periodically check the state of the defined monitors - * for the remote MonitoredVm instance and to notify listeners of - * any detected changes. - */ - private class NotifierTask extends CountedTimerTask { - public void run() { - super.run(); - try { - MonitorStatus status = getMonitorStatus(); - - List inserted = status.getInserted(); - List removed = status.getRemoved(); - - if (!inserted.isEmpty() || !removed.isEmpty()) { - fireMonitorStatusChangedEvents(inserted, removed); - } - } catch (MonitorException e) { - // XXX: use logging api? fire disconnect events? mark errored? - // fireDisconnectedEvents(); - System.err.println("Exception updating monitors for " - + getVmIdentifier()); - e.printStackTrace(); - // XXX: should we cancle the notifierTask here? - // this.cancel(); - } - } - } - - /** - * Class to periodically sample the remote instrumentation byte buffer - * and refresh the local copy. Registered listeners are notified of - * the completion of a sampling event. - */ - private class SamplerTask extends CountedTimerTask { - public void run() { - super.run(); - try { - sample(); - fireMonitorsUpdatedEvents(); - - } catch (RemoteException e) { - // XXX: use logging api, mark vm as errored. - System.err.println("Exception taking sample for " - + getVmIdentifier()); - e.printStackTrace(); - this.cancel(); - } - } - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteVmManager.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/RemoteVmManager.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.jvmstat.perfdata.monitor.protocol.rmi; - -import java.util.*; -import java.util.regex.*; -import java.io.*; -import java.rmi.RemoteException; -import sun.jvmstat.monitor.*; -import sun.jvmstat.monitor.event.*; -import sun.jvmstat.monitor.remote.*; - -/** - * Class for managing the RemoteMonitoredVm instances on a remote system. - *

- * This class is responsible for the mechanism that detects the active - * HotSpot Java Virtual Machines on the remote host and possibly for a - * specific user. The ability to detect all possible HotSpot Java Virtual - * Machines on the remote host may be limited by the permissions of the - * principal running the RMI server application on the remote host. - * - * @author Brian Doherty - * @since 1.5 - */ -public class RemoteVmManager { - - private RemoteHost remoteHost; - private String user; - - /** - * Creates a RemoteVmManager instance for the remote system. - *

- * Manages RemoteMonitordVm instances for which the principal - * running the remote server has appropriate permissions. - * - * @param remoteHost the remote proxy object to the RMI server on - * the remote system. - */ - public RemoteVmManager(RemoteHost remoteHost) { - this(remoteHost, null); - } - - /** - * Creates a RemoteVmManager instance for the given user. - *

- * Manages RemoteMonitoredVm instances for all remote Java Virtual - * machines owned by the specified user on the remote system. The - * RMI server on the remote system must have the appropriate permissions - * to access the named users Java Virtual Machines. - * - * @param remoteHost the remote proxy object to the RMI server on - * the remote system. - * @param user the name of the user - */ - public RemoteVmManager(RemoteHost remoteHost, String user) { - this.user = user; - this.remoteHost = remoteHost; - } - - /** - * Return the current set of monitorable Java Virtual Machines. - *

- * The set returned by this method depends on the user name passed - * to the constructor. If no user name was specified, then this - * method will return all candidate JVMs on the system. Otherwise, - * only the JVMs for the given user will be returned. This assumes - * that the RMI server process has the appropriate permissions to - * access the target set of JVMs. - * - * @return Set - the Set of monitorable Java Virtual Machines - */ - public Set activeVms() throws MonitorException { - int[] active = null; - - try { - active = remoteHost.activeVms(); - - } catch (RemoteException e) { - throw new MonitorException("Error communicating with remote host: " - + e.getMessage(), e); - } - - Set activeSet = new HashSet(active.length); - - for (int i = 0; i < active.length; i++) { - activeSet.add(active[i]); - } - - return activeSet; - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/package.html --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/jvmstat/perfdata/monitor/protocol/rmi/package.html Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ - - - - - - -

-Provides the implementation classes for the rmi: protocol for -the HotSpot PerfData instrumentation buffer monitoring implementation. -

-

-The rmi: protocol is the default protocol for the PerfData -implementation when a hostname is specified as part of a HostIdentifier -or VMIdentifier. It communicates with an RMI server on the remote machine -that provides functions to get a list of available Java Virtual Machines -and to acquire a copy of a Java Virtual Machine's instrumentation buffer. -The RMI server may or may not use the PerfData implementation on the -remote host to acquire this information. The jstatd server -provides a PerfData implementation of the RMI server. - - diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/tools/jstatd/Jstatd.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/tools/jstatd/Jstatd.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,164 +0,0 @@ -/* - * Copyright (c) 2004, 2015, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.tools.jstatd; - -import java.rmi.*; -import java.rmi.server.*; -import java.rmi.registry.Registry; -import java.rmi.registry.LocateRegistry; -import java.net.MalformedURLException; -import sun.jvmstat.monitor.remote.*; - -/** - * Application providing remote access to the jvmstat instrumentation - * exported by local Java Virtual Machine processes. Remote access is - * provided through an RMI interface. - * - * @author Brian Doherty - * @since 1.5 - */ -public class Jstatd { - - private static Registry registry; - private static int port = -1; - private static boolean startRegistry = true; - - private static void printUsage() { - System.err.println("usage: jstatd [-nr] [-p port] [-n rminame]"); - } - - static void bind(String name, RemoteHostImpl remoteHost) - throws RemoteException, MalformedURLException, Exception { - - try { - Naming.rebind(name, remoteHost); - } catch (java.rmi.ConnectException e) { - /* - * either the registry is not running or we cannot contact it. - * start an internal registry if requested. - */ - if (startRegistry && registry == null) { - int localport = (port < 0) ? Registry.REGISTRY_PORT : port; - registry = LocateRegistry.createRegistry(localport); - bind(name, remoteHost); - } else { - throw e; - } - } - } - - @SuppressWarnings("deprecation") // Use of RMISecurityManager - public static void main(String[] args) { - String rminame = null; - int argc = 0; - - for ( ; (argc < args.length) && (args[argc].startsWith("-")); argc++) { - String arg = args[argc]; - - if (arg.compareTo("-nr") == 0) { - startRegistry = false; - } else if (arg.startsWith("-p")) { - if (arg.compareTo("-p") != 0) { - port = Integer.parseInt(arg.substring(2)); - } else { - argc++; - if (argc >= args.length) { - printUsage(); - System.exit(1); - } - port = Integer.parseInt(args[argc]); - } - } else if (arg.startsWith("-n")) { - if (arg.compareTo("-n") != 0) { - rminame = arg.substring(2); - } else { - argc++; - if (argc >= args.length) { - printUsage(); - System.exit(1); - } - rminame = args[argc]; - } - } else { - printUsage(); - System.exit(1); - } - } - - if (argc < args.length) { - printUsage(); - System.exit(1); - } - - if (System.getSecurityManager() == null) { - System.setSecurityManager(new RMISecurityManager()); - } - - StringBuilder name = new StringBuilder(); - - if (port >= 0) { - name.append("//:").append(port); - } - - if (rminame == null) { - rminame = "JStatRemoteHost"; - } - - name.append("/").append(rminame); - - try { - // use 1.5.0 dynamically generated subs. - System.setProperty("java.rmi.server.ignoreSubClasses", "true"); - RemoteHostImpl remoteHost = new RemoteHostImpl(); - RemoteHost stub = (RemoteHost) UnicastRemoteObject.exportObject( - remoteHost, 0); - bind(name.toString(), remoteHost); - System.out.println("jstatd started (bound to " + name.toString() + ")"); - System.out.flush(); - } catch (MalformedURLException e) { - if (rminame != null) { - System.out.println("Bad RMI server name: " + rminame); - } else { - System.out.println("Bad RMI URL: " + name); - } - e.printStackTrace(System.out); - System.exit(1); - } catch (java.rmi.ConnectException e) { - // could not attach to or create a registry - System.out.println("Could not contact RMI registry"); - e.printStackTrace(System.out); - System.exit(1); - } catch (RemoteException e) { - System.out.println("Could not bind " + name + " to RMI Registry"); - e.printStackTrace(System.out); - System.exit(1); - } catch (Exception e) { - System.out.println("Could not create remote object"); - e.printStackTrace(System.out); - System.exit(1); - } - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/tools/jstatd/RemoteHostImpl.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/tools/jstatd/RemoteHostImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.tools.jstatd; - -import java.util.*; -import java.nio.*; -import java.io.*; -import java.net.*; -import java.rmi.*; -import java.rmi.server.*; -import sun.jvmstat.monitor.*; -import sun.jvmstat.monitor.event.*; -import sun.jvmstat.monitor.remote.*; - -/** - * Concrete implementation of the RemoteHost interface for the HotSpot - * PerfData rmi: protocol. - *

- * This class provides remote access to the instrumentation exported - * by HotSpot Java Virtual Machines through the PerfData shared memory - * interface. - * - * @author Brian Doherty - * @since 1.5 - */ -public class RemoteHostImpl implements RemoteHost, HostListener { - - private MonitoredHost monitoredHost; - private Set activeVms; - - public RemoteHostImpl() throws MonitorException { - try { - monitoredHost = MonitoredHost.getMonitoredHost("localhost"); - } catch (URISyntaxException e) { } - - activeVms = monitoredHost.activeVms(); - monitoredHost.addHostListener(this); - } - - public RemoteVm attachVm(int lvmid, String mode) - throws RemoteException, MonitorException { - Integer v = lvmid; - RemoteVm stub = null; - StringBuilder sb = new StringBuilder(); - - sb.append("local://").append(lvmid).append("@localhost"); - if (mode != null) { - sb.append("?mode=").append(mode); - } - - String vmidStr = sb.toString(); - - try { - VmIdentifier vmid = new VmIdentifier(vmidStr); - MonitoredVm mvm = monitoredHost.getMonitoredVm(vmid); - RemoteVmImpl rvm = new RemoteVmImpl((BufferedMonitoredVm)mvm); - stub = (RemoteVm) UnicastRemoteObject.exportObject(rvm, 0); - } - catch (URISyntaxException e) { - throw new RuntimeException("Malformed VmIdentifier URI: " - + vmidStr, e); - } - return stub; - } - - public void detachVm(RemoteVm rvm) throws RemoteException { - rvm.detach(); - } - - public int[] activeVms() throws MonitorException { - Object[] vms = null; - int[] vmids = null; - - vms = monitoredHost.activeVms().toArray(); - vmids = new int[vms.length]; - - for (int i = 0; i < vmids.length; i++) { - vmids[i] = ((Integer)vms[i]).intValue(); - } - return vmids; - } - - public void vmStatusChanged(VmStatusChangeEvent ev) { - synchronized(this.activeVms) { - activeVms.retainAll(ev.getActive()); - } - } - - public void disconnected(HostEvent ev) { - // we only monitor the local host, so this event shouldn't occur. - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat.rmi/share/classes/sun/tools/jstatd/RemoteVmImpl.java --- a/jdk/src/jdk.jvmstat.rmi/share/classes/sun/tools/jstatd/RemoteVmImpl.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved. - * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. - * - * This code is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. Oracle designates this - * particular file as subject to the "Classpath" exception as provided - * by Oracle in the LICENSE file that accompanied this code. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -package sun.tools.jstatd; - -import sun.jvmstat.monitor.*; -import sun.jvmstat.monitor.remote.*; - -/** - * Concrete implementation of the RemoteVm interface for the HotSpot PerfData - * shared memory implementation of the jvmstat monitoring APIs. This class - * providing remote access to the instrumentation exported by a local HotSpot - * Java Virtual Machine. The instrumentation buffer is shipped in whole to - * the remote machine, which is responsible for parsing and provide access - * to the contained data. - * - * @author Brian Doherty - * @since 1.5 - */ -public class RemoteVmImpl implements RemoteVm { - - private BufferedMonitoredVm mvm; - - RemoteVmImpl(BufferedMonitoredVm mvm) { - this.mvm = mvm; - } - - public byte[] getBytes() { - return mvm.getBytes(); - } - - public int getCapacity() { - return mvm.getCapacity(); - } - - public void detach() { - mvm.detach(); - } - - public int getLocalVmId() { - return mvm.getVmIdentifier().getLocalVmId(); - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.jvmstat/share/classes/module-info.java --- a/jdk/src/jdk.jvmstat/share/classes/module-info.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/jdk.jvmstat/share/classes/module-info.java Thu Apr 28 09:38:19 2016 -0700 @@ -28,12 +28,12 @@ jdk.attach, jdk.jcmd, jdk.jconsole, - jdk.jvmstat.rmi; + jdk.jstatd; exports sun.jvmstat.monitor.event to jdk.jcmd, - jdk.jvmstat.rmi; + jdk.jstatd; exports sun.jvmstat.perfdata.monitor to - jdk.jvmstat.rmi; + jdk.jstatd; uses sun.jvmstat.monitor.MonitoredHostService; provides sun.jvmstat.monitor.MonitoredHostService with sun.jvmstat.perfdata.monitor.protocol.file.MonitoredHostFileService; diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/share/classes/jdk/net/ExtendedSocketOptions.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/share/classes/jdk/net/ExtendedSocketOptions.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,212 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.net; + +import java.io.FileDescriptor; +import java.net.SocketException; +import java.net.SocketOption; +import java.security.AccessController; +import java.security.PrivilegedAction; +import java.util.Collections; +import java.util.Set; +import jdk.internal.misc.JavaIOFileDescriptorAccess; +import jdk.internal.misc.SharedSecrets; + +/** + * Defines extended socket options, beyond those defined in + * {@link java.net.StandardSocketOptions}. These options may be platform + * specific. + * + * @since 1.8 + */ +public final class ExtendedSocketOptions { + + private static class ExtSocketOption implements SocketOption { + private final String name; + private final Class type; + ExtSocketOption(String name, Class type) { + this.name = name; + this.type = type; + } + @Override public String name() { return name; } + @Override public Class type() { return type; } + @Override public String toString() { return name; } + } + + private ExtendedSocketOptions() { } + + /** + * Service level properties. When a security manager is installed, + * setting or getting this option requires a {@link NetworkPermission} + * {@code ("setOption.SO_FLOW_SLA")} or {@code "getOption.SO_FLOW_SLA"} + * respectively. + */ + public static final SocketOption SO_FLOW_SLA = new + ExtSocketOption("SO_FLOW_SLA", SocketFlow.class); + + + private static final PlatformSocketOptions platformSocketOptions = + PlatformSocketOptions.get(); + + private static final boolean flowSupported = + platformSocketOptions.flowSupported(); + + private static final Set> extendedOptions = options(); + + static Set> options() { + if (flowSupported) + return Set.of(SO_FLOW_SLA); + else + return Collections.>emptySet(); + } + + static { + // Registers the extended socket options with the base module. + sun.net.ext.ExtendedSocketOptions.register( + new sun.net.ext.ExtendedSocketOptions(extendedOptions) { + + @Override + public void setOption(FileDescriptor fd, + SocketOption option, + Object value) + throws SocketException + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new NetworkPermission("setOption." + option.name())); + + if (fd == null || !fd.valid()) + throw new SocketException("socket closed"); + + if (option == SO_FLOW_SLA) { + assert flowSupported; + SocketFlow flow = checkValueType(value, option.type()); + setFlowOption(fd, flow); + } else { + throw new InternalError("Unexpected option " + option); + } + } + + @Override + public Object getOption(FileDescriptor fd, + SocketOption option) + throws SocketException + { + SecurityManager sm = System.getSecurityManager(); + if (sm != null) + sm.checkPermission(new NetworkPermission("getOption." + option.name())); + + if (fd == null || !fd.valid()) + throw new SocketException("socket closed"); + + if (option == SO_FLOW_SLA) { + assert flowSupported; + SocketFlow flow = SocketFlow.create(); + getFlowOption(fd, flow); + return flow; + } else { + throw new InternalError("Unexpected option " + option); + } + } + }); + } + + @SuppressWarnings("unchecked") + private static T checkValueType(Object value, Class type) { + if (!type.isAssignableFrom(value.getClass())) { + String s = "Found: " + value.getClass() + ", Expected: " + type; + throw new IllegalArgumentException(s); + } + return (T) value; + } + + private static final JavaIOFileDescriptorAccess fdAccess = + SharedSecrets.getJavaIOFileDescriptorAccess(); + + private static void setFlowOption(FileDescriptor fd, SocketFlow f) + throws SocketException + { + int status = platformSocketOptions.setFlowOption(fdAccess.get(fd), + f.priority(), + f.bandwidth()); + f.status(status); // augment the given flow with the status + } + + private static void getFlowOption(FileDescriptor fd, SocketFlow f) + throws SocketException + { + int status = platformSocketOptions.getFlowOption(fdAccess.get(fd), f); + f.status(status); // augment the given flow with the status + } + + static class PlatformSocketOptions { + + protected PlatformSocketOptions() {} + + @SuppressWarnings("unchecked") + private static PlatformSocketOptions newInstance(String cn) { + Class c; + try { + c = (Class)Class.forName(cn); + return c.getConstructor(new Class[] { }).newInstance(); + } catch (ReflectiveOperationException x) { + throw new AssertionError(x); + } + } + + private static PlatformSocketOptions create() { + String osname = AccessController.doPrivileged( + new PrivilegedAction() { + public String run() { + return System.getProperty("os.name"); + } + }); + if ("SunOS".equals(osname)) + return newInstance("jdk.net.SolarisSocketOptions"); + return new PlatformSocketOptions(); + } + + private static final PlatformSocketOptions instance = create(); + + static PlatformSocketOptions get() { + return instance; + } + + int setFlowOption(int fd, int priority, long bandwidth) + throws SocketException + { + throw new UnsupportedOperationException("unsupported socket option"); + } + + int getFlowOption(int fd, SocketFlow f) throws SocketException { + throw new UnsupportedOperationException("unsupported socket option"); + } + + boolean flowSupported() { + return false; + } + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/share/classes/jdk/net/NetworkPermission.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/share/classes/jdk/net/NetworkPermission.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.net; + +import java.security.BasicPermission; + +/** + * Represents permission to access the extended networking capabilities + * defined in the jdk.net package. These permissions contain a target + * name, but no actions list. Callers either possess the permission or not. + *

+ * The following targets are defined: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Permission Target NameWhat the Permission AllowsRisks of Allowing this Permission
setOption.SO_FLOW_SLAset the {@link ExtendedSocketOptions#SO_FLOW_SLA SO_FLOW_SLA} option + * on any socket that supports itallows caller to set a higher priority or bandwidth allocation + * to sockets it creates, than they might otherwise be allowed.
getOption.SO_FLOW_SLAretrieve the {@link ExtendedSocketOptions#SO_FLOW_SLA SO_FLOW_SLA} + * setting from any socket that supports the optionallows caller access to SLA information that it might not + * otherwise have
+ * + * @see jdk.net.ExtendedSocketOptions + * + * @since 1.8 + */ + +public final class NetworkPermission extends BasicPermission { + + private static final long serialVersionUID = -2012939586906722291L; + + /** + * Creates a NetworkPermission with the given target name. + * + * @param name the permission target name + * @throws NullPointerException if {@code name} is {@code null}. + * @throws IllegalArgumentException if {@code name} is empty. + */ + public NetworkPermission(String name) + { + super(name); + } + + /** + * Creates a NetworkPermission with the given target name. + * + * @param name the permission target name + * @param actions should be {@code null}. Is ignored if not. + * @throws NullPointerException if {@code name} is {@code null}. + * @throws IllegalArgumentException if {@code name} is empty. + */ + public NetworkPermission(String name, String actions) + { + super(name, actions); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/share/classes/jdk/net/SocketFlow.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/share/classes/jdk/net/SocketFlow.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,200 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.net; + +import java.lang.annotation.Native; + +/** + * Represents the service level properties for the platform specific socket + * option {@link ExtendedSocketOptions#SO_FLOW_SLA}. + *

+ * The priority and bandwidth parameters must be set before + * setting the socket option. + *

+ * When the {@code SO_FLOW_SLA} option is set then it may not take effect + * immediately. If the value of the socket option is obtained with + * {@code getOption()} then the status may be returned as {@code INPROGRESS} + * until it takes effect. The priority and bandwidth values are only valid when + * the status is returned as OK. + *

+ * When a security manager is installed, a {@link NetworkPermission} + * is required to set or get this option. + * + * @since 1.8 + */ +public class SocketFlow { + + @Native public static final int UNSET = -1; + @Native public static final int NORMAL_PRIORITY = 1; + @Native public static final int HIGH_PRIORITY = 2; + + @Native private static final int NO_STATUS_VALUE = 0; + @Native private static final int OK_VALUE = 1; + @Native private static final int NO_PERMISSION_VALUE = 2; + @Native private static final int NOT_CONNECTED_VALUE = 3; + @Native private static final int NOT_SUPPORTED_VALUE = 4; + @Native private static final int ALREADY_CREATED_VALUE = 5; + @Native private static final int IN_PROGRESS_VALUE = 6; + @Native private static final int OTHER_VALUE = 7; + + /** + * Enumeration of the return values from the SO_FLOW_SLA + * socket option. Both setting and getting the option return + * one of these statuses, which reflect the state of socket's + * flow. + * + * @since 1.8 + */ + public enum Status { + /** + * Set or get socket option has not been called yet. Status + * values can only be retrieved after calling set or get. + */ + NO_STATUS(NO_STATUS_VALUE), + /** + * Flow successfully created. + */ + OK(OK_VALUE), + /** + * Caller has no permission to create flow. + */ + NO_PERMISSION(NO_PERMISSION_VALUE), + /** + * Flow can not be created because socket is not connected. + */ + NOT_CONNECTED(NOT_CONNECTED_VALUE), + /** + * Flow creation not supported for this socket. + */ + NOT_SUPPORTED(NOT_SUPPORTED_VALUE), + /** + * A flow already exists with identical attributes. + */ + ALREADY_CREATED(ALREADY_CREATED_VALUE), + /** + * A flow is being created. + */ + IN_PROGRESS(IN_PROGRESS_VALUE), + /** + * Some other unspecified error. + */ + OTHER(OTHER_VALUE); + + private final int value; + Status(int value) { this.value = value; } + + static Status from(int value) { + if (value == NO_STATUS.value) return NO_STATUS; + else if (value == OK.value) return OK; + else if (value == NO_PERMISSION.value) return NO_PERMISSION; + else if (value == NOT_CONNECTED.value) return NOT_CONNECTED; + else if (value == NOT_SUPPORTED.value) return NOT_SUPPORTED; + else if (value == ALREADY_CREATED.value) return ALREADY_CREATED; + else if (value == IN_PROGRESS.value) return IN_PROGRESS; + else if (value == OTHER.value) return OTHER; + else throw new InternalError("Unknown value: " + value); + } + } + + private int priority = NORMAL_PRIORITY; + private long bandwidth = UNSET; + private Status status = Status.NO_STATUS; + + /** + * Creates a new SocketFlow that can be used to set the SO_FLOW_SLA + * socket option and create a socket flow. + */ + public static SocketFlow create() { + return new SocketFlow(); + } + + private SocketFlow() { } + + /** + * Sets this SocketFlow's priority. Must be either NORMAL_PRIORITY + * HIGH_PRIORITY. If not set, a flow's priority is normal. + * + * @throws IllegalArgumentException if priority is not NORMAL_PRIORITY or + * HIGH_PRIORITY. + */ + public SocketFlow priority(int priority) { + if (priority != NORMAL_PRIORITY && priority != HIGH_PRIORITY) + throw new IllegalArgumentException("invalid priority :" + priority); + this.priority = priority; + return this; + } + + /** + * Sets this SocketFlow's bandwidth. Must be greater than or equal to zero. + * A value of zero drops all packets for the socket. + * + * @throws IllegalArgumentException if bandwidth is less than zero. + */ + public SocketFlow bandwidth(long bandwidth) { + if (bandwidth < 0) + throw new IllegalArgumentException("invalid bandwidth: " + bandwidth); + this.bandwidth = bandwidth; + return this; + } + + /** + * Returns this SocketFlow's priority. + */ + public int priority() { + return priority; + } + + /** + * Returns this SocketFlow's bandwidth. + * + * @return this SocketFlow's bandwidth, or {@code -1} if status is not OK. + */ + public long bandwidth() { + return bandwidth; + } + + /** + * Returns the Status value of this SocketFlow. NO_STATUS is returned + * if the object was not used in a call to set or get the option. + */ + public Status status() { + return status; + } + + void status(int status) { + this.status = Status.from(status); + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(super.toString()); + sb.append(" [ priority=").append(priority()) + .append(", bandwidth=").append(bandwidth()) + .append(", status=").append(status()) + .append(" ]"); + return sb.toString(); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/share/classes/jdk/net/Sockets.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/share/classes/jdk/net/Sockets.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,334 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.net; + +import java.net.*; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import jdk.net.ExtendedSocketOptions.PlatformSocketOptions; + +/** + * Defines static methods to set and get socket options defined by the + * {@link java.net.SocketOption} interface. All of the standard options defined + * by {@link java.net.Socket}, {@link java.net.ServerSocket}, and + * {@link java.net.DatagramSocket} can be set this way, as well as additional + * or platform specific options supported by each socket type. + *

+ * The {@link #supportedOptions(Class)} method can be called to determine + * the complete set of options available (per socket type) on the + * current system. + *

+ * When a security manager is installed, some non-standard socket options + * may require a security permission before being set or get. + * The details are specified in {@link ExtendedSocketOptions}. No permission + * is required for {@link java.net.StandardSocketOptions}. + * + * @see java.nio.channels.NetworkChannel + */ +public class Sockets { + + private static final Map,Set>> + options = optionSets(); + + private Sockets() {} + + /** + * Sets the value of a socket option on a {@link java.net.Socket} + * + * @param s the socket + * @param name The socket option + * @param value The value of the socket option. May be null for some + * options. + * + * @throws UnsupportedOperationException if the socket does not support + * the option. + * + * @throws IllegalArgumentException if the value is not valid for + * the option. + * + * @throws IOException if an I/O error occurs, or socket is closed. + * + * @throws SecurityException if a security manager is set and the + * caller does not have any required permission. + * + * @throws NullPointerException if name is null + * + * @see java.net.StandardSocketOptions + */ + public static void setOption(Socket s, SocketOption name, T value) throws IOException + { + s.setOption(name, value); + } + + /** + * Returns the value of a socket option from a {@link java.net.Socket} + * + * @param s the socket + * @param name The socket option + * + * @return The value of the socket option. + * + * @throws UnsupportedOperationException if the socket does not support + * the option. + * + * @throws IOException if an I/O error occurs + * + * @throws SecurityException if a security manager is set and the + * caller does not have any required permission. + * + * @throws NullPointerException if name is null + * + * @see java.net.StandardSocketOptions + */ + public static T getOption(Socket s, SocketOption name) throws IOException + { + return s.getOption(name); + } + + /** + * Sets the value of a socket option on a {@link java.net.ServerSocket} + * + * @param s the socket + * @param name The socket option + * @param value The value of the socket option. + * + * @throws UnsupportedOperationException if the socket does not support + * the option. + * + * @throws IllegalArgumentException if the value is not valid for + * the option. + * + * @throws IOException if an I/O error occurs + * + * @throws NullPointerException if name is null + * + * @throws SecurityException if a security manager is set and the + * caller does not have any required permission. + * + * @see java.net.StandardSocketOptions + */ + public static void setOption(ServerSocket s, SocketOption name, T value) throws IOException + { + s.setOption(name, value); + } + + /** + * Returns the value of a socket option from a {@link java.net.ServerSocket} + * + * @param s the socket + * @param name The socket option + * + * @return The value of the socket option. + * + * @throws UnsupportedOperationException if the socket does not support + * the option. + * + * @throws IOException if an I/O error occurs + * + * @throws NullPointerException if name is null + * + * @throws SecurityException if a security manager is set and the + * caller does not have any required permission. + * + * @see java.net.StandardSocketOptions + */ + public static T getOption(ServerSocket s, SocketOption name) throws IOException + { + return s.getOption(name); + } + + /** + * Sets the value of a socket option on a {@link java.net.DatagramSocket} + * or {@link java.net.MulticastSocket} + * + * @param s the socket + * @param name The socket option + * @param value The value of the socket option. + * + * @throws UnsupportedOperationException if the socket does not support + * the option. + * + * @throws IllegalArgumentException if the value is not valid for + * the option. + * + * @throws IOException if an I/O error occurs + * + * @throws NullPointerException if name is null + * + * @throws SecurityException if a security manager is set and the + * caller does not have any required permission. + * + * @see java.net.StandardSocketOptions + */ + public static void setOption(DatagramSocket s, SocketOption name, T value) throws IOException + { + s.setOption(name, value); + } + + /** + * Returns the value of a socket option from a + * {@link java.net.DatagramSocket} or {@link java.net.MulticastSocket} + * + * @param s the socket + * @param name The socket option + * + * @return The value of the socket option. + * + * @throws UnsupportedOperationException if the socket does not support + * the option. + * + * @throws IOException if an I/O error occurs + * + * @throws NullPointerException if name is null + * + * @throws SecurityException if a security manager is set and the + * caller does not have any required permission. + * + * @see java.net.StandardSocketOptions + */ + public static T getOption(DatagramSocket s, SocketOption name) throws IOException + { + return s.getOption(name); + } + + /** + * Returns a set of {@link java.net.SocketOption}s supported by the + * given socket type. This set may include standard options and also + * non standard extended options. + * + * @param socketType the type of java.net socket + * + * @throws IllegalArgumentException if socketType is not a valid + * socket type from the java.net package. + */ + public static Set> supportedOptions(Class socketType) { + Set> set = options.get(socketType); + if (set == null) { + throw new IllegalArgumentException("unknown socket type"); + } + return set; + } + + private static void checkValueType(Object value, Class type) { + if (!type.isAssignableFrom(value.getClass())) { + String s = "Found: " + value.getClass().toString() + " Expected: " + + type.toString(); + throw new IllegalArgumentException(s); + } + } + + private static volatile boolean checkedReusePort; + private static volatile boolean isReusePortAvailable; + + /** + * Tells whether SO_REUSEPORT is supported. + */ + static boolean isReusePortAvailable() { + if (!checkedReusePort) { + Set> s = new Socket().supportedOptions(); + isReusePortAvailable = s.contains(StandardSocketOptions.SO_REUSEPORT); + checkedReusePort = true; + } + return isReusePortAvailable; + } + + private static Map,Set>> optionSets() { + Map,Set>> options = new HashMap<>(); + boolean flowsupported = PlatformSocketOptions.get().flowSupported(); + boolean reuseportsupported = isReusePortAvailable(); + // Socket + + Set> set = new HashSet<>(); + set.add(StandardSocketOptions.SO_KEEPALIVE); + set.add(StandardSocketOptions.SO_SNDBUF); + set.add(StandardSocketOptions.SO_RCVBUF); + set.add(StandardSocketOptions.SO_REUSEADDR); + if (reuseportsupported) { + set.add(StandardSocketOptions.SO_REUSEPORT); + } + set.add(StandardSocketOptions.SO_LINGER); + set.add(StandardSocketOptions.IP_TOS); + set.add(StandardSocketOptions.TCP_NODELAY); + if (flowsupported) { + set.add(ExtendedSocketOptions.SO_FLOW_SLA); + } + set = Collections.unmodifiableSet(set); + options.put(Socket.class, set); + + // ServerSocket + + set = new HashSet<>(); + set.add(StandardSocketOptions.SO_RCVBUF); + set.add(StandardSocketOptions.SO_REUSEADDR); + if (reuseportsupported) { + set.add(StandardSocketOptions.SO_REUSEPORT); + } + set.add(StandardSocketOptions.IP_TOS); + set = Collections.unmodifiableSet(set); + options.put(ServerSocket.class, set); + + // DatagramSocket + + set = new HashSet<>(); + set.add(StandardSocketOptions.SO_SNDBUF); + set.add(StandardSocketOptions.SO_RCVBUF); + set.add(StandardSocketOptions.SO_REUSEADDR); + if (reuseportsupported) { + set.add(StandardSocketOptions.SO_REUSEPORT); + } + set.add(StandardSocketOptions.IP_TOS); + if (flowsupported) { + set.add(ExtendedSocketOptions.SO_FLOW_SLA); + } + set = Collections.unmodifiableSet(set); + options.put(DatagramSocket.class, set); + + // MulticastSocket + + set = new HashSet<>(); + set.add(StandardSocketOptions.SO_SNDBUF); + set.add(StandardSocketOptions.SO_RCVBUF); + set.add(StandardSocketOptions.SO_REUSEADDR); + if (reuseportsupported) { + set.add(StandardSocketOptions.SO_REUSEPORT); + } + set.add(StandardSocketOptions.IP_TOS); + set.add(StandardSocketOptions.IP_MULTICAST_IF); + set.add(StandardSocketOptions.IP_MULTICAST_TTL); + set.add(StandardSocketOptions.IP_MULTICAST_LOOP); + if (flowsupported) { + set.add(ExtendedSocketOptions.SO_FLOW_SLA); + } + set = Collections.unmodifiableSet(set); + options.put(MulticastSocket.class, set); + + return Collections.unmodifiableMap(options); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/share/classes/jdk/net/package-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/share/classes/jdk/net/package-info.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * Platform specific socket options for the {@code java.net} and {@code java.nio.channels} + * socket classes. + * + * @since 1.8 + */ + +package jdk.net; diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/share/classes/module-info.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/share/classes/module-info.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. 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 jdk.net { + exports jdk.net; +} + diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/solaris/classes/jdk/net/SolarisSocketOptions.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/solaris/classes/jdk/net/SolarisSocketOptions.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package jdk.net; + +import java.net.SocketException; +import java.security.AccessController; +import java.security.PrivilegedAction; +import jdk.net.ExtendedSocketOptions.PlatformSocketOptions; + +class SolarisSocketOptions extends PlatformSocketOptions { + + public SolarisSocketOptions() { } + + @Override native int setFlowOption(int fd, int priority, long bandwidth) + throws SocketException; + + @Override native int getFlowOption(int fd, SocketFlow f) + throws SocketException; + + @Override native boolean flowSupported(); + + private static native void init(); + + static { + AccessController.doPrivileged(new PrivilegedAction() { + public Void run() { + System.loadLibrary("extnet"); + return null; + } + }); + init(); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/solaris/native/libextnet/SolarisSocketOptions.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/solaris/native/libextnet/SolarisSocketOptions.c Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,176 @@ +/* + * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +#include "SolarisSocketOptions.h" + +static jfieldID sf_priority; +static jfieldID sf_bandwidth; + +static int initialized = 0; + +/* + * Class: jdk_net_SolarisSocketOptions + * Method: init + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_jdk_net_SolarisSocketOptions_init + (JNIEnv *env, jclass unused) +{ + if (!initialized) { + jclass c = (*env)->FindClass(env, "jdk/net/SocketFlow"); + CHECK_NULL(c); + sf_priority = (*env)->GetFieldID(env, c, "priority", "I"); + CHECK_NULL(sf_priority); + sf_bandwidth = (*env)->GetFieldID(env, c, "bandwidth", "J"); + CHECK_NULL(sf_bandwidth); + initialized = 1; + } +} + +/** Return the Status value. */ +static jint toStatus(int errval) +{ + switch (errval) { + case 0: return jdk_net_SocketFlow_OK_VALUE; + case EPERM: return jdk_net_SocketFlow_NO_PERMISSION_VALUE; + case ENOTCONN: return jdk_net_SocketFlow_NOT_CONNECTED_VALUE; + case EOPNOTSUPP: return jdk_net_SocketFlow_NOT_SUPPORTED_VALUE; + case EALREADY: return jdk_net_SocketFlow_ALREADY_CREATED_VALUE; + case EINPROGRESS: return jdk_net_SocketFlow_IN_PROGRESS_VALUE; + default: return jdk_net_SocketFlow_OTHER_VALUE; + } +} + +void throwByNameWithLastError + (JNIEnv *env, const char *name, const char *defaultDetail) +{ + char defaultMsg[255]; + sprintf(defaultMsg, "errno: %d, %s", errno, defaultDetail); + JNU_ThrowByNameWithLastError(env, name, defaultMsg); +} + +/* + * Class: jdk_net_SolarisSocketOptions + * Method: setFlowOption0 + * Signature: (IIJ)I + */ +JNIEXPORT jint JNICALL Java_jdk_net_SolarisSocketOptions_setFlowOption + (JNIEnv *env, jobject unused, jint fd, jint priority, jlong bandwidth) +{ + int rv; + sock_flow_props_t props; + memset(&props, 0, sizeof(props)); + props.sfp_version = SOCK_FLOW_PROP_VERSION1; + + if (priority != jdk_net_SocketFlow_UNSET) { + props.sfp_mask |= SFP_PRIORITY; + props.sfp_priority = priority; + } + if (bandwidth > jdk_net_SocketFlow_UNSET) { + props.sfp_mask |= SFP_MAXBW; + props.sfp_maxbw = (uint64_t) bandwidth; + } + + rv = setsockopt(fd, SOL_SOCKET, SO_FLOW_SLA, &props, sizeof(props)); + + if (rv < 0) { + if (errno == ENOPROTOOPT) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + "unsupported socket option"); + } else if (errno == EACCES || errno == EPERM) { + JNU_ThrowByName(env, "java/net/SocketException", "Permission denied"); + } else { + throwByNameWithLastError(env, "java/net/SocketException", + "set option SO_FLOW_SLA failed"); + } + return 0; + } + return toStatus(props.sfp_status); +} + +/* + * Class: jdk_net_SolarisSocketOptions + * Method: getFlowOption0 + * Signature: (ILjdk/net/SocketFlow;)I + */ +JNIEXPORT jint JNICALL Java_jdk_net_SolarisSocketOptions_getFlowOption + (JNIEnv *env, jobject unused, jint fd, jobject flow) +{ + sock_flow_props_t props; + socklen_t sz = sizeof(props); + + int rv = getsockopt(fd, SOL_SOCKET, SO_FLOW_SLA, &props, &sz); + + if (rv < 0) { + if (errno == ENOPROTOOPT) { + JNU_ThrowByName(env, "java/lang/UnsupportedOperationException", + "unsupported socket option"); + } else if (errno == EACCES || errno == EPERM) { + JNU_ThrowByName(env, "java/net/SocketException", "Permission denied"); + } else { + throwByNameWithLastError(env, "java/net/SocketException", + "get option SO_FLOW_SLA failed"); + } + return -1; + } + /* first check status to see if flow exists */ + if (props.sfp_status == 0) { /* OK */ + /* can set the other fields now */ + if (props.sfp_mask & SFP_PRIORITY) { + (*env)->SetIntField(env, flow, sf_priority, props.sfp_priority); + } + if (props.sfp_mask & SFP_MAXBW) { + (*env)->SetLongField(env, flow, sf_bandwidth, + (jlong)props.sfp_maxbw); + } + } + return toStatus(props.sfp_status); +} + +JNIEXPORT jboolean JNICALL Java_jdk_net_SolarisSocketOptions_flowSupported + (JNIEnv *env, jobject unused) +{ + /* Do a simple dummy call, and try to figure out from that */ + sock_flow_props_t props; + int rv, s; + + s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); + if (s < 0) { + return JNI_FALSE; + } + memset(&props, 0, sizeof(props)); + props.sfp_version = SOCK_FLOW_PROP_VERSION1; + props.sfp_mask |= SFP_PRIORITY; + props.sfp_priority = SFP_PRIO_NORMAL; + rv = setsockopt(s, SOL_SOCKET, SO_FLOW_SLA, &props, sizeof(props)); + if (rv != 0 && errno == ENOPROTOOPT) { + rv = JNI_FALSE; + } else { + rv = JNI_TRUE; + } + close(s); + return rv; +} diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.net/solaris/native/libextnet/SolarisSocketOptions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/jdk.net/solaris/native/libextnet/SolarisSocketOptions.h Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. 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. + */ + +#ifndef SOLARIS_SOCKET_OPTIONS_H +#define SOLARIS_SOCKET_OPTIONS_H + +#include +#include +#include +#include +#include + +#include "jni_util.h" +#include "jdk_net_SocketFlow.h" +#include "SolarisSocketOptions.h" +#include "jdk_net_SolarisSocketOptions.h" + +#ifndef SO_FLOW_SLA +#define SO_FLOW_SLA 0x1018 + +#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 +#pragma pack(4) +#endif + +/* + * Used with the setsockopt(SO_FLOW_SLA, ...) call to set + * per socket service level properties. + * When the application uses per-socket API, we will enforce the properties + * on both outbound and inbound packets. + * + * For now, only priority and maxbw are supported in SOCK_FLOW_PROP_VERSION1. + */ +typedef struct sock_flow_props_s { + int sfp_version; + uint32_t sfp_mask; + int sfp_priority; /* flow priority */ + uint64_t sfp_maxbw; /* bandwidth limit in bps */ + int sfp_status; /* flow create status for getsockopt */ +} sock_flow_props_t; + +#define SOCK_FLOW_PROP_VERSION1 1 + +/* bit mask values for sfp_mask */ +#define SFP_MAXBW 0x00000001 /* Flow Bandwidth Limit */ +#define SFP_PRIORITY 0x00000008 /* Flow priority */ + +/* possible values for sfp_priority */ +#define SFP_PRIO_NORMAL 1 +#define SFP_PRIO_HIGH 2 + +#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4 +#pragma pack() +#endif /* _LONG_LONG_ALIGNMENT */ + +#endif /* SO_FLOW_SLA */ + +#endif /* SOLARIS_SOCKET_OPTIONS_H */ diff -r ec60c3290242 -r b1a0f119f766 jdk/src/jdk.policytool/share/classes/module-info.java --- a/jdk/src/jdk.policytool/share/classes/module-info.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/src/jdk.policytool/share/classes/module-info.java Thu Apr 28 09:38:19 2016 -0700 @@ -28,6 +28,7 @@ requires java.logging; requires java.management; requires java.sql; + requires jdk.net; requires java.security.jgss; requires jdk.security.jgss; } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/ProblemList.txt diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/Logger/custom/CustomLoggerTest.java --- a/jdk/test/java/lang/System/Logger/custom/CustomLoggerTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/Logger/custom/CustomLoggerTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -46,6 +46,8 @@ import java.lang.System.Logger; import java.lang.System.Logger.Level; import java.util.stream.Stream; +import java.lang.reflect.Module; +import java.security.AllPermission; /** * @test @@ -70,6 +72,12 @@ return new AtomicBoolean(false); } }; + static final ThreadLocal allowAll = new ThreadLocal() { + @Override + protected AtomicBoolean initialValue() { + return new AtomicBoolean(false); + } + }; public static class MyBundle extends ResourceBundle { @@ -241,7 +249,7 @@ } @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { // We should check the permission to obey the API contract, but // what happens if we don't? // This is the main difference compared with what we test in @@ -251,8 +259,13 @@ sm.checkPermission(SimplePolicy.LOGGERFINDER_PERMISSION); } - PrivilegedAction pa = () -> caller.getClassLoader(); - ClassLoader callerLoader = AccessController.doPrivileged(pa); + final boolean before = allowAll.get().getAndSet(true); + final ClassLoader callerLoader; + try { + callerLoader = caller.getClassLoader(); + } finally { + allowAll.get().set(before); + } if (callerLoader == null) { return system.computeIfAbsent(name, (n) -> new LoggerImpl(n)); } else { @@ -267,7 +280,7 @@ static void setSecurityManager() { if (System.getSecurityManager() == null) { - Policy.setPolicy(new SimplePolicy(allowControl)); + Policy.setPolicy(new SimplePolicy(allowControl, allowAll)); System.setSecurityManager(new SecurityManager()); } } @@ -284,9 +297,9 @@ BaseLoggerFinder provider = BaseLoggerFinder.class.cast(LoggerFinder.getLoggerFinder()); BaseLoggerFinder.LoggerImpl appSink = - BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", CustomLoggerTest.class)); + BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", CustomLoggerTest.class.getModule())); BaseLoggerFinder.LoggerImpl sysSink = - BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class)); + BaseLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class.getModule())); Stream.of(args).map(TestCases::valueOf).forEach((testCase) -> { @@ -695,34 +708,46 @@ static final RuntimePermission LOGGERFINDER_PERMISSION = new RuntimePermission("loggerFinder"); final Permissions permissions; + final Permissions controlPermissions; final Permissions allPermissions; final ThreadLocal allowControl; - public SimplePolicy(ThreadLocal allowControl) { + final ThreadLocal allowAll; + public SimplePolicy(ThreadLocal allowControl, ThreadLocal allowAll) { this.allowControl = allowControl; + this.allowAll = allowAll; permissions = new Permissions(); // these are used for configuring the test itself... + controlPermissions = new Permissions(); + controlPermissions.add(LOGGERFINDER_PERMISSION); + + // these are used for simulating a doPrivileged call from + // a class in the BCL allPermissions = new Permissions(); - allPermissions.add(LOGGERFINDER_PERMISSION); + allPermissions.add(new AllPermission()); + + } + + Permissions permissions() { + if (allowAll.get().get()) return allPermissions; + if (allowControl.get().get()) return controlPermissions; + return permissions; } @Override public boolean implies(ProtectionDomain domain, Permission permission) { - if (allowControl.get().get()) return allPermissions.implies(permission); - return permissions.implies(permission); + return permissions().implies(permission); } @Override public PermissionCollection getPermissions(CodeSource codesource) { - return new PermissionsBuilder().addAll(allowControl.get().get() - ? allPermissions : permissions).toPermissions(); + return new PermissionsBuilder().addAll(permissions()).toPermissions(); } @Override public PermissionCollection getPermissions(ProtectionDomain domain) { - return new PermissionsBuilder().addAll(allowControl.get().get() - ? allPermissions : permissions).toPermissions(); + return new PermissionsBuilder().addAll(permissions()).toPermissions(); } } } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinder.java --- a/jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinder.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinder.java Thu Apr 28 09:38:19 2016 -0700 @@ -25,13 +25,14 @@ import java.security.PrivilegedAction; import java.lang.System.LoggerFinder; import java.lang.System.Logger; +import java.lang.reflect.Module; public class BaseLoggerFinder extends LoggerFinder implements TestLoggerFinder { static final RuntimePermission LOGGERFINDER_PERMISSION = new RuntimePermission("loggerFinder"); @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(LOGGERFINDER_PERMISSION); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinderTest.java --- a/jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinderTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/BaseLoggerFinderTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -182,8 +182,8 @@ TestLoggerFinder.LoggerImpl appLogger1 = null; try { appLogger1 = - TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerFinderTest.class)); - loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", BaseLoggerFinderTest.class)"); + TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerFinderTest.class.getModule())); + loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", BaseLoggerFinderTest.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a logger without permission"); } @@ -199,8 +199,8 @@ allowControl.get().set(true); try { appLogger1 = - TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerFinderTest.class)); - loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", BaseLoggerFinderTest.class)"); + TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerFinderTest.class.getModule())); + loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", BaseLoggerFinderTest.class.getModule())"); } finally { allowControl.get().set(old); } @@ -208,8 +208,8 @@ TestLoggerFinder.LoggerImpl sysLogger1 = null; try { - sysLogger1 = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class)); - loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class)"); + sysLogger1 = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class.getModule())); + loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -224,8 +224,8 @@ final boolean old = allowControl.get().get(); allowControl.get().set(true); try { - sysLogger1 = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class)); - loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class)"); + sysLogger1 = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class.getModule())); + loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())"); } finally { allowControl.get().set(old); } @@ -254,8 +254,8 @@ // callers and non system callers Logger appLogger2 = null; try { - appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, BaseLoggerFinderTest.class); - loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, BaseLoggerFinderTest.class)"); + appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, BaseLoggerFinderTest.class.getModule()); + loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, BaseLoggerFinderTest.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a logger without permission"); } @@ -270,8 +270,8 @@ final boolean old = allowControl.get().get(); allowControl.get().set(true); try { - appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, BaseLoggerFinderTest.class); - loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, BaseLoggerFinderTest.class)"); + appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, BaseLoggerFinderTest.class.getModule()); + loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, BaseLoggerFinderTest.class.getModule())"); } finally { allowControl.get().set(old); } @@ -279,8 +279,8 @@ Logger sysLogger2 = null; try { - sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class); - loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class)"); + sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule()); + loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -295,8 +295,8 @@ final boolean old = allowControl.get().get(); allowControl.get().set(true); try { - sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class); - loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class))"); + sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule()); + loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule()))"); } finally { allowControl.get().set(old); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/TestLoggerFinder.java --- a/jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/TestLoggerFinder.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/BaseLoggerFinderTest/TestLoggerFinder.java Thu Apr 28 09:38:19 2016 -0700 @@ -30,6 +30,7 @@ import java.util.concurrent.atomic.AtomicLong; import java.util.function.Supplier; import java.lang.System.Logger; +import java.lang.reflect.Module; /** * What our test provider needs to implement. @@ -176,6 +177,6 @@ } } - public Logger getLogger(String name, Class caller); - public Logger getLocalizedLogger(String name, ResourceBundle bundle, Class caller); + public Logger getLogger(String name, Module caller); + public Logger getLocalizedLogger(String name, ResourceBundle bundle, Module caller); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/DefaultLoggerFinderTest/DefaultLoggerFinderTest.java --- a/jdk/test/java/lang/System/LoggerFinder/DefaultLoggerFinderTest/DefaultLoggerFinderTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/DefaultLoggerFinderTest/DefaultLoggerFinderTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -364,8 +364,8 @@ Logger appLogger1 = null; try { - appLogger1 = provider.getLogger("foo", DefaultLoggerFinderTest.class); - loggerDescMap.put(appLogger1, "provider.getApplicationLogger(\"foo\")"); + appLogger1 = provider.getLogger("foo", DefaultLoggerFinderTest.class.getModule()); + loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", DefaultLoggerFinderTest.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a logger without permission"); } @@ -380,8 +380,8 @@ boolean old = allowControl.get().get(); allowControl.get().set(true); try { - appLogger1 =provider.getLogger("foo", DefaultLoggerFinderTest.class); - loggerDescMap.put(appLogger1, "provider.getApplicationLogger(\"foo\")"); + appLogger1 =provider.getLogger("foo", DefaultLoggerFinderTest.class.getModule()); + loggerDescMap.put(appLogger1, "provider.getLogger(\"foo\", DefaultLoggerFinderTest.class.getModule())"); } finally { allowControl.get().set(old); } @@ -389,8 +389,8 @@ Logger sysLogger1 = null; try { - sysLogger1 = provider.getLogger("foo", Thread.class); - loggerDescMap.put(sysLogger1, "provider.getSystemLogger(\"foo\")"); + sysLogger1 = provider.getLogger("foo", Thread.class.getModule()); + loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -405,8 +405,8 @@ boolean old = allowControl.get().get(); allowControl.get().set(true); try { - sysLogger1 = provider.getLogger("foo", Thread.class); - loggerDescMap.put(sysLogger1, "provider.getSystemLogger(\"foo\")"); + sysLogger1 = provider.getLogger("foo", Thread.class.getModule()); + loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())"); } finally { allowControl.get().set(old); } @@ -417,8 +417,8 @@ Logger appLogger2 = null; try { - appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, DefaultLoggerFinderTest.class); - loggerDescMap.put(appLogger2, "provider.getLocalizedApplicationLogger(\"foo\", loggerBundle)"); + appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, DefaultLoggerFinderTest.class.getModule()); + loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, DefaultLoggerFinderTest.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a logger without permission"); } @@ -433,8 +433,8 @@ boolean old = allowControl.get().get(); allowControl.get().set(true); try { - appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, DefaultLoggerFinderTest.class); - loggerDescMap.put(appLogger2, "provider.getLocalizedApplicationLogger(\"foo\", loggerBundle)"); + appLogger2 = provider.getLocalizedLogger("foo", loggerBundle, DefaultLoggerFinderTest.class.getModule()); + loggerDescMap.put(appLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, DefaultLoggerFinderTest.class.getModule())"); } finally { allowControl.get().set(old); } @@ -442,8 +442,8 @@ Logger sysLogger2 = null; try { - sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class); - loggerDescMap.put(sysLogger2, "provider.getLocalizedSystemLogger(\"foo\", loggerBundle)"); + sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule()); + loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -458,8 +458,8 @@ boolean old = allowControl.get().get(); allowControl.get().set(true); try { - sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class); - loggerDescMap.put(sysLogger2, "provider.getLocalizedSystemLogger(\"foo\", loggerBundle)"); + sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule()); + loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule())"); } finally { allowControl.get().set(old); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/BaseDefaultLoggerFinderTest/BaseDefaultLoggerFinderTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/BaseDefaultLoggerFinderTest/BaseDefaultLoggerFinderTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/BaseDefaultLoggerFinderTest/BaseDefaultLoggerFinderTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -55,6 +55,7 @@ import jdk.internal.logger.DefaultLoggerFinder; import jdk.internal.logger.SimpleConsoleLogger; import sun.util.logging.PlatformLogger; +import java.lang.reflect.Module; /** * @test @@ -112,10 +113,10 @@ public final static AtomicLong sequencer = new AtomicLong(); - public Logger getLogger(String name, Class caller); - public Logger getLocalizedLogger(String name, ResourceBundle bundle, Class caller); - void setLevel(Logger logger, Level level, Class caller); - void setLevel(Logger logger, PlatformLogger.Level level, Class caller); + public Logger getLogger(String name, Module caller); + public Logger getLocalizedLogger(String name, ResourceBundle bundle, Module caller); + void setLevel(Logger logger, Level level, Module caller); + void setLevel(Logger logger, PlatformLogger.Level level, Module caller); PlatformLogger.Bridge asPlatformLoggerBridge(Logger logger); } @@ -130,7 +131,7 @@ } @Override - public void setLevel(Logger logger, Level level, Class caller) { + public void setLevel(Logger logger, Level level, Module caller) { PrivilegedAction pa = () -> { setLevel(logger, PlatformLogger.toPlatformLevel(level), caller); return null; @@ -139,7 +140,7 @@ } @Override - public void setLevel(Logger logger, PlatformLogger.Level level, Class caller) { + public void setLevel(Logger logger, PlatformLogger.Level level, Module caller) { PrivilegedAction pa = () -> demandLoggerFor(logger.getName(), caller); Logger impl = AccessController.doPrivileged(pa); SimpleConsoleLogger.class.cast(impl) @@ -606,11 +607,12 @@ String name, ResourceBundle loggerBundle, Logger logger, - Class caller) { + Class callerClass) { System.out.println("Testing " + loggerDescMap.get(logger) + " [" + logger +"]"); AtomicLong sequencer = TestLoggerFinder.sequencer; + Module caller = callerClass.getModule(); Foo foo = new Foo(); String fooMsg = foo.toString(); for (Level loggerLevel : Level.values()) { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/BaseLoggerBridgeTest/BaseLoggerBridgeTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/BaseLoggerBridgeTest/BaseLoggerBridgeTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/BaseLoggerBridgeTest/BaseLoggerBridgeTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -47,6 +47,7 @@ import java.lang.System.Logger; import java.lang.System.Logger.Level; import java.util.stream.Stream; +import java.lang.reflect.Module; /** * @test @@ -209,8 +210,6 @@ return Arrays.deepToString(toArray(false)); } - - @Override public boolean equals(Object obj) { return obj instanceof LogEvent @@ -342,15 +341,15 @@ } - public Logger getLogger(String name, Class caller); - public Logger getLocalizedLogger(String name, ResourceBundle bundle, Class caller); + public Logger getLogger(String name, Module caller); + public Logger getLocalizedLogger(String name, ResourceBundle bundle, Module caller); } public static class BaseLoggerFinder extends LoggerFinder implements TestLoggerFinder { static final RuntimePermission LOGGERFINDER_PERMISSION = new RuntimePermission("loggerFinder"); @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(LOGGERFINDER_PERMISSION); @@ -375,7 +374,7 @@ } } - static Logger getLogger(String name, Class caller) { + static Logger getLogger(String name, Module caller) { boolean old = allowAll.get().get(); allowAccess.get().set(true); try { @@ -465,7 +464,7 @@ TestLoggerFinder.LoggerImpl appSink = null; try { - appSink = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerBridgeTest.class)); + appSink = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerBridgeTest.class.getModule())); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -480,7 +479,7 @@ boolean old = allowControl.get().get(); allowControl.get().set(true); try { - appSink = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerBridgeTest.class)); + appSink = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", BaseLoggerBridgeTest.class.getModule())); } finally { allowControl.get().set(old); } @@ -489,7 +488,7 @@ TestLoggerFinder.LoggerImpl sysSink = null; try { - sysSink = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class)); + sysSink = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class.getModule())); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -527,13 +526,13 @@ Logger sysLogger1 = null; try { - sysLogger1 = getLogger("foo", Thread.class); + sysLogger1 = getLogger("foo", Thread.class.getModule()); loggerDescMap.put(sysLogger1, - "jdk.internal.logger.LazyLoggers.getLogger(\"foo\", Thread.class)"); + "jdk.internal.logger.LazyLoggers.getLogger(\"foo\", Thread.class.getModule())"); if (!hasRequiredPermissions) { // check that the provider would have thrown an exception - provider.getLogger("foo", Thread.class); + provider.getLogger("foo", Thread.class.getModule()); throw new RuntimeException("Managed to obtain a system logger without permission"); } } catch (AccessControlException acx) { @@ -572,8 +571,8 @@ Logger sysLogger2 = null; try { - sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class); - loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class)"); + sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule()); + loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/BasePlatformLoggerTest/BasePlatformLoggerTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/BasePlatformLoggerTest/BasePlatformLoggerTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/BasePlatformLoggerTest/BasePlatformLoggerTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -47,6 +47,7 @@ import java.security.AccessControlException; import java.util.stream.Stream; import sun.util.logging.PlatformLogger; +import java.lang.reflect.Module; /** * @test @@ -327,12 +328,12 @@ } } - public Logger getLogger(String name, Class caller); + public Logger getLogger(String name, Module caller); } public static class BaseLoggerFinder extends LoggerFinder implements TestLoggerFinder { @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(LOGGERFINDER_PERMISSION); @@ -433,7 +434,7 @@ try { allowControl.get().set(true); appSink = TestLoggerFinder.LoggerImpl.class.cast( - provider.getLogger("foo", BasePlatformLoggerTest.class)); + provider.getLogger("foo", BasePlatformLoggerTest.class.getModule())); } finally { allowControl.get().set(before); } @@ -442,7 +443,8 @@ before = allowControl.get().get(); try { allowControl.get().set(true); - sysSink = TestLoggerFinder.LoggerImpl.class.cast(provider.getLogger("foo", Thread.class)); + sysSink = TestLoggerFinder.LoggerImpl.class.cast( + provider.getLogger("foo", Thread.class.getModule())); } finally { allowControl.get().set(before); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerAPIsTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerAPIsTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerAPIsTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -30,7 +30,7 @@ import java.util.List; import java.util.ResourceBundle; import java.util.Set; - +import java.lang.reflect.Module; import jdk.internal.logger.BootstrapLogger; import jdk.internal.logger.LazyLoggers; @@ -69,7 +69,7 @@ } final Logger LOGGER = - LazyLoggers.getLogger("foo.bar", Thread.class); + LazyLoggers.getLogger("foo.bar", Thread.class.getModule()); final sun.util.logging.PlatformLogger.Level PLATFORM_LEVEL = sun.util.logging.PlatformLogger.Level.SEVERE; final MyResources BUNDLE = new MyResources(); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/BootstrapLogger/BootstrapLoggerTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -43,6 +43,7 @@ import java.util.stream.Stream; import jdk.internal.logger.BootstrapLogger; import jdk.internal.logger.LazyLoggers; +import java.lang.reflect.Module; /* * @test @@ -105,7 +106,7 @@ if (BootstrapLogger.isBooted()) { throw new RuntimeException("VM should not be booted!"); } - Logger logger = LazyLoggers.getLogger("foo.bar", Thread.class); + Logger logger = LazyLoggers.getLogger("foo.bar", Thread.class.getModule()); if (test != TestCase.NO_SECURITY) { LogStream.err.println("Setting security manager"); @@ -261,7 +262,7 @@ SimplePolicy.allowAll.set(Boolean.TRUE); try { bazbaz = java.lang.System.LoggerFinder - .getLoggerFinder().getLogger("foo.bar.baz.baz", BootstrapLoggerTest.class); + .getLoggerFinder().getLogger("foo.bar.baz.baz", BootstrapLoggerTest.class.getModule()); } finally { SimplePolicy.allowAll.set(Boolean.FALSE); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/LoggerBridgeTest/LoggerBridgeTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -51,6 +51,7 @@ import java.lang.System.Logger.Level; import java.util.stream.Stream; import sun.util.logging.PlatformLogger; +import java.lang.reflect.Module; /** * @test @@ -164,6 +165,7 @@ null, null, level, bundle, key, thrown, params); } + public static LogEvent of(long sequenceNumber, boolean isLoggable, String name, sun.util.logging.PlatformLogger.Level level, ResourceBundle bundle, @@ -231,7 +233,7 @@ try { // Preload classes before the security manager is on. providerClass = ClassLoader.getSystemClassLoader().loadClass("LoggerBridgeTest$LogProducerFinder"); - ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass); + ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass.getModule()); } catch (Exception ex) { throw new ExceptionInInitializerError(ex); } @@ -415,7 +417,7 @@ } @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(LOGGERFINDER_PERMISSION); @@ -430,6 +432,15 @@ } } + static ClassLoader getClassLoader(Module m) { + final boolean before = allowAll.get().getAndSet(true); + try { + return m.getClassLoader(); + } finally { + allowAll.get().set(before); + } + } + static final sun.util.logging.PlatformLogger.Level[] julLevels = { sun.util.logging.PlatformLogger.Level.ALL, sun.util.logging.PlatformLogger.Level.FINEST, @@ -497,14 +508,14 @@ try { Class bridgeClass = Class.forName("jdk.internal.logger.LazyLoggers"); lazyGetLogger = bridgeClass.getDeclaredMethod("getLogger", - String.class, Class.class); + String.class, Module.class); lazyGetLogger.setAccessible(true); } catch (Throwable ex) { throw new ExceptionInInitializerError(ex); } } - static Logger getLogger(LoggerFinder provider, String name, Class caller) { + static Logger getLogger(LoggerFinder provider, String name, Module caller) { Logger logger; try { logger = Logger.class.cast(lazyGetLogger.invoke(null, name, caller)); @@ -522,14 +533,14 @@ // The method above does not throw exception... // call the provider here to verify that an exception would have // been thrown by the provider. - if (logger != null && caller == Thread.class) { + if (logger != null && caller == Thread.class.getModule()) { Logger log = provider.getLogger(name, caller); } return logger; } - static Logger getLogger(LoggerFinder provider, String name, ResourceBundle bundle, Class caller) { - if (caller.getClassLoader() != null) { + static Logger getLogger(LoggerFinder provider, String name, ResourceBundle bundle, Module caller) { + if (getClassLoader(caller) != null) { return System.getLogger(name,bundle); } else { return provider.getLocalizedLogger(name, bundle, caller); @@ -614,12 +625,12 @@ Logger appLogger1 = System.getLogger("foo"); - loggerDescMap.put(appLogger1, "LogProducer.getApplicationLogger(\"foo\")"); + loggerDescMap.put(appLogger1, "System.getLogger(\"foo\")"); Logger sysLogger1 = null; try { - sysLogger1 = getLogger(provider, "foo", Thread.class); - loggerDescMap.put(sysLogger1, "LogProducer.getSystemLogger(\"foo\")"); + sysLogger1 = getLogger(provider, "foo", Thread.class.getModule()); + loggerDescMap.put(sysLogger1, "provider.getLogger(\"foo\", Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -636,12 +647,12 @@ Logger appLogger2 = System.getLogger("foo", loggerBundle); - loggerDescMap.put(appLogger2, "LogProducer.getApplicationLogger(\"foo\", loggerBundle)"); + loggerDescMap.put(appLogger2, "System.getLogger(\"foo\", loggerBundle)"); Logger sysLogger2 = null; try { - sysLogger2 = getLogger(provider, "foo", loggerBundle, Thread.class); - loggerDescMap.put(sysLogger2, "provider.getSystemLogger(\"foo\", loggerBundle)"); + sysLogger2 = getLogger(provider, "foo", loggerBundle, Thread.class.getModule()); + loggerDescMap.put(sysLogger2, "provider.getLogger(\"foo\", loggerBundle, Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -671,9 +682,9 @@ allowControl.get().set(true); try { appSink = LogProducerFinder.LoggerImpl.class.cast( - provider.getLogger("foo", LoggerBridgeTest.class)); + provider.getLogger("foo", LoggerBridgeTest.class.getModule())); sysSink = LogProducerFinder.LoggerImpl.class.cast( - provider.getLogger("foo", Thread.class)); + provider.getLogger("foo", Thread.class.getModule())); } finally { allowControl.get().set(old); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/LoggerFinderLoaderTest/LoggerFinderLoaderTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/LoggerFinderLoaderTest/LoggerFinderLoaderTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/LoggerFinderLoaderTest/LoggerFinderLoaderTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -53,6 +53,7 @@ import java.util.ServiceLoader; import java.util.concurrent.atomic.AtomicReference; import jdk.internal.logger.SimpleConsoleLogger; +import java.lang.reflect.Module; /** * @test @@ -166,8 +167,8 @@ } - public Logger getLogger(String name, Class caller); - public Logger getLocalizedLogger(String name, ResourceBundle bundle, Class caller); + public Logger getLogger(String name, Module caller); + public Logger getLocalizedLogger(String name, ResourceBundle bundle, Module caller); } public static class BaseLoggerFinder extends LoggerFinder implements TestLoggerFinder { @@ -187,7 +188,7 @@ @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(LOGGERFINDER_PERMISSION); @@ -210,7 +211,7 @@ throw new ServiceConfigurationError("Should not come here"); } @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { throw new ServiceConfigurationError("Should not come here"); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/PlatformLoggerBridgeTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/PlatformLoggerBridgeTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/PlatformLoggerBridgeTest/PlatformLoggerBridgeTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -49,6 +49,7 @@ import java.lang.System.Logger.Level; import java.util.stream.Stream; import sun.util.logging.PlatformLogger; +import java.lang.reflect.Module; /** * @test @@ -94,7 +95,7 @@ try { // Preload classes before the security manager is on. providerClass = ClassLoader.getSystemClassLoader().loadClass("PlatformLoggerBridgeTest$LogProducerFinder"); - ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass); + ((LoggerFinder)providerClass.newInstance()).getLogger("foo", providerClass.getModule()); } catch (Exception ex) { throw new ExceptionInInitializerError(ex); } @@ -415,7 +416,7 @@ } @Override - public Logger getLogger(String name, Class caller) { + public Logger getLogger(String name, Module caller) { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPermission(LOGGERFINDER_PERMISSION); @@ -598,7 +599,7 @@ allowControl.get().set(true); try { sysSink = LogProducerFinder.LoggerImpl.class.cast( - provider.getLogger("foo", Thread.class)); + provider.getLogger("foo", Thread.class.getModule())); } finally { allowControl.get().set(old); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/api/LoggerFinderAPITest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/api/LoggerFinderAPITest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/api/LoggerFinderAPITest.java Thu Apr 28 09:38:19 2016 -0700 @@ -469,12 +469,12 @@ errors.append(test.testGetLoggerOverriddenOnSpi()); java.lang.System.Logger julLogger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLogger("foo", LoggerFinderAPITest.class); + .getLogger("foo", LoggerFinderAPITest.class.getModule()); errors.append(test.testDefaultJULLogger(julLogger)); if (errors.length() > 0) throw new RuntimeException(errors.toString()); java.lang.System.Logger julSystemLogger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLogger("bar", Thread.class); + .getLogger("bar", Thread.class.getModule()); errors.append(test.testDefaultJULLogger(julSystemLogger)); if (errors.length() > 0) throw new RuntimeException(errors.toString()); java.lang.System.Logger julLocalizedLogger = @@ -482,7 +482,7 @@ System.getLogger("baz", bundleLocalized); java.lang.System.Logger julLocalizedSystemLogger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLocalizedLogger("oof", bundleLocalized, Thread.class); + .getLocalizedLogger("oof", bundleLocalized, Thread.class.getModule()); final String error = errors.toString(); if (!error.isEmpty()) throw new RuntimeException(error); for (java.lang.System.Logger logger : new java.lang.System.Logger[] { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/internal/backend/LoggerFinderBackendTest.java --- a/jdk/test/java/lang/System/LoggerFinder/internal/backend/LoggerFinderBackendTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/internal/backend/LoggerFinderBackendTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -77,6 +77,7 @@ import java.util.logging.LogRecord; import java.util.logging.Logger; import sun.util.logging.internal.LoggingProviderImpl; +import java.lang.reflect.Module; /** * @author danielfuchs @@ -1506,7 +1507,7 @@ Logger getBackendLogger(String name) { if (isSystem) { return LoggingProviderImpl.getLogManagerAccess().demandLoggerFor( - LogManager.getLogManager(), name, Thread.class); + LogManager.getLogManager(), name, Thread.class.getModule()); } else { return Logger.getLogger(name); } @@ -1699,7 +1700,7 @@ Collections.synchronizedMap(new HashMap<>()); @Override - public java.lang.System.Logger getLogger(String name, Class caller) { + public java.lang.System.Logger getLogger(String name, Module caller) { ClassLoader callerLoader = caller.getClassLoader(); if (callerLoader == null) { systemLoggers.putIfAbsent(name, new CustomLogger(name)); @@ -1827,8 +1828,8 @@ public void setLevel(java.lang.System.Logger logger, Level level) { final CustomLoggerFinder.CustomLogger l = (CustomLoggerFinder.CustomLogger) - (isSystem ? provider.getLogger(logger.getName(), Thread.class) : - provider.getLogger(logger.getName(), LoggerFinderBackendTest.class)); + (isSystem ? provider.getLogger(logger.getName(), Thread.class.getModule()) : + provider.getLogger(logger.getName(), LoggerFinderBackendTest.class.getModule())); l.setLevel(provider.fromJul(level)); } @Override @@ -1840,8 +1841,8 @@ CustomLoggerFinder.CustomLevel getLevel(java.lang.System.Logger logger) { final CustomLoggerFinder.CustomLogger l = (CustomLoggerFinder.CustomLogger) - (isSystem ? provider.getLogger(logger.getName(), Thread.class) : - provider.getLogger(logger.getName(), LoggerFinderBackendTest.class)); + (isSystem ? provider.getLogger(logger.getName(), Thread.class.getModule()) : + provider.getLogger(logger.getName(), LoggerFinderBackendTest.class.getModule())); return l.level; } @@ -1962,7 +1963,7 @@ try { Class lazyLoggers = jdk.internal.logger.LazyLoggers.class; getLazyLogger = lazyLoggers.getMethod("getLazyLogger", - String.class, Class.class); + String.class, Module.class); getLazyLogger.setAccessible(true); Class loggerFinderLoader = Class.forName("java.lang.System$LoggerFinder"); @@ -1973,7 +1974,7 @@ } } - static java.lang.System.Logger getSystemLogger(String name, Class caller) throws Exception { + static java.lang.System.Logger getSystemLogger(String name, Module caller) throws Exception { try { return java.lang.System.Logger.class.cast(getLazyLogger.invoke(null, name, caller)); } catch (InvocationTargetException x) { @@ -1986,7 +1987,7 @@ } } static java.lang.System.Logger getSystemLogger(String name, - ResourceBundle bundle, Class caller) throws Exception { + ResourceBundle bundle, Module caller) throws Exception { try { LoggerFinder provider = LoggerFinder.class.cast(accessLoggerFinder.invoke(null)); return provider.getLocalizedLogger(name, bundle, caller); @@ -2047,14 +2048,14 @@ final BackendTester tester = factory.createBackendTester(false); final java.lang.System.Logger logger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLogger("foo", LoggerFinderBackendTest.class); + .getLogger("foo", LoggerFinderBackendTest.class.getModule()); testLogger(tester, logger, nb); // Test a simple system logger with JUL backend final java.lang.System.Logger system = java.lang.System.LoggerFinder.getLoggerFinder() - .getLogger("bar", Thread.class); + .getLogger("bar", Thread.class.getModule()); final BackendTester systemTester = factory.createBackendTester(true); testLogger(systemTester, system, nb); @@ -2062,7 +2063,7 @@ // JUL backend final java.lang.System.Logger noBundleLogger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLocalizedLogger("baz", null, LoggerFinderBackendTest.class); + .getLocalizedLogger("baz", null, LoggerFinderBackendTest.class.getModule()); final BackendTester noBundleTester = factory.createBackendTester(false, spiLoggerClass); testLogger(noBundleTester, noBundleLogger, nb); @@ -2071,7 +2072,7 @@ // backend final java.lang.System.Logger noBundleSysLogger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLocalizedLogger("oof", null, Thread.class); + .getLocalizedLogger("oof", null, Thread.class.getModule()); final BackendTester noBundleSysTester = factory.createBackendTester(true, spiLoggerClass); testLogger(noBundleSysTester, noBundleSysLogger, nb); @@ -2085,14 +2086,14 @@ System.out.println("System.Loggers.getLogger(\"baz\", null): got expected " + x); } final java.lang.System.Logger noBundleExtensionLogger = - getSystemLogger("baz", null, LoggerFinderBackendTest.class); + getSystemLogger("baz", null, LoggerFinderBackendTest.class.getModule()); final BackendTester noBundleExtensionTester = factory.createBackendTester(false, jdkLoggerClass); testLogger(noBundleExtensionTester, noBundleExtensionLogger, nb); // Test a simple system logger with JUL backend final java.lang.System.Logger sysExtensionLogger = - getSystemLogger("oof", Thread.class); + getSystemLogger("oof", Thread.class.getModule()); final BackendTester sysExtensionTester = factory.createBackendTester(true, jdkLoggerClass); testLogger(sysExtensionTester, sysExtensionLogger, nb); @@ -2100,7 +2101,7 @@ // Test a localized system logger with null resource bundle and JUL // backend final java.lang.System.Logger noBundleSysExtensionLogger = - getSystemLogger("oof", null, Thread.class); + getSystemLogger("oof", null, Thread.class.getModule()); final BackendTester noBundleSysExtensionTester = factory.createBackendTester(true, jdkLoggerClass); testLogger(noBundleSysExtensionTester, noBundleSysExtensionLogger, nb); @@ -2127,7 +2128,7 @@ ResourceBundle.getBundle(ResourceBundeLocalized.class.getName()); final java.lang.System.Logger bundleLogger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLocalizedLogger("toto", bundle, LoggerFinderBackendTest.class); + .getLocalizedLogger("toto", bundle, LoggerFinderBackendTest.class.getModule()); final BackendTester bundleTester = factory.createBackendTester(false, spiLoggerClass, bundle); testLogger(bundleTester, bundleLogger, nb); @@ -2135,7 +2136,7 @@ // Test a localized system logger with resource bundle and JUL backend final java.lang.System.Logger bundleSysLogger = java.lang.System.LoggerFinder.getLoggerFinder() - .getLocalizedLogger("titi", bundle, Thread.class); + .getLocalizedLogger("titi", bundle, Thread.class.getModule()); final BackendTester bundleSysTester = factory.createBackendTester(true, spiLoggerClass, bundle); testLogger(bundleSysTester, bundleSysLogger, nb); @@ -2151,7 +2152,7 @@ // Test a localized Jdk system logger with resource bundle and JUL // backend final java.lang.System.Logger bundleExtensionSysLogger = - getSystemLogger("titu", bundle, Thread.class); + getSystemLogger("titu", bundle, Thread.class.getModule()); final BackendTester bundleExtensionSysTester = factory.createBackendTester(true, jdkLoggerClass, bundle); testLogger(bundleExtensionSysTester, bundleExtensionSysLogger, nb); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/jdk/DefaultLoggerBridgeTest/DefaultLoggerBridgeTest.java --- a/jdk/test/java/lang/System/LoggerFinder/jdk/DefaultLoggerBridgeTest/DefaultLoggerBridgeTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/jdk/DefaultLoggerBridgeTest/DefaultLoggerBridgeTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -48,6 +48,7 @@ import java.lang.System.Logger; import java.util.stream.Stream; import sun.util.logging.internal.LoggingProviderImpl; +import java.lang.reflect.Module; /** * @test @@ -246,7 +247,7 @@ } } - static Logger getLogger(String name, Class caller) { + static Logger getLogger(String name, Module caller) { boolean old = allowAccess.get().get(); allowAccess.get().set(true); try { @@ -311,8 +312,8 @@ ResourceBundle.getBundle(MyLoggerBundle.class.getName()); final Map loggerDescMap = new HashMap<>(); - Logger sysLogger1a = getLogger("foo", Thread.class); - loggerDescMap.put(sysLogger1a, "jdk.internal.logger.LazyLoggers.getLogger(\"foo\", Thread.class)"); + Logger sysLogger1a = getLogger("foo", Thread.class.getModule()); + loggerDescMap.put(sysLogger1a, "jdk.internal.logger.LazyLoggers.getLogger(\"foo\", Thread.class.getModule())"); Logger appLogger1 = System.getLogger("foo"); loggerDescMap.put(appLogger1, "System.getLogger(\"foo\")"); @@ -341,9 +342,9 @@ Logger sysLogger1b = null; try { - sysLogger1b = provider.getLogger("foo", Thread.class); + sysLogger1b = provider.getLogger("foo", Thread.class.getModule()); if (sysLogger1b != sysLogger1a) { - loggerDescMap.put(sysLogger1b, "provider.getLogger(\"foo\", Thread.class)"); + loggerDescMap.put(sysLogger1b, "provider.getLogger(\"foo\", Thread.class.getModule())"); } if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); @@ -367,8 +368,8 @@ Logger sysLogger2 = null; try { - sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class); - loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class)"); + sysLogger2 = provider.getLocalizedLogger("foo", loggerBundle, Thread.class.getModule()); + loggerDescMap.put(sysLogger2, "provider.getLocalizedLogger(\"foo\", loggerBundle, Thread.class.getModule())"); if (!hasRequiredPermissions) { throw new RuntimeException("Managed to obtain a system logger without permission"); } @@ -396,9 +397,9 @@ allowAll.get().set(true); try { sysSink = LoggingProviderImpl.getLogManagerAccess().demandLoggerFor( - LogManager.getLogManager(), "foo", Thread.class); + LogManager.getLogManager(), "foo", Thread.class.getModule()); appSink = LoggingProviderImpl.getLogManagerAccess().demandLoggerFor( - LogManager.getLogManager(), "foo", DefaultLoggerBridgeTest.class); + LogManager.getLogManager(), "foo", DefaultLoggerBridgeTest.class.getModule()); if (appSink == sysSink) { throw new RuntimeException("identical backend loggers"); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/System/LoggerFinder/jdk/DefaultPlatformLoggerTest/DefaultPlatformLoggerTest.java --- a/jdk/test/java/lang/System/LoggerFinder/jdk/DefaultPlatformLoggerTest/DefaultPlatformLoggerTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/System/LoggerFinder/jdk/DefaultPlatformLoggerTest/DefaultPlatformLoggerTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -44,6 +44,7 @@ import java.lang.System.LoggerFinder; import sun.util.logging.PlatformLogger; import sun.util.logging.internal.LoggingProviderImpl; +import java.lang.reflect.Module; /** * @test @@ -244,9 +245,9 @@ LoggerFinder provider = LoggerFinder.getLoggerFinder(); java.util.logging.Logger appSink = LoggingProviderImpl.getLogManagerAccess() .demandLoggerFor(LogManager.getLogManager(), "foo", - DefaultPlatformLoggerTest.class); + DefaultPlatformLoggerTest.class.getModule()); java.util.logging.Logger sysSink = LoggingProviderImpl.getLogManagerAccess() - .demandLoggerFor(LogManager.getLogManager(),"foo", Thread.class); + .demandLoggerFor(LogManager.getLogManager(),"foo", Thread.class.getModule()); appSink.addHandler(new MyHandler()); sysSink.addHandler(new MyHandler()); appSink.setUseParentHandlers(VERBOSE); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/ArrayConstructorTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/ArrayConstructorTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. 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 8155106 + * @run testng/othervm -ea -esa test.java.lang.invoke.ArrayConstructorTest + */ +package test.java.lang.invoke; + +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; + +import static java.lang.invoke.MethodType.methodType; + +import static org.testng.AssertJUnit.*; + +import org.testng.annotations.*; + + +public class ArrayConstructorTest { + + static final MethodHandles.Lookup LOOKUP = MethodHandles.lookup(); + + @Test + public static void testFindConstructorArray() { + boolean caught = false; + try { + MethodHandle h = LOOKUP.findConstructor(Object[].class, methodType(void.class)); + } catch (NoSuchMethodException nsme) { + assertEquals("no constructor for array class: [Ljava.lang.Object;", nsme.getMessage()); + caught = true; + } catch (Exception e) { + throw new AssertionError("unexpected exception: " + e); + } + assertTrue(caught); + } + + @DataProvider + static Object[][] arrayConstructorNegative() { + return new Object[][]{ + {String.class, IllegalArgumentException.class, "not an array class: java.lang.String"}, + {null, NullPointerException.class, null} + }; + } + + @Test(dataProvider = "arrayConstructorNegative") + public static void testArrayConstructorNegative(Class clazz, Class exceptionClass, String message) { + boolean caught = false; + try { + MethodHandle h = MethodHandles.arrayConstructor(clazz); + } catch (Exception e) { + assertEquals(exceptionClass, e.getClass()); + if (message != null) { + assertEquals(message, e.getMessage()); + } + caught = true; + } + assertTrue(caught); + } + + @Test + public static void testArrayConstructor() throws Throwable { + MethodHandle h = MethodHandles.arrayConstructor(String[].class); + assertEquals(methodType(String[].class, int.class), h.type()); + String[] a = (String[]) h.invoke(17); + assertEquals(17, a.length); + } + +} diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/JavaUtilConcurrentLookupTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/JavaUtilConcurrentLookupTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* @test + * @summary Tests that Lookup can be produced from classes under java.util.concurrent + * @bug 8154447 + * @compile/module=java.base java/util/concurrent/LookupTester.java + * @run testng/othervm JavaUtilConcurrentLookupTest + */ + +import org.testng.annotations.Test; + +import java.util.concurrent.LookupTester; + +public class JavaUtilConcurrentLookupTest { + + @Test + public void testLookup() { + LookupTester.getLookup(); + } + + @Test + public void testLookupIn() { + LookupTester.getLookupIn(); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/PermuteArgsTest.java --- a/jdk/test/java/lang/invoke/PermuteArgsTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/PermuteArgsTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2011, 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 @@ -23,6 +23,7 @@ /* @test * @summary unit tests for method handles which permute their arguments + * @library /lib/testlibrary/jsr292 /lib/testlibrary * @run testng/othervm -XX:+IgnoreUnrecognizedVMOptions -XX:-VerifyDependencies -ea -esa -DPermuteArgsTest.MAX_ARITY=8 test.java.lang.invoke.PermuteArgsTest */ /* Examples of manual runs: @@ -36,6 +37,8 @@ import org.testng.*; import org.testng.annotations.*; +import com.oracle.testlibrary.jsr292.CodeCacheOverflowProcessor; + import java.util.*; import java.lang.reflect.*; @@ -122,9 +125,15 @@ } new PermuteArgsTest().test(); } + static int testCases; + @Test public void test() throws Throwable { + CodeCacheOverflowProcessor.runMHTest(this::test0); + } + + public void test0() throws Throwable { testCases = 0; Lookup lookup = lookup(); for (Method m : lookup.lookupClass().getDeclaredMethods()) { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessBoolean.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessByte.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessChar.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessDouble.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessFloat.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessInt.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessLong.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessShort.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestAccessString.java Thu Apr 28 09:38:19 2016 -0700 @@ -106,7 +106,6 @@ assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsChar.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,6 +23,7 @@ /* * @test + * @bug 8154556 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsChar * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsChar * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsChar @@ -57,15 +58,16 @@ // Combinations of VarHandle byte[] or ByteBuffer vhss = new ArrayList<>(); for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + + ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN + ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(char[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteArrayViewVarHandle(char[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(char[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteBufferViewVarHandle(char[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } @@ -93,7 +95,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsDouble.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,6 +23,7 @@ /* * @test + * @bug 8154556 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsDouble * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsDouble * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsDouble @@ -57,15 +58,16 @@ // Combinations of VarHandle byte[] or ByteBuffer vhss = new ArrayList<>(); for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + + ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN + ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(double[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteArrayViewVarHandle(double[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(double[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteBufferViewVarHandle(double[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } @@ -93,7 +95,6 @@ assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsFloat.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,6 +23,7 @@ /* * @test + * @bug 8154556 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsFloat * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsFloat * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsFloat @@ -57,15 +58,16 @@ // Combinations of VarHandle byte[] or ByteBuffer vhss = new ArrayList<>(); for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + + ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN + ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(float[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteArrayViewVarHandle(float[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(float[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteBufferViewVarHandle(float[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } @@ -93,7 +95,6 @@ assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsInt.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,6 +23,7 @@ /* * @test + * @bug 8154556 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsInt * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsInt * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsInt @@ -37,10 +38,10 @@ import java.nio.ByteOrder; import java.util.ArrayList; import java.util.Arrays; -import java.util.EnumSet; import java.util.List; -import static org.testng.Assert.*; +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertTrue; public class VarHandleTestByteArrayAsInt extends VarHandleBaseByteArrayTest { static final int SIZE = Integer.BYTES; @@ -57,15 +58,16 @@ // Combinations of VarHandle byte[] or ByteBuffer vhss = new ArrayList<>(); for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + + ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN + ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(int[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteArrayViewVarHandle(int[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(int[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteBufferViewVarHandle(int[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } @@ -93,7 +95,6 @@ assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsLong.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,6 +23,7 @@ /* * @test + * @bug 8154556 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsLong * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsLong * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsLong @@ -57,15 +58,16 @@ // Combinations of VarHandle byte[] or ByteBuffer vhss = new ArrayList<>(); for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + + ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN + ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(long[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteArrayViewVarHandle(long[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(long[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteBufferViewVarHandle(long[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } @@ -93,7 +95,6 @@ assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertTrue(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java --- a/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/VarHandleTestByteArrayAsShort.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,6 +23,7 @@ /* * @test + * @bug 8154556 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAsShort * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAsShort * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAsShort @@ -57,15 +58,16 @@ // Combinations of VarHandle byte[] or ByteBuffer vhss = new ArrayList<>(); for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + + ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN + ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle(short[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteArrayViewVarHandle(short[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle(short[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteBufferViewVarHandle(short[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } @@ -93,7 +95,6 @@ assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_ACQUIRE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); - assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.WEAK_COMPARE_AND_SET_RELEASE)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_SET)); assertFalse(vh.isAccessModeSupported(VarHandle.AccessMode.GET_AND_ADD)); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template --- a/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/lang/invoke/VarHandles/X-VarHandleTestByteArrayView.java.template Thu Apr 28 09:38:19 2016 -0700 @@ -23,6 +23,7 @@ /* * @test + * @bug 8154556 * @run testng/othervm -Diters=20000 -XX:TieredStopAtLevel=1 VarHandleTestByteArrayAs$Type$ * @run testng/othervm -Diters=20000 VarHandleTestByteArrayAs$Type$ * @run testng/othervm -Diters=20000 -XX:-TieredCompilation VarHandleTestByteArrayAs$Type$ @@ -57,15 +58,16 @@ // Combinations of VarHandle byte[] or ByteBuffer vhss = new ArrayList<>(); for (MemoryMode endianess : Arrays.asList(MemoryMode.BIG_ENDIAN, MemoryMode.LITTLE_ENDIAN)) { + + ByteOrder bo = endianess == MemoryMode.BIG_ENDIAN + ? ByteOrder.BIG_ENDIAN : ByteOrder.LITTLE_ENDIAN; VarHandleSource aeh = new VarHandleSource( - MethodHandles.byteArrayViewVarHandle($type$[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteArrayViewVarHandle($type$[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(aeh); VarHandleSource bbh = new VarHandleSource( - MethodHandles.byteBufferViewVarHandle($type$[].class, - endianess == MemoryMode.BIG_ENDIAN), + MethodHandles.byteBufferViewVarHandle($type$[].class, bo), endianess, MemoryMode.READ_WRITE); vhss.add(bbh); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/lang/invoke/java.base/java/util/concurrent/LookupTester.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/lang/invoke/java.base/java/util/concurrent/LookupTester.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package java.util.concurrent; + +import java.lang.invoke.MethodHandles; + +public class LookupTester { + public static MethodHandles.Lookup getLookup() { + return MethodHandles.lookup(); + } + + + public static MethodHandles.Lookup getLookupIn() { + return MethodHandles.lookup().in(ConcurrentHashMap.class); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/net/SocketOption/OptionsTest.java --- a/jdk/test/java/net/SocketOption/OptionsTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/net/SocketOption/OptionsTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,11 +23,13 @@ /* * @test - * @bug 8036979 8072384 + * @bug 8036979 8072384 8044773 * @run main/othervm -Xcheck:jni OptionsTest * @run main/othervm -Xcheck:jni -Djava.net.preferIPv4Stack=true OptionsTest + * @run main/othervm -Djdk.launcher.limitmods=java.base OptionsTest */ +import java.lang.reflect.Method; import java.net.*; import java.util.*; @@ -43,7 +45,7 @@ } Object option; Object testValue; - }; + } // The tests set the option using the new API, read back the set value // which could be diferent, and then use the legacy get API to check @@ -223,8 +225,7 @@ } else if (option.equals(StandardSocketOptions.SO_REUSEPORT) && reuseport) { return Boolean.valueOf(socket.getOption(StandardSocketOptions.SO_REUSEPORT)); } else if (option.equals(StandardSocketOptions.IP_TOS)) { - return Integer.valueOf(jdk.net.Sockets.getOption( - socket, StandardSocketOptions.IP_TOS)); + return getServerSocketTrafficClass(socket); } else { throw new RuntimeException("unexecpted socket option"); } @@ -281,4 +282,20 @@ doDgSocketTests(); doMcSocketTests(); } + + // Reflectively access jdk.net.Sockets.getOption so that the test can run + // without the jdk.net module. + static Object getServerSocketTrafficClass(ServerSocket ss) throws Exception { + try { + Class c = Class.forName("jdk.net.Sockets"); + Method m = c.getDeclaredMethod("getOption", ServerSocket.class, SocketOption.class); + return m.invoke(null, ss, StandardSocketOptions.IP_TOS); + } catch (ClassNotFoundException e) { + // Ok, jdk.net module not present, just fall back + System.out.println("jdk.net module not present, falling back."); + return Integer.valueOf(ss.getOption(StandardSocketOptions.IP_TOS)); + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/net/SocketOption/UnsupportedOptionsTest.java --- a/jdk/test/java/net/SocketOption/UnsupportedOptionsTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/net/SocketOption/UnsupportedOptionsTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,34 +21,48 @@ * questions. */ -import jdk.net.ExtendedSocketOptions; - import java.io.IOException; +import java.lang.reflect.Field; import java.net.*; +import java.util.ArrayList; +import java.util.List; /* * @test - * @bug 8143554 - * @run main UnsupportedOptionsTest + * @bug 8143554 8044773 * @summary Test checks that UnsupportedOperationException for unsupported * SOCKET_OPTIONS is thrown by both getOption() and setOption() methods. + * @run main UnsupportedOptionsTest + * @run main/othervm -Djdk.launcher.limitmods=java.base UnsupportedOptionsTest */ + public class UnsupportedOptionsTest { - private static final SocketOption[] SOCKET_OPTIONS = { - StandardSocketOptions.IP_MULTICAST_IF, - StandardSocketOptions.IP_MULTICAST_LOOP, - StandardSocketOptions.IP_MULTICAST_TTL, - StandardSocketOptions.IP_TOS, - StandardSocketOptions.SO_BROADCAST, - StandardSocketOptions.SO_KEEPALIVE, - StandardSocketOptions.SO_LINGER, - StandardSocketOptions.SO_RCVBUF, - StandardSocketOptions.SO_REUSEADDR, - StandardSocketOptions.SO_SNDBUF, - StandardSocketOptions.TCP_NODELAY, - ExtendedSocketOptions.SO_FLOW_SLA - }; + private static final List> socketOptions = new ArrayList<>(); + + static { + socketOptions.add(StandardSocketOptions.IP_MULTICAST_IF); + socketOptions.add(StandardSocketOptions.IP_MULTICAST_LOOP); + socketOptions.add(StandardSocketOptions.IP_MULTICAST_TTL); + socketOptions.add(StandardSocketOptions.IP_TOS); + socketOptions.add(StandardSocketOptions.SO_BROADCAST); + socketOptions.add(StandardSocketOptions.SO_KEEPALIVE); + socketOptions.add(StandardSocketOptions.SO_LINGER); + socketOptions.add(StandardSocketOptions.SO_RCVBUF); + socketOptions.add(StandardSocketOptions.SO_REUSEADDR); + socketOptions.add(StandardSocketOptions.SO_SNDBUF); + socketOptions.add(StandardSocketOptions.TCP_NODELAY); + + try { + Class c = Class.forName("jdk.net.ExtendedSocketOptions"); + Field field = c.getField("SO_FLOW_SLA"); + socketOptions.add((SocketOption)field.get(null)); + } catch (ClassNotFoundException e) { + // ignore, jdk.net module not present + } catch (ReflectiveOperationException e) { + throw new AssertionError(e); + } + } public static void main(String[] args) throws IOException { Socket s = new Socket(); @@ -56,7 +70,7 @@ DatagramSocket ds = new DatagramSocket(); MulticastSocket ms = new MulticastSocket(); - for (SocketOption option : SOCKET_OPTIONS) { + for (SocketOption option : socketOptions) { if (!s.supportedOptions().contains(option)) { testUnsupportedSocketOption(s, option); } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java --- a/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/nio/channels/DatagramChannel/SocketOptionTests.java Thu Apr 28 09:38:19 2016 -0700 @@ -22,8 +22,10 @@ */ /* @test - * @bug 4640544 + * @bug 4640544 8044773 * @summary Unit test for setOption/getOption/options methods + * @run main SocketOptionTests + * @run main/othervm -Djdk.launcher.limitmods=java.base SocketOptionTests */ import java.nio.*; diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java --- a/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/nio/channels/ServerSocketChannel/SocketOptionTests.java Thu Apr 28 09:38:19 2016 -0700 @@ -22,9 +22,11 @@ */ /* @test - * @bug 4640544 + * @bug 4640544 8044773 * @summary Unit test for ServerSocketChannel setOption/getOption/options * methods. + * @run main SocketOptionTests + * @run main/othervm -Djdk.launcher.limitmods=java.base SocketOptionTests */ import java.nio.*; diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java --- a/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/nio/channels/SocketChannel/SocketOptionTests.java Thu Apr 28 09:38:19 2016 -0700 @@ -22,9 +22,11 @@ */ /* @test - * @bug 4640544 + * @bug 4640544 8044773 * @summary Unit test to check SocketChannel setOption/getOption/options * methods. + * @run main SocketOptionTests + * @run main/othervm -Djdk.launcher.limitmods=java.base SocketOptionTests */ import java.nio.*; diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/rmi/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/rmi/TEST.properties Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,1 @@ +modules = java.rmi diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/rmi/reliability/benchmark/bench/serial/Main.java --- a/jdk/test/java/rmi/reliability/benchmark/bench/serial/Main.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/java/rmi/reliability/benchmark/bench/serial/Main.java Thu Apr 28 09:38:19 2016 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 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 @@ -26,6 +26,7 @@ * @summary The Serialization benchmark test. This java class is used to run the * test under JTREG. * @library ../../ + * @modules java.desktop * @build bench.BenchInfo bench.HtmlReporter bench.Util bench.Benchmark * @build bench.Reporter bench.XmlReporter bench.ConfigFormatException * @build bench.Harness bench.TextReporter diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/rmi/transport/httpSocket/HttpSocketTest.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/rmi/transport/httpSocket/HttpSocketTest_Stub.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/java/rmi/transport/httpSocket/security.policy diff -r ec60c3290242 -r b1a0f119f766 jdk/test/jdk/net/SocketFlow/SocketFlowBasic.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/jdk/net/SocketFlow/SocketFlowBasic.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8765432 + * @summary Basic test for SocketFlow API + * @run testng SocketFlowBasic + */ + +import jdk.net.SocketFlow; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Test; +import static jdk.net.SocketFlow.*; +import static org.testng.Assert.*; + +public class SocketFlowBasic { + + @DataProvider + public Object[][] validPriorities() { + return new Object[][] { {HIGH_PRIORITY}, {NORMAL_PRIORITY} }; + } + + @Test(dataProvider = "validPriorities") + public void priority(long validPriority) { + SocketFlow flow = SocketFlow.create(); + flow.bandwidth(validPriority); + long bandwidth = flow.bandwidth(); + assertTrue(bandwidth == validPriority, "Expected " + validPriority + ", got" + bandwidth); + } + + @DataProvider + public Object[][] invalidPriorities() { + return new Object[][] { {HIGH_PRIORITY+10}, {NORMAL_PRIORITY-10000} }; + } + + @Test(dataProvider = "invalidPriorities", expectedExceptions = IllegalArgumentException.class) + public void priority(int invalidPriority) { + SocketFlow flow = SocketFlow.create(); + flow.priority(invalidPriority); + } + + @DataProvider + public Object[][] positiveBandwidth() { + return new Object[][] { {0}, {100}, {Integer.MAX_VALUE}, {Long.MAX_VALUE} }; + } + + @Test(dataProvider = "positiveBandwidth") + public void bandwidth(long posBandwidth) { + SocketFlow flow = SocketFlow.create(); + flow.bandwidth(posBandwidth); + long bandwidth = flow.bandwidth(); + assertTrue(bandwidth == posBandwidth, "Expected " + posBandwidth + ", got" + bandwidth); + } + + + @DataProvider + public Object[][] negativeBandwidth() { + return new Object[][] { {-1}, {-100}, {Integer.MIN_VALUE}, {Long.MIN_VALUE} }; + } + + @Test(dataProvider = "negativeBandwidth", expectedExceptions = IllegalArgumentException.class) + public void invalidBandwidth(long negBandwidth) { + SocketFlow flow = SocketFlow.create(); + flow.bandwidth(negBandwidth); + } + + @Test + public void status() { + SocketFlow flow = SocketFlow.create(); + assertTrue(flow.status() == Status.NO_STATUS); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/test/jdk/net/Sockets/Test.java --- a/jdk/test/jdk/net/Sockets/Test.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/jdk/net/Sockets/Test.java Thu Apr 28 09:38:19 2016 -0700 @@ -23,8 +23,9 @@ /* * @test - * @bug 8032808 - * @run main/othervm -Xcheck:jni Test + * @bug 8032808 8044773 + * @modules jdk.net + * @run main/othervm -Xcheck:jni Test success * @run main/othervm/policy=policy.fail -Xcheck:jni Test fail * @run main/othervm/policy=policy.success -Xcheck:jni Test success */ @@ -35,15 +36,13 @@ import java.util.concurrent.*; import java.util.Set; import jdk.net.*; +import static java.lang.System.out; public class Test { - static boolean security; - static boolean success; + interface Runner { void run() throws Exception; } - interface Runner { - public void run() throws Exception; - } + static boolean expectSuccess; public static void main(String[] args) throws Exception { @@ -52,95 +51,107 @@ Sockets.supportedOptions(Socket.class); - security = System.getSecurityManager() != null; - success = security && args[0].equals("success"); + expectSuccess = args[0].equals("success"); // Main thing is to check for JNI problems // Doesn't matter if current system does not support the option // and currently setting the option with the loopback interface // doesn't work either - System.out.println ("Security Manager enabled: " + security); - if (security) { - System.out.println ("Success expected: " + success); - } + boolean sm = System.getSecurityManager() != null; + out.println("Security Manager enabled: " + sm); + out.println("Success expected: " + expectSuccess); - final SocketFlow flowIn = SocketFlow.create() - .bandwidth(1000) - .priority(SocketFlow.HIGH_PRIORITY); + SocketFlow flowIn = SocketFlow.create() + .bandwidth(1000) + .priority(SocketFlow.HIGH_PRIORITY); - ServerSocket ss = new ServerSocket(0); - int tcp_port = ss.getLocalPort(); - final InetAddress loop = InetAddress.getByName("127.0.0.1"); - final InetSocketAddress loopad = new InetSocketAddress(loop, tcp_port); + try (ServerSocket ss = new ServerSocket(0); + DatagramSocket dg = new DatagramSocket(0)) { - DatagramSocket dg = new DatagramSocket(0); - final int udp_port = dg.getLocalPort(); + int tcp_port = ss.getLocalPort(); + final InetAddress loop = InetAddress.getByName("127.0.0.1"); + final InetSocketAddress loopad = new InetSocketAddress(loop, tcp_port); + + final int udp_port = dg.getLocalPort(); - // If option not available, end test - Set> options = dg.supportedOptions(); - if (!options.contains(ExtendedSocketOptions.SO_FLOW_SLA)) { - System.out.println("SO_FLOW_SLA not supported"); - return; - } + // If option not available, end test + Set> options = dg.supportedOptions(); + if (!options.contains(ExtendedSocketOptions.SO_FLOW_SLA)) { + System.out.println("SO_FLOW_SLA not supported"); + return; + } - final Socket s = new Socket("127.0.0.1", tcp_port); - final SocketChannel sc = SocketChannel.open(); - sc.connect (new InetSocketAddress("127.0.0.1", tcp_port)); + final Socket s = new Socket("127.0.0.1", tcp_port); + final SocketChannel sc = SocketChannel.open(); + sc.connect(new InetSocketAddress("127.0.0.1", tcp_port)); - doTest(()->{ - Sockets.setOption(s, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); - }); - doTest(()->{ - Sockets.getOption(s, ExtendedSocketOptions.SO_FLOW_SLA); - }); - doTest(()->{ - sc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); - }); - doTest(()->{ - sc.getOption(ExtendedSocketOptions.SO_FLOW_SLA); - }); - doTest(()->{ - DatagramSocket dg1 = new DatagramSocket(0); - dg1.connect(loop, udp_port); - Sockets.setOption(dg1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); - }); - doTest(()->{ - DatagramChannel dg2 = DatagramChannel.open(); - dg2.bind(new InetSocketAddress(loop, 0)); - dg2.connect(new InetSocketAddress(loop, udp_port)); - dg2.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); - }); - doTest(()->{ - MulticastSocket mc1 = new MulticastSocket(0); - mc1.connect(loop, udp_port); - Sockets.setOption(mc1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); - }); - doTest(()->{ - AsynchronousSocketChannel asc = AsynchronousSocketChannel.open(); - Future f = asc.connect(loopad); - f.get(); - asc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); - }); + doTest("Sockets.setOption Socket", () -> { + out.println(flowIn); + Sockets.setOption(s, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); + out.println(flowIn); + }); + doTest("Sockets.getOption Socket",() -> { + Sockets.getOption(s, ExtendedSocketOptions.SO_FLOW_SLA); + out.println(flowIn); + }); + doTest("Sockets.setOption SocketChannel",() -> + sc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn) + ); + doTest("Sockets.getOption SocketChannel",() -> + sc.getOption(ExtendedSocketOptions.SO_FLOW_SLA) + ); + doTest("Sockets.setOption DatagramSocket",() -> { + try (DatagramSocket dg1 = new DatagramSocket(0)) { + dg1.connect(loop, udp_port); + Sockets.setOption(dg1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); + } + }); + doTest("Sockets.setOption DatagramSocket 2", () -> { + try (DatagramChannel dg2 = DatagramChannel.open()) { + dg2.bind(new InetSocketAddress(loop, 0)); + dg2.connect(new InetSocketAddress(loop, udp_port)); + dg2.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); + } + }); + doTest("Sockets.setOption MulticastSocket", () -> { + try (MulticastSocket mc1 = new MulticastSocket(0)) { + mc1.connect(loop, udp_port); + Sockets.setOption(mc1, ExtendedSocketOptions.SO_FLOW_SLA, flowIn); + } + }); + doTest("Sockets.setOption AsynchronousSocketChannel", () -> { + try (AsynchronousSocketChannel asc = AsynchronousSocketChannel.open()) { + Future f = asc.connect(loopad); + f.get(); + asc.setOption(ExtendedSocketOptions.SO_FLOW_SLA, flowIn); + } + }); + } } - static void doTest(Runner func) throws Exception { + static void doTest(String message, Runner func) throws Exception { + out.println(message); try { func.run(); - if (security && !success) { - throw new RuntimeException("Test failed"); + if (expectSuccess) { + out.println("Completed as expected"); + } else { + throw new RuntimeException("Operation succeeded, but expected SecurityException"); } } catch (SecurityException e) { - if (success) { - throw new RuntimeException("Test failed"); + if (expectSuccess) { + throw new RuntimeException("Unexpected SecurityException", e); + } else { + out.println("Caught expected: " + e); } } catch (UnsupportedOperationException e) { - System.out.println (e); + System.out.println(e); } catch (IOException e) { // Probably a permission error, but we're not // going to check unless a specific permission exception // is defined. - System.out.println (e); + System.out.println(e); } } } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java --- a/jdk/test/sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/ButtonDemoScreenshotTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,8 @@ * questions. */ +import com.sun.swingset3.demos.button.ButtonDemo; +import org.jtregext.GuiTestListener; import java.awt.Point; import java.awt.Robot; import java.awt.event.InputEvent; @@ -32,6 +34,7 @@ import static org.jemmy2ext.JemmyExt.*; import org.testng.annotations.Test; import static com.sun.swingset3.demos.button.ButtonDemo.*; +import org.testng.annotations.Listeners; /* * @test @@ -41,31 +44,30 @@ * image is different from initial button image. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.button.ButtonDemo * @run testng ButtonDemoScreenshotTest */ +@Listeners(GuiTestListener.class) public class ButtonDemoScreenshotTest { private static final int BUTTON_COUNT = 6; // TODO: Decide about "open browser" buttons (value was 8 originally) @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - Robot rob = new Robot(); + Robot rob = new Robot(); - new ClassReference(com.sun.swingset3.demos.button.ButtonDemo.class.getCanonicalName()).startApplication(); + new ClassReference(ButtonDemo.class.getCanonicalName()).startApplication(); - JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE); - waitImageIsStill(rob, mainFrame); + JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE); + waitImageIsStill(rob, mainFrame); - // Check all the buttons - for (int i = 0; i < BUTTON_COUNT; i++) { - checkButton(mainFrame, i, rob); - } - }); + // Check all the buttons + for (int i = 0; i < BUTTON_COUNT; i++) { + checkButton(mainFrame, i, rob); + } } public void checkButton(JFrameOperator jfo, int i, Robot rob) { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/ButtonDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/ButtonDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/ButtonDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.JHyperlink; import com.sun.swingset3.demos.button.ButtonDemo; import java.util.concurrent.ArrayBlockingQueue; @@ -38,7 +39,7 @@ import static com.sun.swingset3.demos.button.ButtonDemo.*; import org.jemmy2ext.JemmyExt; import org.jemmy2ext.JemmyExt.MultiThreadedTryCatch; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -48,12 +49,13 @@ * on buttons before and after click. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.button.ButtonDemo * @run testng ButtonDemoTest */ +@Listeners(GuiTestListener.class) public class ButtonDemoTest { private static final String[] BUTTON_TEXT_AFTER = { @@ -92,34 +94,30 @@ @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - - new ClassReference(ButtonDemo.class.getCanonicalName()).startApplication(); + new ClassReference(ButtonDemo.class.getCanonicalName()).startApplication(); - JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE); - mainFrame.setComparator(EXACT_STRING_COMPARATOR); - - // Check all the buttons - for (int i = 0; i < BUTTON_TOOLTIP.length; i++) { - String tooltip = BUTTON_TOOLTIP[i]; - - JButtonOperator button = new JButtonOperator(mainFrame, new ByToolTipChooser(tooltip)); + JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE); + mainFrame.setComparator(EXACT_STRING_COMPARATOR); - assertEquals(BUTTON_TEXT_BEFORE[i], button.getText()); + // Check all the buttons + for (int i = 0; i < BUTTON_TOOLTIP.length; i++) { + String tooltip = BUTTON_TOOLTIP[i]; + + JButtonOperator button = new JButtonOperator(mainFrame, new ByToolTipChooser(tooltip)); - // Two buttons are hyperlinks, we don't want to click them - if (!button.getSource().getClass().equals(JHyperlink.class)) { - checkButton(button); - } + assertEquals(BUTTON_TEXT_BEFORE[i], button.getText()); - if (BUTTON_TEXT_AFTER.length > i) { - assertEquals(BUTTON_TEXT_AFTER[i], button.getText()); - } else { - assertEquals(BUTTON_TEXT_BEFORE[i], button.getText()); - } + // Two buttons are hyperlinks, we don't want to click them + if (!button.getSource().getClass().equals(JHyperlink.class)) { + checkButton(button); } - }); + if (BUTTON_TEXT_AFTER.length > i) { + assertEquals(BUTTON_TEXT_AFTER[i], button.getText()); + } else { + assertEquals(BUTTON_TEXT_BEFORE[i], button.getText()); + } + } } private void checkButton(JButtonOperator button) throws Exception { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/ComboBoxDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/ComboBoxDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/ComboBoxDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.combobox.ComboBoxDemo; import static org.testng.AssertJUnit.*; import org.testng.annotations.Test; @@ -28,7 +29,7 @@ import org.netbeans.jemmy.operators.JComboBoxOperator; import org.netbeans.jemmy.operators.JFrameOperator; import static com.sun.swingset3.demos.combobox.ComboBoxDemo.*; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -37,12 +38,13 @@ * each value of each ComboBox. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.combobox.ComboBoxDemo * @run testng ComboBoxDemoTest */ +@Listeners(GuiTestListener.class) public class ComboBoxDemoTest { private static enum ComboBoxInfo { @@ -61,14 +63,13 @@ @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(ComboBoxDemo.class.getCanonicalName()).startApplication(); + + new ClassReference(ComboBoxDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - for (ComboBoxInfo comboBoxInfo : ComboBoxInfo.values()) { - comboBoxChecker(frame, comboBoxInfo); - } - }); + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + for (ComboBoxInfo comboBoxInfo : ComboBoxInfo.values()) { + comboBoxChecker(frame, comboBoxInfo); + } } private void comboBoxChecker(JFrameOperator jfo, ComboBoxInfo comboBoxInfo) { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/ListDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/ListDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/ListDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.list.ListDemo; import static com.sun.swingset3.demos.list.ListDemo.DEMO_TITLE; import static org.testng.AssertJUnit.*; @@ -30,7 +31,7 @@ import org.netbeans.jemmy.operators.JCheckBoxOperator; import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JListOperator; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -40,64 +41,64 @@ * list. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.list.ListDemo * @run testng ListDemoTest */ +@Listeners(GuiTestListener.class) public class ListDemoTest { private static final int CHECKBOX_COUNT = 50; @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(ListDemo.class.getCanonicalName()).startApplication(); + + new ClassReference(ListDemo.class.getCanonicalName()).startApplication(); + + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + JListOperator listOp = new JListOperator(frame); + + // Check *NO* Prefix and Suffixes Marked + for (int i = 0; i < CHECKBOX_COUNT; i++) { + JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); + checkBox.changeSelection(false); + } + System.out.println("######## Number of Items = " + listOp.getModel().getSize()); + assertEquals("Select None number of items is correct", 0, listOp.getModel().getSize()); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - JListOperator listOp = new JListOperator(frame); + // Check *ALL* Prefix and Suffixes Marked + for (int i = 0; i < CHECKBOX_COUNT; i++) { + JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); + checkBox.changeSelection(true); + } + System.out.println("######## Number of Items = " + listOp.getModel().getSize()); + assertEquals("Select All number of items is correct", CHECKBOX_COUNT / 2 * CHECKBOX_COUNT / 2, listOp.getModel().getSize()); - // Check *NO* Prefix and Suffixes Marked - for (int i = 0; i < CHECKBOX_COUNT; i++) { - JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); + // Check *ALL* Prefix and *NO* Suffixes Marked + for (int i = 0; i < CHECKBOX_COUNT; i++) { + JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); + if (i < CHECKBOX_COUNT / 2) { + checkBox.changeSelection(true); + } else { checkBox.changeSelection(false); } - System.out.println("######## Number of Items = " + listOp.getModel().getSize()); - assertEquals("Select None number of items is correct", 0, listOp.getModel().getSize()); + } + System.out.println("######## Number of Items = " + listOp.getModel().getSize()); + assertEquals("Select All Prefixes and NO Suffixes number of items is correct", 0, listOp.getModel().getSize()); - // Check *ALL* Prefix and Suffixes Marked - for (int i = 0; i < CHECKBOX_COUNT; i++) { - JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); + // Check *NO* Prefix and *ALL* Suffixes Marked + for (int i = 0; i < CHECKBOX_COUNT; i++) { + JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); + if (i < CHECKBOX_COUNT / 2) { + checkBox.changeSelection(false); + } else { checkBox.changeSelection(true); } - System.out.println("######## Number of Items = " + listOp.getModel().getSize()); - assertEquals("Select All number of items is correct", CHECKBOX_COUNT / 2 * CHECKBOX_COUNT / 2, listOp.getModel().getSize()); - - // Check *ALL* Prefix and *NO* Suffixes Marked - for (int i = 0; i < CHECKBOX_COUNT; i++) { - JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); - if (i < CHECKBOX_COUNT / 2) { - checkBox.changeSelection(true); - } else { - checkBox.changeSelection(false); - } - } - System.out.println("######## Number of Items = " + listOp.getModel().getSize()); - assertEquals("Select All Prefixes and NO Suffixes number of items is correct", 0, listOp.getModel().getSize()); - - // Check *NO* Prefix and *ALL* Suffixes Marked - for (int i = 0; i < CHECKBOX_COUNT; i++) { - JCheckBoxOperator checkBox = getJCheckBoxOperator(frame, i); - if (i < CHECKBOX_COUNT / 2) { - checkBox.changeSelection(false); - } else { - checkBox.changeSelection(true); - } - } - System.out.println("######## Number of Items = " + listOp.getModel().getSize()); - assertEquals("Select NO Prefixes and All Suffixes number of items is correct", 0, listOp.getModel().getSize()); - }); + } + System.out.println("######## Number of Items = " + listOp.getModel().getSize()); + assertEquals("Select NO Prefixes and All Suffixes number of items is correct", 0, listOp.getModel().getSize()); } private JCheckBoxOperator getJCheckBoxOperator(JFrameOperator frame, int index) { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/OptionPaneDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/OptionPaneDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/OptionPaneDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,10 +21,10 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.optionpane.OptionPaneDemo; import static com.sun.swingset3.demos.optionpane.OptionPaneDemo.*; import javax.swing.UIManager; -import static org.jemmy2ext.JemmyExt.*; import static org.testng.AssertJUnit.*; import org.testng.annotations.Test; import org.netbeans.jemmy.ClassReference; @@ -34,6 +34,7 @@ import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JLabelOperator; import org.netbeans.jemmy.operators.JTextFieldOperator; +import org.testng.annotations.Listeners; /* @@ -43,12 +44,13 @@ * and choosing different options in them. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.optionpane.OptionPaneDemo * @run testng OptionPaneDemoTest */ +@Listeners(GuiTestListener.class) public class OptionPaneDemoTest { public static final String SOME_TEXT_TO_TYPE = "I am some text"; @@ -59,21 +61,20 @@ public static final String TEXT_TO_TYPE = "Hooray! I'm a textField"; public static final String NO = "No"; public static final String YES = "Yes"; - public static final String SELECT_AN__OPTION = UIManager.getString("OptionPane.titleText"); + public static final String SELECT_AN_OPTION = UIManager.getString("OptionPane.titleText"); @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(OptionPaneDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + new ClassReference(OptionPaneDemo.class.getCanonicalName()).startApplication(); + + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - showInputDialog(frame); - showWarningDialog(frame); - showMessageDialog(frame); - showComponentDialog(frame); - showConfirmationDialog(frame); - }); + showInputDialog(frame); + showWarningDialog(frame); + showMessageDialog(frame); + showComponentDialog(frame); + showConfirmationDialog(frame); } public void showInputDialog(JFrameOperator jfo) throws Exception { @@ -286,7 +287,7 @@ { new JButtonOperator(jfo, CONFIRM_BUTTON).pushNoBlock(); - JDialogOperator jdo = new JDialogOperator(SELECT_AN__OPTION); + JDialogOperator jdo = new JDialogOperator(SELECT_AN_OPTION); new JButtonOperator(jdo, YES).pushNoBlock(); JDialogOperator jdo1 = new JDialogOperator(MESSAGE); @@ -306,7 +307,7 @@ { new JButtonOperator(jfo, CONFIRM_BUTTON).pushNoBlock(); - JDialogOperator jdo = new JDialogOperator(SELECT_AN__OPTION); + JDialogOperator jdo = new JDialogOperator(SELECT_AN_OPTION); new JButtonOperator(jdo, NO).pushNoBlock(); JDialogOperator jdo1 = new JDialogOperator(MESSAGE); @@ -326,7 +327,7 @@ { new JButtonOperator(jfo, CONFIRM_BUTTON).pushNoBlock(); - JDialogOperator jdo = new JDialogOperator(SELECT_AN__OPTION); + JDialogOperator jdo = new JDialogOperator(SELECT_AN_OPTION); assertTrue("Show Confirmation Dialog Cancel Option", jdo.isShowing()); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/ProgressBarDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/ProgressBarDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/ProgressBarDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.progressbar.ProgressBarDemo; import static com.sun.swingset3.demos.progressbar.ProgressBarDemo.*; import java.awt.Component; @@ -31,7 +32,7 @@ import org.netbeans.jemmy.operators.JButtonOperator; import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JProgressBarOperator; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -40,31 +41,31 @@ * buttons and checking the progress bar and the buttons state. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.progressbar.ProgressBarDemo * @run testng ProgressBarDemoTest */ +@Listeners(GuiTestListener.class) public class ProgressBarDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(ProgressBarDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + new ClassReference(ProgressBarDemo.class.getCanonicalName()).startApplication(); + + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - JButtonOperator startButton = new JButtonOperator(frame, START_BUTTON); - JButtonOperator stopButton = new JButtonOperator(frame, STOP_BUTTON); - JProgressBarOperator jpbo = new JProgressBarOperator(frame); + JButtonOperator startButton = new JButtonOperator(frame, START_BUTTON); + JButtonOperator stopButton = new JButtonOperator(frame, STOP_BUTTON); + JProgressBarOperator jpbo = new JProgressBarOperator(frame); - // Check that progress completes and corect enable/disable of start/stop buttons - checkCompleteProgress(frame, startButton, stopButton, jpbo); + // Check that progress completes and corect enable/disable of start/stop buttons + checkCompleteProgress(frame, startButton, stopButton, jpbo); - // Check progess bar progression and start/stop button disabled/enabled states - checkStartStop(frame, startButton, stopButton, jpbo); - }); + // Check progess bar progression and start/stop button disabled/enabled states + checkStartStop(frame, startButton, stopButton, jpbo); } // Check that progress completes and corect enable/disable of start/stop buttons diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/ScrollPaneDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/ScrollPaneDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/ScrollPaneDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.scrollpane.ScrollPaneDemo; import static com.sun.swingset3.demos.scrollpane.ScrollPaneDemo.DEMO_TITLE; import static org.testng.AssertJUnit.*; @@ -28,7 +29,7 @@ import org.netbeans.jemmy.ClassReference; import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JScrollPaneOperator; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -37,73 +38,73 @@ * to left and to right and checking scroll bar values. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.scrollpane.ScrollPaneDemo * @run testng ScrollPaneDemoTest */ +@Listeners(GuiTestListener.class) public class ScrollPaneDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(ScrollPaneDemo.class.getName()).startApplication(); + + new ClassReference(ScrollPaneDemo.class.getName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - JScrollPaneOperator jspo = new JScrollPaneOperator(frame); + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + JScrollPaneOperator jspo = new JScrollPaneOperator(frame); - // Set initial scrollbar positions - int initialVerticalValue = jspo.getVerticalScrollBar().getValue(); - int initialHorizontalValue = jspo.getHorizontalScrollBar().getValue(); + // Set initial scrollbar positions + int initialVerticalValue = jspo.getVerticalScrollBar().getValue(); + int initialHorizontalValue = jspo.getHorizontalScrollBar().getValue(); - System.out.println("Initial Vertical Value = " + jspo.getVerticalScrollBar().getValue()); - System.out.println("Initial HoriZontal Value = " + jspo.getHorizontalScrollBar().getValue()); + System.out.println("Initial Vertical Value = " + jspo.getVerticalScrollBar().getValue()); + System.out.println("Initial HoriZontal Value = " + jspo.getHorizontalScrollBar().getValue()); - // Check scroll to Bottom - { - jspo.scrollToBottom(); - int currentValue = jspo.getVerticalScrollBar().getValue(); - System.out.println("Final Value = " + currentValue); - assertTrue("Scroll to Bottom of Pane " - + "(initialVerticalValue, actual value: " + initialVerticalValue + " " - + "< currentValue, actual value = " + currentValue + ")", - initialVerticalValue < currentValue); - } + // Check scroll to Bottom + { + jspo.scrollToBottom(); + int currentValue = jspo.getVerticalScrollBar().getValue(); + System.out.println("Final Value = " + currentValue); + assertTrue("Scroll to Bottom of Pane " + + "(initialVerticalValue, actual value: " + initialVerticalValue + " " + + "< currentValue, actual value = " + currentValue + ")", + initialVerticalValue < currentValue); + } - // Check scroll to Top - { - jspo.scrollToTop(); - int currentValue = jspo.getVerticalScrollBar().getValue(); - System.out.println("Top Scroll Final Value = " + currentValue); - assertTrue("Scroll to Top of Pane " - + "(initialVerticalValue, actual value: " + initialVerticalValue + " " - + "> currentValue, actual value = " + currentValue + ")", - initialVerticalValue > currentValue); - } + // Check scroll to Top + { + jspo.scrollToTop(); + int currentValue = jspo.getVerticalScrollBar().getValue(); + System.out.println("Top Scroll Final Value = " + currentValue); + assertTrue("Scroll to Top of Pane " + + "(initialVerticalValue, actual value: " + initialVerticalValue + " " + + "> currentValue, actual value = " + currentValue + ")", + initialVerticalValue > currentValue); + } - // Check scroll to Left - { - jspo.scrollToLeft(); - int currentValue = jspo.getHorizontalScrollBar().getValue(); - System.out.println("Scroll to Left Final Value = " + currentValue); - assertTrue("Scroll to Left of Pane " - + "(initialHorizontalValue, actual value: " + initialHorizontalValue + " " - + "> currentValue, actual value = " + currentValue + ")", - initialHorizontalValue > currentValue); - } + // Check scroll to Left + { + jspo.scrollToLeft(); + int currentValue = jspo.getHorizontalScrollBar().getValue(); + System.out.println("Scroll to Left Final Value = " + currentValue); + assertTrue("Scroll to Left of Pane " + + "(initialHorizontalValue, actual value: " + initialHorizontalValue + " " + + "> currentValue, actual value = " + currentValue + ")", + initialHorizontalValue > currentValue); + } - // Check scroll to Right - { - jspo.scrollToRight(); - int currentValue = jspo.getHorizontalScrollBar().getValue(); - System.out.println("Scroll to Right Final Value = " + currentValue); - assertTrue("Scroll to Right of Pane " - + "(initialHorizontalValue, actual value: " + initialHorizontalValue + " " - + "< currentValue, actual value = " + currentValue + ")", - initialHorizontalValue < currentValue); - } - }); + // Check scroll to Right + { + jspo.scrollToRight(); + int currentValue = jspo.getHorizontalScrollBar().getValue(); + System.out.println("Scroll to Right Final Value = " + currentValue); + assertTrue("Scroll to Right of Pane " + + "(initialHorizontalValue, actual value: " + initialHorizontalValue + " " + + "< currentValue, actual value = " + currentValue + ")", + initialHorizontalValue < currentValue); + } } } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/SpinnerDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/SpinnerDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/SpinnerDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.spinner.SpinnerDemo; import static com.sun.swingset3.demos.spinner.SpinnerDemo.DEMO_TITLE; import java.text.DecimalFormat; @@ -30,7 +31,7 @@ import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JSpinnerOperator; import org.netbeans.jemmy.operators.JTextFieldOperator; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -39,12 +40,13 @@ * the spinner button and checking text field value. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.spinner.SpinnerDemo * @run testng SpinnerDemoTest */ +@Listeners(GuiTestListener.class) public class SpinnerDemoTest { private static final int SPINNERS_COUNT = 9; @@ -52,16 +54,14 @@ @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(SpinnerDemo.class.getCanonicalName()).startApplication(); + new ClassReference(SpinnerDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - // Check changing different spinners - for (int i = 0; i < SPINNERS_COUNT; i++) { - changeValues(frame, i); - } - }); + // Check changing different spinners + for (int i = 0; i < SPINNERS_COUNT; i++) { + changeValues(frame, i); + } } private void changeValues(JFrameOperator jfo, int spinnerIndex) throws Exception { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/SplitPaneDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/SplitPaneDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/SplitPaneDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.splitpane.SplitPaneDemo; import static com.sun.swingset3.demos.splitpane.SplitPaneDemo.*; import java.awt.event.KeyEvent; @@ -35,6 +36,7 @@ import org.netbeans.jemmy.operators.JSplitPaneOperator; import org.netbeans.jemmy.operators.JTextFieldOperator; import static org.jemmy2ext.JemmyExt.*; +import org.testng.annotations.Listeners; /* * @test @@ -44,39 +46,39 @@ * and changing the divider orientation. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.splitpane.SplitPaneDemo * @run testng SplitPaneDemoTest */ +@Listeners(GuiTestListener.class) public class SplitPaneDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(SplitPaneDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + new ClassReference(SplitPaneDemo.class.getCanonicalName()).startApplication(); + + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - JSplitPaneOperator splitPane = new JSplitPaneOperator(frame); + JSplitPaneOperator splitPane = new JSplitPaneOperator(frame); - // Toggle OneTouch Expandable - checkOneTouch(frame, splitPane, true); - checkOneTouch(frame, splitPane, false); + // Toggle OneTouch Expandable + checkOneTouch(frame, splitPane, true); + checkOneTouch(frame, splitPane, false); - // Check changing divider size to minimum and maximum values - changeDividerSize(frame, splitPane, 50); - changeDividerSize(frame, splitPane, 6); + // Check changing divider size to minimum and maximum values + changeDividerSize(frame, splitPane, 50); + changeDividerSize(frame, splitPane, 6); - // Check moving the divider - checkDividerMoves(frame, splitPane, false); - checkDividerMoves(frame, splitPane, true); + // Check moving the divider + checkDividerMoves(frame, splitPane, false); + checkDividerMoves(frame, splitPane, true); - // Check different minumum Day/Night sizes - changeMinimumSizes(frame, splitPane, 100); - changeMinimumSizes(frame, splitPane, 0); - }); + // Check different minumum Day/Night sizes + changeMinimumSizes(frame, splitPane, 100); + changeMinimumSizes(frame, splitPane, 0); } // Check for different day and night minimum size diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/TabbedPaneDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/TabbedPaneDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/TabbedPaneDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.tabbedpane.TabbedPaneDemo; import static com.sun.swingset3.demos.tabbedpane.TabbedPaneDemo.*; import static org.jemmy2ext.JemmyExt.getLabeledContainerOperator; @@ -31,7 +32,7 @@ import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JRadioButtonOperator; import org.netbeans.jemmy.operators.JTabbedPaneOperator; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -40,25 +41,24 @@ * positions, opening each tab and verifying the the tab gets selected. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.tabbedpane.TabbedPaneDemo * @run testng TabbedPaneDemoTest */ +@Listeners(GuiTestListener.class) public class TabbedPaneDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(TabbedPaneDemo.class.getCanonicalName()).startApplication(); + new ClassReference(TabbedPaneDemo.class.getCanonicalName()).startApplication(); - JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE); + JFrameOperator mainFrame = new JFrameOperator(DEMO_TITLE); - for (String tp : new String[]{TOP, LEFT, BOTTOM, RIGHT}) { - testTabs(mainFrame, tp); - } - }); + for (String tp : new String[]{TOP, LEFT, BOTTOM, RIGHT}) { + testTabs(mainFrame, tp); + } } public void testTabs(JFrameOperator mainFrame, String tabPlacement) throws Exception { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/TextFieldDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/TextFieldDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/TextFieldDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.textfield.JHistoryTextField; import com.sun.swingset3.demos.textfield.TextFieldDemo; import static com.sun.swingset3.demos.textfield.TextFieldDemo.*; @@ -41,6 +42,7 @@ import org.netbeans.jemmy.operators.JLabelOperator; import org.netbeans.jemmy.operators.JPasswordFieldOperator; import org.netbeans.jemmy.operators.JTextFieldOperator; +import org.testng.annotations.Listeners; /* * @test @@ -49,25 +51,25 @@ * checking that app reacts accordingly. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.textfield.TextFieldDemo * @run testng TextFieldDemoTest */ +@Listeners(GuiTestListener.class) public class TextFieldDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(TextFieldDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + new ClassReference(TextFieldDemo.class.getCanonicalName()).startApplication(); - historyTextField(frame); - dateTextField(frame); - passwordField(frame); - }); + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + + historyTextField(frame); + dateTextField(frame); + passwordField(frame); } private void historyTextField(JFrameOperator jfo) throws Exception { diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/ToggleButtonDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/ToggleButtonDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/ToggleButtonDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.DemoProperties; import com.sun.swingset3.demos.togglebutton.DirectionPanel; import com.sun.swingset3.demos.togglebutton.LayoutControlPanel; @@ -40,7 +41,7 @@ import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JRadioButtonOperator; import org.netbeans.jemmy.operators.JTabbedPaneOperator; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -53,50 +54,49 @@ * selected. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.togglebutton.ToggleButtonDemo * @run testng ToggleButtonDemoTest */ +@Listeners(GuiTestListener.class) public class ToggleButtonDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(ToggleButtonDemo.class.getCanonicalName()).startApplication(); + new ClassReference(ToggleButtonDemo.class.getCanonicalName()).startApplication(); - JFrameOperator mainFrame = new JFrameOperator(ToggleButtonDemo.class.getAnnotation(DemoProperties.class).value()); - JTabbedPaneOperator tabPane = new JTabbedPaneOperator(mainFrame); + JFrameOperator mainFrame = new JFrameOperator(ToggleButtonDemo.class.getAnnotation(DemoProperties.class).value()); + JTabbedPaneOperator tabPane = new JTabbedPaneOperator(mainFrame); - // Radio Button Toggles - testRadioButtons(getBorderTitledJPanelOperator(mainFrame, TEXT_RADIO_BUTTONS), 3, null); - testRadioButtons(getBorderTitledJPanelOperator(mainFrame, IMAGE_RADIO_BUTTONS), 3, null); - testRadioButtons(getLabeledContainerOperator(mainFrame, PAD_AMOUNT), 3, (t, i) -> DEFAULT.equals(t)); + // Radio Button Toggles + testRadioButtons(getBorderTitledJPanelOperator(mainFrame, TEXT_RADIO_BUTTONS), 3, null); + testRadioButtons(getBorderTitledJPanelOperator(mainFrame, IMAGE_RADIO_BUTTONS), 3, null); + testRadioButtons(getLabeledContainerOperator(mainFrame, PAD_AMOUNT), 3, (t, i) -> DEFAULT.equals(t)); - // switch to the Check Boxes Tab - tabPane.selectPage(CHECK_BOXES); + // switch to the Check Boxes Tab + tabPane.selectPage(CHECK_BOXES); - // Check Box Toggles - ContainerOperator textCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, TEXT_CHECKBOXES); - testCheckBox(textCheckBoxesJPanel, CHECK1, false); - testCheckBox(textCheckBoxesJPanel, CHECK2, false); - testCheckBox(textCheckBoxesJPanel, CHECK3, false); + // Check Box Toggles + ContainerOperator textCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, TEXT_CHECKBOXES); + testCheckBox(textCheckBoxesJPanel, CHECK1, false); + testCheckBox(textCheckBoxesJPanel, CHECK2, false); + testCheckBox(textCheckBoxesJPanel, CHECK3, false); - ContainerOperator imageCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, IMAGE_CHECKBOXES); - testCheckBox(imageCheckBoxesJPanel, CHECK1, false); - testCheckBox(imageCheckBoxesJPanel, CHECK2, false); - testCheckBox(imageCheckBoxesJPanel, CHECK3, false); + ContainerOperator imageCheckBoxesJPanel = getBorderTitledJPanelOperator(mainFrame, IMAGE_CHECKBOXES); + testCheckBox(imageCheckBoxesJPanel, CHECK1, false); + testCheckBox(imageCheckBoxesJPanel, CHECK2, false); + testCheckBox(imageCheckBoxesJPanel, CHECK3, false); - ContainerOperator displayOptionsContainer = getLabeledContainerOperator(mainFrame, DISPLAY_OPTIONS); - testCheckBox(displayOptionsContainer, PAINT_BORDER, false); - testCheckBox(displayOptionsContainer, PAINT_FOCUS, true); - testCheckBox(displayOptionsContainer, ENABLED, true); - testCheckBox(displayOptionsContainer, CONTENT_FILLED, true); + ContainerOperator displayOptionsContainer = getLabeledContainerOperator(mainFrame, DISPLAY_OPTIONS); + testCheckBox(displayOptionsContainer, PAINT_BORDER, false); + testCheckBox(displayOptionsContainer, PAINT_FOCUS, true); + testCheckBox(displayOptionsContainer, ENABLED, true); + testCheckBox(displayOptionsContainer, CONTENT_FILLED, true); - // Direction Button Toggles - testToggleButtons(mainFrame); - }); + // Direction Button Toggles + testToggleButtons(mainFrame); } /** diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/TreeDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/TreeDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/TreeDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.tree.TreeDemo; import static com.sun.swingset3.demos.tree.TreeDemo.DEMO_TITLE; import javax.swing.tree.TreePath; @@ -29,7 +30,7 @@ import org.netbeans.jemmy.ClassReference; import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JTreeOperator; -import static org.jemmy2ext.JemmyExt.captureDebugInfoOnFail; +import org.testng.annotations.Listeners; /* * @test @@ -42,67 +43,67 @@ * vertically (as ScrollPane allows it). * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.tree.TreeDemo * @run testng TreeDemoTest */ +@Listeners(GuiTestListener.class) public class TreeDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(TreeDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(DEMO_TITLE); + new ClassReference(TreeDemo.class.getCanonicalName()).startApplication(); + + JFrameOperator frame = new JFrameOperator(DEMO_TITLE); - JTreeOperator tree = new JTreeOperator(frame); + JTreeOperator tree = new JTreeOperator(frame); - assertEquals("Initial number of rows in the tree", 4, tree.getRowCount()); + assertEquals("Initial number of rows in the tree", 4, tree.getRowCount()); - int initialTreeHeight = tree.getHeight(); + int initialTreeHeight = tree.getHeight(); - // expand all nodes - int expandsCount = 0; - for (int i = 0; i < tree.getRowCount(); i++) { - TreePath tp = tree.getPathForRow(i); - if (tree.getChildCount(tp) > 0 && !tree.isExpanded(tp)) { - tree.expandRow(i); - expandsCount++; - } + // expand all nodes + int expandsCount = 0; + for (int i = 0; i < tree.getRowCount(); i++) { + TreePath tp = tree.getPathForRow(i); + if (tree.getChildCount(tp) > 0 && !tree.isExpanded(tp)) { + tree.expandRow(i); + expandsCount++; } + } - assertEquals("Number of rows expanded", 75, expandsCount); - assertEquals("Number of rows in the tree after expanding all of them", - 616, tree.getRowCount()); + assertEquals("Number of rows expanded", 75, expandsCount); + assertEquals("Number of rows in the tree after expanding all of them", + 616, tree.getRowCount()); - int expandedTreeHeight = tree.getHeight(); - assertTrue("Expanded tree height has increased, current " - + expandedTreeHeight + " > initial " + initialTreeHeight, - expandedTreeHeight > initialTreeHeight); + int expandedTreeHeight = tree.getHeight(); + assertTrue("Expanded tree height has increased, current " + + expandedTreeHeight + " > initial " + initialTreeHeight, + expandedTreeHeight > initialTreeHeight); - // collapse all nodes - int collapsesCount = 0; - for (int i = tree.getRowCount() - 1; i >= 0; i--) { - TreePath tp = tree.getPathForRow(i); - if (tree.getChildCount(tp) > 0 && tree.isExpanded(tp)) { - tree.collapseRow(i); - collapsesCount++; - } + // collapse all nodes + int collapsesCount = 0; + for (int i = tree.getRowCount() - 1; i >= 0; i--) { + TreePath tp = tree.getPathForRow(i); + if (tree.getChildCount(tp) > 0 && tree.isExpanded(tp)) { + tree.collapseRow(i); + collapsesCount++; } + } - assertEquals("Number of rows collapsed", 76, collapsesCount); - assertEquals("Number of rows in the tree after collapsing all of them", - 1, tree.getRowCount()); + assertEquals("Number of rows collapsed", 76, collapsesCount); + assertEquals("Number of rows in the tree after collapsing all of them", + 1, tree.getRowCount()); - int collapsedTreeHeight = tree.getHeight(); - assertTrue("Collpased tree height is not longer than initial, " - + "current " + collapsedTreeHeight + " <= initial " - + initialTreeHeight, - collapsedTreeHeight <= initialTreeHeight); + int collapsedTreeHeight = tree.getHeight(); + assertTrue("Collpased tree height is not longer than initial, " + + "current " + collapsedTreeHeight + " <= initial " + + initialTreeHeight, + collapsedTreeHeight <= initialTreeHeight); - }); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/SwingSet/src/WindowDemoTest.java --- a/jdk/test/sanity/client/SwingSet/src/WindowDemoTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/SwingSet/src/WindowDemoTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -21,6 +21,7 @@ * questions. */ +import org.jtregext.GuiTestListener; import com.sun.swingset3.demos.window.WindowDemo; import static com.sun.swingset3.demos.window.WindowDemo.*; import static org.jemmy2ext.JemmyExt.*; @@ -31,6 +32,7 @@ import org.netbeans.jemmy.operators.JFrameOperator; import org.netbeans.jemmy.operators.JLabelOperator; import org.netbeans.jemmy.operators.WindowOperator; +import org.testng.annotations.Listeners; /* * @test @@ -40,37 +42,37 @@ * when the "Show JWindow..." button is clicked. * * @library /sanity/client/lib/jemmy/src - * @library /sanity/client/lib/Jemmy2Ext/src + * @library /sanity/client/lib/Extensions/src * @library /sanity/client/lib/SwingSet3/src * @build org.jemmy2ext.JemmyExt * @build com.sun.swingset3.demos.window.WindowDemo * @run testng WindowDemoTest */ +@Listeners(GuiTestListener.class) public class WindowDemoTest { @Test public void test() throws Exception { - captureDebugInfoOnFail(() -> { - new ClassReference(WindowDemo.class.getCanonicalName()).startApplication(); + + new ClassReference(WindowDemo.class.getCanonicalName()).startApplication(); - JFrameOperator frame = new JFrameOperator(); + JFrameOperator frame = new JFrameOperator(); - assertEquals("Only one JWindow is shown", 1, getJWindowCount()); + assertEquals("Only one JWindow is shown", 1, getJWindowCount()); - WindowOperator window = new WindowOperator(getJWindow()); + WindowOperator window = new WindowOperator(getJWindow()); - assertTrue("JFrame is showing", frame.isShowing()); - assertFalse("JFrame is not iconified", isIconified(frame)); - assertTrue("JWindow is showing", window.isShowing()); + assertTrue("JFrame is showing", frame.isShowing()); + assertFalse("JFrame is not iconified", isIconified(frame)); + assertTrue("JWindow is showing", window.isShowing()); - final String labelText = I_HAVE_NO_SYSTEM_BORDER; - JLabelOperator jLabelOperator = new JLabelOperator(window, labelText); - assertEquals("JWindow contains the label with corresponding text", labelText, jLabelOperator.getText()); + final String labelText = I_HAVE_NO_SYSTEM_BORDER; + JLabelOperator jLabelOperator = new JLabelOperator(window, labelText); + assertEquals("JWindow contains the label with corresponding text", labelText, jLabelOperator.getText()); - new JButtonOperator(frame, SHOW_J_WINDOW).push(); + new JButtonOperator(frame, SHOW_J_WINDOW).push(); - assertEquals("Only one JWindow is shown", 1, getJWindowCount()); - }); + assertEquals("Only one JWindow is shown", 1, getJWindowCount()); } } diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/TEST.ROOT.template --- a/jdk/test/sanity/client/TEST.ROOT.template Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/TEST.ROOT.template Thu Apr 28 09:38:19 2016 -0700 @@ -12,7 +12,7 @@ # A "headful" test requires a graphical environment to meaningfully # run. Tests that are not headful are "headless." -keys=screenshots +keys=2d dnd i18n intermittent randomness headful # Tests that must run in othervm mode othervm.dirs=sanity/client/SwingSet diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/lib/Extensions/src/org/jemmy2ext/JemmyExt.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sanity/client/lib/Extensions/src/org/jemmy2ext/JemmyExt.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,613 @@ +/* + * 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ +package org.jemmy2ext; + +import java.awt.Component; +import java.awt.EventQueue; +import java.awt.Frame; +import java.awt.Graphics; +import java.awt.Rectangle; +import java.awt.Robot; +import java.awt.Window; +import java.awt.image.BufferedImage; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.lang.reflect.InvocationTargetException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.stream.IntStream; +import javax.imageio.ImageIO; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JPanel; +import javax.swing.JWindow; +import javax.swing.border.Border; +import javax.swing.border.CompoundBorder; +import javax.swing.border.TitledBorder; +import org.netbeans.jemmy.ComponentChooser; +import org.netbeans.jemmy.DefaultCharBindingMap; +import org.netbeans.jemmy.QueueTool; +import org.netbeans.jemmy.TimeoutExpiredException; +import org.netbeans.jemmy.Waitable; +import org.netbeans.jemmy.Waiter; +import org.netbeans.jemmy.drivers.scrolling.JSpinnerDriver; +import org.netbeans.jemmy.image.StrictImageComparator; +import org.netbeans.jemmy.operators.ComponentOperator; +import org.netbeans.jemmy.operators.ContainerOperator; +import org.netbeans.jemmy.operators.FrameOperator; +import org.netbeans.jemmy.operators.JButtonOperator; +import org.netbeans.jemmy.operators.JFrameOperator; +import org.netbeans.jemmy.operators.JLabelOperator; +import org.netbeans.jemmy.operators.Operator; +import org.netbeans.jemmy.util.Dumper; +import org.netbeans.jemmy.util.PNGEncoder; +import static org.testng.AssertJUnit.*; + +/** + * This class solves two tasks: 1. It adds functionality that is missing in + * Jemmy 2. It references all the Jemmy API that is needed by tests so that they + * can just @build JemmyExt class and do not worry about Jemmy + * + * @author akouznet + */ +public class JemmyExt { + + /** + * Statically referencing all the classes that are needed by tests so that + * they're compiled by jtreg + */ + static final Class[] DEPENDENCIES = { + JSpinnerDriver.class, + DefaultCharBindingMap.class + }; + + public static void assertNotBlack(BufferedImage image) { + int w = image.getWidth(); + int h = image.getHeight(); + try { + assertFalse("All pixels are not black", IntStream.range(0, w).parallel().allMatch(x + -> IntStream.range(0, h).allMatch(y -> (image.getRGB(x, y) & 0xffffff) == 0) + )); + } catch (Throwable t) { + save(image, "allPixelsAreBlack.png"); + throw t; + } + } + + public static void waitArmed(JButtonOperator button) { + button.waitState(new ComponentChooser() { + + @Override + public boolean checkComponent(Component comp) { + return isArmed(button); + } + + @Override + public String getDescription() { + return "Button is armed"; + } + }); + } + + public static boolean isArmed(JButtonOperator button) { + return button.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("getModel().isArmed()") { + + @Override + public Boolean launch() throws Exception { + return ((JButton) button.getSource()).getModel().isArmed(); + } + }); + } + + public static void waitPressed(JButtonOperator button) { + button.waitState(new ComponentChooser() { + + @Override + public boolean checkComponent(Component comp) { + return isPressed(button); + } + + @Override + public String getDescription() { + return "Button is pressed"; + } + }); + } + + public static boolean isPressed(JButtonOperator button) { + return button.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("getModel().isPressed()") { + + @Override + public Boolean launch() throws Exception { + return ((JButton) button.getSource()).getModel().isPressed(); + } + }); + } + + public static void assertEquals(String string, StrictImageComparator comparator, BufferedImage expected, BufferedImage actual) { + try { + assertTrue(string, comparator.compare(expected, actual)); + } catch (Error err) { + save(expected, "expected.png"); + save(actual, "actual.png"); + throw err; + } + } + + public static void assertNotEquals(String string, StrictImageComparator comparator, BufferedImage notExpected, BufferedImage actual) { + try { + assertFalse(string, comparator.compare(notExpected, actual)); + } catch (Error err) { + save(notExpected, "notExpected.png"); + save(actual, "actual.png"); + throw err; + } + } + + public static void save(BufferedImage image, String filename) { + String filepath = filename; + try { + filepath = new File(filename).getCanonicalPath(); + System.out.println("Saving screenshot to " + filepath); + BufferedOutputStream file = new BufferedOutputStream(new FileOutputStream(filepath)); + new PNGEncoder(file, PNGEncoder.COLOR_MODE).encode(image); + } catch (IOException ioe) { + throw new RuntimeException("Failed to save image to " + filepath, ioe); + } + } + + public static void waitImageIsStill(Robot rob, ComponentOperator operator) { + operator.waitState(new ComponentChooser() { + + private BufferedImage previousImage = null; + private int index = 0; + private final StrictImageComparator sComparator = new StrictImageComparator(); + + @Override + public boolean checkComponent(Component comp) { + BufferedImage currentImage = capture(rob, operator); + save(currentImage, "waitImageIsStill" + index + ".png"); + index++; + boolean compareResult = previousImage == null ? false : sComparator.compare(currentImage, previousImage); + previousImage = currentImage; + return compareResult; + } + + @Override + public String getDescription() { + return "Image of " + operator + " is still"; + } + }); + } + + private static class ThrowableHolder { + + volatile Throwable t; + } + + public static void waitFor(String description, RunnableWithException r) throws Exception { + Waiter waiter = new Waiter<>(new Waitable() { + + @Override + public Boolean actionProduced(ThrowableHolder obj) { + try { + r.run(); + return true; + } catch (Throwable t) { + obj.t = t; + return null; + } + } + + @Override + public String getDescription() { + return description; + } + }); + ThrowableHolder th = new ThrowableHolder(); + try { + waiter.waitAction(th); + } catch (TimeoutExpiredException tee) { + Throwable t = th.t; + if (t != null) { + t.addSuppressed(tee); + if (t instanceof Exception) { + throw (Exception) t; + } else if (t instanceof Error) { + throw (Error) t; + } else if (t instanceof RuntimeException) { + throw (RuntimeException) t; + } else { + throw new IllegalStateException("Unexpected exception type", t); + } + } + } + } + + public static BufferedImage capture(Robot rob, ComponentOperator operator) { + Rectangle boundary = new Rectangle(operator.getLocationOnScreen(), + operator.getSize()); + return rob.createScreenCapture(boundary); + } + + /** + * Dispose all AWT/Swing windows causing event thread to stop + */ + public static void disposeAllWindows() { + System.out.println("disposeAllWindows"); + try { + EventQueue.invokeAndWait(() -> { + Window[] windows = Window.getWindows(); + for (Window w : windows) { + w.dispose(); + } + }); + } catch (InterruptedException | InvocationTargetException ex) { + Logger.getLogger(JemmyExt.class.getName()).log(Level.SEVERE, "Failed to dispose all windows", ex); + } + } + + /** + * This is a helper class which allows to catch throwables thrown in other + * threads and throw them in the main test thread + */ + public static class MultiThreadedTryCatch { + + private final List throwables + = Collections.synchronizedList(new ArrayList<>()); + + /** + * Throws registered throwables. If the list of the registered + * throwables is not empty, it re-throws the first throwable in the list + * adding all others into its suppressed list. Can be used in any + * thread. + * + * @throws Exception + */ + public void throwRegistered() throws Exception { + Throwable root = null; + synchronized (throwables) { + if (!throwables.isEmpty()) { + root = throwables.remove(0); + while (!throwables.isEmpty()) { + root.addSuppressed(throwables.remove(0)); + } + } + } + if (root != null) { + if (root instanceof Error) { + throw (Error) root; + } else if (root instanceof Exception) { + throw (Exception) root; + } else { + throw new AssertionError("Unexpected exception type: " + root.getClass() + " (" + root + ")"); + } + } + } + + /** + * Registers a throwable and adds it to the list of throwables. Can be + * used in any thread. + * + * @param t + */ + public void register(Throwable t) { + t.printStackTrace(); + throwables.add(t); + } + + /** + * Registers a throwable and adds it as the first item of the list of + * catched throwables. + * + * @param t + */ + public void registerRoot(Throwable t) { + t.printStackTrace(); + throwables.add(0, t); + } + } + + /** + * Trying to capture as much information as possible. Currently it includes + * full dump and a screenshot of the whole screen. + */ + public static void captureAll() { + PNGEncoder.captureScreen("failure.png", PNGEncoder.COLOR_MODE); + try { + Dumper.dumpAll("dumpAll.xml"); + } catch (FileNotFoundException ex) { + Logger.getLogger(JemmyExt.class.getName()).log(Level.SEVERE, null, ex); + } + captureWindows(); + } + + /** + * Captures each showing window image using Window.paint() method. + */ + private static void captureWindows() { + try { + EventQueue.invokeAndWait(() -> { + Window[] windows = Window.getWindows(); + int index = 0; + for (Window w : windows) { + if (!w.isShowing()) { + continue; + } + BufferedImage img = new BufferedImage(w.getWidth(), w.getHeight(), BufferedImage.TYPE_INT_ARGB); + Graphics g = img.getGraphics(); + w.paint(g); + g.dispose(); + + try { + ImageIO.write(img, "png", new File("window" + index++ + ".png")); + } catch (IOException e) { + e.printStackTrace(); + } + } + }); + } catch (InterruptedException | InvocationTargetException ex) { + Logger.getLogger(JemmyExt.class.getName()).log(Level.SEVERE, null, ex); + } + } + + public static interface RunnableWithException { + + public void run() throws Exception; + } + + public static void waitIsFocused(JFrameOperator jfo) { + jfo.waitState(new ComponentChooser() { + + @Override + public boolean checkComponent(Component comp) { + return jfo.isFocused(); + } + + @Override + public String getDescription() { + return "JFrame is focused"; + } + }); + } + + public static int getJWindowCount() { + return new QueueTool().invokeAndWait(new QueueTool.QueueAction(null) { + + @Override + public Integer launch() throws Exception { + Window[] windows = Window.getWindows(); + int windowCount = 0; + for (Window w : windows) { + if (w.getClass().equals(JWindow.class)) { + windowCount++; + } + } + return windowCount; + } + }); + } + + public static JWindow getJWindow() { + return getJWindow(0); + } + + public static JWindow getJWindow(int index) { + return new QueueTool().invokeAndWait(new QueueTool.QueueAction(null) { + + @Override + public JWindow launch() throws Exception { + Window[] windows = Window.getWindows(); + int windowIndex = 0; + for (Window w : windows) { + if (w.getClass().equals(JWindow.class)) { + if (windowIndex == index) { + return (JWindow) w; + } + windowIndex++; + } + } + return null; + } + }); + } + + public static boolean isIconified(FrameOperator frameOperator) { + return frameOperator.getQueueTool().invokeAndWait(new QueueTool.QueueAction("Frame is iconified") { + + @Override + public Boolean launch() throws Exception { + return (((Frame) frameOperator.getSource()).getState() & Frame.ICONIFIED) != 0; + } + }); + } + + public static final Operator.DefaultStringComparator EXACT_STRING_COMPARATOR + = new Operator.DefaultStringComparator(true, true); + + /** + * Finds a label with the exact labelText and returns the operator for its + * parent container. + * + * @param container + * @param labelText + * @return + */ + public static ContainerOperator getLabeledContainerOperator(ContainerOperator container, String labelText) { + + container.setComparator(EXACT_STRING_COMPARATOR); + + JLabelOperator jLabelOperator = new JLabelOperator(container, labelText); + + assert labelText.equals(jLabelOperator.getText()); + + return new ContainerOperator<>(jLabelOperator.getParent()); + } + + /** + * Finds a JPanel with exact title text. + * + * @param container + * @param titleText + * @return + */ + public static ContainerOperator getBorderTitledJPanelOperator(ContainerOperator container, String titleText) { + return new ContainerOperator<>(container, new JPanelByBorderTitleFinder(titleText, EXACT_STRING_COMPARATOR)); + } + + public static final QueueTool QUEUE_TOOL = new QueueTool(); + + /** + * Allows to find JPanel by the title text in its border. + */ + public static class JPanelByBorderTitleFinder implements ComponentChooser { + + String titleText; + Operator.StringComparator comparator; + + /** + * @param titleText title text pattern + * @param comparator specifies string comparison algorithm. + */ + public JPanelByBorderTitleFinder(String titleText, Operator.StringComparator comparator) { + this.titleText = titleText; + this.comparator = comparator; + } + + /** + * @param titleText title text pattern + */ + public JPanelByBorderTitleFinder(String titleText) { + this(titleText, Operator.getDefaultStringComparator()); + } + + @Override + public boolean checkComponent(Component comp) { + assert EventQueue.isDispatchThread(); + if (comp instanceof JPanel) { + return checkBorder(((JPanel) comp).getBorder()); + } + return false; + } + + public boolean checkBorder(Border border) { + if (border instanceof TitledBorder) { + String title = ((TitledBorder) border).getTitle(); + return comparator.equals(title, titleText); + } else if (border instanceof CompoundBorder) { + CompoundBorder compoundBorder = (CompoundBorder) border; + return checkBorder(compoundBorder.getInsideBorder()) || checkBorder(compoundBorder.getOutsideBorder()); + } else { + return false; + } + } + + @Override + public String getDescription() { + return ("JPanel with border title text \"" + titleText + "\" with comparator " + comparator); + } + } + + public static class ByClassSimpleNameChooser implements ComponentChooser { + + private final String className; + + public ByClassSimpleNameChooser(String className) { + this.className = className; + } + + @Override + public boolean checkComponent(Component comp) { + return comp.getClass().getSimpleName().equals(className); + } + + @Override + public String getDescription() { + return "Component with the simple class name of " + className; + } + + } + + public static class ByClassChooser implements ComponentChooser { + + private final Class clazz; + + public ByClassChooser(Class clazz) { + this.clazz = clazz; + } + + @Override + public boolean checkComponent(Component comp) { + return comp.getClass().equals(clazz); + } + + @Override + public String getDescription() { + return "Component with the class of " + clazz; + } + + } + + public static class ByToolTipChooser implements ComponentChooser { + + private final String tooltip; + + public ByToolTipChooser(String tooltip) { + if (tooltip == null) { + throw new NullPointerException("Tooltip cannot be null"); + } + this.tooltip = tooltip; + } + + @Override + public boolean checkComponent(Component comp) { + return (comp instanceof JComponent) + ? tooltip.equals(((JComponent) comp).getToolTipText()) + : false; + } + + @Override + public String getDescription() { + return "JComponent with the tooltip '" + tooltip + "'"; + } + + } + + @SuppressWarnings(value = "unchecked") + public static R getUIValue(O operator, Function getter) { + return operator.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("getting UI value through the queue using " + getter) { + + @Override + public R launch() throws Exception { + return getter.apply((S) operator.getSource()); + } + }); + } +} diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/lib/Extensions/src/org/jtregext/GuiTestListener.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sanity/client/lib/Extensions/src/org/jtregext/GuiTestListener.java Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,72 @@ +package org.jtregext; + +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + + +import org.jemmy2ext.JemmyExt; +import static org.jemmy2ext.JemmyExt.captureAll; +import org.testng.ITestContext; +import org.testng.ITestListener; +import org.testng.ITestResult; + +// TODO: Remove this once https://bugs.openjdk.java.net/browse/JDK-8151671 is fixed +public class GuiTestListener implements ITestListener { + + private void afterTest() { + JemmyExt.disposeAllWindows(); + } + + @Override + public void onTestStart(ITestResult result) { + } + + @Override + public void onTestSuccess(ITestResult result) { + System.out.println("TEST PASSED"); + afterTest(); + } + + @Override + public void onTestFailure(ITestResult result) { + captureAll(); + afterTest(); + } + + @Override + public void onTestSkipped(ITestResult result) { + } + + @Override + public void onTestFailedButWithinSuccessPercentage(ITestResult result) { + } + + @Override + public void onStart(ITestContext context) { + } + + @Override + public void onFinish(ITestContext context) { + } + +} diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/lib/Jemmy2Ext/src/org/jemmy2ext/JemmyExt.java --- a/jdk/test/sanity/client/lib/Jemmy2Ext/src/org/jemmy2ext/JemmyExt.java Thu Apr 28 08:26:38 2016 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,614 +0,0 @@ -/* - * 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ -package org.jemmy2ext; - -import java.awt.Component; -import java.awt.EventQueue; -import java.awt.Frame; -import java.awt.Graphics; -import java.awt.Rectangle; -import java.awt.Robot; -import java.awt.Window; -import java.awt.image.BufferedImage; -import java.io.BufferedOutputStream; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.function.Function; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.stream.IntStream; -import javax.imageio.ImageIO; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JPanel; -import javax.swing.JWindow; -import javax.swing.border.Border; -import javax.swing.border.CompoundBorder; -import javax.swing.border.TitledBorder; -import org.netbeans.jemmy.ComponentChooser; -import org.netbeans.jemmy.DefaultCharBindingMap; -import org.netbeans.jemmy.QueueTool; -import org.netbeans.jemmy.TimeoutExpiredException; -import org.netbeans.jemmy.Waitable; -import org.netbeans.jemmy.Waiter; -import org.netbeans.jemmy.drivers.scrolling.JSpinnerDriver; -import org.netbeans.jemmy.image.StrictImageComparator; -import org.netbeans.jemmy.operators.ComponentOperator; -import org.netbeans.jemmy.operators.ContainerOperator; -import org.netbeans.jemmy.operators.FrameOperator; -import org.netbeans.jemmy.operators.JButtonOperator; -import org.netbeans.jemmy.operators.JFrameOperator; -import org.netbeans.jemmy.operators.JLabelOperator; -import org.netbeans.jemmy.operators.Operator; -import org.netbeans.jemmy.util.Dumper; -import org.netbeans.jemmy.util.PNGEncoder; -import static org.testng.AssertJUnit.*; - -/** - * This class solves two tasks: 1. It adds functionality that is missing in - * Jemmy 2. It references all the Jemmy API that is needed by tests so that they - * can just @build JemmyExt class and do not worry about Jemmy - * - * @author akouznet - */ -public class JemmyExt { - - /** - * Statically referencing all the classes that are needed by tests so that - * they're compiled by jtreg - */ - static final Class[] DEPENDENCIES = { - JSpinnerDriver.class, - DefaultCharBindingMap.class - }; - - public static void assertNotBlack(BufferedImage image) { - int w = image.getWidth(); - int h = image.getHeight(); - try { - assertFalse("All pixels are not black", IntStream.range(0, w).parallel().allMatch(x - -> IntStream.range(0, h).allMatch(y -> (image.getRGB(x, y) & 0xffffff) == 0) - )); - } catch (Throwable t) { - save(image, "allPixelsAreBlack.png"); - throw t; - } - } - - public static void waitArmed(JButtonOperator button) { - button.waitState(new ComponentChooser() { - - @Override - public boolean checkComponent(Component comp) { - return isArmed(button); - } - - @Override - public String getDescription() { - return "Button is armed"; - } - }); - } - - public static boolean isArmed(JButtonOperator button) { - return button.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("getModel().isArmed()") { - - @Override - public Boolean launch() throws Exception { - return ((JButton) button.getSource()).getModel().isArmed(); - } - }); - } - - public static void waitPressed(JButtonOperator button) { - button.waitState(new ComponentChooser() { - - @Override - public boolean checkComponent(Component comp) { - return isPressed(button); - } - - @Override - public String getDescription() { - return "Button is pressed"; - } - }); - } - - public static boolean isPressed(JButtonOperator button) { - return button.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("getModel().isPressed()") { - - @Override - public Boolean launch() throws Exception { - return ((JButton) button.getSource()).getModel().isPressed(); - } - }); - } - - public static void assertEquals(String string, StrictImageComparator comparator, BufferedImage expected, BufferedImage actual) { - try { - assertTrue(string, comparator.compare(expected, actual)); - } catch (Error err) { - save(expected, "expected.png"); - save(actual, "actual.png"); - throw err; - } - } - - public static void assertNotEquals(String string, StrictImageComparator comparator, BufferedImage notExpected, BufferedImage actual) { - try { - assertFalse(string, comparator.compare(notExpected, actual)); - } catch (Error err) { - save(notExpected, "notExpected.png"); - save(actual, "actual.png"); - throw err; - } - } - - public static void save(BufferedImage image, String filename) { - String filepath = filename; - try { - filepath = new File(filename).getCanonicalPath(); - System.out.println("Saving screenshot to " + filepath); - BufferedOutputStream file = new BufferedOutputStream(new FileOutputStream(filepath)); - new PNGEncoder(file, PNGEncoder.COLOR_MODE).encode(image); - } catch (IOException ioe) { - throw new RuntimeException("Failed to save image to " + filepath, ioe); - } - } - - public static void waitImageIsStill(Robot rob, ComponentOperator operator) { - operator.waitState(new ComponentChooser() { - - private BufferedImage previousImage = null; - private int index = 0; - private final StrictImageComparator sComparator = new StrictImageComparator(); - - @Override - public boolean checkComponent(Component comp) { - BufferedImage currentImage = capture(rob, operator); - save(currentImage, "waitImageIsStill" + index + ".png"); - index++; - boolean compareResult = previousImage == null ? false : sComparator.compare(currentImage, previousImage); - previousImage = currentImage; - return compareResult; - } - - @Override - public String getDescription() { - return "Image of " + operator + " is still"; - } - }); - } - - private static class ThrowableHolder { - - volatile Throwable t; - } - - public static void waitFor(String description, RunnableWithException r) throws Exception { - Waiter waiter = new Waiter<>(new Waitable() { - - @Override - public Boolean actionProduced(ThrowableHolder obj) { - try { - r.run(); - return true; - } catch (Throwable t) { - obj.t = t; - return null; - } - } - - @Override - public String getDescription() { - return description; - } - }); - ThrowableHolder th = new ThrowableHolder(); - try { - waiter.waitAction(th); - } catch (TimeoutExpiredException tee) { - Throwable t = th.t; - if (t != null) { - t.addSuppressed(tee); - if (t instanceof Exception) { - throw (Exception) t; - } else if (t instanceof Error) { - throw (Error) t; - } else if (t instanceof RuntimeException) { - throw (RuntimeException) t; - } else { - throw new IllegalStateException("Unexpected exception type", t); - } - } - } - } - - public static BufferedImage capture(Robot rob, ComponentOperator operator) { - Rectangle boundary = new Rectangle(operator.getLocationOnScreen(), - operator.getSize()); - return rob.createScreenCapture(boundary); - } - - /** - * Wraps the test code so that in case of any failure as much information as - * possible is captured - * - * @param r test code Runnable - * @throws Exception whatever exception the test may throw - */ - public static void captureDebugInfoOnFail(RunnableWithException r) throws Exception { - // TODO: Remove this once https://bugs.openjdk.java.net/browse/JDK-8151671 is fixed - try { - r.run(); - System.out.println("TEST PASSED"); - } catch (Throwable t) { - captureAll(); - throw t; - } - } - - /** - * This is a helper class which allows to catch throwables thrown in other - * threads and throw them in the main test thread - */ - public static class MultiThreadedTryCatch { - - private final List throwables - = Collections.synchronizedList(new ArrayList<>()); - - /** - * Throws registered throwables. If the list of the registered - * throwables is not empty, it re-throws the first throwable in the list - * adding all others into its suppressed list. Can be used in any - * thread. - * - * @throws Exception - */ - public void throwRegistered() throws Exception { - Throwable root = null; - synchronized (throwables) { - if (!throwables.isEmpty()) { - root = throwables.remove(0); - while (!throwables.isEmpty()) { - root.addSuppressed(throwables.remove(0)); - } - } - } - if (root != null) { - if (root instanceof Error) { - throw (Error) root; - } else if (root instanceof Exception) { - throw (Exception) root; - } else { - throw new AssertionError("Unexpected exception type: " + root.getClass() + " (" + root + ")"); - } - } - } - - /** - * Registers a throwable and adds it to the list of throwables. Can be - * used in any thread. - * - * @param t - */ - public void register(Throwable t) { - t.printStackTrace(); - throwables.add(t); - } - - /** - * Registers a throwable and adds it as the first item of the list of - * catched throwables. - * - * @param t - */ - public void registerRoot(Throwable t) { - t.printStackTrace(); - throwables.add(0, t); - } - } - - /** - * Trying to capture as much information as possible. Currently it includes - * full dump and a screenshot of the whole screen. - */ - public static void captureAll() { - PNGEncoder.captureScreen("failure.png", PNGEncoder.COLOR_MODE); - try { - Dumper.dumpAll("dumpAll.xml"); - } catch (FileNotFoundException ex) { - Logger.getLogger(JemmyExt.class.getName()).log(Level.SEVERE, null, ex); - } - captureWindows(); - } - - /** - * Captures each showing window image using Window.paint() method. - */ - private static void captureWindows() { - try { - EventQueue.invokeAndWait(() -> { - Window[] windows = Window.getWindows(); - int index = 0; - for (Window w : windows) { - if (!w.isShowing()) { - continue; - } - BufferedImage img = new BufferedImage(w.getWidth(), w.getHeight(), BufferedImage.TYPE_INT_ARGB); - Graphics g = img.getGraphics(); - w.paint(g); - g.dispose(); - - try { - ImageIO.write(img, "png", new File("window" + index++ + ".png")); - } catch (IOException e) { - e.printStackTrace(); - } - } - }); - } catch (InterruptedException | InvocationTargetException ex) { - Logger.getLogger(JemmyExt.class.getName()).log(Level.SEVERE, null, ex); - } - } - - public static interface RunnableWithException { - - public void run() throws Exception; - } - - public static void waitIsFocused(JFrameOperator jfo) { - jfo.waitState(new ComponentChooser() { - - @Override - public boolean checkComponent(Component comp) { - return jfo.isFocused(); - } - - @Override - public String getDescription() { - return "JFrame is focused"; - } - }); - } - - public static int getJWindowCount() { - return new QueueTool().invokeAndWait(new QueueTool.QueueAction(null) { - - @Override - public Integer launch() throws Exception { - Window[] windows = Window.getWindows(); - int windowCount = 0; - for (Window w : windows) { - if (w.getClass().equals(JWindow.class)) { - windowCount++; - } - } - return windowCount; - } - }); - } - - public static JWindow getJWindow() { - return getJWindow(0); - } - - public static JWindow getJWindow(int index) { - return new QueueTool().invokeAndWait(new QueueTool.QueueAction(null) { - - @Override - public JWindow launch() throws Exception { - Window[] windows = Window.getWindows(); - int windowIndex = 0; - for (Window w : windows) { - if (w.getClass().equals(JWindow.class)) { - if (windowIndex == index) { - return (JWindow) w; - } - windowIndex++; - } - } - return null; - } - }); - } - - public static boolean isIconified(FrameOperator frameOperator) { - return frameOperator.getQueueTool().invokeAndWait(new QueueTool.QueueAction("Frame is iconified") { - - @Override - public Boolean launch() throws Exception { - return (((Frame) frameOperator.getSource()).getState() & Frame.ICONIFIED) != 0; - } - }); - } - - public static final Operator.DefaultStringComparator EXACT_STRING_COMPARATOR - = new Operator.DefaultStringComparator(true, true); - - /** - * Finds a label with the exact labelText and returns the operator for its - * parent container. - * - * @param container - * @param labelText - * @return - */ - public static ContainerOperator getLabeledContainerOperator(ContainerOperator container, String labelText) { - - container.setComparator(EXACT_STRING_COMPARATOR); - - JLabelOperator jLabelOperator = new JLabelOperator(container, labelText); - - assert labelText.equals(jLabelOperator.getText()); - - return new ContainerOperator<>(jLabelOperator.getParent()); - } - - /** - * Finds a JPanel with exact title text. - * - * @param container - * @param titleText - * @return - */ - public static ContainerOperator getBorderTitledJPanelOperator(ContainerOperator container, String titleText) { - return new ContainerOperator<>(container, new JPanelByBorderTitleFinder(titleText, EXACT_STRING_COMPARATOR)); - } - - public static final QueueTool QUEUE_TOOL = new QueueTool(); - - /** - * Allows to find JPanel by the title text in its border. - */ - public static class JPanelByBorderTitleFinder implements ComponentChooser { - - String titleText; - Operator.StringComparator comparator; - - /** - * @param titleText title text pattern - * @param comparator specifies string comparison algorithm. - */ - public JPanelByBorderTitleFinder(String titleText, Operator.StringComparator comparator) { - this.titleText = titleText; - this.comparator = comparator; - } - - /** - * @param titleText title text pattern - */ - public JPanelByBorderTitleFinder(String titleText) { - this(titleText, Operator.getDefaultStringComparator()); - } - - @Override - public boolean checkComponent(Component comp) { - assert EventQueue.isDispatchThread(); - if (comp instanceof JPanel) { - return checkBorder(((JPanel) comp).getBorder()); - } - return false; - } - - public boolean checkBorder(Border border) { - if (border instanceof TitledBorder) { - String title = ((TitledBorder) border).getTitle(); - return comparator.equals(title, titleText); - } else if (border instanceof CompoundBorder) { - CompoundBorder compoundBorder = (CompoundBorder) border; - return checkBorder(compoundBorder.getInsideBorder()) || checkBorder(compoundBorder.getOutsideBorder()); - } else { - return false; - } - } - - @Override - public String getDescription() { - return ("JPanel with border title text \"" + titleText + "\" with comparator " + comparator); - } - } - - public static class ByClassSimpleNameChooser implements ComponentChooser { - - private final String className; - - public ByClassSimpleNameChooser(String className) { - this.className = className; - } - - @Override - public boolean checkComponent(Component comp) { - return comp.getClass().getSimpleName().equals(className); - } - - @Override - public String getDescription() { - return "Component with the simple class name of " + className; - } - - } - - public static class ByClassChooser implements ComponentChooser { - - private final Class clazz; - - public ByClassChooser(Class clazz) { - this.clazz = clazz; - } - - @Override - public boolean checkComponent(Component comp) { - return comp.getClass().equals(clazz); - } - - @Override - public String getDescription() { - return "Component with the class of " + clazz; - } - - } - - public static class ByToolTipChooser implements ComponentChooser { - - private final String tooltip; - - public ByToolTipChooser(String tooltip) { - if (tooltip == null) { - throw new NullPointerException("Tooltip cannot be null"); - } - this.tooltip = tooltip; - } - - @Override - public boolean checkComponent(Component comp) { - return (comp instanceof JComponent) - ? tooltip.equals(((JComponent) comp).getToolTipText()) - : false; - } - - @Override - public String getDescription() { - return "JComponent with the tooltip '" + tooltip + "'"; - } - - } - - @SuppressWarnings(value = "unchecked") - public static R getUIValue(O operator, Function getter) { - return operator.getQueueTool().invokeSmoothly(new QueueTool.QueueAction("getting UI value through the queue using " + getter) { - - @Override - public R launch() throws Exception { - return getter.apply((S) operator.getSource()); - } - }); - } -} diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/ButtonDemo.java --- a/jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/ButtonDemo.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/button/ButtonDemo.java Thu Apr 28 09:38:19 2016 -0700 @@ -36,6 +36,7 @@ import com.sun.swingset3.DemoProperties; import com.sun.swingset3.demos.JHyperlink; +import java.lang.reflect.InvocationTargetException; /** * @@ -210,10 +211,10 @@ return panel; } - public static void main(String args[]) { + public static void main(String args[]) throws InterruptedException, InvocationTargetException { final ButtonDemo buttonDemo = new ButtonDemo(); - javax.swing.SwingUtilities.invokeLater(() -> { + javax.swing.SwingUtilities.invokeAndWait(() -> { JFrame frame = new JFrame(DEMO_TITLE); frame.add(buttonDemo); frame.pack(); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/TabbedPaneDemo.java --- a/jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/TabbedPaneDemo.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/tabbedpane/TabbedPaneDemo.java Thu Apr 28 09:38:19 2016 -0700 @@ -91,7 +91,6 @@ public static void main(String[] args) { JFrame frame = new JFrame(DEMO_TITLE); - frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(new TabbedPaneDemo()); frame.setPreferredSize(new Dimension(800, 600)); frame.pack(); @@ -205,7 +204,9 @@ } public void go() { - animator = new javax.swing.Timer(22 + 22 + 22, this); + if (animator == null) { + animator = new javax.swing.Timer(22 + 22 + 22, this); + } animator.start(); } @@ -247,7 +248,7 @@ @Override public void actionPerformed(ActionEvent e) { - if (isVisible()) { + if (isShowing()) { repaint(); } else { animator.stop(); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/window/WindowDemo.java --- a/jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/window/WindowDemo.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sanity/client/lib/SwingSet3/src/com/sun/swingset3/demos/window/WindowDemo.java Thu Apr 28 09:38:19 2016 -0700 @@ -31,6 +31,7 @@ import com.sun.swingset3.DemoProperties; import com.sun.swingset3.demos.DemoUtilities; +import java.lang.reflect.InvocationTargetException; /** * @author aim @@ -145,8 +146,8 @@ } } - public static void main(String args[]) { - EventQueue.invokeLater(() -> { + public static void main(String args[]) throws InterruptedException, InvocationTargetException { + EventQueue.invokeAndWait(() -> { JFrame frame = new JFrame(); WindowDemo demo = new WindowDemo(); frame.add(demo); diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/rmi/TEST.properties --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/sun/rmi/TEST.properties Thu Apr 28 09:38:19 2016 -0700 @@ -0,0 +1,1 @@ +modules = java.rmi diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/rmi/transport/proxy/DisableHttpDefaultValue.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/rmi/transport/proxy/EagerHttpFallback.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/rmi/transport/tcp/blockAccept/BlockAcceptTest.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/rmi/transport/tcp/blockAccept/TestIface.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/rmi/transport/tcp/blockAccept/TestImpl.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/rmi/transport/tcp/blockAccept/TestImpl_Stub.java diff -r ec60c3290242 -r b1a0f119f766 jdk/test/sun/util/logging/PlatformLoggerTest.java --- a/jdk/test/sun/util/logging/PlatformLoggerTest.java Thu Apr 28 08:26:38 2016 -0700 +++ b/jdk/test/sun/util/logging/PlatformLoggerTest.java Thu Apr 28 09:38:19 2016 -0700 @@ -197,7 +197,7 @@ // create a brand new java logger Logger javaLogger = sun.util.logging.internal.LoggingProviderImpl.getLogManagerAccess() .demandLoggerFor(LogManager.getLogManager(), - logger.getName()+"."+level.getName(), Thread.class); + logger.getName()+"."+level.getName(), Thread.class.getModule()); // Set a non standard java.util.logging.Level on the java logger // (except for OFF & ALL - which will remain unchanged)