--- a/jdk/src/java.base/share/classes/java/lang/module/Resolver.java Mon Apr 24 13:43:34 2017 +0800
+++ b/jdk/src/java.base/share/classes/java/lang/module/Resolver.java Thu May 04 07:26:55 2017 +0000
@@ -28,6 +28,7 @@
import java.io.PrintStream;
import java.lang.module.ModuleDescriptor.Provides;
import java.lang.module.ModuleDescriptor.Requires.Modifier;
+import java.net.URI;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Arrays;
@@ -38,10 +39,8 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
import java.util.Optional;
import java.util.Set;
-import java.util.StringJoiner;
import java.util.stream.Collectors;
import jdk.internal.module.ModuleHashes;
@@ -69,12 +68,10 @@
// true if all automatic modules have been found
private boolean haveAllAutomaticModules;
- // module constraints on target platform
- private String osName;
- private String osArch;
+ // constraint on target platform
+ private String targetPlatform;
- String osName() { return osName; }
- String osArch() { return osArch; }
+ String targetPlatform() { return targetPlatform; }
/**
* @throws IllegalArgumentException if there are more than one parent and
@@ -89,37 +86,23 @@
this.afterFinder = afterFinder;
this.traceOutput = traceOutput;
- // record constraints on target platform, checking that they don't conflict
+ // record constraint on target platform, checking for conflicts
for (Configuration parent : parents) {
- String value = parent.osName();
+ String value = parent.targetPlatform();
if (value != null) {
- if (osName == null) {
- osName = value;
+ if (targetPlatform == null) {
+ targetPlatform = value;
} else {
- if (!value.equals(osName)) {
- failParentConflict("Operating System", osName, value);
- }
- }
- }
- value = parent.osArch();
- if (value != null) {
- if (osArch == null) {
- osArch = value;
- } else {
- if (!value.equals(osArch)) {
- failParentConflict("OS architecture", osArch, value);
+ if (!value.equals(targetPlatform)) {
+ String msg = "Parents have conflicting constraints on target" +
+ " platform: " + targetPlatform + ", " + value;
+ throw new IllegalArgumentException(msg);
}
}
}
}
}
- private void failParentConflict(String constraint, String s1, String s2) {
- String msg = "Parents have conflicting constraints on target "
- + constraint + ": " + s1 + ", " + s2;
- throw new IllegalArgumentException(msg);
- }
-
/**
* Resolves the given named modules.
*
@@ -147,8 +130,7 @@
}
if (isTracing()) {
- trace("Root module %s located", root);
- mref.location().ifPresent(uri -> trace(" (%s)", uri));
+ trace("root %s", nameAndInfo(mref));
}
addFoundModule(mref);
@@ -180,9 +162,7 @@
ModuleDescriptor other = mref.descriptor();
q.offer(other);
if (isTracing()) {
- trace("Automatic module %s located, required by %s",
- other.name(), descriptor.name());
- mref.location().ifPresent(uri -> trace(" (%s)", uri));
+ trace("%s requires %s", descriptor.name(), nameAndInfo(mref));
}
});
haveAllAutomaticModules = true;
@@ -213,21 +193,13 @@
}
}
+ if (isTracing() && !dn.equals("java.base")) {
+ trace("%s requires %s", descriptor.name(), nameAndInfo(mref));
+ }
+
if (!nameToReference.containsKey(dn)) {
addFoundModule(mref);
q.offer(mref.descriptor());
-
- if (isTracing()) {
- String prefix;
- if (mref.descriptor().isAutomatic()) {
- prefix = "Automatic module";
- } else {
- prefix = "Module";
- }
- trace(prefix + " %s located, required by %s",
- dn, descriptor.name());
- mref.location().ifPresent(uri -> trace(" (%s)", uri));
- }
}
}
@@ -291,6 +263,13 @@
do {
for (ModuleDescriptor descriptor : candidateConsumers) {
if (!descriptor.uses().isEmpty()) {
+
+ // the modules that provide at least one service
+ Set<ModuleDescriptor> modulesToBind = null;
+ if (isTracing()) {
+ modulesToBind = new HashSet<>();
+ }
+
for (String service : descriptor.uses()) {
Set<ModuleReference> mrefs = availableProviders.get(service);
if (mrefs != null) {
@@ -298,15 +277,13 @@
ModuleDescriptor provider = mref.descriptor();
if (!provider.equals(descriptor)) {
- trace("Module %s provides %s, used by %s",
- provider.name(), service, descriptor.name());
+ if (isTracing() && modulesToBind.add(provider)) {
+ trace("%s binds %s", descriptor.name(),
+ nameAndInfo(mref));
+ }
String pn = provider.name();
if (!nameToReference.containsKey(pn)) {
- if (isTracing()) {
- mref.location()
- .ifPresent(uri -> trace(" (%s)", uri));
- }
addFoundModule(mref);
q.push(provider);
}
@@ -349,59 +326,31 @@
if (mref instanceof ModuleReferenceImpl) {
ModuleTarget target = ((ModuleReferenceImpl)mref).moduleTarget();
if (target != null)
- checkTargetConstraints(mn, target);
+ checkTargetPlatform(mn, target);
}
nameToReference.put(mn, mref);
}
/**
- * Check that the module's constraints on the target platform do not
- * conflict with the constraints of other modules resolved so far or
- * modules in parent configurations.
+ * Check that the module's constraints on the target platform does
+ * conflict with the constraint of other modules resolved so far.
*/
- private void checkTargetConstraints(String mn, ModuleTarget target) {
- String value = target.osName();
+ private void checkTargetPlatform(String mn, ModuleTarget target) {
+ String value = target.targetPlatform();
if (value != null) {
- if (osName == null) {
- osName = value;
+ if (targetPlatform == null) {
+ targetPlatform = value;
} else {
- if (!value.equals(osName)) {
- failTargetConstraint(mn, target);
- }
- }
- }
- value = target.osArch();
- if (value != null) {
- if (osArch == null) {
- osArch = value;
- } else {
- if (!value.equals(osArch)) {
- failTargetConstraint(mn, target);
+ if (!value.equals(targetPlatform)) {
+ findFail("Module %s has constraints on target platform (%s)"
+ + " that conflict with other modules: %s", mn,
+ value, targetPlatform);
}
}
}
}
- private void failTargetConstraint(String mn, ModuleTarget target) {
- String s1 = targetAsString(osName, osArch);
- String s2 = targetAsString(target.osName(), target.osArch());
- findFail("Module %s has constraints on target platform (%s) that"
- + " conflict with other modules: %s", mn, s1, s2);
- }
-
- private String targetAsString(ModuleTarget target) {
- return targetAsString(target.osName(), target.osArch());
- }
-
- private String targetAsString(String osName, String osArch) {
- return new StringJoiner("-")
- .add(Objects.toString(osName, "*"))
- .add(Objects.toString(osArch, "*"))
- .toString();
- }
-
-
/**
* Execute post-resolution checks and returns the module graph of resolved
* modules as {@code Map}. The resolved modules will be in the given
@@ -412,12 +361,6 @@
Map<ResolvedModule, Set<ResolvedModule>> finish(Configuration cf,
boolean check)
{
- if (isTracing()) {
- trace("Result:");
- Set<String> names = nameToReference.keySet();
- names.stream().sorted().forEach(name -> trace(" %s", name));
- }
-
if (check) {
detectCycles();
checkHashes();
@@ -520,9 +463,8 @@
findFail("Unable to compute the hash of module %s", dn);
}
- // skip checking the hash if the module has been patched
ModuleReferenceImpl other = (ModuleReferenceImpl)mref2;
- if (other != null && !other.isPatched()) {
+ if (other != null) {
byte[] recordedHash = hashes.hashFor(dn);
byte[] actualHash = other.computeHash(algorithm);
if (actualHash == null)
@@ -965,9 +907,17 @@
private void trace(String fmt, Object ... args) {
if (traceOutput != null) {
- traceOutput.format("[Resolver] " + fmt, args);
+ traceOutput.format(fmt, args);
traceOutput.println();
}
}
+ private String nameAndInfo(ModuleReference mref) {
+ ModuleDescriptor descriptor = mref.descriptor();
+ StringBuilder sb = new StringBuilder(descriptor.name());
+ mref.location().ifPresent(uri -> sb.append(" " + uri));
+ if (descriptor.isAutomatic())
+ sb.append(" automatic");
+ return sb.toString();
+ }
}