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
*/
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
* |
|---|
| As | the alpha component of the source pixel
* |
| Cs | a color component of the source pixel in premultiplied form
* |
| Ad | the 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.
*
- *
+ *
*
*
* -
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:
*
* -
- * {@code Shape} operations
+ * {@code Shape} operations
*
* -
* If the operation is a {@code draw(Shape)} operation, then
@@ -160,7 +160,7 @@ import java.util.Map;
* colors to render in device space.
*
* -
- * Text operations
+ * Text operations
*
* -
* 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.
*
* -
- * {@code Image} Operations
+ * {@code Image} Operations
*
* -
* 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:
*
- *
*
* Absolute Values |
@@ -198,7 +198,7 @@ import java.util.Arrays;
* The following figure shows a baseline layout and includes a
* component that spans rows:
*
- *
+ *
*
*
@@ -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.
*
- *
- *
+ *
+ *
*
*
* |
*
*
* |
- *
+ *
* | Figure 2: Horizontal, Left-to-Right |
* Figure 3: Horizontal, Right-to-Left |
*
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.
*
- *
- *
+ *
+ *
*
* |
*
- * 
* |
*
*
- *
+ *
* | Figure 1: Horizontal, Left-to-Right |
*
* Figure 2: 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:
- *
+ *
*
- *
*
* @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:
*
*
+ *
*
- *
+ *
* 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.
- *
+ *
*
- *
+ *
* 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:
- *
+ *
*
- *
- *
*
* 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:
- *
+ *
*
- *
*
* @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
- *
*
- * | Key |
- * Value Type |
- * Principal Constants |
- * Default Value |
+ * Key |
+ * Value Type |
+ * Principal Constants |
+ * Default Value |
*
*
* | {@link #FAMILY} |
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 ]
*
- *
+ *
*
* 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
- *
+ *
*
* - 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
- *
+ *
*
* - 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.
*
- *
*
*
- * 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;
*
*
* |
- * 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;
* -
* Since not all Java profiles include the AWT, the Jini Print Service should
* not depend on an AWT class.
- *
* -
* The implementation of class java.awt.datatransfer.MimeType does not
* guarantee
@@ -76,7 +75,6 @@ import java.util.Vector;
*
- Quoting backslash characters inside parameter values are removed.
*
- 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.
*
*
- * |
+ * |
*
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.*;
*
*
*
- * |
+ * |
*
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;
*
*
*
- * |
+ * |
*
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.
*
- *
+ *
*
- *
*
* 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 {
*
*
*
- * | Tag | View created
+ * | Tag | View created
* |
* | HTML.Tag.CONTENT | InlineView
* |
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:
*
- *
- * | 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 @@
- | | | | | | | |
| |