iterator = JLRM_ACCESS.layers(loader).iterator();
+ while (iterator.hasNext()) {
+ Layer layer = iterator.next();
+ if (layer != bootLayer) {
+ allProviders.addAll(providers(layer));
+ }
+ }
+ return allProviders.iterator();
}
-
- return Stream.concat(stream1, stream2).iterator();
}
@Override
@@ -1214,6 +1222,9 @@ public final class ServiceLoader
*
* @return An iterator that lazily loads providers for this loader's
* service
+ *
+ * @revised 9
+ * @spec JPMS
*/
public Iterator iterator() {
@@ -1279,8 +1290,10 @@ public final class ServiceLoader
* provider to be loaded.
*
* If this loader's provider caches are cleared by invoking the {@link
- * #reload() reload} method then existing streams for this service
- * loader should be discarded.
+ * #reload() reload} method then existing streams for this service loader
+ * should be discarded. The returned stream's source {@code Spliterator} is
+ * fail-fast and will throw {@link ConcurrentModificationException}
+ * if the provider cache has been cleared.
*
* The following examples demonstrate usage. The first example
* creates a stream of providers, the second example is the same except
@@ -1300,6 +1313,7 @@ public final class ServiceLoader
* @return A stream that lazily loads providers for this loader's service
*
* @since 9
+ * @spec JPMS
*/
public Stream> stream() {
// use cached providers as the source when all providers loaded
@@ -1414,6 +1428,9 @@ public final class ServiceLoader
* if the service type is not accessible to the caller or the
* caller is in an explicit module and its module descriptor does
* not declare that it uses {@code service}
+ *
+ * @revised 9
+ * @spec JPMS
*/
@CallerSensitive
public static ServiceLoader load(Class service,
@@ -1457,6 +1474,9 @@ public final class ServiceLoader
* if the service type is not accessible to the caller or the
* caller is in an explicit module and its module descriptor does
* not declare that it uses {@code service}
+ *
+ * @revised 9
+ * @spec JPMS
*/
@CallerSensitive
public static ServiceLoader load(Class service) {
@@ -1490,6 +1510,9 @@ public final class ServiceLoader
* if the service type is not accessible to the caller or the
* caller is in an explicit module and its module descriptor does
* not declare that it uses {@code service}
+ *
+ * @revised 9
+ * @spec JPMS
*/
@CallerSensitive
public static ServiceLoader loadInstalled(Class service) {
@@ -1522,6 +1545,7 @@ public final class ServiceLoader
* not declare that it uses {@code service}
*
* @since 9
+ * @spec JPMS
*/
@CallerSensitive
public static ServiceLoader load(Layer layer, Class service) {
@@ -1551,6 +1575,7 @@ public final class ServiceLoader
* or error is thrown when locating or instantiating the provider.
*
* @since 9
+ * @spec JPMS
*/
public Optional findFirst() {
Iterator iterator = iterator();
diff --git a/jdk/src/java.base/share/classes/java/util/spi/AbstractResourceBundleProvider.java b/jdk/src/java.base/share/classes/java/util/spi/AbstractResourceBundleProvider.java
index 06b6c266c89..b0cba4f4915 100644
--- a/jdk/src/java.base/share/classes/java/util/spi/AbstractResourceBundleProvider.java
+++ b/jdk/src/java.base/share/classes/java/util/spi/AbstractResourceBundleProvider.java
@@ -81,6 +81,7 @@ import static sun.security.util.SecurityConstants.GET_CLASSLOADER_PERMISSION;
* ResourceBundleProvider Service Providers
*
* @since 9
+ * @spec JPMS
*/
public abstract class AbstractResourceBundleProvider implements ResourceBundleProvider {
private static final JavaUtilResourceBundleAccess RB_ACCESS =
diff --git a/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleControlProvider.java b/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleControlProvider.java
index f74830b4d6a..871d9192ec0 100644
--- a/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleControlProvider.java
+++ b/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleControlProvider.java
@@ -44,6 +44,8 @@ import java.util.ResourceBundle;
*
* @author Masayoshi Okutsu
* @since 1.8
+ * @revised 9
+ * @spec JPMS
* @see ResourceBundle#getBundle(String, java.util.Locale, ClassLoader, ResourceBundle.Control)
* ResourceBundle.getBundle
* @see java.util.ServiceLoader#load(Class)
diff --git a/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleProvider.java b/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleProvider.java
index 0074ae32090..251831f1dcb 100644
--- a/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleProvider.java
+++ b/jdk/src/java.base/share/classes/java/util/spi/ResourceBundleProvider.java
@@ -57,6 +57,7 @@ import java.util.ResourceBundle;
* @see
* ResourceBundleProvider Service Providers
* @since 9
+ * @spec JPMS
*/
public interface ResourceBundleProvider {
/**
diff --git a/jdk/src/java.base/share/classes/jdk/internal/jmod/JmodFile.java b/jdk/src/java.base/share/classes/jdk/internal/jmod/JmodFile.java
index 34e99dfdd9b..289a80fdca6 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/jmod/JmodFile.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/jmod/JmodFile.java
@@ -186,7 +186,7 @@ public class JmodFile implements AutoCloseable {
public Entry getEntry(Section section, String name) {
String entry = section.jmodDir() + "/" + name;
ZipEntry ze = zipfile.getEntry(entry);
- return (ze != null) ? new Entry(ze) : null;
+ return (ze == null || ze.isDirectory()) ? null : new Entry(ze);
}
/**
@@ -201,7 +201,7 @@ public class JmodFile implements AutoCloseable {
{
String entry = section.jmodDir() + "/" + name;
ZipEntry e = zipfile.getEntry(entry);
- if (e == null) {
+ if (e == null || e.isDirectory()) {
throw new IOException(name + " not found: " + file);
}
return zipfile.getInputStream(e);
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 ab052ec0b30..a0886e82080 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
@@ -57,8 +57,9 @@ import java.util.jar.Attributes;
import java.util.jar.Manifest;
import java.util.stream.Stream;
-import jdk.internal.module.ModulePatcher.PatchedModuleReader;
import jdk.internal.misc.VM;
+import jdk.internal.module.ModulePatcher.PatchedModuleReader;
+import jdk.internal.module.SystemModules;
/**
@@ -135,7 +136,7 @@ public class BuiltinClassLoader
// maps package name to loaded module for modules in the boot layer
private static final Map packageToModule
- = new ConcurrentHashMap<>(1024);
+ = new ConcurrentHashMap<>(SystemModules.PACKAGES_IN_BOOT_LAYER);
// maps a module name to a module reference
private final Map nameToModule;
@@ -922,13 +923,13 @@ public class BuiltinClassLoader
* Returns the ModuleReader for the given module.
*/
private ModuleReader moduleReaderFor(ModuleReference mref) {
- return moduleToReader.computeIfAbsent(mref, m -> createModuleReader(mref));
+ return moduleToReader.computeIfAbsent(mref, BuiltinClassLoader::createModuleReader);
}
/**
* Creates a ModuleReader for the given module.
*/
- private ModuleReader createModuleReader(ModuleReference mref) {
+ private static ModuleReader createModuleReader(ModuleReference mref) {
try {
return mref.open();
} catch (IOException e) {
diff --git a/jdk/src/java.base/share/classes/jdk/internal/loader/ResourceHelper.java b/jdk/src/java.base/share/classes/jdk/internal/loader/ResourceHelper.java
index a9e0750391a..18a42b7b6f3 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/loader/ResourceHelper.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/loader/ResourceHelper.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,10 @@
*/
package jdk.internal.loader;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
import jdk.internal.module.Checks;
/**
@@ -34,7 +38,8 @@ public final class ResourceHelper {
private ResourceHelper() { }
/**
- * Returns the package name for a resource.
+ * Returns the package name for a resource or the empty package if
+ * the resource name does not contain a slash.
*/
public static String getPackageName(String name) {
int index = name.lastIndexOf('/');
@@ -46,19 +51,75 @@ public final class ResourceHelper {
}
/**
- * Returns true if the resource is a simple resource that can
- * never be encapsulated. Resources ending in "{@code .class}" or where
- * the package name is not a Java identifier are resources that can
- * never be encapsulated.
+ * Returns true if the resource is a simple resource. Simple
+ * resources can never be encapsulated. Resources ending in "{@code .class}"
+ * or where the package name is not a legal package name can not be
+ * encapsulated.
*/
public static boolean isSimpleResource(String name) {
int len = name.length();
if (len > 6 && name.endsWith(".class")) {
return true;
}
- if (!Checks.isJavaIdentifier(getPackageName(name))) {
+ if (!Checks.isPackageName(getPackageName(name))) {
return true;
}
return false;
}
+
+ /**
+ * Converts a resource name to a file path. Returns {@code null} if the
+ * resource name cannot be converted into a file path. Resource names
+ * with empty elements, or elements that are "." or ".." are rejected,
+ * as is a resource name that translates to a file path with a root
+ * component.
+ */
+ public static Path toFilePath(String name) {
+ // scan the resource name to eagerly reject obviously invalid names
+ int next;
+ int off = 0;
+ while ((next = name.indexOf('/', off)) != -1) {
+ int len = next - off;
+ if (!mayTranslate(name, off, len)) {
+ return null;
+ }
+ off = next + 1;
+ }
+ int rem = name.length() - off;
+ if (!mayTranslate(name, off, rem)) {
+ return null;
+ }
+
+ // convert to file path
+ Path path;
+ if (File.separatorChar == '/') {
+ path = Paths.get(name);
+ } else {
+ // not allowed to embed file separators
+ if (name.contains(File.separator))
+ return null;
+ path = Paths.get(name.replace('/', File.separatorChar));
+ }
+
+ // file path not allowed to have root component
+ return (path.getRoot() == null) ? path : null;
+ }
+
+ /**
+ * Returns {@code true} if the element in a resource name is a candidate
+ * to translate to the element of a file path.
+ */
+ private static boolean mayTranslate(String name, int off, int len) {
+ if (len <= 2) {
+ if (len == 0)
+ return false;
+ boolean starsWithDot = (name.charAt(off) == '.');
+ if (len == 1 && starsWithDot)
+ return false;
+ if (len == 2 && starsWithDot && (name.charAt(off+1) == '.'))
+ return false;
+ }
+ return true;
+ }
+
}
diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java
index 6838111c35d..7cb2c1e74a4 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangAccess.java
@@ -174,4 +174,9 @@ public interface JavaLangAccess {
* Invokes Long.fastUUID
*/
String fastUUID(long lsb, long msb);
+
+ /**
+ * Invalidate package access cache
+ */
+ void invalidatePackageAccessCache();
}
diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java
index eed7a2d2aff..53e8b4c82c7 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/misc/JavaLangModuleAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -59,20 +59,21 @@ public interface JavaLangModuleAccess {
*/
ModuleDescriptor.Builder newModuleBuilder(String mn,
boolean strict,
- boolean open,
- boolean synthetic);
+ Set ms);
/**
- * Returns the set of packages that are exported (unconditionally or
- * unconditionally).
+ * Returns a snapshot of the packages in the module.
*/
- Set exportedPackages(ModuleDescriptor.Builder builder);
+ Set packages(ModuleDescriptor.Builder builder);
/**
- * Returns the set of packages that are opened (unconditionally or
- * unconditionally).
+ * Adds a dependence on a module with the given (possibly un-parsable)
+ * version string.
*/
- Set openPackages(ModuleDescriptor.Builder builder);
+ void requires(ModuleDescriptor.Builder builder,
+ Set ms,
+ String mn,
+ String compiledVersion);
/**
* Returns a {@code ModuleDescriptor.Requires} of the given modifiers
@@ -113,24 +114,12 @@ public interface JavaLangModuleAccess {
*/
Provides newProvides(String service, List providers);
- /**
- * Returns a {@code ModuleDescriptor.Version} of the given version.
- */
- Version newVersion(String v);
-
- /**
- * Clones the given module descriptor with an augmented set of packages
- */
- ModuleDescriptor newModuleDescriptor(ModuleDescriptor md, Set pkgs);
-
/**
* Returns a new {@code ModuleDescriptor} instance.
*/
ModuleDescriptor newModuleDescriptor(String name,
Version version,
- boolean open,
- boolean automatic,
- boolean synthetic,
+ Set ms,
Set requires,
Set exports,
Set opens,
@@ -148,9 +137,9 @@ public interface JavaLangModuleAccess {
* and the empty configuration as the parent. The post resolution
* checks are optionally run.
*/
- Configuration resolveRequiresAndUses(ModuleFinder finder,
- Collection roots,
- boolean check,
- PrintStream traceOutput);
+ Configuration resolveAndBind(ModuleFinder finder,
+ Collection roots,
+ boolean check,
+ PrintStream traceOutput);
}
diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java b/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java
index 2ef9c11d248..9196f39ff77 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/Builder.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -38,7 +38,7 @@ import jdk.internal.misc.JavaLangModuleAccess;
import jdk.internal.misc.SharedSecrets;
/**
- * This builder is optimized for reconstituting ModuleDescriptor
+ * This builder is optimized for reconstituting the {@code ModuleDescriptor}s
* for system modules. The validation should be done at jlink time.
*
* 1. skip name validation
@@ -136,9 +136,7 @@ final class Builder {
}
final String name;
- boolean open;
- boolean automatic;
- boolean synthetic;
+ boolean open, synthetic, mandated;
Set requires;
Set exports;
Set opens;
@@ -165,13 +163,13 @@ final class Builder {
return this;
}
- Builder automatic(boolean value) {
- this.automatic = value;
+ Builder synthetic(boolean value) {
+ this.synthetic = value;
return this;
}
- Builder synthetic(boolean value) {
- this.synthetic = value;
+ Builder mandated(boolean value) {
+ this.mandated = value;
return this;
}
@@ -228,13 +226,10 @@ final class Builder {
*
* @throws IllegalArgumentException if {@code v} is null or cannot be
* parsed as a version string
- * @throws IllegalStateException if the module version is already set
*
* @see Version#parse(String)
*/
public Builder version(String v) {
- if (version != null)
- throw new IllegalStateException("module version already set");
Version ver = cachedVersion;
if (ver != null && v.equals(ver.toString())) {
version = ver;
@@ -246,63 +241,63 @@ final class Builder {
/**
* Sets the module main class.
- *
- * @throws IllegalStateException if already set
*/
public Builder mainClass(String mc) {
- if (mainClass != null)
- throw new IllegalStateException("main class already set");
mainClass = mc;
return this;
}
/**
* Sets the OS name.
- *
- * @throws IllegalStateException if already set
*/
public Builder osName(String name) {
- if (osName != null)
- throw new IllegalStateException("OS name already set");
this.osName = name;
return this;
}
/**
* Sets the OS arch.
- *
- * @throws IllegalStateException if already set
*/
public Builder osArch(String arch) {
- if (osArch != null)
- throw new IllegalStateException("OS arch already set");
this.osArch = arch;
return this;
}
/**
* Sets the OS version.
- *
- * @throws IllegalStateException if already set
*/
public Builder osVersion(String version) {
- if (osVersion != null)
- throw new IllegalStateException("OS version already set");
this.osVersion = version;
return this;
}
+ /**
+ * Returns an immutable set of the module modifiers derived from the flags.
+ */
+ private Set modifiers() {
+ int n = 0;
+ if (open) n++;
+ if (synthetic) n++;
+ if (mandated) n++;
+ if (n == 0) {
+ return Collections.emptySet();
+ } else {
+ ModuleDescriptor.Modifier[] mods = new ModuleDescriptor.Modifier[n];
+ if (open) mods[--n] = ModuleDescriptor.Modifier.OPEN;
+ if (synthetic) mods[--n] = ModuleDescriptor.Modifier.SYNTHETIC;
+ if (mandated) mods[--n] = ModuleDescriptor.Modifier.MANDATED;
+ return Set.of(mods);
+ }
+ }
+
/**
* Builds a {@code ModuleDescriptor} from the components.
*/
public ModuleDescriptor build(int hashCode) {
assert name != null;
-
return JLMA.newModuleDescriptor(name,
version,
- open,
- automatic,
- synthetic,
+ modifiers(),
requires,
exports,
opens,
diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java b/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java
index 2fdeaab6211..e19e6528ce0 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/Checks.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2009, 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,7 +26,7 @@
package jdk.internal.module;
/**
- * Utility class for checking module name and binary names.
+ * Utility class for checking module, package, and class names.
*/
public final class Checks {
@@ -58,8 +58,6 @@ public final class Checks {
throw new IllegalArgumentException(name + ": Invalid module name"
+ ": '" + id + "' is not a Java identifier");
}
- //if (!Character.isJavaIdentifierStart(last))
- // throw new IllegalArgumentException(name + ": Module name ends in digit");
return name;
}
@@ -77,8 +75,6 @@ public final class Checks {
int last = isJavaIdentifier(name, off, name.length() - off);
if (last == -1)
return false;
- //if (!Character.isJavaIdentifierStart(last))
- // return false;
return true;
}
@@ -89,40 +85,62 @@ public final class Checks {
* package name
*/
public static String requirePackageName(String name) {
- return requireBinaryName("package name", name);
+ return requireTypeName("package name", name);
}
/**
- * Checks a name to ensure that it's a legal type name.
+ * Returns {@code true} if the given name is a legal package name.
+ */
+ public static boolean isPackageName(String name) {
+ return isTypeName(name);
+ }
+
+ /**
+ * Checks a name to ensure that it's a legal qualified class name
*
* @throws IllegalArgumentException if name is null or not a legal
- * type name
+ * qualified class name
*/
public static String requireServiceTypeName(String name) {
- return requireBinaryName("service type name", name);
+ return requireQualifiedClassName("service type name", name);
}
/**
- * Checks a name to ensure that it's a legal type name.
+ * Checks a name to ensure that it's a legal qualified class name.
*
* @throws IllegalArgumentException if name is null or not a legal
- * type name
+ * qualified class name
*/
public static String requireServiceProviderName(String name) {
- return requireBinaryName("service provider name", name);
+ return requireQualifiedClassName("service provider name", name);
}
/**
- * Returns {@code true} if the given name is a legal binary name.
+ * Checks a name to ensure that it's a legal qualified class name in
+ * a named package.
+ *
+ * @throws IllegalArgumentException if name is null or not a legal
+ * qualified class name in a named package
*/
- public static boolean isJavaIdentifier(String name) {
- return isBinaryName(name);
+ public static String requireQualifiedClassName(String what, String name) {
+ requireTypeName(what, name);
+ if (name.indexOf('.') == -1)
+ throw new IllegalArgumentException(name + ": is not a qualified name of"
+ + " a Java class in a named package");
+ return name;
}
/**
- * Returns {@code true} if the given name is a legal binary name.
+ * Returns {@code true} if the given name is a legal class name.
*/
- public static boolean isBinaryName(String name) {
+ public static boolean isClassName(String name) {
+ return isTypeName(name);
+ }
+
+ /**
+ * Returns {@code true} if the given name is a legal type name.
+ */
+ private static boolean isTypeName(String name) {
int next;
int off = 0;
while ((next = name.indexOf('.', off)) != -1) {
@@ -135,12 +153,12 @@ public final class Checks {
}
/**
- * Checks if the given name is a legal binary name.
+ * Checks if the given name is a legal type name.
*
* @throws IllegalArgumentException if name is null or not a legal
- * binary name
+ * type name
*/
- public static String requireBinaryName(String what, String name) {
+ private static String requireTypeName(String what, String name) {
if (name == null)
throw new IllegalArgumentException("Null " + what);
int next;
diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java
index 69c7ee670dd..fc3c3904850 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileAttributes.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
package jdk.internal.module;
import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Builder;
import java.lang.module.ModuleDescriptor.Requires;
import java.lang.module.ModuleDescriptor.Exports;
import java.lang.module.ModuleDescriptor.Opens;
@@ -98,14 +99,17 @@ public final class ClassFileAttributes {
// module_flags
int module_flags = cr.readUnsignedShort(off);
- boolean open = ((module_flags & ACC_OPEN) != 0);
- boolean synthetic = ((module_flags & ACC_SYNTHETIC) != 0);
off += 2;
- ModuleDescriptor.Builder builder = JLMA.newModuleBuilder(mn,
- false,
- open,
- synthetic);
+ Set modifiers = new HashSet<>();
+ if ((module_flags & ACC_OPEN) != 0)
+ modifiers.add(ModuleDescriptor.Modifier.OPEN);
+ if ((module_flags & ACC_SYNTHETIC) != 0)
+ modifiers.add(ModuleDescriptor.Modifier.SYNTHETIC);
+ if ((module_flags & ACC_MANDATED) != 0)
+ modifiers.add(ModuleDescriptor.Modifier.MANDATED);
+
+ Builder builder = JLMA.newModuleBuilder(mn, false, modifiers);
// module_version
String module_version = cr.readUTF8(off, buf);
@@ -142,19 +146,13 @@ public final class ClassFileAttributes {
mods.add(Requires.Modifier.MANDATED);
}
-
// requires_version
- Version compiledVersion = null;
String requires_version = cr.readUTF8(off, buf);
off += 2;
- if (requires_version != null) {
- compiledVersion = Version.parse(requires_version);
- }
-
- if (compiledVersion == null) {
+ if (requires_version == null) {
builder.requires(mods, dn);
} else {
- builder.requires(mods, dn, compiledVersion);
+ JLMA.requires(builder, mods, dn, requires_version);
}
}
@@ -283,11 +281,14 @@ public final class ClassFileAttributes {
attr.putShort(module_name_index);
// module_flags
+ Set modifiers = descriptor.modifiers();
int module_flags = 0;
- if (descriptor.isOpen())
+ if (modifiers.contains(ModuleDescriptor.Modifier.OPEN))
module_flags |= ACC_OPEN;
- if (descriptor.isSynthetic())
+ if (modifiers.contains(ModuleDescriptor.Modifier.SYNTHETIC))
module_flags |= ACC_SYNTHETIC;
+ if (modifiers.contains(ModuleDescriptor.Modifier.MANDATED))
+ module_flags |= ACC_MANDATED;
attr.putShort(module_flags);
// module_version
diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileConstants.java b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileConstants.java
index 48fe536c7aa..66e241ee555 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileConstants.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ClassFileConstants.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -46,8 +46,8 @@ public class ClassFileConstants {
// access, requires, exports, and opens flags
public static final int ACC_MODULE = 0x8000;
public static final int ACC_OPEN = 0x0020;
- public static final int ACC_TRANSITIVE = 0x0010;
- public static final int ACC_STATIC_PHASE = 0x0020;
+ public static final int ACC_TRANSITIVE = 0x0020;
+ public static final int ACC_STATIC_PHASE = 0x0040;
public static final int ACC_SYNTHETIC = 0x1000;
public static final int ACC_MANDATED = 0x8000;
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 71406460c41..833b1cf5e24 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
@@ -26,7 +26,9 @@
package jdk.internal.module;
import java.io.File;
+import java.io.IOException;
import java.io.PrintStream;
+import java.io.UncheckedIOException;
import java.lang.module.Configuration;
import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleFinder;
@@ -35,6 +37,7 @@ import java.lang.module.ResolvedModule;
import java.lang.reflect.Layer;
import java.lang.reflect.Module;
import java.net.URI;
+import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -46,6 +49,7 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
+import java.util.stream.Stream;
import jdk.internal.loader.BootLoader;
import jdk.internal.loader.BuiltinClassLoader;
@@ -114,7 +118,12 @@ public final class ModuleBootstrap {
long t0 = System.nanoTime();
// system modules (may be patched)
- ModuleFinder systemModules = ModuleFinder.ofSystem();
+ ModuleFinder systemModules;
+ if (SystemModules.MODULE_NAMES.length > 0) {
+ systemModules = SystemModuleFinder.getInstance();
+ } else {
+ systemModules = ModuleFinder.ofSystem();
+ }
PerfCounters.systemModulesTime.addElapsedTimeFrom(t0);
@@ -275,10 +284,10 @@ public final class ModuleBootstrap {
// run the resolver to create the configuration
Configuration cf = SharedSecrets.getJavaLangModuleAccess()
- .resolveRequiresAndUses(finder,
- roots,
- needPostResolutionChecks,
- traceOutput);
+ .resolveAndBind(finder,
+ roots,
+ needPostResolutionChecks,
+ traceOutput);
// time to create configuration
PerfCounters.resolveTime.addElapsedTimeFrom(t3);
@@ -318,20 +327,20 @@ public final class ModuleBootstrap {
// if needed check that there are no split packages in the set of
// resolved modules for the boot layer
if (SystemModules.hasSplitPackages() || needPostResolutionChecks) {
- Map packageToModule = new HashMap<>();
- for (ResolvedModule resolvedModule : cf.modules()) {
- ModuleDescriptor descriptor =
- resolvedModule.reference().descriptor();
- String name = descriptor.name();
- for (String p : descriptor.packages()) {
- String other = packageToModule.putIfAbsent(p, name);
- if (other != null) {
- fail("Package " + p + " in both module "
- + name + " and module " + other);
- }
+ Map packageToModule = new HashMap<>();
+ for (ResolvedModule resolvedModule : cf.modules()) {
+ ModuleDescriptor descriptor =
+ resolvedModule.reference().descriptor();
+ String name = descriptor.name();
+ for (String p : descriptor.packages()) {
+ String other = packageToModule.putIfAbsent(p, name);
+ if (other != null) {
+ fail("Package " + p + " in both module "
+ + name + " and module " + other);
}
}
}
+ }
long t4 = System.nanoTime();
@@ -380,10 +389,9 @@ public final class ModuleBootstrap {
Set otherMods)
{
// resolve all root modules
- Configuration cf = Configuration.empty()
- .resolveRequires(finder,
- ModuleFinder.of(),
- roots);
+ Configuration cf = Configuration.empty().resolve(finder,
+ ModuleFinder.of(),
+ roots);
// module name -> reference
Map map = new HashMap<>();
@@ -416,7 +424,7 @@ public final class ModuleBootstrap {
/**
* Creates a finder from the module path that is the value of the given
- * system property.
+ * system property and optionally patched by --patch-module
*/
private static ModuleFinder createModulePathFinder(String prop) {
String s = System.getProperty(prop);
@@ -429,7 +437,7 @@ public final class ModuleBootstrap {
for (String dir: dirs) {
paths[i++] = Paths.get(dir);
}
- return ModuleFinder.of(paths);
+ return ModulePath.of(patcher, paths);
}
}
@@ -528,8 +536,48 @@ public final class ModuleBootstrap {
if (!extraOpens.isEmpty()) {
addExtraExportsOrOpens(bootLayer, extraOpens, true);
}
+
+ // DEBUG_ADD_OPENS is for debugging purposes only
+ String home = System.getProperty("java.home");
+ Path file = Paths.get(home, "conf", "DEBUG_ADD_OPENS");
+ if (Files.exists(file)) {
+ warn(file + " detected; may break encapsulation");
+ try (Stream lines = Files.lines(file)) {
+ lines.map(line -> line.trim())
+ .filter(line -> (!line.isEmpty() && !line.startsWith("#")))
+ .forEach(line -> {
+ String[] s = line.split("/");
+ if (s.length != 2) {
+ fail("Unable to parse as /: " + line);
+ } else {
+ String mn = s[0];
+ String pkg = s[1];
+ openPackage(bootLayer, mn, pkg);
+ }
+ });
+ } catch (IOException ioe) {
+ throw new UncheckedIOException(ioe);
+ }
+ }
}
+ private static void openPackage(Layer bootLayer, String mn, String pkg) {
+ if (mn.equals("ALL-RESOLVED") && pkg.equals("ALL-PACKAGES")) {
+ bootLayer.modules().stream().forEach(m ->
+ m.getDescriptor().packages().forEach(pn -> openPackage(m, pn)));
+ } else {
+ bootLayer.findModule(mn)
+ .filter(m -> m.getDescriptor().packages().contains(pkg))
+ .ifPresent(m -> openPackage(m, pkg));
+ }
+ }
+
+ private static void openPackage(Module m, String pn) {
+ Modules.addOpensToAllUnnamed(m, pn);
+ warn("Opened for deep reflection: " + m.getName() + "/" + pn);
+ }
+
+
private static void addExtraExportsOrOpens(Layer bootLayer,
Map> map,
boolean opens)
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 3aac651577c..b58c717affe 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
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -37,7 +37,6 @@ import java.lang.module.ModuleDescriptor.Builder;
import java.lang.module.ModuleDescriptor.Requires;
import java.lang.module.ModuleDescriptor.Exports;
import java.lang.module.ModuleDescriptor.Opens;
-import java.lang.module.ModuleDescriptor.Version;
import java.nio.ByteBuffer;
import java.nio.BufferUnderflowException;
import java.util.ArrayList;
@@ -51,7 +50,6 @@ import java.util.function.Supplier;
import jdk.internal.misc.JavaLangModuleAccess;
import jdk.internal.misc.SharedSecrets;
-import jdk.internal.module.ModuleResolution;
import static jdk.internal.module.ClassFileConstants.*;
@@ -221,7 +219,7 @@ public final class ModuleInfo {
Set attributes = new HashSet<>();
Builder builder = null;
- Set packages = null;
+ Set allPackages = null;
String mainClass = null;
String[] osValues = null;
ModuleHashes hashes = null;
@@ -245,7 +243,7 @@ public final class ModuleInfo {
break;
case MODULE_PACKAGES :
- packages = readModulePackagesAttribute(in, cpool);
+ allPackages = readModulePackagesAttribute(in, cpool);
break;
case MODULE_MAIN_CLASS :
@@ -284,51 +282,44 @@ public final class ModuleInfo {
throw invalidModuleDescriptor(MODULE + " attribute not found");
}
+ // ModuleMainClass and ModuleTarget attributes
+ if (mainClass != null) {
+ builder.mainClass(mainClass);
+ }
+ if (osValues != null) {
+ if (osValues[0] != null) builder.osName(osValues[0]);
+ if (osValues[1] != null) builder.osArch(osValues[1]);
+ if (osValues[2] != null) builder.osVersion(osValues[2]);
+ }
+
// If the ModulePackages attribute is not present then the packageFinder
// is used to find the set of packages
boolean usedPackageFinder = false;
- if (packages == null && packageFinder != null) {
+ if (allPackages == null && packageFinder != null) {
try {
- packages = new HashSet<>(packageFinder.get());
+ allPackages = packageFinder.get();
} catch (UncheckedIOException x) {
throw x.getCause();
}
usedPackageFinder = true;
}
- if (packages != null) {
- Set exportedPackages = JLMA.exportedPackages(builder);
- Set openPackages = JLMA.openPackages(builder);
- if (packages.containsAll(exportedPackages)
- && packages.containsAll(openPackages)) {
- packages.removeAll(exportedPackages);
- packages.removeAll(openPackages);
- } else {
- // the set of packages is not complete
- Set exportedAndOpenPackages = new HashSet<>();
- exportedAndOpenPackages.addAll(exportedPackages);
- exportedAndOpenPackages.addAll(openPackages);
- for (String pn : exportedAndOpenPackages) {
- if (!packages.contains(pn)) {
- String tail;
- if (usedPackageFinder) {
- tail = " not found by package finder";
- } else {
- tail = " missing from ModulePackages attribute";
- }
- throw invalidModuleDescriptor("Package " + pn + tail);
- }
+ if (allPackages != null) {
+ Set knownPackages = JLMA.packages(builder);
+ if (!allPackages.containsAll(knownPackages)) {
+ Set missingPackages = new HashSet<>(knownPackages);
+ missingPackages.removeAll(allPackages);
+ assert !missingPackages.isEmpty();
+ String missingPackage = missingPackages.iterator().next();
+ String tail;
+ if (usedPackageFinder) {
+ tail = " not found in module";
+ } else {
+ tail = " missing from ModulePackages class file attribute";
}
- assert false; // should not get here
- }
- builder.contains(packages);
- }
+ throw invalidModuleDescriptor("Package " + missingPackage + tail);
- if (mainClass != null)
- builder.mainClass(mainClass);
- if (osValues != null) {
- if (osValues[0] != null) builder.osName(osValues[0]);
- if (osValues[1] != null) builder.osArch(osValues[1]);
- if (osValues[2] != null) builder.osVersion(osValues[2]);
+ }
+ builder.packages(allPackages);
}
ModuleDescriptor descriptor = builder.build();
@@ -347,10 +338,17 @@ public final class ModuleInfo {
String mn = cpool.getModuleName(module_name_index);
int module_flags = in.readUnsignedShort();
- boolean open = ((module_flags & ACC_OPEN) != 0);
- boolean synthetic = ((module_flags & ACC_SYNTHETIC) != 0);
- Builder builder = JLMA.newModuleBuilder(mn, false, open, synthetic);
+ Set modifiers = new HashSet<>();
+ boolean open = ((module_flags & ACC_OPEN) != 0);
+ if (open)
+ modifiers.add(ModuleDescriptor.Modifier.OPEN);
+ if ((module_flags & ACC_SYNTHETIC) != 0)
+ modifiers.add(ModuleDescriptor.Modifier.SYNTHETIC);
+ if ((module_flags & ACC_MANDATED) != 0)
+ modifiers.add(ModuleDescriptor.Modifier.MANDATED);
+
+ Builder builder = JLMA.newModuleBuilder(mn, false, modifiers);
int module_version_index = in.readUnsignedShort();
if (module_version_index != 0) {
@@ -381,16 +379,11 @@ public final class ModuleInfo {
}
int requires_version_index = in.readUnsignedShort();
- Version compiledVersion = null;
- if (requires_version_index != 0) {
- String vs = cpool.getUtf8(requires_version_index);
- compiledVersion = Version.parse(vs);
- }
-
- if (compiledVersion == null) {
+ if (requires_version_index == 0) {
builder.requires(mods, dn);
} else {
- builder.requires(mods, dn, compiledVersion);
+ String vs = cpool.getUtf8(requires_version_index);
+ JLMA.requires(builder, mods, dn, vs);
}
if (dn.equals("java.base"))
@@ -629,10 +622,7 @@ public final class ModuleInfo {
/**
* Return true if the given attribute name is the name of a pre-defined
- * attribute that is not allowed in the class file.
- *
- * Except for Module, InnerClasses, SourceFile, SourceDebugExtension, and
- * Deprecated, none of the pre-defined attributes in JVMS 4.7 may appear.
+ * attribute in JVMS 4.7 that is not allowed in a module-info class.
*/
private static boolean isAttributeDisallowed(String name) {
Set notAllowed = predefinedNotAllowed;
@@ -640,6 +630,7 @@ public final class ModuleInfo {
notAllowed = Set.of(
"ConstantValue",
"Code",
+ "Deprecated",
"StackMapTable",
"Exceptions",
"EnclosingMethod",
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 0d05ad296e9..73fb660ed7f 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
@@ -56,7 +56,7 @@ public final class ModuleInfoExtender {
// the packages in the ModulePackages attribute
private Set packages;
- // the value of the module_version in Module attribute
+ // the value for the module version in the Module attribute
private Version version;
// the value of the ModuleMainClass attribute
@@ -78,7 +78,11 @@ public final class ModuleInfoExtender {
}
/**
- * Sets the set of packages for the ModulePackages attribute
+ * Sets the packages for the ModulePackages attribute
+ *
+ * @apiNote This method does not check that the package names are legal
+ * package names or that the set of packages is a super set of the
+ * packages in the module.
*/
public ModuleInfoExtender packages(Set packages) {
this.packages = Collections.unmodifiableSet(packages);
@@ -86,7 +90,7 @@ public final class ModuleInfoExtender {
}
/**
- * Sets the value of the module_version in Module attribute.
+ * Sets the value for the module version in the Module attribute
*/
public ModuleInfoExtender version(Version version) {
this.version = version;
@@ -95,6 +99,9 @@ public final class ModuleInfoExtender {
/**
* Sets the value of the ModuleMainClass attribute.
+ *
+ * @apiNote This method does not check that the main class is a legal
+ * class name in a named package.
*/
public ModuleInfoExtender mainClass(String mainClass) {
this.mainClass = mainClass;
@@ -133,7 +140,7 @@ public final class ModuleInfoExtender {
/**
* A ClassVisitor that supports adding class file attributes. If an
- * attribute already exists then the first occurence of the attribute
+ * attribute already exists then the first occurrence of the attribute
* is replaced.
*/
private static class AttributeAddingClassVisitor extends ClassVisitor {
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 9c3308f97a0..15e60d0d611 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
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -41,13 +41,6 @@ import jdk.internal.loader.ClassLoaders;
* are generated at build time.
*/
final class ModuleLoaderMap {
- /*
- * The list of boot modules and platform modules are generated at build time.
- */
- private static final String[] BOOT_MODULES
- = new String[] { "@@BOOT_MODULE_NAMES@@" };
- private static final String[] PLATFORM_MODULES
- = new String[] { "@@PLATFORM_MODULE_NAMES@@" };
/**
* Returns the function to map modules in the given configuration to the
@@ -55,6 +48,10 @@ final class ModuleLoaderMap {
*/
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);
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 5bd7ef5ed04..fe3f8930ad2 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
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,6 +31,7 @@ import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Builder;
import java.lang.module.ModuleReader;
import java.lang.module.ModuleReference;
import java.net.MalformedURLException;
@@ -54,6 +55,7 @@ import java.util.stream.Collectors;
import java.util.stream.Stream;
import jdk.internal.loader.Resource;
+import jdk.internal.loader.ResourceHelper;
import jdk.internal.misc.JavaLangModuleAccess;
import jdk.internal.misc.SharedSecrets;
import sun.net.www.ParseUtil;
@@ -108,8 +110,11 @@ public final class ModulePatcher {
if (paths == null)
return mref;
- // scan the JAR file or directory tree to get the set of packages
+ // Scan the JAR file or directory tree to get the set of packages.
+ // For automatic modules then packages that do not contain class files
+ // must be ignored.
Set packages = new HashSet<>();
+ boolean isAutomatic = descriptor.isAutomatic();
try {
for (Path file : paths) {
if (Files.isRegularFile(file)) {
@@ -118,8 +123,10 @@ public final class ModulePatcher {
// is not supported by the boot class loader
try (JarFile jf = new JarFile(file.toFile())) {
jf.stream()
+ .filter(e -> !e.isDirectory()
+ && (!isAutomatic || e.getName().endsWith(".class")))
.map(e -> toPackageName(file, e))
- .filter(Checks::isJavaIdentifier)
+ .filter(Checks::isPackageName)
.forEach(packages::add);
}
@@ -129,8 +136,10 @@ public final class ModulePatcher {
Path top = file;
Files.find(top, Integer.MAX_VALUE,
((path, attrs) -> attrs.isRegularFile()))
+ .filter(path -> !isAutomatic
+ || path.toString().endsWith(".class"))
.map(path -> toPackageName(top, path))
- .filter(Checks::isJavaIdentifier)
+ .filter(Checks::isPackageName)
.forEach(packages::add);
}
@@ -141,10 +150,30 @@ public final class ModulePatcher {
}
// if there are new packages then we need a new ModuleDescriptor
- Set original = descriptor.packages();
- packages.addAll(original);
- if (packages.size() > original.size()) {
- descriptor = JLMA.newModuleDescriptor(descriptor, packages);
+ packages.removeAll(descriptor.packages());
+ if (!packages.isEmpty()) {
+ Builder builder = JLMA.newModuleBuilder(descriptor.name(),
+ /*strict*/ false,
+ descriptor.modifiers());
+ if (!descriptor.isAutomatic()) {
+ descriptor.requires().forEach(builder::requires);
+ descriptor.exports().forEach(builder::exports);
+ descriptor.opens().forEach(builder::opens);
+ descriptor.uses().forEach(builder::uses);
+ }
+ descriptor.provides().forEach(builder::provides);
+
+ descriptor.version().ifPresent(builder::version);
+ descriptor.mainClass().ifPresent(builder::mainClass);
+ descriptor.osName().ifPresent(builder::osName);
+ descriptor.osArch().ifPresent(builder::osArch);
+ descriptor.osVersion().ifPresent(builder::osVersion);
+
+ // original + new packages
+ builder.packages(descriptor.packages());
+ builder.packages(packages);
+
+ descriptor = builder.build();
}
// return a module reference to the patched module
@@ -471,23 +500,14 @@ public final class ModulePatcher {
@Override
public Resource find(String name) throws IOException {
- Path file = Paths.get(name.replace('/', File.separatorChar));
- if (file.getRoot() == null) {
- file = dir.resolve(file);
- } else {
- // drop the root component so that the resource is
- // located relative to the module directory
- int n = file.getNameCount();
- if (n == 0)
- return null;
- file = dir.resolve(file.subpath(0, n));
- }
-
- if (Files.isRegularFile(file)) {
- return newResource(name, dir, file);
- } else {
- return null;
+ Path path = ResourceHelper.toFilePath(name);
+ if (path != null) {
+ Path file = dir.resolve(path);
+ if (Files.isRegularFile(file)) {
+ return newResource(name, dir, file);
+ }
}
+ return null;
}
private Resource newResource(String name, Path top, Path file) {
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 fb7871d3c31..ae337423965 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
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -35,7 +35,6 @@ import java.io.UncheckedIOException;
import java.lang.module.FindException;
import java.lang.module.InvalidModuleDescriptorException;
import java.lang.module.ModuleDescriptor;
-import java.lang.module.ModuleDescriptor.Requires;
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReference;
import java.net.URI;
@@ -70,12 +69,11 @@ import jdk.internal.util.jar.VersionedStream;
/**
* A {@code ModuleFinder} that locates modules on the file system by searching
- * a sequence of directories or packaged modules.
- *
- * The {@code ModuleFinder} can be created to work in either the run-time
- * or link-time phases. In both cases it locates modular JAR and exploded
- * modules. When created for link-time then it additionally locates
- * modules in JMOD files.
+ * a sequence of directories or packaged modules. The ModuleFinder can be
+ * created to work in either the run-time or link-time phases. In both cases it
+ * locates modular JAR and exploded modules. When created for link-time then it
+ * additionally locates modules in JMOD files. The ModuleFinder can also
+ * optionally patch any modules that it locates with a ModulePatcher.
*/
public class ModulePath implements ModuleFinder {
@@ -87,6 +85,9 @@ public class ModulePath implements ModuleFinder {
// true for the link phase (supports modules packaged in JMOD format)
private final boolean isLinkPhase;
+ // for patching modules, can be null
+ private final ModulePatcher patcher;
+
// the entries on this module path
private final Path[] entries;
private int next;
@@ -94,19 +95,51 @@ public class ModulePath implements ModuleFinder {
// map of module name to module reference map for modules already located
private final Map cachedModules = new HashMap<>();
- public ModulePath(Runtime.Version version, boolean isLinkPhase, Path... entries) {
+
+ private ModulePath(Runtime.Version version,
+ boolean isLinkPhase,
+ ModulePatcher patcher,
+ Path... entries) {
this.releaseVersion = version;
this.isLinkPhase = isLinkPhase;
+ this.patcher = patcher;
this.entries = entries.clone();
for (Path entry : this.entries) {
Objects.requireNonNull(entry);
}
}
- public ModulePath(Path... entries) {
- this(JarFile.runtimeVersion(), false, entries);
+ /**
+ * Returns a ModuleFinder that that locates modules on the file system by
+ * searching a sequence of directories and/or packaged modules. The modules
+ * may be patched by the given ModulePatcher.
+ */
+ public static ModuleFinder of(ModulePatcher patcher, Path... entries) {
+ return new ModulePath(JarFile.runtimeVersion(), false, patcher, entries);
}
+ /**
+ * Returns a ModuleFinder that that locates modules on the file system by
+ * searching a sequence of directories and/or packaged modules.
+ */
+ public static ModuleFinder of(Path... entries) {
+ return of((ModulePatcher)null, entries);
+ }
+
+ /**
+ * Returns a ModuleFinder that that locates modules on the file system by
+ * searching a sequence of directories and/or packaged modules.
+ *
+ * @param version The release version to use for multi-release JAR files
+ * @param isLinkPhase {@code true} if the link phase to locate JMOD files
+ */
+ public static ModuleFinder of(Runtime.Version version,
+ boolean isLinkPhase,
+ Path... entries) {
+ return new ModulePath(version, isLinkPhase, null, entries);
+ }
+
+
@Override
public Optional find(String name) {
Objects.requireNonNull(name);
@@ -195,8 +228,7 @@ public class ModulePath implements ModuleFinder {
if (attrs.isDirectory()) {
Path mi = entry.resolve(MODULE_INFO);
if (!Files.exists(mi)) {
- // does not exist or unable to determine so assume a
- // directory of modules
+ // assume a directory of modules
return scanDirectory(entry);
}
}
@@ -206,11 +238,17 @@ public class ModulePath implements ModuleFinder {
if (mref != null) {
String name = mref.descriptor().name();
return Collections.singletonMap(name, mref);
- } else {
- // skipped
- return Collections.emptyMap();
}
+ // not recognized
+ String msg;
+ if (!isLinkPhase && entry.toString().endsWith(".jmod")) {
+ msg = "JMOD format not supported at execution time";
+ } else {
+ msg = "Module format not recognized";
+ }
+ throw new FindException(msg + ": " + entry);
+
} catch (IOException ioe) {
throw new FindException(ioe);
}
@@ -266,14 +304,11 @@ public class ModulePath implements ModuleFinder {
/**
- * Locates a packaged or exploded module, returning a {@code ModuleReference}
- * to the module. Returns {@code null} if the entry is skipped because it is
- * to a directory that does not contain a module-info.class or it's a hidden
- * file.
+ * Reads a packaged or exploded module, returning a {@code ModuleReference}
+ * to the module. Returns {@code null} if the entry is not recognized.
*
* @throws IOException if an I/O error occurs
- * @throws FindException if the file is not recognized as a module or an
- * error occurs parsing its module descriptor
+ * @throws FindException if an error occurs parsing its module descriptor
*/
private ModuleReference readModule(Path entry, BasicFileAttributes attrs)
throws IOException
@@ -282,24 +317,16 @@ public class ModulePath implements ModuleFinder {
if (attrs.isDirectory()) {
return readExplodedModule(entry); // may return null
- }
-
- String fn = entry.getFileName().toString();
- if (attrs.isRegularFile()) {
- if (fn.endsWith(".jar")) {
- return readJar(entry);
- } else if (fn.endsWith(".jmod")) {
- if (isLinkPhase)
- return readJMod(entry);
- throw new FindException("JMOD files not supported: " + entry);
- }
- }
-
- // skip hidden files
- if (fn.startsWith(".") || Files.isHidden(entry)) {
- return null;
} else {
- throw new FindException("Unrecognized module: " + entry);
+ String fn = entry.getFileName().toString();
+ if (attrs.isRegularFile()) {
+ if (fn.endsWith(".jar")) {
+ return readJar(entry);
+ } else if (isLinkPhase && fn.endsWith(".jmod")) {
+ return readJMod(entry);
+ }
+ }
+ return null;
}
} catch (InvalidModuleDescriptorException e) {
@@ -327,7 +354,7 @@ public class ModulePath implements ModuleFinder {
}
}
- // -- jmod files --
+ // -- JMOD files --
private Set jmodPackages(JmodFile jf) {
return jf.stream()
@@ -339,7 +366,7 @@ public class ModulePath implements ModuleFinder {
}
/**
- * Returns a {@code ModuleReference} to a module in jmod file on the
+ * Returns a {@code ModuleReference} to a module in JMOD file on the
* file system.
*
* @throws IOException
@@ -362,7 +389,7 @@ public class ModulePath implements ModuleFinder {
/**
* Returns the service type corresponding to the name of a services
- * configuration file if it is a valid Java identifier.
+ * configuration file if it is a legal type name.
*
* For example, if called with "META-INF/services/p.S" then this method
* returns a container with the value "p.S".
@@ -374,7 +401,7 @@ public class ModulePath implements ModuleFinder {
String prefix = cf.substring(0, index);
if (prefix.equals(SERVICES_PREFIX)) {
String sn = cf.substring(index);
- if (Checks.isJavaIdentifier(sn))
+ if (Checks.isClassName(sn))
return Optional.of(sn);
}
}
@@ -403,11 +430,10 @@ public class ModulePath implements ModuleFinder {
*
* 1. The module name (and optionally the version) is derived from the file
* name of the JAR file
- * 2. All packages are exported and open
- * 3. It has no non-exported/non-open packages
- * 4. The contents of any META-INF/services configuration files are mapped
+ * 2. All packages are derived from the .class files in the JAR file
+ * 3. The contents of any META-INF/services configuration files are mapped
* to "provides" declarations
- * 5. The Main-Class attribute in the main attributes of the JAR manifest
+ * 4. The Main-Class attribute in the main attributes of the JAR manifest
* is mapped to the module descriptor mainClass
*/
private ModuleDescriptor deriveModuleDescriptor(JarFile jf)
@@ -443,9 +469,7 @@ public class ModulePath implements ModuleFinder {
mn = cleanModuleName(mn);
// Builder throws IAE if module name is empty or invalid
- ModuleDescriptor.Builder builder
- = ModuleDescriptor.automaticModule(mn)
- .requires(Set.of(Requires.Modifier.MANDATED), "java.base");
+ ModuleDescriptor.Builder builder = ModuleDescriptor.newAutomaticModule(mn);
if (vs != null)
builder.version(vs);
@@ -453,17 +477,22 @@ public class ModulePath implements ModuleFinder {
Map> map = VersionedStream.stream(jf)
.filter(e -> !e.isDirectory())
.map(JarEntry::getName)
+ .filter(e -> (e.endsWith(".class") ^ e.startsWith(SERVICES_PREFIX)))
.collect(Collectors.partitioningBy(e -> e.startsWith(SERVICES_PREFIX),
Collectors.toSet()));
- Set resources = map.get(Boolean.FALSE);
+ Set classFiles = map.get(Boolean.FALSE);
Set configFiles = map.get(Boolean.TRUE);
- // all packages are exported and open
- resources.stream()
+
+ // the packages containing class files
+ Set packages = classFiles.stream()
.map(this::toPackageName)
.flatMap(Optional::stream)
.distinct()
- .forEach(pn -> builder.exports(pn).opens(pn));
+ .collect(Collectors.toSet());
+
+ // all packages are exported and open
+ builder.packages(packages);
// map names of service configuration files to service names
Set serviceNames = configFiles.stream()
@@ -481,6 +510,11 @@ public class ModulePath implements ModuleFinder {
String cn;
while ((cn = nextLine(reader)) != null) {
if (cn.length() > 0) {
+ String pn = packageName(cn);
+ if (!packages.contains(pn)) {
+ String msg = "Provider class " + cn + " not in module";
+ throw new IOException(msg);
+ }
providerClasses.add(cn);
}
}
@@ -494,8 +528,15 @@ public class ModulePath implements ModuleFinder {
if (man != null) {
Attributes attrs = man.getMainAttributes();
String mainClass = attrs.getValue(Attributes.Name.MAIN_CLASS);
- if (mainClass != null)
- builder.mainClass(mainClass.replace("/", "."));
+ if (mainClass != null) {
+ mainClass = mainClass.replace("/", ".");
+ String pn = packageName(mainClass);
+ if (!packages.contains(pn)) {
+ String msg = "Main-Class " + mainClass + " not in module";
+ throw new IOException(msg);
+ }
+ builder.mainClass(mainClass);
+ }
}
return builder.build();
@@ -569,10 +610,10 @@ public class ModulePath implements ModuleFinder {
try {
ModuleDescriptor md = deriveModuleDescriptor(jf);
attrs = new ModuleInfo.Attributes(md, null, null);
- } catch (IllegalArgumentException iae) {
+ } catch (IllegalArgumentException e) {
throw new FindException(
"Unable to derive module descriptor for: "
- + jf.getName(), iae);
+ + jf.getName(), e);
}
} else {
@@ -580,7 +621,7 @@ public class ModulePath implements ModuleFinder {
() -> jarPackages(jf));
}
- return ModuleReferences.newJarModule(attrs, file);
+ return ModuleReferences.newJarModule(attrs, patcher, file);
}
}
@@ -617,7 +658,15 @@ public class ModulePath implements ModuleFinder {
// for now
return null;
}
- return ModuleReferences.newExplodedModule(attrs, dir);
+ return ModuleReferences.newExplodedModule(attrs, patcher, dir);
+ }
+
+ /**
+ * Maps a type name to its package name.
+ */
+ private static String packageName(String cn) {
+ int index = cn.lastIndexOf('.');
+ return (index == -1) ? "" : cn.substring(0, index);
}
/**
@@ -629,19 +678,18 @@ public class ModulePath implements ModuleFinder {
*/
private Optional toPackageName(String name) {
assert !name.endsWith("/");
-
int index = name.lastIndexOf("/");
if (index == -1) {
if (name.endsWith(".class") && !name.equals(MODULE_INFO)) {
throw new IllegalArgumentException(name
- + " found in top-level directory:"
+ + " found in top-level directory"
+ " (unnamed package not allowed in module)");
}
return Optional.empty();
}
String pn = name.substring(0, index).replace('/', '.');
- if (Checks.isJavaIdentifier(pn)) {
+ if (Checks.isPackageName(pn)) {
return Optional.of(pn);
} else {
// not a valid package name
@@ -654,7 +702,7 @@ public class ModulePath implements ModuleFinder {
* name.
*
* @throws IllegalArgumentException if the name is a class file in
- * the top-level directory (and it's not module-info.class)
+ * the top-level directory (and it's not module-info.class)
*/
private Optional toPackageName(Path file) {
assert file.getRoot() == null;
@@ -664,14 +712,14 @@ public class ModulePath implements ModuleFinder {
String name = file.toString();
if (name.endsWith(".class") && !name.equals(MODULE_INFO)) {
throw new IllegalArgumentException(name
- + " found in in top-level directory"
+ + " found in top-level directory"
+ " (unnamed package not allowed in module)");
}
return Optional.empty();
}
String pn = parent.toString().replace(File.separatorChar, '.');
- if (Checks.isJavaIdentifier(pn)) {
+ if (Checks.isPackageName(pn)) {
return Optional.of(pn);
} else {
// not a valid package name
diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferenceImpl.java b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferenceImpl.java
index 2ab42bdb4a2..f861b294aef 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferenceImpl.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/ModuleReferenceImpl.java
@@ -163,7 +163,14 @@ public class ModuleReferenceImpl extends ModuleReference {
@Override
public String toString() {
- return super.toString();
+ StringBuilder sb = new StringBuilder();
+ sb.append("[module ");
+ sb.append(descriptor().name());
+ sb.append(", location=");
+ sb.append(location().orElseThrow(() -> new InternalError()));
+ if (isPatched()) sb.append(" (patched)");
+ sb.append("]");
+ return sb.toString();
}
}
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 a2aff8f76be..2e2af727599 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
@@ -36,7 +36,6 @@ import java.net.URI;
import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Path;
-import java.nio.file.Paths;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
@@ -51,7 +50,7 @@ import java.util.stream.Stream;
import java.util.zip.ZipFile;
import jdk.internal.jmod.JmodFile;
-import jdk.internal.misc.JavaLangAccess;
+import jdk.internal.loader.ResourceHelper;
import jdk.internal.misc.SharedSecrets;
import jdk.internal.module.ModuleHashes.HashSupplier;
import jdk.internal.util.jar.VersionedStream;
@@ -65,20 +64,16 @@ import sun.net.www.ParseUtil;
*/
class ModuleReferences {
-
- private static final JavaLangAccess JLA = SharedSecrets.getJavaLangAccess();
-
private ModuleReferences() { }
/**
- * Creates a ModuleReference to a module or to patched module when
- * creating modules for the boot Layer and --patch-module is specified.
+ * Creates a ModuleReference to a possibly-patched module
*/
private static ModuleReference newModule(ModuleInfo.Attributes attrs,
URI uri,
Supplier supplier,
+ ModulePatcher patcher,
HashSupplier hasher) {
-
ModuleReference mref = new ModuleReferenceImpl(attrs.descriptor(),
uri,
supplier,
@@ -86,38 +81,42 @@ class ModuleReferences {
attrs.recordedHashes(),
hasher,
attrs.moduleResolution());
- if (JLA.getBootLayer() == null)
- mref = ModuleBootstrap.patcher().patchIfNeeded(mref);
+ if (patcher != null)
+ mref = patcher.patchIfNeeded(mref);
return mref;
}
/**
- * Creates a ModuleReference to a module packaged as a modular JAR.
+ * Creates a ModuleReference to a possibly-patched module in a modular JAR.
*/
- static ModuleReference newJarModule(ModuleInfo.Attributes attrs, Path file) {
+ static ModuleReference newJarModule(ModuleInfo.Attributes attrs,
+ ModulePatcher patcher,
+ Path file) {
URI uri = file.toUri();
Supplier supplier = () -> new JarModuleReader(file, uri);
HashSupplier hasher = (a) -> ModuleHashes.computeHash(file, a);
- return newModule(attrs, uri, supplier, hasher);
+ return newModule(attrs, uri, supplier, patcher, hasher);
}
/**
- * Creates a ModuleReference to a module packaged as a JMOD.
+ * Creates a ModuleReference to a module in a JMOD file.
*/
static ModuleReference newJModModule(ModuleInfo.Attributes attrs, Path file) {
URI uri = file.toUri();
Supplier supplier = () -> new JModModuleReader(file, uri);
HashSupplier hasher = (a) -> ModuleHashes.computeHash(file, a);
- return newModule(attrs, uri, supplier, hasher);
+ return newModule(attrs, uri, supplier, null, hasher);
}
/**
- * Creates a ModuleReference to an exploded module.
+ * Creates a ModuleReference to a possibly-patched exploded module.
*/
- static ModuleReference newExplodedModule(ModuleInfo.Attributes attrs, Path dir) {
+ static ModuleReference newExplodedModule(ModuleInfo.Attributes attrs,
+ ModulePatcher patcher,
+ Path dir) {
Supplier supplier = () -> new ExplodedModuleReader(dir);
- return newModule(attrs, dir.toUri(), supplier, null);
+ return newModule(attrs, dir.toUri(), supplier, patcher, null);
}
@@ -243,7 +242,8 @@ class ModuleReferences {
}
private JarEntry getEntry(String name) {
- return jf.getJarEntry(Objects.requireNonNull(name));
+ JarEntry entry = jf.getJarEntry(Objects.requireNonNull(name));
+ return (entry == null || entry.isDirectory()) ? null : entry;
}
@Override
@@ -369,21 +369,6 @@ class ModuleReferences {
}
}
- /**
- * Returns a Path to access to the given resource.
- */
- private Path toPath(String name) {
- Path path = Paths.get(name.replace('/', File.separatorChar));
- if (path.getRoot() == null) {
- return dir.resolve(path);
- } else {
- // drop the root component so that the resource is
- // located relative to the module directory
- int n = path.getNameCount();
- return (n > 0) ? dir.resolve(path.subpath(0, n)) : null;
- }
- }
-
/**
* Throws IOException if the module reader is closed;
*/
@@ -391,11 +376,27 @@ class ModuleReferences {
if (closed) throw new IOException("ModuleReader is closed");
}
+ /**
+ * Returns a Path to access the given resource. Returns null if the
+ * resource name does not convert to a file path that locates a regular
+ * file in the module.
+ */
+ private Path toFilePath(String name) {
+ Path path = ResourceHelper.toFilePath(name);
+ if (path != null) {
+ Path file = dir.resolve(path);
+ if (Files.isRegularFile(file)) {
+ return file;
+ }
+ }
+ return null;
+ }
+
@Override
public Optional find(String name) throws IOException {
ensureOpen();
- Path path = toPath(name);
- if (path != null && Files.isRegularFile(path)) {
+ Path path = toFilePath(name);
+ if (path != null) {
try {
return Optional.of(path.toUri());
} catch (IOError e) {
@@ -409,8 +410,8 @@ class ModuleReferences {
@Override
public Optional open(String name) throws IOException {
ensureOpen();
- Path path = toPath(name);
- if (path != null && Files.isRegularFile(path)) {
+ Path path = toFilePath(name);
+ if (path != null) {
return Optional.of(Files.newInputStream(path));
} else {
return Optional.empty();
@@ -420,8 +421,8 @@ class ModuleReferences {
@Override
public Optional read(String name) throws IOException {
ensureOpen();
- Path path = toPath(name);
- if (path != null && Files.isRegularFile(path)) {
+ Path path = toFilePath(name);
+ if (path != null) {
return Optional.of(ByteBuffer.wrap(Files.readAllBytes(path)));
} else {
return Optional.empty();
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 9f68cfbc421..485d2e130b5 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
@@ -82,8 +82,8 @@ public class Modules {
String name,
Set packages)
{
- ModuleDescriptor descriptor = ModuleDescriptor.module(name)
- .contains(packages)
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule(name)
+ .packages(packages)
.build();
return JLRMA.defineModule(loader, descriptor, null);
@@ -185,7 +185,8 @@ public class Modules {
/**
* Adds a package to a module's content.
*
- * This method is a no-op if the module already contains the package.
+ * This method is a no-op if the module already contains the package or the
+ * module is an unnamed module.
*/
public static void addPackage(Module m, String pn) {
JLRMA.addPackage(m, pn);
diff --git a/jdk/src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java
index 5ec0a62ca69..a7ee7ffe74f 100644
--- a/jdk/src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java
+++ b/jdk/src/java.base/share/classes/jdk/internal/module/SystemModuleFinder.java
@@ -80,8 +80,6 @@ public class SystemModuleFinder implements ModuleFinder {
= PerfCounter.newPerfCounter("jdk.module.finder.jimage.packages");
private static final PerfCounter exportsCount
= PerfCounter.newPerfCounter("jdk.module.finder.jimage.exports");
- // ImageReader used to access all modules in the image
- private static final ImageReader imageReader;
// singleton finder to find modules in the run-time images
private static final SystemModuleFinder INSTANCE;
@@ -96,13 +94,28 @@ public class SystemModuleFinder implements ModuleFinder {
*/
static {
long t0 = System.nanoTime();
- imageReader = ImageReaderFactory.getImageReader();
INSTANCE = new SystemModuleFinder();
initTime.addElapsedTimeFrom(t0);
}
+ /**
+ * Holder class for the ImageReader
+ */
+ private static class SystemImage {
+ static final ImageReader READER;
+ static {
+ long t0 = System.nanoTime();
+ READER = ImageReaderFactory.getImageReader();
+ initTime.addElapsedTimeFrom(t0);
+ }
+
+ static ImageReader reader() {
+ return READER;
+ }
+ }
+
private static boolean isFastPathSupported() {
return SystemModules.MODULE_NAMES.length > 0;
}
@@ -114,7 +127,7 @@ public class SystemModuleFinder implements ModuleFinder {
// this happens when java.base is patched with java.base
// from an exploded image
- return imageReader.getModuleNames();
+ return SystemImage.reader().getModuleNames();
}
// the set of modules in the run-time image
@@ -151,6 +164,7 @@ public class SystemModuleFinder implements ModuleFinder {
descriptors = new ModuleDescriptor[n];
recordedHashes = new ModuleHashes[n];
moduleResolutions = new ModuleResolution[n];
+ ImageReader imageReader = SystemImage.reader();
for (int i = 0; i < names.length; i++) {
String mn = names[i];
ImageLocation loc = imageReader.findLocation(mn, "module-info.class");
@@ -291,6 +305,7 @@ public class SystemModuleFinder implements ModuleFinder {
Objects.requireNonNull(name);
if (closed)
throw new IOException("ModuleReader is closed");
+ ImageReader imageReader = SystemImage.reader();
if (imageReader != null) {
return imageReader.findLocation(module, name);
} else {
@@ -330,7 +345,7 @@ public class SystemModuleFinder implements ModuleFinder {
public Optional read(String name) throws IOException {
ImageLocation location = findImageLocation(name);
if (location != null) {
- return Optional.of(imageReader.getResourceBuffer(location));
+ return Optional.of(SystemImage.reader().getResourceBuffer(location));
} else {
return Optional.empty();
}
@@ -372,7 +387,7 @@ public class SystemModuleFinder implements ModuleFinder {
stack = new ArrayDeque<>();
// push the root node to the stack to get started
- ImageReader.Node dir = imageReader.findNode(moduleRoot);
+ ImageReader.Node dir = SystemImage.reader().findNode(moduleRoot);
if (dir == null || !dir.isDirectory())
throw new IOException(moduleRoot + " not a directory");
stack.push(dir);
@@ -390,7 +405,7 @@ public class SystemModuleFinder implements ModuleFinder {
String name = node.getName();
if (node.isDirectory()) {
// build node
- ImageReader.Node dir = imageReader.findNode(name);
+ ImageReader.Node dir = SystemImage.reader().findNode(name);
assert dir.isDirectory();
stack.push(dir);
} else {
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 9a410049188..61969590d92 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
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2001, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2001, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -211,15 +211,7 @@ public class Reflection {
if (currentModule == memberModule)
return true; // same module (named or unnamed)
- // memberClass may be primitive or array class
- Class> c = memberClass;
- while (c.isArray()) {
- c = c.getComponentType();
- }
- if (c.isPrimitive())
- return true;
-
- String pkg = c.getPackageName();
+ String pkg = memberClass.getPackageName();
boolean allowed = memberModule.isExported(pkg, currentModule);
if (allowed && memberModule.isNamed() && printStackTraceWhenAccessSucceeds()) {
if (!SharedSecrets.getJavaLangReflectModuleAccess()
@@ -237,10 +229,6 @@ public class Reflection {
private static boolean isSameClassPackage(Class> c1, Class> c2) {
if (c1.getClassLoader() != c2.getClassLoader())
return false;
- while (c1.isArray())
- c1 = c1.getComponentType();
- while (c2.isArray())
- c2 = c2.getComponentType();
return Objects.equals(c1.getPackageName(), c2.getPackageName());
}
@@ -378,12 +366,6 @@ public class Reflection {
}
}
- public static void enableStackTraces() {
- printStackWhenAccessFails = true;
- printStackWhenAccessSucceeds = true;
- printStackPropertiesSet = true;
- }
-
public static boolean printStackTraceWhenAccessFails() {
ensurePrintStackPropertiesSet();
return printStackWhenAccessFails;
@@ -413,11 +395,7 @@ public class Reflection {
if (m2.isNamed())
memberSuffix = " (in " + m2 + ")";
- Class> c = memberClass;
- while (c.isArray()) {
- c = c.getComponentType();
- }
- String memberPackageName = c.getPackageName();
+ String memberPackageName = memberClass.getPackageName();
String msg = currentClass + currentSuffix + " cannot access ";
if (m2.isExported(memberPackageName, m1)) {
diff --git a/jdk/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java b/jdk/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java
index 9c46aad018f..c3633ff8aab 100644
--- a/jdk/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java
+++ b/jdk/src/java.base/share/classes/sun/invoke/util/VerifyAccess.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2008, 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -39,6 +39,7 @@ public class VerifyAccess {
private VerifyAccess() { } // cannot instantiate
+ private static final int UNCONDITIONAL_ALLOWED = java.lang.invoke.MethodHandles.Lookup.UNCONDITIONAL;
private static final int MODULE_ALLOWED = java.lang.invoke.MethodHandles.Lookup.MODULE;
private static final int PACKAGE_ONLY = 0;
private static final int PACKAGE_ALLOWED = java.lang.invoke.MethodHandles.Lookup.PACKAGE;
@@ -92,7 +93,7 @@ public class VerifyAccess {
int allowedModes) {
if (allowedModes == 0) return false;
assert((allowedModes & PUBLIC) != 0 &&
- (allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED|MODULE_ALLOWED)) == 0);
+ (allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED|MODULE_ALLOWED|UNCONDITIONAL_ALLOWED)) == 0);
// The symbolic reference class (refc) must always be fully verified.
if (!isClassAccessible(refc, lookupClass, allowedModes)) {
return false;
@@ -173,7 +174,7 @@ public class VerifyAccess {
int allowedModes) {
if (allowedModes == 0) return false;
assert((allowedModes & PUBLIC) != 0 &&
- (allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED|MODULE_ALLOWED)) == 0);
+ (allowedModes & ~(ALL_ACCESS_MODES|PACKAGE_ALLOWED|MODULE_ALLOWED|UNCONDITIONAL_ALLOWED)) == 0);
int mods = getClassModifiers(refc);
if (isPublic(mods)) {
@@ -191,22 +192,17 @@ public class VerifyAccess {
(lookupModule == refModule))
return true;
- // check readability
- if (lookupModule.canRead(refModule)) {
+ // check readability when UNCONDITIONAL not allowed
+ if (((allowedModes & UNCONDITIONAL_ALLOWED) != 0)
+ || lookupModule.canRead(refModule)) {
// check that refc is in an exported package
- Class> c = refc;
- while (c.isArray()) {
- c = c.getComponentType();
- }
- if (c.isPrimitive())
- return true;
if ((allowedModes & MODULE_ALLOWED) != 0) {
- if (refModule.isExported(c.getPackageName(), lookupModule))
+ if (refModule.isExported(refc.getPackageName(), lookupModule))
return true;
} else {
// exported unconditionally
- if (refModule.isExported(c.getPackageName()))
+ if (refModule.isExported(refc.getPackageName()))
return true;
}
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 ee8f311d2e4..9e60d9e9081 100644
--- a/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java
+++ b/jdk/src/java.base/share/classes/sun/launcher/LauncherHelper.java
@@ -966,6 +966,10 @@ public final class LauncherHelper {
ostream.print("open ");
if (md.isAutomatic())
ostream.print("automatic ");
+ if (md.modifiers().contains(ModuleDescriptor.Modifier.SYNTHETIC))
+ ostream.print("synthetic ");
+ if (md.modifiers().contains(ModuleDescriptor.Modifier.MANDATED))
+ ostream.print("mandated ");
ostream.println("module " + midAndLocation(md, mref.location()));
// unqualified exports (sorted by package)
diff --git a/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java b/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java
index 88e6f5b7caa..893bb55c10a 100644
--- a/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java
+++ b/jdk/src/java.base/share/classes/sun/net/www/protocol/jrt/JavaRuntimeURLConnection.java
@@ -32,7 +32,9 @@ import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
+import java.security.AccessController;
import java.security.Permission;
+import java.security.PrivilegedAction;
import jdk.internal.jimage.ImageLocation;
import jdk.internal.jimage.ImageReader;
@@ -51,7 +53,11 @@ import sun.security.action.GetPropertyAction;
public class JavaRuntimeURLConnection extends URLConnection {
// ImageReader to access resources in jimage
- private static final ImageReader reader = ImageReaderFactory.getImageReader();
+ private static final ImageReader reader;
+ static {
+ PrivilegedAction pa = ImageReaderFactory::getImageReader;
+ reader = AccessController.doPrivileged(pa);
+ }
// the module and resource name in the URL
private final String module;
diff --git a/jdk/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java b/jdk/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java
index 17c5bede590..ab0d540f9c8 100644
--- a/jdk/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java
+++ b/jdk/src/java.instrument/share/classes/java/lang/instrument/ClassFileTransformer.java
@@ -229,6 +229,7 @@ public interface ClassFileTransformer {
* or {@code null} if no transform is performed
*
* @since 9
+ * @spec JPMS
*/
default byte[]
transform( Module module,
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 97986c2e610..bc4170d3af2 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
@@ -714,6 +714,7 @@ public interface Instrumentation {
* @throws NullPointerException if any of the arguments are {@code null} or
* any of the Sets or Maps contains a {@code null} key or value
* @since 9
+ * @spec JPMS
*/
void redefineModule(Module module,
Set extraReads,
diff --git a/jdk/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnector.java b/jdk/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnector.java
index 7684567c1ca..7c5cd32811f 100644
--- a/jdk/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnector.java
+++ b/jdk/src/java.management.rmi/share/classes/javax/management/remote/rmi/RMIConnector.java
@@ -38,6 +38,7 @@ import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.ObjectStreamClass;
import java.io.Serializable;
+import java.lang.module.ModuleDescriptor;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
@@ -107,6 +108,8 @@ import sun.rmi.server.UnicastRef2;
import sun.rmi.transport.LiveRef;
import java.io.NotSerializableException;
+import static java.lang.module.ModuleDescriptor.Modifier.SYNTHETIC;
+
/**
* A connection to a remote RMI connector. Usually, such
* connections are made using {@link
@@ -2020,8 +2023,14 @@ public class RMIConnector implements JMXConnector, Serializable, JMXAddressable
Module rmiModule = RemoteRef.class.getModule();
String pkg = packageOf(pRefClassName);
- assert pkg != null && pkg.length() > 0 && !pkg.equals(packageOf(proxyRefCName));
- Module m = Modules.defineModule(cl, "jdk.remoteref", Collections.singleton(pkg));
+ assert pkg != null && pkg.length() > 0 &&
+ !pkg.equals(packageOf(proxyRefCName));
+
+ ModuleDescriptor descriptor =
+ ModuleDescriptor.newModule("jdk.remoteref", Set.of(SYNTHETIC))
+ .packages(Set.of(pkg))
+ .build();
+ Module m = Modules.defineModule(cl, descriptor, null);
// jdk.remoteref needs to read to java.base and jmxModule
Modules.addReads(m, Object.class.getModule());
diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java
index 601a5371932..a95ccd8e116 100644
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/GNUStyleOptions.java
@@ -157,8 +157,7 @@ class GNUStyleOptions {
for (String dir : dirs) {
paths[i++] = Paths.get(dir);
}
- jartool.moduleFinder =
- new ModulePath(Runtime.version(), true, paths);
+ jartool.moduleFinder = ModulePath.of(Runtime.version(), true, paths);
}
},
new Option(false, OptionType.CREATE_UPDATE, "--do-not-resolve-by-default") {
diff --git a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java
index 36e2ad3b78b..e0d617bd029 100644
--- a/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java
+++ b/jdk/src/jdk.jartool/share/classes/sun/tools/jar/Main.java
@@ -699,7 +699,7 @@ public class Main {
}
String pn = toPackageName(name);
// add if this is a class or resource in a package
- if (Checks.isJavaIdentifier(pn)) {
+ if (Checks.isPackageName(pn)) {
packages.add(pn);
}
}
@@ -1995,7 +1995,7 @@ public class Main {
}
// get a resolved module graph
Configuration config =
- Configuration.empty().resolveRequires(system, finder, roots);
+ Configuration.empty().resolve(system, finder, roots);
// filter modules resolved from the system module finder
this.modules = config.modules().stream()
diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java
index 0eb7ade59fa..40413d491ca 100644
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/JlinkTask.java
@@ -29,6 +29,7 @@ import java.io.IOException;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.lang.module.Configuration;
+import java.lang.module.FindException;
import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReference;
@@ -232,7 +233,7 @@ public class JlinkTask {
return EXIT_OK;
} catch (PluginException | IllegalArgumentException |
- UncheckedIOException |IOException | ResolutionException e) {
+ UncheckedIOException |IOException | FindException | ResolutionException e) {
log.println(taskHelper.getMessage("error.prefix") + " " + e.getMessage());
if (DEBUG) {
e.printStackTrace(log);
@@ -370,7 +371,7 @@ public class JlinkTask {
*/
private ModuleFinder modulePathFinder() {
Path[] entries = options.modulePath.toArray(new Path[0]);
- ModuleFinder finder = new ModulePath(Runtime.version(), true, entries);
+ ModuleFinder finder = ModulePath.of(Runtime.version(), true, entries);
if (!options.limitMods.isEmpty()) {
finder = limitFinder(finder, options.limitMods, Collections.emptySet());
}
@@ -388,7 +389,7 @@ public class JlinkTask {
Set roots)
{
Path[] entries = paths.toArray(new Path[0]);
- ModuleFinder finder = new ModulePath(Runtime.version(), true, entries);
+ ModuleFinder finder = ModulePath.of(Runtime.version(), true, entries);
// if limitmods is specified then limit the universe
if (!limitMods.isEmpty()) {
@@ -418,9 +419,9 @@ public class JlinkTask {
}
Configuration cf = Configuration.empty()
- .resolveRequires(finder,
- ModuleFinder.of(),
- roots);
+ .resolve(finder,
+ ModuleFinder.of(),
+ roots);
// emit warning for modules that end with a digit
cf.modules().stream()
@@ -458,9 +459,9 @@ public class JlinkTask {
// resolve all root modules
Configuration cf = Configuration.empty()
- .resolveRequires(finder,
- ModuleFinder.of(),
- roots);
+ .resolve(finder,
+ ModuleFinder.of(),
+ roots);
// module name -> reference
Map map = new HashMap<>();
diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java
index 9c81c7740c6..37d96c64413 100644
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/ResourcePoolConfiguration.java
@@ -51,7 +51,7 @@ final class ResourcePoolConfiguration {
ModuleDescriptor md = mod.descriptor();
// drop hashes
- ModuleDescriptor.Builder builder = ModuleDescriptor.module(md.name());
+ ModuleDescriptor.Builder builder = ModuleDescriptor.newModule(md.name());
md.requires().stream()
.forEach(builder::requires);
md.exports().stream()
@@ -62,12 +62,7 @@ final class ResourcePoolConfiguration {
.forEach(builder::uses);
md.provides().stream()
.forEach(builder::provides);
-
- // build the proper concealed packages
- Set concealed = new HashSet<>(mod.packages());
- md.exports().stream().map(ModuleDescriptor.Exports::source).forEach(concealed::remove);
- md.opens().stream().map(ModuleDescriptor.Opens::source).forEach(concealed::remove);
- concealed.stream().forEach(builder::contains);
+ builder.packages(md.packages());
md.version().ifPresent(builder::version);
md.mainClass().ifPresent(builder::mainClass);
@@ -124,7 +119,7 @@ final class ResourcePoolConfiguration {
}
};
- return Configuration.empty().resolveRequires(
+ return Configuration.empty().resolve(
finder, ModuleFinder.of(), nameToModRef.keySet());
}
}
diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java
index 7c60d79657e..2f45403a27c 100644
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/TaskHelper.java
@@ -718,13 +718,13 @@ public final class TaskHelper {
static Layer createPluginsLayer(List paths) {
Path[] dirs = paths.toArray(new Path[0]);
- ModuleFinder finder = new ModulePath(Runtime.version(), true, dirs);
+ ModuleFinder finder = ModulePath.of(Runtime.version(), true, dirs);
Configuration bootConfiguration = Layer.boot().configuration();
try {
Configuration cf = bootConfiguration
- .resolveRequiresAndUses(ModuleFinder.of(),
- finder,
- Collections.emptySet());
+ .resolveAndBind(ModuleFinder.of(),
+ finder,
+ Collections.emptySet());
ClassLoader scl = ClassLoader.getSystemClassLoader();
return Layer.boot().defineModulesWithOneLoader(cf, scl);
} catch (Exception ex) {
diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java
index 8c3f3ea114e..14cd3f501a4 100644
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jlink/internal/plugins/SystemModulesPlugin.java
@@ -771,9 +771,12 @@ public final class SystemModulesPlugin implements Plugin {
if (md.isOpen()) {
setModuleBit("open", true);
}
- if (md.isSynthetic()) {
+ if (md.modifiers().contains(ModuleDescriptor.Modifier.SYNTHETIC)) {
setModuleBit("synthetic", true);
}
+ if (md.modifiers().contains(ModuleDescriptor.Modifier.MANDATED)) {
+ setModuleBit("mandated", true);
+ }
}
/*
diff --git a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java
index 3ed482b7d99..be88c492297 100644
--- a/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java
+++ b/jdk/src/jdk.jlink/share/classes/jdk/tools/jmod/JmodTask.java
@@ -34,6 +34,7 @@ import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.UncheckedIOException;
import java.lang.module.Configuration;
+import java.lang.module.FindException;
import java.lang.module.ModuleReader;
import java.lang.module.ModuleReference;
import java.lang.module.ModuleFinder;
@@ -851,8 +852,8 @@ public class JmodTask {
// get a resolved module graph
Configuration config = null;
try {
- config = Configuration.empty().resolveRequires(system, finder, roots);
- } catch (ResolutionException e) {
+ config = Configuration.empty().resolve(system, finder, roots);
+ } catch (FindException | ResolutionException e) {
throw new CommandException("err.module.resolution.fail", e.getMessage());
}
@@ -1392,7 +1393,7 @@ public class JmodTask {
options.legalNotices = getLastElement(opts.valuesOf(legalNotices));
if (opts.has(modulePath)) {
Path[] dirs = getLastElement(opts.valuesOf(modulePath)).toArray(new Path[0]);
- options.moduleFinder = new ModulePath(Runtime.version(), true, dirs);
+ options.moduleFinder = ModulePath.of(Runtime.version(), true, dirs);
}
if (opts.has(moduleVersion))
options.moduleVersion = getLastElement(opts.valuesOf(moduleVersion));
diff --git a/jdk/test/ProblemList.txt b/jdk/test/ProblemList.txt
index f94c56a05e4..c2105dbdbb1 100644
--- a/jdk/test/ProblemList.txt
+++ b/jdk/test/ProblemList.txt
@@ -296,6 +296,8 @@ java/util/BitSet/BitSetStreamTest.java 8079538 generic-
sun/tools/jcmd/TestJcmdSanity.java 8031482 windows-all
+sun/tools/jstat/jstatClassloadOutput1.sh 8173942 generic-all
+
sun/jvmstat/monitor/MonitoredVm/MonitorVmStartTerminate.java 8057732 generic-all
demo/jvmti/compiledMethodLoad/CompiledMethodLoadTest.java 8151899 generic-all
diff --git a/jdk/test/java/io/FilePermission/ReadFileOnPath.java b/jdk/test/java/io/FilePermission/ReadFileOnPath.java
index 42ed7542030..9ce8fb9b006 100644
--- a/jdk/test/java/io/FilePermission/ReadFileOnPath.java
+++ b/jdk/test/java/io/FilePermission/ReadFileOnPath.java
@@ -57,7 +57,7 @@ public class ReadFileOnPath {
"module-info.class", "base", "p/App.class", "p/child");
// exploded module
- test("--module-path", "modules", "-m", "m/p.App", "SS+++++");
+ test("--module-path", "modules", "-m", "m/p.App", "SS++++0");
// module in jar
test("--module-path", "new.jar", "-m", "m/p.App", "SSSS++0");
diff --git a/jdk/test/java/lang/Class/forName/modules/TestLayer.java b/jdk/test/java/lang/Class/forName/modules/TestLayer.java
index 645e04d7e9b..ff9a772ceeb 100644
--- a/jdk/test/java/lang/Class/forName/modules/TestLayer.java
+++ b/jdk/test/java/lang/Class/forName/modules/TestLayer.java
@@ -46,9 +46,9 @@ public class TestLayer {
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
Configuration parent = Layer.boot().configuration();
- Configuration cf = parent.resolveRequiresAndUses(ModuleFinder.of(),
- finder,
- modules);
+ Configuration cf = parent.resolveAndBind(ModuleFinder.of(),
+ finder,
+ modules);
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
diff --git a/jdk/test/java/lang/Class/forName/modules/src/m3/p3/NoAccess.java b/jdk/test/java/lang/Class/forName/modules/src/m3/p3/NoAccess.java
index 618b2fde67a..25e8779ab48 100644
--- a/jdk/test/java/lang/Class/forName/modules/src/m3/p3/NoAccess.java
+++ b/jdk/test/java/lang/Class/forName/modules/src/m3/p3/NoAccess.java
@@ -50,9 +50,9 @@ public class NoAccess {
Layer bootLayer = Layer.boot();
Configuration parent = bootLayer.configuration();
- Configuration cf = parent.resolveRequiresAndUses(finder,
- ModuleFinder.of(),
- Set.of("m1", "m2"));
+ Configuration cf = parent.resolveAndBind(finder,
+ ModuleFinder.of(),
+ Set.of("m1", "m2"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = bootLayer.defineModulesWithManyLoaders(cf, scl);
diff --git a/jdk/test/java/lang/Class/getPackageName/Basic.java b/jdk/test/java/lang/Class/getPackageName/Basic.java
index e0c0bd17d3c..c079d653205 100644
--- a/jdk/test/java/lang/Class/getPackageName/Basic.java
+++ b/jdk/test/java/lang/Class/getPackageName/Basic.java
@@ -154,8 +154,8 @@ public class Basic {
return new Object[][] {
{ Basic.class, TEST_PACKAGE },
- { Basic[].class, null },
- { Basic[][].class, null },
+ { Basic[].class, TEST_PACKAGE },
+ { Basic[][].class, TEST_PACKAGE },
{ getNestedClass1(), TEST_PACKAGE },
{ getNestedClass2(), TEST_PACKAGE },
@@ -174,14 +174,14 @@ public class Basic {
{ getAnonymousClass6(), TEST_PACKAGE },
{ Object.class, "java.lang" },
- { Object[].class, null },
- { Object[][].class, null },
+ { Object[].class, "java.lang" },
+ { Object[][].class, "java.lang" },
- { int.class, null },
- { int[].class, null },
- { int[][].class, null },
+ { int.class, "java.lang" },
+ { int[].class, "java.lang" },
+ { int[][].class, "java.lang" },
- { void.class, null },
+ { void.class, "java.lang" },
};
}
diff --git a/jdk/test/java/lang/StackWalker/CallerFromMain.java b/jdk/test/java/lang/StackWalker/CallerFromMain.java
index 9bc289a7f38..0eb0b2bdc46 100644
--- a/jdk/test/java/lang/StackWalker/CallerFromMain.java
+++ b/jdk/test/java/lang/StackWalker/CallerFromMain.java
@@ -51,7 +51,7 @@ public class CallerFromMain {
try {
Class> c = sw.getCallerClass();
throw new RuntimeException("UOE not thrown. Caller: " + c);
- } catch (IllegalStateException e) {}
+ } catch (IllegalCallerException e) {}
// StackWalker::getCallerClass
// Runnable::run
diff --git a/jdk/test/java/lang/invoke/AccessControlTest.java b/jdk/test/java/lang/invoke/AccessControlTest.java
index 57cec50b2ec..616ba798ba6 100644
--- a/jdk/test/java/lang/invoke/AccessControlTest.java
+++ b/jdk/test/java/lang/invoke/AccessControlTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -118,6 +118,8 @@ public class AccessControlTest {
suffix = "/noaccess";
else if (lookupModes == PUBLIC)
suffix = "/public";
+ else if (lookupModes == (PUBLIC|UNCONDITIONAL))
+ suffix = "/publicLookup";
else if (lookupModes == (PUBLIC|MODULE))
suffix = "/module";
else if (lookupModes == (PUBLIC|MODULE|PACKAGE))
@@ -140,23 +142,24 @@ public class AccessControlTest {
* [A2] However, the resulting {@code Lookup} object is guaranteed
* to have no more access capabilities than the original.
* In particular, access capabilities can be lost as follows:
- * - [A3] If the new lookup class differs from the old one,
- * protected members will not be accessible by virtue of inheritance.
+ *
- [A3] If the old lookup class is in a named module, and the new
+ * lookup class is in a different module {@code M}, then no members, not
+ * even public members in {@code M}'s exported packages, will be accessible.
+ * The exception to this is when this lookup is publicLookup, in which case
+ * public access is not lost.
+ *
- [A4] If the old lookup class is in an unnamed module, and the new
+ * lookup class is a different module then module access is lost.
+ *
- [A5] If the new lookup class differs from the old one then UNCONDITIONAL
+ * is lost. If the new lookup class is not within the same package member as the
+ * old one, protected members will not be accessible by virtue of inheritance.
* (Protected members may continue to be accessible because of package sharing.)
- *
- [A4] If the new lookup class is in a different package
- * than the old one, protected and default (package) members will not be accessible.
- *
- [A5] If the new lookup class is not within the same package member
+ *
- [A6] If the new lookup class is in a different package than the old one,
+ * protected and default (package) members will not be accessible.
+ *
- [A7] If the new lookup class is not within the same package member
* as the old one, private members will not be accessible.
- *
- [A6] If the new lookup class is not accessible to the old lookup class,
- * using the original access modes,
+ *
- [A8] If the new lookup class is not accessible to the old lookup class,
* then no members, not even public members, will be accessible.
- *
- [A7] If the new lookup class for this {@code Lookup} is in the unnamed module,
- * and the new lookup class is in a named module {@code M}, then no members in
- * {@code M}'s non-exported packages will be accessible.
- *
- [A8] If the lookup for this {@code Lookup} is in a named module, and the
- * new lookup class is in a different module, then no members, not even
- * public members in {@code M}'s exported packages, will be accessible.
- * [A8] (In all other cases, public members will continue to be accessible.)
+ *
- [A9] (In all other cases, public members will continue to be accessible.)
*
* Other than the above cases, the new lookup will have the same
* access capabilities as the original. [A10]
@@ -171,36 +174,35 @@ public class AccessControlTest {
boolean sameModule = (c1.getModule() == c2.getModule()) ||
(!c1.getModule().isNamed() && !c2.getModule().isNamed());
boolean samePackage = (c1.getClassLoader() == c2.getClassLoader() &&
- packagePrefix(c1).equals(packagePrefix(c2)));
+ c1.getPackageName().equals(c2.getPackageName()));
boolean sameTopLevel = (topLevelClass(c1) == topLevelClass(c2));
boolean sameClass = (c1 == c2);
assert(samePackage || !sameTopLevel);
assert(sameTopLevel || !sameClass);
- boolean accessible = sameClass; // [A6]
+ boolean accessible = sameClass;
if ((m1 & PACKAGE) != 0) accessible |= samePackage;
if ((m1 & PUBLIC ) != 0) accessible |= (c2.getModifiers() & PUBLIC) != 0;
if (!sameModule) {
- if (c1.getModule().isNamed()) {
- accessible = false; // [A8]
+ if (c1.getModule().isNamed() && (m1 & UNCONDITIONAL) == 0) {
+ accessible = false; // [A3]
} else {
- // Different module; loose MODULE and lower access.
- changed |= (MODULE|PACKAGE|PRIVATE|PROTECTED); // [A7]
+ changed |= (MODULE|PACKAGE|PRIVATE|PROTECTED); // [A3] [A4]
}
}
if (!accessible) {
// Different package and no access to c2; lose all access.
- changed |= (PUBLIC|MODULE|PACKAGE|PRIVATE|PROTECTED); // [A6]
+ changed |= (PUBLIC|MODULE|PACKAGE|PRIVATE|PROTECTED); // [A8]
}
if (!samePackage) {
// Different package; loose PACKAGE and lower access.
- changed |= (PACKAGE|PRIVATE|PROTECTED); // [A4]
+ changed |= (PACKAGE|PRIVATE|PROTECTED); // [A6]
}
if (!sameTopLevel) {
- // Different top-level class. Lose PRIVATE and lower access.
- changed |= (PRIVATE|PROTECTED); // [A5]
+ // Different top-level class. Lose PRIVATE and PROTECTED access.
+ changed |= (PRIVATE|PROTECTED); // [A5] [A7]
}
if (!sameClass) {
- changed |= (PROTECTED); // [A3]
+ changed |= (UNCONDITIONAL); // [A5]
} else {
assert(changed == 0); // [A10] (no deprivation if same class)
}
@@ -228,11 +230,10 @@ public class AccessControlTest {
Class> c1 = lookupClass();
Class> c2 = m.getDeclaringClass();
- // if the lookup class is in a loose module with PUBLIC access then
- // public members of public types in all unnamed modules can be accessed
- if (isLooseModule(c1.getModule())
+ // publicLookup has access to all public types/members of types in unnamed modules
+ if ((lookupModes & UNCONDITIONAL) != 0
&& (lookupModes & PUBLIC) != 0
- && (!c2.getModule().isNamed())
+ && !c2.getModule().isNamed()
&& Modifier.isPublic(c2.getModifiers())
&& Modifier.isPublic(m.getModifiers()))
return true;
@@ -261,17 +262,12 @@ public class AccessControlTest {
if (load && c2.getClassLoader() != null) {
if (c1.getClassLoader() == null) {
// not visible
- return false;
- }
- if (c1 == publicLookup().lookupClass()) {
- // not visible as lookup class is defined by child of the boot loader
return false;
}
}
- // if the lookup class is in a loose module with PUBLIC access then
- // public types in all unnamed modules can be accessed
- if (isLooseModule(c1.getModule())
+ // publicLookup has access to all public types/members of types in unnamed modules
+ if ((lookupModes & UNCONDITIONAL) != 0
&& (lookupModes & PUBLIC) != 0
&& (!c2.getModule().isNamed())
&& Modifier.isPublic(c2.getModifiers()))
@@ -295,11 +291,6 @@ public class AccessControlTest {
}
return r;
}
-
- private boolean isLooseModule(Module m) {
- ClassLoader cl = new ClassLoader() { };
- return m.canRead(cl.getUnnamedModule());
- }
}
private static Class> topLevelClass(Class> cls) {
@@ -311,14 +302,6 @@ public class AccessControlTest {
return c;
}
- private static String packagePrefix(Class> c) {
- while (c.isArray()) c = c.getComponentType();
- String s = c.getName();
- assert(s.indexOf('/') < 0);
- return s.substring(0, s.lastIndexOf('.')+1);
- }
-
-
private final TreeSet CASES = new TreeSet<>();
private final TreeMap> CASE_EDGES = new TreeMap<>();
private final ArrayList LOADERS = new ArrayList<>();
diff --git a/jdk/test/java/lang/invoke/DropLookupModeTest.java b/jdk/test/java/lang/invoke/DropLookupModeTest.java
index be7d0a60e54..64cb99e15e7 100644
--- a/jdk/test/java/lang/invoke/DropLookupModeTest.java
+++ b/jdk/test/java/lang/invoke/DropLookupModeTest.java
@@ -65,6 +65,10 @@ public class DropLookupModeTest {
lookup = fullPowerLookup.dropLookupMode(PUBLIC);
assertTrue(lookup.lookupClass() == lc);
assertTrue(lookup.lookupModes() == 0);
+
+ lookup = fullPowerLookup.dropLookupMode(UNCONDITIONAL);
+ assertTrue(lookup.lookupClass() == lc);
+ assertTrue(lookup.lookupModes() == (PUBLIC|MODULE|PACKAGE|PRIVATE));
}
/**
@@ -108,7 +112,7 @@ public class DropLookupModeTest {
public void testPublicLookup() {
final Lookup publicLookup = MethodHandles.publicLookup();
final Class> lc = publicLookup.lookupClass();
- assertTrue(publicLookup.lookupModes() == PUBLIC);
+ assertTrue(publicLookup.lookupModes() == (PUBLIC|UNCONDITIONAL));
Lookup lookup = publicLookup.dropLookupMode(PRIVATE);
assertTrue(lookup.lookupClass() == lc);
@@ -129,6 +133,10 @@ public class DropLookupModeTest {
lookup = publicLookup.dropLookupMode(PUBLIC);
assertTrue(lookup.lookupClass() == lc);
assertTrue(lookup.lookupModes() == 0);
+
+ lookup = publicLookup.dropLookupMode(UNCONDITIONAL);
+ assertTrue(lookup.lookupClass() == lc);
+ assertTrue(lookup.lookupModes() == PUBLIC);
}
@DataProvider(name = "badInput")
diff --git a/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/Driver.java b/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/Driver.java
index 5abe4eb2383..810351bae3e 100644
--- a/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/Driver.java
+++ b/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/Driver.java
@@ -23,7 +23,7 @@
/**
* @test
- * @build test/* m1/* m2/* m3/*
+ * @build test/* m1/* m2/* m3/* Unnamed
* @run testng/othervm test/p.PrivateLookupInTests
* @summary Unit tests for MethodHandles.privateLookupIn
*/
diff --git a/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/Unnamed.java b/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/Unnamed.java
new file mode 100644
index 00000000000..9bb0ff042a3
--- /dev/null
+++ b/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/Unnamed.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class Unnamed { }
diff --git a/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/test/p/PrivateLookupInTests.java b/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/test/p/PrivateLookupInTests.java
index 823ae8797b5..f2391743bd0 100644
--- a/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/test/p/PrivateLookupInTests.java
+++ b/jdk/test/java/lang/invoke/MethodHandles/privateLookupIn/test/p/PrivateLookupInTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -126,6 +126,26 @@ public class PrivateLookupInTests {
Object obj = mh.invokeExact();
}
+ // test target class in unnamed module
+ public void testTargetClassInUnnamedModule() throws Throwable {
+ Class> clazz = Class.forName("Unnamed");
+ assertFalse(clazz.getModule().isNamed());
+
+ // thisModule does not read the unnamed module
+ Module thisModule = getClass().getModule();
+ assertFalse(thisModule.canRead(clazz.getModule()));
+ try {
+ MethodHandles.privateLookupIn(clazz, MethodHandles.lookup());
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ // thisModule reads the unnamed module
+ thisModule.addReads(clazz.getModule());
+ Lookup lookup = MethodHandles.privateLookupIn(clazz, MethodHandles.lookup());
+ assertTrue(lookup.lookupClass() == clazz);
+ assertTrue(lookup.hasPrivateAccess());
+ }
+
// test does not read m2, m2 opens p2 to test
@Test(expectedExceptions = {IllegalAccessException.class})
public void testCallerDoesNotRead() throws Throwable {
diff --git a/jdk/test/java/lang/invoke/modules/Driver.java b/jdk/test/java/lang/invoke/modules/Driver.java
new file mode 100644
index 00000000000..5c00de3ad47
--- /dev/null
+++ b/jdk/test/java/lang/invoke/modules/Driver.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @build m1/* m2/* Unnamed
+ * @run testng/othervm m1/p1.Main
+ * @summary Basic test case for module access checks and Lookup.in.
+ */
diff --git a/jdk/test/java/lang/invoke/modules/ModuleAccessControlTest.java b/jdk/test/java/lang/invoke/modules/ModuleAccessControlTest.java
deleted file mode 100644
index 32adfd9d5e0..00000000000
--- a/jdk/test/java/lang/invoke/modules/ModuleAccessControlTest.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.List;
-
-import static jdk.testlibrary.ProcessTools.executeTestJava;
-
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-import static org.testng.Assert.*;
-
-/**
- * @test
- * @library /lib/testlibrary
- * @modules jdk.compiler
- * @build CompilerUtils jdk.testlibrary.*
- * @run testng ModuleAccessControlTest
- * @summary Driver for testing module access checking by MethodHandles.Lookup
- */
-
-public class ModuleAccessControlTest {
-
- private static final String TEST_SRC = System.getProperty("test.src");
-
- private static final Path SRC_DIR = Paths.get(TEST_SRC, "src");
- private static final Path MODS_DIR = Paths.get("mods");
-
- // the names of the modules in this test
- private static List modules = Arrays.asList("m1", "m2");
-
-
- /**
- * Compiles all modules used by the test
- */
- @BeforeTest
- public void compileAll() throws Exception {
- for (String mn : modules) {
- Path msrc = SRC_DIR.resolve(mn);
- assertTrue(CompilerUtils
- .compile(msrc, MODS_DIR, "--module-source-path", SRC_DIR.toString()));
- }
- }
-
- /**
- * Launch the test
- */
- @Test
- public void runTest() throws Exception {
- int exitValue = executeTestJava("--module-path", MODS_DIR.toString(),
- "-m", "m1/p1.Main")
- .outputTo(System.out)
- .errorTo(System.out)
- .getExitValue();
-
- assertTrue(exitValue == 0);
- }
-
-}
diff --git a/jdk/test/java/lang/invoke/modules/Unnamed.java b/jdk/test/java/lang/invoke/modules/Unnamed.java
new file mode 100644
index 00000000000..9bb0ff042a3
--- /dev/null
+++ b/jdk/test/java/lang/invoke/modules/Unnamed.java
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+public class Unnamed { }
diff --git a/jdk/test/java/lang/invoke/modules/src/m1/module-info.java b/jdk/test/java/lang/invoke/modules/m1/module-info.java
similarity index 98%
rename from jdk/test/java/lang/invoke/modules/src/m1/module-info.java
rename to jdk/test/java/lang/invoke/modules/m1/module-info.java
index 175c7727611..9c09afcf7e1 100644
--- a/jdk/test/java/lang/invoke/modules/src/m1/module-info.java
+++ b/jdk/test/java/lang/invoke/modules/m1/module-info.java
@@ -22,5 +22,6 @@
*/
module m1 {
requires m2;
+ requires testng;
exports p1;
}
diff --git a/jdk/test/java/lang/invoke/modules/m1/p1/Main.java b/jdk/test/java/lang/invoke/modules/m1/p1/Main.java
new file mode 100644
index 00000000000..7a10022d78f
--- /dev/null
+++ b/jdk/test/java/lang/invoke/modules/m1/p1/Main.java
@@ -0,0 +1,367 @@
+/*
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package p1;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodHandles.Lookup;
+import java.lang.invoke.MethodType;
+import java.lang.reflect.Layer;
+import java.lang.reflect.Module;
+
+import static java.lang.invoke.MethodHandles.Lookup.*;
+
+import org.testng.annotations.BeforeTest;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+/**
+ * Basic test case for module access checks and Lookup.in.
+ */
+
+@Test
+public class Main {
+
+ private Class> p1_Type1; // m1, exported
+ private Class> p2_Type2; // m1, not exported
+ private Class> q1_Type1; // m2, exported
+ private Class> q2_Type2; // m2, not exported
+ private Class> x500NameClass; // java.base, not exported
+ private Class> unnamedClass; // class in unnamed module
+
+ @BeforeTest
+ public void setup() throws Exception {
+ try {
+ p1_Type1 = Class.forName("p1.Type1");
+ p2_Type2 = Class.forName("p2.Type2");
+ q1_Type1 = Class.forName("q1.Type1");
+ q2_Type2 = Class.forName("q2.Type2");
+ x500NameClass = Class.forName("sun.security.x509.X500Name");
+ unnamedClass = Class.forName("Unnamed");
+ } catch (ClassNotFoundException e) {
+ throw new AssertionError(e);
+ }
+
+ // check setup
+ Module m1 = Layer.boot().findModule("m1").orElse(null);
+ assertNotNull(m1);
+ assertTrue(p1_Type1.getModule() == m1);
+ assertTrue(p2_Type2.getModule() == m1);
+ assertTrue(m1.isExported("p1"));
+ assertFalse(m1.isExported("p2"));
+
+ Module m2 = Layer.boot().findModule("m2").orElse(null);
+ assertNotNull(m2);
+ assertTrue(q1_Type1.getModule() == m2);
+ assertTrue(q2_Type2.getModule() == m2);
+ assertTrue(m2.isExported("q1"));
+ assertFalse(m2.isExported("q2"));
+
+ Module unnamedModule = unnamedClass.getModule();
+ assertFalse(unnamedModule.isNamed());
+
+ // m1 needs to read unnamed module
+ Main.class.getModule().addReads(unnamedModule);
+ }
+
+ /**
+ * MethodHandles.lookup()
+ *
+ * [A0] has module access
+ * [A1] can access all public types in m1
+ * [A2] can access public types in packages exported by modules that m1 reads
+ * [A3] cannot access public types in non-exported modules of modules that m1 reads
+ */
+ public void testLookup() throws Exception {
+ Lookup lookup = MethodHandles.lookup();
+ assertTrue((lookup.lookupModes() & MODULE) == MODULE); // [A0]
+
+ // m1
+ findConstructor(lookup, p1_Type1, void.class); // [A1]
+ findConstructor(lookup, p2_Type2, void.class); // [A1]
+
+ // m2
+ findConstructor(lookup, q1_Type1, void.class); // [A2]
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class); // [A3]
+
+ // java.base
+ findConstructor(lookup, Object.class, void.class); // [A2]
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class); // [A3]
+
+ // unnamed
+ findConstructor(lookup, unnamedClass, void.class); // [A3]
+ }
+
+ /**
+ * Hop to lookup class in the same module
+ *
+ * [A0] module and public access is not lost
+ */
+ public void testToSameModule() throws Exception {
+ Lookup lookup = MethodHandles.lookup().in(p2_Type2);
+ assertTrue(lookup.lookupModes() == (MODULE|PUBLIC)); // [A0]
+
+ // m1
+ findConstructor(lookup, p1_Type1, void.class);
+ findConstructor(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructor(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructor(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructor(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * Hop to lookup class in another named module
+ *
+ * [A0] has no access
+ */
+ public void testFromNamedToNamedModule() throws Exception {
+ Lookup lookup = MethodHandles.lookup().in(q1_Type1);
+ assertTrue(lookup.lookupModes() == 0); // [A0]
+
+ // m1
+ findConstructorExpectingIAE(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructorExpectingIAE(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructorExpectingIAE(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructorExpectingIAE(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * Hop to lookup class in an unnamed module
+ *
+ * [A0] has no access
+ */
+ public void testFromNamedToUnnamedModule() throws Exception {
+ Lookup lookup = MethodHandles.lookup().in(unnamedClass);
+ assertTrue(lookup.lookupModes() == 0); // [A0]
+
+ // m1
+ findConstructorExpectingIAE(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructorExpectingIAE(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructorExpectingIAE(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructorExpectingIAE(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * Hop from unnamed to named module.
+ *
+ * [A0] retains PUBLIC access
+ */
+ public void testFromUnnamedToNamedModule() throws Exception {
+ Lookup lookup = MethodHandles.lookup();
+ lookup = MethodHandles.privateLookupIn(unnamedClass, lookup).in(p1_Type1);
+ assertTrue(lookup.lookupModes() == PUBLIC); // A0
+
+ // m1
+ findConstructor(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructor(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructor(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructor(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * MethodHandles.publicLookup()
+ *
+ * [A0] has PUBLIC|UNCONDITIONAL access
+ */
+ public void testPublicLookup() throws Exception {
+ Lookup lookup = MethodHandles.publicLookup();
+ assertTrue(lookup.lookupModes() == (PUBLIC|UNCONDITIONAL)); // A0
+
+ // m1
+ findConstructor(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructor(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructor(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructor(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * Hop from publicLookup to accessible type in java.base
+ */
+ public void testPublicLookupToBaseModule() throws Exception {
+ Lookup lookup = MethodHandles.publicLookup().in(String.class);
+ assertTrue(lookup.lookupModes() == PUBLIC); // A0
+
+ // m1
+ findConstructorExpectingIAE(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructorExpectingIAE(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructor(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructorExpectingIAE(lookup, unnamedClass, void.class);
+ }
+
+
+ /**
+ * Hop from publicLookup to accessible type in named module.
+ *
+ * [A0] has PUBLIC access
+ */
+ public void testPublicLookupToAccessibleTypeInNamedModule() throws Exception {
+ Lookup lookup = MethodHandles.publicLookup().in(p1_Type1);
+ assertTrue(lookup.lookupModes() == PUBLIC); // A0
+
+ // m1
+ findConstructor(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructor(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructor(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructor(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * Teleport from publicLookup to inaccessible type in named module.
+ *
+ * [A0] has no access
+ */
+ public void testPublicLookupToInaccessibleTypeInNamedModule() throws Exception {
+ Lookup lookup = MethodHandles.publicLookup().in(p2_Type2);
+ assertTrue(lookup.lookupModes() == 0); // A0
+
+ // m1
+ findConstructorExpectingIAE(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructorExpectingIAE(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructorExpectingIAE(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructorExpectingIAE(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * Teleport from publicLookup to public type in unnamed module
+ *
+ * [A0] has PUBLIC access
+ */
+ public void testPublicLookupToUnnamedModule() throws Exception {
+ Lookup lookup = MethodHandles.publicLookup().in(unnamedClass);
+ assertTrue(lookup.lookupModes() == PUBLIC); // A0
+
+ // m1
+ findConstructor(lookup, p1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, p2_Type2, void.class);
+
+ // m2
+ findConstructor(lookup, q1_Type1, void.class);
+ findConstructorExpectingIAE(lookup, q2_Type2, void.class);
+
+ // java.base
+ findConstructor(lookup, Object.class, void.class);
+ findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class);
+
+ // unnamed
+ findConstructor(lookup, unnamedClass, void.class);
+ }
+
+ /**
+ * Invokes Lookup findConstructor with a method type constructored from the
+ * given return and parameter types, expecting IllegalAccessException to be
+ * thrown.
+ */
+ static void findConstructorExpectingIAE(Lookup lookup,
+ Class> clazz,
+ Class> rtype,
+ Class>... ptypes) throws Exception {
+ try {
+ findConstructor(lookup, clazz, rtype, ptypes);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+ }
+
+ /**
+ * Invokes Lookup findConstructor with a method type constructored from the
+ * given return and parameter types.
+ */
+ static MethodHandle findConstructor(Lookup lookup,
+ Class> clazz,
+ Class> rtype,
+ Class>... ptypes) throws Exception {
+ MethodType mt = MethodType.methodType(rtype, ptypes);
+ return lookup.findConstructor(clazz, mt);
+ }
+}
diff --git a/jdk/test/java/lang/invoke/modules/src/m1/p1/Type1.java b/jdk/test/java/lang/invoke/modules/m1/p1/Type1.java
similarity index 100%
rename from jdk/test/java/lang/invoke/modules/src/m1/p1/Type1.java
rename to jdk/test/java/lang/invoke/modules/m1/p1/Type1.java
diff --git a/jdk/test/java/lang/invoke/modules/src/m1/p2/Type2.java b/jdk/test/java/lang/invoke/modules/m1/p2/Type2.java
similarity index 100%
rename from jdk/test/java/lang/invoke/modules/src/m1/p2/Type2.java
rename to jdk/test/java/lang/invoke/modules/m1/p2/Type2.java
diff --git a/jdk/test/java/lang/invoke/modules/src/m2/module-info.java b/jdk/test/java/lang/invoke/modules/m2/module-info.java
similarity index 100%
rename from jdk/test/java/lang/invoke/modules/src/m2/module-info.java
rename to jdk/test/java/lang/invoke/modules/m2/module-info.java
diff --git a/jdk/test/java/lang/invoke/modules/src/m2/q1/Type1.java b/jdk/test/java/lang/invoke/modules/m2/q1/Type1.java
similarity index 100%
rename from jdk/test/java/lang/invoke/modules/src/m2/q1/Type1.java
rename to jdk/test/java/lang/invoke/modules/m2/q1/Type1.java
diff --git a/jdk/test/java/lang/invoke/modules/src/m2/q2/Type2.java b/jdk/test/java/lang/invoke/modules/m2/q2/Type2.java
similarity index 100%
rename from jdk/test/java/lang/invoke/modules/src/m2/q2/Type2.java
rename to jdk/test/java/lang/invoke/modules/m2/q2/Type2.java
diff --git a/jdk/test/java/lang/invoke/modules/src/m1/p1/Main.java b/jdk/test/java/lang/invoke/modules/src/m1/p1/Main.java
deleted file mode 100644
index 3fd1a0eb43d..00000000000
--- a/jdk/test/java/lang/invoke/modules/src/m1/p1/Main.java
+++ /dev/null
@@ -1,225 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package p1;
-
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.invoke.MethodHandles.Lookup;
-import java.lang.invoke.MethodType;
-
-/**
- * Basic test case for module access check, supplements AccessControlTest.
- *
- * The tests consists of two modules:
- *
- * module m1 { requires m2; exports p1; }
- * module m2 { exports q1; }
- *
- * Both modules read java.base (as every module reads java.base)
- *
- * module m1 has public types in packages p1 and p2, p2 is not exported.
- * module m2 has public types in packages q1 and q2, q2 is not exported.
- */
-
-public class Main {
-
- static final int MODULE = Lookup.MODULE;
-
- // Use Class.forName to get classes for test because some
- // are not accessible at compile-time
-
- static final Class> p1_Type1; // m1, exported
- static final Class> p2_Type2; // m1, not exported
- static final Class> q1_Type1; // m2, exported, m1 reads m2
- static final Class> q2_Type2; // m2, not exported, m1 reads m2
- static final Class> x500NameClass; // java.base, not exported
-
- static {
- try {
- p1_Type1 = Class.forName("p1.Type1");
- p2_Type2 = Class.forName("p2.Type2");
- q1_Type1 = Class.forName("q1.Type1");
- q2_Type2 = Class.forName("q2.Type2");
- x500NameClass = Class.forName("sun.security.x509.X500Name");
- } catch (ClassNotFoundException e) {
- throw new AssertionError(e);
- }
- }
-
- public static void main(String[] args) throws Exception {
- Lookup lookup, lookup2;
-
- /**
- * MethodHandles.lookup()
- * has module access [A0]
- * can access all public types in m1 [A1]
- * can access public types in packages exported by modules that m1 reads [A2]
- * cannot access public types in non-exported modules of modules that m1 reads [A3]
- */
- lookup = MethodHandles.lookup();
- assertTrue((lookup.lookupModes() & MODULE) == MODULE); // [A0]
- findConstructor(lookup, p1_Type1, void.class); // [A1]
- findConstructor(lookup, p2_Type2, void.class); // [A1]
- findConstructor(lookup, q1_Type1, void.class); // [A2]
- findConstructorExpectingIAE(lookup, q2_Type2, void.class); // [A3]
- findConstructor(lookup, Object.class, void.class); // [A2]
- findConstructorExpectingIAE(lookup, x500NameClass, void.class, String.class); // [A3]
-
- /**
- * Teleport from MethodHandles.lookup() to lookup class in the same module
- * module access is retained [A0]
- * can access all public types in m1 [A1]
- * can access public types in packages exported by modules that m1 reads [A2]
- * cannot access public types in non-exported modules of modules that m1 reads [A3]
- */
- lookup2 = lookup.in(p2_Type2);
- assertTrue((lookup2.lookupModes() & MODULE) == MODULE); // [A0]
- findConstructor(lookup2, p1_Type1, void.class); // [A1]
- findConstructor(lookup2, p2_Type2, void.class); // [A1]
- findConstructor(lookup2, q1_Type1, void.class); // [A2]
- findConstructorExpectingIAE(lookup2, q2_Type2, void.class); // [A3]
- findConstructor(lookup2, Object.class, void.class); // [A2]
- findConstructorExpectingIAE(lookup2, x500NameClass, void.class, String.class); // [A3]
-
- /**
- * Teleport from MethodHandles.lookup() to lookup class in another named module
- * has no access [A0]
- */
- lookup2 = lookup.in(Object.class);
- assertTrue(lookup2.lookupModes() == 0); // [A0]
- findConstructorExpectingIAE(lookup2, Object.class, void.class); // [A0]
-
- /**
- * Teleport from MethodHandles.lookup() to lookup class in an unnamed module
- * has no access [A0]
- */
- Class> c = MethodHandles.publicLookup().lookupClass();
- assertTrue(!c.getModule().isNamed());
- lookup2 = lookup.in(c);
- assertTrue(lookup2.lookupModes() == 0); // [A0]
- findConstructorExpectingIAE(lookup2, Object.class, void.class);
-
- /**
- * MethodHandles.publicLookup()
- * has no module access [A0]
- * can access public types in exported packages [A1]
- * cannot access public types in non-exported packages [A2]
- */
- lookup = MethodHandles.publicLookup();
- assertTrue((lookup.lookupModes() & MODULE) == 0); // [A0]
- findConstructor(lookup, p1_Type1, void.class); // [A1]
- findConstructorExpectingIAE(lookup, p2_Type2, void.class); // [A1]
- findConstructor(lookup, q1_Type1, void.class); // [A1]
- findConstructorExpectingIAE(lookup, q2_Type2, void.class); // [A2]
- findConstructor(lookup, Object.class, void.class); // [A1]
- findConstructorExpectingIAE(lookup, x500NameClass, void.class); // [A2]
-
- /**
- * Teleport from MethodHandles.publicLookup() to lookup class in java.base
- * has no module access [A0]
- * can access public types in packages exported by java.base [A1]
- * cannot access public types in non-exported packages [A2]
- * no access to types in other named modules [A3]
- */
- lookup2 = lookup.in(Object.class);
- assertTrue((lookup2.lookupModes() & MODULE) == 0); // [A0]
- findConstructor(lookup2, String.class, void.class); // [A1]
- findConstructorExpectingIAE(lookup2, x500NameClass, void.class, String.class); // [A2]
- findConstructorExpectingIAE(lookup2, p1_Type1, void.class); // [A3]
- findConstructorExpectingIAE(lookup2, q1_Type1, void.class); // [A3]
-
- /**
- * Teleport from MethodHandles.publicLookup() to lookup class in m1
- * has no module access [A0]
- * can access public types in packages exported by m1, m2 and java.base [A1]
- * cannot access public types is non-exported packages [A2]
- */
- lookup2 = lookup.in(p1_Type1);
- assertTrue((lookup2.lookupModes() & MODULE) == 0); // [A0]
- findConstructor(lookup2, p1_Type1, void.class); // [A1]
- findConstructor(lookup2, q1_Type1, void.class); // [A1]
- findConstructor(lookup2, Object.class, void.class); // [A1]
- findConstructorExpectingIAE(lookup, p2_Type2, void.class); // [A2]
- findConstructorExpectingIAE(lookup, q2_Type2, void.class); // [A2]
- findConstructorExpectingIAE(lookup2, x500NameClass, void.class, String.class); // [A2]
-
- /**
- * Teleport from MethodHandles.publicLookup() to lookup class in m2
- * has no module access [A0]
- * can access public types in packages exported by m2 and java.base [A1]
- * cannot access public types is non-exported packages or modules that m2 does
- * not read [A2]
- */
- lookup2 = lookup.in(q1_Type1);
- assertTrue((lookup2.lookupModes() & MODULE) == 0); // [A0]
- findConstructor(lookup2, q1_Type1, void.class); // [A1]
- findConstructor(lookup2, Object.class, void.class); // [A1]
- findConstructorExpectingIAE(lookup2, p1_Type1, void.class); // [A2]
- findConstructorExpectingIAE(lookup, q2_Type2, void.class); // [A2]
- findConstructorExpectingIAE(lookup2, x500NameClass, void.class, String.class); // [A2]
-
- /**
- * Teleport from MethodHandles.publicLookup() to lookup class that is not
- * in an exported package, should get no access [A0]
- */
- lookup2 = lookup.in(p2_Type2);
- assertTrue(lookup2.lookupModes() == 0); // [A0]
- findConstructorExpectingIAE(lookup, q2_Type2, void.class); // [A0]
- }
-
- /**
- * Invokes Lookup findConstructor with a method type constructored from the
- * given return and parameter types, expecting IllegalAccessException to be
- * thrown.
- */
- static MethodHandle findConstructorExpectingIAE(Lookup lookup,
- Class> clazz,
- Class> rtype,
- Class>... ptypes) throws Exception {
- try {
- findConstructor(lookup, clazz, rtype, ptypes);
- throw new RuntimeException("IllegalAccessError expected");
- } catch (IllegalAccessException expected) {
- return null;
- }
- }
-
- /**
- * Invokes Lookup findConstructor with a method type constructored from the
- * given return and parameter types.
- */
- static MethodHandle findConstructor(Lookup lookup,
- Class> clazz,
- Class> rtype,
- Class>... ptypes) throws Exception {
- MethodType mt = MethodType.methodType(rtype, ptypes);
- return lookup.findConstructor(clazz, mt);
- }
-
- static void assertTrue(boolean condition) {
- if (!condition)
- throw new RuntimeException();
- }
-
-}
diff --git a/jdk/test/java/lang/module/AutomaticModulesTest.java b/jdk/test/java/lang/module/AutomaticModulesTest.java
index 07d25b9be85..1c020c309f2 100644
--- a/jdk/test/java/lang/module/AutomaticModulesTest.java
+++ b/jdk/test/java/lang/module/AutomaticModulesTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -33,10 +33,10 @@ import java.io.IOException;
import java.lang.module.Configuration;
import java.lang.module.FindException;
import java.lang.module.ModuleDescriptor;
-import java.lang.module.ModuleDescriptor.Exports;
import java.lang.module.ModuleDescriptor.Requires.Modifier;
import java.lang.module.ModuleFinder;
import java.lang.module.ModuleReference;
+import java.lang.module.ResolutionException;
import java.lang.module.ResolvedModule;
import java.lang.reflect.Layer;
import java.lang.reflect.Module;
@@ -137,6 +137,7 @@ public class AutomaticModulesTest {
assertTrue(mref.isPresent(), mn + " not found");
ModuleDescriptor descriptor = mref.get().descriptor();
+ assertTrue(descriptor.isAutomatic());
assertEquals(descriptor.name(), mn);
if (vs == null) {
assertFalse(descriptor.version().isPresent());
@@ -175,17 +176,14 @@ public class AutomaticModulesTest {
assertTrue(mref.isPresent(), "m not found");
ModuleDescriptor descriptor = mref.get().descriptor();
+ assertTrue(descriptor.isAutomatic());
assertTrue(descriptor.packages().size() == 2);
assertTrue(descriptor.packages().contains("p"));
assertTrue(descriptor.packages().contains("q"));
- Set exports = descriptor.exports().stream()
- .map(Exports::source)
- .collect(Collectors.toSet());
- assertTrue(exports.size() == 2);
- assertTrue(exports.contains("p"));
- assertTrue(exports.contains("q"));
+ assertTrue(descriptor.exports().isEmpty());
+ assertTrue(descriptor.opens().isEmpty());
}
/**
@@ -201,15 +199,13 @@ public class AutomaticModulesTest {
assertTrue(mref.isPresent(), "m not found");
ModuleDescriptor descriptor = mref.get().descriptor();
+ assertTrue(descriptor.isAutomatic());
assertTrue(descriptor.packages().size() == 1);
assertTrue(descriptor.packages().contains("p"));
- Set exports = descriptor.exports().stream()
- .map(Exports::source)
- .collect(Collectors.toSet());
- assertTrue(exports.size() == 1);
- assertTrue(exports.contains("p"));
+ assertTrue(descriptor.exports().isEmpty());
+ assertTrue(descriptor.opens().isEmpty());
}
/**
@@ -229,10 +225,10 @@ public class AutomaticModulesTest {
assertTrue(mref.isPresent(), "m not found");
ModuleDescriptor descriptor = mref.get().descriptor();
+ assertTrue(descriptor.isAutomatic());
- assertTrue(descriptor.packages().size() == 2);
+ assertTrue(descriptor.packages().size() == 1);
assertTrue(descriptor.packages().contains("p"));
- assertTrue(descriptor.packages().contains("p.resources"));
}
/**
@@ -254,9 +250,17 @@ public class AutomaticModulesTest {
String provider = "p.S1";
Path tmpdir = Files.createTempDirectory(USER_DIR, "tmp");
+
+ // provider class
+ Path providerClass = tmpdir.resolve(provider.replace('.', '/') + ".class");
+ Files.createDirectories(providerClass.getParent());
+ Files.createFile(providerClass);
+
+ // services configuration file
Path services = tmpdir.resolve("META-INF").resolve("services");
Files.createDirectories(services);
Files.write(services.resolve(service), Set.of(provider));
+
Path dir = Files.createTempDirectory(USER_DIR, "mods");
JarUtils.createJarFile(dir.resolve("m.jar"), tmpdir);
@@ -314,7 +318,7 @@ public class AutomaticModulesTest {
// service type provider type
{ "p.S", "-" },
- { "p.S", ".S1" },
+ { "p.S", "p..S1" },
{ "p.S", "S1." },
};
}
@@ -324,13 +328,41 @@ public class AutomaticModulesTest {
* values or names.
*/
@Test(dataProvider = "badproviders", expectedExceptions = FindException.class)
- public void testBadProvideNames(String service, String provider)
+ public void testBadProviderNames(String service, String provider)
throws IOException
{
Path tmpdir = Files.createTempDirectory(USER_DIR, "tmp");
+
+ // provider class
+ Path providerClass = tmpdir.resolve(provider.replace('.', '/') + ".class");
+ Files.createDirectories(providerClass.getParent());
+ Files.createFile(providerClass);
+
+ // services configuration file
Path services = tmpdir.resolve("META-INF").resolve("services");
Files.createDirectories(services);
Files.write(services.resolve(service), Set.of(provider));
+
+ Path dir = Files.createTempDirectory(USER_DIR, "mods");
+ JarUtils.createJarFile(dir.resolve("m.jar"), tmpdir);
+
+ // should throw FindException
+ ModuleFinder.of(dir).findAll();
+ }
+
+ /**
+ * Test JAR file with META-INF/services configuration file listing a
+ * provider that is not in the module.
+ */
+ @Test(expectedExceptions = FindException.class)
+ public void testMissingProviderPackage() throws IOException {
+ Path tmpdir = Files.createTempDirectory(USER_DIR, "tmp");
+
+ // services configuration file
+ Path services = tmpdir.resolve("META-INF").resolve("services");
+ Files.createDirectories(services);
+ Files.write(services.resolve("p.S"), Set.of("q.P"));
+
Path dir = Files.createTempDirectory(USER_DIR, "mods");
JarUtils.createJarFile(dir.resolve("m.jar"), tmpdir);
@@ -352,7 +384,8 @@ public class AutomaticModulesTest {
attrs.put(Attributes.Name.MAIN_CLASS, mainClass);
Path dir = Files.createTempDirectory(USER_DIR, "mods");
- createDummyJarFile(dir.resolve("m.jar"), man);
+ String entry = mainClass.replace('.', '/') + ".class";
+ createDummyJarFile(dir.resolve("m.jar"), man, entry);
ModuleFinder finder = ModuleFinder.of(dir);
@@ -366,20 +399,21 @@ public class AutomaticModulesTest {
}
- // Main-Class files that do not map to a legal Java identifier
+ // Main-Class files that do not map to a legal qualified type name
@DataProvider(name = "badmainclass")
public Object[][] createBadMainClass() {
return new Object[][]{
+ { "Main", null },
+ { "p..Main", null },
{ "p-.Main", null },
- { ".Main", null }
};
}
/**
- * Test that a JAR file with a Main-Class attribute that is not a valid
- * Java identifier
+ * Test that a JAR file with a Main-Class attribute that is not a qualified
+ * type name.
*/
@Test(dataProvider = "badmainclass", expectedExceptions = FindException.class)
public void testBadMainClass(String mainClass, String ignore) throws IOException {
@@ -388,6 +422,24 @@ public class AutomaticModulesTest {
attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0");
attrs.put(Attributes.Name.MAIN_CLASS, mainClass);
+ Path dir = Files.createTempDirectory(USER_DIR, "mods");
+ String entry = mainClass.replace('.', '/') + ".class";
+ createDummyJarFile(dir.resolve("m.jar"), man, entry);
+
+ // should throw FindException
+ ModuleFinder.of(dir).findAll();
+ }
+
+ /**
+ * Test that a JAR file with a Main-Class attribute that is not in the module
+ */
+ @Test(expectedExceptions = FindException.class)
+ public void testMissingMainClassPackage() throws IOException {
+ Manifest man = new Manifest();
+ Attributes attrs = man.getMainAttributes();
+ attrs.put(Attributes.Name.MANIFEST_VERSION, "1.0.0");
+ attrs.put(Attributes.Name.MAIN_CLASS, "p.Main");
+
Path dir = Files.createTempDirectory(USER_DIR, "mods");
createDummyJarFile(dir.resolve("m.jar"), man);
@@ -405,7 +457,7 @@ public class AutomaticModulesTest {
*/
public void testConfiguration1() throws Exception {
ModuleDescriptor descriptor1
- = ModuleDescriptor.module("a")
+ = ModuleDescriptor.newModule("a")
.requires("b")
.requires("c")
.requires("java.base")
@@ -465,13 +517,13 @@ public class AutomaticModulesTest {
*/
public void testInConfiguration2() throws IOException {
ModuleDescriptor descriptor1
- = ModuleDescriptor.module("a")
+ = ModuleDescriptor.newModule("a")
.requires("b")
.requires("java.base")
.build();
ModuleDescriptor descriptor2
- = ModuleDescriptor.module("b")
+ = ModuleDescriptor.newModule("b")
.requires("c")
.requires("java.base")
.build();
@@ -538,13 +590,13 @@ public class AutomaticModulesTest {
*/
public void testInConfiguration3() throws IOException {
ModuleDescriptor descriptor1
- = ModuleDescriptor.module("a")
+ = ModuleDescriptor.newModule("a")
.requires("b")
.requires("java.base")
.build();
ModuleDescriptor descriptor2
- = ModuleDescriptor.module("b")
+ = ModuleDescriptor.newModule("b")
.requires(Set.of(Modifier.TRANSITIVE), "c")
.requires("java.base")
.build();
@@ -608,12 +660,68 @@ public class AutomaticModulesTest {
}
+ /**
+ * Basic test of a configuration created with automatic modules
+ * a requires b* and c*
+ * b* contains p
+ * c* contains p
+ */
+ @Test(expectedExceptions = { ResolutionException.class })
+ public void testDuplicateSuppliers1() throws IOException {
+ ModuleDescriptor descriptor
+ = ModuleDescriptor.newModule("a")
+ .requires("b")
+ .requires("c")
+ .build();
+
+ // c and d are automatic modules with the same package
+ Path dir = Files.createTempDirectory(USER_DIR, "mods");
+ createDummyJarFile(dir.resolve("b.jar"), "p/T.class");
+ createDummyJarFile(dir.resolve("c.jar"), "p/T.class");
+
+ // module finder locates 'a' and the modules in the directory
+ ModuleFinder finder
+ = ModuleFinder.compose(ModuleUtils.finderOf(descriptor),
+ ModuleFinder.of(dir));
+
+ Configuration parent = Layer.boot().configuration();
+ resolve(parent, finder, "a");
+ }
+
+
+ /**
+ * Basic test of a configuration created with automatic modules
+ * a contains p, requires b*
+ * b* contains p
+ */
+ @Test(expectedExceptions = { ResolutionException.class })
+ public void testDuplicateSuppliers2() throws IOException {
+ ModuleDescriptor descriptor
+ = ModuleDescriptor.newModule("a")
+ .packages(Set.of("p"))
+ .requires("b")
+ .build();
+
+ // c and d are automatic modules with the same package
+ Path dir = Files.createTempDirectory(USER_DIR, "mods");
+ createDummyJarFile(dir.resolve("b.jar"), "p/T.class");
+
+ // module finder locates 'a' and the modules in the directory
+ ModuleFinder finder
+ = ModuleFinder.compose(ModuleUtils.finderOf(descriptor),
+ ModuleFinder.of(dir));
+
+ Configuration parent = Layer.boot().configuration();
+ resolve(parent, finder, "a");
+ }
+
+
/**
* Basic test of Layer containing automatic modules
*/
public void testInLayer() throws IOException {
ModuleDescriptor descriptor
- = ModuleDescriptor.module("a")
+ = ModuleDescriptor.newModule("a")
.requires("b")
.requires("c")
.build();
@@ -664,7 +772,7 @@ public class AutomaticModulesTest {
// test miscellaneous methods
assertTrue(m.isAutomatic());
- assertFalse(m.isSynthetic());
+ assertFalse(m.modifiers().contains(ModuleDescriptor.Modifier.SYNTHETIC));
assertFalse(m.osName().isPresent());
assertFalse(m.osArch().isPresent());
assertFalse(m.osVersion().isPresent());
@@ -672,12 +780,12 @@ public class AutomaticModulesTest {
/**
- * Invokes parent.resolveRequires to resolve the given root modules.
+ * Invokes parent.resolve to resolve the given root modules.
*/
static Configuration resolve(Configuration parent,
ModuleFinder finder,
String... roots) {
- return parent.resolveRequires(finder, ModuleFinder.of(), Set.of(roots));
+ return parent.resolve(finder, ModuleFinder.of(), Set.of(roots));
}
/**
diff --git a/jdk/test/java/lang/module/ConfigurationTest.java b/jdk/test/java/lang/module/ConfigurationTest.java
index 7ae867217c6..28f414736b1 100644
--- a/jdk/test/java/lang/module/ConfigurationTest.java
+++ b/jdk/test/java/lang/module/ConfigurationTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,23 +24,26 @@
/**
* @test
* @library /lib/testlibrary
+ * @modules java.base/jdk.internal.misc
* @build ConfigurationTest ModuleUtils
* @run testng ConfigurationTest
* @summary Basic tests for java.lang.module.Configuration
*/
import java.lang.module.Configuration;
+import java.lang.module.FindException;
import java.lang.module.ModuleDescriptor;
+import java.lang.module.ModuleDescriptor.Builder;
import java.lang.module.ModuleDescriptor.Requires;
import java.lang.module.ModuleFinder;
import java.lang.module.ResolutionException;
import java.lang.module.ResolvedModule;
import java.lang.reflect.Layer;
-import java.util.HashSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
+import jdk.internal.misc.SharedSecrets;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
@@ -48,30 +51,35 @@ import static org.testng.Assert.*;
@Test
public class ConfigurationTest {
+ /**
+ * Creates a "non-strict" builder for building a module. This allows the
+ * test the create ModuleDescriptor objects that do not require java.base.
+ */
+ private static ModuleDescriptor.Builder newBuilder(String mn) {
+ return SharedSecrets.getJavaLangModuleAccess()
+ .newModuleBuilder(mn, false, Set.of());
+ }
/**
* Basic test of resolver
* m1 requires m2, m2 requires m3
*/
public void testBasic() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m3")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.build();
ModuleFinder finder
= ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 3);
@@ -110,24 +118,21 @@ public class ConfigurationTest {
*/
public void testRequiresTransitive1() {
// m1 requires m2, m2 requires transitive m3
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m3")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.build();
ModuleFinder finder
= ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 3);
@@ -167,18 +172,16 @@ public class ConfigurationTest {
// cf1: m1 and m2, m2 requires transitive m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m2");
+ Configuration cf1 = resolve(finder1, "m2");
assertTrue(cf1.modules().size() == 2);
assertTrue(cf1.findModule("m1").isPresent());
@@ -196,14 +199,13 @@ public class ConfigurationTest {
// cf2: m3, m3 requires m2
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m3");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m1").isPresent()); // in parent
@@ -231,13 +233,11 @@ public class ConfigurationTest {
// cf1: m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder1, "m1");
+ Configuration cf1 = resolve(finder1, "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
@@ -250,19 +250,17 @@ public class ConfigurationTest {
// cf2: m2, m3: m2 requires transitive m1, m3 requires m2
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2, descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m3");
assertTrue(cf2.modules().size() == 2);
assertTrue(cf2.findModule("m1").isPresent()); // in parent
@@ -297,13 +295,11 @@ public class ConfigurationTest {
// cf1: m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder1, "m1");
+ Configuration cf1 = resolve(finder1, "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
@@ -316,14 +312,13 @@ public class ConfigurationTest {
// cf2: m2 requires transitive m1
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
- Configuration cf2 = resolveRequires(cf1, finder2, "m2");
+ Configuration cf2 = resolve(cf1, finder2, "m2");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m1").isPresent()); // in parent
@@ -340,14 +335,13 @@ public class ConfigurationTest {
// cf3: m3 requires m2
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder3 = ModuleUtils.finderOf(descriptor3);
- Configuration cf3 = resolveRequires(cf2, finder3, "m3");
+ Configuration cf3 = resolve(cf2, finder3, "m3");
assertTrue(cf3.modules().size() == 1);
assertTrue(cf3.findModule("m1").isPresent()); // in parent
@@ -376,18 +370,16 @@ public class ConfigurationTest {
// cf1: m1, m2 requires transitive m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m2");
+ Configuration cf1 = resolve(finder1, "m2");
assertTrue(cf1.modules().size() == 2);
assertTrue(cf1.findModule("m1").isPresent());
@@ -408,20 +400,18 @@ public class ConfigurationTest {
// cf2: m3 requires transitive m2, m4 requires m3
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m2")
.build();
- ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4")
+ ModuleDescriptor descriptor4 = newBuilder("m4")
.requires("m3")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3", "m4");
+ Configuration cf2 = resolve(cf1, finder2, "m3", "m4");
assertTrue(cf2.modules().size() == 2);
assertTrue(cf2.findModule("m1").isPresent()); // in parent
@@ -456,28 +446,24 @@ public class ConfigurationTest {
* - Configuration cf3(cf1,cf2): m4 requires m2, m3
*/
public void testRequiresTransitive6() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
- ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4")
+ ModuleDescriptor descriptor4 = newBuilder("m4")
.requires("m2")
.requires("m3")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m2");
+ Configuration cf1 = resolve(finder1, "m2");
assertTrue(cf1.modules().size() == 2);
assertTrue(cf1.findModule("m1").isPresent());
assertTrue(cf1.findModule("m2").isPresent());
@@ -485,7 +471,7 @@ public class ConfigurationTest {
assertTrue(cf1.parents().get(0) == Configuration.empty());
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor3);
- Configuration cf2 = resolveRequires(finder2, "m3");
+ Configuration cf2 = resolve(finder2, "m3");
assertTrue(cf2.modules().size() == 2);
assertTrue(cf2.findModule("m3").isPresent());
assertTrue(cf2.findModule("m1").isPresent());
@@ -493,7 +479,7 @@ public class ConfigurationTest {
assertTrue(cf2.parents().get(0) == Configuration.empty());
ModuleFinder finder3 = ModuleUtils.finderOf(descriptor4);
- Configuration cf3 = Configuration.resolveRequires(finder3,
+ Configuration cf3 = Configuration.resolve(finder3,
List.of(cf1, cf2),
ModuleFinder.of(),
Set.of("m4"));
@@ -522,14 +508,13 @@ public class ConfigurationTest {
* resolve m1
*/
public void testRequiresStatic1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires(Set.of(Requires.Modifier.STATIC), "m2")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 1);
@@ -545,18 +530,16 @@ public class ConfigurationTest {
* resolve m1
*/
public void testRequiresStatic2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires(Set.of(Requires.Modifier.STATIC), "m2")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 1);
@@ -572,18 +555,16 @@ public class ConfigurationTest {
* resolve m1, m2
*/
public void testRequiresStatic3() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires(Set.of(Requires.Modifier.STATIC), "m2")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf = resolveRequires(finder, "m1", "m2");
+ Configuration cf = resolve(finder, "m1", "m2");
assertTrue(cf.modules().size() == 2);
@@ -604,25 +585,22 @@ public class ConfigurationTest {
* m3
*/
public void testRequiresStatic4() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.requires("m3")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.STATIC), "m3")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.build();
ModuleFinder finder
- = ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
+ = ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 3);
@@ -648,31 +626,28 @@ public class ConfigurationTest {
* - Configuration cf2: m3 requires m1, requires static m2
*/
public void testRequiresStatic5() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m1", "m2");
+ Configuration cf1 = resolve(finder1, "m1", "m2");
assertTrue(cf1.modules().size() == 2);
assertTrue(cf1.findModule("m1").isPresent());
assertTrue(cf1.findModule("m2").isPresent());
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m1")
.requires(Set.of(Requires.Modifier.STATIC), "m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m3");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m3").isPresent());
@@ -694,26 +669,24 @@ public class ConfigurationTest {
* - Configuration cf2: m3 requires m1, requires static m2
*/
public void testRequiresStatic6() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder1, "m1");
+ Configuration cf1 = resolve(finder1, "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m1")
.requires(Set.of(Requires.Modifier.STATIC), "m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m3");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m3").isPresent());
@@ -735,21 +708,19 @@ public class ConfigurationTest {
public void testRequiresStatic7() {
ModuleDescriptor descriptor1 = null; // not observable
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE,
Requires.Modifier.STATIC),
"m1")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor2, descriptor3);
- Configuration cf = resolveRequires(finder, "m3");
+ Configuration cf = resolve(finder, "m3");
assertTrue(cf.modules().size() == 2);
assertTrue(cf.findModule("m2").isPresent());
@@ -770,8 +741,7 @@ public class ConfigurationTest {
public void testRequiresStatic8() {
ModuleDescriptor descriptor1 = null; // not observable
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE,
Requires.Modifier.STATIC),
"m1")
@@ -779,21 +749,20 @@ public class ConfigurationTest {
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m2");
+ Configuration cf1 = resolve(finder1, "m2");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m2").isPresent());
ResolvedModule m2 = cf1.findModule("m2").get();
assertTrue(m2.reads().isEmpty());
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m3");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m3").isPresent());
@@ -810,22 +779,19 @@ public class ConfigurationTest {
*/
public void testServiceBinding1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.exports("p")
.uses("p.S")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf = resolveRequiresAndUses(finder, "m1");
+ Configuration cf = resolveAndBind(finder, "m1");
assertTrue(cf.modules().size() == 2);
assertTrue(cf.findModule("m1").isPresent());
@@ -853,31 +819,26 @@ public class ConfigurationTest {
*/
public void testServiceBinding2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.exports("p")
.uses("p.S1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
.uses("p.S2")
- .contains("q")
- .provides("p.S1", "q.Service1Impl")
+ .provides("p.S1", List.of("q.Service1Impl"))
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m1")
- .contains("q")
- .provides("p.S2", "q.Service2Impl")
+ .provides("p.S2", List.of("q.Service2Impl"))
.build();
ModuleFinder finder
= ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
- Configuration cf = resolveRequiresAndUses(finder, "m1");
+ Configuration cf = resolveAndBind(finder, "m1");
assertTrue(cf.modules().size() == 3);
assertTrue(cf.findModule("m1").isPresent());
@@ -912,29 +873,26 @@ public class ConfigurationTest {
*/
public void testServiceBindingWithConfigurations1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.exports("p")
.uses("p.S")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder1, "m1");
+ Configuration cf1 = resolve(finder1, "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
- Configuration cf2 = resolveRequiresAndUses(cf1, finder2); // no roots
+ Configuration cf2 = resolveAndBind(cf1, finder2); // no roots
assertTrue(cf2.parents().size() == 1);
assertTrue(cf2.parents().get(0) == cf1);
@@ -961,47 +919,39 @@ public class ConfigurationTest {
*/
public void testServiceBindingWithConfigurations2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.exports("p")
.uses("p.S")
- .contains("p1")
- .provides("p.S", "p1.ServiceImpl")
+ .provides("p.S", List.of("p1.ServiceImpl"))
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
- .contains("p2")
- .provides("p.S", "p2.ServiceImpl")
+ .provides("p.S", List.of("p2.ServiceImpl"))
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequiresAndUses(finder1, "m1");
+ Configuration cf1 = resolveAndBind(finder1, "m1");
assertTrue(cf1.modules().size() == 2);
assertTrue(cf1.findModule("m1").isPresent());
assertTrue(cf1.findModule("m2").isPresent());
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m1")
- .contains("p3")
- .provides("p.S", "p3.ServiceImpl")
+ .provides("p.S", List.of("p3.ServiceImpl"))
.build();
- ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4")
+ ModuleDescriptor descriptor4 = newBuilder("m4")
.requires("m1")
- .contains("p4")
- .provides("p.S", "p4.ServiceImpl")
+ .provides("p.S", List.of("p4.ServiceImpl"))
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4);
- Configuration cf2 = resolveRequiresAndUses(cf1, finder2); // no roots
+ Configuration cf2 = resolveAndBind(cf1, finder2); // no roots
assertTrue(cf2.parents().size() == 1);
assertTrue(cf2.parents().get(0) == cf1);
@@ -1037,22 +987,19 @@ public class ConfigurationTest {
*/
public void testServiceBindingWithConfigurations3() {
- ModuleDescriptor service
- = ModuleDescriptor.module("s")
+ ModuleDescriptor service = newBuilder("s")
.exports("p")
.build();
- ModuleDescriptor provider_v1
- = ModuleDescriptor.module("p")
+ ModuleDescriptor provider_v1 = newBuilder("p")
.version("1.0")
.requires("s")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(service, provider_v1);
- Configuration cf1 = resolveRequires(finder1, "p");
+ Configuration cf1 = resolve(finder1, "p");
assertTrue(cf1.modules().size() == 2);
assertTrue(cf1.findModule("s").isPresent());
@@ -1063,18 +1010,15 @@ public class ConfigurationTest {
assertEquals(p.reference().descriptor(), provider_v1);
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("s")
.uses("p.S")
.build();
- ModuleDescriptor provider_v2
- = ModuleDescriptor.module("p")
+ ModuleDescriptor provider_v2 = newBuilder("p")
.version("2.0")
.requires("s")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, provider_v2);
@@ -1082,7 +1026,7 @@ public class ConfigurationTest {
// finder2 is the before ModuleFinder and so p@2.0 should be located
- Configuration cf2 = resolveRequiresAndUses(cf1, finder2, "m1");
+ Configuration cf2 = resolveAndBind(cf1, finder2, "m1");
assertTrue(cf2.parents().size() == 1);
assertTrue(cf2.parents().get(0) == cf1);
@@ -1097,7 +1041,7 @@ public class ConfigurationTest {
// finder2 is the after ModuleFinder and so p@2.0 should not be located
// as module p is in parent configuration.
- cf2 = resolveRequiresAndUses(cf1, ModuleFinder.of(), finder2, "m1");
+ cf2 = resolveAndBind(cf1, ModuleFinder.of(), finder2, "m1");
assertTrue(cf2.parents().size() == 1);
assertTrue(cf2.parents().get(0) == cf1);
@@ -1117,25 +1061,22 @@ public class ConfigurationTest {
*/
public void testWithTwoFinders1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.build();
- ModuleDescriptor descriptor2_v1
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2_v1 = newBuilder("m2")
.version("1.0")
.build();
- ModuleDescriptor descriptor2_v2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2_v2 = newBuilder("m2")
.version("2.0")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor2_v1);
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor2_v2);
- Configuration cf = resolveRequires(finder1, finder2, "m1");
+ Configuration cf = resolve(finder1, finder2, "m1");
assertTrue(cf.modules().size() == 2);
assertTrue(cf.findModule("m1").isPresent());
@@ -1157,30 +1098,25 @@ public class ConfigurationTest {
*/
public void testWithTwoFinders2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.exports("p")
.uses("p.S")
.build();
- ModuleDescriptor descriptor2_v1
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2_v1 = newBuilder("m2")
.requires("m1")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
- ModuleDescriptor descriptor2_v2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2_v2 = newBuilder("m2")
.requires("m1")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2_v1);
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2_v2);
- Configuration cf = resolveRequiresAndUses(finder1, finder2, "m1");
+ Configuration cf = resolveAndBind(finder1, finder2, "m1");
assertTrue(cf.modules().size() == 2);
assertTrue(cf.findModule("m1").isPresent());
@@ -1200,18 +1136,17 @@ public class ConfigurationTest {
*/
public void testResolvedInParent1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder, "m1");
+ Configuration cf1 = resolve(finder, "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
- Configuration cf2 = resolveRequires(cf1, finder, "m1");
+ Configuration cf2 = resolve(cf1, finder, "m1");
assertTrue(cf2.modules().size() == 1);
}
@@ -1223,26 +1158,23 @@ public class ConfigurationTest {
*/
public void testResolvedInParent2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder1, "m1");
+ Configuration cf1 = resolve(finder1, "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
- Configuration cf2 = resolveRequires(cf1, ModuleFinder.of(), finder2, "m2");
+ Configuration cf2 = resolve(cf1, ModuleFinder.of(), finder2, "m2");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m2").isPresent());
@@ -1268,29 +1200,28 @@ public class ConfigurationTest {
public void testResolvedInMultipleParents1() {
// Configuration cf1: m1
- ModuleDescriptor descriptor1 = ModuleDescriptor.module("m1").build();
- Configuration cf1 = resolveRequires(ModuleUtils.finderOf(descriptor1), "m1");
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
+ Configuration cf1 = resolve(ModuleUtils.finderOf(descriptor1), "m1");
assertEquals(cf1.parents(), List.of(Configuration.empty()));
assertTrue(cf1.findModule("m1").isPresent());
ResolvedModule m1 = cf1.findModule("m1").get();
assertTrue(m1.configuration() == cf1);
// Configuration cf2: m2
- ModuleDescriptor descriptor2 = ModuleDescriptor.module("m2").build();
- Configuration cf2 = resolveRequires(ModuleUtils.finderOf(descriptor2), "m2");
+ ModuleDescriptor descriptor2 = newBuilder("m2").build();
+ Configuration cf2 = resolve(ModuleUtils.finderOf(descriptor2), "m2");
assertEquals(cf2.parents(), List.of(Configuration.empty()));
assertTrue(cf2.findModule("m2").isPresent());
ResolvedModule m2 = cf2.findModule("m2").get();
assertTrue(m2.configuration() == cf2);
// Configuration cf3(cf1,cf2): m3 requires m1 and m2
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m1")
.requires("m2")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor3);
- Configuration cf3 = Configuration.resolveRequires(
+ Configuration cf3 = Configuration.resolve(
finder,
List.of(cf1, cf2), // parents
ModuleFinder.of(),
@@ -1319,19 +1250,18 @@ public class ConfigurationTest {
*/
public void testResolvedInMultipleParents2() {
// Configuration cf1: m1
- ModuleDescriptor descriptor1 = ModuleDescriptor.module("m1").build();
- Configuration cf1 = resolveRequires(ModuleUtils.finderOf(descriptor1), "m1");
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
+ Configuration cf1 = resolve(ModuleUtils.finderOf(descriptor1), "m1");
assertEquals(cf1.parents(), List.of(Configuration.empty()));
assertTrue(cf1.findModule("m1").isPresent());
ResolvedModule m1 = cf1.findModule("m1").get();
assertTrue(m1.configuration() == cf1);
// Configuration cf2(cf1): m2 requires m1
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
.build();
- Configuration cf2 = Configuration.resolveRequires(
+ Configuration cf2 = Configuration.resolve(
ModuleUtils.finderOf(descriptor2),
List.of(cf1), // parents
ModuleFinder.of(),
@@ -1342,11 +1272,10 @@ public class ConfigurationTest {
assertTrue(m2.configuration() == cf2);
// Configuration cf3(cf1): m3 requires m1
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m1")
.build();
- Configuration cf3 = Configuration.resolveRequires(
+ Configuration cf3 = Configuration.resolve(
ModuleUtils.finderOf(descriptor3),
List.of(cf1), // parents
ModuleFinder.of(),
@@ -1357,13 +1286,12 @@ public class ConfigurationTest {
assertTrue(m3.configuration() == cf3);
// Configuration cf4(cf2,cf3): m4 requires m1,m2,m3
- ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4")
+ ModuleDescriptor descriptor4 = newBuilder("m4")
.requires("m1")
.requires("m2")
.requires("m3")
.build();
- Configuration cf4 = Configuration.resolveRequires(
+ Configuration cf4 = Configuration.resolve(
ModuleUtils.finderOf(descriptor4),
List.of(cf2, cf3), // parents
ModuleFinder.of(),
@@ -1395,35 +1323,34 @@ public class ConfigurationTest {
ModuleDescriptor descriptor1, descriptor2, descriptor3;
// Configuration cf1: m1@1
- descriptor1 = ModuleDescriptor.module("m1").version("1").build();
- Configuration cf1 = resolveRequires(ModuleUtils.finderOf(descriptor1), "m1");
+ descriptor1 = newBuilder("m1").version("1").build();
+ Configuration cf1 = resolve(ModuleUtils.finderOf(descriptor1), "m1");
assertEquals(cf1.parents(), List.of(Configuration.empty()));
// Configuration cf2: m1@2, m2@2
- descriptor1 = ModuleDescriptor.module("m1").version("2").build();
- descriptor2 = ModuleDescriptor.module("m2").version("2").build();
- Configuration cf2 = resolveRequires(
+ descriptor1 = newBuilder("m1").version("2").build();
+ descriptor2 = newBuilder("m2").version("2").build();
+ Configuration cf2 = resolve(
ModuleUtils.finderOf(descriptor1, descriptor2),
"m1", "m2");
assertEquals(cf2.parents(), List.of(Configuration.empty()));
// Configuration cf3: m1@3, m2@3, m3@3
- descriptor1 = ModuleDescriptor.module("m1").version("3").build();
- descriptor2 = ModuleDescriptor.module("m2").version("3").build();
- descriptor3 = ModuleDescriptor.module("m3").version("3").build();
- Configuration cf3 = resolveRequires(
+ descriptor1 = newBuilder("m1").version("3").build();
+ descriptor2 = newBuilder("m2").version("3").build();
+ descriptor3 = newBuilder("m3").version("3").build();
+ Configuration cf3 = resolve(
ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3),
"m1", "m2", "m3");
assertEquals(cf3.parents(), List.of(Configuration.empty()));
// Configuration cf4(cf1,cf2,cf3): m4 requires m1,m2,m3
- ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4")
+ ModuleDescriptor descriptor4 = newBuilder("m4")
.requires("m1")
.requires("m2")
.requires("m3")
.build();
- Configuration cf4 = Configuration.resolveRequires(
+ Configuration cf4 = Configuration.resolve(
ModuleUtils.finderOf(descriptor4),
List.of(cf1, cf2, cf3), // parents
ModuleFinder.of(),
@@ -1470,17 +1397,15 @@ public class ConfigurationTest {
* configuration.
*/
public void testOverriding1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder, "m1");
+ Configuration cf1 = resolve(finder, "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
- Configuration cf2 = resolveRequires(cf1, finder, "m1");
+ Configuration cf2 = resolve(cf1, finder, "m1");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m1").isPresent());
}
@@ -1490,24 +1415,24 @@ public class ConfigurationTest {
* configuration.
*/
public void testOverriding2() {
- ModuleDescriptor descriptor1 = ModuleDescriptor.module("m1").build();
- Configuration cf1 = resolveRequires(ModuleUtils.finderOf(descriptor1), "m1");
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
+ Configuration cf1 = resolve(ModuleUtils.finderOf(descriptor1), "m1");
assertTrue(cf1.modules().size() == 1);
assertTrue(cf1.findModule("m1").isPresent());
- ModuleDescriptor descriptor2 = ModuleDescriptor.module("m2").build();
- Configuration cf2 = resolveRequires(ModuleUtils.finderOf(descriptor2), "m2");
+ ModuleDescriptor descriptor2 = newBuilder("m2").build();
+ Configuration cf2 = resolve(ModuleUtils.finderOf(descriptor2), "m2");
assertTrue(cf2.modules().size() == 1);
assertTrue(cf2.findModule("m2").isPresent());
- ModuleDescriptor descriptor3 = ModuleDescriptor.module("m3").build();
- Configuration cf3 = resolveRequires(ModuleUtils.finderOf(descriptor3), "m3");
+ ModuleDescriptor descriptor3 = newBuilder("m3").build();
+ Configuration cf3 = resolve(ModuleUtils.finderOf(descriptor3), "m3");
assertTrue(cf3.modules().size() == 1);
assertTrue(cf3.findModule("m3").isPresent());
// override m2, m1 and m3 should be found in parent configurations
ModuleFinder finder = ModuleUtils.finderOf(descriptor2);
- Configuration cf4 = Configuration.resolveRequires(
+ Configuration cf4 = Configuration.resolve(
finder,
List.of(cf1, cf2, cf3),
ModuleFinder.of(),
@@ -1530,18 +1455,16 @@ public class ConfigurationTest {
*/
public void testOverriding3() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m2");
+ Configuration cf1 = resolve(finder1, "m2");
assertTrue(cf1.modules().size() == 2);
assertTrue(cf1.findModule("m1").isPresent());
@@ -1549,14 +1472,13 @@ public class ConfigurationTest {
// cf2: m3 requires m2, m1
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor1, descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m1", "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m1", "m3");
assertTrue(cf2.parents().size() == 1);
assertTrue(cf2.parents().get(0) == cf1);
@@ -1585,64 +1507,58 @@ public class ConfigurationTest {
/**
* Root module not found
*/
- @Test(expectedExceptions = { ResolutionException.class })
+ @Test(expectedExceptions = { FindException.class })
public void testRootNotFound() {
- resolveRequires(ModuleFinder.of(), "m1");
+ resolve(ModuleFinder.of(), "m1");
}
/**
* Direct dependency not found
*/
- @Test(expectedExceptions = { ResolutionException.class })
+ @Test(expectedExceptions = { FindException.class })
public void testDirectDependencyNotFound() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1").requires("m2").build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").requires("m2").build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
- resolveRequires(finder, "m1");
+ resolve(finder, "m1");
}
/**
* Transitive dependency not found
*/
- @Test(expectedExceptions = { ResolutionException.class })
+ @Test(expectedExceptions = { FindException.class })
public void testTransitiveDependencyNotFound() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1").requires("m2").build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2").requires("m3").build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").requires("m2").build();
+ ModuleDescriptor descriptor2 = newBuilder("m2").requires("m3").build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
- resolveRequires(finder, "m1");
+ resolve(finder, "m1");
}
/**
* Service provider dependency not found
*/
- @Test(expectedExceptions = { ResolutionException.class })
+ @Test(expectedExceptions = { FindException.class })
public void testServiceProviderDependencyNotFound() {
// service provider dependency (on m3) not found
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.exports("p")
.uses("p.S")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
.requires("m3")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
// should throw ResolutionException because m3 is not found
- Configuration cf = resolveRequiresAndUses(finder, "m1");
+ Configuration cf = resolveAndBind(finder, "m1");
}
@@ -1651,15 +1567,12 @@ public class ConfigurationTest {
*/
@Test(expectedExceptions = { ResolutionException.class })
public void testSimpleCycle() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1").requires("m2").build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2").requires("m3").build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3").requires("m1").build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").requires("m2").build();
+ ModuleDescriptor descriptor2 = newBuilder("m2").requires("m3").build();
+ ModuleDescriptor descriptor3 = newBuilder("m3").requires("m1").build();
ModuleFinder finder
= ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
- resolveRequires(finder, "m1");
+ resolve(finder, "m1");
}
/**
@@ -1668,20 +1581,16 @@ public class ConfigurationTest {
@Test(expectedExceptions = { ResolutionException.class })
public void testCycleInProvider() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.exports("p")
.uses("p.S")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
.requires("m3")
- .contains("q")
- .provides("p.S", "q.T")
+ .provides("p.S", List.of("q.T"))
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
@@ -1689,7 +1598,7 @@ public class ConfigurationTest {
= ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
// should throw ResolutionException because of the m2 <--> m3 cycle
- resolveRequiresAndUses(finder, "m1");
+ resolveAndBind(finder, "m1");
}
@@ -1699,19 +1608,16 @@ public class ConfigurationTest {
@Test(expectedExceptions = { ResolutionException.class })
public void testPackageSuppliedByTwoOthers() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.requires("m3")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.exports("p")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.exports("p", Set.of("m1"))
.build();
@@ -1719,7 +1625,7 @@ public class ConfigurationTest {
= ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
// m2 and m3 export package p to module m1
- resolveRequires(finder, "m1");
+ resolve(finder, "m1");
}
@@ -1730,21 +1636,19 @@ public class ConfigurationTest {
@Test(expectedExceptions = { ResolutionException.class })
public void testPackageSuppliedBySelfAndOther() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
- .contains("p")
+ .packages(Set.of("p"))
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.exports("p")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
// m1 contains package p, module m2 exports package p to m1
- resolveRequires(finder, "m1");
+ resolve(finder, "m1");
}
@@ -1753,20 +1657,18 @@ public class ConfigurationTest {
* a module that also contains a package p.
*/
public void testContainsPackageInSelfAndOther() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
- .contains("p")
+ .packages(Set.of("p"))
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
- .contains("p")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
+ .packages(Set.of("p"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 2);
assertTrue(cf.findModule("m1").isPresent());
@@ -1787,8 +1689,7 @@ public class ConfigurationTest {
*/
@Test(expectedExceptions = { ResolutionException.class })
public void testExportSamePackageAsBootLayer() {
- ModuleDescriptor descriptor
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor = newBuilder("m1")
.requires("java.base")
.exports("java.lang")
.build();
@@ -1798,7 +1699,7 @@ public class ConfigurationTest {
Configuration bootConfiguration = Layer.boot().configuration();
// m1 contains package java.lang, java.base exports package java.lang to m1
- resolveRequires(bootConfiguration, finder, "m1");
+ resolve(bootConfiguration, finder, "m1");
}
@@ -1806,15 +1707,14 @@ public class ConfigurationTest {
* Test "uses p.S" where p is contained in the same module.
*/
public void testContainsService1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .contains("p")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
+ .packages(Set.of("p"))
.uses("p.S")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 1);
assertTrue(cf.findModule("m1").isPresent());
@@ -1826,13 +1726,11 @@ public class ConfigurationTest {
*/
@Test(expectedExceptions = { ResolutionException.class })
public void testContainsService2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .contains("p")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
+ .packages(Set.of("p"))
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
.uses("p.S")
.build();
@@ -1840,7 +1738,7 @@ public class ConfigurationTest {
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
// m2 does not read a module that exports p
- resolveRequires(finder, "m2");
+ resolve(finder, "m2");
}
@@ -1848,16 +1746,14 @@ public class ConfigurationTest {
* Test "provides p.S" where p is contained in the same module.
*/
public void testContainsService3() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .contains("p")
- .contains("q")
- .provides("p.S", "q.S1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
+ .packages(Set.of("p", "q"))
+ .provides("p.S", List.of("q.S1"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 1);
assertTrue(cf.findModule("m1").isPresent());
@@ -1869,22 +1765,19 @@ public class ConfigurationTest {
*/
@Test(expectedExceptions = { ResolutionException.class })
public void testContainsService4() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .contains("p")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
+ .packages(Set.of("p"))
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m1")
- .contains("q")
- .provides("p.S", "q.S1")
+ .provides("p.S", List.of("q.S1"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
// m2 does not read a module that exports p
- resolveRequires(finder, "m2");
+ resolve(finder, "m2");
}
@@ -1893,15 +1786,14 @@ public class ConfigurationTest {
*/
@Test(expectedExceptions = { ResolutionException.class })
public void testServiceTypePackageNotExported1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.uses("p.S")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
// m1 does not read a module that exports p
- resolveRequires(finder, "m1");
+ resolve(finder, "m1");
}
@@ -1910,40 +1802,14 @@ public class ConfigurationTest {
*/
@Test(expectedExceptions = { ResolutionException.class })
public void testServiceTypePackageNotExported2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .contains("q")
- .provides("p.S", "q.T")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
+ .provides("p.S", List.of("q.T"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
// m1 does not read a module that exports p
- resolveRequires(finder, "m1");
- }
-
-
- /**
- * Test "provides p.S with q.T" where q.T is not local
- */
- @Test(expectedExceptions = { ResolutionException.class })
- public void testProviderPackageNotLocal() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .exports("p")
- .exports("q")
- .build();
-
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
- .requires("m1")
- .provides("p.S", "q.T")
- .build();
-
- ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
-
- // q.T not in module m2
- resolveRequires(finder, "m2");
+ resolve(finder, "m1");
}
@@ -2007,34 +1873,17 @@ public class ConfigurationTest {
@Test(dataProvider = "platformmatch")
public void testPlatformMatch(String s1, String s2) {
- ModuleDescriptor.Builder builder
- = ModuleDescriptor.module("m1").requires("m2");
-
- String[] s = s1.split("-");
- if (!s[0].equals("*"))
- builder.osName(s[0]);
- if (!s[1].equals("*"))
- builder.osArch(s[1]);
- if (!s[2].equals("*"))
- builder.osVersion(s[2]);
-
+ Builder builder = newBuilder("m1").requires("m2");
+ addPlatformConstraints(builder, s1);
ModuleDescriptor descriptor1 = builder.build();
- builder = ModuleDescriptor.module("m2");
-
- s = s2.split("-");
- if (!s[0].equals("*"))
- builder.osName(s[0]);
- if (!s[1].equals("*"))
- builder.osArch(s[1]);
- if (!s[2].equals("*"))
- builder.osVersion(s[2]);
-
+ builder = newBuilder("m2");
+ addPlatformConstraints(builder, s2);
ModuleDescriptor descriptor2 = builder.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 2);
assertTrue(cf.findModule("m1").isPresent());
@@ -2046,7 +1895,7 @@ public class ConfigurationTest {
* platforms.
*/
@Test(dataProvider = "platformmismatch",
- expectedExceptions = ResolutionException.class )
+ expectedExceptions = FindException.class )
public void testPlatformMisMatch(String s1, String s2) {
testPlatformMatch(s1, s2);
}
@@ -2057,16 +1906,67 @@ public class ConfigurationTest {
@Test(expectedExceptions = { IllegalArgumentException.class })
public void testResolveRequiresWithNoParents() {
ModuleFinder empty = ModuleFinder.of();
- Configuration.resolveRequires(empty, List.of(), empty, Set.of());
+ Configuration.resolve(empty, List.of(), empty, Set.of());
}
@Test(expectedExceptions = { IllegalArgumentException.class })
public void testResolveRequiresAndUsesWithNoParents() {
ModuleFinder empty = ModuleFinder.of();
- Configuration.resolveRequiresAndUses(empty, List.of(), empty, Set.of());
+ Configuration.resolveAndBind(empty, List.of(), empty, Set.of());
}
+ // parents with modules for specific platforms
+
+ @Test(dataProvider = "platformmatch")
+ public void testResolveRequiresWithCompatibleParents(String s1, String s2) {
+ Builder builder = newBuilder("m1");
+ addPlatformConstraints(builder, s1);
+ ModuleDescriptor descriptor1 = builder.build();
+
+ builder = newBuilder("m2");
+ addPlatformConstraints(builder, s2);
+ ModuleDescriptor descriptor2 = builder.build();
+
+ ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
+ Configuration cf1 = resolve(finder1, "m1");
+
+ ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
+ Configuration cf2 = resolve(finder2, "m2");
+
+ Configuration cf3 = Configuration.resolve(ModuleFinder.of(),
+ List.of(cf1, cf2),
+ ModuleFinder.of(),
+ Set.of());
+ assertTrue(cf3.parents().size() == 2);
+ }
+
+ @Test(dataProvider = "platformmismatch",
+ expectedExceptions = IllegalArgumentException.class )
+ public void testResolveRequiresWithConflictingParents(String s1, String s2) {
+ Builder builder = newBuilder("m1");
+ addPlatformConstraints(builder, s1);
+ ModuleDescriptor descriptor1 = builder.build();
+
+ builder = newBuilder("m2");
+ addPlatformConstraints(builder, s2);
+ ModuleDescriptor descriptor2 = builder.build();
+
+ ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
+ Configuration cf1 = resolve(finder1, "m1");
+
+ ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
+ Configuration cf2 = resolve(finder2, "m2");
+
+ // should throw IAE
+ Configuration.resolve(ModuleFinder.of(),
+ List.of(cf1, cf2),
+ ModuleFinder.of(),
+ Set.of());
+ }
+
+
+
// null handling
// finder1, finder2, roots
@@ -2074,72 +1974,72 @@ public class ConfigurationTest {
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresWithNull1() {
- resolveRequires((ModuleFinder)null, ModuleFinder.of());
+ resolve((ModuleFinder)null, ModuleFinder.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresWithNull2() {
- resolveRequires(ModuleFinder.of(), (ModuleFinder)null);
+ resolve(ModuleFinder.of(), (ModuleFinder)null);
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresWithNull3() {
Configuration empty = Configuration.empty();
- Configuration.resolveRequires(null, List.of(empty), ModuleFinder.of(), Set.of());
+ Configuration.resolve(null, List.of(empty), ModuleFinder.of(), Set.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresWithNull4() {
ModuleFinder empty = ModuleFinder.of();
- Configuration.resolveRequires(empty, null, empty, Set.of());
+ Configuration.resolve(empty, null, empty, Set.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresWithNull5() {
Configuration cf = Layer.boot().configuration();
- Configuration.resolveRequires(ModuleFinder.of(), List.of(cf), null, Set.of());
+ Configuration.resolve(ModuleFinder.of(), List.of(cf), null, Set.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresWithNull6() {
ModuleFinder empty = ModuleFinder.of();
Configuration cf = Layer.boot().configuration();
- Configuration.resolveRequires(empty, List.of(cf), empty, null);
+ Configuration.resolve(empty, List.of(cf), empty, null);
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresAndUsesWithNull1() {
- resolveRequiresAndUses((ModuleFinder) null, ModuleFinder.of());
+ resolveAndBind((ModuleFinder) null, ModuleFinder.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresAndUsesWithNull2() {
- resolveRequiresAndUses(ModuleFinder.of(), (ModuleFinder) null);
+ resolveAndBind(ModuleFinder.of(), (ModuleFinder) null);
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresAndUsesWithNull3() {
Configuration empty = Configuration.empty();
- Configuration.resolveRequiresAndUses(null, List.of(empty), ModuleFinder.of(), Set.of());
+ Configuration.resolveAndBind(null, List.of(empty), ModuleFinder.of(), Set.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresAndUsesWithNull4() {
ModuleFinder empty = ModuleFinder.of();
- Configuration.resolveRequiresAndUses(empty, null, empty, Set.of());
+ Configuration.resolveAndBind(empty, null, empty, Set.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresAndUsesWithNull5() {
Configuration cf = Layer.boot().configuration();
- Configuration.resolveRequiresAndUses(ModuleFinder.of(), List.of(cf), null, Set.of());
+ Configuration.resolveAndBind(ModuleFinder.of(), List.of(cf), null, Set.of());
}
@Test(expectedExceptions = { NullPointerException.class })
public void testResolveRequiresAndUsesWithNull6() {
ModuleFinder empty = ModuleFinder.of();
Configuration cf = Layer.boot().configuration();
- Configuration.resolveRequiresAndUses(empty, List.of(cf), empty, null);
+ Configuration.resolveAndBind(empty, List.of(cf), empty, null);
}
@Test(expectedExceptions = { NullPointerException.class })
@@ -2165,58 +2065,58 @@ public class ConfigurationTest {
/**
- * Invokes parent.resolveRequires(...)
+ * Invokes parent.resolve(...)
*/
- private Configuration resolveRequires(Configuration parent,
- ModuleFinder before,
- ModuleFinder after,
- String... roots) {
- return parent.resolveRequires(before, after, Set.of(roots));
+ private Configuration resolve(Configuration parent,
+ ModuleFinder before,
+ ModuleFinder after,
+ String... roots) {
+ return parent.resolve(before, after, Set.of(roots));
}
- private Configuration resolveRequires(Configuration parent,
- ModuleFinder before,
- String... roots) {
- return resolveRequires(parent, before, ModuleFinder.of(), roots);
+ private Configuration resolve(Configuration parent,
+ ModuleFinder before,
+ String... roots) {
+ return resolve(parent, before, ModuleFinder.of(), roots);
}
- private Configuration resolveRequires(ModuleFinder before,
- ModuleFinder after,
- String... roots) {
- return resolveRequires(Configuration.empty(), before, after, roots);
+ private Configuration resolve(ModuleFinder before,
+ ModuleFinder after,
+ String... roots) {
+ return resolve(Configuration.empty(), before, after, roots);
}
- private Configuration resolveRequires(ModuleFinder before,
- String... roots) {
- return resolveRequires(Configuration.empty(), before, roots);
+ private Configuration resolve(ModuleFinder before,
+ String... roots) {
+ return resolve(Configuration.empty(), before, roots);
}
/**
- * Invokes parent.resolveRequiresAndUses(...)
+ * Invokes parent.resolveAndBind(...)
*/
- private Configuration resolveRequiresAndUses(Configuration parent,
- ModuleFinder before,
- ModuleFinder after,
- String... roots) {
- return parent.resolveRequiresAndUses(before, after, Set.of(roots));
+ private Configuration resolveAndBind(Configuration parent,
+ ModuleFinder before,
+ ModuleFinder after,
+ String... roots) {
+ return parent.resolveAndBind(before, after, Set.of(roots));
}
- private Configuration resolveRequiresAndUses(Configuration parent,
- ModuleFinder before,
- String... roots) {
- return resolveRequiresAndUses(parent, before, ModuleFinder.of(), roots);
+ private Configuration resolveAndBind(Configuration parent,
+ ModuleFinder before,
+ String... roots) {
+ return resolveAndBind(parent, before, ModuleFinder.of(), roots);
}
- private Configuration resolveRequiresAndUses(ModuleFinder before,
- ModuleFinder after,
- String... roots) {
- return resolveRequiresAndUses(Configuration.empty(), before, after, roots);
+ private Configuration resolveAndBind(ModuleFinder before,
+ ModuleFinder after,
+ String... roots) {
+ return resolveAndBind(Configuration.empty(), before, after, roots);
}
- private Configuration resolveRequiresAndUses(ModuleFinder before,
- String... roots) {
- return resolveRequiresAndUses(Configuration.empty(), before, roots);
+ private Configuration resolveAndBind(ModuleFinder before,
+ String... roots) {
+ return resolveAndBind(Configuration.empty(), before, roots);
}
@@ -2234,5 +2134,17 @@ public class ConfigurationTest {
.anyMatch(mn2::equals);
}
-
+ /**
+ * Decodes the platform string and calls the builder osName/osArch/osVersion
+ * methods to set the platform constraints.
+ */
+ static void addPlatformConstraints(Builder builder, String platformString) {
+ String[] s = platformString.split("-");
+ if (!s[0].equals("*"))
+ builder.osName(s[0]);
+ if (!s[1].equals("*"))
+ builder.osArch(s[1]);
+ if (!s[2].equals("*"))
+ builder.osVersion(s[2]);
+ }
}
diff --git a/jdk/test/java/lang/module/ModuleDescriptorTest.java b/jdk/test/java/lang/module/ModuleDescriptorTest.java
index 276ecf71048..b16b9e66e92 100644
--- a/jdk/test/java/lang/module/ModuleDescriptorTest.java
+++ b/jdk/test/java/lang/module/ModuleDescriptorTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2013, 2016, 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
@@ -24,6 +24,7 @@
/**
* @test
* @modules java.base/jdk.internal.module
+ * java.base/jdk.internal.misc
* @run testng ModuleDescriptorTest
* @summary Basic test for java.lang.module.ModuleDescriptor and its builder
*/
@@ -42,14 +43,19 @@ import java.lang.module.ModuleDescriptor.Requires.Modifier;
import java.lang.module.ModuleDescriptor.Version;
import java.lang.reflect.Module;
import java.nio.ByteBuffer;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
+import java.util.stream.Collectors;
import static java.lang.module.ModuleDescriptor.Requires.Modifier.*;
+import jdk.internal.misc.SharedSecrets;
import jdk.internal.module.ModuleInfoWriter;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;
@@ -84,21 +90,27 @@ public class ModuleDescriptorTest {
// requires
private Requires requires(Set mods, String mn) {
- return ModuleDescriptor.module("m")
- .requires(mods, mn)
- .build()
- .requires()
- .iterator()
- .next();
+ return requires(mods, mn, null);
}
private Requires requires(Set mods, String mn, Version v) {
- return ModuleDescriptor.module("m")
- .requires(mods, mn, v)
- .build()
- .requires()
- .iterator()
- .next();
+ Builder builder = ModuleDescriptor.newModule("m");
+ if (v == null) {
+ builder.requires(mods, mn);
+ } else {
+ builder.requires(mods, mn, v);
+ }
+ Set requires = builder.build().requires();
+ assertTrue(requires.size() == 2);
+ Iterator iterator = requires.iterator();
+ Requires r = iterator.next();
+ if (r.name().equals("java.base")) {
+ r = iterator.next();
+ } else {
+ Requires other = iterator.next();
+ assertEquals(other.name(), "java.base");
+ }
+ return r;
}
private Requires requires(String mn) {
@@ -107,7 +119,7 @@ public class ModuleDescriptorTest {
public void testRequiresWithRequires() {
Requires r1 = requires("foo");
- ModuleDescriptor descriptor = ModuleDescriptor.module("m").requires(r1).build();
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").requires(r1).build();
Requires r2 = descriptor.requires().iterator().next();
assertEquals(r1, r2);
}
@@ -162,28 +174,28 @@ public class ModuleDescriptorTest {
@Test(expectedExceptions = IllegalStateException.class)
public void testRequiresWithDuplicatesRequires() {
Requires r = requires("foo");
- ModuleDescriptor.module("m").requires(r).requires(r);
+ ModuleDescriptor.newModule("m").requires(r).requires(r);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testRequiresSelfWithRequires() {
Requires r = requires("foo");
- ModuleDescriptor.module("foo").requires(r);
+ ModuleDescriptor.newModule("foo").requires(r);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testRequiresSelfWithNoModifier() {
- ModuleDescriptor.module("m").requires("m");
+ ModuleDescriptor.newModule("m").requires("m");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testRequiresSelfWithOneModifier() {
- ModuleDescriptor.module("m").requires(Set.of(TRANSITIVE), "m");
+ ModuleDescriptor.newModule("m").requires(Set.of(TRANSITIVE), "m");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testRequiresSelfWithAllModifiers() {
- ModuleDescriptor.module("m").requires(EnumSet.allOf(Modifier.class), "m");
+ ModuleDescriptor.newModule("m").requires(EnumSet.allOf(Modifier.class), "m");
}
@Test(dataProvider = "invalidjavaidentifiers",
@@ -194,17 +206,17 @@ public class ModuleDescriptorTest {
@Test(expectedExceptions = NullPointerException.class)
public void testRequiresWithNullRequires() {
- ModuleDescriptor.module("m").requires((Requires) null);
+ ModuleDescriptor.newModule("m").requires((Requires) null);
}
@Test(expectedExceptions = NullPointerException.class)
public void testRequiresWithNullModifiers() {
- ModuleDescriptor.module("m").requires(null, "foo");
+ ModuleDescriptor.newModule("m").requires(null, "foo");
}
@Test(expectedExceptions = NullPointerException.class)
public void testRequiresWithNullVersion() {
- ModuleDescriptor.module("m").requires(Set.of(), "foo", null);
+ ModuleDescriptor.newModule("m").requires(Set.of(), "foo", null);
}
public void testRequiresCompare() {
@@ -284,7 +296,7 @@ public class ModuleDescriptorTest {
// exports
private Exports exports(Set mods, String pn) {
- return ModuleDescriptor.module("foo")
+ return ModuleDescriptor.newModule("foo")
.exports(mods, pn)
.build()
.exports()
@@ -297,7 +309,7 @@ public class ModuleDescriptorTest {
}
private Exports exports(Set mods, String pn, String target) {
- return ModuleDescriptor.module("foo")
+ return ModuleDescriptor.newModule("foo")
.exports(mods, pn, Set.of(target))
.build()
.exports()
@@ -312,7 +324,7 @@ public class ModuleDescriptorTest {
public void testExportsExports() {
Exports e1 = exports("p");
- ModuleDescriptor descriptor = ModuleDescriptor.module("m").exports(e1).build();
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").exports(e1).build();
Exports e2 = descriptor.exports().iterator().next();
assertEquals(e1, e2);
}
@@ -341,7 +353,7 @@ public class ModuleDescriptorTest {
targets.add("bar");
targets.add("gus");
Exports e
- = ModuleDescriptor.module("foo")
+ = ModuleDescriptor.newModule("foo")
.exports("p", targets)
.build()
.exports()
@@ -380,69 +392,80 @@ public class ModuleDescriptorTest {
@Test(expectedExceptions = IllegalStateException.class)
public void testExportsWithDuplicate1() {
Exports e = exports("p");
- ModuleDescriptor.module("foo").exports(e).exports(e);
+ ModuleDescriptor.newModule("foo").exports(e).exports(e);
}
@Test(expectedExceptions = IllegalStateException.class)
public void testExportsWithDuplicate2() {
- ModuleDescriptor.module("foo").exports("p").exports("p");
- }
-
- @Test(expectedExceptions = IllegalStateException.class)
- public void testExportsOnContainedPackage() {
- ModuleDescriptor.module("foo").contains("p").exports("p");
- }
-
- @Test(expectedExceptions = IllegalStateException.class)
- public void testExportsToTargetOnContainedPackage() {
- ModuleDescriptor.module("foo").contains("p").exports("p", Set.of("bar"));
+ ModuleDescriptor.newModule("foo").exports("p").exports("p");
}
@Test(expectedExceptions = IllegalArgumentException.class )
public void testExportsWithEmptySet() {
- ModuleDescriptor.module("foo").exports("p", Collections.emptySet());
+ ModuleDescriptor.newModule("foo").exports("p", Collections.emptySet());
}
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
public void testExportsWithBadName(String pn, String ignore) {
- ModuleDescriptor.module("foo").exports(pn);
+ ModuleDescriptor.newModule("foo").exports(pn);
}
@Test(expectedExceptions = NullPointerException.class )
public void testExportsWithNullExports() {
- ModuleDescriptor.module("foo").exports((Exports) null);
+ ModuleDescriptor.newModule("foo").exports((Exports) null);
}
@Test(expectedExceptions = NullPointerException.class )
public void testExportsWithNullTargets() {
- ModuleDescriptor.module("foo").exports("p", (Set) null);
+ ModuleDescriptor.newModule("foo").exports("p", (Set) null);
}
- public void testExportsEqualsAndHashCode() {
- Exports e1, e2;
-
- e1 = exports("p");
- e2 = exports("p");
+ public void testExportsCompare() {
+ Exports e1 = exports("p");
+ Exports e2 = exports("p");
assertEquals(e1, e2);
assertTrue(e1.hashCode() == e2.hashCode());
+ assertTrue(e1.compareTo(e2) == 0);
+ assertTrue(e2.compareTo(e1) == 0);
+ }
- e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
- e2 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
+ public void testExportsCompareWithSameModifiers() {
+ Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
+ Exports e2 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
assertEquals(e1, e2);
assertTrue(e1.hashCode() == e2.hashCode());
+ assertTrue(e1.compareTo(e2) == 0);
+ assertTrue(e2.compareTo(e1) == 0);
+ }
- e1 = exports("p");
- e2 = exports("q");
+ public void testExportsCompareWithDifferentModifiers() {
+ Exports e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
+ Exports e2 = exports("p");
assertNotEquals(e1, e2);
+ assertTrue(e1.compareTo(e2) == 1);
+ assertTrue(e2.compareTo(e1) == -1);
+ }
- e1 = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
- e2 = exports(Set.of(), "p");
+ public void testExportsCompareWithSameTargets() {
+ Exports e1 = exports("p", "x");
+ Exports e2 = exports("p", "x");
+ assertEquals(e1, e2);
+ assertTrue(e1.hashCode() == e2.hashCode());
+ assertTrue(e1.compareTo(e2) == 0);
+ assertTrue(e2.compareTo(e1) == 0);
+ }
+
+ public void testExportsCompareWithDifferentTargets() {
+ Exports e1 = exports("p", "y");
+ Exports e2 = exports("p", "x");
assertNotEquals(e1, e2);
+ assertTrue(e1.compareTo(e2) == 1);
+ assertTrue(e2.compareTo(e1) == -1);
}
public void testExportsToString() {
- String s = ModuleDescriptor.module("foo")
+ String s = ModuleDescriptor.newModule("foo")
.exports("p1", Set.of("bar"))
.build()
.exports()
@@ -457,7 +480,7 @@ public class ModuleDescriptorTest {
// opens
private Opens opens(Set mods, String pn) {
- return ModuleDescriptor.module("foo")
+ return ModuleDescriptor.newModule("foo")
.opens(mods, pn)
.build()
.opens()
@@ -470,7 +493,7 @@ public class ModuleDescriptorTest {
}
private Opens opens(Set mods, String pn, String target) {
- return ModuleDescriptor.module("foo")
+ return ModuleDescriptor.newModule("foo")
.opens(mods, pn, Set.of(target))
.build()
.opens()
@@ -484,7 +507,7 @@ public class ModuleDescriptorTest {
public void testOpensOpens() {
Opens o1 = opens("p");
- ModuleDescriptor descriptor = ModuleDescriptor.module("m").opens(o1).build();
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("m").opens(o1).build();
Opens o2 = descriptor.opens().iterator().next();
assertEquals(o1, o2);
}
@@ -513,7 +536,7 @@ public class ModuleDescriptorTest {
Set targets = new HashSet<>();
targets.add("bar");
targets.add("gus");
- Opens o = ModuleDescriptor.module("foo")
+ Opens o = ModuleDescriptor.newModule("foo")
.opens("p", targets)
.build()
.opens()
@@ -528,98 +551,83 @@ public class ModuleDescriptorTest {
assertTrue(o.targets().contains("gus"));
}
- /*
-
- public void testOpensToAllWithModifier() {
- Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p");
- assertEquals(e, e);
- assertTrue(e.modifiers().size() == 1);
- assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
- assertEquals(e.source(), "p");
- assertFalse(e.isQualified());
- assertTrue(e.targets().isEmpty());
- }
-
- public void testOpensToTargetWithModifier() {
- Exports e = exports(Set.of(Exports.Modifier.SYNTHETIC), "p", Set.of("bar"));
- assertEquals(e, e);
- assertTrue(e.modifiers().size() == 1);
- assertTrue(e.modifiers().contains(Exports.Modifier.SYNTHETIC));
- assertEquals(e.source(), "p");
- assertTrue(e.isQualified());
- assertTrue(e.targets().size() == 1);
- assertTrue(e.targets().contains("bar"));
- }
-
-
- */
-
@Test(expectedExceptions = IllegalStateException.class)
public void testOpensWithDuplicate1() {
Opens o = opens("p");
- ModuleDescriptor.module("foo").opens(o).opens(o);
+ ModuleDescriptor.newModule("foo").opens(o).opens(o);
}
@Test(expectedExceptions = IllegalStateException.class)
public void testOpensWithDuplicate2() {
- ModuleDescriptor.module("foo").opens("p").opens("p");
- }
-
- @Test(expectedExceptions = IllegalStateException.class)
- public void testOpensOnContainedPackage() {
- ModuleDescriptor.module("foo").contains("p").opens("p");
- }
-
- @Test(expectedExceptions = IllegalStateException.class)
- public void testOpensToTargetOnContainedPackage() {
- ModuleDescriptor.module("foo").contains("p").opens("p", Set.of("bar"));
+ ModuleDescriptor.newModule("foo").opens("p").opens("p");
}
@Test(expectedExceptions = IllegalArgumentException.class )
public void testOpensWithEmptySet() {
- ModuleDescriptor.module("foo").opens("p", Collections.emptySet());
+ ModuleDescriptor.newModule("foo").opens("p", Collections.emptySet());
}
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
public void testOpensWithBadName(String pn, String ignore) {
- ModuleDescriptor.module("foo").opens(pn);
+ ModuleDescriptor.newModule("foo").opens(pn);
}
@Test(expectedExceptions = NullPointerException.class )
public void testOpensWithNullExports() {
- ModuleDescriptor.module("foo").opens((Opens) null);
+ ModuleDescriptor.newModule("foo").opens((Opens) null);
}
@Test(expectedExceptions = NullPointerException.class )
public void testOpensWithNullTargets() {
- ModuleDescriptor.module("foo").opens("p", (Set) null);
+ ModuleDescriptor.newModule("foo").opens("p", (Set) null);
}
- public void testOpensEqualsAndHashCode() {
- Opens o1, o2;
-
- o1 = opens("p");
- o2 = opens("p");
- assertEquals(o1, o2);
- assertTrue(o1.hashCode() == o1.hashCode());
-
- o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
- o2 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
+ public void testOpensCompare() {
+ Opens o1 = opens("p");
+ Opens o2 = opens("p");
assertEquals(o1, o2);
assertTrue(o1.hashCode() == o2.hashCode());
+ assertTrue(o1.compareTo(o2) == 0);
+ assertTrue(o2.compareTo(o1) == 0);
+ }
- o1 = opens("p");
- o2 = opens("q");
- assertNotEquals(o1, o2);
+ public void testOpensCompareWithSameModifiers() {
+ Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
+ Opens o2 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
+ assertEquals(o1, o2);
+ assertTrue(o1.hashCode() == o2.hashCode());
+ assertTrue(o1.compareTo(o2) == 0);
+ assertTrue(o2.compareTo(o1) == 0);
+ }
- o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
- o2 = opens(Set.of(), "p");
+ public void testOpensCompareWithDifferentModifiers() {
+ Opens o1 = opens(Set.of(Opens.Modifier.SYNTHETIC), "p");
+ Opens o2 = opens("p");
assertNotEquals(o1, o2);
+ assertTrue(o1.compareTo(o2) == 1);
+ assertTrue(o2.compareTo(o1) == -1);
+ }
+
+ public void testOpensCompareWithSameTargets() {
+ Opens o1 = opens("p", "x");
+ Opens o2 = opens("p", "x");
+ assertEquals(o1, o2);
+ assertTrue(o1.hashCode() == o2.hashCode());
+ assertTrue(o1.compareTo(o2) == 0);
+ assertTrue(o2.compareTo(o1) == 0);
+ }
+
+ public void testOpensCompareWithDifferentTargets() {
+ Opens o1 = opens("p", "y");
+ Opens o2 = opens("p", "x");
+ assertNotEquals(o1, o2);
+ assertTrue(o1.compareTo(o2) == 1);
+ assertTrue(o2.compareTo(o1) == -1);
}
public void testOpensToString() {
- String s = ModuleDescriptor.module("foo")
+ String s = ModuleDescriptor.newModule("foo")
.opens("p1", Set.of("bar"))
.build()
.opens()
@@ -635,7 +643,7 @@ public class ModuleDescriptorTest {
public void testUses() {
Set uses
- = ModuleDescriptor.module("foo")
+ = ModuleDescriptor.newModule("foo")
.uses("p.S")
.uses("q.S")
.build()
@@ -647,30 +655,44 @@ public class ModuleDescriptorTest {
@Test(expectedExceptions = IllegalStateException.class)
public void testUsesWithDuplicate() {
- ModuleDescriptor.module("foo").uses("p.S").uses("p.S");
+ ModuleDescriptor.newModule("foo").uses("p.S").uses("p.S");
+ }
+
+ @Test(expectedExceptions = IllegalArgumentException.class)
+ public void testUsesWithSimpleIdentifier() {
+ ModuleDescriptor.newModule("foo").uses("S");
}
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
public void testUsesWithBadName(String service, String ignore) {
- ModuleDescriptor.module("foo").uses(service);
+ ModuleDescriptor.newModule("foo").uses(service);
}
// provides
private Provides provides(String st, String pc) {
- return ModuleDescriptor.module("foo")
- .provides(st, pc)
+ return ModuleDescriptor.newModule("foo")
+ .provides(st, List.of(pc))
.build()
.provides()
.iterator()
.next();
}
+ private Provides provides(String st, List pns) {
+ return ModuleDescriptor.newModule("foo")
+ .provides(st, pns)
+ .build()
+ .provides()
+ .iterator()
+ .next();
+ }
+
public void testProvidesWithProvides() {
Provides p1 = provides("p.S", "q.S1");
- ModuleDescriptor descriptor = ModuleDescriptor.module("m")
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("m")
.provides(p1)
.build();
Provides p2 = descriptor.provides().iterator().next();
@@ -679,7 +701,7 @@ public class ModuleDescriptorTest {
public void testProvides() {
- Set set = ModuleDescriptor.module("foo")
+ Set set = ModuleDescriptor.newModule("foo")
.provides("p.S", List.of("q.P1", "q.P2"))
.build()
.provides();
@@ -696,59 +718,86 @@ public class ModuleDescriptorTest {
@Test(expectedExceptions = IllegalStateException.class )
public void testProvidesWithDuplicateProvides() {
Provides p = provides("p.S", "q.S2");
- ModuleDescriptor.module("m").provides("p.S", "q.S1").provides(p);
+ ModuleDescriptor.newModule("m").provides("p.S", List.of("q.S1")).provides(p);
}
@Test(expectedExceptions = IllegalArgumentException.class )
public void testProvidesWithEmptySet() {
- ModuleDescriptor.module("foo").provides("p.Service", Collections.emptyList());
+ ModuleDescriptor.newModule("foo").provides("p.Service", Collections.emptyList());
+ }
+
+ @Test(expectedExceptions = IllegalArgumentException.class )
+ public void testProvidesWithSimpleIdentifier1() {
+ ModuleDescriptor.newModule("foo").provides("S", List.of("q.P"));
+ }
+
+ @Test(expectedExceptions = IllegalArgumentException.class )
+ public void testProvidesWithSimpleIdentifier2() {
+ ModuleDescriptor.newModule("foo").provides("p.S", List.of("P"));
}
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
public void testProvidesWithBadService(String service, String ignore) {
- ModuleDescriptor.module("foo").provides(service, "p.Provider");
+ ModuleDescriptor.newModule("foo").provides(service, List.of("p.Provider"));
}
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
public void testProvidesWithBadProvider(String provider, String ignore) {
- ModuleDescriptor.module("foo").provides("p.Service", provider);
+ List names = new ArrayList<>(); // allows nulls
+ names.add(provider);
+ ModuleDescriptor.newModule("foo").provides("p.Service", names);
}
@Test(expectedExceptions = NullPointerException.class )
public void testProvidesWithNullProvides() {
- ModuleDescriptor.module("foo").provides((Provides) null);
+ ModuleDescriptor.newModule("foo").provides((Provides) null);
}
@Test(expectedExceptions = NullPointerException.class )
public void testProvidesWithNullProviders() {
- ModuleDescriptor.module("foo").provides("p.S", (List) null);
+ ModuleDescriptor.newModule("foo").provides("p.S", (List) null);
}
- public void testProvidesEqualsAndHashCode() {
- Provides p1, p2;
-
- p1 = provides("p.S", "q.S1");
- p2 = provides("p.S", "q.S1");
+ public void testProvidesCompare() {
+ Provides p1 = provides("p.S", "q.S1");
+ Provides p2 = provides("p.S", "q.S1");
assertEquals(p1, p2);
assertTrue(p1.hashCode() == p2.hashCode());
-
- p1 = provides("p.S", "q.S1");
- p2 = provides("p.S", "q.S2");
- assertNotEquals(p1, p2);
-
- p1 = provides("p.S", "q.S1");
- p2 = provides("p.S2", "q.S1");
- assertNotEquals(p1, p2);
+ assertTrue(p1.compareTo(p2) == 0);
+ assertTrue(p2.compareTo(p1) == 0);
}
- // contains
+ public void testProvidesCompareWithDifferentService() {
+ Provides p1 = provides("p.S2", "q.S1");
+ Provides p2 = provides("p.S1", "q.S1");
+ assertNotEquals(p1, p2);
+ assertTrue(p1.compareTo(p2) == 1);
+ assertTrue(p2.compareTo(p1) == -1);
+ }
- public void testContains() {
- Set packages = ModuleDescriptor.module("foo")
- .contains("p")
- .contains("q")
+ public void testProvidesCompareWithDifferentProviders1() {
+ Provides p1 = provides("p.S", "q.S2");
+ Provides p2 = provides("p.S", "q.S1");
+ assertNotEquals(p1, p2);
+ assertTrue(p1.compareTo(p2) == 1);
+ assertTrue(p2.compareTo(p1) == -1);
+ }
+
+ public void testProvidesCompareWithDifferentProviders2() {
+ Provides p1 = provides("p.S", List.of("q.S1", "q.S2"));
+ Provides p2 = provides("p.S", "q.S1");
+ assertNotEquals(p1, p2);
+ assertTrue(p1.compareTo(p2) == 1);
+ assertTrue(p2.compareTo(p1) == -1);
+ }
+
+ // packages
+
+ public void testPackages1() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Set.of("p", "q"))
.build()
.packages();
assertTrue(packages.size() == 2);
@@ -756,56 +805,147 @@ public class ModuleDescriptorTest {
assertTrue(packages.contains("q"));
}
- public void testContainsWithEmptySet() {
- Set packages = ModuleDescriptor.module("foo")
- .contains(Collections.emptySet())
+ public void testPackages2() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Set.of("p"))
+ .packages(Set.of("q"))
+ .build()
+ .packages();
+ assertTrue(packages.size() == 2);
+ assertTrue(packages.contains("p"));
+ assertTrue(packages.contains("q"));
+ }
+
+
+ public void testPackagesWithEmptySet() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Collections.emptySet())
.build()
.packages();
assertTrue(packages.size() == 0);
}
- @Test(expectedExceptions = IllegalStateException.class)
- public void testContainsWithDuplicate() {
- ModuleDescriptor.module("foo").contains("p").contains("p");
+ public void testPackagesDuplicate() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Set.of("p"))
+ .packages(Set.of("p"))
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
}
- @Test(expectedExceptions = IllegalStateException.class)
- public void testContainsWithExportedPackage() {
- ModuleDescriptor.module("foo").exports("p").contains("p");
+ public void testPackagesAndExportsPackage1() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Set.of("p"))
+ .exports("p")
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndExportsPackage2() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .exports("p")
+ .packages(Set.of("p"))
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndOpensPackage1() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Set.of("p"))
+ .opens("p")
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndOpensPackage2() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .opens("p")
+ .packages(Set.of("p"))
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndProvides1() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Set.of("p"))
+ .provides("q.S", List.of("p.T"))
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndProvides2() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .provides("q.S", List.of("p.T"))
+ .packages(Set.of("p"))
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndMainClass1() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .packages(Set.of("p"))
+ .mainClass("p.Main")
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndMainClass2() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .mainClass("p.Main")
+ .packages(Set.of("p"))
+ .build()
+ .packages();
+ assertTrue(packages.size() == 1);
+ assertTrue(packages.contains("p"));
+ }
+
+ public void testPackagesAndAll() {
+ Set packages = ModuleDescriptor.newModule("foo")
+ .exports("p1")
+ .opens("p2")
+ .packages(Set.of("p3"))
+ .provides("q.S", List.of("p4.T"))
+ .mainClass("p5.Main")
+ .build()
+ .packages();
+ assertTrue(Objects.equals(packages, Set.of("p1", "p2", "p3", "p4", "p5")));
}
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
- public void testContainsWithBadName(String pn, String ignore) {
- ModuleDescriptor.module("foo").contains(pn);
+ public void testPackagesWithBadName(String pn, String ignore) {
+ Set pkgs = new HashSet<>(); // allows nulls
+ pkgs.add(pn);
+ ModuleDescriptor.newModule("foo").packages(pkgs);
}
-
- // packages
-
- public void testPackages() {
- Set packages = ModuleDescriptor.module("foo")
- .exports("p")
- .contains("q")
- .build()
- .packages();
- assertTrue(packages.size() == 2);
- assertTrue(packages.contains("p"));
- assertTrue(packages.contains("q"));
- }
-
-
// name
public void testModuleName() {
- String mn = ModuleDescriptor.module("foo").build().name();
+ String mn = ModuleDescriptor.newModule("foo").build().name();
assertEquals(mn, "foo");
}
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
public void testBadModuleName(String mn, String ignore) {
- ModuleDescriptor.module(mn);
+ ModuleDescriptor.newModule(mn);
}
@@ -813,7 +953,7 @@ public class ModuleDescriptorTest {
public void testVersion1() {
Version v1 = Version.parse("1.0");
- Version v2 = ModuleDescriptor.module("foo")
+ Version v2 = ModuleDescriptor.newModule("foo")
.version(v1)
.build()
.version()
@@ -823,7 +963,7 @@ public class ModuleDescriptorTest {
public void testVersion2() {
String vs = "1.0";
- Version v1 = ModuleDescriptor.module("foo")
+ Version v1 = ModuleDescriptor.newModule("foo")
.version(vs)
.build()
.version()
@@ -834,86 +974,178 @@ public class ModuleDescriptorTest {
@Test(expectedExceptions = NullPointerException.class )
public void testNullVersion1() {
- ModuleDescriptor.module("foo").version((Version) null);
+ ModuleDescriptor.newModule("foo").version((Version) null);
}
@Test(expectedExceptions = IllegalArgumentException.class )
public void testNullVersion2() {
- ModuleDescriptor.module("foo").version((String) null);
+ ModuleDescriptor.newModule("foo").version((String) null);
}
@Test(expectedExceptions = IllegalArgumentException.class )
public void testEmptyVersion() {
- ModuleDescriptor.module("foo").version("");
+ ModuleDescriptor.newModule("foo").version("");
}
// toNameAndVersion
public void testToNameAndVersion() {
- ModuleDescriptor md1 = ModuleDescriptor.module("foo").build();
+ ModuleDescriptor md1 = ModuleDescriptor.newModule("foo").build();
assertEquals(md1.toNameAndVersion(), "foo");
- ModuleDescriptor md2 = ModuleDescriptor.module("foo").version("1.0").build();
+ ModuleDescriptor md2 = ModuleDescriptor.newModule("foo").version("1.0").build();
assertEquals(md2.toNameAndVersion(), "foo@1.0");
}
// open modules
- public void testOpenModules() {
- ModuleDescriptor descriptor = ModuleDescriptor.openModule("m")
- .requires("java.base")
- .contains("p")
+ public void testOpenModule() {
+ ModuleDescriptor descriptor = ModuleDescriptor.newOpenModule("foo")
+ .requires("bar")
+ .exports("p")
+ .provides("p.Service", List.of("q.ServiceImpl"))
.build();
+
+ // modifiers
+ assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.OPEN));
assertTrue(descriptor.isOpen());
- assertTrue(descriptor.packages().size() == 1);
- assertTrue(descriptor.packages().contains("p"));
- assertTrue(descriptor.exports().isEmpty());
+
+ // requires
+ assertTrue(descriptor.requires().size() == 2);
+ Set names = descriptor.requires()
+ .stream()
+ .map(Requires::name)
+ .collect(Collectors.toSet());
+ assertEquals(names, Set.of("bar", "java.base"));
+
+ // packages
+ assertEquals(descriptor.packages(), Set.of("p", "q"));
+
+ // exports
+ assertTrue(descriptor.exports().size() == 1);
+ names = descriptor.exports()
+ .stream()
+ .map(Exports::source)
+ .collect(Collectors.toSet());
+ assertEquals(names, Set.of("p"));
+
+ // opens
+ assertTrue(descriptor.opens().isEmpty());
}
@Test(expectedExceptions = IllegalStateException.class)
- public void testOpensOnWeakModule1() {
- ModuleDescriptor.openModule("foo").opens("p");
+ public void testOpensOnOpenModule1() {
+ ModuleDescriptor.newOpenModule("foo").opens("p");
}
@Test(expectedExceptions = IllegalStateException.class)
- public void testOpensOnWeakModule2() {
- ModuleDescriptor.openModule("foo").opens("p", Set.of("bar"));
+ public void testOpensOnOpenModule2() {
+ ModuleDescriptor.newOpenModule("foo").opens("p", Set.of("bar"));
}
public void testIsOpen() {
- assertFalse(ModuleDescriptor.module("m").build().isOpen());
- assertFalse(ModuleDescriptor.automaticModule("m").build().isOpen());
- assertTrue(ModuleDescriptor.openModule("m").build().isOpen());
+ assertFalse(ModuleDescriptor.newModule("m").build().isOpen());
+ assertFalse(ModuleDescriptor.newAutomaticModule("m").build().isOpen());
+ assertTrue(ModuleDescriptor.newOpenModule("m").build().isOpen());
}
// automatic modules
+ public void testAutomaticModule() {
+ ModuleDescriptor descriptor = ModuleDescriptor.newAutomaticModule("foo")
+ .packages(Set.of("p"))
+ .provides("p.Service", List.of("q.ServiceImpl"))
+ .build();
+
+ // modifiers
+ assertTrue(descriptor.modifiers().contains(ModuleDescriptor.Modifier.AUTOMATIC));
+ assertTrue(descriptor.isAutomatic());
+
+ // requires
+ assertTrue(descriptor.requires().size() == 1);
+ Set names = descriptor.requires()
+ .stream()
+ .map(Requires::name)
+ .collect(Collectors.toSet());
+ assertEquals(names, Set.of("java.base"));
+
+ // packages
+ assertEquals(descriptor.packages(), Set.of("p", "q"));
+ assertTrue(descriptor.exports().isEmpty());
+ assertTrue(descriptor.opens().isEmpty());
+ }
+
+ @Test(expectedExceptions = IllegalStateException.class)
+ public void testRequiresOnAutomaticModule() {
+ ModuleDescriptor.newAutomaticModule("foo").requires("java.base");
+ }
+
+ @Test(expectedExceptions = IllegalStateException.class)
+ public void testExportsOnAutomaticModule1() {
+ ModuleDescriptor.newAutomaticModule("foo").exports("p");
+ }
+
+ @Test(expectedExceptions = IllegalStateException.class)
+ public void testExportsOnAutomaticModule2() {
+ ModuleDescriptor.newAutomaticModule("foo").exports("p", Set.of("bar"));
+ }
+
+ @Test(expectedExceptions = IllegalStateException.class)
+ public void testOpensOnAutomaticModule1() {
+ ModuleDescriptor.newAutomaticModule("foo").opens("p");
+ }
+
+ @Test(expectedExceptions = IllegalStateException.class)
+ public void testOpensOnAutomaticModule2() {
+ ModuleDescriptor.newAutomaticModule("foo").opens("p", Set.of("bar"));
+ }
+
+ @Test(expectedExceptions = IllegalStateException.class)
+ public void testUsesOnAutomaticModule() {
+ ModuleDescriptor.newAutomaticModule("foo").uses("p.Service");
+ }
+
public void testIsAutomatic() {
- ModuleDescriptor descriptor1 = ModuleDescriptor.module("foo").build();
+ ModuleDescriptor descriptor1 = ModuleDescriptor.newModule("foo").build();
assertFalse(descriptor1.isAutomatic());
- ModuleDescriptor descriptor2 = ModuleDescriptor.openModule("foo").build();
+ ModuleDescriptor descriptor2 = ModuleDescriptor.newOpenModule("foo").build();
assertFalse(descriptor2.isAutomatic());
- ModuleDescriptor descriptor3 = ModuleDescriptor.automaticModule("foo").build();
+ ModuleDescriptor descriptor3 = ModuleDescriptor.newAutomaticModule("foo").build();
assertTrue(descriptor3.isAutomatic());
}
- // isSynthetic
- public void testIsSynthetic() {
- assertFalse(Object.class.getModule().getDescriptor().isSynthetic());
- ModuleDescriptor descriptor1 = ModuleDescriptor.module("foo").build();
- assertFalse(descriptor1.isSynthetic());
+ // newModule with modifiers
- ModuleDescriptor descriptor2 = ModuleDescriptor.openModule("foo").build();
- assertFalse(descriptor2.isSynthetic());
+ public void testNewModuleToBuildAutomaticModule() {
+ Set ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC);
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();
+ assertTrue(descriptor.modifiers().equals(ms));
+ assertTrue(descriptor.isAutomatic());
+ }
- ModuleDescriptor descriptor3 = ModuleDescriptor.automaticModule("foo").build();
- assertFalse(descriptor3.isSynthetic());
+ public void testNewModuleToBuildOpenModule() {
+ Set ms = Set.of(ModuleDescriptor.Modifier.OPEN);
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo", ms).build();
+ assertTrue(descriptor.modifiers().equals(ms));
+ assertTrue(descriptor.isOpen());
+
+ ms = Set.of(ModuleDescriptor.Modifier.OPEN, ModuleDescriptor.Modifier.SYNTHETIC);
+ descriptor = ModuleDescriptor.newModule("foo", ms).build();
+ assertTrue(descriptor.modifiers().equals(ms));
+ assertTrue(descriptor.isOpen());
+ }
+
+ @Test(expectedExceptions = IllegalArgumentException.class)
+ public void testNewModuleToBuildAutomaticAndOpenModule() {
+ Set ms = Set.of(ModuleDescriptor.Modifier.AUTOMATIC,
+ ModuleDescriptor.Modifier.OPEN);
+ ModuleDescriptor.newModule("foo", ms);
}
@@ -921,14 +1153,19 @@ public class ModuleDescriptorTest {
public void testMainClass() {
String mainClass
- = ModuleDescriptor.module("foo").mainClass("p.Main").build().mainClass().get();
+ = ModuleDescriptor.newModule("foo").mainClass("p.Main").build().mainClass().get();
assertEquals(mainClass, "p.Main");
}
+ @Test(expectedExceptions = IllegalArgumentException.class)
+ public void testMainClassWithSimpleIdentifier() {
+ ModuleDescriptor.newModule("foo").mainClass("Main");
+ }
+
@Test(dataProvider = "invalidjavaidentifiers",
expectedExceptions = IllegalArgumentException.class )
public void testMainClassWithBadName(String mainClass, String ignore) {
- Builder builder = ModuleDescriptor.module("foo");
+ Builder builder = ModuleDescriptor.newModule("foo");
builder.mainClass(mainClass);
}
@@ -936,54 +1173,54 @@ public class ModuleDescriptorTest {
// osName
public void testOsName() {
- String osName = ModuleDescriptor.module("foo").osName("Linux").build().osName().get();
+ String osName = ModuleDescriptor.newModule("foo").osName("Linux").build().osName().get();
assertEquals(osName, "Linux");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullOsName() {
- ModuleDescriptor.module("foo").osName(null);
+ ModuleDescriptor.newModule("foo").osName(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyOsName() {
- ModuleDescriptor.module("foo").osName("");
+ ModuleDescriptor.newModule("foo").osName("");
}
// osArch
public void testOsArch() {
- String osArch = ModuleDescriptor.module("foo").osName("arm").build().osName().get();
+ String osArch = ModuleDescriptor.newModule("foo").osName("arm").build().osName().get();
assertEquals(osArch, "arm");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullOsArch() {
- ModuleDescriptor.module("foo").osArch(null);
+ ModuleDescriptor.newModule("foo").osArch(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyOsArch() {
- ModuleDescriptor.module("foo").osArch("");
+ ModuleDescriptor.newModule("foo").osArch("");
}
// osVersion
public void testOsVersion() {
- String osVersion = ModuleDescriptor.module("foo").osName("11.2").build().osName().get();
+ String osVersion = ModuleDescriptor.newModule("foo").osName("11.2").build().osName().get();
assertEquals(osVersion, "11.2");
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testNullOsVersion() {
- ModuleDescriptor.module("foo").osVersion(null);
+ ModuleDescriptor.newModule("foo").osVersion(null);
}
@Test(expectedExceptions = IllegalArgumentException.class)
public void testEmptyOsVersion() {
- ModuleDescriptor.module("foo").osVersion("");
+ ModuleDescriptor.newModule("foo").osVersion("");
}
// reads
@@ -1023,7 +1260,7 @@ public class ModuleDescriptorTest {
* Test ModuleDescriptor with a packager finder
*/
public void testReadsWithPackageFinder() throws Exception {
- ModuleDescriptor descriptor = ModuleDescriptor.module("foo")
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
.requires("java.base")
.build();
@@ -1044,7 +1281,7 @@ public class ModuleDescriptorTest {
*/
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
public void testReadsWithBadPackageFinder() throws Exception {
- ModuleDescriptor descriptor = ModuleDescriptor.module("foo")
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule("foo")
.requires("java.base")
.exports("p")
.build();
@@ -1077,7 +1314,7 @@ public class ModuleDescriptorTest {
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
public void testReadOfJavaBaseWithRequires() {
ModuleDescriptor descriptor
- = ModuleDescriptor.module("java.base")
+ = ModuleDescriptor.newModule("java.base")
.requires("other")
.build();
ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
@@ -1087,7 +1324,8 @@ public class ModuleDescriptorTest {
// The requires table must have an entry for java.base
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
public void testReadWithEmptyRequires() {
- ModuleDescriptor descriptor = ModuleDescriptor.module("m1").build();
+ ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
+ .newModuleBuilder("m1", false, Set.of()).build();
ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
ModuleDescriptor.read(bb);
}
@@ -1095,10 +1333,8 @@ public class ModuleDescriptorTest {
// The requires table must have an entry for java.base
@Test(expectedExceptions = InvalidModuleDescriptorException.class)
public void testReadWithNoRequiresBase() {
- ModuleDescriptor descriptor
- = ModuleDescriptor.module("m1")
- .requires("m2")
- .build();
+ ModuleDescriptor descriptor = SharedSecrets.getJavaLangModuleAccess()
+ .newModuleBuilder("m1", false, Set.of()).requires("m2").build();
ByteBuffer bb = ModuleInfoWriter.toByteBuffer(descriptor);
ModuleDescriptor.read(bb);
}
@@ -1138,22 +1374,50 @@ public class ModuleDescriptorTest {
// equals/hashCode/compareTo/toString
public void testEqualsAndHashCode() {
- ModuleDescriptor md1 = ModuleDescriptor.module("foo").build();
- ModuleDescriptor md2 = ModuleDescriptor.module("foo").build();
+ ModuleDescriptor md1 = ModuleDescriptor.newModule("m").build();
+ ModuleDescriptor md2 = ModuleDescriptor.newModule("m").build();
assertEquals(md1, md1);
assertEquals(md1.hashCode(), md2.hashCode());
+ assertTrue(md1.compareTo(md2) == 0);
+ assertTrue(md2.compareTo(md1) == 0);
}
- public void testCompare() {
- ModuleDescriptor md1 = ModuleDescriptor.module("foo").build();
- ModuleDescriptor md2 = ModuleDescriptor.module("bar").build();
- int n = "foo".compareTo("bar");
- assertTrue(md1.compareTo(md2) == n);
- assertTrue(md2.compareTo(md1) == -n);
+ @DataProvider(name = "sortedModuleDescriptors")
+ public Object[][] sortedModuleDescriptors() {
+ return new Object[][]{
+
+ { ModuleDescriptor.newModule("m2").build(),
+ ModuleDescriptor.newModule("m1").build()
+ },
+
+ { ModuleDescriptor.newModule("m").version("2").build(),
+ ModuleDescriptor.newModule("m").version("1").build()
+ },
+
+ { ModuleDescriptor.newModule("m").version("1").build(),
+ ModuleDescriptor.newModule("m").build()
+ },
+
+ { ModuleDescriptor.newOpenModule("m").build(),
+ ModuleDescriptor.newModule("m").build()
+ },
+
+ };
+ }
+
+ @Test(dataProvider = "sortedModuleDescriptors")
+ public void testCompare(ModuleDescriptor md1, ModuleDescriptor md2) {
+ assertNotEquals(md1, md2);
+ assertTrue(md1.compareTo(md2) == 1);
+ assertTrue(md2.compareTo(md1) == -1);
}
public void testToString() {
- String s = ModuleDescriptor.module("m1").requires("m2").exports("p1").build().toString();
+ String s = ModuleDescriptor.newModule("m1")
+ .requires("m2")
+ .exports("p1")
+ .build()
+ .toString();
assertTrue(s.contains("m1"));
assertTrue(s.contains("m2"));
assertTrue(s.contains("p1"));
diff --git a/jdk/test/java/lang/module/ModuleFinderTest.java b/jdk/test/java/lang/module/ModuleFinderTest.java
index 278b4b98714..29d8f234c8b 100644
--- a/jdk/test/java/lang/module/ModuleFinderTest.java
+++ b/jdk/test/java/lang/module/ModuleFinderTest.java
@@ -471,36 +471,10 @@ public class ModuleFinderTest {
* Test ModuleFinder.of with a file path to a directory containing a file
* that will not be recognized as a module.
*/
- public void testOfWithUnrecognizedEntryInDirectory() throws Exception {
+ public void testOfWithUnrecognizedEntryInDirectory1() throws Exception {
Path dir = Files.createTempDirectory(USER_DIR, "mods");
Files.createTempFile(dir, "m", ".junk");
- ModuleFinder finder = ModuleFinder.of(dir);
- try {
- finder.find("java.rhubarb");
- assertTrue(false);
- } catch (FindException e) {
- // expected
- }
-
- finder = ModuleFinder.of(dir);
- try {
- finder.findAll();
- assertTrue(false);
- } catch (FindException e) {
- // expected
- }
- }
-
-
- /**
- * Test ModuleFinder.of with a file path to a directory containing a file
- * starting with ".", the file should be ignored.
- */
- public void testOfWithHiddenEntryInDirectory() throws Exception {
- Path dir = Files.createTempDirectory(USER_DIR, "mods");
- Files.createTempFile(dir, ".marker", "");
-
ModuleFinder finder = ModuleFinder.of(dir);
assertFalse(finder.find("java.rhubarb").isPresent());
@@ -509,6 +483,24 @@ public class ModuleFinderTest {
}
+ /**
+ * Test ModuleFinder.of with a file path to a directory containing a file
+ * that will not be recognized as a module.
+ */
+ public void testOfWithUnrecognizedEntryInDirectory2() throws Exception {
+ Path dir = Files.createTempDirectory(USER_DIR, "mods");
+ createModularJar(dir.resolve("m1.jar"), "m1");
+ Files.createTempFile(dir, "m2", ".junk");
+
+ ModuleFinder finder = ModuleFinder.of(dir);
+ assertTrue(finder.find("m1").isPresent());
+ assertFalse(finder.find("m2").isPresent());
+
+ finder = ModuleFinder.of(dir);
+ assertTrue(finder.findAll().size() == 1);
+ }
+
+
/**
* Test ModuleFinder.of with a directory that contains two
* versions of the same module
@@ -748,7 +740,7 @@ public class ModuleFinderTest {
vs = mid.substring(i+1);
}
ModuleDescriptor.Builder builder
- = ModuleDescriptor.module(mn).requires("java.base");
+ = ModuleDescriptor.newModule(mn).requires("java.base");
if (vs != null)
builder.version(vs);
return builder.build();
diff --git a/jdk/test/java/lang/module/ModuleNamesTest.java b/jdk/test/java/lang/module/ModuleNamesTest.java
index c0790eab202..afeadacec86 100644
--- a/jdk/test/java/lang/module/ModuleNamesTest.java
+++ b/jdk/test/java/lang/module/ModuleNamesTest.java
@@ -235,7 +235,7 @@ public class ModuleNamesTest {
*/
private Builder newBuilder(String mn) {
return SharedSecrets.getJavaLangModuleAccess()
- .newModuleBuilder(mn, false, false, false);
+ .newModuleBuilder(mn, false, Set.of());
}
/**
diff --git a/jdk/test/java/lang/module/ModuleReader/ModuleReaderTest.java b/jdk/test/java/lang/module/ModuleReader/ModuleReaderTest.java
index d956c249651..12e53b0f5fb 100644
--- a/jdk/test/java/lang/module/ModuleReader/ModuleReaderTest.java
+++ b/jdk/test/java/lang/module/ModuleReader/ModuleReaderTest.java
@@ -79,14 +79,52 @@ public class ModuleReaderTest {
"java/lang/Object.class"
};
+ // resource names that should not be found in the base module
+ private static final String[] BAD_BASE_RESOURCES = {
+ "NotFound",
+ "java",
+ "/java",
+ "//java",
+ "java/",
+ "java/lang",
+ "/java/lang",
+ "//java/lang",
+ "java/lang/",
+ "java//lang",
+ "/java/lang/Object.class",
+ "//java/lang/Object.class",
+ "java/lang/Object.class/",
+ "java//lang//Object.class",
+ "./java/lang/Object.class",
+ "java/./lang/Object.class",
+ "java/lang/./Object.class",
+ "../java/lang/Object.class",
+ "java/../lang/Object.class",
+ "java/lang/../Object.class",
+ };
+
// resources in test module (can't use module-info.class as a test
// resource as it will be modified by the jmod tool)
private static final String[] TEST_RESOURCES = {
"p/Main.class"
};
- // a resource that is not in the base or test module
- private static final String NOT_A_RESOURCE = "NotAResource";
+ // resource names that should not be found in the test module
+ private static final String[] BAD_TEST_RESOURCES = {
+ "NotFound",
+ "p",
+ "/p",
+ "//p",
+ "p/",
+ "/p/Main.class",
+ "//p/Main.class",
+ "p/Main.class/",
+ "p//Main.class",
+ "./p/Main.class",
+ "p/./Main.class",
+ "../p/Main.class",
+ "p/../p/Main.class"
+ };
@BeforeTest
@@ -126,10 +164,11 @@ public class ModuleReaderTest {
}
// test "not found"
- assertFalse(reader.find(NOT_A_RESOURCE).isPresent());
- assertFalse(reader.open(NOT_A_RESOURCE).isPresent());
- assertFalse(reader.read(NOT_A_RESOURCE).isPresent());
-
+ for (String name : BAD_BASE_RESOURCES) {
+ assertFalse(reader.find(name).isPresent());
+ assertFalse(reader.open(name).isPresent());
+ assertFalse(reader.read(name).isPresent());
+ }
// test nulls
try {
@@ -216,7 +255,7 @@ public class ModuleReaderTest {
*/
void test(Path mp) throws IOException {
- ModuleFinder finder = new ModulePath(Runtime.version(), true, mp);
+ ModuleFinder finder = ModulePath.of(Runtime.version(), true, mp);
ModuleReference mref = finder.find(TEST_MODULE).get();
ModuleReader reader = mref.open();
@@ -236,9 +275,11 @@ public class ModuleReaderTest {
}
// test "not found"
- assertFalse(reader.find(NOT_A_RESOURCE).isPresent());
- assertFalse(reader.open(NOT_A_RESOURCE).isPresent());
- assertFalse(reader.read(NOT_A_RESOURCE).isPresent());
+ for (String name : BAD_TEST_RESOURCES) {
+ assertFalse(reader.find(name).isPresent());
+ assertFalse(reader.open(name).isPresent());
+ assertFalse(reader.read(name).isPresent());
+ }
// test nulls
try {
diff --git a/jdk/test/java/lang/module/ModuleReferenceTest.java b/jdk/test/java/lang/module/ModuleReferenceTest.java
index bf2db124de5..f3cbb28babd 100644
--- a/jdk/test/java/lang/module/ModuleReferenceTest.java
+++ b/jdk/test/java/lang/module/ModuleReferenceTest.java
@@ -31,6 +31,7 @@ import java.lang.module.ModuleDescriptor;
import java.lang.module.ModuleReader;
import java.lang.module.ModuleReference;
import java.net.URI;
+import java.util.Set;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
@@ -49,10 +50,10 @@ public class ModuleReferenceTest {
public void testBasic() throws Exception {
ModuleDescriptor descriptor
- = ModuleDescriptor.module("m")
+ = ModuleDescriptor.newModule("m")
.exports("p")
.exports("q")
- .contains("p.internal")
+ .packages(Set.of("p.internal"))
.build();
URI uri = URI.create("module:/m");
@@ -71,7 +72,7 @@ public class ModuleReferenceTest {
public void testNullLocation() {
ModuleDescriptor descriptor
- = ModuleDescriptor.module("m")
+ = ModuleDescriptor.newModule("m")
.exports("p")
.build();
ModuleReference mref = newModuleReference(descriptor, null);
diff --git a/jdk/test/java/lang/module/MultiReleaseJarTest.java b/jdk/test/java/lang/module/MultiReleaseJarTest.java
index 7daddb11993..4c58e930b08 100644
--- a/jdk/test/java/lang/module/MultiReleaseJarTest.java
+++ b/jdk/test/java/lang/module/MultiReleaseJarTest.java
@@ -65,7 +65,7 @@ public class MultiReleaseJarTest {
private static final String MODULE_INFO = "module-info.class";
- private static final int RELEASE = Runtime.version().major();
+ private static final int VERSION = Runtime.version().major();
// are multi-release JARs enabled?
private static final boolean MULTI_RELEASE;
@@ -80,7 +80,7 @@ public class MultiReleaseJarTest {
public void testBasic() throws Exception {
String name = "m1";
- ModuleDescriptor descriptor = ModuleDescriptor.module(name)
+ ModuleDescriptor descriptor = ModuleDescriptor.newModule(name)
.requires("java.base")
.build();
@@ -88,8 +88,8 @@ public class MultiReleaseJarTest {
.moduleInfo("module-info.class", descriptor)
.resource("p/Main.class")
.resource("p/Helper.class")
- .resource("META-INF/versions/9/p/Helper.class")
- .resource("META-INF/versions/9/p/internal/Helper9.class")
+ .resource("META-INF/versions/" + VERSION + "/p/Helper.class")
+ .resource("META-INF/versions/" + VERSION + "/p/internal/Helper.class")
.build();
// find the module
@@ -117,12 +117,12 @@ public class MultiReleaseJarTest {
public void testModuleInfoInVersionedSection() throws Exception {
String name = "m1";
- ModuleDescriptor descriptor1 = ModuleDescriptor.module(name)
+ ModuleDescriptor descriptor1 = ModuleDescriptor.newModule(name)
.requires("java.base")
.build();
// module descriptor for versioned section
- ModuleDescriptor descriptor2 = ModuleDescriptor.module(name)
+ ModuleDescriptor descriptor2 = ModuleDescriptor.newModule(name)
.requires("java.base")
.requires("jdk.unsupported")
.build();
@@ -131,9 +131,9 @@ public class MultiReleaseJarTest {
.moduleInfo(MODULE_INFO, descriptor1)
.resource("p/Main.class")
.resource("p/Helper.class")
- .moduleInfo("META-INF/versions/9/" + MODULE_INFO, descriptor2)
- .resource("META-INF/versions/9/p/Helper.class")
- .resource("META-INF/versions/9/p/internal/Helper9.class")
+ .moduleInfo("META-INF/versions/" + VERSION + "/" + MODULE_INFO, descriptor2)
+ .resource("META-INF/versions/" + VERSION + "/p/Helper.class")
+ .resource("META-INF/versions/" + VERSION + "/p/internal/Helper.class")
.build();
// find the module
@@ -161,8 +161,8 @@ public class MultiReleaseJarTest {
Path jar = new JarBuilder(name)
.resource("p/Main.class")
.resource("p/Helper.class")
- .resource("META-INF/versions/9/p/Helper.class")
- .resource("META-INF/versions/9/p/internal/Helper9.class")
+ .resource("META-INF/versions/" + VERSION + "/p/Helper.class")
+ .resource("META-INF/versions/" + VERSION + "/p/internal/Helper.class")
.build();
// find the module
@@ -188,19 +188,19 @@ public class MultiReleaseJarTest {
public void testModuleReader() throws Exception {
String name = "m1";
- ModuleDescriptor descriptor1 = ModuleDescriptor.module(name)
+ ModuleDescriptor descriptor1 = ModuleDescriptor.newModule(name)
.requires("java.base")
.build();
// module descriptor for versioned section
- ModuleDescriptor descriptor2 = ModuleDescriptor.module(name)
+ ModuleDescriptor descriptor2 = ModuleDescriptor.newModule(name)
.requires("java.base")
.requires("jdk.unsupported")
.build();
Path jar = new JarBuilder(name)
.moduleInfo(MODULE_INFO, descriptor1)
- .moduleInfo("META-INF/versions/9/" + MODULE_INFO, descriptor2)
+ .moduleInfo("META-INF/versions/" + VERSION + "/" + MODULE_INFO, descriptor2)
.build();
// find the module
@@ -243,7 +243,7 @@ public class MultiReleaseJarTest {
String expectedTail = "!/";
if (MULTI_RELEASE)
- expectedTail += "META-INF/versions/" + RELEASE + "/";
+ expectedTail += "META-INF/versions/" + VERSION + "/";
expectedTail += MODULE_INFO;
assertTrue(uri.toString().endsWith(expectedTail));
diff --git a/jdk/test/java/lang/reflect/AccessibleObject/CanAccessTest.java b/jdk/test/java/lang/reflect/AccessibleObject/CanAccessTest.java
new file mode 100644
index 00000000000..c73eb795b26
--- /dev/null
+++ b/jdk/test/java/lang/reflect/AccessibleObject/CanAccessTest.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @build CanAccessTest
+ * @modules java.base/jdk.internal.misc:+open
+ * @run testng CanAccessTest
+ * @summary Test AccessibleObject::canAccess method
+ */
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.security.SecureClassLoader;
+
+import jdk.internal.misc.Unsafe;
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+@Test
+public class CanAccessTest {
+ private static Unsafe INSTANCE = Unsafe.getUnsafe();
+
+ /**
+ * null object parameter for Constructor
+ */
+ public void testConstructor() throws Exception {
+ Constructor> ctor = Unsafe.class.getDeclaredConstructor();
+ assertFalse(ctor.canAccess(null));
+ assertTrue(ctor.trySetAccessible());
+
+ try {
+ // non-null object parameter
+ ctor.canAccess(INSTANCE);
+ assertTrue(false);
+ } catch (IllegalArgumentException expected) {}
+ }
+
+ /**
+ * Test protected constructors
+ */
+ public void testProtectedConstructor() throws Exception {
+ TestLoader.testProtectedConstructorNonOpenedPackage();
+
+ Constructor> ctor = TestLoader.class.getDeclaredConstructor();
+ assertTrue(ctor.canAccess(null));
+ }
+
+ /**
+ * null object parameter for static members
+ */
+ public void testStaticMember() throws Exception {
+ Method m = Unsafe.class.getDeclaredMethod("throwIllegalAccessError");
+ assertFalse(m.canAccess(null));
+ assertTrue(m.trySetAccessible());
+
+ try {
+ // non-null object parameter
+ m.canAccess(INSTANCE);
+ assertTrue(false);
+ } catch (IllegalArgumentException expected) { }
+ }
+
+ /**
+ * Test protected static
+ */
+ public void testProtectedStatic() throws Exception {
+ Method m = TestLoader.testProtectedStatic();
+ assertFalse(m.canAccess(null));
+ }
+
+ /**
+ * the specified object must be an instance of the declaring class
+ * for instance members
+ */
+ public void testInstanceMethod() throws Exception {
+ Method m = Unsafe.class.getDeclaredMethod("addressSize0");
+ assertFalse(m.canAccess(INSTANCE));
+
+ try {
+ m.canAccess(null);
+ assertTrue(false);
+ } catch (IllegalArgumentException expected) { }
+ }
+
+ /**
+ * the specified object must be an instance of the declaring class
+ * for instance members
+ */
+ public void testInvalidInstanceObject() throws Exception {
+ Class> clazz = Class.forName("sun.security.x509.X500Name");
+ Method m = clazz.getDeclaredMethod("size");
+
+ try {
+ m.canAccess(INSTANCE);
+ assertTrue(false);
+ } catch (IllegalArgumentException expected) { }
+ }
+
+
+ static class TestLoader extends SecureClassLoader {
+ public static Method testProtectedStatic() throws Exception {
+ Method m = ClassLoader.class.getDeclaredMethod("registerAsParallelCapable");
+ assertTrue(m.canAccess(null));
+ return m;
+ }
+
+ protected TestLoader() throws Exception {
+ Constructor> ctor = SecureClassLoader.class.getDeclaredConstructor();
+ assertFalse(ctor.canAccess(null));
+ assertFalse(ctor.trySetAccessible());
+ }
+
+ public static void testProtectedConstructorNonOpenedPackage() throws Exception {
+ new TestLoader();
+ }
+ }
+}
diff --git a/jdk/test/java/lang/reflect/AccessibleObject/ModuleSetAccessibleTest.java b/jdk/test/java/lang/reflect/AccessibleObject/ModuleSetAccessibleTest.java
index da5d264b1fd..3e2bf3911c7 100644
--- a/jdk/test/java/lang/reflect/AccessibleObject/ModuleSetAccessibleTest.java
+++ b/jdk/test/java/lang/reflect/AccessibleObject/ModuleSetAccessibleTest.java
@@ -30,7 +30,6 @@
* @summary Test java.lang.reflect.AccessibleObject with modules
*/
-import java.lang.module.ModuleDescriptor;
import java.lang.reflect.AccessibleObject;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
diff --git a/jdk/test/java/lang/reflect/AccessibleObject/TrySetAccessibleTest.java b/jdk/test/java/lang/reflect/AccessibleObject/TrySetAccessibleTest.java
new file mode 100644
index 00000000000..340e7d00613
--- /dev/null
+++ b/jdk/test/java/lang/reflect/AccessibleObject/TrySetAccessibleTest.java
@@ -0,0 +1,201 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @build TrySetAccessibleTest
+ * @modules java.base/java.lang:open
+ * java.base/jdk.internal.perf
+ * java.base/jdk.internal.misc:+open
+ * @run testng TrySetAccessibleTest
+ * @summary Test AccessibleObject::trySetAccessible method
+ */
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import jdk.internal.misc.Unsafe;
+import jdk.internal.perf.Perf;
+
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+@Test
+public class TrySetAccessibleTest {
+ /**
+ * Invoke a private constructor on a public class in an exported package
+ */
+ public void testPrivateConstructorInExportedPackage() throws Exception {
+ Constructor> ctor = Perf.class.getDeclaredConstructor();
+
+ try {
+ ctor.newInstance();
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertFalse(ctor.trySetAccessible());
+ assertFalse(ctor.canAccess(null));
+ }
+
+ /**
+ * Invoke a private constructor on a public class in an open package
+ */
+ public void testPrivateConstructorInOpenedPackage() throws Exception {
+ Constructor> ctor = Unsafe.class.getDeclaredConstructor();
+
+ try {
+ ctor.newInstance();
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertTrue(ctor.trySetAccessible());
+ assertTrue(ctor.canAccess(null));
+ Unsafe unsafe = (Unsafe) ctor.newInstance();
+ }
+
+ /**
+ * Invoke a private method on a public class in an exported package
+ */
+ public void testPrivateMethodInExportedPackage() throws Exception {
+ Method m = Perf.class.getDeclaredMethod("getBytes", String.class);
+ try {
+ m.invoke(null);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertFalse(m.trySetAccessible());
+ assertFalse(m.canAccess(null));
+ }
+
+
+ /**
+ * Invoke a private method on a public class in an open package
+ */
+ public void testPrivateMethodInOpenedPackage() throws Exception {
+ Method m = Unsafe.class.getDeclaredMethod("throwIllegalAccessError");
+ assertFalse(m.canAccess(null));
+
+ try {
+ m.invoke(null);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertTrue(m.trySetAccessible());
+ assertTrue(m.canAccess(null));
+ try {
+ m.invoke(null);
+ assertTrue(false);
+ } catch (InvocationTargetException e) {
+ // thrown by throwIllegalAccessError
+ assertTrue(e.getCause() instanceof IllegalAccessError);
+ }
+ }
+
+ /**
+ * Invoke a private method on a public class in an exported package
+ */
+ public void testPrivateFieldInExportedPackage() throws Exception {
+ Field f = Perf.class.getDeclaredField("instance");
+ try {
+ f.get(null);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertFalse(f.trySetAccessible());
+ assertFalse(f.canAccess(null));
+ try {
+ f.get(null);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) {}
+ }
+
+ /**
+ * Access a private field in a public class that is an exported package
+ */
+ public void testPrivateFieldInOpenedPackage() throws Exception {
+ Field f = Unsafe.class.getDeclaredField("theUnsafe");
+
+ try {
+ f.get(null);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertTrue(f.trySetAccessible());
+ assertTrue(f.canAccess(null));
+ Unsafe unsafe = (Unsafe) f.get(null);
+ }
+
+
+ /**
+ * Invoke a public constructor on a public class in a non-exported package
+ */
+ public void testPublicConstructorInNonExportedPackage() throws Exception {
+ Class> clazz = Class.forName("sun.security.x509.X500Name");
+ Constructor> ctor = clazz.getConstructor(String.class);
+
+ try {
+ ctor.newInstance("cn=duke");
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertFalse(ctor.trySetAccessible());
+ assertFalse(ctor.canAccess(null));
+ assertTrue(ctor.trySetAccessible() == ctor.isAccessible());
+ }
+
+
+ /**
+ * Access a public field in a public class that in a non-exported package
+ */
+ public void testPublicFieldInNonExportedPackage() throws Exception {
+ Class> clazz = Class.forName("sun.security.x509.X500Name");
+ Field f = clazz.getField("SERIALNUMBER_OID");
+
+ try {
+ f.get(null);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ assertFalse(f.trySetAccessible());
+ assertFalse(f.canAccess(null));
+ }
+
+
+ /**
+ * Test that the Class constructor cannot be make accessible.
+ */
+ public void testJavaLangClass() throws Exception {
+
+ // non-public constructor
+ Constructor> ctor
+ = Class.class.getDeclaredConstructor(ClassLoader.class, Class.class);
+ AccessibleObject[] ctors = { ctor };
+
+ assertFalse(ctor.trySetAccessible());
+ assertFalse(ctor.canAccess(null));
+ }
+
+}
diff --git a/jdk/test/java/lang/reflect/Layer/BasicLayerTest.java b/jdk/test/java/lang/reflect/Layer/BasicLayerTest.java
index 8f14171ce87..1bb04d9c12e 100644
--- a/jdk/test/java/lang/reflect/Layer/BasicLayerTest.java
+++ b/jdk/test/java/lang/reflect/Layer/BasicLayerTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -24,6 +24,7 @@
/**
* @test
* @library /lib/testlibrary
+ * @modules java.base/jdk.internal.misc
* @build BasicLayerTest ModuleUtils
* @compile layertest/Test.java
* @run testng BasicLayerTest
@@ -43,12 +44,22 @@ import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
+import jdk.internal.misc.SharedSecrets;
import org.testng.annotations.Test;
import static org.testng.Assert.*;
@Test
public class BasicLayerTest {
+ /**
+ * Creates a "non-strict" builder for building a module. This allows the
+ * test the create ModuleDescriptor objects that do not require java.base.
+ */
+ private static ModuleDescriptor.Builder newBuilder(String mn) {
+ return SharedSecrets.getJavaLangModuleAccess()
+ .newModuleBuilder(mn, false, Set.of());
+ }
+
/**
* Exercise Layer.empty()
*/
@@ -109,25 +120,22 @@ public class BasicLayerTest {
* Exercise Layer defineModules, created with empty layer as parent
*/
public void testLayerOnEmpty() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.exports("p1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("m3")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.build();
ModuleFinder finder
= ModuleUtils.finderOf(descriptor1, descriptor2, descriptor3);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
// map each module to its own class loader for this test
ClassLoader loader1 = new ClassLoader() { };
@@ -191,15 +199,13 @@ public class BasicLayerTest {
* Exercise Layer defineModules, created with boot layer as parent
*/
public void testLayerOnBoot() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.requires("java.base")
.exports("p1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires("java.base")
.build();
@@ -207,7 +213,7 @@ public class BasicLayerTest {
= ModuleUtils.finderOf(descriptor1, descriptor2);
Configuration parent = Layer.boot().configuration();
- Configuration cf = resolveRequires(parent, finder, "m1");
+ Configuration cf = resolve(parent, finder, "m1");
ClassLoader loader = new ClassLoader() { };
@@ -256,21 +262,19 @@ public class BasicLayerTest {
* have the same module-private package.
*/
public void testPackageContainedInSelfAndOther() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
- .contains("p")
+ .packages(Set.of("p"))
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
- .contains("p")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
+ .packages(Set.of("p"))
.build();
ModuleFinder finder
= ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
assertTrue(cf.modules().size() == 2);
// one loader per module, should be okay
@@ -292,22 +296,18 @@ public class BasicLayerTest {
public void testSameExportInPartitionedGraph() {
// m1 reads m2, m2 exports p to m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("m2")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.exports("p", Set.of("m1"))
.build();
// m3 reads m4, m4 exports p to m3
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m4")
.build();
- ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4")
+ ModuleDescriptor descriptor4 = newBuilder("m4")
.exports("p", Set.of("m3"))
.build();
@@ -317,7 +317,7 @@ public class BasicLayerTest {
descriptor3,
descriptor4);
- Configuration cf = resolveRequires(finder, "m1", "m3");
+ Configuration cf = resolve(finder, "m1", "m3");
assertTrue(cf.modules().size() == 4);
// one loader per module
@@ -353,16 +353,15 @@ public class BasicLayerTest {
ModuleDescriptor base = Object.class.getModule().getDescriptor();
assertTrue(base.packages().contains("sun.launcher"));
- ModuleDescriptor descriptor
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor = newBuilder("m1")
.requires("java.base")
- .contains("sun.launcher")
+ .packages(Set.of("sun.launcher"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
Configuration parent = Layer.boot().configuration();
- Configuration cf = parent.resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
+ Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m1"));
assertTrue(cf.modules().size() == 1);
ClassLoader loader = new ClassLoader() { };
@@ -382,18 +381,16 @@ public class BasicLayerTest {
// cf1: m1 and m2, m2 requires transitive m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m2");
+ Configuration cf1 = resolve(finder1, "m2");
ClassLoader cl1 = new ClassLoader() { };
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
@@ -401,14 +398,13 @@ public class BasicLayerTest {
// cf2: m3, m3 requires m2
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m3");
ClassLoader cl2 = new ClassLoader() { };
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
@@ -456,13 +452,11 @@ public class BasicLayerTest {
// cf1: m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder1, "m1");
+ Configuration cf1 = resolve(finder1, "m1");
ClassLoader cl1 = new ClassLoader() { };
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
@@ -470,19 +464,17 @@ public class BasicLayerTest {
// cf2: m2, m3: m2 requires transitive m1, m3 requires m2
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2, descriptor3);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3");
+ Configuration cf2 = resolve(cf1, finder2, "m3");
ClassLoader cl2 = new ClassLoader() { };
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
@@ -527,13 +519,11 @@ public class BasicLayerTest {
// cf1: m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .build();
+ ModuleDescriptor descriptor1 = newBuilder("m1").build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1);
- Configuration cf1 = resolveRequires(finder1, "m1");
+ Configuration cf1 = resolve(finder1, "m1");
ClassLoader cl1 = new ClassLoader() { };
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
@@ -541,14 +531,13 @@ public class BasicLayerTest {
// cf2: m2 requires transitive m1
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor2);
- Configuration cf2 = resolveRequires(cf1, finder2, "m2");
+ Configuration cf2 = resolve(cf1, finder2, "m2");
ClassLoader cl2 = new ClassLoader() { };
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
@@ -556,14 +545,13 @@ public class BasicLayerTest {
// cf3: m3 requires m2
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires("m2")
.build();
ModuleFinder finder3 = ModuleUtils.finderOf(descriptor3);
- Configuration cf3 = resolveRequires(cf2, finder3, "m3");
+ Configuration cf3 = resolve(cf2, finder3, "m3");
ClassLoader cl3 = new ClassLoader() { };
Layer layer3 = layer2.defineModules(cf3, mn -> cl3);
@@ -610,18 +598,16 @@ public class BasicLayerTest {
// cf1: m1, m2 requires transitive m1
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
- ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ ModuleDescriptor descriptor2 = newBuilder("m2")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m1")
.build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
- Configuration cf1 = resolveRequires(finder1, "m2");
+ Configuration cf1 = resolve(finder1, "m2");
ClassLoader cl1 = new ClassLoader() { };
Layer layer1 = Layer.empty().defineModules(cf1, mn -> cl1);
@@ -629,20 +615,18 @@ public class BasicLayerTest {
// cf2: m3 requires transitive m2, m4 requires m3
- ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3")
+ ModuleDescriptor descriptor3 = newBuilder("m3")
.requires(Set.of(Requires.Modifier.TRANSITIVE), "m2")
.build();
- ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4")
+ ModuleDescriptor descriptor4 = newBuilder("m4")
.requires("m3")
.build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4);
- Configuration cf2 = resolveRequires(cf1, finder2, "m3", "m4");
+ Configuration cf2 = resolve(cf1, finder2, "m3", "m4");
ClassLoader cl2 = new ClassLoader() { };
Layer layer2 = layer1.defineModules(cf2, mn -> cl2);
@@ -693,8 +677,7 @@ public class BasicLayerTest {
@Test(expectedExceptions = { LayerInstantiationException.class })
public void testModuleAlreadyDefinedToLoader() {
- ModuleDescriptor md
- = ModuleDescriptor.module("m")
+ ModuleDescriptor md = newBuilder("m")
.requires("java.base")
.build();
@@ -702,7 +685,7 @@ public class BasicLayerTest {
Configuration parent = Layer.boot().configuration();
- Configuration cf = parent.resolveRequires(finder, ModuleFinder.of(), Set.of("m"));
+ Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m"));
ClassLoader loader = new ClassLoader() { };
@@ -722,15 +705,13 @@ public class BasicLayerTest {
@Test(expectedExceptions = { LayerInstantiationException.class })
public void testPackageAlreadyInNamedModule() {
- ModuleDescriptor md1
- = ModuleDescriptor.module("m1")
- .contains("p")
+ ModuleDescriptor md1 = newBuilder("m1")
+ .packages(Set.of("p"))
.requires("java.base")
.build();
- ModuleDescriptor md2
- = ModuleDescriptor.module("m2")
- .contains("p")
+ ModuleDescriptor md2 = newBuilder("m2")
+ .packages(Set.of("p"))
.requires("java.base")
.build();
@@ -742,13 +723,13 @@ public class BasicLayerTest {
Configuration parent = Layer.boot().configuration();
- Configuration cf1 = parent.resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
+ Configuration cf1 = parent.resolve(finder, ModuleFinder.of(), Set.of("m1"));
Layer layer1 = Layer.boot().defineModules(cf1, mn -> loader);
// attempt to define m2 containing package p to class loader
- Configuration cf2 = parent.resolveRequires(finder, ModuleFinder.of(), Set.of("m2"));
+ Configuration cf2 = parent.resolve(finder, ModuleFinder.of(), Set.of("m2"));
// should throw exception because p already in m1
Layer layer2 = Layer.boot().defineModules(cf2, mn -> loader);
@@ -767,16 +748,15 @@ public class BasicLayerTest {
Class> c = layertest.Test.class;
assertFalse(c.getModule().isNamed()); // in unnamed module
- ModuleDescriptor md
- = ModuleDescriptor.module("m")
- .contains(c.getPackageName())
+ ModuleDescriptor md = newBuilder("m")
+ .packages(Set.of(c.getPackageName()))
.requires("java.base")
.build();
ModuleFinder finder = ModuleUtils.finderOf(md);
Configuration parent = Layer.boot().configuration();
- Configuration cf = parent.resolveRequires(finder, ModuleFinder.of(), Set.of("m"));
+ Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m"));
Layer.boot().defineModules(cf, mn -> c.getClassLoader());
}
@@ -786,8 +766,7 @@ public class BasicLayerTest {
* Attempt to create a Layer with a module named "java.base".
*/
public void testLayerWithJavaBase() {
- ModuleDescriptor descriptor
- = ModuleDescriptor.module("java.base")
+ ModuleDescriptor descriptor = newBuilder("java.base")
.exports("java.lang")
.build();
@@ -795,7 +774,7 @@ public class BasicLayerTest {
Configuration cf = Layer.boot()
.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of("java.base"));
+ .resolve(finder, ModuleFinder.of(), Set.of("java.base"));
assertTrue(cf.modules().size() == 1);
ClassLoader scl = ClassLoader.getSystemClassLoader();
@@ -824,16 +803,15 @@ public class BasicLayerTest {
*/
@Test(enabled = false)
public void testLayerWithJavaPackage() {
- ModuleDescriptor descriptor
- = ModuleDescriptor.module("foo")
- .contains("java.foo")
+ ModuleDescriptor descriptor = newBuilder("foo")
+ .packages(Set.of("java.foo"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
Configuration cf = Layer.boot()
.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of("foo"));
+ .resolve(finder, ModuleFinder.of(), Set.of("foo"));
assertTrue(cf.modules().size() == 1);
ClassLoader pcl = ClassLoader.getPlatformClassLoader();
@@ -870,15 +848,14 @@ public class BasicLayerTest {
*/
@Test(expectedExceptions = { LayerInstantiationException.class })
public void testLayerWithBootLoader() {
- ModuleDescriptor descriptor
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor = newBuilder("m1")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor);
Configuration cf = Layer.boot()
.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
+ .resolve(finder, ModuleFinder.of(), Set.of("m1"));
assertTrue(cf.modules().size() == 1);
Layer.boot().defineModules(cf, mn -> null );
@@ -891,15 +868,14 @@ public class BasicLayerTest {
@Test(expectedExceptions = { IllegalArgumentException.class })
public void testIncorrectParent1() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.requires("java.base")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
Configuration parent = Layer.boot().configuration();
- Configuration cf = parent.resolveRequires(finder, ModuleFinder.of(), Set.of("m1"));
+ Configuration cf = parent.resolve(finder, ModuleFinder.of(), Set.of("m1"));
ClassLoader loader = new ClassLoader() { };
Layer.empty().defineModules(cf, mn -> loader);
@@ -912,13 +888,12 @@ public class BasicLayerTest {
@Test(expectedExceptions = { IllegalArgumentException.class })
public void testIncorrectParent2() {
- ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
+ ModuleDescriptor descriptor1 = newBuilder("m1")
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1);
- Configuration cf = resolveRequires(finder, "m1");
+ Configuration cf = resolve(finder, "m1");
ClassLoader loader = new ClassLoader() { };
Layer.boot().defineModules(cf, mn -> loader);
@@ -935,7 +910,7 @@ public class BasicLayerTest {
@Test(expectedExceptions = { NullPointerException.class })
public void testCreateWithNull2() {
- Configuration cf = resolveRequires(Layer.boot().configuration(), ModuleFinder.of());
+ Configuration cf = resolve(Layer.boot().configuration(), ModuleFinder.of());
Layer.boot().defineModules(cf, null);
}
@@ -975,14 +950,14 @@ public class BasicLayerTest {
* Resolve the given modules, by name, and returns the resulting
* Configuration.
*/
- private static Configuration resolveRequires(Configuration cf,
- ModuleFinder finder,
- String... roots) {
- return cf.resolveRequires(finder, ModuleFinder.of(), Set.of(roots));
+ private static Configuration resolve(Configuration cf,
+ ModuleFinder finder,
+ String... roots) {
+ return cf.resolve(finder, ModuleFinder.of(), Set.of(roots));
}
- private static Configuration resolveRequires(ModuleFinder finder,
- String... roots) {
- return resolveRequires(Configuration.empty(), finder, roots);
+ private static Configuration resolve(ModuleFinder finder,
+ String... roots) {
+ return resolve(Configuration.empty(), finder, roots);
}
}
diff --git a/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java b/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java
index 23c7d06d15d..ac6c035c297 100644
--- a/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java
+++ b/jdk/test/java/lang/reflect/Layer/LayerAndLoadersTest.java
@@ -81,7 +81,7 @@ public class LayerAndLoadersTest {
*/
public void testWithOneLoader() throws Exception {
- Configuration cf = resolveRequires("m1");
+ Configuration cf = resolve("m1");
ClassLoader scl = ClassLoader.getSystemClassLoader();
@@ -110,7 +110,7 @@ public class LayerAndLoadersTest {
*/
public void testWithManyLoaders() throws Exception {
- Configuration cf = resolveRequires("m1");
+ Configuration cf = resolve("m1");
ClassLoader scl = ClassLoader.getSystemClassLoader();
@@ -145,7 +145,7 @@ public class LayerAndLoadersTest {
*/
public void testServicesWithOneLoader() throws Exception {
- Configuration cf = resolveRequiresAndUses("m1");
+ Configuration cf = resolveAndBind("m1");
ClassLoader scl = ClassLoader.getSystemClassLoader();
@@ -186,7 +186,7 @@ public class LayerAndLoadersTest {
*/
public void testServicesWithManyLoaders() throws Exception {
- Configuration cf = resolveRequiresAndUses("m1");
+ Configuration cf = resolveAndBind("m1");
ClassLoader scl = ClassLoader.getSystemClassLoader();
@@ -233,7 +233,7 @@ public class LayerAndLoadersTest {
*/
public void testDelegationToParent() throws Exception {
- Configuration cf = resolveRequires("m1");
+ Configuration cf = resolve("m1");
ClassLoader parent = this.getClass().getClassLoader();
String cn = this.getClass().getName();
@@ -267,16 +267,16 @@ public class LayerAndLoadersTest {
public void testOverlappingPackages() {
ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1").exports("p").build();
+ = ModuleDescriptor.newModule("m1").exports("p").build();
ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2").exports("p").build();
+ = ModuleDescriptor.newModule("m2").exports("p").build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
Configuration cf = Layer.boot()
.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of("m1", "m2"));
+ .resolve(finder, ModuleFinder.of(), Set.of("m1", "m2"));
// cannot define both module m1 and m2 to the same class loader
try {
@@ -301,29 +301,29 @@ public class LayerAndLoadersTest {
public void testSplitDelegation() {
ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1").exports("p").build();
+ = ModuleDescriptor.newModule("m1").exports("p").build();
ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2").exports("p").build();
+ = ModuleDescriptor.newModule("m2").exports("p").build();
ModuleFinder finder1 = ModuleUtils.finderOf(descriptor1, descriptor2);
Configuration cf1 = Layer.boot()
.configuration()
- .resolveRequires(finder1, ModuleFinder.of(), Set.of("m1", "m2"));
+ .resolve(finder1, ModuleFinder.of(), Set.of("m1", "m2"));
Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
checkLayer(layer1, "m1", "m2");
ModuleDescriptor descriptor3
- = ModuleDescriptor.module("m3").requires("m1").build();
+ = ModuleDescriptor.newModule("m3").requires("m1").build();
ModuleDescriptor descriptor4
- = ModuleDescriptor.module("m4").requires("m2").build();
+ = ModuleDescriptor.newModule("m4").requires("m2").build();
ModuleFinder finder2 = ModuleUtils.finderOf(descriptor3, descriptor4);
- Configuration cf2 = cf1.resolveRequires(finder2, ModuleFinder.of(),
+ Configuration cf2 = cf1.resolve(finder2, ModuleFinder.of(),
Set.of("m3", "m4"));
// package p cannot be supplied by two class loaders
@@ -349,13 +349,13 @@ public class LayerAndLoadersTest {
*/
public void testOverriding1() throws Exception {
- Configuration cf1 = resolveRequires("m1");
+ Configuration cf1 = resolve("m1");
Layer layer1 = Layer.boot().defineModulesWithOneLoader(cf1, null);
checkLayer(layer1, "m1", "m2", "m3");
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
- Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
+ Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
Set.of("m1"));
Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
@@ -398,13 +398,13 @@ public class LayerAndLoadersTest {
*/
public void testOverriding2() throws Exception {
- Configuration cf1 = resolveRequires("m1");
+ Configuration cf1 = resolve("m1");
Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
checkLayer(layer1, "m1", "m2", "m3");
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
- Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
+ Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
Set.of("m1"));
Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
@@ -492,14 +492,14 @@ public class LayerAndLoadersTest {
*/
public void testOverriding3() throws Exception {
- Configuration cf1 = resolveRequires("m1");
+ Configuration cf1 = resolve("m1");
Layer layer1 = Layer.boot().defineModulesWithOneLoader(cf1, null);
checkLayer(layer1, "m1", "m2", "m3");
ModuleFinder finder = finderFor("m1", "m3");
- Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
+ Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
Set.of("m1"));
Layer layer2 = layer1.defineModulesWithOneLoader(cf2, null);
@@ -529,14 +529,14 @@ public class LayerAndLoadersTest {
*/
public void testOverriding4() throws Exception {
- Configuration cf1 = resolveRequires("m1");
+ Configuration cf1 = resolve("m1");
Layer layer1 = Layer.boot().defineModulesWithManyLoaders(cf1, null);
checkLayer(layer1, "m1", "m2", "m3");
ModuleFinder finder = finderFor("m1", "m3");
- Configuration cf2 = cf1.resolveRequires(finder, ModuleFinder.of(),
+ Configuration cf2 = cf1.resolve(finder, ModuleFinder.of(),
Set.of("m1"));
Layer layer2 = layer1.defineModulesWithManyLoaders(cf2, null);
@@ -577,7 +577,7 @@ public class LayerAndLoadersTest {
* Layer.defineModulesWithOneLoader.
*/
public void testResourcesOneLoader() throws Exception {
- Configuration cf = resolveRequires("m1");
+ Configuration cf = resolve("m1");
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = Layer.boot().defineModulesWithOneLoader(cf, scl);
ClassLoader loader = layer.findLoader("m1");
@@ -589,7 +589,7 @@ public class LayerAndLoadersTest {
* Layer.defineModulesWithOneLoader.
*/
public void testResourcesManyLoaders() throws Exception {
- Configuration cf = resolveRequires("m1");
+ Configuration cf = resolve("m1");
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = Layer.boot().defineModulesWithManyLoaders(cf, scl);
ClassLoader loader = layer.findLoader("m1");
@@ -621,22 +621,22 @@ public class LayerAndLoadersTest {
* Resolve the given modules, by name, and returns the resulting
* Configuration.
*/
- private static Configuration resolveRequires(String... roots) {
+ private static Configuration resolve(String... roots) {
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
return Layer.boot()
.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of(roots));
+ .resolve(finder, ModuleFinder.of(), Set.of(roots));
}
/**
* Resolve the given modules, by name, and returns the resulting
* Configuration.
*/
- private static Configuration resolveRequiresAndUses(String... roots) {
+ private static Configuration resolveAndBind(String... roots) {
ModuleFinder finder = ModuleFinder.of(MODS_DIR);
return Layer.boot()
.configuration()
- .resolveRequiresAndUses(finder, ModuleFinder.of(), Set.of(roots));
+ .resolveAndBind(finder, ModuleFinder.of(), Set.of(roots));
}
diff --git a/jdk/test/java/lang/reflect/Layer/LayerControllerTest.java b/jdk/test/java/lang/reflect/Layer/LayerControllerTest.java
index 6582e493c07..4e4a0dbd5bd 100644
--- a/jdk/test/java/lang/reflect/Layer/LayerControllerTest.java
+++ b/jdk/test/java/lang/reflect/Layer/LayerControllerTest.java
@@ -50,22 +50,22 @@ public class LayerControllerTest {
*/
private Layer.Controller createTestLayer() {
ModuleDescriptor descriptor1
- = ModuleDescriptor.module("m1")
- .contains("p1")
+ = ModuleDescriptor.newModule("m1")
+ .packages(Set.of("p1"))
.requires("java.base")
.build();
ModuleDescriptor descriptor2
- = ModuleDescriptor.module("m2")
+ = ModuleDescriptor.newModule("m2")
.requires("java.base")
- .contains("p2")
+ .packages(Set.of("p2"))
.build();
ModuleFinder finder = ModuleUtils.finderOf(descriptor1, descriptor2);
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of("m1", "m2"));
+ .resolve(finder, ModuleFinder.of(), Set.of("m1", "m2"));
ClassLoader scl = ClassLoader.getSystemClassLoader();
@@ -193,4 +193,4 @@ public class LayerControllerTest {
assertTrue(false);
} catch (NullPointerException expected) { }
}
-}
\ No newline at end of file
+}
diff --git a/jdk/test/java/lang/reflect/Module/AnnotationsTest.java b/jdk/test/java/lang/reflect/Module/AnnotationsTest.java
index 0390698b282..d30a0c07779 100644
--- a/jdk/test/java/lang/reflect/Module/AnnotationsTest.java
+++ b/jdk/test/java/lang/reflect/Module/AnnotationsTest.java
@@ -144,7 +144,7 @@ public class AnnotationsTest {
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of(name));
+ .resolve(finder, ModuleFinder.of(), Set.of(name));
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = bootLayer.defineModulesWithOneLoader(cf, scl);
diff --git a/jdk/test/java/lang/reflect/Module/BasicModuleTest.java b/jdk/test/java/lang/reflect/Module/BasicModuleTest.java
index bafa57ba3a8..90fb62b4a2e 100644
--- a/jdk/test/java/lang/reflect/Module/BasicModuleTest.java
+++ b/jdk/test/java/lang/reflect/Module/BasicModuleTest.java
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2014, 2016, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -25,8 +25,10 @@ import java.lang.module.ModuleDescriptor.Exports;
import java.lang.module.ResolvedModule;
import java.lang.reflect.Layer;
import java.lang.reflect.Module;
+import java.nio.file.spi.FileSystemProvider; // service type in java.base
import java.util.function.Predicate;
import java.util.stream.Stream;
+import javax.print.PrintServiceLookup; // service type in java.desktop
import org.testng.annotations.Test;
import static org.testng.Assert.*;
@@ -170,6 +172,14 @@ public class BasicModuleTest {
// canRead
assertTrue(base.canRead(base));
+ assertFalse(base.canRead(thisModule));
+
+ // addReads
+ try {
+ base.addReads(thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(base.canRead(thisModule));
// isExported
assertTrue(base.isExported("java.lang"));
@@ -182,6 +192,18 @@ public class BasicModuleTest {
assertFalse(base.isExported("java.wombat", thisModule));
assertFalse(base.isExported("java.wombat", base));
+ // addExports
+ try {
+ base.addExports("java.lang", thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ try {
+ base.addExports("jdk.internal.misc", thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(base.isExported("jdk.internal.misc"));
+ assertFalse(base.isExported("jdk.internal.misc", thisModule));
+
// isOpen
assertFalse(base.isOpen("java.lang"));
assertFalse(base.isOpen("java.lang", thisModule));
@@ -192,6 +214,29 @@ public class BasicModuleTest {
assertFalse(base.isOpen("java.wombat"));
assertFalse(base.isOpen("java.wombat", thisModule));
assertFalse(base.isOpen("java.wombat", base));
+
+ // addOpens
+ try {
+ base.addOpens("jdk.internal.misc", thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(base.isOpen("jdk.internal.misc"));
+ assertFalse(base.isOpen("jdk.internal.misc", thisModule));
+
+ // canUse
+ assertTrue(base.canUse(FileSystemProvider.class));
+ assertFalse(base.canUse(Thread.class));
+
+ // addUses
+ try {
+ base.addUses(FileSystemProvider.class);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ try {
+ base.addUses(Thread.class);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(base.canUse(Thread.class));
}
@@ -226,26 +271,68 @@ public class BasicModuleTest {
assertTrue(desktop.canRead(base));
assertTrue(desktop.canRead(xml));
+ // addReads
+ try {
+ desktop.addReads(thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(desktop.canRead(thisModule));
+
// isExported
assertTrue(desktop.isExported("java.awt"));
assertTrue(desktop.isExported("java.awt", thisModule));
+ assertFalse(desktop.isExported("sun.awt"));
+ assertFalse(desktop.isExported("sun.awt", thisModule));
+ assertTrue(desktop.isExported("sun.awt", desktop));
assertFalse(desktop.isExported("java.wombat"));
assertFalse(desktop.isExported("java.wombat", thisModule));
+ assertFalse(desktop.isExported("java.wombat", base));
+
+ // addExports
+ try {
+ desktop.addExports("java.awt", thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ try {
+ desktop.addExports("sun.awt", thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(desktop.isExported("sun.awt"));
+ assertFalse(desktop.isExported("sun.awt", thisModule));
+
+ // isOpen
+ assertFalse(desktop.isOpen("java.awt"));
+ assertFalse(desktop.isOpen("java.awt", thisModule));
+ assertTrue(desktop.isOpen("java.awt", desktop));
+ assertFalse(desktop.isOpen("sun.awt"));
+ assertFalse(desktop.isOpen("sun.awt", thisModule));
+ assertTrue(desktop.isOpen("sun.awt", desktop));
+ assertFalse(desktop.isOpen("java.wombat"));
+ assertFalse(desktop.isOpen("java.wombat", thisModule));
+ assertFalse(desktop.isOpen("java.wombat", desktop));
+
+ // addOpens
+ try {
+ base.addOpens("sun.awt", thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(desktop.isOpen("sun.awt"));
+ assertFalse(desktop.isOpen("sun.awt", thisModule));
+
+ // canUse
+ assertTrue(base.canUse(FileSystemProvider.class));
+ assertFalse(base.canUse(Thread.class));
+
+ // addUses
+ try {
+ desktop.addUses(PrintServiceLookup.class);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ try {
+ desktop.addUses(Thread.class);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ assertFalse(desktop.canUse(Thread.class));
}
-
- @Test(expectedExceptions = { NullPointerException.class })
- public void testIsExportedNull() {
- Module thisModule = this.getClass().getModule();
- thisModule.isExported(null, thisModule);
- }
-
-
- @Test(expectedExceptions = { NullPointerException.class })
- public void testIsExportedToNull() {
- Module thisModule = this.getClass().getModule();
- thisModule.isExported("", null);
- }
-
-
}
diff --git a/jdk/test/java/lang/reflect/Module/WithSecurityManager.java b/jdk/test/java/lang/reflect/Module/WithSecurityManager.java
index dfb6b760f10..794ebf00e44 100644
--- a/jdk/test/java/lang/reflect/Module/WithSecurityManager.java
+++ b/jdk/test/java/lang/reflect/Module/WithSecurityManager.java
@@ -126,7 +126,7 @@ public class WithSecurityManager {
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer
.configuration()
- .resolveRequires(finder, ModuleFinder.of(), Set.of(ANOTHER_MODULE));
+ .resolve(finder, ModuleFinder.of(), Set.of(ANOTHER_MODULE));
Layer layer = bootLayer.defineModulesWithOneLoader(cf, null);
Optional om = layer.findModule(mn);
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/Driver.java b/jdk/test/java/lang/reflect/Module/addXXX/Driver.java
new file mode 100644
index 00000000000..0daf09ffe2a
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/Driver.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/**
+ * @test
+ * @build test/* m1/* m2/* m3/* m4/*
+ * @run testng/othervm test/test.Main
+ * @summary Basic test case for Module::addXXX methods
+ */
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m1/module-info.java b/jdk/test/java/lang/reflect/Module/addXXX/m1/module-info.java
new file mode 100644
index 00000000000..a34a266ef57
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m1/module-info.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+module m1 {
+ exports p1;
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m1/p1/C.java b/jdk/test/java/lang/reflect/Module/addXXX/m1/p1/C.java
new file mode 100644
index 00000000000..86357613dc5
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m1/p1/C.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package p1;
+
+public class C {
+ public C() { }
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m2/module-info.java b/jdk/test/java/lang/reflect/Module/addXXX/m2/module-info.java
new file mode 100644
index 00000000000..918d72aac64
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m2/module-info.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+module m2 {
+ exports p2;
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m2/p2/C.java b/jdk/test/java/lang/reflect/Module/addXXX/m2/p2/C.java
new file mode 100644
index 00000000000..6a87a2eba87
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m2/p2/C.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package p2;
+
+import java.lang.reflect.Module;
+
+public class C {
+
+ public static void export(String pn, Module m) {
+ C.class.getModule().addExports(pn, m);
+ }
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m2/p2/internal/C.java b/jdk/test/java/lang/reflect/Module/addXXX/m2/p2/internal/C.java
new file mode 100644
index 00000000000..b3009610032
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m2/p2/internal/C.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package p2.internal;
+
+public class C {
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m3/module-info.java b/jdk/test/java/lang/reflect/Module/addXXX/m3/module-info.java
new file mode 100644
index 00000000000..75d5c1664be
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m3/module-info.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+module m3 {
+ exports p3 to test;
+ opens p3 to test;
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m3/p3/C.java b/jdk/test/java/lang/reflect/Module/addXXX/m3/p3/C.java
new file mode 100644
index 00000000000..c1013ce13db
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m3/p3/C.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package p3;
+
+public class C {
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m4/module-info.java b/jdk/test/java/lang/reflect/Module/addXXX/m4/module-info.java
new file mode 100644
index 00000000000..313ea941316
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m4/module-info.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+module m4 {
+ exports p4;
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/m4/p4/C.java b/jdk/test/java/lang/reflect/Module/addXXX/m4/p4/C.java
new file mode 100644
index 00000000000..a5e9a127f8c
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/m4/p4/C.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package p4;
+
+import java.lang.reflect.Constructor;
+
+public class C {
+ public static Object tryNewInstance(Class> clazz) throws Exception {
+ Constructor> ctor = clazz.getDeclaredConstructor();
+ return ctor.newInstance();
+ }
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/test/module-info.java b/jdk/test/java/lang/reflect/Module/addXXX/test/module-info.java
new file mode 100644
index 00000000000..ebfab744dec
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/test/module-info.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+module test {
+ exports test to testng;
+
+ requires m2;
+ requires m3;
+ requires m4;
+ requires testng;
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/test/test/C.java b/jdk/test/java/lang/reflect/Module/addXXX/test/test/C.java
new file mode 100644
index 00000000000..e031680445c
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/test/test/C.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package test;
+
+public class C { }
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/test/test/Main.java b/jdk/test/java/lang/reflect/Module/addXXX/test/test/Main.java
new file mode 100644
index 00000000000..924f0a87de4
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/test/test/Main.java
@@ -0,0 +1,196 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package test;
+
+import java.lang.invoke.MethodHandle;
+import java.lang.invoke.MethodHandles;
+import java.lang.invoke.MethodType;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Module;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
+
+import org.testng.annotations.Test;
+import static org.testng.Assert.*;
+
+/**
+ * Basic test case for Module::addXXXX methods
+ */
+
+@Test
+public class Main {
+
+ /**
+ * Test Module::addReads
+ *
+ * module test { }
+ *
+ * module m1 {
+ * exports p1;
+ * }
+ */
+ public void testAddReads() throws Throwable {
+ Module thisModule = Main.class.getModule();
+ Class> clazz = Class.forName("p1.C");
+ Module m1 = clazz.getModule();
+
+ // test does not read m1
+ assertFalse(thisModule.canRead(m1));
+ MethodHandles.Lookup lookup = MethodHandles.lookup();
+ MethodType mt = MethodType.methodType(void.class);
+ try {
+ lookup.findConstructor(clazz, mt);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ // update test to read m1
+ Module result = thisModule.addReads(m1);
+ assertTrue(result== thisModule);
+ assertTrue(thisModule.canRead(m1));
+ MethodHandle mh = lookup.findConstructor(clazz, mt);
+ Object obj = mh.invoke();
+
+ // attempt to update m1 to read test
+ try {
+ m1.addReads(thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ }
+
+
+ /**
+ * Test Module::addExports
+ *
+ * module test {
+ * requires m2;
+ * }
+ * module m2 {
+ * exports p2;
+ * contains package p2.internal;
+ * }
+ */
+ public void testAddExports() throws Exception {
+ Module thisModule = Main.class.getModule();
+ Module m2 = p2.C.class.getModule();
+ Class> targetClass = Class.forName("p2.internal.C");
+ String p2Internal = targetClass.getPackageName();
+ assertTrue(targetClass.getModule() == m2);
+
+ // m2 does not export p2.internal to test
+ assertFalse(m2.isExported(p2Internal, thisModule));
+ Constructor> ctor = targetClass.getDeclaredConstructor();
+ try {
+ ctor.newInstance();
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ // update m2 to export p2.internal to test
+ p2.C.export(p2Internal, thisModule);
+ assertTrue(m2.isExported(p2Internal, thisModule));
+ ctor.newInstance(); // should succeed
+
+ // attempt to update m2 to export a package to test
+ try {
+ m2.addExports("p2.other", thisModule);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ }
+
+ /**
+ * Test Module::addOpens
+ *
+ * module test {
+ * requires m3;
+ * requires m4;
+ * }
+ *
+ * module m3 {
+ * exports p3 to test;
+ * opens p3 to test;
+ * }
+ *
+ * module m4 {
+ * exports p4;
+ * }
+ */
+ public void testAddOpens() throws Exception {
+ Module thisModule = Main.class.getModule();
+ Module m3 = p3.C.class.getModule();
+ Module m4 = p4.C.class.getModule();
+
+ // test does not open package test to m4
+ assertFalse(thisModule.isOpen("test", m4));
+ try {
+ p4.C.tryNewInstance(test.C.class);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+ // open test to m4
+ thisModule.addOpens("test", m4);
+ p4.C.tryNewInstance(test.C.class); // should succeed
+
+
+ // m3 does not open p3 to m4
+ assertFalse(m3.isOpen("p3", m4));
+ try {
+ p4.C.tryNewInstance(p3.C.class);
+ assertTrue(false);
+ } catch (IllegalAccessException expected) { }
+
+
+ // m3 opens p3 to test => test allowed to open m3/p3 to m4
+ assertTrue(m3.isOpen("p3", thisModule));
+ m3.addOpens("p3", m4);
+ assertTrue(m3.isOpen("p3", m4));
+ p4.C.tryNewInstance(p3.C.class); // should succeed
+
+
+ // attempt to update m4 to open package to m3
+ try {
+ m4.addOpens("p4", m3);
+ assertTrue(false);
+ } catch (IllegalCallerException expected) { }
+ }
+
+
+ /**
+ * Test Module::addUses
+ */
+ public void testAddUses() {
+ Module thisModule = Main.class.getModule();
+
+ assertFalse(thisModule.canUse(Service.class));
+ try {
+ ServiceLoader.load(Service.class);
+ assertTrue(false);
+ } catch (ServiceConfigurationError expected) { }
+
+ Module result = thisModule.addUses(Service.class);
+ assertTrue(result== thisModule);
+
+ assertTrue(thisModule.canUse(Service.class));
+ ServiceLoader.load(Service.class); // no exception
+ }
+
+}
diff --git a/jdk/test/java/lang/reflect/Module/addXXX/test/test/Service.java b/jdk/test/java/lang/reflect/Module/addXXX/test/test/Service.java
new file mode 100644
index 00000000000..9fd5b8d862a
--- /dev/null
+++ b/jdk/test/java/lang/reflect/Module/addXXX/test/test/Service.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+package test;
+
+/**
+ * Simple service type
+ */
+public interface Service { }
diff --git a/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java b/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java
index 55e11f1b3ec..3ef48cd79fa 100644
--- a/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java
+++ b/jdk/test/java/lang/reflect/Proxy/ProxyClassAccessTest.java
@@ -91,7 +91,7 @@ public class ProxyClassAccessTest {
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer
.configuration()
- .resolveRequiresAndUses(ModuleFinder.of(), finder, modules);
+ .resolveAndBind(ModuleFinder.of(), finder, modules);
ClassLoader parentLoader = this.getClass().getClassLoader();
Layer layer = bootLayer.defineModulesWithOneLoader(cf, parentLoader);
diff --git a/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java b/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java
index 5b04c93596b..767afd23323 100644
--- a/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java
+++ b/jdk/test/java/lang/reflect/Proxy/ProxyLayerTest.java
@@ -79,7 +79,7 @@ public class ProxyLayerTest {
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer
.configuration()
- .resolveRequiresAndUses(ModuleFinder.of(), finder, Arrays.asList(modules));
+ .resolveAndBind(ModuleFinder.of(), finder, Arrays.asList(modules));
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = bootLayer.defineModulesWithOneLoader(cf, scl);
@@ -113,7 +113,7 @@ public class ProxyLayerTest {
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer
.configuration()
- .resolveRequiresAndUses(ModuleFinder.of(), finder, Arrays.asList(modules));
+ .resolveAndBind(ModuleFinder.of(), finder, Arrays.asList(modules));
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = bootLayer.defineModulesWithOneLoader(cf, scl);
@@ -143,7 +143,7 @@ public class ProxyLayerTest {
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer
.configuration()
- .resolveRequiresAndUses(ModuleFinder.of(), finder, Arrays.asList(modules));
+ .resolveAndBind(ModuleFinder.of(), finder, Arrays.asList(modules));
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = bootLayer.defineModulesWithOneLoader(cf, scl);
diff --git a/jdk/test/java/security/modules/ModularTest.java b/jdk/test/java/security/modules/ModularTest.java
index 9e67094944f..56635c99b8d 100644
--- a/jdk/test/java/security/modules/ModularTest.java
+++ b/jdk/test/java/security/modules/ModularTest.java
@@ -164,9 +164,9 @@ public abstract class ModularTest {
final Builder builder;
if (moduleType == MODULE_TYPE.EXPLICIT) {
System.out.format(" %nGenerating ModuleDescriptor object");
- builder = ModuleDescriptor.module(moduleName).exports(pkg);
+ builder = ModuleDescriptor.newModule(moduleName).exports(pkg);
if (isService && serviceInterface != null && serviceImpl != null) {
- builder.provides(serviceInterface, serviceImpl);
+ builder.provides(serviceInterface, List.of(serviceImpl));
} else {
if (serviceInterface != null) {
builder.uses(serviceInterface);
diff --git a/jdk/test/java/util/ServiceLoader/modules/BadProvidersTest.java b/jdk/test/java/util/ServiceLoader/modules/BadProvidersTest.java
index c28e3b91911..8d3c2d27d3a 100644
--- a/jdk/test/java/util/ServiceLoader/modules/BadProvidersTest.java
+++ b/jdk/test/java/util/ServiceLoader/modules/BadProvidersTest.java
@@ -90,7 +90,7 @@ public class BadProvidersTest {
Layer bootLayer = Layer.boot();
Configuration cf = bootLayer.configuration()
- .resolveRequiresAndUses(finder, ModuleFinder.of(), Set.of(moduleName));
+ .resolveAndBind(finder, ModuleFinder.of(), Set.of(moduleName));
ClassLoader scl = ClassLoader.getSystemClassLoader();
diff --git a/jdk/test/java/util/ServiceLoader/modules/Basic.java b/jdk/test/java/util/ServiceLoader/modules/Basic.java
index 7833c0e2771..4dca546ea36 100644
--- a/jdk/test/java/util/ServiceLoader/modules/Basic.java
+++ b/jdk/test/java/util/ServiceLoader/modules/Basic.java
@@ -311,17 +311,17 @@ public class Basic {
ModuleFinder finder = ModuleFinder.of(dir);
// layer1
- Configuration cf1 = cf0.resolveRequiresAndUses(finder, ModuleFinder.of(), Set.of());
+ Configuration cf1 = cf0.resolveAndBind(finder, ModuleFinder.of(), Set.of());
Layer layer1 = bootLayer.defineModulesWithOneLoader(cf1, scl);
assertTrue(layer1.modules().size() == 1);
// layer2
- Configuration cf2 = cf0.resolveRequiresAndUses(finder, ModuleFinder.of(), Set.of());
+ Configuration cf2 = cf0.resolveAndBind(finder, ModuleFinder.of(), Set.of());
Layer layer2 = bootLayer.defineModulesWithOneLoader(cf2, scl);
assertTrue(layer2.modules().size() == 1);
// layer3 with layer1 and layer2 as parents
- Configuration cf3 = Configuration.resolveRequiresAndUses(finder,
+ Configuration cf3 = Configuration.resolveAndBind(finder,
List.of(cf1, cf2),
ModuleFinder.of(),
Set.of());
@@ -413,7 +413,7 @@ public class Basic {
Collections.addAll(roots, modules);
Layer bootLayer = Layer.boot();
Configuration parent = bootLayer.configuration();
- Configuration cf = parent.resolveRequires(finder, ModuleFinder.of(), roots);
+ Configuration cf = parent.resolve(finder, ModuleFinder.of(), roots);
ClassLoader scl = ClassLoader.getSystemClassLoader();
Layer layer = bootLayer.defineModulesWithOneLoader(cf, scl);
assertTrue(layer.modules().size() == 1);
diff --git a/jdk/test/jdk/internal/reflect/CallerSensitive/CheckCSMs.java b/jdk/test/jdk/internal/reflect/CallerSensitive/CheckCSMs.java
new file mode 100644
index 00000000000..126df3a75e6
--- /dev/null
+++ b/jdk/test/jdk/internal/reflect/CallerSensitive/CheckCSMs.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+import com.sun.tools.classfile.*;
+import com.sun.tools.jdeps.ClassFileReader;
+import static com.sun.tools.classfile.ConstantPool.*;
+import java.io.File;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.net.URI;
+import java.nio.file.FileSystem;
+import java.nio.file.FileSystems;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.FutureTask;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/*
+ * @test
+ * @summary CallerSensitive methods should be static or final instance
+ * methods except the known list of non-final instance methods
+ * @modules jdk.jdeps/com.sun.tools.classfile
+ * jdk.jdeps/com.sun.tools.jdeps
+ * @build CheckCSMs
+ * @run main/othervm/timeout=900 CheckCSMs
+ */
+public class CheckCSMs {
+ private static int numThreads = 3;
+ private static boolean listCSMs = false;
+ private final ExecutorService pool;
+
+ // The goal is to remove this list of Non-final instance @CS methods
+ // over time. Do not add any new one to this list.
+ private static Set KNOWN_NON_FINAL_CSMS =
+ Set.of("java/io/ObjectStreamField#getType ()Ljava/lang/Class;",
+ "java/io/ObjectStreamClass#forClass ()Ljava/lang/Class;",
+ "java/lang/Runtime#load (Ljava/lang/String;)V",
+ "java/lang/Runtime#loadLibrary (Ljava/lang/String;)V",
+ "java/lang/Thread#getContextClassLoader ()Ljava/lang/ClassLoader;",
+ "javax/sql/rowset/serial/SerialJavaObject#getFields ()[Ljava/lang/reflect/Field;"
+ );
+
+ public static void main(String[] args) throws Exception {
+ if (args.length > 0 && args[0].equals("--list")) {
+ listCSMs = true;
+ }
+
+ CheckCSMs checkCSMs = new CheckCSMs();
+ Set result = checkCSMs.run(getPlatformClasses());
+ if (!KNOWN_NON_FINAL_CSMS.equals(result)) {
+ Set diff = new HashSet<>(result);
+ diff.removeAll(KNOWN_NON_FINAL_CSMS);
+ throw new RuntimeException("Unexpected non-final instance method: " +
+ result.stream().sorted()
+ .collect(Collectors.joining("\n", "\n", "")));
+ }
+ }
+
+ private final Set nonFinalCSMs = new ConcurrentSkipListSet<>();
+ private final ReferenceFinder finder;
+ public CheckCSMs() {
+ this.finder = new ReferenceFinder(getFilter(), getVisitor());
+ pool = Executors.newFixedThreadPool(numThreads);
+
+ }
+
+ public Set run(Stream classes)
+ throws IOException, InterruptedException, ExecutionException,
+ ConstantPoolException
+ {
+ classes.forEach(this::processPath);
+ waitForCompletion();
+ pool.shutdown();
+ return nonFinalCSMs;
+ }
+
+
+ private ReferenceFinder.Filter getFilter() {
+ final String classname = "jdk/internal/reflect/Reflection";
+ final String method = "getCallerClass";
+ return new ReferenceFinder.Filter() {
+ public boolean accept(ConstantPool cpool, CPRefInfo cpref) {
+ try {
+ CONSTANT_NameAndType_info nat = cpref.getNameAndTypeInfo();
+ return cpref.getClassName().equals(classname) && nat.getName().equals(method);
+ } catch (ConstantPoolException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ };
+ }
+
+ private ReferenceFinder.Visitor getVisitor() {
+ return new ReferenceFinder.Visitor() {
+ public void visit(ClassFile cf, Method m, List refs) {
+ try {
+ // ignore jdk.unsupported/sun.reflect.Reflection.getCallerClass
+ // which is a "special" delegate to the internal getCallerClass
+ if (cf.getName().equals("sun/reflect/Reflection") &&
+ m.getName(cf.constant_pool).equals("getCallerClass"))
+ return;
+
+ String name = String.format("%s#%s %s", cf.getName(),
+ m.getName(cf.constant_pool),
+ m.descriptor.getValue(cf.constant_pool));
+ if (!CheckCSMs.isStaticOrFinal(cf, m, cf.constant_pool)) {
+ System.err.println("Unsupported @CallerSensitive: " + name);
+ nonFinalCSMs.add(name);
+ } else {
+ if (listCSMs) {
+ System.out.format("@CS %s%n", name);
+ }
+ }
+ } catch (ConstantPoolException ex) {
+ throw new RuntimeException(ex);
+ }
+ }
+ };
+ }
+
+ void processPath(Path path) {
+ try {
+ ClassFileReader reader = ClassFileReader.newInstance(path);
+ for (ClassFile cf : reader.getClassFiles()) {
+ if (cf.access_flags.is(AccessFlags.ACC_MODULE))
+ continue;
+
+ String classFileName = cf.getName();
+ // for each ClassFile
+ // parse constant pool to find matching method refs
+ // parse each method (caller)
+ // - visit and find method references matching the given method name
+ pool.submit(getTask(cf));
+ }
+ } catch (IOException x) {
+ throw new UncheckedIOException(x);
+ } catch (ConstantPoolException x) {
+ throw new RuntimeException(x);
+ }
+ }
+
+ private static final String CALLER_SENSITIVE_ANNOTATION
+ = "Ljdk/internal/reflect/CallerSensitive;";
+
+ private static boolean isCallerSensitive(Method m, ConstantPool cp)
+ throws ConstantPoolException
+ {
+ RuntimeAnnotations_attribute attr =
+ (RuntimeAnnotations_attribute)m.attributes.get(Attribute.RuntimeVisibleAnnotations);
+ if (attr != null) {
+ for (int i = 0; i < attr.annotations.length; i++) {
+ Annotation ann = attr.annotations[i];
+ String annType = cp.getUTF8Value(ann.type_index);
+ if (CALLER_SENSITIVE_ANNOTATION.equals(annType)) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ private static boolean isStaticOrFinal(ClassFile cf, Method m, ConstantPool cp)
+ throws ConstantPoolException
+ {
+ if (!isCallerSensitive(m, cp))
+ return false;
+
+ // either a static method or a final instance method
+ return m.access_flags.is(AccessFlags.ACC_STATIC) ||
+ m.access_flags.is(AccessFlags.ACC_FINAL) ||
+ cf.access_flags.is(AccessFlags.ACC_FINAL);
+ }
+
+ private final List> tasks = new ArrayList>();
+ private FutureTask getTask(final ClassFile cf) {
+ FutureTask task = new FutureTask(new Callable() {
+ public Void call() throws Exception {
+ finder.parse(cf);
+ return null;
+ }
+ });
+ tasks.add(task);
+ return task;
+ }
+
+ private void waitForCompletion() throws InterruptedException, ExecutionException {
+ for (FutureTask t : tasks) {
+ t.get();
+ }
+ if (tasks.isEmpty()) {
+ throw new RuntimeException("No classes found, or specified.");
+ }
+ System.out.println("Parsed " + tasks.size() + " classfiles");
+ }
+
+ static Stream getPlatformClasses() throws IOException {
+ Path home = Paths.get(System.getProperty("java.home"));
+
+ // Either an exploded build or an image.
+ File classes = home.resolve("modules").toFile();
+ if (classes.isDirectory()) {
+ return Stream.of(classes.toPath());
+ } else {
+ return jrtPaths();
+ }
+ }
+
+ static Stream jrtPaths() {
+ FileSystem jrt = FileSystems.getFileSystem(URI.create("jrt:/"));
+ Path root = jrt.getPath("/");
+
+ try {
+ return Files.walk(root)
+ .filter(p -> p.getNameCount() > 1)
+ .filter(p -> p.toString().endsWith(".class"));
+ } catch (IOException x) {
+ throw new UncheckedIOException(x);
+ }
+ }
+}
diff --git a/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java b/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java
index 72e337066cb..182fb4ee985 100644
--- a/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java
+++ b/jdk/test/jdk/modules/etc/VerifyModuleDelegation.java
@@ -46,7 +46,7 @@ public class VerifyModuleDelegation {
private static final String JAVA_BASE = "java.base";
private static final ModuleDescriptor BASE
- = ModuleDescriptor.module(JAVA_BASE).build();
+ = ModuleDescriptor.newModule(JAVA_BASE).build();
private static final Set MREFS
= Layer.boot().modules().stream().map(Module::getDescriptor)
diff --git a/jdk/test/jdk/modules/scenarios/container/src/container/container/Main.java b/jdk/test/jdk/modules/scenarios/container/src/container/container/Main.java
index 67f2416187f..ca3f0f3a0d2 100644
--- a/jdk/test/jdk/modules/scenarios/container/src/container/container/Main.java
+++ b/jdk/test/jdk/modules/scenarios/container/src/container/container/Main.java
@@ -71,9 +71,9 @@ public class Main {
ModuleFinder finder = ModuleFinder.of(paths);
Configuration cf = Layer.boot().configuration()
- .resolveRequiresAndUses(finder,
- ModuleFinder.of(),
- Set.of(appModuleName));
+ .resolveAndBind(finder,
+ ModuleFinder.of(),
+ Set.of(appModuleName));
System.out.println("Resolved");
cf.modules().stream()
diff --git a/jdk/test/sun/management/jdp/JdpJmxRemoteDynamicPortTest.java b/jdk/test/sun/management/jdp/JdpJmxRemoteDynamicPortTest.java
index 9ee4a0cd820..4e628995c18 100644
--- a/jdk/test/sun/management/jdp/JdpJmxRemoteDynamicPortTest.java
+++ b/jdk/test/sun/management/jdp/JdpJmxRemoteDynamicPortTest.java
@@ -27,7 +27,7 @@
* @summary Verify a non-zero value is assigned to jmxremote.port
* when VM is started with jmxremote.port=0.
* @library /lib/testlibrary
- * @modules java.management/sun.management.jdp
+ * @modules jdk.management.agent/sun.management.jdp
* @build jdk.testlibrary.* ClientConnection JdpTestUtil JdpTestCase JdpJmxRemoteDynamicPortTestCase DynamicLauncher
* @run main JdpJmxRemoteDynamicPortTest
*/
diff --git a/jdk/test/tools/jar/mmrjar/Basic.java b/jdk/test/tools/jar/mmrjar/Basic.java
index 6b0ad843641..0e83508b74d 100644
--- a/jdk/test/tools/jar/mmrjar/Basic.java
+++ b/jdk/test/tools/jar/mmrjar/Basic.java
@@ -331,7 +331,7 @@ public class Basic {
ModuleInfoExtender mie = ModuleInfoExtender.newExtender(
new ByteArrayInputStream(mdBytes));
- mie.mainClass("foo.main");
+ mie.mainClass("p.Main");
mie.version(Version.parse("1.0"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
@@ -345,7 +345,7 @@ public class Basic {
// different main-class
mie = ModuleInfoExtender.newExtender(new ByteArrayInputStream(mdBytes));
- mie.mainClass("foo.main2");
+ mie.mainClass("p.Main2");
mie.version(Version.parse("1.0"));
baos.reset();
mie.write(baos);
@@ -360,7 +360,7 @@ public class Basic {
// different version
mie = ModuleInfoExtender.newExtender(new ByteArrayInputStream(mdBytes));
- mie.mainClass("foo.main");
+ mie.mainClass("p.Main");
mie.version(Version.parse("2.0"));
baos.reset();
mie.write(baos);
@@ -395,7 +395,7 @@ public class Basic {
Files.copy(Paths.get("test7-v9", "module-info.class"),
Paths.get("test7-v10", "module-info.class"));
- int rc = jar("--create --file mmr.jar --main-class=foo.main -C test7 . --release 9 -C test7-v9 . --release 10 -C test7-v10 .");
+ int rc = jar("--create --file mmr.jar --main-class=p.Main -C test7 . --release 9 -C test7-v9 . --release 10 -C test7-v10 .");
System.out.println("-----------------------");
System.out.println( new String(errbytes.toByteArray()));
@@ -409,7 +409,7 @@ System.out.println( new String(errbytes.toByteArray()));
System.out.println("-----------------------");
System.out.println( new String(outbytes.toByteArray()));
- Optional exp = Optional.of("foo.main");
+ Optional exp = Optional.of("p.Main");
try (ZipFile zf = new ZipFile("mmr.jar")) {
Assert.assertTrue(zf.getEntry("module-info.class") == null);
diff --git a/jdk/test/tools/jar/modularJar/Basic.java b/jdk/test/tools/jar/modularJar/Basic.java
index 8a9d44132fc..497853b769e 100644
--- a/jdk/test/tools/jar/modularJar/Basic.java
+++ b/jdk/test/tools/jar/modularJar/Basic.java
@@ -328,7 +328,7 @@ public class Basic {
.resultChecker(r -> assertModuleData(r, FOO));
}
- @Test
+ @Test(enabled = false)
public void partialUpdateFooMainClass() throws IOException {
Path mp = Paths.get("partialUpdateFooMainClass");
createTestDir(mp);
diff --git a/jdk/test/tools/jlink/JLinkNegativeTest.java b/jdk/test/tools/jlink/JLinkNegativeTest.java
index f8ac8093f33..b97092e4bac 100644
--- a/jdk/test/tools/jlink/JLinkNegativeTest.java
+++ b/jdk/test/tools/jlink/JLinkNegativeTest.java
@@ -274,7 +274,7 @@ public class JLinkNegativeTest {
helper.getJmodSrcDir(), helper.getJmodClassesDir(), moduleName2, classNames);
try (OutputStream out = Files.newOutputStream(module2.resolve("module-info.class"))) {
- ModuleInfoWriter.write(ModuleDescriptor.module(moduleName1)
+ ModuleInfoWriter.write(ModuleDescriptor.newModule(moduleName1)
.requires("java.base").build(), out);
}
@@ -332,7 +332,7 @@ public class JLinkNegativeTest {
helper.getJarSrcDir(), helper.getJarClassesDir(), moduleName2, classNames);
try (OutputStream out = Files.newOutputStream(module2.resolve("module-info.class"))) {
- ModuleInfoWriter.write(ModuleDescriptor.module(moduleName1)
+ ModuleInfoWriter.write(ModuleDescriptor.newModule(moduleName1)
.requires("java.base").build(), out);
}
diff --git a/jdk/test/tools/jmod/hashes/HashesTest.java b/jdk/test/tools/jmod/hashes/HashesTest.java
index 3700554983f..10680927c19 100644
--- a/jdk/test/tools/jmod/hashes/HashesTest.java
+++ b/jdk/test/tools/jmod/hashes/HashesTest.java
@@ -312,9 +312,7 @@ public class HashesTest {
assertTrue(ht.hashes("m2") == null);
// should not override any JDK packaged modules
- ModuleFinder finder = new ModulePath(Runtime.version(),
- true,
- mpath);
+ ModuleFinder finder = ModulePath.of(Runtime.version(), true, mpath);
assertTrue(ht.hashes(finder,"jdk.compiler") == null);
assertTrue(ht.hashes(finder,"jdk.attach") == null);
}
@@ -325,9 +323,7 @@ public class HashesTest {
}
private ModuleHashes hashes(String name) {
- ModuleFinder finder = new ModulePath(Runtime.version(),
- true,
- lib);
+ ModuleFinder finder = ModulePath.of(Runtime.version(), true, lib);
return hashes(finder, name);
}
diff --git a/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java
index a774fc7427f..0eef57b33fb 100644
--- a/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java
+++ b/jdk/test/tools/launcher/modules/patch/systemmodules/src1/java.base/jdk/internal/modules/SystemModules.java
@@ -30,6 +30,8 @@ package jdk.internal.module;
public final class SystemModules {
public static final String[] MODULE_NAMES = new String[0];
+ public static int PACKAGES_IN_BOOT_LAYER = 1024;
+
public static boolean hasSplitPackages() {
return true;
}