diff --git a/jdk/.hgtags b/jdk/.hgtags index c986d9efba3..6f4a604e33f 100644 --- a/jdk/.hgtags +++ b/jdk/.hgtags @@ -418,3 +418,4 @@ d1436b2945383cef15edbdba9bb41ef1656c987b jdk-10+5 329609d00aef2443cf1e44ded94637c5ed55a143 jdk-10+6 7828aedcb525df40b7c8122bcc3f997c75ebaf7f jdk-9+167 e78da9db6299b3fcba49300d52e2359e82fdd218 jdk-9+168 +177436a54ca13730ffc725a6e5dbfcd9486f3da3 jdk-9+169 diff --git a/jdk/make/data/docs-resources/specs/resources/jdk-default.css b/jdk/make/data/docs-resources/specs/resources/jdk-default.css new file mode 100644 index 00000000000..eea78ea539d --- /dev/null +++ b/jdk/make/data/docs-resources/specs/resources/jdk-default.css @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +body { + margin: 2em 2em; + font-family: DejaVu Sans, Bitstream Vera Sans, Luxi Sans, Verdana, Arial, Helvetica; + font-size: 10pt; + line-height: 1.4; +} + +pre, code, tt { + font-family: DejaVu Sans Mono, Bitstream Vera Sans Mono, Luxi Mono, + Courier New, monospace; +} + +blockquote { + margin: 1.5ex 0em 1.5ex 2em; +} + +p { + padding: 0pt; + margin: 1ex 0em; +} + +p:first-child, pre:first-child { margin-top: 0pt; } + +h1 { + font-weight: bold; + padding: 0pt; + margin: 2ex .5ex 1ex 0pt; +} + +h1:first-child, h2:first-child { + margin-top: 0ex; +} + +h2 { + font-weight: bold; + padding: 0pt; + margin: 2ex 0pt 1ex 0pt; +} + +h3 { + font-weight: bold; + padding: 0pt; + margin: 1.5ex 0pt 1ex 0pt; +} + +h4 { + font-weight: bold; + padding: 0pt; + margin: 1.5ex 0pt 1ex 0pt; +} + +a:link { + color: #437291; +} + +a:visited { + color: #666666; +} + +a[href]:hover { + color: #e76f00; +} + +a img { + border-width: 0px; +} + +img { + background: white; +} + +table { + border-collapse: collapse; + margin-left: 15px; + margin-right: 15px; +} + +th, td { + padding: 3px; + vertical-align: top; +} + +table, th, td { + border: 1px solid black; +} + +caption { + text-align: left; + font-style: italic; + text-indent: 15px; + margin-bottom:10px; +} + +tr:nth-child(even) { + background: #DDD; +} + +tr:nth-child(odd) { + background: #FFF; +} + +th { + background: #DDF; +} diff --git a/jdk/make/mapfiles/libinstrument/mapfile-vers b/jdk/make/mapfiles/libinstrument/mapfile-vers index 748670139bd..c51a8af2dc7 100644 --- a/jdk/make/mapfiles/libinstrument/mapfile-vers +++ b/jdk/make/mapfiles/libinstrument/mapfile-vers @@ -39,6 +39,7 @@ SUNWprivate_1.1 { Java_sun_instrument_InstrumentationImpl_getObjectSize0; Java_sun_instrument_InstrumentationImpl_appendToClassLoaderSearch0; Java_sun_instrument_InstrumentationImpl_setNativeMethodPrefixes; + Java_sun_instrument_InstrumentationImpl_loadAgent0; local: *; }; diff --git a/jdk/src/java.base/macosx/native/libnet/DefaultProxySelector.c b/jdk/src/java.base/macosx/native/libnet/DefaultProxySelector.c index ab6f465da40..aa91f3012b2 100644 --- a/jdk/src/java.base/macosx/native/libnet/DefaultProxySelector.c +++ b/jdk/src/java.base/macosx/native/libnet/DefaultProxySelector.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2017 SAP SE. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * diff --git a/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java b/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java index 6a394e448d1..ffa681c6a2b 100644 --- a/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java +++ b/jdk/src/java.base/share/classes/com/sun/crypto/provider/GCTR.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2017 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PropMap.java b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PropMap.java index 3d54b911492..4a1d4be9362 100644 --- a/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PropMap.java +++ b/jdk/src/java.base/share/classes/com/sun/java/util/jar/pack/PropMap.java @@ -29,6 +29,8 @@ import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.io.PrintWriter; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; @@ -62,12 +64,17 @@ final class PropMap implements SortedMap { Properties props = new Properties(); // Allow implementation selected via -Dpack.disable.native=true + String propValue = getPropertyValue(Utils.DEBUG_DISABLE_NATIVE, "false"); props.put(Utils.DEBUG_DISABLE_NATIVE, - String.valueOf(Boolean.getBoolean(Utils.DEBUG_DISABLE_NATIVE))); + String.valueOf(Boolean.parseBoolean(propValue))); // Set the DEBUG_VERBOSE from system - props.put(Utils.DEBUG_VERBOSE, - String.valueOf(Integer.getInteger(Utils.DEBUG_VERBOSE,0))); + int verbose = 0; + try { + verbose = Integer.decode(getPropertyValue(Utils.DEBUG_VERBOSE, "0")); + } catch (NumberFormatException e) { + } + props.put(Utils.DEBUG_VERBOSE, String.valueOf(verbose)); // The segment size is unlimited props.put(Pack200.Packer.SEGMENT_LIMIT, "-1"); @@ -87,7 +94,7 @@ final class PropMap implements SortedMap { // Pass through files with unrecognized format by default, also // allow system property to be set props.put(Utils.CLASS_FORMAT_ERROR, - System.getProperty(Utils.CLASS_FORMAT_ERROR, Pack200.Packer.PASS)); + getPropertyValue(Utils.CLASS_FORMAT_ERROR, Pack200.Packer.PASS)); // Default effort is 5, midway between 1 and 9. props.put(Pack200.Packer.EFFORT, "5"); @@ -97,7 +104,9 @@ final class PropMap implements SortedMap { // to allow override if necessary. String propFile = "intrinsic.properties"; - try (InputStream propStr = PackerImpl.class.getResourceAsStream(propFile)) { + PrivilegedAction pa = + () -> PackerImpl.class.getResourceAsStream(propFile); + try (InputStream propStr = AccessController.doPrivileged(pa)) { if (propStr == null) { throw new RuntimeException(propFile + " cannot be loaded"); } @@ -119,6 +128,12 @@ final class PropMap implements SortedMap { defaultProps = temp; } + private static String getPropertyValue(String key, String defaultValue) { + PrivilegedAction pa = () -> System.getProperty(key); + String s = AccessController.doPrivileged(pa); + return s != null ? s : defaultValue; + } + PropMap() { theMap.putAll(defaultProps); } diff --git a/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java b/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java index 3d44f443b82..71ea81e8c03 100644 --- a/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java +++ b/jdk/src/java.base/share/classes/java/io/OutputStreamWriter.java @@ -40,10 +40,8 @@ import sun.nio.cs.StreamEncoder; * *

Each invocation of a write() method causes the encoding converter to be * invoked on the given character(s). The resulting bytes are accumulated in a - * buffer before being written to the underlying output stream. The size of - * this buffer may be specified, but by default it is large enough for most - * purposes. Note that the characters passed to the write() methods are not - * buffered. + * buffer before being written to the underlying output stream. Note that the + * characters passed to the write() methods are not buffered. * *

For top efficiency, consider wrapping an OutputStreamWriter within a * BufferedWriter so as to avoid frequent converter invocations. For example: diff --git a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java index 8142bb0abab..9aee833e141 100644 --- a/jdk/src/java.base/share/classes/java/lang/ClassLoader.java +++ b/jdk/src/java.base/share/classes/java/lang/ClassLoader.java @@ -119,18 +119,24 @@ import sun.security.util.SecurityConstants; * The Java run-time has the following built-in class loaders: * *

    - *
  • Bootstrap class loader. + *
  • Bootstrap class loader. * It is the virtual machine's built-in class loader, typically represented * as {@code null}, and does not have a parent.

  • - *
  • {@linkplain #getPlatformClassLoader() Platform class loader}. + *
  • {@linkplain #getPlatformClassLoader() Platform class loader}. * All platform classes are visible to the platform class loader * that can be used as the parent of a {@code ClassLoader} instance. * Platform classes include Java SE platform APIs, their implementation * classes and JDK-specific run-time classes that are defined by the - * platform class loader or its ancestors.

  • - *
  • {@linkplain #getSystemClassLoader() System class loader}. - * It is also known as application class - * loader and is distinct from the platform class loader. + * platform class loader or its ancestors. + *

    To allow for upgrading/overriding of modules defined to the platform + * class loader, and where classes in the upgraded version link to + * classes in modules defined to the application class loader, the + * platform class loader may delegate to the application class loader. + * In other words, classes in named modules defined to the application + * class loader may be visible to the platform class loader.

  • + *
  • {@linkplain #getSystemClassLoader() System class loader}. + * It is also known as application class loader and is distinct + * from the platform class loader. * The system class loader is typically used to define classes on the * application class path, module path, and JDK-specific tools. * The platform class loader is a parent or an ancestor of the system class @@ -368,6 +374,10 @@ public abstract class ClassLoader { * Creates a new class loader of the specified name and using the * specified parent class loader for delegation. * + * @apiNote If the parent is specified as {@code null} (for the + * bootstrap class loader) then there is no guarantee that all platform + * classes are visible. + * * @param name class loader name; or {@code null} if not named * @param parent the parent class loader * @@ -390,9 +400,12 @@ public abstract class ClassLoader { * delegation. * *

    If there is a security manager, its {@link - * SecurityManager#checkCreateClassLoader() - * checkCreateClassLoader} method is invoked. This may result in - * a security exception.

    + * SecurityManager#checkCreateClassLoader() checkCreateClassLoader} method + * is invoked. This may result in a security exception.

    + * + * @apiNote If the parent is specified as {@code null} (for the + * bootstrap class loader) then there is no guarantee that all platform + * classes are visible. * * @param parent * The parent class loader @@ -2206,6 +2219,12 @@ public abstract class ClassLoader { * this class loader are searched recursively (parent by parent) * for a {@code Package} of the given name. * + * @apiNote The {@link #getPlatformClassLoader() platform class loader} + * may delegate to the application class loader but the application class + * loader is not its ancestor. When invoked on the platform class loader, + * this method will not find packages defined to the application + * class loader. + * * @param name * The package name * @@ -2251,6 +2270,14 @@ public abstract class ClassLoader { * {@code Package} object of the same package name, each defined by * a different class loader in the class loader hierarchy. * + * @apiNote The {@link #getPlatformClassLoader() platform class loader} + * may delegate to the application class loader. In other words, + * packages in modules defined to the application class loader may be + * visible to the platform class loader. On the other hand, + * the application class loader is not its ancestor and hence + * when invoked on the platform class loader, this method will not + * return any packages defined to the application class loader. + * * @return The array of {@code Package} objects defined by this * class loader and its ancestors * diff --git a/jdk/src/java.base/share/classes/java/lang/Module.java b/jdk/src/java.base/share/classes/java/lang/Module.java index 26337d86beb..f6ab49b4519 100644 --- a/jdk/src/java.base/share/classes/java/lang/Module.java +++ b/jdk/src/java.base/share/classes/java/lang/Module.java @@ -57,6 +57,7 @@ import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.loader.BootLoader; import jdk.internal.misc.JavaLangAccess; import jdk.internal.misc.SharedSecrets; +import jdk.internal.module.ModuleLoaderMap; import jdk.internal.module.ServicesCatalog; import jdk.internal.module.Resources; import jdk.internal.org.objectweb.asm.AnnotationVisitor; @@ -215,8 +216,8 @@ public final class Module implements AnnotatedElement { } /** - * Returns the layer that contains this module or {@code null} if this - * module is not in a layer. + * Returns the module layer that contains this module or {@code null} if + * this module is not in a module layer. * * A module layer contains named modules and therefore this method always * returns {@code null} when invoked on an unnamed module. @@ -691,6 +692,13 @@ public final class Module implements AnnotatedElement { *

    This method has no effect if the package is already open * to the given module.

    * + * @apiNote This method can be used for cases where a consumer + * module uses a qualified opens to open a package to an API + * module but where the reflective access to the members of classes in + * the consumer module is delegated to code in another module. Code in the + * API module can use this method to open the package in the consumer module + * to the other module. + * * @param pn * The package name * @param other @@ -1077,7 +1085,7 @@ public final class Module implements AnnotatedElement { if (loader != null) { moduleToLoader.put(name, loader); loaders.add(loader); - } else if (!isBootLayer) { + } else if (!(clf instanceof ModuleLoaderMap.Mapper)) { throw new IllegalArgumentException("loader can't be 'null'"); } } @@ -1458,11 +1466,11 @@ public final class Module implements AnnotatedElement { * encapsulated.
  • * *
  • A package name is derived from the resource name. If - * the package name is a {@link #getPackages() package} in the module - * then the resource can only be located by the caller of this method - * when the package is {@link #isOpen(String,Module) open} to at least - * the caller's module. If the resource is not in a package in the module - * then the resource is not encapsulated.
  • + * the package name is a {@linkplain #getPackages() package} in the + * module then the resource can only be located by the caller of this + * method when the package is {@linkplain #isOpen(String,Module) open} + * to at least the caller's module. If the resource is not in a + * package in the module then the resource is not encapsulated. *
* *

In the above, the package name for a resource is derived @@ -1521,8 +1529,7 @@ public final class Module implements AnnotatedElement { } // locate resource in module - JavaLangAccess jla = SharedSecrets.getJavaLangAccess(); - URL url = jla.findResource(loader, mn, name); + URL url = loader.findResource(mn, name); if (url != null) { try { return url.openStream(); diff --git a/jdk/src/java.base/share/classes/java/lang/SecurityManager.java b/jdk/src/java.base/share/classes/java/lang/SecurityManager.java index 098e8626525..b60d63e5f02 100644 --- a/jdk/src/java.base/share/classes/java/lang/SecurityManager.java +++ b/jdk/src/java.base/share/classes/java/lang/SecurityManager.java @@ -25,10 +25,10 @@ package java.lang; -import java.lang.RuntimePermission; import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleDescriptor.Exports; import java.lang.module.ModuleDescriptor.Opens; +import java.lang.module.ModuleReference; import java.lang.reflect.Member; import java.io.FileDescriptor; import java.io.File; @@ -42,12 +42,15 @@ import java.security.PrivilegedAction; import java.security.Security; import java.security.SecurityPermission; import java.util.HashSet; +import java.util.Map; import java.util.Objects; import java.util.PropertyPermission; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; -import java.util.stream.Stream; +import jdk.internal.module.ModuleBootstrap; +import jdk.internal.module.ModuleLoaderMap; import jdk.internal.reflect.CallerSensitive; import sun.security.util.SecurityConstants; @@ -1431,30 +1434,30 @@ class SecurityManager { return packages; } - // The non-exported packages of the modules in the boot layer that are - // loaded by the platform class loader or its ancestors. A non-exported - // package is a package that either is not exported at all by its containing - // module or is exported in a qualified fashion by its containing module. - private static final Set nonExportedPkgs; - + // The non-exported packages in modules defined to the boot or platform + // class loaders. A non-exported package is a package that is not exported + // or is only exported to specific modules. + private static final Map nonExportedPkgs = new ConcurrentHashMap<>(); static { - // Get the modules in the boot layer - Stream bootLayerModules = ModuleLayer.boot().modules().stream(); - - // Filter out the modules loaded by the boot or platform loader - PrivilegedAction> pa = () -> - bootLayerModules.filter(SecurityManager::isBootOrPlatformModule) - .collect(Collectors.toSet()); - Set modules = AccessController.doPrivileged(pa); - - // Filter out the non-exported packages - nonExportedPkgs = modules.stream() - .map(Module::getDescriptor) - .map(SecurityManager::nonExportedPkgs) - .flatMap(Set::stream) - .collect(Collectors.toSet()); + addNonExportedPackages(ModuleLayer.boot()); } + /** + * Record the non-exported packages of the modules in the given layer + */ + static void addNonExportedPackages(ModuleLayer layer) { + Set bootModules = ModuleLoaderMap.bootModules(); + Set platformModules = ModuleLoaderMap.platformModules(); + layer.modules().stream() + .map(Module::getDescriptor) + .filter(md -> bootModules.contains(md.name()) + || platformModules.contains(md.name())) + .map(SecurityManager::nonExportedPkgs) + .flatMap(Set::stream) + .forEach(pn -> nonExportedPkgs.put(pn, Boolean.TRUE)); + } + + /** * Called by java.security.Security */ @@ -1467,14 +1470,6 @@ class SecurityManager { } } - /** - * Returns true if the module's loader is the boot or platform loader. - */ - private static boolean isBootOrPlatformModule(Module m) { - return m.getClassLoader() == null || - m.getClassLoader() == ClassLoader.getPlatformClassLoader(); - } - /** * Returns the non-exported packages of the specified module. */ @@ -1535,7 +1530,7 @@ class SecurityManager { Objects.requireNonNull(pkg, "package name can't be null"); // check if pkg is not exported to all modules - if (nonExportedPkgs.contains(pkg)) { + if (nonExportedPkgs.containsKey(pkg)) { checkPermission( new RuntimePermission("accessClassInPackage." + pkg)); return; @@ -1634,7 +1629,7 @@ class SecurityManager { Objects.requireNonNull(pkg, "package name can't be null"); // check if pkg is not exported to all modules - if (nonExportedPkgs.contains(pkg)) { + if (nonExportedPkgs.containsKey(pkg)) { checkPermission( new RuntimePermission("defineClassInPackage." + pkg)); return; diff --git a/jdk/src/java.base/share/classes/java/lang/System.java b/jdk/src/java.base/share/classes/java/lang/System.java index 9b3e3cf6c66..2ef299c6e73 100644 --- a/jdk/src/java.base/share/classes/java/lang/System.java +++ b/jdk/src/java.base/share/classes/java/lang/System.java @@ -41,7 +41,6 @@ import java.lang.reflect.Executable; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.net.URI; -import java.net.URL; import java.security.AccessControlContext; import java.security.ProtectionDomain; import java.security.AccessController; @@ -2113,9 +2112,6 @@ public final class System { public Class findBootstrapClassOrNull(ClassLoader cl, String name) { return cl.findBootstrapClassOrNull(name); } - public URL findResource(ClassLoader cl, String mn, String name) throws IOException { - return cl.findResource(mn, name); - } public Stream packages(ClassLoader cl) { return cl.packages(); } @@ -2125,6 +2121,9 @@ public final class System { public String fastUUID(long lsb, long msb) { return Long.fastUUID(lsb, msb); } + public void addNonExportedPackages(ModuleLayer layer) { + SecurityManager.addNonExportedPackages(layer); + } public void invalidatePackageAccessCache() { SecurityManager.invalidatePackageAccessCache(); } diff --git a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java index b8cabc5c924..830c3553f6f 100644 --- a/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java +++ b/jdk/src/java.base/share/classes/java/lang/invoke/MethodHandles.java @@ -112,6 +112,19 @@ public class MethodHandles { return new Lookup(Reflection.getCallerClass()); } + /** + * This reflected$lookup method is the alternate implementation of + * the lookup method when being invoked by reflection. + */ + @CallerSensitive + private static Lookup reflected$lookup() { + Class caller = Reflection.getCallerClass(); + if (caller.getClassLoader() == null) { + throw newIllegalArgumentException("illegal lookupClass: "+caller); + } + return new Lookup(caller); + } + /** * Returns a {@link Lookup lookup object} which is trusted minimally. * The lookup has the {@code PUBLIC} and {@code UNCONDITIONAL} modes. @@ -747,7 +760,7 @@ public class MethodHandles { Lookup(Class lookupClass) { this(lookupClass, FULL_POWER_MODES); // make sure we haven't accidentally picked up a privileged class: - checkUnprivilegedlookupClass(lookupClass, FULL_POWER_MODES); + checkUnprivilegedlookupClass(lookupClass); } private Lookup(Class lookupClass, int allowedModes) { @@ -827,7 +840,7 @@ public class MethodHandles { newModes = 0; } - checkUnprivilegedlookupClass(requestedLookupClass, newModes); + checkUnprivilegedlookupClass(requestedLookupClass); return new Lookup(requestedLookupClass, newModes); } @@ -876,9 +889,7 @@ public class MethodHandles { * accessible to the class. The {@code PACKAGE} lookup mode serves to authenticate * that the lookup object was created by a caller in the runtime package (or derived * from a lookup originally created by suitably privileged code to a target class in - * the runtime package). The lookup modes cannot include {@link #PRIVATE PRIVATE} - * access. A lookup with {@code PRIVATE} access can be downgraded to drop this lookup - * mode with the {@linkplain #dropLookupMode(int) dropLookupMode} method.

+ * the runtime package).

* *

The {@code bytes} parameter is the class bytes of a valid class file (as defined * by the The Java Virtual Machine Specification) with a class name in the @@ -896,7 +907,6 @@ public class MethodHandles { * @throws IllegalArgumentException the bytes are for a class in a different package * to the lookup class * @throws IllegalAccessException if this lookup does not have {@code PACKAGE} access - * @throws UnsupportedOperationException if the lookup class has {@code PRIVATE} access * @throws LinkageError if the class is malformed ({@code ClassFormatError}), cannot be * verified ({@code VerifyError}), is already defined, or another linkage error occurs * @throws SecurityException if denied by the security manager @@ -911,8 +921,6 @@ public class MethodHandles { SecurityManager sm = System.getSecurityManager(); if (sm != null) sm.checkPermission(new RuntimePermission("defineClass")); - if (hasPrivateAccess()) - throw new UnsupportedOperationException("PRIVATE access not supported"); if ((lookupModes() & PACKAGE) == 0) throw new IllegalAccessException("Lookup does not have PACKAGE access"); assert (lookupModes() & (MODULE|PUBLIC)) != 0; @@ -984,25 +992,10 @@ public class MethodHandles { */ static final Lookup PUBLIC_LOOKUP = new Lookup(Object.class, (PUBLIC|UNCONDITIONAL)); - private static void checkUnprivilegedlookupClass(Class lookupClass, int allowedModes) { + private static void checkUnprivilegedlookupClass(Class lookupClass) { String name = lookupClass.getName(); if (name.startsWith("java.lang.invoke.")) throw newIllegalArgumentException("illegal lookupClass: "+lookupClass); - - // 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 == FULL_POWER_MODES && lookupClass.getClassLoader() == null) { - if ((name.startsWith("java.") && - !name.equals("java.lang.Thread") && - !name.startsWith("java.util.concurrent.")) || - (name.startsWith("sun.") && - !name.startsWith("sun.invoke."))) { - throw newIllegalArgumentException("illegal lookupClass: " + lookupClass); - } - } } /** diff --git a/jdk/src/java.base/share/classes/java/lang/module/Configuration.java b/jdk/src/java.base/share/classes/java/lang/module/Configuration.java index d5fc16c1ef6..ef7e44a114d 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/Configuration.java +++ b/jdk/src/java.base/share/classes/java/lang/module/Configuration.java @@ -109,20 +109,17 @@ public final class Configuration { private final Set modules; private final Map nameToModule; - // module constraints on target - private final String osName; - private final String osArch; + // constraint on target platform + private final String targetPlatform; - String osName() { return osName; } - String osArch() { return osArch; } + String targetPlatform() { return targetPlatform; } private Configuration() { this.parents = Collections.emptyList(); this.graph = Collections.emptyMap(); this.modules = Collections.emptySet(); this.nameToModule = Collections.emptyMap(); - this.osName = null; - this.osArch = null; + this.targetPlatform = null; } private Configuration(List parents, @@ -147,8 +144,7 @@ public final class Configuration { this.modules = Set.of(moduleArray); this.nameToModule = Map.ofEntries(nameEntries); - this.osName = resolver.osName(); - this.osArch = resolver.osArch(); + this.targetPlatform = resolver.targetPlatform(); } /** diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java index 01b4316fa20..20d198b46ee 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleDescriptor.java @@ -99,6 +99,7 @@ public class ModuleDescriptor * * @see ModuleDescriptor#modifiers() * @since 9 + * @spec JPMS */ public static enum Modifier { /** diff --git a/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java b/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java index 0be9d8d9eff..e0e6d883550 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java +++ b/jdk/src/java.base/share/classes/java/lang/module/ModuleFinder.java @@ -286,8 +286,9 @@ public interface ModuleFinder { * class names of provider classes.

* *
  • If the JAR file has a {@code Main-Class} attribute in its - * main manifest then its value is the module {@link - * ModuleDescriptor#mainClass() main class}.

  • + * main manifest, its value is a legal class name, and its package is + * in the set of packages derived for the module, then the value is the + * module {@linkplain ModuleDescriptor#mainClass() main class}.

    * * * @@ -298,8 +299,7 @@ public interface ModuleFinder { * file, where the JAR file contains a {@code .class} in the top-level * directory of the JAR file, where an entry in a service configuration * file is not a legal class name or its package name is not in the set of - * packages derived for the module, or where the module main class is not - * a legal class name or its package is not in the module.

    + * packages derived for the module.

    * *

    In addition to JAR files, an implementation may also support modules * that are packaged in other implementation specific module formats. If diff --git a/jdk/src/java.base/share/classes/java/lang/module/Resolver.java b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java index 6adf93f8317..a723e638abe 100644 --- a/jdk/src/java.base/share/classes/java/lang/module/Resolver.java +++ b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java @@ -28,6 +28,7 @@ package java.lang.module; import java.io.PrintStream; import java.lang.module.ModuleDescriptor.Provides; import java.lang.module.ModuleDescriptor.Requires.Modifier; +import java.net.URI; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; @@ -38,10 +39,8 @@ import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.StringJoiner; import java.util.stream.Collectors; import jdk.internal.module.ModuleHashes; @@ -69,12 +68,10 @@ final class Resolver { // true if all automatic modules have been found private boolean haveAllAutomaticModules; - // module constraints on target platform - private String osName; - private String osArch; + // constraint on target platform + private String targetPlatform; - String osName() { return osName; } - String osArch() { return osArch; } + String targetPlatform() { return targetPlatform; } /** * @throws IllegalArgumentException if there are more than one parent and @@ -89,37 +86,23 @@ final class Resolver { this.afterFinder = afterFinder; this.traceOutput = traceOutput; - // record constraints on target platform, checking that they don't conflict + // record constraint on target platform, checking for conflicts for (Configuration parent : parents) { - String value = parent.osName(); + String value = parent.targetPlatform(); if (value != null) { - if (osName == null) { - osName = value; + if (targetPlatform == null) { + targetPlatform = value; } else { - if (!value.equals(osName)) { - failParentConflict("Operating System", osName, value); - } - } - } - value = parent.osArch(); - if (value != null) { - if (osArch == null) { - osArch = value; - } else { - if (!value.equals(osArch)) { - failParentConflict("OS architecture", osArch, value); + if (!value.equals(targetPlatform)) { + String msg = "Parents have conflicting constraints on target" + + " platform: " + targetPlatform + ", " + value; + throw new IllegalArgumentException(msg); } } } } } - private void failParentConflict(String constraint, String s1, String s2) { - String msg = "Parents have conflicting constraints on target " - + constraint + ": " + s1 + ", " + s2; - throw new IllegalArgumentException(msg); - } - /** * Resolves the given named modules. * @@ -147,8 +130,7 @@ final class Resolver { } if (isTracing()) { - trace("Root module %s located", root); - mref.location().ifPresent(uri -> trace(" (%s)", uri)); + trace("root %s", nameAndInfo(mref)); } addFoundModule(mref); @@ -180,9 +162,7 @@ final class Resolver { ModuleDescriptor other = mref.descriptor(); q.offer(other); if (isTracing()) { - trace("Automatic module %s located, required by %s", - other.name(), descriptor.name()); - mref.location().ifPresent(uri -> trace(" (%s)", uri)); + trace("%s requires %s", descriptor.name(), nameAndInfo(mref)); } }); haveAllAutomaticModules = true; @@ -213,21 +193,13 @@ final class Resolver { } } + if (isTracing() && !dn.equals("java.base")) { + trace("%s requires %s", descriptor.name(), nameAndInfo(mref)); + } + if (!nameToReference.containsKey(dn)) { addFoundModule(mref); q.offer(mref.descriptor()); - - if (isTracing()) { - String prefix; - if (mref.descriptor().isAutomatic()) { - prefix = "Automatic module"; - } else { - prefix = "Module"; - } - trace(prefix + " %s located, required by %s", - dn, descriptor.name()); - mref.location().ifPresent(uri -> trace(" (%s)", uri)); - } } } @@ -291,6 +263,13 @@ final class Resolver { do { for (ModuleDescriptor descriptor : candidateConsumers) { if (!descriptor.uses().isEmpty()) { + + // the modules that provide at least one service + Set modulesToBind = null; + if (isTracing()) { + modulesToBind = new HashSet<>(); + } + for (String service : descriptor.uses()) { Set mrefs = availableProviders.get(service); if (mrefs != null) { @@ -298,15 +277,13 @@ final class Resolver { ModuleDescriptor provider = mref.descriptor(); if (!provider.equals(descriptor)) { - trace("Module %s provides %s, used by %s", - provider.name(), service, descriptor.name()); + if (isTracing() && modulesToBind.add(provider)) { + trace("%s binds %s", descriptor.name(), + nameAndInfo(mref)); + } String pn = provider.name(); if (!nameToReference.containsKey(pn)) { - if (isTracing()) { - mref.location() - .ifPresent(uri -> trace(" (%s)", uri)); - } addFoundModule(mref); q.push(provider); } @@ -349,59 +326,31 @@ final class Resolver { if (mref instanceof ModuleReferenceImpl) { ModuleTarget target = ((ModuleReferenceImpl)mref).moduleTarget(); if (target != null) - checkTargetConstraints(mn, target); + checkTargetPlatform(mn, target); } nameToReference.put(mn, mref); } /** - * Check that the module's constraints on the target platform do not - * conflict with the constraints of other modules resolved so far or - * modules in parent configurations. + * Check that the module's constraints on the target platform does + * conflict with the constraint of other modules resolved so far. */ - private void checkTargetConstraints(String mn, ModuleTarget target) { - String value = target.osName(); + private void checkTargetPlatform(String mn, ModuleTarget target) { + String value = target.targetPlatform(); if (value != null) { - if (osName == null) { - osName = value; + if (targetPlatform == null) { + targetPlatform = value; } else { - if (!value.equals(osName)) { - failTargetConstraint(mn, target); - } - } - } - value = target.osArch(); - if (value != null) { - if (osArch == null) { - osArch = value; - } else { - if (!value.equals(osArch)) { - failTargetConstraint(mn, target); + if (!value.equals(targetPlatform)) { + findFail("Module %s has constraints on target platform (%s)" + + " that conflict with other modules: %s", mn, + value, targetPlatform); } } } } - private void failTargetConstraint(String mn, ModuleTarget target) { - String s1 = targetAsString(osName, osArch); - String s2 = targetAsString(target.osName(), target.osArch()); - findFail("Module %s has constraints on target platform (%s) that" - + " conflict with other modules: %s", mn, s1, s2); - } - - private String targetAsString(ModuleTarget target) { - return targetAsString(target.osName(), target.osArch()); - } - - private String targetAsString(String osName, String osArch) { - return new StringJoiner("-") - .add(Objects.toString(osName, "*")) - .add(Objects.toString(osArch, "*")) - .toString(); - } - - /** * Execute post-resolution checks and returns the module graph of resolved * modules as {@code Map}. The resolved modules will be in the given @@ -412,12 +361,6 @@ final class Resolver { Map> finish(Configuration cf, boolean check) { - if (isTracing()) { - trace("Result:"); - Set names = nameToReference.keySet(); - names.stream().sorted().forEach(name -> trace(" %s", name)); - } - if (check) { detectCycles(); checkHashes(); @@ -520,9 +463,8 @@ final class Resolver { findFail("Unable to compute the hash of module %s", dn); } - // skip checking the hash if the module has been patched ModuleReferenceImpl other = (ModuleReferenceImpl)mref2; - if (other != null && !other.isPatched()) { + if (other != null) { byte[] recordedHash = hashes.hashFor(dn); byte[] actualHash = other.computeHash(algorithm); if (actualHash == null) @@ -965,9 +907,17 @@ final class Resolver { private void trace(String fmt, Object ... args) { if (traceOutput != null) { - traceOutput.format("[Resolver] " + fmt, args); + traceOutput.format(fmt, args); traceOutput.println(); } } + private String nameAndInfo(ModuleReference mref) { + ModuleDescriptor descriptor = mref.descriptor(); + StringBuilder sb = new StringBuilder(descriptor.name()); + mref.location().ifPresent(uri -> sb.append(" " + uri)); + if (descriptor.isAutomatic()) + sb.append(" automatic"); + return sb.toString(); + } } diff --git a/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java b/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java index 08ff1f0d740..2754fa39c0a 100644 --- a/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java +++ b/jdk/src/java.base/share/classes/java/nio/file/FileSystems.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2007, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2007, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -36,6 +36,8 @@ import java.util.Map; import java.util.ServiceConfigurationError; import java.util.ServiceLoader; +import jdk.internal.misc.VM; + /** * Factory methods for file systems. This class defines the {@link #getDefault * getDefault} method to get the default file system and factory methods to @@ -120,8 +122,8 @@ public final class FileSystems { // if the property java.nio.file.spi.DefaultFileSystemProvider is // set then its value is the name of the default provider (or a list) - String propValue = System - .getProperty("java.nio.file.spi.DefaultFileSystemProvider"); + String prop = "java.nio.file.spi.DefaultFileSystemProvider"; + String propValue = System.getProperty(prop); if (propValue != null) { for (String cn: propValue.split(",")) { try { @@ -184,7 +186,7 @@ public final class FileSystems { * @return the default file system */ public static FileSystem getDefault() { - if (jdk.internal.misc.VM.isBooted()) { + if (VM.isModuleSystemInited()) { return DefaultFileSystemHolder.defaultFileSystem; } else { return BuiltinFileSystemHolder.builtinFileSystem; diff --git a/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java b/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java index 9c8bc81393a..54ad9611e2d 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java +++ b/jdk/src/java.base/share/classes/javax/crypto/CipherInputStream.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -93,7 +93,7 @@ public class CipherInputStream extends FilterInputStream { // stream status private boolean closed = false; - /** + /* * private convenience function. * * Entry condition: ostart = ofinish diff --git a/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java b/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java index 749e31926fe..ddc2648b693 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java +++ b/jdk/src/java.base/share/classes/javax/crypto/CryptoPermission.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -196,19 +196,19 @@ class CryptoPermission extends java.security.Permission { * Checks if the specified permission is "implied" by * this object. *

    - * More specifically, this method returns true if:

    + * More specifically, this method returns true if: *

      - *
    • p is an instance of CryptoPermission, and

      + *

    • p is an instance of CryptoPermission, and
    • *
    • p's algorithm name equals or (in the case of wildcards) - * is implied by this permission's algorithm name, and

      + * is implied by this permission's algorithm name, and

    • *
    • p's maximum allowable key size is less or - * equal to this permission's maximum allowable key size, and

      + * equal to this permission's maximum allowable key size, and

    • *
    • p's algorithm parameter spec equals or is - * implied by this permission's algorithm parameter spec, and

      + * implied by this permission's algorithm parameter spec, and

    • *
    • p's exemptionMechanism equals or * is implied by this permission's * exemptionMechanism (a null exemption mechanism - * implies any other exemption mechanism). + * implies any other exemption mechanism).
    • *
    * * @param p the permission to check against. diff --git a/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java b/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java index 7f27ea2506a..0093ce65b6d 100644 --- a/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java +++ b/jdk/src/java.base/share/classes/javax/crypto/CryptoPolicyParser.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2012, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,10 +46,12 @@ import java.lang.reflect.*; * * The format of a permission entry in the jurisdiction policy file is: * + *
    {@code
      *   permission [, 
      *              [[, ][, 
      *              [, , ]]]];
    + * }
    * * @author Sharon Liu * @@ -526,8 +528,7 @@ final class CryptoPolicyParser { /** * Each grant entry in the policy configuration file is represented by a - * GrantEntry object.

    - * + * GrantEntry object. *

    * For example, the entry *

    @@ -587,8 +588,7 @@ final class CryptoPolicyParser {
     
         /**
          * Each crypto permission entry in the policy configuration file is
    -     * represented by a CryptoPermissionEntry object.  

    - * + * represented by a CryptoPermissionEntry object. *

    * For example, the entry *

    diff --git a/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java
    index ce3bb67e8dd..5d1c97c6d25 100644
    --- a/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java
    +++ b/jdk/src/java.base/share/classes/jdk/internal/loader/BuiltinClassLoader.java
    @@ -172,12 +172,10 @@ public class BuiltinClassLoader
         }
     
         /**
    -     * Register a module this this class loader. This has the effect of making
    -     * the types in the module visible.
    +     * Register a module this class loader. This has the effect of making the
    +     * types in the module visible.
          */
         public void loadModule(ModuleReference mref) {
    -        assert !VM.isModuleSystemInited();
    -
             String mn = mref.descriptor().name();
             if (nameToModule.putIfAbsent(mn, mref) != null) {
                 throw new InternalError(mn + " already defined to this loader");
    @@ -191,6 +189,11 @@ public class BuiltinClassLoader
                                             + other.mref().descriptor().name());
                 }
             }
    +
    +        // clear resources cache if VM is already initialized
    +        if (VM.isModuleSystemInited() && resourceCache != null) {
    +            resourceCache = null;
    +        }
         }
     
         /**
    @@ -355,7 +358,10 @@ public class BuiltinClassLoader
         private List findMiscResource(String name) throws IOException {
             SoftReference>> ref = this.resourceCache;
             Map> map = (ref != null) ? ref.get() : null;
    -        if (map != null) {
    +        if (map == null) {
    +            map = new ConcurrentHashMap<>();
    +            this.resourceCache = new SoftReference<>(map);
    +        } else {
                 List urls = map.get(name);
                 if (urls != null)
                     return urls;
    @@ -381,23 +387,18 @@ public class BuiltinClassLoader
                                     }
                                 }
                             }
    -                        return result;
    +                        return (result != null) ? result : Collections.emptyList();
                         }
                     });
             } catch (PrivilegedActionException pae) {
                 throw (IOException) pae.getCause();
             }
     
    -        // only cache resources after all modules have been defined
    +        // only cache resources after VM is fully initialized
             if (VM.isModuleSystemInited()) {
    -            if (map == null) {
    -                map = new ConcurrentHashMap<>();
    -                this.resourceCache = new SoftReference<>(map);
    -            }
    -            if (urls == null)
    -                urls = Collections.emptyList();
                 map.putIfAbsent(name, urls);
             }
    +
             return urls;
         }
     
    diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java
    index ece20d827a4..92b60d70777 100644
    --- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java
    +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java
    @@ -25,13 +25,11 @@
     
     package jdk.internal.misc;
     
    -import java.io.IOException;
     import java.lang.annotation.Annotation;
     import java.lang.module.ModuleDescriptor;
     import java.lang.reflect.Executable;
     import java.lang.reflect.Method;
     import java.net.URI;
    -import java.net.URL;
     import java.security.AccessControlContext;
     import java.security.ProtectionDomain;
     import java.util.Map;
    @@ -156,12 +154,6 @@ public interface JavaLangAccess {
          */
         Class findBootstrapClassOrNull(ClassLoader cl, String name);
     
    -    /**
    -     * Returns a URL to a resource with the given name in a module that is
    -     * defined to the given class loader.
    -     */
    -    URL findResource(ClassLoader cl, String moduleName, String name) throws IOException;
    -
         /**
          * Returns the Packages for the given class loader.
          */
    @@ -177,6 +169,11 @@ public interface JavaLangAccess {
          */
         String fastUUID(long lsb, long msb);
     
    +    /**
    +     * Record the non-exported packages of the modules in the given layer
    +     */
    +    void addNonExportedPackages(ModuleLayer layer);
    +
         /**
          * Invalidate package access cache
          */
    diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java b/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java
    index 32712834c0a..4d772df129a 100644
    --- a/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java
    +++ b/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java
    @@ -25,6 +25,8 @@
     
     package jdk.internal.module;
     
    +import java.util.Set;
    +
     /**
      * Utility class for checking module, package, and class names.
      */
    @@ -45,18 +47,17 @@ public final class Checks {
             int next;
             int off = 0;
             while ((next = name.indexOf('.', off)) != -1) {
    -            if (isJavaIdentifier(name, off, (next - off)) == -1) {
    -                String id = name.substring(off, next);
    +            String id = name.substring(off, next);
    +            if (!isJavaIdentifier(id)) {
                     throw new IllegalArgumentException(name + ": Invalid module name"
                             + ": '" + id + "' is not a Java identifier");
                 }
                 off = next+1;
             }
    -        int last = isJavaIdentifier(name, off, name.length() - off);
    -        if (last == -1) {
    -            String id = name.substring(off);
    +        String last = name.substring(off);
    +        if (!isJavaIdentifier(last)) {
                 throw new IllegalArgumentException(name + ": Invalid module name"
    -                    + ": '" + id + "' is not a Java identifier");
    +                    + ": '" + last + "' is not a Java identifier");
             }
             return name;
         }
    @@ -68,14 +69,13 @@ public final class Checks {
             int next;
             int off = 0;
             while ((next = name.indexOf('.', off)) != -1) {
    -            if (isJavaIdentifier(name, off, (next - off)) == -1)
    +            String id = name.substring(off, next);
    +            if (!isJavaIdentifier(id))
                     return false;
                 off = next+1;
             }
    -        int last = isJavaIdentifier(name, off, name.length() - off);
    -        if (last == -1)
    -            return false;
    -        return true;
    +        String last = name.substring(off);
    +        return isJavaIdentifier(last);
         }
     
         /**
    @@ -144,12 +144,13 @@ public final class Checks {
             int next;
             int off = 0;
             while ((next = name.indexOf('.', off)) != -1) {
    -            if (isJavaIdentifier(name, off, (next - off)) == -1)
    +            String id = name.substring(off, next);
    +            if (!isJavaIdentifier(id))
                     return false;
                 off = next+1;
             }
    -        int count = name.length() - off;
    -        return (isJavaIdentifier(name, off, count) != -1);
    +        String last = name.substring(off);
    +        return isJavaIdentifier(last);
         }
     
         /**
    @@ -164,76 +165,99 @@ public final class Checks {
             int next;
             int off = 0;
             while ((next = name.indexOf('.', off)) != -1) {
    -            if (isJavaIdentifier(name, off, (next - off)) == -1) {
    -                String id = name.substring(off, next);
    +            String id = name.substring(off, next);
    +            if (!isJavaIdentifier(id)) {
                     throw new IllegalArgumentException(name + ": Invalid " + what
                             + ": '" + id + "' is not a Java identifier");
                 }
                 off = next + 1;
             }
    -        if (isJavaIdentifier(name, off, name.length() - off) == -1) {
    -            String id = name.substring(off, name.length());
    +        String last = name.substring(off);
    +        if (!isJavaIdentifier(last)) {
                 throw new IllegalArgumentException(name + ": Invalid " + what
    -                    + ": '" + id + "' is not a Java identifier");
    +                    + ": '" + last + "' is not a Java identifier");
             }
             return name;
         }
     
         /**
    -     * Returns {@code true} if a given legal module name contains an identifier
    -     * that doesn't end with a Java letter.
    +     * Returns true if the given char sequence is a legal Java identifier,
    +     * otherwise false.
          */
    -    public static boolean hasJavaIdentifierWithTrailingDigit(String name) {
    -        // quick scan to allow names that are just ASCII without digits
    -        boolean needToParse = false;
    -        int i = 0;
    -        while (i < name.length()) {
    -            int c = name.charAt(i);
    -            if (c > 0x7F || (c >= '0' && c <= '9')) {
    -                needToParse = true;
    -                break;
    -            }
    -            i++;
    -        }
    -        if (!needToParse)
    +    private static boolean isJavaIdentifier(CharSequence cs) {
    +        if (cs.length() == 0 || RESERVED.contains(cs))
                 return false;
     
    -        // slow path
    -        int next;
    -        int off = 0;
    -        while ((next = name.indexOf('.', off)) != -1) {
    -            int last = isJavaIdentifier(name, off, (next - off));
    -            if (!Character.isJavaIdentifierStart(last))
    -                return true;
    -            off = next+1;
    -        }
    -        int last = isJavaIdentifier(name, off, name.length() - off);
    -        if (!Character.isJavaIdentifierStart(last))
    -            return true;
    -        return false;
    -
    -    }
    -
    -    /**
    -     * Checks if a char sequence is a legal Java identifier, returning the code
    -     * point of the last character if legal or {@code -1} if not legal.
    -     */
    -    private static int isJavaIdentifier(CharSequence cs, int offset, int count) {
    -        if (count == 0)
    -            return -1;
    -        int first = Character.codePointAt(cs, offset);
    +        int first = Character.codePointAt(cs, 0);
             if (!Character.isJavaIdentifierStart(first))
    -            return -1;
    +            return false;
     
    -        int cp = first;
             int i = Character.charCount(first);
    -        while (i < count) {
    -            cp = Character.codePointAt(cs, offset+i);
    +        while (i < cs.length()) {
    +            int cp = Character.codePointAt(cs, i);
                 if (!Character.isJavaIdentifierPart(cp))
    -                return -1;
    +                return false;
                 i += Character.charCount(cp);
             }
     
    -        return cp;
    +        return true;
         }
    +
    +    // keywords, boolean and null literals, not allowed in identifiers
    +    private static final Set RESERVED = Set.of(
    +            "abstract",
    +            "assert",
    +            "boolean",
    +            "break",
    +            "byte",
    +            "case",
    +            "catch",
    +            "char",
    +            "class",
    +            "const",
    +            "continue",
    +            "default",
    +            "do",
    +            "double",
    +            "else",
    +            "enum",
    +            "extends",
    +            "final",
    +            "finally",
    +            "float",
    +            "for",
    +            "goto",
    +            "if",
    +            "implements",
    +            "import",
    +            "instanceof",
    +            "int",
    +            "interface",
    +            "long",
    +            "native",
    +            "new",
    +            "package",
    +            "private",
    +            "protected",
    +            "public",
    +            "return",
    +            "short",
    +            "static",
    +            "strictfp",
    +            "super",
    +            "switch",
    +            "synchronized",
    +            "this",
    +            "throw",
    +            "throws",
    +            "transient",
    +            "try",
    +            "void",
    +            "volatile",
    +            "while",
    +            "true",
    +            "false",
    +            "null",
    +            "_"
    +    );
     }
    diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java
    index 6d8816237dd..dd3520f044c 100644
    --- a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java
    +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java
    @@ -549,34 +549,26 @@ public final class ClassFileAttributes {
          *   u2 attribute_name_index;
          *   u4 attribute_length;
          *
    -     *   // index to CONSTANT_utf8_info structure with the OS name
    -     *   u2 os_name_index;
    -     *   // index to CONSTANT_utf8_info structure with the OS arch
    -     *   u2 os_arch_index
    +     *   // index to CONSTANT_utf8_info structure with the target platform
    +     *   u2 target_platform_index;
          * }
          *
          * } 
    */ public static class ModuleTargetAttribute extends Attribute { - private final String osName; - private final String osArch; + private final String targetPlatform; - public ModuleTargetAttribute(String osName, String osArch) { + public ModuleTargetAttribute(String targetPlatform) { super(MODULE_TARGET); - this.osName = osName; - this.osArch = osArch; + this.targetPlatform = targetPlatform; } public ModuleTargetAttribute() { - this(null, null); + this(null); } - public String osName() { - return osName; - } - - public String osArch() { - return osArch; + public String targetPlatform() { + return targetPlatform; } @Override @@ -588,20 +580,14 @@ public final class ClassFileAttributes { Label[] labels) { - String osName = null; - String osArch = null; + String targetPlatform = null; - int name_index = cr.readUnsignedShort(off); - if (name_index != 0) - osName = cr.readUTF8(off, buf); + int target_platform_index = cr.readUnsignedShort(off); + if (target_platform_index != 0) + targetPlatform = cr.readUTF8(off, buf); off += 2; - int arch_index = cr.readUnsignedShort(off); - if (arch_index != 0) - osArch = cr.readUTF8(off, buf); - off += 2; - - return new ModuleTargetAttribute(osName, osArch); + return new ModuleTargetAttribute(targetPlatform); } @Override @@ -613,15 +599,10 @@ public final class ClassFileAttributes { { ByteVector attr = new ByteVector(); - int name_index = 0; - if (osName != null && osName.length() > 0) - name_index = cw.newUTF8(osName); - attr.putShort(name_index); - - int arch_index = 0; - if (osArch != null && osArch.length() > 0) - arch_index = cw.newUTF8(osArch); - attr.putShort(arch_index); + int target_platform_index = 0; + if (targetPlatform != null && targetPlatform.length() > 0) + target_platform_index = cw.newUTF8(targetPlatform); + attr.putShort(target_platform_index); return attr; } diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java index 061b2294158..d083ead7801 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleBootstrap.java @@ -84,8 +84,9 @@ public final class ModuleBootstrap { // The ModulePatcher for the initial configuration private static final ModulePatcher patcher = initModulePatcher(); - // ModuleFinder for the initial configuration - private static ModuleFinder initialFinder; + // ModuleFinders for the initial configuration + private static ModuleFinder unlimitedFinder; + private static ModuleFinder limitedFinder; /** * Returns the ModulePatcher for the initial configuration. @@ -95,11 +96,20 @@ public final class ModuleBootstrap { } /** - * Returns the ModuleFinder for the initial configuration + * Returns the ModuleFinder for the initial configuration before observability + * is limited by the --limit-modules command line option. */ - public static ModuleFinder finder() { - assert initialFinder != null; - return initialFinder; + public static ModuleFinder unlimitedFinder() { + assert unlimitedFinder != null; + return unlimitedFinder; + } + + /** + * Returns the ModuleFinder for the initial configuration. + */ + public static ModuleFinder limitedFinder() { + assert limitedFinder != null; + return limitedFinder; } /** @@ -134,6 +144,11 @@ public final class ModuleBootstrap { PerfCounters.defineBaseTime.addElapsedTimeFrom(t1); + // special mode to boot with only java.base, ignores other options + String propValue = getAndRemoveProperty("jdk.module.minimumBoot"); + if (propValue != null) { + return createMinimalBootLayer(); + } long t2 = System.nanoTime(); @@ -180,7 +195,8 @@ public final class ModuleBootstrap { } // --limit-modules - String propValue = getAndRemoveProperty("jdk.module.limitmods"); + unlimitedFinder = finder; + propValue = getAndRemoveProperty("jdk.module.limitmods"); if (propValue != null) { Set mods = new HashSet<>(); for (String mod: propValue.split(",")) { @@ -188,6 +204,7 @@ public final class ModuleBootstrap { } finder = limitFinder(finder, mods, roots); } + limitedFinder = finder; // If there is no initial module specified then assume that the initial // module is the unnamed module of the application class loader. This @@ -267,7 +284,8 @@ public final class ModuleBootstrap { } PrintStream traceOutput = null; - if (Boolean.getBoolean("jdk.launcher.traceResolver")) + propValue = getAndRemoveProperty("jdk.module.showModuleResolution"); + if (propValue != null && Boolean.parseBoolean(propValue)) traceOutput = System.out; // run the resolver to create the configuration @@ -362,12 +380,23 @@ public final class ModuleBootstrap { // total time to initialize PerfCounters.bootstrapTime.addElapsedTimeFrom(t0); - // remember the ModuleFinder - initialFinder = finder; - return bootLayer; } + /** + * Create a "minimal" boot module layer that only contains java.base. + */ + private static ModuleLayer createMinimalBootLayer() { + Configuration cf = SharedSecrets.getJavaLangModuleAccess() + .resolveAndBind(ModuleFinder.ofSystem(), + Set.of(JAVA_BASE), + false, + null); + + Function clf = ModuleLoaderMap.mappingFunction(cf); + return ModuleLayer.empty().defineModules(cf, clf); + } + /** * Returns a ModuleFinder that limits observability to the given root * modules, their transitive dependences, plus a set of other modules. diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java index d808fe1db48..804f5eb4527 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleHashesBuilder.java @@ -138,7 +138,7 @@ public class ModuleHashesBuilder { } /* - * Utilty class + * Utility class */ static class Graph { private final Set nodes; diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java index b589e2923f0..f6f1bb07e16 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfo.java @@ -546,21 +546,15 @@ public final class ModuleInfo { private ModuleTarget readModuleTargetAttribute(DataInput in, ConstantPool cpool) throws IOException { - String osName = null; - String osArch = null; + String targetPlatform = null; - int name_index = in.readUnsignedShort(); - if (name_index != 0) - osName = cpool.getUtf8(name_index); + int index = in.readUnsignedShort(); + if (index != 0) + targetPlatform = cpool.getUtf8(index); - int arch_index = in.readUnsignedShort(); - if (arch_index != 0) - osArch = cpool.getUtf8(arch_index); - - return new ModuleTarget(osName, osArch); + return new ModuleTarget(targetPlatform); } - /** * Reads the ModuleHashes attribute */ @@ -612,7 +606,6 @@ public final class ModuleInfo { return new ModuleResolution(flags); } - /** * Returns true if the given attribute can be present at most once * in the class file. Returns false otherwise. diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java index 35f28d35696..270d0a2605f 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoExtender.java @@ -62,9 +62,8 @@ public final class ModuleInfoExtender { // the value of the ModuleMainClass attribute private String mainClass; - // the values for the ModuleTarget attribute - private String osName; - private String osArch; + // the value for the ModuleTarget attribute + private String targetPlatform; // the hashes for the ModuleHashes attribute private ModuleHashes hashes; @@ -108,11 +107,10 @@ public final class ModuleInfoExtender { } /** - * Sets the values for the ModuleTarget attribute. + * Sets the value for the ModuleTarget attribute. */ - public ModuleInfoExtender targetPlatform(String osName, String osArch) { - this.osName = osName; - this.osArch = osArch; + public ModuleInfoExtender targetPlatform(String targetPlatform) { + this.targetPlatform = targetPlatform; return this; } @@ -199,8 +197,8 @@ public final class ModuleInfoExtender { cv.addAttribute(new ModulePackagesAttribute(packages)); if (mainClass != null) cv.addAttribute(new ModuleMainClassAttribute(mainClass)); - if (osName != null || osArch != null) - cv.addAttribute(new ModuleTargetAttribute(osName, osArch)); + if (targetPlatform != null) + cv.addAttribute(new ModuleTargetAttribute(targetPlatform)); if (hashes != null) cv.addAttribute(new ModuleHashesAttribute(hashes)); if (moduleResolution != null) diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java index 01bee5041f4..dded95fe93d 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleInfoWriter.java @@ -66,10 +66,9 @@ public final class ModuleInfoWriter { // write ModuleMainClass if the module has a main class md.mainClass().ifPresent(mc -> cw.visitAttribute(new ModuleMainClassAttribute(mc))); - // write ModuleTarget if there is a platform OS/arch + // write ModuleTarget if there is a target platform if (target != null) { - cw.visitAttribute(new ModuleTargetAttribute(target.osName(), - target.osArch())); + cw.visitAttribute(new ModuleTargetAttribute(target.targetPlatform())); } cw.visitEnd(); diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleLoaderMap.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleLoaderMap.java index 15e60d0d611..b0f465d4776 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleLoaderMap.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleLoaderMap.java @@ -37,36 +37,66 @@ import jdk.internal.loader.ClassLoaders; /** - * The module to class loader map. The list of boot modules and platform modules - * are generated at build time. + * Supports the mapping of modules to class loaders. The set of modules mapped + * to the boot and platform class loaders is generated at build time from + * this source file. */ -final class ModuleLoaderMap { +public final class ModuleLoaderMap { + + /** + * Maps the system modules to the built-in class loaders. + */ + public static final class Mapper implements Function { + private final Map map; + + Mapper(Map map) { + this.map = map; // defensive copy not needed + } + + @Override + public ClassLoader apply(String name) { + return map.get(name); + } + } + + /** + * Returns the names of the modules defined to the boot loader. + */ + public static Set bootModules() { + // The list of boot modules generated at build time. + String[] BOOT_MODULES = new String[] { "@@BOOT_MODULE_NAMES@@" }; + Set bootModules = new HashSet<>(BOOT_MODULES.length); + for (String mn : BOOT_MODULES) { + bootModules.add(mn); + } + return bootModules; + } + + /** + * Returns the names of the modules defined to the platform loader. + */ + public static Set platformModules() { + // The list of platform modules generated at build time. + String[] PLATFORM_MODULES = new String[] { "@@PLATFORM_MODULE_NAMES@@" }; + Set platformModules = new HashSet<>(PLATFORM_MODULES.length); + for (String mn : PLATFORM_MODULES) { + platformModules.add(mn); + } + return platformModules; + } /** * Returns the function to map modules in the given configuration to the * built-in class loaders. */ static Function mappingFunction(Configuration cf) { - - // The list of boot modules and platform modules are generated at build time. - final String[] BOOT_MODULES = new String[] { "@@BOOT_MODULE_NAMES@@" }; - final String[] PLATFORM_MODULES = new String[] { "@@PLATFORM_MODULE_NAMES@@" }; - - Set bootModules = new HashSet<>(BOOT_MODULES.length); - for (String mn : BOOT_MODULES) { - bootModules.add(mn); - } - - Set platformModules = new HashSet<>(PLATFORM_MODULES.length); - for (String mn : PLATFORM_MODULES) { - platformModules.add(mn); - } + Set bootModules = bootModules(); + Set platformModules = platformModules(); ClassLoader platformClassLoader = ClassLoaders.platformClassLoader(); ClassLoader appClassLoader = ClassLoaders.appClassLoader(); Map map = new HashMap<>(); - for (ResolvedModule resolvedModule : cf.modules()) { String mn = resolvedModule.name(); if (!bootModules.contains(mn)) { @@ -77,12 +107,6 @@ final class ModuleLoaderMap { } } } - - return new Function () { - @Override - public ClassLoader apply(String mn) { - return map.get(mn); - } - }; + return new Mapper(map); } } diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java index 3f5827bfc54..c0458e0f34e 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePatcher.java @@ -120,7 +120,7 @@ public final class ModulePatcher { // JAR file - do not open as a multi-release JAR as this // is not supported by the boot class loader - try (JarFile jf = new JarFile(file.toFile())) { + try (JarFile jf = new JarFile(file.toString())) { jf.stream() .filter(e -> !e.isDirectory() && (!isAutomatic || e.getName().endsWith(".class"))) @@ -431,7 +431,7 @@ public final class ModulePatcher { private final URL csURL; JarResourceFinder(Path path) throws IOException { - this.jf = new JarFile(path.toFile()); + this.jf = new JarFile(path.toString()); this.csURL = path.toUri().toURL(); } @@ -505,7 +505,7 @@ public final class ModulePatcher { public Resource find(String name) throws IOException { Path file = Resources.toFilePath(dir, name); if (file != null) { - return newResource(name, dir, file); + return newResource(name, dir, file); } else { return null; } diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePath.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePath.java index 75a76b0858f..750ac801fe3 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModulePath.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModulePath.java @@ -59,6 +59,7 @@ import java.util.jar.Manifest; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.stream.Collectors; +import java.util.zip.ZipException; import java.util.zip.ZipFile; import jdk.internal.jmod.JmodFile; @@ -315,26 +316,42 @@ public class ModulePath implements ModuleFinder { { try { + // exploded module if (attrs.isDirectory()) { return readExplodedModule(entry); // may return null - } else { + } + + // JAR or JMOD file + if (attrs.isRegularFile()) { String fn = entry.getFileName().toString(); - if (attrs.isRegularFile()) { - if (fn.endsWith(".jar")) { + boolean isDefaultFileSystem = isDefaultFileSystem(entry); + + // JAR file + if (fn.endsWith(".jar")) { + if (isDefaultFileSystem) { return readJar(entry); - } else if (isLinkPhase && fn.endsWith(".jmod")) { - return readJMod(entry); + } else { + // the JAR file is in a custom file system so + // need to copy it to the local file system + Path tmpdir = Files.createTempDirectory("mlib"); + Path target = Files.copy(entry, tmpdir.resolve(fn)); + return readJar(target); } } - return null; + + // JMOD file + if (isDefaultFileSystem && isLinkPhase && fn.endsWith(".jmod")) { + return readJMod(entry); + } } + return null; + } catch (InvalidModuleDescriptorException e) { throw new FindException("Error reading module: " + entry, e); } } - /** * Returns a string with the file name of the module if possible. * If the module location is not a file URI then return the URI @@ -434,7 +451,7 @@ public class ModulePath implements ModuleFinder { * 3. The contents of any META-INF/services configuration files are mapped * to "provides" declarations * 4. The Main-Class attribute in the main attributes of the JAR manifest - * is mapped to the module descriptor mainClass + * is mapped to the module descriptor mainClass if possible */ private ModuleDescriptor deriveModuleDescriptor(JarFile jf) throws IOException @@ -530,12 +547,12 @@ public class ModulePath implements ModuleFinder { String mainClass = attrs.getValue(Attributes.Name.MAIN_CLASS); if (mainClass != null) { mainClass = mainClass.replace("/", "."); - String pn = packageName(mainClass); - if (!packages.contains(pn)) { - String msg = "Main-Class " + mainClass + " not in module"; - throw new InvalidModuleDescriptorException(msg); + if (Checks.isClassName(mainClass)) { + String pn = packageName(mainClass); + if (packages.contains(pn)) { + builder.mainClass(mainClass); + } } - builder.mainClass(mainClass); } } @@ -617,6 +634,8 @@ public class ModulePath implements ModuleFinder { } return ModuleReferences.newJarModule(attrs, patcher, file); + } catch (ZipException e) { + throw new FindException("Error reading " + file, e); } } @@ -733,6 +752,16 @@ public class ModulePath implements ModuleFinder { } } + + /** + * Return true if a path locates a path in the default file system + */ + private boolean isDefaultFileSystem(Path path) { + return path.getFileSystem().provider() + .getScheme().equalsIgnoreCase("file"); + } + + private static final PerfCounter scanTime = PerfCounter.newPerfCounter("jdk.module.finder.modulepath.scanTime"); private static final PerfCounter moduleCount diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferences.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferences.java index 450cc5ce6d2..938c446b6c7 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferences.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferences.java @@ -25,6 +25,7 @@ package jdk.internal.module; +import java.io.File; import java.io.IOError; import java.io.IOException; import java.io.InputStream; @@ -226,8 +227,8 @@ class ModuleReferences { static JarFile newJarFile(Path path) { try { - return new JarFile(path.toFile(), - true, // verify + return new JarFile(new File(path.toString()), + true, // verify ZipFile.OPEN_READ, JarFile.runtimeVersion()); } catch (IOException ioe) { diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleResolution.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleResolution.java index 76c42368c63..d8b9d9609a1 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleResolution.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleResolution.java @@ -39,6 +39,10 @@ public final class ModuleResolution { this.value = value; } + public int value() { + return value; + } + public static ModuleResolution empty() { return new ModuleResolution(0); } @@ -74,35 +78,30 @@ public final class ModuleResolution { throw new InternalError("cannot add deprecated for removal to " + value); return new ModuleResolution(value | WARN_DEPRECATED_FOR_REMOVAL); } + public ModuleResolution withIncubating() { if ((value & (WARN_DEPRECATED | WARN_DEPRECATED_FOR_REMOVAL)) != 0) throw new InternalError("cannot add incubating to " + value); return new ModuleResolution(value | WARN_INCUBATING); } - public int value() { - return value; - } - public static boolean doNotResolveByDefault(ModuleReference mref) { // get the DO_NOT_RESOLVE_BY_DEFAULT flag, if any - if (!(mref instanceof ModuleReferenceImpl)) - return false; - - ModuleResolution mres = ((ModuleReferenceImpl)mref).moduleResolution(); - if (mres != null) - return mres.doNotResolveByDefault(); + if (mref instanceof ModuleReferenceImpl) { + ModuleResolution mres = ((ModuleReferenceImpl) mref).moduleResolution(); + if (mres != null) + return mres.doNotResolveByDefault(); + } return false; } public static boolean hasIncubatingWarning(ModuleReference mref) { - if (!(mref instanceof ModuleReferenceImpl)) - return false; - - ModuleResolution mres = ((ModuleReferenceImpl)mref).moduleResolution(); - if (mres != null) - return mres.hasIncubatingWarning(); + if (mref instanceof ModuleReferenceImpl) { + ModuleResolution mres = ((ModuleReferenceImpl) mref).moduleResolution(); + if (mres != null) + return mres.hasIncubatingWarning(); + } return false; } diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleTarget.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleTarget.java index dcfe8ac8b58..ffd50704f33 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleTarget.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleTarget.java @@ -25,22 +25,21 @@ package jdk.internal.module; +/** + * Represents the module target. + * + * For now, this is a single value for the target platform, e.g. "linux-x64". + */ public final class ModuleTarget { - private final String osName; - private final String osArch; + private final String targetPlatform; - public ModuleTarget(String osName, String osArch) { - this.osName = osName; - this.osArch = osArch; + public ModuleTarget(String targetPlatform) { + this.targetPlatform = targetPlatform; } - public String osName() { - return osName; - } - - public String osArch() { - return osArch; + public String targetPlatform() { + return targetPlatform; } } diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java b/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java index 62288625b76..af784dd944e 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/Modules.java @@ -25,12 +25,22 @@ package jdk.internal.module; +import java.lang.module.Configuration; import java.lang.module.ModuleDescriptor; +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.lang.module.ResolvedModule; import java.net.URI; import java.security.AccessController; import java.security.PrivilegedAction; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; import jdk.internal.loader.BootLoader; +import jdk.internal.loader.BuiltinClassLoader; import jdk.internal.loader.ClassLoaders; import jdk.internal.misc.JavaLangAccess; import jdk.internal.misc.SharedSecrets; @@ -38,8 +48,8 @@ import jdk.internal.misc.SharedSecrets; /** * A helper class for creating and updating modules. This class is intended to * support command-line options, tests, and the instrumentation API. It is also - * used by the VM to add read edges when agents are instrumenting code that - * need to link to supporting classes. + * used by the VM to load modules or add read edges when agents are instrumenting + * code that need to link to supporting classes. * * The parameters that are package names in this API are the fully-qualified * names of the packages as defined in section 6.5.3 of The Java™ @@ -154,4 +164,90 @@ public class Modules { addReads(m, BootLoader.getUnnamedModule()); addReads(m, ClassLoaders.appClassLoader().getUnnamedModule()); } + + /** + * Called by the VM to load a system module, typically "java.instrument" or + * "jdk.management.agent". If the module is not loaded then it is resolved + * and loaded (along with any dependences that weren't previously loaded) + * into a child layer. + */ + public static synchronized Module loadModule(String name) { + ModuleLayer top = topLayer; + if (top == null) + top = ModuleLayer.boot(); + + Module module = top.findModule(name).orElse(null); + if (module != null) { + // module already loaded + return module; + } + + // resolve the module with the top-most layer as the parent + ModuleFinder empty = ModuleFinder.of(); + ModuleFinder finder = ModuleBootstrap.unlimitedFinder(); + Set roots = Set.of(name); + Configuration cf = top.configuration().resolveAndBind(empty, finder, roots); + + // create the child layer + Function clf = ModuleLoaderMap.mappingFunction(cf); + ModuleLayer newLayer = top.defineModules(cf, clf); + + // add qualified exports/opens to give access to modules in child layer + Map map = newLayer.modules().stream() + .collect(Collectors.toMap(Module::getName, + Function.identity())); + ModuleLayer layer = top; + while (layer != null) { + for (Module m : layer.modules()) { + // qualified exports + m.getDescriptor().exports().stream() + .filter(ModuleDescriptor.Exports::isQualified) + .forEach(e -> e.targets().forEach(target -> { + Module other = map.get(target); + if (other != null) { + addExports(m, e.source(), other); + }})); + + // qualified opens + m.getDescriptor().opens().stream() + .filter(ModuleDescriptor.Opens::isQualified) + .forEach(o -> o.targets().forEach(target -> { + Module other = map.get(target); + if (other != null) { + addOpens(m, o.source(), other); + }})); + } + + List parents = layer.parents(); + assert parents.size() <= 1; + layer = parents.isEmpty() ? null : parents.get(0); + } + + // update security manager before making types visible + JLA.addNonExportedPackages(newLayer); + + // update the built-in class loaders to make the types visible + for (ResolvedModule resolvedModule : cf.modules()) { + ModuleReference mref = resolvedModule.reference(); + String mn = mref.descriptor().name(); + ClassLoader cl = clf.apply(mn); + if (cl == null) { + BootLoader.loadModule(mref); + } else { + ((BuiltinClassLoader) cl).loadModule(mref); + } + } + + // new top layer + topLayer = newLayer; + + // return module + return newLayer.findModule(name) + .orElseThrow(() -> new InternalError("module not loaded")); + + } + + // the top-most system layer + private static ModuleLayer topLayer; + } diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/Resources.java b/jdk/src/java.base/share/classes/jdk/internal/module/Resources.java index 4498682f0b9..53865742dbe 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/module/Resources.java +++ b/jdk/src/java.base/share/classes/jdk/internal/module/Resources.java @@ -26,10 +26,10 @@ package jdk.internal.module; import java.io.File; import java.io.IOException; +import java.nio.file.FileSystem; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Path; -import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; /** @@ -94,7 +94,7 @@ public final class Resources { if (expectDirectory) { name = name.substring(0, name.length() - 1); // drop trailing "/" } - Path path = toSafeFilePath(name); + Path path = toSafeFilePath(dir.getFileSystem(), name); if (path != null) { Path file = dir.resolve(path); try { @@ -116,7 +116,7 @@ public final class Resources { * are rejected, as are resource names that translates to a file path * with a root component. */ - private static Path toSafeFilePath(String name) { + private static Path toSafeFilePath(FileSystem fs, String name) { // scan elements of resource name int next; int off = 0; @@ -135,12 +135,12 @@ public final class Resources { // convert to file path Path path; if (File.separatorChar == '/') { - path = Paths.get(name); + path = fs.getPath(name); } else { // not allowed to embed file separators if (name.contains(File.separator)) return null; - path = Paths.get(name.replace('/', File.separatorChar)); + path = fs.getPath(name.replace('/', File.separatorChar)); } // file path not allowed to have root component diff --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java index 0d0ba6209e3..f2670e55200 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/Reflection.java @@ -31,6 +31,7 @@ import java.util.HashMap; import java.util.Map; import java.util.Objects; import jdk.internal.HotSpotIntrinsicCandidate; +import jdk.internal.loader.ClassLoaders; import jdk.internal.misc.VM; /** Common utility routines used by both java.lang and @@ -315,23 +316,13 @@ public class Reflection { */ public static boolean isCallerSensitive(Method m) { final ClassLoader loader = m.getDeclaringClass().getClassLoader(); - if (VM.isSystemDomainLoader(loader) || isExtClassLoader(loader)) { + if (VM.isSystemDomainLoader(loader) || + loader == ClassLoaders.platformClassLoader()) { return m.isAnnotationPresent(CallerSensitive.class); } return false; } - private static boolean isExtClassLoader(ClassLoader loader) { - ClassLoader cl = ClassLoader.getSystemClassLoader(); - while (cl != null) { - if (cl.getParent() == null && cl == loader) { - return true; - } - cl = cl.getParent(); - } - return false; - } - /** * Returns an IllegalAccessException with an exception message based on * the access that is denied. diff --git a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java index 50200fdeada..f919026b31d 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java +++ b/jdk/src/java.base/share/classes/jdk/internal/reflect/ReflectionFactory.java @@ -135,6 +135,24 @@ public class ReflectionFactory { return soleInstance; } + /** + * Returns an alternate reflective Method instance for the given method + * intended for reflection to invoke, if present. + * + * A trusted method can define an alternate implementation for a method `foo` + * by defining a method named "reflected$foo" that will be invoked + * reflectively. + */ + private static Method findMethodForReflection(Method method) { + String altName = "reflected$" + method.getName(); + try { + return method.getDeclaringClass() + .getDeclaredMethod(altName, method.getParameterTypes()); + } catch (NoSuchMethodException ex) { + return null; + } + } + //-------------------------------------------------------------------------- // // Routines used by java.lang.reflect @@ -161,6 +179,13 @@ public class ReflectionFactory { public MethodAccessor newMethodAccessor(Method method) { checkInitted(); + if (Reflection.isCallerSensitive(method)) { + Method altMethod = findMethodForReflection(method); + if (altMethod != null) { + method = altMethod; + } + } + if (noInflation && !ReflectUtil.isVMAnonymousClass(method.getDeclaringClass())) { return new MethodAccessorGenerator(). generateMethod(method.getDeclaringClass(), diff --git a/jdk/src/java.base/share/classes/module-info.java b/jdk/src/java.base/share/classes/module-info.java index 1c3f76927aa..838f215d888 100644 --- a/jdk/src/java.base/share/classes/module-info.java +++ b/jdk/src/java.base/share/classes/module-info.java @@ -161,6 +161,7 @@ module java.base { java.security.jgss, java.sql, java.xml, + jdk.attach, jdk.charsets, jdk.compiler, // reflective dependency jdk.incubator.httpclient, diff --git a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java index d6cc3661d00..5ac605a2092 100644 --- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java +++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java @@ -43,13 +43,17 @@ import java.io.File; import java.io.IOException; import java.io.PrintStream; import java.io.UnsupportedEncodingException; -import java.lang.module.ModuleFinder; -import java.lang.module.ModuleReference; +import java.lang.module.Configuration; +import java.lang.module.FindException; import java.lang.module.ModuleDescriptor; import java.lang.module.ModuleDescriptor.Requires; import java.lang.module.ModuleDescriptor.Exports; import java.lang.module.ModuleDescriptor.Opens; import java.lang.module.ModuleDescriptor.Provides; +import java.lang.module.ModuleFinder; +import java.lang.module.ModuleReference; +import java.lang.module.ResolvedModule; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.math.BigDecimal; @@ -58,14 +62,16 @@ import java.net.URI; import java.nio.charset.Charset; import java.nio.file.DirectoryStream; import java.nio.file.Files; +import java.nio.file.NoSuchFileException; import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.attribute.BasicFileAttributes; import java.text.Normalizer; import java.text.MessageFormat; import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; import java.util.Comparator; -import java.util.HashSet; +import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; @@ -83,6 +89,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import jdk.internal.misc.VM; +import jdk.internal.module.ModuleBootstrap; import jdk.internal.module.Modules; @@ -98,6 +105,7 @@ public final class LauncherHelper { "javafx.application.Application"; private static final String JAVAFX_FXHELPER_CLASS_NAME_SUFFIX = "sun.launcher.LauncherHelper$FXHelper"; + private static final String LAUNCHER_AGENT_CLASS = "Launcher-Agent-Class"; private static final String MAIN_CLASS = "Main-Class"; private static final String ADD_EXPORTS = "Add-Exports"; private static final String ADD_OPENS = "Add-Opens"; @@ -408,8 +416,12 @@ public final class LauncherHelper { ostream = (printToStderr) ? System.err : System.out; } + static void initOutput(PrintStream ps) { + ostream = ps; + } + static String getMainClassFromJar(String jarname) { - String mainValue = null; + String mainValue; try (JarFile jarFile = new JarFile(jarname)) { Manifest manifest = jarFile.getManifest(); if (manifest == null) { @@ -426,6 +438,22 @@ public final class LauncherHelper { abort(null, "java.launcher.jar.error3", jarname); } + // Launcher-Agent-Class (only check for this when Main-Class present) + String agentClass = mainAttrs.getValue(LAUNCHER_AGENT_CLASS); + if (agentClass != null) { + ModuleLayer.boot().findModule("java.instrument").ifPresent(m -> { + try { + String cn = "sun.instrument.InstrumentationImpl"; + Class clazz = Class.forName(cn, false, null); + Method loadAgent = clazz.getMethod("loadAgent", String.class); + loadAgent.invoke(null, jarname); + } catch (Throwable e) { + if (e instanceof InvocationTargetException) e = e.getCause(); + abort(e, "java.launcher.jar.error4", jarname); + } + }); + } + // Add-Exports and Add-Opens String exports = mainAttrs.getValue(ADD_EXPORTS); if (exports != null) { @@ -913,141 +941,350 @@ public final class LauncherHelper { } } - private static void formatCommaList(PrintStream out, - String prefix, - Collection list) - { - if (list.isEmpty()) - return; - out.format("%s", prefix); - boolean first = true; - for (Object ob : list) { - if (first) { - out.format(" %s", ob); - first = false; - } else { - out.format(", %s", ob); - } - } - out.format("%n"); - } - /** * Called by the launcher to list the observable modules. - * If called without any sub-options then the output is a simple list of - * the modules. If called with sub-options then the sub-options are the - * names of the modules to list (e.g. --list-modules java.base,java.desktop) */ - static void listModules(boolean printToStderr, String optionFlag) - throws IOException, ClassNotFoundException - { - initOutput(printToStderr); + static void listModules() { + initOutput(System.out); - ModuleFinder finder = jdk.internal.module.ModuleBootstrap.finder(); - int colon = optionFlag.indexOf('='); - if (colon == -1) { - finder.findAll().stream() - .sorted(Comparator.comparing(ModuleReference::descriptor)) - .forEach(mref -> describeModule(finder, mref, false)); - } else { - String[] names = optionFlag.substring(colon+1).split(","); - for (String name: names) { - ModuleReference mref = finder.find(name).orElse(null); - if (mref == null) { - System.err.format("%s not found%n", name); - continue; - } - describeModule(finder, mref, true); - } - } + ModuleBootstrap.limitedFinder().findAll().stream() + .sorted(new JrtFirstComparator()) + .forEach(LauncherHelper::showModule); } /** - * Describes the given module. + * Called by the launcher to show the resolved modules */ - static void describeModule(ModuleFinder finder, - ModuleReference mref, - boolean verbose) - { - ModuleDescriptor md = mref.descriptor(); - ostream.print("module " + midAndLocation(md, mref.location())); - if (md.isAutomatic()) - ostream.print(" automatic"); - ostream.println(); + static void showResolvedModules() { + initOutput(System.out); - if (!verbose) - return; + ModuleLayer bootLayer = ModuleLayer.boot(); + Configuration cf = bootLayer.configuration(); + + cf.modules().stream() + .map(ResolvedModule::reference) + .sorted(new JrtFirstComparator()) + .forEach(LauncherHelper::showModule); + } + + /** + * Called by the launcher to describe a module + */ + static void describeModule(String moduleName) { + initOutput(System.out); + + ModuleFinder finder = ModuleBootstrap.limitedFinder(); + ModuleReference mref = finder.find(moduleName).orElse(null); + if (mref == null) { + abort(null, "java.launcher.module.error4", moduleName); + } + ModuleDescriptor md = mref.descriptor(); + + // one-line summary + showModule(mref); // unqualified exports (sorted by package) - Set exports = new TreeSet<>(Comparator.comparing(Exports::source)); - md.exports().stream().filter(e -> !e.isQualified()).forEach(exports::add); - for (Exports e : exports) { - String modsAndSource = Stream.concat(toStringStream(e.modifiers()), - Stream.of(e.source())) + md.exports().stream() + .filter(e -> !e.isQualified()) + .sorted(Comparator.comparing(Exports::source)) + .map(e -> Stream.concat(Stream.of(e.source()), + toStringStream(e.modifiers())) + .collect(Collectors.joining(" "))) + .forEach(sourceAndMods -> ostream.format("exports %s%n", sourceAndMods)); + + // dependences + for (Requires r : md.requires()) { + String nameAndMods = Stream.concat(Stream.of(r.name()), + toStringStream(r.modifiers())) .collect(Collectors.joining(" ")); - ostream.format(" exports %s%n", modsAndSource); + ostream.format("requires %s", nameAndMods); + finder.find(r.name()) + .map(ModuleReference::descriptor) + .filter(ModuleDescriptor::isAutomatic) + .ifPresent(any -> ostream.print(" automatic")); + ostream.println(); } - for (Requires d : md.requires()) { - ostream.format(" requires %s", d); - String suffix = finder.find(d.name()) - .map(ModuleReference::descriptor) - .map(any -> any.isAutomatic() ? " automatic" : "") - .orElse(" not found"); - ostream.println(suffix); - } + // service use and provides for (String s : md.uses()) { - ostream.format(" uses %s%n", s); + ostream.format("uses %s%n", s); } - for (Provides ps : md.provides()) { - ostream.format(" provides %s with %s%n", ps.service(), - ps.providers().stream().collect(Collectors.joining(", "))); + String names = ps.providers().stream().collect(Collectors.joining(" ")); + ostream.format("provides %s with %s%n", ps.service(), names); + } // qualified exports for (Exports e : md.exports()) { if (e.isQualified()) { - String modsAndSource = Stream.concat(toStringStream(e.modifiers()), - Stream.of(e.source())) - .collect(Collectors.joining(" ")); - ostream.format(" exports %s", modsAndSource); - formatCommaList(ostream, " to", e.targets()); + String who = e.targets().stream().collect(Collectors.joining(" ")); + ostream.format("qualified exports %s to %s%n", e.source(), who); } } // open packages - for (Opens obj: md.opens()) { - String modsAndSource = Stream.concat(toStringStream(obj.modifiers()), - Stream.of(obj.source())) + for (Opens opens: md.opens()) { + if (opens.isQualified()) + ostream.print("qualified "); + String sourceAndMods = Stream.concat(Stream.of(opens.source()), + toStringStream(opens.modifiers())) .collect(Collectors.joining(" ")); - ostream.format(" opens %s", modsAndSource); - if (obj.isQualified()) - formatCommaList(ostream, " to", obj.targets()); - else - ostream.println(); + ostream.format("opens %s", sourceAndMods); + if (opens.isQualified()) { + String who = opens.targets().stream().collect(Collectors.joining(" ")); + ostream.format(" to %s", who); + } + ostream.println(); } // non-exported/non-open packages Set concealed = new TreeSet<>(md.packages()); md.exports().stream().map(Exports::source).forEach(concealed::remove); md.opens().stream().map(Opens::source).forEach(concealed::remove); - concealed.forEach(p -> ostream.format(" contains %s%n", p)); + concealed.forEach(p -> ostream.format("contains %s%n", p)); } - static String toString(Set s) { - return toStringStream(s).collect(Collectors.joining(" ")); + /** + * Prints a single line with the module name, version and modifiers + */ + private static void showModule(ModuleReference mref) { + ModuleDescriptor md = mref.descriptor(); + ostream.print(md.toNameAndVersion()); + mref.location() + .filter(uri -> !isJrt(uri)) + .ifPresent(uri -> ostream.format(" %s", uri)); + if (md.isOpen()) + ostream.print(" open"); + if (md.isAutomatic()) + ostream.print(" automatic"); + ostream.println(); } - static Stream toStringStream(Set s) { + /** + * A ModuleReference comparator that considers modules in the run-time + * image to be less than modules than not in the run-time image. + */ + private static class JrtFirstComparator implements Comparator { + private final Comparator real; + + JrtFirstComparator() { + this.real = Comparator.comparing(ModuleReference::descriptor); + } + + @Override + public int compare(ModuleReference a, ModuleReference b) { + if (isJrt(a)) { + return isJrt(b) ? real.compare(a, b) : -1; + } else { + return isJrt(b) ? 1 : real.compare(a, b); + } + } + } + + private static Stream toStringStream(Set s) { return s.stream().map(e -> e.toString().toLowerCase()); } - static String midAndLocation(ModuleDescriptor md, Optional location ) { - URI loc = location.orElse(null); - if (loc == null || loc.getScheme().equalsIgnoreCase("jrt")) - return md.toNameAndVersion(); - else - return md.toNameAndVersion() + " (" + loc + ")"; + private static boolean isJrt(ModuleReference mref) { + return isJrt(mref.location().orElse(null)); + } + + private static boolean isJrt(URI uri) { + return (uri != null && uri.getScheme().equalsIgnoreCase("jrt")); + } + + /** + * Called by the launcher to validate the modules on the upgrade and + * application module paths. + * + * @return {@code true} if no errors are found + */ + private static boolean validateModules() { + initOutput(System.out); + + ModuleValidator validator = new ModuleValidator(); + + // upgrade module path + String value = System.getProperty("jdk.module.upgrade.path"); + if (value != null) { + Stream.of(value.split(File.pathSeparator)) + .map(Paths::get) + .forEach(validator::scan); + } + + // system modules + ModuleFinder.ofSystem().findAll().stream() + .sorted(Comparator.comparing(ModuleReference::descriptor)) + .forEach(validator::process); + + // application module path + value = System.getProperty("jdk.module.path"); + if (value != null) { + Stream.of(value.split(File.pathSeparator)) + .map(Paths::get) + .forEach(validator::scan); + } + + return !validator.foundErrors(); + } + + /** + * A simple validator to check for errors and conflicts between modules. + */ + static class ModuleValidator { + private static final String MODULE_INFO = "module-info.class"; + + private Map nameToModule = new HashMap<>(); + private Map packageToModule = new HashMap<>(); + private boolean errorFound; + + /** + * Returns true if at least one error was found + */ + boolean foundErrors() { + return errorFound; + } + + /** + * Prints the module location and name. + */ + private void printModule(ModuleReference mref) { + mref.location() + .filter(uri -> !isJrt(uri)) + .ifPresent(uri -> ostream.print(uri + " ")); + ModuleDescriptor descriptor = mref.descriptor(); + ostream.print(descriptor.name()); + if (descriptor.isAutomatic()) + ostream.print(" automatic"); + ostream.println(); + } + + /** + * Prints the module location and name, checks if the module is + * shadowed by a previously seen module, and finally checks for + * package conflicts with previously seen modules. + */ + void process(ModuleReference mref) { + printModule(mref); + + String name = mref.descriptor().name(); + ModuleReference previous = nameToModule.putIfAbsent(name, mref); + if (previous != null) { + ostream.print(INDENT + "shadowed by "); + printModule(previous); + } else { + // check for package conflicts when not shadowed + for (String pkg : mref.descriptor().packages()) { + previous = packageToModule.putIfAbsent(pkg, mref); + if (previous != null) { + String mn = previous.descriptor().name(); + ostream.println(INDENT + "contains " + pkg + + " conflicts with module " + mn); + errorFound = true; + } + } + } + } + + /** + * Scan an element on a module path. The element is a directory + * of modules, an exploded module, or a JAR file. + */ + void scan(Path entry) { + BasicFileAttributes attrs; + try { + attrs = Files.readAttributes(entry, BasicFileAttributes.class); + } catch (NoSuchFileException ignore) { + return; + } catch (IOException ioe) { + ostream.println(entry + " " + ioe); + errorFound = true; + return; + } + + String fn = entry.getFileName().toString(); + if (attrs.isRegularFile() && fn.endsWith(".jar")) { + // JAR file, explicit or automatic module + scanModule(entry).ifPresent(this::process); + } else if (attrs.isDirectory()) { + Path mi = entry.resolve(MODULE_INFO); + if (Files.exists(mi)) { + // exploded module + scanModule(entry).ifPresent(this::process); + } else { + // directory of modules + scanDirectory(entry); + } + } + } + + /** + * Scan the JAR files and exploded modules in a directory. + */ + private void scanDirectory(Path dir) { + try (DirectoryStream stream = Files.newDirectoryStream(dir)) { + Map moduleToEntry = new HashMap<>(); + + for (Path entry : stream) { + BasicFileAttributes attrs; + try { + attrs = Files.readAttributes(entry, BasicFileAttributes.class); + } catch (IOException ioe) { + ostream.println(entry + " " + ioe); + errorFound = true; + continue; + } + + ModuleReference mref = null; + + String fn = entry.getFileName().toString(); + if (attrs.isRegularFile() && fn.endsWith(".jar")) { + mref = scanModule(entry).orElse(null); + } else if (attrs.isDirectory()) { + Path mi = entry.resolve(MODULE_INFO); + if (Files.exists(mi)) { + mref = scanModule(entry).orElse(null); + } + } + + if (mref != null) { + String name = mref.descriptor().name(); + Path previous = moduleToEntry.putIfAbsent(name, entry); + if (previous != null) { + // same name as other module in the directory + printModule(mref); + ostream.println(INDENT + "contains same module as " + + previous.getFileName()); + errorFound = true; + } else { + process(mref); + } + } + } + } catch (IOException ioe) { + ostream.println(dir + " " + ioe); + errorFound = true; + } + } + + /** + * Scan a JAR file or exploded module. + */ + private Optional scanModule(Path entry) { + ModuleFinder finder = ModuleFinder.of(entry); + try { + return finder.findAll().stream().findFirst(); + } catch (FindException e) { + ostream.println(entry); + ostream.println(INDENT + e.getMessage()); + Throwable cause = e.getCause(); + if (cause != null) { + ostream.println(INDENT + cause); + } + errorFound = true; + return Optional.empty(); + } + } } } diff --git a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties index 7816cc058cc..7cf14706afb 100644 --- a/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties +++ b/jdk/src/java.base/share/classes/sun/launcher/resources/launcher.properties @@ -53,26 +53,33 @@ java.launcher.opt.footer = \ \ A {0} separated list of directories, each directory\n\ \ is a directory of modules that replace upgradeable\n\ \ modules in the runtime image\n\ -\ --add-modules [,...]\n\ +\ --add-modules [,...]\n\ \ root modules to resolve in addition to the initial module.\n\ -\ can also be ALL-DEFAULT, ALL-SYSTEM,\n\ +\ can also be ALL-DEFAULT, ALL-SYSTEM,\n\ \ ALL-MODULE-PATH.\n\ -\ --limit-modules [,...]\n\ -\ limit the universe of observable modules\n\ -\ --list-modules [[,...]]\n\ -\ list the observable modules and exit\n\ -\ --dry-run create VM but do not execute main method.\n\ -\ This --dry-run option may be useful for validating the\n\ +\ --list-modules\n\ +\ list observable modules and exit\n\ +\ --d \n\ +\ --describe-module \n\ +\ describe a module and exit\n\ +\ --dry-run create VM and load main class but do not execute main method.\n\ +\ The --dry-run option may be useful for validating the\n\ \ command-line options such as the module system configuration.\n\ +\ --validate-modules\n\ +\ validate all modules and exit\n\ +\ The --validate-modules option may be useful for finding\n\ +\ conflicts and other errors with modules on the module path.\n\ \ -D=\n\ \ set a system property\n\ -\ -verbose:[class|gc|jni]\n\ +\ -verbose:[class|module|gc|jni]\n\ \ enable verbose output\n\ \ -version print product version to the error stream and exit\n\ \ --version print product version to the output stream and exit\n\ \ -showversion print product version to the error stream and continue\n\ \ --show-version\n\ \ print product version to the output stream and continue\n\ +\ --show-module-resolution\n\ +\ show module resolution output during startup\n\ \ -? -h -help\n\ \ print this help message to the error stream\n\ \ --help print this help message to the output stream\n\ @@ -119,7 +126,6 @@ java.launcher.X.usage=\n\ \ -Xcomp forces compilation of methods on first invocation\n\ \ -Xdebug provided for backward compatibility\n\ \ -Xdiag show additional diagnostic messages\n\ -\ -Xdiag:resolver show resolver diagnostic messages\n\ \ -Xfuture enable strictest checks, anticipating future default\n\ \ -Xint interpreted mode execution only\n\ \ -Xinternalversion\n\ @@ -164,10 +170,12 @@ java.launcher.X.usage=\n\ \ permit illegal access to members of types in named modules\n\ \ by code in unnamed modules. This compatibility option will\n\ \ be removed in the next release.\n\ -\ --disable-@files disable further argument file expansion\n\ +\ --limit-modules [,...]\n\ +\ limit the universe of observable modules\n\ \ --patch-module =({0})*\n\ -\ Override or augment a module with classes and resources\n\ -\ in JAR files or directories.\n\n\ +\ override or augment a module with classes and resources\n\ +\ in JAR files or directories.\n\ +\ --disable-@files disable further argument file expansion\n\n\ These extra options are subject to change without notice.\n # Translators please note do not translate the options themselves @@ -204,6 +212,7 @@ java.launcher.jar.error1=\ Error: An unexpected error occurred while trying to open file {0} java.launcher.jar.error2=manifest not found in {0} java.launcher.jar.error3=no main manifest attribute, in {0} +java.launcher.jar.error4=error loading java agent in {0} java.launcher.init.error=initialization error java.launcher.javafx.error1=\ Error: The JavaFX launchApplication method has the wrong signature, it\n\ @@ -215,4 +224,5 @@ java.launcher.module.error2=\ java.launcher.module.error3=\ Error: Unable to load main class {0} from module {1}\n\ \t{2} - +java.launcher.module.error4=\ + {0} not found diff --git a/jdk/src/java.base/share/classes/sun/security/util/ConstraintsParameters.java b/jdk/src/java.base/share/classes/sun/security/util/ConstraintsParameters.java index 84318654557..83e6d32ff8a 100644 --- a/jdk/src/java.base/share/classes/sun/security/util/ConstraintsParameters.java +++ b/jdk/src/java.base/share/classes/sun/security/util/ConstraintsParameters.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2017 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/jdk/src/java.base/share/native/libjimage/endian.hpp b/jdk/src/java.base/share/native/libjimage/endian.hpp index 81eca199191..b14c39ec0f3 100644 --- a/jdk/src/java.base/share/native/libjimage/endian.hpp +++ b/jdk/src/java.base/share/native/libjimage/endian.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/java.base/share/native/libjimage/imageDecompressor.cpp b/jdk/src/java.base/share/native/libjimage/imageDecompressor.cpp index e2dbb79ce6f..96a175c57e7 100644 --- a/jdk/src/java.base/share/native/libjimage/imageDecompressor.cpp +++ b/jdk/src/java.base/share/native/libjimage/imageDecompressor.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/java.base/share/native/libjimage/imageDecompressor.hpp b/jdk/src/java.base/share/native/libjimage/imageDecompressor.hpp index c5a758abbcb..ed98b32e8cb 100644 --- a/jdk/src/java.base/share/native/libjimage/imageDecompressor.hpp +++ b/jdk/src/java.base/share/native/libjimage/imageDecompressor.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/java.base/share/native/libjimage/imageFile.hpp b/jdk/src/java.base/share/native/libjimage/imageFile.hpp index 9e02d87460c..c32d2fed8c8 100644 --- a/jdk/src/java.base/share/native/libjimage/imageFile.hpp +++ b/jdk/src/java.base/share/native/libjimage/imageFile.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/java.base/share/native/libjimage/inttypes.hpp b/jdk/src/java.base/share/native/libjimage/inttypes.hpp index d66b05418f1..c5947265245 100644 --- a/jdk/src/java.base/share/native/libjimage/inttypes.hpp +++ b/jdk/src/java.base/share/native/libjimage/inttypes.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -47,4 +47,3 @@ typedef long long s8; #endif #endif // LIBJIMAGE_INTTYPES_HPP - diff --git a/jdk/src/java.base/share/native/libjimage/jimage.hpp b/jdk/src/java.base/share/native/libjimage/jimage.hpp index 8521307bbf8..305c6e2b387 100644 --- a/jdk/src/java.base/share/native/libjimage/jimage.hpp +++ b/jdk/src/java.base/share/native/libjimage/jimage.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -202,4 +202,3 @@ extern "C" bool JIMAGE_ResourcePath(JImageFile* image, JImageLocationRef locatio typedef bool (*JImage_ResourcePath_t)(JImageFile* jimage, JImageLocationRef location, char* buffer, jlong size); - diff --git a/jdk/src/java.base/share/native/libjimage/osSupport.hpp b/jdk/src/java.base/share/native/libjimage/osSupport.hpp index 8fa15e3c0a7..aeb6c6a79d7 100644 --- a/jdk/src/java.base/share/native/libjimage/osSupport.hpp +++ b/jdk/src/java.base/share/native/libjimage/osSupport.hpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/jdk/src/java.base/share/native/libjli/emessages.h b/jdk/src/java.base/share/native/libjli/emessages.h index 8c3c34199ea..c5ae8d74b5e 100644 --- a/jdk/src/java.base/share/native/libjli/emessages.h +++ b/jdk/src/java.base/share/native/libjli/emessages.h @@ -43,13 +43,14 @@ #define ARG_ERROR2 "Error: %s requires jar file specification" #define ARG_ERROR3 "Error: The -J option should not be followed by a space." #define ARG_ERROR4 "Error: %s requires module path specification" -#define ARG_ERROR5 "Error: %s requires module id" +#define ARG_ERROR5 "Error: %s requires module name" #define ARG_ERROR6 "Error: %s requires modules to be specified" #define ARG_ERROR7 "Error: %s can only be specified once" #define ARG_ERROR8 "Error: Unmatched quote in environment variable %s" #define ARG_ERROR9 "Error: Option %s is not allowed in environment variable %s" #define ARG_ERROR10 "Error: Option %s in %s is not allowed in environment variable %s" #define ARG_ERROR11 "Error: Cannot specify main class in environment variable %s" +#define ARG_ERROR12 "Error: %s requires module name" #define JVM_ERROR1 "Error: Could not create the Java Virtual Machine.\n" GEN_ERROR #define JVM_ERROR2 "Error: Could not detach main thread.\n" JNI_ERROR diff --git a/jdk/src/java.base/share/native/libjli/java.c b/jdk/src/java.base/share/native/libjli/java.c index 4b005e24924..8967f70bc98 100644 --- a/jdk/src/java.base/share/native/libjli/java.c +++ b/jdk/src/java.base/share/native/libjli/java.c @@ -71,7 +71,10 @@ static jboolean printTo = USE_STDERR; /* where to print version/usage */ static jboolean printXUsage = JNI_FALSE; /* print and exit*/ static jboolean dryRun = JNI_FALSE; /* initialize VM and exit */ static char *showSettings = NULL; /* print but continue */ -static char *listModules = NULL; +static jboolean showResolvedModules = JNI_FALSE; +static jboolean listModules = JNI_FALSE; +static char *describeModule = NULL; +static jboolean validateModules = JNI_FALSE; static const char *_program_name; static const char *_launcher_name; @@ -118,7 +121,10 @@ static void SetApplicationClassPath(const char**); static void PrintJavaVersion(JNIEnv *env, jboolean extraLF); static void PrintUsage(JNIEnv* env, jboolean doXUsage); static void ShowSettings(JNIEnv* env, char *optString); -static void ListModules(JNIEnv* env, char *optString); +static void ShowResolvedModules(JNIEnv* env); +static void ListModules(JNIEnv* env); +static void DescribeModule(JNIEnv* env, char* optString); +static jboolean ValidateModules(JNIEnv* env); static void SetPaths(int argc, char **argv); @@ -408,9 +414,31 @@ JavaMain(void * _args) CHECK_EXCEPTION_LEAVE(1); } - if (listModules != NULL) { - ListModules(env, listModules); + // show resolved modules and continue + if (showResolvedModules) { + ShowResolvedModules(env); CHECK_EXCEPTION_LEAVE(1); + } + + // list observable modules, then exit + if (listModules) { + ListModules(env); + CHECK_EXCEPTION_LEAVE(1); + LEAVE(); + } + + // describe a module, then exit + if (describeModule != NULL) { + DescribeModule(env, describeModule); + CHECK_EXCEPTION_LEAVE(1); + LEAVE(); + } + + // validate modules on the module path, then exit + if (validateModules) { + jboolean okay = ValidateModules(env); + CHECK_EXCEPTION_LEAVE(1); + if (!okay) ret = 1; LEAVE(); } @@ -551,7 +579,8 @@ static jboolean IsLauncherOption(const char* name) { return IsClassPathOption(name) || IsLauncherMainOption(name) || - JLI_StrCmp(name, "--list-modules") == 0; + JLI_StrCmp(name, "--describe-module") == 0 || + JLI_StrCmp(name, "-d") == 0; } /* @@ -1194,7 +1223,7 @@ GetOpt(int *pargc, char ***pargv, char **poption, char **pvalue) { } else if (JLI_StrCCmp(arg, "--") == 0 && (equals = JLI_StrChr(arg, '=')) != NULL) { value = equals+1; - if (JLI_StrCCmp(arg, "--list-modules=") == 0 || + if (JLI_StrCCmp(arg, "--describe-module=") == 0 || JLI_StrCCmp(arg, "--module=") == 0 || JLI_StrCCmp(arg, "--class-path=") == 0) { kind = LAUNCHER_OPTION_WITH_ARGUMENT; @@ -1258,18 +1287,18 @@ ParseArguments(int *pargc, char ***pargv, REPORT_ERROR (has_arg_any_len, ARG_ERROR1, arg); SetClassPath(value); mode = LM_CLASS; - } else if (JLI_StrCmp(arg, "--list-modules") == 0 || - JLI_StrCCmp(arg, "--list-modules=") == 0) { - listModules = arg; - - // set listModules to --list-modules= if argument is specified - if (JLI_StrCmp(arg, "--list-modules") == 0 && has_arg) { - static const char format[] = "%s=%s"; - size_t buflen = JLI_StrLen(option) + 2 + JLI_StrLen(value); - listModules = JLI_MemAlloc(buflen); - JLI_Snprintf(listModules, buflen, format, option, value); - } - return JNI_TRUE; + } else if (JLI_StrCmp(arg, "--list-modules") == 0) { + listModules = JNI_TRUE; + } else if (JLI_StrCmp(arg, "--show-resolved-modules") == 0) { + showResolvedModules = JNI_TRUE; + } else if (JLI_StrCmp(arg, "--validate-modules") == 0) { + AddOption("-Djdk.module.minimumBoot=true", NULL); + validateModules = JNI_TRUE; + } else if (JLI_StrCmp(arg, "--describe-module") == 0 || + JLI_StrCCmp(arg, "--describe-module=") == 0 || + JLI_StrCmp(arg, "-d") == 0) { + REPORT_ERROR (has_arg_any_len, ARG_ERROR12, arg); + describeModule = value; /* * Parse white-space options */ @@ -1331,9 +1360,8 @@ ParseArguments(int *pargc, char ***pargv, showSettings = arg; } else if (JLI_StrCmp(arg, "-Xdiag") == 0) { AddOption("-Dsun.java.launcher.diag=true", NULL); - AddOption("-Djdk.launcher.traceResolver=true", NULL); - } else if (JLI_StrCmp(arg, "-Xdiag:resolver") == 0) { - AddOption("-Djdk.launcher.traceResolver=true", NULL); + } else if (JLI_StrCmp(arg, "--show-module-resolution") == 0) { + AddOption("-Djdk.module.showModuleResolution=true", NULL); /* * The following case provide backward compatibility with old-style * command line options. @@ -1392,7 +1420,10 @@ ParseArguments(int *pargc, char ***pargv, } if (*pwhat == NULL) { - *pret = 1; + /* LM_UNKNOWN okay for options that exit */ + if (!listModules && !describeModule && !validateModules) { + *pret = 1; + } } else if (mode == LM_UNKNOWN) { /* default to LM_CLASS if -m, -jar and -cp options are * not specified */ @@ -1821,21 +1852,61 @@ ShowSettings(JNIEnv *env, char *optString) } /** - * List modules supported by the runtime + * Show resolved modules */ static void -ListModules(JNIEnv *env, char *optString) +ShowResolvedModules(JNIEnv *env) +{ + jmethodID showResolvedModulesID; + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK(cls); + NULL_CHECK(showResolvedModulesID = (*env)->GetStaticMethodID(env, cls, + "showResolvedModules", "()V")); + (*env)->CallStaticVoidMethod(env, cls, showResolvedModulesID); +} + +/** + * List observable modules + */ +static void +ListModules(JNIEnv *env) { jmethodID listModulesID; - jstring joptString = NULL; jclass cls = GetLauncherHelperClass(env); NULL_CHECK(cls); NULL_CHECK(listModulesID = (*env)->GetStaticMethodID(env, cls, - "listModules", "(ZLjava/lang/String;)V")); + "listModules", "()V")); + (*env)->CallStaticVoidMethod(env, cls, listModulesID); +} + +/** + * Describe a module + */ +static void +DescribeModule(JNIEnv *env, char *optString) +{ + jmethodID describeModuleID; + jstring joptString = NULL; + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK(cls); + NULL_CHECK(describeModuleID = (*env)->GetStaticMethodID(env, cls, + "describeModule", "(Ljava/lang/String;)V")); NULL_CHECK(joptString = (*env)->NewStringUTF(env, optString)); - (*env)->CallStaticVoidMethod(env, cls, listModulesID, - USE_STDOUT, - joptString); + (*env)->CallStaticVoidMethod(env, cls, describeModuleID, joptString); +} + +/** + * Validate modules + */ +static jboolean +ValidateModules(JNIEnv *env) +{ + jmethodID validateModulesID; + jclass cls = GetLauncherHelperClass(env); + NULL_CHECK_RETURN_VALUE(cls, JNI_FALSE); + validateModulesID = (*env)->GetStaticMethodID(env, cls, "validateModules", "()Z"); + NULL_CHECK_RETURN_VALUE(cls, JNI_FALSE); + return (*env)->CallStaticBooleanMethod(env, cls, validateModulesID); } /* diff --git a/jdk/src/java.desktop/macosx/native/include/jawt_md.h b/jdk/src/java.desktop/macosx/native/include/jawt_md.h index c6859fdbf90..94a13c9ab40 100644 --- a/jdk/src/java.desktop/macosx/native/include/jawt_md.h +++ b/jdk/src/java.desktop/macosx/native/include/jawt_md.h @@ -37,7 +37,7 @@ extern "C" { #endif /* - * Mac OS X specific declarations for AWT native interface. + * MacOS specific declarations for AWT native interface. * See notes in jawt.h for an example of use. */ diff --git a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java index 677ee8b0e13..c14f328c0fa 100644 --- a/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java +++ b/jdk/src/java.desktop/share/classes/com/sun/java/swing/plaf/windows/WindowsComboBoxUI.java @@ -339,11 +339,16 @@ public class WindowsComboBoxUI extends BasicComboBoxUI { public Dimension getMinimumSize( JComponent c ) { Dimension d = super.getMinimumSize(c); if (XPStyle.getXP() != null) { - d.width += 5; + d.width += 7; + boolean isEditable = false; + if (c instanceof JComboBox) { + isEditable = ((JComboBox) c).isEditable(); + } + d.height += isEditable ? 4 : 6; } else { d.width += 4; + d.height += 2; } - d.height += 2; return d; } diff --git a/jdk/src/java.desktop/share/classes/java/awt/AlphaComposite.java b/jdk/src/java.desktop/share/classes/java/awt/AlphaComposite.java index dc650632d08..abf70255cd3 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/AlphaComposite.java +++ b/jdk/src/java.desktop/share/classes/java/awt/AlphaComposite.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -74,7 +74,7 @@ import sun.java2d.SunCompositeContext; * *
    * - *
    Factor  Definition + *
    Factor  Definition *
    Asthe alpha component of the source pixel *
    Csa color component of the source pixel in premultiplied form *
    Adthe alpha component of the destination pixel @@ -114,7 +114,7 @@ import sun.java2d.SunCompositeContext; * *
    * - *
    Factor  Definition + *
    Factor  Definition *
    Csr one of the raw color components of the source pixel *
    Cdr one of the raw color components of the destination pixel *
    Aac the "extra" alpha component from the AlphaComposite instance @@ -205,7 +205,7 @@ import sun.java2d.SunCompositeContext; * appropriate conversions are performed before and after the compositing * operation. * - *

    Implementation Caveats

    + *

    Implementation Caveats

    * *
      *
    • diff --git a/jdk/src/java.desktop/share/classes/java/awt/Graphics2D.java b/jdk/src/java.desktop/share/classes/java/awt/Graphics2D.java index ec5f9bd73bb..ed6f406b2f0 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/Graphics2D.java +++ b/jdk/src/java.desktop/share/classes/java/awt/Graphics2D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -78,7 +78,7 @@ import java.util.Map; *

      * When creating a {@code Graphics2D} object, the * {@code GraphicsConfiguration} - * specifies the default transform for + * specifies the default transform for * the target of the {@code Graphics2D} (a * {@link Component} or {@link Image}). This default transform maps the * user space coordinate system to screen and printer device coordinates @@ -129,7 +129,7 @@ import java.util.Map; * of their particular rendering processes are: *

        *
      1. - * {@code Shape} operations + * {@code Shape} operations *
          *
        1. * If the operation is a {@code draw(Shape)} operation, then @@ -160,7 +160,7 @@ import java.util.Map; * colors to render in device space. *
        *
      2. - * Text operations + * Text operations *
          *
        1. * The following steps are used to determine the set of glyphs required @@ -201,7 +201,7 @@ import java.util.Map; * the colors to render in device space. *
        *
      3. - * {@code Image} Operations + * {@code Image} Operations *
          *
        1. * The region of interest is defined by the bounding box of the source diff --git a/jdk/src/java.desktop/share/classes/java/awt/GridBagLayout.java b/jdk/src/java.desktop/share/classes/java/awt/GridBagLayout.java index 1ecf40840ea..e17d85d73f1 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/GridBagLayout.java +++ b/jdk/src/java.desktop/share/classes/java/awt/GridBagLayout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -122,7 +122,7 @@ import java.util.Arrays; * are not. Baseline relative values are calculated relative to the * baseline. Valid values are: * - *
          * * @@ -198,7 +198,7 @@ import java.util.Arrays; * The following figure shows a baseline layout and includes a * component that spans rows: *

          Absolute Values

          - * + * *
          * The following text describes this graphic (Figure 1). @@ -252,15 +252,15 @@ import java.util.Arrays; * left-to-right container and Figure 3 shows the layout for a horizontal, * right-to-left container. * - *
          - * + *
          + * * * - * + * * * * diff --git a/jdk/src/java.desktop/share/classes/java/awt/GridLayout.java b/jdk/src/java.desktop/share/classes/java/awt/GridLayout.java index a5eab8ad9ab..f096fce0693 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/GridLayout.java +++ b/jdk/src/java.desktop/share/classes/java/awt/GridLayout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -55,20 +55,20 @@ package java.awt; * If the container's {@code ComponentOrientation} property is horizontal * and right-to-left, the example produces the output shown in Figure 2. * - *
          * The preceding text describes this graphic (Figure 1). * * The preceding text describes this graphic (Figure 2). *
          Figure 2: Horizontal, Left-to-RightFigure 3: Horizontal, Right-to-Left
          - * + *
          + * * * - * * * - * + * * * * diff --git a/jdk/src/java.desktop/share/classes/java/awt/LinearGradientPaint.java b/jdk/src/java.desktop/share/classes/java/awt/LinearGradientPaint.java index ad70a60ac0a..179405dfd11 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/LinearGradientPaint.java +++ b/jdk/src/java.desktop/share/classes/java/awt/LinearGradientPaint.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,10 +91,9 @@ import java.beans.ConstructorProperties; *

          * This image demonstrates the example code above for each * of the three cycle methods: - *

          + *

          * image showing the output of the example code - *

          * * @see java.awt.Paint * @see java.awt.Graphics2D#setPaint diff --git a/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java b/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java index a5eaca19e61..6a6d3043bc4 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java +++ b/jdk/src/java.desktop/share/classes/java/awt/MenuBar.java @@ -46,7 +46,7 @@ import sun.awt.AWTAccessor; * the menu bar with a {@code Frame} object, call the * frame's {@code setMenuBar} method. *

          - * + * * This is what a menu bar might look like: *

          * + *

          * image showing the
  * distance AB=BC, and AD=DE - * + *

          * If the gradient and graphics rendering transforms are uniformly scaled and * the user sets the focus so that it coincides with the center of the circle, * the gradient color proportions are equal for any line drawn from the center. * The following figure shows the distances AB, BC, AD, and DE. They are all equal. - *

          + *

          * image showing the
  * distance of AB, BC, AD, and DE are all equal - *

          + *

          * Note that some minor variations in distances may occur due to sampling at * the granularity of a pixel. * If no cycle method is specified, {@code NO_CYCLE} will be chosen by @@ -116,11 +116,9 @@ import java.beans.ConstructorProperties; *

          * This image demonstrates the example code above, with default * (centered) focus for each of the three cycle methods: - *

          + *

          * image showing the
  * output of the sameple code - *

          - * *

          * It is also possible to specify a non-centered focus point, as * in the following code: @@ -139,10 +137,9 @@ import java.beans.ConstructorProperties; *

          * This image demonstrates the previous example code, with non-centered * focus for each of the three cycle methods: - *

          + *

          * image showing the
  * output of the sample code - *

          * * @see java.awt.Paint * @see java.awt.Graphics2D#setPaint diff --git a/jdk/src/java.desktop/share/classes/java/awt/Rectangle.java b/jdk/src/java.desktop/share/classes/java/awt/Rectangle.java index fcc5cf3c729..ecc531c1473 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/Rectangle.java +++ b/jdk/src/java.desktop/share/classes/java/awt/Rectangle.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1995, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -39,7 +39,7 @@ import java.beans.Transient; * that create a {@code Rectangle}, and the methods that can modify * one, do not prevent setting a negative value for width or height. *

          - * + * * A {@code Rectangle} whose width or height is exactly zero has location * along those axes with zero dimension, but is otherwise considered empty. * The {@link #isEmpty} method will return true for such a {@code Rectangle}. @@ -49,7 +49,7 @@ import java.beans.Transient; * will include the location of the {@code Rectangle} on that axis in the * result as if the {@link #add(Point)} method were being called. *

          - * + * * A {@code Rectangle} whose width or height is negative has neither * location nor dimension along those axes with negative dimensions. * Such a {@code Rectangle} is treated as non-existent along those axes. diff --git a/jdk/src/java.desktop/share/classes/java/awt/Shape.java b/jdk/src/java.desktop/share/classes/java/awt/Shape.java index 209063c46a2..d8c385f200c 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/Shape.java +++ b/jdk/src/java.desktop/share/classes/java/awt/Shape.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -43,7 +43,7 @@ import java.awt.geom.Rectangle2D; * object that describes the trajectory path of the {@code Shape} * outline. *

          - * Definition of insideness: + * Definition of insideness: * A point is considered to lie inside a * {@code Shape} if and only if: *

            diff --git a/jdk/src/java.desktop/share/classes/java/awt/dnd/DragSourceContext.java b/jdk/src/java.desktop/share/classes/java/awt/dnd/DragSourceContext.java index 63ceb3f1706..1de393a51cb 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/dnd/DragSourceContext.java +++ b/jdk/src/java.desktop/share/classes/java/awt/dnd/DragSourceContext.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -65,7 +65,7 @@ import sun.awt.ComponentFactory; * itself between the platform and the * listeners provided by the initiator of the drag operation. *

            - * + * * By default, {@code DragSourceContext} sets the cursor as appropriate * for the current state of the drag and drop operation. For example, if * the user has chosen {@linkplain DnDConstants#ACTION_MOVE the move action}, diff --git a/jdk/src/java.desktop/share/classes/java/awt/font/TextAttribute.java b/jdk/src/java.desktop/share/classes/java/awt/font/TextAttribute.java index c9ae83659f6..d9170d18ab5 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/font/TextAttribute.java +++ b/jdk/src/java.desktop/share/classes/java/awt/font/TextAttribute.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -96,14 +96,14 @@ import jdk.internal.misc.SharedSecrets; *

          * *

          Summary of attributes

          - *
          Shows 6 buttons in rows of 2. Row 1 shows buttons 1 then 2.
  * Row 2 shows buttons 3 then 4. Row 3 shows buttons 5 then 6. * Shows 6 buttons in rows of 2. Row 1 shows buttons 2 then 1.
+ * <td style=Shows 6 buttons in rows of 2. Row 1 shows buttons 2 then 1.
  * Row 2 shows buttons 4 then 3. Row 3 shows buttons 6 then 5. *
          Figure 1: Horizontal, Left-to-RightFigure 2: Horizontal, Right-to-Left
          * - * - * - * - * + * + * + * + * * * * diff --git a/jdk/src/java.desktop/share/classes/java/awt/geom/AffineTransform.java b/jdk/src/java.desktop/share/classes/java/awt/geom/AffineTransform.java index 019abbeb5c1..4bdb3d189f2 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/geom/AffineTransform.java +++ b/jdk/src/java.desktop/share/classes/java/awt/geom/AffineTransform.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -46,7 +46,7 @@ import java.beans.ConstructorProperties; * [ y'] = [ m10 m11 m12 ] [ y ] = [ m10x + m11y + m12 ] * [ 1 ] [ 0 0 1 ] [ 1 ] [ 1 ] * - *

          Handling 90-Degree Rotations

          + *

          Handling 90-Degree Rotations

          *

          * In some variations of the {@code rotate} methods in the * {@code AffineTransform} class, a double-precision argument diff --git a/jdk/src/java.desktop/share/classes/java/awt/geom/Arc2D.java b/jdk/src/java.desktop/share/classes/java/awt/geom/Arc2D.java index c5bb52aca24..00e553bbbbb 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/geom/Arc2D.java +++ b/jdk/src/java.desktop/share/classes/java/awt/geom/Arc2D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -33,11 +33,11 @@ import java.io.Serializable; * start angle, angular extent (length of the arc), and a closure type * ({@code OPEN}, {@code CHORD}, or {@code PIE}). *

          - * + * * The arc is a partial section of a full ellipse which * inscribes the framing rectangle of its parent {@link RectangularShape}. * - * + * * The angles are specified relative to the non-square * framing rectangle such that 45 degrees always falls on the line from * the center of the ellipse to the upper right corner of the framing diff --git a/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java b/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java index b877519f92e..98f70b7eb8a 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java +++ b/jdk/src/java.desktop/share/classes/java/awt/geom/Line2D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -618,7 +618,7 @@ public abstract class Line2D implements Shape, Cloneable { * specified line segment * @param y2 the Y coordinate of the end point of the * specified line segment - * @return {@code } if this line segment and the specified line segment + * @return {@code true} if this line segment and the specified line segment * intersect each other; {@code false} otherwise. * @since 1.2 */ diff --git a/jdk/src/java.desktop/share/classes/java/awt/geom/Path2D.java b/jdk/src/java.desktop/share/classes/java/awt/geom/Path2D.java index 9ef2bb1bfd8..08df1a7451d 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/geom/Path2D.java +++ b/jdk/src/java.desktop/share/classes/java/awt/geom/Path2D.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2006, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -846,7 +846,7 @@ public abstract class Path2D implements Shape, Cloneable { * path. * * @serialData - * + * *

            *
          1. The default serializable fields. * There are no default serializable fields as of 1.6. @@ -1605,7 +1605,7 @@ public abstract class Path2D implements Shape, Cloneable { * path. * * @serialData - * + * *
              *
            1. The default serializable fields. * There are no default serializable fields as of 1.6. diff --git a/jdk/src/java.desktop/share/classes/java/awt/im/spi/package-info.java b/jdk/src/java.desktop/share/classes/java/awt/im/spi/package-info.java index 59e34968325..ca2e5337413 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/im/spi/package-info.java +++ b/jdk/src/java.desktop/share/classes/java/awt/im/spi/package-info.java @@ -33,7 +33,7 @@ * languages and the use of entirely different input mechanisms, such as * handwriting recognition. * - *

              Packaging Input Methods

              + *

              Packaging Input Methods

              * Input methods can be made available by adding them to the application's class * path. The main JAR file of an input method must contain the file: *
              @@ -61,14 +61,14 @@
                * that loading of the class implementing {@code InputMethod} can be deferred
                * until actually needed.
                *
              - * 

              Loading Input Methods

              + *

              Loading Input Methods

              * The input method framework will usually defer loading of input method * classes until they are absolutely needed. It loads only the * {@code InputMethodDescriptor} implementations during AWT initialization. It * loads an {@code InputMethod} implementation when the input method has been * selected. * - *

              Java Input Methods and Peered Text + *

              Java Input Methods and Peered Text * Components

              * The Java input method framework intends to support all combinations of input * methods (host input methods and Java input methods) and components (peered diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/AbstractMultiResolutionImage.java b/jdk/src/java.desktop/share/classes/java/awt/image/AbstractMultiResolutionImage.java index 89c43879ac3..aa105ccea75 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/image/AbstractMultiResolutionImage.java +++ b/jdk/src/java.desktop/share/classes/java/awt/image/AbstractMultiResolutionImage.java @@ -29,7 +29,8 @@ import java.awt.Image; /** * This class provides default implementations of several {@code Image} methods - * for classes that want to implement the {@MultiResolutionImage} interface. + * for classes that want to implement the {@code MultiResolutionImage} + * interface. * * For example, *
               {@code
              diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferByte.java b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferByte.java
              index e1c32674858..d6fadd97c31 100644
              --- a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferByte.java
              +++ b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferByte.java
              @@ -1,5 +1,5 @@
               /*
              - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
              + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
                * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
                *
                * This code is free software; you can redistribute it and/or modify it
              @@ -42,7 +42,7 @@ import static sun.java2d.StateTrackable.State.*;
                * Values stored in the byte array(s) of this {@code DataBuffer} are treated as
                * unsigned values.
                * 

              - * + * * Note that some implementations may function more efficiently * if they can maintain control over how the data for an image is * stored. diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferDouble.java b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferDouble.java index 4ca5471cd18..cfd78cd8f0e 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferDouble.java +++ b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferDouble.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import static sun.java2d.StateTrackable.State.*; * This class extends {@code DataBuffer} and stores data internally * in {@code double} form. *

              - * + * * Note that some implementations may function more efficiently * if they can maintain control over how the data for an image is * stored. diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferFloat.java b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferFloat.java index 48e0cf437ff..259f0699780 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferFloat.java +++ b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferFloat.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -31,7 +31,7 @@ import static sun.java2d.StateTrackable.State.*; * This class extends {@code DataBuffer} and stores data internally * in {@code float} form. *

              - * + * * Note that some implementations may function more efficiently * if they can maintain control over how the data for an image is * stored. diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferInt.java b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferInt.java index cdf43cedb2a..58d8e658f17 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferInt.java +++ b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferInt.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ import static sun.java2d.StateTrackable.State.*; * This class extends {@code DataBuffer} and stores data internally * as integers. *

              - * + * * Note that some implementations may function more efficiently * if they can maintain control over how the data for an image is * stored. diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferShort.java b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferShort.java index 1c90a5fd171..90d8148fbb8 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferShort.java +++ b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferShort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ import static sun.java2d.StateTrackable.State.*; /** * This class extends {@code DataBuffer} and stores data internally as shorts. *

              - * + * * Note that some implementations may function more efficiently * if they can maintain control over how the data for an image is * stored. diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferUShort.java b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferUShort.java index d2009f90a0e..f8ec77a0711 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferUShort.java +++ b/jdk/src/java.desktop/share/classes/java/awt/image/DataBufferUShort.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,7 @@ import static sun.java2d.StateTrackable.State.*; * shorts. Values stored in the short array(s) of this {@code DataBuffer} * are treated as unsigned values. *

              - * + * * Note that some implementations may function more efficiently * if they can maintain control over how the data for an image is * stored. diff --git a/jdk/src/java.desktop/share/classes/java/awt/image/IndexColorModel.java b/jdk/src/java.desktop/share/classes/java/awt/image/IndexColorModel.java index 81aab994178..2ef638ee0f5 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/image/IndexColorModel.java +++ b/jdk/src/java.desktop/share/classes/java/awt/image/IndexColorModel.java @@ -55,7 +55,7 @@ import java.util.Arrays; * {@code IndexColorModel} objects are never pre-multiplied with * the alpha components. *

              - * + * * The transparency of an {@code IndexColorModel} object is * determined by examining the alpha components of the colors in the * colormap and choosing the most specific value after considering @@ -86,7 +86,7 @@ import java.util.Arrays; * and {@code getNumComponents} returns 4. * *

              - * + * * The values used to index into the colormap are taken from the least * significant n bits of pixel representations where * n is based on the pixel size specified in the constructor. diff --git a/jdk/src/java.desktop/share/classes/java/awt/package-info.java b/jdk/src/java.desktop/share/classes/java/awt/package-info.java index b2335c33ead..682a371dd83 100644 --- a/jdk/src/java.desktop/share/classes/java/awt/package-info.java +++ b/jdk/src/java.desktop/share/classes/java/awt/package-info.java @@ -35,10 +35,10 @@ * components can fire. See AWTEvent for a description of the AWT event model. *

              * A container is a component that can contain components and other containers. - * A con tainer can also have a layout manager that controls the visual - * placement of components in the container. The AWT package contains several - * layout manager classes and an interface for building your own layout manager. - * See Container and LayoutManager for more information. + * A container can also have a layout manager that controls the visual placement + * of components in the container. The AWT package contains several layout + * manager classes and an interface for building your own layout manager. See + * Container and LayoutManager for more information. *

              * Each {@code Component} object is limited in its maximum size and its location * because the values are stored as an integer. Also, a platform may further @@ -54,6 +54,8 @@ *

              * * @since 1.0 diff --git a/jdk/src/java.desktop/share/classes/javax/accessibility/package-info.java b/jdk/src/java.desktop/share/classes/javax/accessibility/package-info.java index eb311c27cda..74b81fe272b 100644 --- a/jdk/src/java.desktop/share/classes/javax/accessibility/package-info.java +++ b/jdk/src/java.desktop/share/classes/javax/accessibility/package-info.java @@ -37,7 +37,7 @@ * interfaces, and 6 Java programming language classes. These are described * below. * - *

              Interface + *

              Interface * Accessible

              * Interface Accessible is the main interface of * the Java Accessibility API. All components that support the Java @@ -48,7 +48,7 @@ * object that is part of the user interface of a Java application, if that * program is to be compatible with assistive technologies. * - *

              Class + *

              Class * AccessibleContext

              * AccessibleContext represents the minimum * information all accessible objects return and is obtained by calling the @@ -108,7 +108,7 @@ * called on an AccessibleContext.

            2. * * - *

              Class + *

              Class * AccessibleRole

              * This class encapsulates the Accessible object's role in the user interface * and is obtained by calling the {@code getAccessibleRole} method on an @@ -123,7 +123,7 @@ * programmer-defined roles can be added in the future without needing to modify * the base class. * - *

              Class + *

              Class * AccessibleState

              * This class encapsulates a particular state of the Accessible object. * Accessible states include things like "Armed", "Busy", "Checked", "Focused", @@ -142,7 +142,7 @@ * additional, programmer-defined roles can be added in the future without * needing to modify the base class. * - *

              Class + *

              Class * AccessibleStateSet

              * This class encapsulates a collection of states of the Accessible object and * is obtained by calling the {@code getAccessibleStateSet} method on an @@ -152,7 +152,7 @@ * class provide for retrieving the individual * AccessibleStates on the state set. * - *

              Class + *

              Class * AccessibleBundle

              * This class is used to maintain a strongly typed enumeration. It is the super * class of both the AccessibleRole and @@ -161,7 +161,7 @@ * AccessibleRole and * AccessibleState classes. * - *

              Interface + *

              Interface * AccessibleAction

              * The AccessibleAction interface should be * supported by any object that can perform one or more actions. This interface @@ -177,7 +177,7 @@ * AccessibleContext. If the return value is * not null, the object supports this interface. * - *

              + *

              * Interface AccessibleComponent

              * The AccessibleComponent interface * should be supported by any object that is rendered on the screen. This @@ -190,7 +190,7 @@ * AccessibleContext. If the return value is * not null, the object supports this interface. * - *

              + *

              * Interface AccessibleSelection

              * The AccessibleSelection interface * provides the standard mechanism for an assistive technology to determine what @@ -206,7 +206,7 @@ * AccessibleContext. If the return value is * not null, the object supports this interface. * - *

              Interface + *

              Interface * AccessibleText

              * Interface AccessibleText is the contract * for making rich, editable text Accessible. Not all text displayed on the @@ -230,7 +230,7 @@ * AccessibleContext. If the return value is * not null, the object supports this interface. * - *

              + *

              * Interface AccessibleHypertext

              * The AccessibleHypertext interface * should be supported by any object that presents hypertext information on the @@ -246,7 +246,7 @@ * class which extends AccessibleHypertext, then that object supports * AccessibleHypertext. * - *

              + *

              * Interface AccessibleHyperlink

              * An object that is a hyperlink should support the * AccessibleHyperlink interface.  @@ -254,7 +254,7 @@ * getLink method on an AccessibleHypertext * object. * - *

              Interface + *

              Interface * AccessibleValue

              * The AccessibleValue interface should be * supported by any object that supports a numerical value (e.g., a scroll bar). diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java index 7678762203f..8b522da3ed6 100644 --- a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java +++ b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFDirectory.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -63,8 +63,8 @@ import com.sun.imageio.plugins.tiff.TIFFImageMetadata; *

              A {@code TIFFDirectory} is aware of the tag numbers in the * group of {@link TIFFTagSet}s associated with it. When * a {@code TIFFDirectory} is created from a native image metadata - * object, these tag sets are derived from the tagSets attribute - * of the TIFFIFD node.

              + * object, these tag sets are derived from the {@code tagSets} attribute + * of the {@code TIFFIFD} node.

              * *

              A {@code TIFFDirectory} might also have a parent {@link TIFFTag}. * This will occur if the directory represents an IFD other than the root @@ -73,8 +73,8 @@ import com.sun.imageio.plugins.tiff.TIFFImageMetadata; * {@link TIFFTag#isIFDPointer} method of this parent {@code TIFFTag} * must return {@code true}. When a {@code TIFFDirectory} is * created from a native image metadata object, the parent tag set is set - * from the parentTagName attribute of the corresponding - * TIFFIFD node. Note that a {@code TIFFDirectory} instance + * from the {@code parentTagName} attribute of the corresponding + * {@code TIFFIFD} node. Note that a {@code TIFFDirectory} instance * which has a non-{@code null} parent tag will be contained in the * data field of a {@code TIFFField} instance which has a tag field * equal to the contained directory's parent tag.

              @@ -133,8 +133,8 @@ public class TIFFDirectory implements Cloneable { * an image metadata object. The supplied object must support an image * metadata format supported by the TIFF {@link javax.imageio.ImageWriter} * plug-in. This will usually be either the TIFF native image metadata - * format javax_imageio_tiff_image_1.0 or the Java - * Image I/O standard metadata format javax_imageio_1.0. + * format {@code javax_imageio_tiff_image_1.0} or the Java + * Image I/O standard metadata format {@code javax_imageio_1.0}. * * @param tiffImageMetadata A metadata object which supports a compatible * image metadata format. diff --git a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java index 7d4152c3db4..abc041abca0 100644 --- a/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java +++ b/jdk/src/java.desktop/share/classes/javax/imageio/plugins/tiff/TIFFField.java @@ -62,7 +62,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *

          * * * * * * * * * * * * * * * * * * * * * * * * * *
          KeyValue TypePrincipal ConstantsDefault ValueKeyValue TypePrincipal ConstantsDefault Value
          {@link #FAMILY}
          - * BYTE + * {@code BYTE} * * {@link TIFFTag#TIFF_BYTE} @@ -77,7 +77,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * ASCII + * {@code ASCII} * * {@link TIFFTag#TIFF_ASCII} @@ -92,7 +92,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * SHORT + * {@code SHORT} * * {@link TIFFTag#TIFF_SHORT} @@ -107,7 +107,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * LONG + * {@code LONG} * * {@link TIFFTag#TIFF_LONG} @@ -122,7 +122,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * RATIONAL + * {@code RATIONAL} * * {@link TIFFTag#TIFF_RATIONAL} @@ -137,7 +137,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * SBYTE + * {@code SBYTE} * * {@link TIFFTag#TIFF_SBYTE} @@ -152,7 +152,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * UNDEFINED + * {@code UNDEFINED} * * {@link TIFFTag#TIFF_UNDEFINED} @@ -167,7 +167,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * SSHORT + * {@code SSHORT} * * {@link TIFFTag#TIFF_SSHORT} @@ -182,7 +182,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * SLONG + * {@code SLONG} * * {@link TIFFTag#TIFF_SLONG} @@ -197,7 +197,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * SRATIONAL + * {@code SRATIONAL} * * {@link TIFFTag#TIFF_SRATIONAL} @@ -212,7 +212,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * FLOAT + * {@code FLOAT} * * {@link TIFFTag#TIFF_FLOAT} @@ -227,7 +227,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * DOUBLE + * {@code DOUBLE} * * {@link TIFFTag#TIFF_DOUBLE} @@ -242,7 +242,7 @@ import com.sun.imageio.plugins.tiff.TIFFIFD; * *
          - * IFD + * {@code IFD} * * {@link TIFFTag#TIFF_IFD_POINTER} @@ -941,14 +941,14 @@ public final class TIFFField implements Cloneable { /** * Returns the {@code TIFFField} as a node named either - * "TIFFField" or "TIFFIFD" as described in the + * {@code "TIFFField"} or {@code "TIFFIFD"} as described in the * TIFF native image metadata specification. The node will be named - * "TIFFIFD" if and only if {@link #hasDirectory()} returns + * {@code "TIFFIFD"} if and only if {@link #hasDirectory()} returns * {@code true} and the field's type is either {@link TIFFTag#TIFF_LONG} * or {@link TIFFTag#TIFF_IFD_POINTER}. * - * @return a {@code Node} named "TIFFField" or - * "TIFFIFD". + * @return a {@code Node} named {@code "TIFFField"} or + * {@code "TIFFIFD"}. */ public Node getAsNativeNode() { return new TIFFFieldNode(this); diff --git a/jdk/src/java.desktop/share/classes/javax/print/MimeType.java b/jdk/src/java.desktop/share/classes/javax/print/MimeType.java index c9d1f614af0..e96859e9c4c 100644 --- a/jdk/src/java.desktop/share/classes/javax/print/MimeType.java +++ b/jdk/src/java.desktop/share/classes/javax/print/MimeType.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -50,7 +50,6 @@ import java.util.Vector; *
        2. * Since not all Java profiles include the AWT, the Jini Print Service should * not depend on an AWT class. - *

          *

        3. * The implementation of class java.awt.datatransfer.MimeType does not * guarantee @@ -76,7 +75,6 @@ import java.util.Vector; *
        4. Quoting backslash characters inside parameter values are removed. *
        5. The parameters are arranged in ascending order of parameter name. * - *

          * * @author Alan Kaminsky */ diff --git a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/Finishings.java b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/Finishings.java index 8369f7f4da8..7df44452a4f 100644 --- a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/Finishings.java +++ b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/Finishings.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ import javax.print.attribute.PrintJobAttribute; * for purposes of finishing. *

          * Standard Finishings values are: - * + *
          * *
          *   @@ -76,7 +76,7 @@ import javax.print.attribute.PrintJobAttribute; *

          * The following Finishings values are more specific; they indicate a * corner or an edge as if the document were a portrait document: - * + *
          * *
          *   diff --git a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java index 7f06e953572..86a84de83d0 100644 --- a/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java +++ b/jdk/src/java.desktop/share/classes/javax/print/attribute/standard/MultipleDocumentHandling.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -70,7 +70,7 @@ import javax.print.attribute.PrintJobAttribute; * The standard MultipleDocumentHandling values are: *
            *
          • - * {@link #SINGLE_DOCUMENT + * {@link #SINGLE_DOCUMENT * SINGLE_DOCUMENT}. If a print job has multiple * documents -- say, the document data is called {@code a} and * {@code b} -- then the result of processing all the document data @@ -85,7 +85,7 @@ import javax.print.attribute.PrintJobAttribute; * each copy ({@code a(*),b(*)}) to start on a new media sheet. * *
          • - * {@link #SEPARATE_DOCUMENTS_UNCOLLATED_COPIES + * {@link #SEPARATE_DOCUMENTS_UNCOLLATED_COPIES * SEPARATE_DOCUMENTS_UNCOLLATED_COPIES}. If a print job * has multiple documents -- say, the document data is called {@code a} and * {@code b} -- then the result of processing the data in each document @@ -98,7 +98,7 @@ import javax.print.attribute.PrintJobAttribute; * {@code a(*),a(*),...,b(*),b(*)...}. * *
          • - * {@link #SEPARATE_DOCUMENTS_COLLATED_COPIES + * {@link #SEPARATE_DOCUMENTS_COLLATED_COPIES * SEPARATE_DOCUMENTS_COLLATED_COPIES}. If a print job * has multiple documents -- say, the document data is called {@code a} and * {@code b} -- then the result of processing the data in each document @@ -111,7 +111,7 @@ import javax.print.attribute.PrintJobAttribute; * {@code a(*),b(*),a(*),b(*),...}. * *
          • - * {@link #SINGLE_DOCUMENT_NEW_SHEET + * {@link #SINGLE_DOCUMENT_NEW_SHEET * SINGLE_DOCUMENT_NEW_SHEET}. Same as SINGLE_DOCUMENT, * except that the printer must ensure that the first impression of each * document instance in the job is placed on a new media sheet. This value diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java index 8c6a5904378..0fe40e84342 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MetaMessage.java @@ -59,7 +59,7 @@ public class MetaMessage extends MidiMessage { * * @see MidiMessage#getStatus */ - public static final int META = 0xFF; // 255 + public static final int META = 0xFF; // 255 /** * The length of the actual message in the data array. This is used to diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java index f7b8b9b5b3a..6ca01acb05b 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/MidiMessage.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -47,15 +47,15 @@ package javax.sound.midi; * {@code MidiMessage} includes methods to get, but not set, these values. * Setting them is a subclass responsibility. *

            - * The MIDI standard expresses MIDI data in + * The MIDI standard expresses MIDI data in * bytes. However, because JavaTM uses signed bytes, the Java Sound * API uses integers instead of bytes when expressing MIDI data. For example, * the {@link #getStatus()} method of {@code MidiMessage} returns MIDI status * bytes as integers. If you are processing MIDI data that originated outside * Java Sound and now is encoded as signed bytes, the bytes can be * converted to integers using this conversion: - * - *

            {@code int i = (int)(byte & 0xFF)}
            + *

            + * {@code int i = (int)(byte & 0xFF)} *

            * If you simply need to pass a known MIDI byte value as a method parameter, it * can be expressed directly as an integer, using (for example) decimal or diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java index b8cfba0adcb..f8b8aaac27d 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequence.java @@ -58,7 +58,7 @@ public class Sequence { * * @see #Sequence(float, int) */ - public static final float PPQ = 0.0f; + public static final float PPQ = 0.0f; /** * The SMPTE-based timing type with 24 frames per second (resolution is @@ -66,7 +66,7 @@ public class Sequence { * * @see #Sequence(float, int) */ - public static final float SMPTE_24 = 24.0f; + public static final float SMPTE_24 = 24.0f; /** * The SMPTE-based timing type with 25 frames per second (resolution is @@ -74,7 +74,7 @@ public class Sequence { * * @see #Sequence(float, int) */ - public static final float SMPTE_25 = 25.0f; + public static final float SMPTE_25 = 25.0f; /** * The SMPTE-based timing type with 29.97 frames per second (resolution is @@ -82,7 +82,7 @@ public class Sequence { * * @see #Sequence(float, int) */ - public static final float SMPTE_30DROP = 29.97f; + public static final float SMPTE_30DROP = 29.97f; /** * The SMPTE-based timing type with 30 frames per second (resolution is @@ -90,7 +90,7 @@ public class Sequence { * * @see #Sequence(float, int) */ - public static final float SMPTE_30 = 30.0f; + public static final float SMPTE_30 = 30.0f; // Variables diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java index 4050f385cc8..c1e94908602 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/Sequencer.java @@ -733,7 +733,7 @@ public interface Sequencer extends MidiDevice { * information from its internal clock. This is not a legal slave sync * mode. */ - public static final SyncMode INTERNAL_CLOCK = new SyncMode("Internal Clock"); + public static final SyncMode INTERNAL_CLOCK = new SyncMode("Internal Clock"); /** * A master or slave synchronization mode that specifies the use of MIDI @@ -745,7 +745,7 @@ public interface Sequencer extends MidiDevice { * receiver. MIDI clock messages are sent at a rate of 24 per quarter * note. */ - public static final SyncMode MIDI_SYNC = new SyncMode("MIDI Sync"); + public static final SyncMode MIDI_SYNC = new SyncMode("MIDI Sync"); /** * A master or slave synchronization mode that specifies the use of MIDI @@ -756,13 +756,13 @@ public interface Sequencer extends MidiDevice { * sequencer sends MIDI Time Code messages to its receiver. (See the * MIDI 1.0 Detailed Specification for a description of MIDI Time Code.) */ - public static final SyncMode MIDI_TIME_CODE = new SyncMode("MIDI Time Code"); + public static final SyncMode MIDI_TIME_CODE = new SyncMode("MIDI Time Code"); /** * A slave synchronization mode indicating that no timing information * should be sent to the receiver. This is not a legal master sync mode. */ - public static final SyncMode NO_SYNC = new SyncMode("No Timing"); + public static final SyncMode NO_SYNC = new SyncMode("No Timing"); } } diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java index 8d0a9a22253..c02deda21bf 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/ShortMessage.java @@ -61,35 +61,35 @@ public class ShortMessage extends MidiMessage { * * @see MidiMessage#getStatus */ - public static final int MIDI_TIME_CODE = 0xF1; // 241 + public static final int MIDI_TIME_CODE = 0xF1; // 241 /** * Status byte for Song Position Pointer message (0xF2, or 242). * * @see MidiMessage#getStatus */ - public static final int SONG_POSITION_POINTER = 0xF2; // 242 + public static final int SONG_POSITION_POINTER = 0xF2; // 242 /** * Status byte for MIDI Song Select message (0xF3, or 243). * * @see MidiMessage#getStatus */ - public static final int SONG_SELECT = 0xF3; // 243 + public static final int SONG_SELECT = 0xF3; // 243 /** * Status byte for Tune Request message (0xF6, or 246). * * @see MidiMessage#getStatus */ - public static final int TUNE_REQUEST = 0xF6; // 246 + public static final int TUNE_REQUEST = 0xF6; // 246 /** * Status byte for End of System Exclusive message (0xF7, or 247). * * @see MidiMessage#getStatus */ - public static final int END_OF_EXCLUSIVE = 0xF7; // 247 + public static final int END_OF_EXCLUSIVE = 0xF7; // 247 // System real-time messages @@ -98,80 +98,80 @@ public class ShortMessage extends MidiMessage { * * @see MidiMessage#getStatus */ - public static final int TIMING_CLOCK = 0xF8; // 248 + public static final int TIMING_CLOCK = 0xF8; // 248 /** * Status byte for Start message (0xFA, or 250). * * @see MidiMessage#getStatus */ - public static final int START = 0xFA; // 250 + public static final int START = 0xFA; // 250 /** * Status byte for Continue message (0xFB, or 251). * * @see MidiMessage#getStatus */ - public static final int CONTINUE = 0xFB; // 251 + public static final int CONTINUE = 0xFB; // 251 /** * Status byte for Stop message (0xFC, or 252). * * @see MidiMessage#getStatus */ - public static final int STOP = 0xFC; //252 + public static final int STOP = 0xFC; //252 /** * Status byte for Active Sensing message (0xFE, or 254). * * @see MidiMessage#getStatus */ - public static final int ACTIVE_SENSING = 0xFE; // 254 + public static final int ACTIVE_SENSING = 0xFE; // 254 /** * Status byte for System Reset message (0xFF, or 255). * * @see MidiMessage#getStatus */ - public static final int SYSTEM_RESET = 0xFF; // 255 + public static final int SYSTEM_RESET = 0xFF; // 255 // Channel voice message upper nibble defines /** * Command value for Note Off message (0x80, or 128). */ - public static final int NOTE_OFF = 0x80; // 128 + public static final int NOTE_OFF = 0x80; // 128 /** * Command value for Note On message (0x90, or 144). */ - public static final int NOTE_ON = 0x90; // 144 + public static final int NOTE_ON = 0x90; // 144 /** * Command value for Polyphonic Key Pressure (Aftertouch) message (0xA0, or * 160). */ - public static final int POLY_PRESSURE = 0xA0; // 160 + public static final int POLY_PRESSURE = 0xA0; // 160 /** * Command value for Control Change message (0xB0, or 176). */ - public static final int CONTROL_CHANGE = 0xB0; // 176 + public static final int CONTROL_CHANGE = 0xB0; // 176 /** * Command value for Program Change message (0xC0, or 192). */ - public static final int PROGRAM_CHANGE = 0xC0; // 192 + public static final int PROGRAM_CHANGE = 0xC0; // 192 /** * Command value for Channel Pressure (Aftertouch) message (0xD0, or 208). */ - public static final int CHANNEL_PRESSURE = 0xD0; // 208 + public static final int CHANNEL_PRESSURE = 0xD0; // 208 /** * Command value for Pitch Bend message (0xE0, or 224). */ - public static final int PITCH_BEND = 0xE0; // 224 + public static final int PITCH_BEND = 0xE0; // 224 /** * Constructs a new {@code ShortMessage}. The contents of the new message diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java index de478c3be31..b561faad898 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/SysexMessage.java @@ -81,7 +81,7 @@ public class SysexMessage extends MidiMessage { * * @see MidiMessage#getStatus */ - public static final int SYSTEM_EXCLUSIVE = 0xF0; // 240 + public static final int SYSTEM_EXCLUSIVE = 0xF0; // 240 /** * Status byte for Special System Exclusive message (0xF7, or 247), which is @@ -90,7 +90,7 @@ public class SysexMessage extends MidiMessage { * * @see MidiMessage#getStatus */ - public static final int SPECIAL_SYSTEM_EXCLUSIVE = 0xF7; // 247 + public static final int SPECIAL_SYSTEM_EXCLUSIVE = 0xF7; // 247 /** * The data bytes for this system exclusive message. These are initialized diff --git a/jdk/src/java.desktop/share/classes/javax/sound/midi/VoiceStatus.java b/jdk/src/java.desktop/share/classes/javax/sound/midi/VoiceStatus.java index 2d679613e01..0019a74f1b8 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/midi/VoiceStatus.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/midi/VoiceStatus.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -51,7 +51,7 @@ package javax.sound.midi; * given type of {@code Synthesizer} always has a fixed number of voices, equal * to the maximum number of simultaneous notes it is capable of sounding. *

            - * If the voice is not currently processing + * If the voice is not currently processing * a MIDI note, it is considered inactive. A voice is inactive when it has been * given no note-on commands, or when every note-on command received has been * terminated by a corresponding note-off (or by an "all notes off" message). diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java index 4f81d7c6514..a1abf92cef6 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/BooleanControl.java @@ -141,14 +141,14 @@ public abstract class BooleanControl extends Control { * Represents a control for the mute status of a line. Note that mute * status does not affect gain. */ - public static final Type MUTE = new Type("Mute"); + public static final Type MUTE = new Type("Mute"); /** * Represents a control for whether reverberation is applied to a line. * Note that the status of this control not affect the reverberation * settings for a line, but does affect whether these settings are used. */ - public static final Type APPLY_REVERB = new Type("Apply Reverb"); + public static final Type APPLY_REVERB = new Type("Apply Reverb"); /** * Constructs a new boolean control type. diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java index 485225b85f0..af310211d5f 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/FloatControl.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -361,8 +361,8 @@ public abstract class FloatControl extends Control { * loudness is unaffected. Note that gain measures dB, not amplitude. * The relationship between a gain in decibels and the corresponding * linear amplitude multiplier is: - * - *

            {@code linearScalar = pow(10.0, gainDB/20.0)}
            + *

            + * {@code linearScalar = pow(10.0, gainDB/20.0)} *

            * The {@code FloatControl} class has methods to impose a maximum and * minimum allowable value for gain. However, because an audio signal @@ -386,7 +386,7 @@ public abstract class FloatControl extends Control { * @see #REVERB_RETURN * @see #VOLUME */ - public static final Type MASTER_GAIN = new Type("Master Gain"); + public static final Type MASTER_GAIN = new Type("Master Gain"); /** * Represents a control for the auxiliary send gain on a line. @@ -394,7 +394,7 @@ public abstract class FloatControl extends Control { * @see #MASTER_GAIN * @see #AUX_RETURN */ - public static final Type AUX_SEND = new Type("AUX Send"); + public static final Type AUX_SEND = new Type("AUX Send"); /** * Represents a control for the auxiliary return gain on a line. @@ -402,7 +402,7 @@ public abstract class FloatControl extends Control { * @see #MASTER_GAIN * @see #AUX_SEND */ - public static final Type AUX_RETURN = new Type("AUX Return"); + public static final Type AUX_RETURN = new Type("AUX Return"); /** * Represents a control for the pre-reverb gain on a line. This control @@ -413,7 +413,7 @@ public abstract class FloatControl extends Control { * @see #REVERB_RETURN * @see EnumControl.Type#REVERB */ - public static final Type REVERB_SEND = new Type("Reverb Send"); + public static final Type REVERB_SEND = new Type("Reverb Send"); /** * Represents a control for the post-reverb gain on a line. This control @@ -423,7 +423,7 @@ public abstract class FloatControl extends Control { * @see #MASTER_GAIN * @see #REVERB_SEND */ - public static final Type REVERB_RETURN = new Type("Reverb Return"); + public static final Type REVERB_RETURN = new Type("Reverb Return"); /** * Represents a control for the volume on a line. @@ -431,7 +431,7 @@ public abstract class FloatControl extends Control { /* * $$kk: 08.30.99: ISSUE: what units? linear or dB? */ - public static final Type VOLUME = new Type("Volume"); + public static final Type VOLUME = new Type("Volume"); /** * Represents a control for the relative pan (left-right positioning) of @@ -442,7 +442,7 @@ public abstract class FloatControl extends Control { * * @see #BALANCE */ - public static final Type PAN = new Type("Pan"); + public static final Type PAN = new Type("Pan"); /** * Represents a control for the relative balance of a stereo signal @@ -452,7 +452,7 @@ public abstract class FloatControl extends Control { * * @see #PAN */ - public static final Type BALANCE = new Type("Balance"); + public static final Type BALANCE = new Type("Balance"); /** * Represents a control that changes the sample rate of audio playback. @@ -470,7 +470,7 @@ public abstract class FloatControl extends Control { * doubling the sample rate has the effect of doubling the frequencies * in the sound's spectrum, which raises the pitch by an octave. */ - public static final Type SAMPLE_RATE = new Type("Sample Rate"); + public static final Type SAMPLE_RATE = new Type("Sample Rate"); /** * Constructs a new float control type. diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java index 19fb585eae5..ca57d1de22a 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/LineEvent.java @@ -220,7 +220,7 @@ public class LineEvent extends EventObject { * @see #CLOSE * @see Line#open */ - public static final Type OPEN = new Type("Open"); + public static final Type OPEN = new Type("Open"); /** * A type of event that is sent when a line closes, freeing the system @@ -229,7 +229,7 @@ public class LineEvent extends EventObject { * @see #OPEN * @see Line#close */ - public static final Type CLOSE = new Type("Close"); + public static final Type CLOSE = new Type("Close"); /** * A type of event that is sent when a line begins to engage in active @@ -239,7 +239,7 @@ public class LineEvent extends EventObject { * @see #STOP * @see DataLine#start */ - public static final Type START = new Type("Start"); + public static final Type START = new Type("Start"); /** * A type of event that is sent when a line ceases active input or @@ -249,7 +249,7 @@ public class LineEvent extends EventObject { * @see #START * @see DataLine#stop */ - public static final Type STOP = new Type("Stop"); + public static final Type STOP = new Type("Stop"); /** * A type of event that is sent when a line ceases to engage in active diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/SourceDataLine.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/SourceDataLine.java index 7749b3a86fc..b5e20f0702a 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/SourceDataLine.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/SourceDataLine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2003, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -159,9 +159,9 @@ public interface SourceDataLine extends DataLine { *

            * The number of bytes to write must represent an integral number of sample * frames, such that: - *
            - *

            {@code [ bytes written ] % [frame size in bytes ] == 0}
            - *
            + *

            + * {@code [ bytes written ] % [frame size in bytes ] == 0} + *

            * The return value will always meet this requirement. A request to write a * number of bytes representing a non-integral number of sample frames * cannot be fulfilled and may result in an diff --git a/jdk/src/java.desktop/share/classes/javax/sound/sampled/TargetDataLine.java b/jdk/src/java.desktop/share/classes/javax/sound/sampled/TargetDataLine.java index acacdbcccae..944c8e03d92 100644 --- a/jdk/src/java.desktop/share/classes/javax/sound/sampled/TargetDataLine.java +++ b/jdk/src/java.desktop/share/classes/javax/sound/sampled/TargetDataLine.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -149,9 +149,9 @@ public interface TargetDataLine extends DataLine { *

            * The number of bytes to be read must represent an integral number of * sample frames, such that: - *
            - *

            {@code [ bytes read ] % [frame size in bytes ] == 0}
            - *
            + *

            + * {@code [ bytes read ] % [frame size in bytes ] == 0} + *

            * The return value will always meet this requirement. A request to read a * number of bytes representing a non-integral number of sample frames * cannot be fulfilled and may result in an IllegalArgumentException. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/Action.java b/jdk/src/java.desktop/share/classes/javax/swing/Action.java index f34fe517f11..52c6cd8c01b 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/Action.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/Action.java @@ -69,7 +69,7 @@ import java.beans.*; * are desired, and use simple ActionListeners elsewhere. *
            * - *

            Swing Components Supporting Action

            + *

            Swing Components Supporting Action

            *

            * Many of Swing's components have an Action property. When * an Action is set on a component, the following things @@ -96,34 +96,34 @@ import java.beans.*; * * - * - * + * + * * + * * + * * + * * + * * + * * + * * + * * + * *
            Component Property - * Components - * Action Key - * Notes - *
            Component Property + * Components + * Action Key + * Notes + *
            enabled * All * The isEnabled method *   - *
            toolTipText * All * SHORT_DESCRIPTION *   - *
            actionCommand * All * ACTION_COMMAND_KEY *   - *
            mnemonic * All buttons * MNEMONIC_KEY * A null value or Action results in the * button's mnemonic property being set to * '\0'. - *
            text * All buttons * NAME @@ -139,7 +139,7 @@ import java.beans.*; * true if the Action has a * non-null value for LARGE_ICON_KEY or * SMALL_ICON. - *
            displayedMnemonicIndex * All buttons * DISPLAYED_MNEMONIC_INDEX_KEY @@ -150,7 +150,7 @@ import java.beans.*; * mnemonic index is not updated. In any subsequent changes to * DISPLAYED_MNEMONIC_INDEX_KEY, null * is treated as -1. - *
            icon * All buttons except of JCheckBox, * JToggleButton and JRadioButton. @@ -160,13 +160,13 @@ import java.beans.*; * SMALL_ICON. All other buttons will use * LARGE_ICON_KEY; if the value is null they * use SMALL_ICON. - *
            accelerator * All JMenuItem subclasses, with the exception of * JMenu. * ACCELERATOR_KEY *   - *
            selected * JToggleButton, JCheckBox, * JRadioButton, JCheckBoxMenuItem and diff --git a/jdk/src/java.desktop/share/classes/javax/swing/BoxLayout.java b/jdk/src/java.desktop/share/classes/javax/swing/BoxLayout.java index ceaa943b97c..c56f020fe0e 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/BoxLayout.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/BoxLayout.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,7 +38,7 @@ import java.io.PrintStream; * arranged when the frame is resized. * * - *
            + * *

            The following text describes this graphic. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/DefaultListCellRenderer.java b/jdk/src/java.desktop/share/classes/javax/swing/DefaultListCellRenderer.java index 31bb7dd6596..3ac3755b82f 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/DefaultListCellRenderer.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/DefaultListCellRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -40,7 +40,7 @@ import sun.swing.DefaultLookup; /** * Renders an item in a list. *

            - * Implementation Note: + * Implementation Note: * This class overrides * invalidate, * validate, diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java index 4e9884d9828..e832abb1d75 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JComponent.java @@ -3735,7 +3735,7 @@ public abstract class JComponent extends Container implements Serializable, * @since 1.3 * @deprecated This class is no longer used or needed. * {@code java.awt.Component.AccessibleAWTComponent} provides - * the same functionality and it is handled in {@Component}. + * the same functionality and it is handled in {@code Component}. */ @Deprecated protected class AccessibleFocusHandler implements FocusListener { diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JLayeredPane.java b/jdk/src/java.desktop/share/classes/javax/swing/JLayeredPane.java index 6de8a0bd750..1c1f56a56db 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JLayeredPane.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JLayeredPane.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -49,7 +49,7 @@ import javax.accessibility.*; * * * - *
            + * *

            The following text describes this image. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JList.java b/jdk/src/java.desktop/share/classes/javax/swing/JList.java index ca8202071f5..0e7648c3630 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JList.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JList.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -145,7 +145,7 @@ import static sun.swing.SwingUtilities2.Section.*; * Responsibility for listening to selection changes in order to keep the list's * visual representation up to date lies with the list's {@code ListUI}. *

            - * + * * Painting of cells in a {@code JList} is handled by a delegate called a * cell renderer, installed on the list as the {@code cellRenderer} property. * The renderer provides a {@code java.awt.Component} that is used @@ -201,7 +201,7 @@ import static sun.swing.SwingUtilities2.Section.*; * To avoid these calculations, you can set a {@code fixedCellWidth} and * {@code fixedCellHeight} on the list, or have these values calculated * automatically based on a single prototype value: - * + * *

              * {@code
              * JList bigDataList = new JList(bigData);
            diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JOptionPane.java b/jdk/src/java.desktop/share/classes/javax/swing/JOptionPane.java
            index a61f1507253..1fec8d24b18 100644
            --- a/jdk/src/java.desktop/share/classes/javax/swing/JOptionPane.java
            +++ b/jdk/src/java.desktop/share/classes/javax/swing/JOptionPane.java
            @@ -1,5 +1,5 @@
             /*
            - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved.
            + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
              * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
              *
              * This code is free software; you can redistribute it and/or modify it
            @@ -143,7 +143,7 @@ import sun.awt.AWTAccessor;
              * in which case a default Frame is used as the parent,
              * and the dialog will be
              * centered on the screen (depending on the {@literal L&F}).
            - * 
            message
            + *
            message
            * A descriptive message to be placed in the dialog box. * In the most common usage, message is just a String or * String constant. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java b/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java index 3f72a8bc5ef..2a16d69daa1 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JRootPane.java @@ -72,7 +72,7 @@ import sun.security.action.GetBooleanAction; * * * - * diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JScrollPane.java b/jdk/src/java.desktop/share/classes/javax/swing/JScrollPane.java index a51509baec3..04e99bc521a 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JScrollPane.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JScrollPane.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,7 +57,7 @@ import java.beans.Transient; * *
            + * * The following text describes this graphic. *
            * - *
            + * *

            The following text describes this image. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/JTree.java b/jdk/src/java.desktop/share/classes/javax/swing/JTree.java index 34f779ab029..0dfcaebf0db 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/JTree.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/JTree.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -44,7 +44,7 @@ import sun.swing.SwingUtilities2.Section; import static sun.swing.SwingUtilities2.Section.*; /** - * + * * A control that displays a set of hierarchical data as an outline. * You can find task-oriented documentation and examples of using trees in * How to Use Trees, diff --git a/jdk/src/java.desktop/share/classes/javax/swing/LookAndFeel.java b/jdk/src/java.desktop/share/classes/javax/swing/LookAndFeel.java index bd8ea835b6c..0356defe226 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/LookAndFeel.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/LookAndFeel.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -91,7 +91,7 @@ import java.util.StringTokenizer; * to provide a specific set of defaults. These are documented in the * classes that require the specific default. * - *

            ComponentUIs and defaults

            + *

            ComponentUIs and defaults

            * * All {@code ComponentUIs} typically need to set various properties * on the {@code JComponent} the {@code ComponentUI} is providing the @@ -121,7 +121,7 @@ import java.util.StringTokenizer; * provided by this class as they handle the necessary checking and install * the property using the recommended guidelines. * - *

            Exceptions

            + *

            Exceptions

            * * All of the install methods provided by {@code LookAndFeel} need to * access the defaults if the value of the property being changed is diff --git a/jdk/src/java.desktop/share/classes/javax/swing/SizeSequence.java b/jdk/src/java.desktop/share/classes/javax/swing/SizeSequence.java index 131032d8491..24b4c845994 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/SizeSequence.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/SizeSequence.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -53,11 +53,10 @@ package javax.swing; * The following figure shows the relationship between size and position data * for a multi-column component. * - *
            + *

            * The first item begins at position 0, the second at the position equal
  to the size of the previous item, and so on. - *

            *

            * In the figure, the first index (0) corresponds to the first column, * the second index (1) to the second column, and so on. diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java index 05efd8f8321..42fc80b49a7 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/basic/BasicTextUI.java @@ -1283,14 +1283,13 @@ public abstract class BasicTextUI extends TextUI implements ViewFactory { * text component (i.e. the root of the hierarchy) that * can be traversed to determine how the model is being * represented spatially. - *

            - * NOTE:The View hierarchy can + *

            + * NOTE:The View hierarchy can * be traversed from the root view, and other things * can be done as well. Things done in this way cannot * be protected like simple method calls through the TextUI. * Therefore, proper operation in the presence of concurrency * must be arranged by any logic that calls this method! - * * * @param tc the text component for which this UI is installed * @return the view diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/DefaultMetalTheme.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/DefaultMetalTheme.java index dae37d5e7be..0ded39cc52b 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/DefaultMetalTheme.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/DefaultMetalTheme.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -42,7 +42,7 @@ import sun.swing.SwingUtilities2; * All colors returned by {@code DefaultMetalTheme} are completely * opaque. * - *

            Font Style

            + *

            Font Style

            * * {@code DefaultMetalTheme} uses bold fonts for many controls. To make all * controls (with the exception of the internal frame title bars and diff --git a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java index 9320bd1d095..fed8e2b0145 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/plaf/metal/MetalLookAndFeel.java @@ -292,85 +292,85 @@ public class MetalLookAndFeel extends BasicLookAndFeel * added to {@code table}: * - * - * + * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * * + * *
            Key - * Value - *
            Key + * Value + *
            "desktop" * {@code theme.getDesktopColor()} - *
            "activeCaption" * {@code theme.getWindowTitleBackground()} - *
            "activeCaptionText" * {@code theme.getWindowTitleForeground()} - *
            "activeCaptionBorder" * {@code theme.getPrimaryControlShadow()} - *
            "inactiveCaption" * {@code theme.getWindowTitleInactiveBackground()} - *
            "inactiveCaptionText" * {@code theme.getWindowTitleInactiveForeground()} - *
            "inactiveCaptionBorder" * {@code theme.getControlShadow()} - *
            "window" * {@code theme.getWindowBackground()} - *
            "windowBorder" * {@code theme.getControl()} - *
            "windowText" * {@code theme.getUserTextColor()} - *
            "menu" * {@code theme.getMenuBackground()} - *
            "menuText" * {@code theme.getMenuForeground()} - *
            "text" * {@code theme.getWindowBackground()} - *
            "textText" * {@code theme.getUserTextColor()} - *
            "textHighlight" * {@code theme.getTextHighlightColor()} - *
            "textHighlightText" * {@code theme.getHighlightedTextColor()} - *
            "textInactiveText" * {@code theme.getInactiveSystemTextColor()} - *
            "control" * {@code theme.getControl()} - *
            "controlText" * {@code theme.getControlTextColor()} - *
            "controlHighlight" * {@code theme.getControlHighlight()} - *
            "controlLtHighlight" * {@code theme.getControlHighlight()} - *
            "controlShadow" * {@code theme.getControlShadow()} - *
            "controlDkShadow" * {@code theme.getControlDarkShadow()} - *
            "scrollbar" * {@code theme.getControl()} - *
            "info" * {@code theme.getPrimaryControl()} - *
            "infoText" * {@code theme.getPrimaryControlInfo()} *
            diff --git a/jdk/src/java.desktop/share/classes/javax/swing/table/DefaultTableCellRenderer.java b/jdk/src/java.desktop/share/classes/javax/swing/table/DefaultTableCellRenderer.java index 0a7504da6ea..541a4e7343f 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/table/DefaultTableCellRenderer.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/table/DefaultTableCellRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1998, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -41,7 +41,7 @@ import sun.swing.DefaultLookup; * in a JTable. *

            * - * Implementation Note: + * Implementation Note: * This class inherits from JLabel, a standard component class. * However JTable employs a unique mechanism for rendering * its cells and therefore requires some slightly modified behavior diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLDocument.java b/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLDocument.java index d61d1f8de5b..640ca1c07c0 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLDocument.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLDocument.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -999,17 +999,17 @@ public class HTMLDocument extends DefaultStyledDocument { * * *

            Invoking setInnerHTML(elem, "<ul><li>") - * results in the following structure (new elements are in red).

            + * results in the following structure (new elements are in red).

            * *
                  *     <body>
                  *       |
                  *     <div>
                  *         \
            -     *         <ul>
            +     *         <ul>
                  *           \
            -     *           <li>
            +     *           <li>
                  * 
            * *

            Parameter elem must not be a leaf element, @@ -1083,15 +1083,15 @@ public class HTMLDocument extends DefaultStyledDocument { * * *

            Invoking setOuterHTML(elem, "<ul><li>") - * results in the following structure (new elements are in red).

            + * results in the following structure (new elements are in red).

            * *
                  *    <body>
                  *      |
            -     *     <ul>
            +     *     <ul>
                  *       \
            -     *       <li>
            +     *       <li>
                  * 
            * *

            If either elem or htmlText @@ -1157,16 +1157,16 @@ public class HTMLDocument extends DefaultStyledDocument { * *

            Invoking insertAfterStart(elem, * "<ul><li>") results in the following structure - * (new elements are in red).

            + * (new elements are in red).

            * *
                  *        <body>
                  *          |
                  *        <div>
                  *       /  |  \
            -     *    <ul> <p> <p>
            +     *    <ul> <p> <p>
                  *     /
            -     *  <li>
            +     *  <li>
                  * 
            * *

            Unlike the insertBeforeStart method, new @@ -1229,17 +1229,17 @@ public class HTMLDocument extends DefaultStyledDocument { * * *

            Invoking insertBeforeEnd(elem, "<ul><li>") - * results in the following structure (new elements are in red).

            + * results in the following structure (new elements are in red).

            * *
                  *        <body>
                  *          |
                  *        <div>
                  *       /  |  \
            -     *     <p> <p> <ul>
            +     *     <p> <p> <ul>
                  *               \
            -     *               <li>
            +     *               <li>
                  * 
            * *

            Unlike the insertAfterEnd method, new elements @@ -1300,14 +1300,14 @@ public class HTMLDocument extends DefaultStyledDocument { * *

            Invoking insertBeforeStart(elem, * "<ul><li>") results in the following structure - * (new elements are in red).

            + * (new elements are in red).

            * *
                  *        <body>
                  *         /  \
            -     *      <ul> <div>
            +     *      <ul> <div>
                  *       /    /  \
            -     *     <li> <p>  <p>
            +     *     <li> <p>  <p>
                  * 
            * *

            Unlike the insertAfterStart method, new @@ -1360,15 +1360,15 @@ public class HTMLDocument extends DefaultStyledDocument { * * *

            Invoking insertAfterEnd(elem, "<ul><li>") - * results in the following structure (new elements are in red).

            + * results in the following structure (new elements are in red).

            * *
                  *        <body>
                  *         /  \
            -     *      <div> <ul>
            +     *      <div> <ul>
                  *       / \    \
            -     *     <p> <p>  <li>
            +     *     <p> <p>  <li>
                  * 
            * *

            Unlike the insertBeforeEnd method, new elements diff --git a/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLEditorKit.java b/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLEditorKit.java index d5d995e9fba..7117fdd3823 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLEditorKit.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/text/html/HTMLEditorKit.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -1120,7 +1120,7 @@ public class HTMLEditorKit extends StyledEditorKit implements Accessible { * * * - * * diff --git a/jdk/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeCellRenderer.java b/jdk/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeCellRenderer.java index c7cdfc366ea..1b600343613 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeCellRenderer.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/tree/DefaultTreeCellRenderer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -61,9 +61,9 @@ import sun.swing.DefaultLookup; * defaults table. The following table lists the mapping between * {@code DefaultTreeCellRenderer} property and defaults table key: *
            TagView created + * TagView created *
            HTML.Tag.CONTENTInlineView *
            - * - * + *
            Property: - * Key: + *
            Property: + * Key: *
            "leafIcon""Tree.leafIcon" *
            "closedIcon""Tree.closedIcon" *
            "openIcon""Tree.openIcon" @@ -74,7 +74,7 @@ import sun.swing.DefaultLookup; *
            "borderSelectionColor""Tree.selectionBorderColor" *
            *

            - * Implementation Note: + * Implementation Note: * This class overrides * invalidate, * validate, diff --git a/jdk/src/java.desktop/share/classes/javax/swing/undo/UndoManager.java b/jdk/src/java.desktop/share/classes/javax/swing/undo/UndoManager.java index cb85826e611..55fa6228b76 100644 --- a/jdk/src/java.desktop/share/classes/javax/swing/undo/UndoManager.java +++ b/jdk/src/java.desktop/share/classes/javax/swing/undo/UndoManager.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -57,11 +57,11 @@ import sun.swing.text.UndoableEditLockSupport; * upper-case letter in bold are significant, those in lower-case * and italicized are insignificant. *

            - * + * * *
            * - *
            Figure 1 + *
            Figure 1 *
            *

            * As shown in figure 1, if D was just added, the @@ -70,11 +70,11 @@ import sun.swing.text.UndoableEditLockSupport; * index of the next edit to 3 (edit c), as shown in the following * figure. *

            - * + * * *
            * - *
            Figure 2 + *
            Figure 2 *
            *

            * The last significant edit is A, so that invoking @@ -82,11 +82,11 @@ import sun.swing.text.UndoableEditLockSupport; * b, and A, in that order, setting the index of the * next edit to 0, as shown in the following figure. *

            - * + * * *
            * - *
            Figure 3 + *
            Figure 3 *
            *

            * Invoking redo results in invoking redo on @@ -108,11 +108,11 @@ import sun.swing.text.UndoableEditLockSupport; * the new edit is added after c, as shown in the following * figure. *

            - * + * * *
            * - *
            Figure 4 + *
            Figure 4 *
            *

            * Once end has been invoked on an UndoManager diff --git a/jdk/src/java.desktop/share/classes/module-info.java b/jdk/src/java.desktop/share/classes/module-info.java index 29d24e68df3..658becc98c3 100644 --- a/jdk/src/java.desktop/share/classes/module-info.java +++ b/jdk/src/java.desktop/share/classes/module-info.java @@ -114,10 +114,17 @@ module java.desktop { uses javax.sound.sampled.spi.FormatConversionProvider; uses javax.sound.sampled.spi.MixerProvider; - provides sun.datatransfer.DesktopDatatransferService with sun.awt.datatransfer.DesktopDatatransferServiceImpl; - provides java.net.ContentHandlerFactory with sun.awt.www.content.MultimediaContentHandlers; - provides javax.print.PrintServiceLookup with sun.print.PrintServiceLookupProvider; - provides javax.print.StreamPrintServiceFactory with sun.print.PSStreamPrinterFactory; + provides sun.datatransfer.DesktopDatatransferService with + sun.awt.datatransfer.DesktopDatatransferServiceImpl; + + provides java.net.ContentHandlerFactory with + sun.awt.www.content.MultimediaContentHandlers; + + provides javax.print.PrintServiceLookup with + sun.print.PrintServiceLookupProvider; + + provides javax.print.StreamPrintServiceFactory with + sun.print.PSStreamPrinterFactory; provides javax.sound.midi.spi.MidiDeviceProvider with com.sun.media.sound.MidiInDeviceProvider, @@ -125,14 +132,17 @@ module java.desktop { com.sun.media.sound.RealTimeSequencerProvider, com.sun.media.sound.SoftProvider; - provides javax.sound.midi.spi.MidiFileReader with com.sun.media.sound.StandardMidiFileReader; - provides javax.sound.midi.spi.MidiFileWriter with com.sun.media.sound.StandardMidiFileWriter; + provides javax.sound.midi.spi.MidiFileReader with + com.sun.media.sound.StandardMidiFileReader; + + provides javax.sound.midi.spi.MidiFileWriter with + com.sun.media.sound.StandardMidiFileWriter; provides javax.sound.midi.spi.SoundbankReader with - com.sun.media.sound.AudioFileSoundbankReader, - com.sun.media.sound.DLSSoundbankReader, - com.sun.media.sound.JARSoundbankReader, - com.sun.media.sound.SF2SoundbankReader; + com.sun.media.sound.AudioFileSoundbankReader, + com.sun.media.sound.DLSSoundbankReader, + com.sun.media.sound.JARSoundbankReader, + com.sun.media.sound.SF2SoundbankReader; provides javax.sound.sampled.spi.AudioFileReader with com.sun.media.sound.AiffFileReader, @@ -158,4 +168,3 @@ module java.desktop { com.sun.media.sound.DirectAudioDeviceProvider, com.sun.media.sound.PortMixerProvider; } - diff --git a/jdk/src/java.desktop/share/classes/sun/swing/LightweightContent.java b/jdk/src/java.desktop/share/classes/sun/swing/LightweightContent.java index a18d056aa2f..169332a44d1 100644 --- a/jdk/src/java.desktop/share/classes/sun/swing/LightweightContent.java +++ b/jdk/src/java.desktop/share/classes/sun/swing/LightweightContent.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2016 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, 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 diff --git a/jdk/src/java.desktop/share/native/include/jawt.h b/jdk/src/java.desktop/share/native/include/jawt.h index 8cb2cb8564d..2079b0bc1b3 100644 --- a/jdk/src/java.desktop/share/native/include/jawt.h +++ b/jdk/src/java.desktop/share/native/include/jawt.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,18 +38,22 @@ extern "C" { * The AWT native interface allows a native C or C++ application a means * by which to access native structures in AWT. This is to facilitate moving * legacy C and C++ applications to Java and to target the needs of the - * community who, at present, wish to do their own native rendering to canvases - * for performance reasons. Standard extensions such as Java3D also require a - * means to access the underlying native data structures of AWT. + * developers who need to do their own native rendering to canvases + * for performance or other reasons. * - * There may be future extensions to this API depending on demand. + * Conversely it also provides mechanisms for an application which already + * has a native window to provide that to AWT for AWT rendering. * - * A VM does not have to implement this API in order to pass the JCK. - * It is recommended, however, that this API is implemented on VMs that support - * standard extensions, such as Java3D. + * Since every platform may be different in its native data structures + * and APIs for windowing systems the application must necessarily + * provided per-platform source and compile and deliver per-platform + * native code to use this API. + * + * These interfaces are not part of the Java SE specification and + * a VM is not required to implement this API. However it is strongly + * recommended that all implementations which support headful AWT + * also support these interfaces. * - * Since this is a native API, any program which uses it cannot be considered - * 100% pure java. */ /* @@ -58,7 +62,7 @@ extern "C" { * For each platform, there is a native drawing surface structure. This * platform-specific structure can be found in jawt_md.h. It is recommended * that additional platforms follow the same model. It is also recommended - * that VMs on Win32 and Solaris support the existing structures in jawt_md.h. + * that VMs on all platforms support the existing structures in jawt_md.h. * ******************* * EXAMPLE OF USAGE: @@ -98,8 +102,8 @@ extern "C" { * jboolean result; * jint lock; * - * // Get the AWT - * awt.version = JAWT_VERSION_1_3; + * // Get the AWT. Request version 9 to access features in that release. + * awt.version = JAWT_VERSION_9; * result = JAWT_GetAWT(env, &awt); * assert(result != JNI_FALSE); * @@ -154,7 +158,7 @@ typedef struct jawt_DrawingSurfaceInfo { /* * Pointer to the platform-specific information. This can be safely * cast to a JAWT_Win32DrawingSurfaceInfo on Windows or a - * JAWT_X11DrawingSurfaceInfo on Solaris. On Mac OS X this is a + * JAWT_X11DrawingSurfaceInfo on Linux and Solaris. On Mac OS X this is a * pointer to a NSObject that conforms to the JAWT_SurfaceLayers * protocol. See jawt_md.h for details. */ @@ -237,7 +241,8 @@ typedef struct jawt_DrawingSurface { typedef struct jawt { /* * Version of this structure. This must always be set before - * calling JAWT_GetAWT() + * calling JAWT_GetAWT(). It affects the functions returned. + * Must be one of the known pre-defined versions. */ jint version; /* @@ -332,6 +337,13 @@ typedef struct jawt { _JNI_IMPORT_OR_EXPORT_ jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt); +/* + * Specify one of these constants as the JAWT.version + * Specifying an earlier version will limit the available functions to + * those provided in that earlier version of JAWT. + * See the "Since" note on each API. Methods with no "Since" + * may be presumed to be present in JAWT_VERSION_1_3. + */ #define JAWT_VERSION_1_3 0x00010003 #define JAWT_VERSION_1_4 0x00010004 #define JAWT_VERSION_1_7 0x00010007 diff --git a/jdk/src/java.desktop/share/specs/AWT_Native_Interface.html b/jdk/src/java.desktop/share/specs/AWT_Native_Interface.html new file mode 100644 index 00000000000..782376099a8 --- /dev/null +++ b/jdk/src/java.desktop/share/specs/AWT_Native_Interface.html @@ -0,0 +1,776 @@ + + + + + +Java AWT Native Interface Specification and Guide + + +

            The Java AWT Native Interface Specification and Guide

            +

            Introduction

            +

            The Java AWT Native Interface (JAWT) comprises a small set of native +(eg C language-based) APIs that provide a standard supported way +for interaction between Java API windows and surfaces, and +platform native API windows and surfaces. +Non-Java libraries may then render to a Java owned window. +

            +Note: in this document the terms "Java AWT Native Interface", +"AWT Native Interface" and "JAWT" are interchangeable and +refer to this same specification. +

            +The fundamental obstacle to native rendering without JAWT is that +is that the rendering code cannot identify where to draw. +The native code needs access to information about a Java +drawing surface (such as a handle to the underlying native ID of a +Canvas), but cannot get it.

            +Without that information (ie without JAWT) an application could +use native rendering only by creating its own top-level window +not shared at all with Java. This is unacceptable for most uses. +Except for usage via JAWT, this is considered to be entirely +internal to the Java platform implementation: private, unsupported +and undocumented. +

            +JAWT should be supported in all headful implementations +where technically possible although this is not enforced by the JCK. +There is a platform-specific and a platform +independent portion to the API, to account for the differing +data structures and requirements of each platform. +This document specifies the platform independent portions and +also documents the platform dependent portions for the Oracle JDK +supported desktop operating environments. +For AWT the term platform is less tied to the underlying operating +system than it is to the desktop windowing environment. +

            +Reasons for using the AWT Native Interface include +

              +
            • Use of a 3rd party native library not available in Java +
            • A temporary porting aid before converting legacy code to Java +
            • Rendering performance available only to native hardware accelerated APIs +
            • Interoperation with another toolkit +
            +

            +Drawbacks include +

              +
            • A more complex application implementation, eg for painting +
            • Potential for application instability if the native library does +not interoperate properly with AWT. +
            • Increased application delivery complexity - per platform binaries +
            +The header file "jawt.h" +in the Appendix fully specifies the APIs provided by JAWT. +

            +An example illustrating how easy it is to use the AWT Native Interface +is presented and discussed later in this document.

            + +

            JAWT usage depends on JNI

            +

            The definition of Java Standard Edition includes JNI, the Java +Native Interface. Many Java developers will never need to use it, +but the interface is the only standard supported way for a Java +language program to interact directly with +application code that has been compiled to the native machine +instructions for the host processor architecture. +JNI is used where ever there is a need for mixed languages. +These are by no means limited to cases like AWT. For example, you +could use JNI to integrate with native code that communicates with +a peripheral device, such as a scanner, connected to a system via a +USB port.

            +

            So JNI is general enough to be used to access almost any +sort of native library. +The rest of this document assumes a familiarity with how +to use JNI. + +

            How to use JAWT

            +

            In this section we describe the most common usage of the AWT +Native Interface — overriding the paint method to +direct drawing operations to a native rendering library which then +queries the Java VM to determine the information it needs in order +to render. Note, however, that any native code may use the AWT +Native Interface to learn about a target drawing surface, not just +code in a paint method.

            +

            The first step in hooking up a native rendering library to a +Java Canvas is to define a new class that extends +Canvas and overrides the paint method. The Java +system routes all drawing operations for a Canvas object +through the paint method, as it does for all other GUI +objects. Canvas is a good candidate for the rendering surface as +it does not have any content as a Button would.

            +

            The new paint method, to be implemented in the native +rendering library, must be declared as public native void +, and the native library itself is loaded at runtime by including a +call to System.loadLibrary( "myRenderingLib")in +the static block of the class. The myRenderingLib +name is used for the native shared library; for Linux or the Solaris +operating environment, the actual name for the library file on disk +is libmyRenderingLib.so .

            +

            Here is a simple example of such a class:

            +
            +import java.awt.*;
            +import java.awt.event.*;
            +
            +public class MyCanvas extends Canvas {
            +    static {
            +        System.loadLibrary("myRenderingLib");
            +    }
            +    public native void paint(Graphics g);
            +
            +    public static void main(String[] args) {
            +        Frame f = new Frame();
            +        f.setBounds(0, 0, 500, 110);
            +        f.add(new MyCanvas());
            +        f.addWindowListener( new WindowAdapter() {
            +            public void windowClosing(WindowEvent ev) {
            +                System.exit(0);
            +            }
            +        } );
            +        f.show();
            +    }
            +}
            +
            +
            +

            Note that this class has a main method that can be used +to run this code as an application for testing purposes.

            +

            The next step is to run the javah tool on the +MyCanvas class file above to generate a C/C++ header file +that describes the interface to the native paint method +that Java expects to be used. javah is a standard tool +included with the JDK. NB: javac -h outputdir may also be used.

            + +

            The final step ­ and the most interesting one ­ is to +write the native rendering method, with an interface that conforms +to the header file that javah generated, and build it as a +standard shared library (called myRenderingLib in the +above example) by linking it, against the appropriate JDK provided +$JDK_HOME/lib/$JAWT_LIB library for the target platform. +Where JAWT_LIB has the base name "jawt" and follows platform +shared object naming rules. i.e.: +

              +
            • Windows: jawt.dll +
            • MacOS: libjawt.dylib +
            • Linux: libjawt.so +
            • Solaris: libjawt.so +
            + +This code will call back to the Java virtual machine to +get the drawing surface information it needs to access the +MyCanvas peer. Once this information is available, the +code can draw directly to MyCanvas using standard drawing +routines supplied by the underlying operating system.

            +

            Here is sample source code for a native paint method +designed for use in a X11-based drawing environment (Linux +or Solaris) and a Java VM where the AWT Native Interface is present:

            +
            +#include "MyCanvas.h"
            +#include "jawt_md.h"
            +
            +/*
            + * Class:     MyCanvas
            + * Method:    paint
            + * Signature: (Ljava/awt/Graphics;)V
            + */
            +JNIEXPORT void JNICALL Java_MyCanvas_paint
            +(JNIEnv* env, jobject canvas, jobject graphics)
            +{
            +    JAWT awt;
            +    JAWT_DrawingSurface* ds;
            +    JAWT_DrawingSurfaceInfo* dsi;
            +    JAWT_X11DrawingSurfaceInfo* dsi_x11;
            +    jboolean result;
            +    jint lock;
            +    GC gc;
            +
            +    short       i;
            +    char        *testString = "^^^ rendered from native code ^^^";
            +
            +    /* Get the AWT */
            +    awt.version = JAWT_VERSION_9;
            +    if (JAWT_GetAWT(env, &awt) == JNI_FALSE) {
            +        printf("AWT Not found\n");
            +        return;
            +    }
            +
            +    /* Get the drawing surface */
            +    ds = awt.GetDrawingSurface(env, canvas);
            +    if (ds == NULL) {
            +        printf("NULL drawing surface\n");
            +        return;
            +    }
            +
            +    /* Lock the drawing surface */
            +    lock = ds->Lock(ds);
            +    if((lock & JAWT_LOCK_ERROR) != 0) {
            +        printf("Error locking surface\n");
            +        awt.FreeDrawingSurface(ds);
            +        return;
            +    }
            +
            +    /* Get the drawing surface info */
            +    dsi = ds->GetDrawingSurfaceInfo(ds);
            +    if (dsi == NULL) {
            +        printf("Error getting surface info\n");
            +        ds->Unlock(ds);
            +        awt.FreeDrawingSurface(ds);
            +        return;
            +    }
            +
            +    /* Get the platform-specific drawing info */
            +    dsi_x11 = (JAWT_X11DrawingSurfaceInfo*)dsi->platformInfo;
            +
            +
            +    /* Now paint */
            +    gc = XCreateGC(dsi_x11->display, dsi_x11->drawable, 0, 0);
            +    XSetBackground(dsi_x11->display, gc, 0);
            +    for (i=0; i<36;i++)
            +    {
            +        XSetForeground(dsi_x11->display, gc, 10*i);
            +        XFillRectangle(dsi_x11->display, dsi_x11->drawable, gc,
            +                        10*i, 5, 90, 90);
            +    }
            +    XSetForeground(dsi_x11->display, gc, 155);
            +    XDrawImageString(dsi_x11->display, dsi_x11->drawable, gc,
            +                        100, 110, testString, strlen(testString));
            +    XFreeGC(dsi_x11->display, gc);
            +
            +
            +    /* Free the drawing surface info */
            +    ds->FreeDrawingSurfaceInfo(dsi);
            +
            +    /* Unlock the drawing surface */
            +    ds->Unlock(ds);
            +
            +    /* Free the drawing surface */
            +    awt.FreeDrawingSurface(ds);
            +}
            +
            +

            The key data structure here is JAWT , which is defined +in jawt.h (included by jawt_md.h) ; it provides +access to all the information the native code needs to get the job +done. The first part of the native method is boilerplate: it +populates the JAWT structure, gets a +JAWT_DrawingSurface structure, locks the surface (only one +drawing engine at a time, please!), then gets a +JAWT_DrawingSurfaceInfo structure that contains a pointer +(in the platformInfo field) to the necessary +platform-specific drawing information. It also includes the +bounding rectangle of the drawing surface and the current clipping +region.

            +

            The structure of the information pointed to by +platformInfo is defined in a machine-dependent header file +called jawt_md.h. For X11 drawing, it includes +information about the X11 display and X11 drawable associated with +MyCanvas. After the drawing operations are completed, +there is more boilerplate code as JAWT_DrawingSurfaceInfo +is freed and JAWT_DrawingSurface is unlocked and +freed.

            +

            The corresponding code for the GDI API on the Microsoft Windows platform would +be structured similarly, but would include the version of +jawt_md.h for Microsoft Windows and the structure located +in the platformInfo field of drawing surface info would be +cast as a JAWT_Win32DrawingSurfaceInfo* . And, of course, +the actual drawing operations would need to be changed to those +appropriate for the Microsoft Windows platform. +The same also for MacOS. +

            +

            Summary

            +

            The ability to draw directly into a Java Canvas from a +native code library is extremely useful for developers planning to +migrate a legacy software system to Java, especially one that +includes a high-performance rendering engine. It makes it much +easier to migrate in stages, leaving performance-sensitive +rendering code alone, while other less-sensitive portions of code +are converted to Java. The result can be a modern Java-centric +application, providing the benefit of portability and development +efficiency, but one that does not sacrifice an investment in +performance of a key piece of native code.

            +

            References

            +

            The definitive reference to the Java Native Interface is The +Java Native Interface: Programmer's Guide and Specification by +Sheng Liang. This book was published in June +1999 by Addison-Wesley. The ISBN is 0-201-32577-2.

            +

            Appendix

            +

            Header Files for jawt.h and jawt_md.h

            + +

            jawt.h

            +
            +#ifndef _JAVASOFT_JAWT_H_
            +#define _JAVASOFT_JAWT_H_
            +
            +#include "jni.h"
            +
            +#ifdef __cplusplus
            +extern "C" {
            +#endif
            +
            +/*
            + * AWT native interface.
            + *
            + * The AWT native interface allows a native C or C++ application a means
            + * by which to access native structures in AWT.  This is to facilitate moving
            + * legacy C and C++ applications to Java and to target the needs of the
            + * developers who need to do their own native rendering to canvases
            + * for performance or other reasons.
            + *
            + * Conversely it also provides mechanisms for an application which already
            + * has a native window to provide that to AWT for AWT rendering.
            + *
            + * Since every platform may be different in its native data structures
            + * and APIs for windowing systems the application must necessarily
            + * provided per-platform source and compile and deliver per-platform
            + * native code  to use this API.
            + *
            + * These interfaces are not part of the Java SE specification and
            + * a VM is not required to implement this API. However it is strongly
            + * recommended that all implementations which support headful AWT
            + * also support these interfaces.
            + *
            + */
            +
            +/*
            + * AWT Native Drawing Surface (JAWT_DrawingSurface).
            + *
            + * For each platform, there is a native drawing surface structure.  This
            + * platform-specific structure can be found in jawt_md.h.  It is recommended
            + * that additional platforms follow the same model.  It is also recommended
            + * that VMs on all platforms support the existing structures in jawt_md.h.
            + *
            + *******************
            + * EXAMPLE OF USAGE:
            + *******************
            + *
            + * On Microsoft Windows, a programmer wishes to access the HWND of a canvas
            + * to perform native rendering into it.  The programmer has declared the
            + * paint() method for their canvas subclass to be native:
            + *
            + *
            + * MyCanvas.java:
            + *
            + * import java.awt.*;
            + *
            + * public class MyCanvas extends Canvas {
            + *
            + *     static {
            + *         System.loadLibrary("mylib");
            + *     }
            + *
            + *     public native void paint(Graphics g);
            + * }
            + *
            + *
            + * myfile.c:
            + *
            + * #include "jawt_md.h"
            + * #include <assert.h>
            + *
            + * JNIEXPORT void JNICALL
            + * Java_MyCanvas_paint(JNIEnv* env, jobject canvas, jobject graphics)
            + * {
            + *     JAWT awt;
            + *     JAWT_DrawingSurface* ds;
            + *     JAWT_DrawingSurfaceInfo* dsi;
            + *     JAWT_Win32DrawingSurfaceInfo* dsi_win;
            + *     jboolean result;
            + *     jint lock;
            + *
            + *     // Get the AWT. Request version 9 to access features in that release.
            + *     awt.version = JAWT_VERSION_9;
            + *     result = JAWT_GetAWT(env, &awt);
            + *     assert(result != JNI_FALSE);
            + *
            + *     // Get the drawing surface
            + *     ds = awt.GetDrawingSurface(env, canvas);
            + *     assert(ds != NULL);
            + *
            + *     // Lock the drawing surface
            + *     lock = ds->Lock(ds);
            + *     assert((lock & JAWT_LOCK_ERROR) == 0);
            + *
            + *     // Get the drawing surface info
            + *     dsi = ds->GetDrawingSurfaceInfo(ds);
            + *
            + *     // Get the platform-specific drawing info
            + *     dsi_win = (JAWT_Win32DrawingSurfaceInfo*)dsi->platformInfo;
            + *
            + *     //////////////////////////////
            + *     // !!! DO PAINTING HERE !!! //
            + *     //////////////////////////////
            + *
            + *     // Free the drawing surface info
            + *     ds->FreeDrawingSurfaceInfo(dsi);
            + *
            + *     // Unlock the drawing surface
            + *     ds->Unlock(ds);
            + *
            + *     // Free the drawing surface
            + *     awt.FreeDrawingSurface(ds);
            + * }
            + *
            + */
            +
            +/*
            + * JAWT_Rectangle
            + * Structure for a native rectangle.
            + */
            +typedef struct jawt_Rectangle {
            +    jint x;
            +    jint y;
            +    jint width;
            +    jint height;
            +} JAWT_Rectangle;
            +
            +struct jawt_DrawingSurface;
            +
            +/*
            + * JAWT_DrawingSurfaceInfo
            + * Structure for containing the underlying drawing information of a component.
            + */
            +typedef struct jawt_DrawingSurfaceInfo {
            +    /*
            +     * Pointer to the platform-specific information.  This can be safely
            +     * cast to a JAWT_Win32DrawingSurfaceInfo on Microsoft Windows or a
            +     * JAWT_X11DrawingSurfaceInfo on Linux and Solaris. On MacOS this is a
            +     * pointer to a NSObject that conforms to the JAWT_SurfaceLayers protocol.
            +     * See jawt_md.h for details.
            +     */
            +    void* platformInfo;
            +    /* Cached pointer to the underlying drawing surface */
            +    struct jawt_DrawingSurface* ds;
            +    /* Bounding rectangle of the drawing surface */
            +    JAWT_Rectangle bounds;
            +    /* Number of rectangles in the clip */
            +    jint clipSize;
            +    /* Clip rectangle array */
            +    JAWT_Rectangle* clip;
            +} JAWT_DrawingSurfaceInfo;
            +
            +#define JAWT_LOCK_ERROR                 0x00000001
            +#define JAWT_LOCK_CLIP_CHANGED          0x00000002
            +#define JAWT_LOCK_BOUNDS_CHANGED        0x00000004
            +#define JAWT_LOCK_SURFACE_CHANGED       0x00000008
            +
            +/*
            + * JAWT_DrawingSurface
            + * Structure for containing the underlying drawing information of a component.
            + * All operations on a JAWT_DrawingSurface MUST be performed from the same
            + * thread as the call to GetDrawingSurface.
            + */
            +typedef struct jawt_DrawingSurface {
            +    /* Cached reference to the Java environment of the calling thread.
            +     * If Lock(), Unlock(), GetDrawingSurfaceInfo() or
            +     * FreeDrawingSurfaceInfo() are called from a different thread,
            +     * this data member should be set before calling those functions.
            +     */
            +    JNIEnv* env;
            +    /* Cached reference to the target object */
            +    jobject target;
            +    /*
            +     * Lock the surface of the target component for native rendering.
            +     * When finished drawing, the surface must be unlocked with
            +     * Unlock().  This function returns a bitmask with one or more of the
            +     * following values:
            +     *
            +     * JAWT_LOCK_ERROR - When an error has occurred and the surface could not
            +     * be locked.
            +     *
            +     * JAWT_LOCK_CLIP_CHANGED - When the clip region has changed.
            +     *
            +     * JAWT_LOCK_BOUNDS_CHANGED - When the bounds of the surface have changed.
            +     *
            +     * JAWT_LOCK_SURFACE_CHANGED - When the surface itself has changed
            +     */
            +    jint (JNICALL *Lock)
            +        (struct jawt_DrawingSurface* ds);
            +    /*
            +     * Get the drawing surface info.
            +     * The value returned may be cached, but the values may change if
            +     * additional calls to Lock() or Unlock() are made.
            +     * Lock() must be called before this can return a valid value.
            +     * Returns NULL if an error has occurred.
            +     * When finished with the returned value, FreeDrawingSurfaceInfo must be
            +     * called.
            +     */
            +    JAWT_DrawingSurfaceInfo* (JNICALL *GetDrawingSurfaceInfo)
            +        (struct jawt_DrawingSurface* ds);
            +    /*
            +     * Free the drawing surface info.
            +     */
            +    void (JNICALL *FreeDrawingSurfaceInfo)
            +        (JAWT_DrawingSurfaceInfo* dsi);
            +    /*
            +     * Unlock the drawing surface of the target component for native rendering.
            +     */
            +    void (JNICALL *Unlock)
            +        (struct jawt_DrawingSurface* ds);
            +} JAWT_DrawingSurface;
            +
            +/*
            + * JAWT
            + * Structure for containing native AWT functions.
            + */
            +typedef struct jawt {
            +    /*
            +     * Version of this structure.  This must always be set before
            +     * calling JAWT_GetAWT(). It affects the functions returned.
            +     * Must be one of the known pre-defined versions.
            +     */
            +    jint version;
            +    /*
            +     * Return a drawing surface from a target jobject.  This value
            +     * may be cached.
            +     * Returns NULL if an error has occurred.
            +     * Target must be a java.awt.Component (should be a Canvas
            +     * or Window for native rendering).
            +     * FreeDrawingSurface() must be called when finished with the
            +     * returned JAWT_DrawingSurface.
            +     */
            +    JAWT_DrawingSurface* (JNICALL *GetDrawingSurface)
            +        (JNIEnv* env, jobject target);
            +    /*
            +     * Free the drawing surface allocated in GetDrawingSurface.
            +     */
            +    void (JNICALL *FreeDrawingSurface)
            +        (JAWT_DrawingSurface* ds);
            +    /*
            +     * Since 1.4
            +     * Locks the entire AWT for synchronization purposes
            +     */
            +    void (JNICALL *Lock)(JNIEnv* env);
            +    /*
            +     * Since 1.4
            +     * Unlocks the entire AWT for synchronization purposes
            +     */
            +    void (JNICALL *Unlock)(JNIEnv* env);
            +    /*
            +     * Since 1.4
            +     * Returns a reference to a java.awt.Component from a native
            +     * platform handle.  On Windows, this corresponds to an HWND;
            +     * on Solaris and Linux, this is a Drawable.  For other platforms,
            +     * see the appropriate machine-dependent header file for a description.
            +     * The reference returned by this function is a local
            +     * reference that is only valid in this environment.
            +     * This function returns a NULL reference if no component could be
            +     * found with matching platform information.
            +     */
            +    jobject (JNICALL *GetComponent)(JNIEnv* env, void* platformInfo);
            +
            +    /**
            +     * Since 9
            +     * Creates a java.awt.Frame placed in a native container. Container is
            +     * referenced by the native platform handle. For example on Windows this
            +     * corresponds to an HWND. For other platforms, see the appropriate
            +     * machine-dependent header file for a description. The reference returned
            +     * by this function is a local reference that is only valid in this
            +     * environment. This function returns a NULL reference if no frame could be
            +     * created with matching platform information.
            +     */
            +    jobject (JNICALL *CreateEmbeddedFrame) (JNIEnv *env, void* platformInfo);
            +
            +    /**
            +     * Since 9
            +     * Moves and resizes the embedded frame. The new location of the top-left
            +     * corner is specified by x and y parameters relative to the native parent
            +     * component. The new size is specified by width and height.
            +     *
            +     * The embedded frame should be created by CreateEmbeddedFrame() method, or
            +     * this function will not have any effect.
            +     *
            +     * java.awt.Component.setLocation() and java.awt.Component.setBounds() for
            +     * EmbeddedFrame really don't move it within the native parent. These
            +     * methods always locate the embedded frame at (0, 0) for backward
            +     * compatibility. To allow moving embedded frames this method was
            +     * introduced, and it works just the same way as setLocation() and
            +     * setBounds() for usual, non-embedded components.
            +     *
            +     * Using usual get/setLocation() and get/setBounds() together with this new
            +     * method is not recommended.
            +     */
            +    void (JNICALL *SetBounds) (JNIEnv *env, jobject embeddedFrame,
            +            jint x, jint y, jint w, jint h);
            +    /**
            +     * Since 9
            +     * Synthesize a native message to activate or deactivate an EmbeddedFrame
            +     * window depending on the value of parameter doActivate, if "true"
            +     * activates the window; otherwise, deactivates the window.
            +     *
            +     * The embedded frame should be created by CreateEmbeddedFrame() method, or
            +     * this function will not have any effect.
            +     */
            +    void (JNICALL *SynthesizeWindowActivation) (JNIEnv *env,
            +            jobject embeddedFrame, jboolean doActivate);
            +} JAWT;
            +
            +/*
            + * Get the AWT native structure.  This function returns JNI_FALSE if
            + * an error occurs.
            + */
            +_JNI_IMPORT_OR_EXPORT_
            +jboolean JNICALL JAWT_GetAWT(JNIEnv* env, JAWT* awt);
            +
            +/*
            + * Specify one of these constants as the JAWT.version
            + * Specifying an earlier version will limit the available functions to
            + * those provided in that earlier version of JAWT.
            + * See the "Since" note on each API. Methods with no "Since"
            + * may be presumed to be present in JAWT_VERSION_1_3.
            + */
            +#define JAWT_VERSION_1_3 0x00010003
            +#define JAWT_VERSION_1_4 0x00010004
            +#define JAWT_VERSION_1_7 0x00010007
            +#define JAWT_VERSION_9 0x00090000
            +
            +
            +#ifdef __cplusplus
            +} /* extern "C" */
            +#endif
            +
            +#endif /* !_JAVASOFT_JAWT_H_ */
            +
            +
            +

            jawt_md.h (Linux/Solaris/X11 operating environment version)

            +
            +#ifndef _JAVASOFT_JAWT_MD_H_
            +#define _JAVASOFT_JAWT_MD_H_
            +
            +#include <X11/Xlib.h>
            +#include <X11/Xutil.h>
            +#include <X11/Intrinsic.h>
            +#include "jawt.h"
            +
            +#ifdef __cplusplus
            +extern "C" {
            +#endif
            +
            +/*
            + * X11-specific declarations for AWT native interface.
            + * See notes in jawt.h for an example of use.
            + */
            +typedef struct jawt_X11DrawingSurfaceInfo {
            +    Drawable drawable;
            +    Display* display;
            +    VisualID visualID;
            +    Colormap colormapID;
            +    int depth;
            +} JAWT_X11DrawingSurfaceInfo;
            +
            +#ifdef __cplusplus
            +}
            +#endif
            +
            +#endif /* !_JAVASOFT_JAWT_MD_H_ */
            +
            +

            jawt_md.h (Microsoft Windows version)

            +
            +#ifndef _JAVASOFT_JAWT_MD_H_
            +#define _JAVASOFT_JAWT_MD_H_
            +
            +#include <windows.h>
            +#include "jawt.h"
            +
            +#ifdef __cplusplus
            +extern "C" {
            +#endif
            +
            +/*
            + * Microsoft Windows specific declarations for AWT native interface.
            + * See notes in jawt.h for an example of use.
            + */
            +typedef struct jawt_Win32DrawingSurfaceInfo {
            +    /* Native window, DDB, or DIB handle */
            +    union {
            +        HWND hwnd;
            +        HBITMAP hbitmap;
            +        void* pbits;
            +    };
            +    /*
            +     * This HDC should always be used instead of the HDC returned from
            +     * BeginPaint() or any calls to GetDC().
            +     */
            +    HDC hdc;
            +    HPALETTE hpalette;
            +} JAWT_Win32DrawingSurfaceInfo;
            +
            +#ifdef __cplusplus
            +}
            +#endif
            +
            +#endif /* !_JAVASOFT_JAWT_MD_H_ */
            +
            +

            jawt_md.h (MacOS version)

            +
            +#ifndef _JAVASOFT_JAWT_MD_H_
            +#define _JAVASOFT_JAWT_MD_H_
            +
            +#include "jawt.h"
            +
            +#ifdef __OBJC__
            +#import 
            +#endif
            +
            +#ifdef __cplusplus
            +extern "C" {
            +#endif
            +
            +/*
            + * MacOS specific declarations for AWT native interface.
            + * See notes in jawt.h for an example of use.
            + */
            +
            +/*
            + * When calling JAWT_GetAWT with a JAWT version less than 1.7, you must pass this
            + * flag or you will not be able to get a valid drawing surface and JAWT_GetAWT will
            + * return false. This is to maintain compatibility with applications that used the
            + * interface with Java 6 which had multiple rendering models. This flag is not necessary
            + * when JAWT version 1.7 or greater is used as this is the only supported rendering mode.
            + *
            + * Example:
            + *   JAWT awt;
            + *   awt.version = JAWT_VERSION_1_4 | JAWT_MACOSX_USE_CALAYER;
            + *   jboolean success = JAWT_GetAWT(env, &awt);
            + */
            +#define JAWT_MACOSX_USE_CALAYER 0x80000000
            +
            +/*
            + * When the native Cocoa toolkit is in use, the pointer stored in
            + * JAWT_DrawingSurfaceInfo->platformInfo points to a NSObject that conforms to the
            + * JAWT_SurfaceLayers protocol. Setting the layer property of this object will cause the
            + * specified layer to be overlaid on the Components rectangle. If the window the
            + * Component belongs to has a CALayer attached to it, this layer will be accessible via
            + * the windowLayer property.
            + */
            +#ifdef __OBJC__
            +@protocol JAWT_SurfaceLayers
            +@property (readwrite, retain) CALayer *layer;
            +@property (readonly) CALayer *windowLayer;
            +@end
            +#endif
            +
            +#ifdef __cplusplus
            +}
            +#endif
            +
            +#endif /* !_JAVASOFT_JAWT_MD_H_ */
            +
            + + + diff --git a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XContentWindow.java b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XContentWindow.java index 74444b8d2d6..c430ac45aaa 100644 --- a/jdk/src/java.desktop/unix/classes/sun/awt/X11/XContentWindow.java +++ b/jdk/src/java.desktop/unix/classes/sun/awt/X11/XContentWindow.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -139,6 +139,12 @@ public final class XContentWindow extends XWindow { @Override public void handleExposeEvent(XEvent xev) { + if(parentFrame.isTargetUndecorated() && + XWM.getWMID() != XWM.UNITY_COMPIZ_WM && + width <= 0 && height <= 0) { + // WM didn't send initial ConfigureNotify, so set the bounds here + setContentBounds(parentFrame.getDimensions()); + } if (width <= 0 || height <= 0) { return; } diff --git a/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java b/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java index fc7f3d90351..bfe9a26426e 100644 --- a/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java +++ b/jdk/src/java.desktop/unix/classes/sun/java2d/opengl/GLXSurfaceData.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -112,11 +112,13 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { } public static class GLXWindowSurfaceData extends GLXSurfaceData { + protected final int scale; public GLXWindowSurfaceData(X11ComponentPeer peer, GLXGraphicsConfig gc) { super(peer, gc, peer.getColorModel(), WINDOW); + scale = gc.getScale(); } public SurfaceData getReplacement() { @@ -126,6 +128,8 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { public Rectangle getBounds() { Rectangle r = peer.getBounds(); r.x = r.y = 0; + r.width = (int) Math.ceil(r.width * scale); + r.height = (int) Math.ceil(r.height * scale); return r; } @@ -135,6 +139,16 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { public Object getDestination() { return peer.getTarget(); } + + @Override + public double getDefaultScaleX() { + return scale; + } + + @Override + public double getDefaultScaleY() { + return scale; + } } /** @@ -177,6 +191,7 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { private Image offscreenImage; private int width, height; + private final int scale; public GLXOffScreenSurfaceData(X11ComponentPeer peer, GLXGraphicsConfig gc, @@ -186,11 +201,12 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { { super(peer, gc, cm, type); - this.width = width; - this.height = height; + scale = gc.getDevice().getScaleFactor(); + this.width = width * scale; + this.height = height * scale; offscreenImage = image; - initSurface(width, height); + initSurface(this.width, this.height); } public SurfaceData getReplacement() { @@ -201,6 +217,8 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { if (type == FLIP_BACKBUFFER) { Rectangle r = peer.getBounds(); r.x = r.y = 0; + r.width = (int) Math.ceil(r.width * scale); + r.height = (int) Math.ceil(r.height * scale); return r; } else { return new Rectangle(width, height); @@ -213,5 +231,15 @@ public abstract class GLXSurfaceData extends OGLSurfaceData { public Object getDestination() { return offscreenImage; } + + @Override + public double getDefaultScaleX() { + return scale; + } + + @Override + public double getDefaultScaleY() { + return scale; + } } } diff --git a/jdk/src/java.instrument/share/classes/java/lang/instrument/Instrumentation.java b/jdk/src/java.instrument/share/classes/java/lang/instrument/Instrumentation.java index 65d1569d0a0..fb94e384116 100644 --- a/jdk/src/java.instrument/share/classes/java/lang/instrument/Instrumentation.java +++ b/jdk/src/java.instrument/share/classes/java/lang/instrument/Instrumentation.java @@ -729,7 +729,8 @@ public interface Instrumentation { * Tests whether a module can be modified with {@link #redefineModule * redefineModule}. If a module is modifiable then this method returns * {@code true}. If a module is not modifiable then this method returns - * {@code false}. + * {@code false}. This method always returns {@code true} when the module + * is an unnamed module (as redefining an unnamed module is a no-op). * * @param module the module to test if it can be modified * @return {@code true} if the module is modifiable, otherwise {@code false} diff --git a/jdk/src/java.instrument/share/classes/java/lang/instrument/package.html b/jdk/src/java.instrument/share/classes/java/lang/instrument/package.html index e7f8d8f6996..5c40a234c91 100644 --- a/jdk/src/java.instrument/share/classes/java/lang/instrument/package.html +++ b/jdk/src/java.instrument/share/classes/java/lang/instrument/package.html @@ -1,5 +1,5 @@ -