--- old/src/share/classes/com/sun/tools/jdeps/Analyzer.java 2013-10-10 23:35:36.000000000 -0700 +++ new/src/share/classes/com/sun/tools/jdeps/Analyzer.java 2013-10-10 23:35:36.000000000 -0700 @@ -25,9 +25,9 @@ package com.sun.tools.jdeps; import com.sun.tools.classfile.Dependency.Location; -import java.util.ArrayList; +import com.sun.tools.jdeps.Profile; import java.util.HashMap; -import java.util.HashSet; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -52,8 +52,8 @@ }; private final Type type; - private final List results = new ArrayList(); - private final Map map = new HashMap(); + private final Map results = new LinkedHashMap<>(); + private final Map map = new HashMap<>(); private final Archive NOT_FOUND = new Archive(JdepsTask.getMessage("artifact.not.found")); @@ -78,27 +78,27 @@ deps = new PackageVisitor(archive); } archive.visit(deps); - results.add(deps); + results.put(archive, deps); } // set the required dependencies - for (ArchiveDeps result: results) { + for (ArchiveDeps result: results.values()) { for (Set set : result.deps.values()) { for (String target : set) { Archive source = getArchive(target); if (result.archive != source) { - if (!result.requiredArchives.contains(source)) { - result.requiredArchives.add(source); + String profile = ""; + if (PlatformClassPath.contains(source)) { + profile = result.profile != null ? result.profile.toString() : ""; + if (result.getTargetProfile(target) == null) { + profile += ", JDK internal API"; + // override the value if it accesses any JDK internal + result.requireArchives.put(source, profile); + continue; + } } - // either a profile name or the archive name - String tname = result.getTargetProfile(target); - if (tname.isEmpty()) { - tname = PlatformClassPath.contains(source) - ? "JDK internal API (" + source.getFileName() + ")" - : source.toString(); - } - if (!result.targetNames.contains(tname)) { - result.targetNames.add(tname); + if (!result.requireArchives.containsKey(source)) { + result.requireArchives.put(source, profile); } } } @@ -106,42 +106,46 @@ } } + public boolean hasDependences(Archive archive) { + if (results.containsKey(archive)) { + return results.get(archive).deps.size() > 0; + } + return false; + } + public interface Visitor { /** + * Visits the source archive to its destination archive of + * a recorded dependency. + */ + void visitArchiveDependence(Archive origin, Archive target, String profile); + /** * Visits a recorded dependency from origin to target which can be * a fully-qualified classname, a package name, a profile or * archive name depending on the Analyzer's type. */ - void visit(String origin, String target, String profile); - /** - * Visits the source archive to its destination archive of - * a recorded dependency. - */ - void visit(Archive source, Archive dest); + void visitDependence(String origin, Archive source, String target, Archive archive, String profile); } - public void visitSummary(Visitor v) { - for (ArchiveDeps r : results) { - for (Archive a : r.requiredArchives) { - v.visit(r.archive, a); - } - for (String name : r.targetNames) { - v.visit(r.archive.getFileName(), name, name); - } + public void visitArchiveDependences(Archive source, Visitor v) { + ArchiveDeps r = results.get(source); + for (Map.Entry e : r.requireArchives.entrySet()) { + v.visitArchiveDependence(r.archive, e.getKey(), e.getValue()); } } - public void visit(Visitor v) { - for (ArchiveDeps r: results) { - for (Archive a : r.requiredArchives) { - v.visit(r.archive, a); - } - for (String origin : r.deps.keySet()) { - for (String target : r.deps.get(origin)) { - // filter intra-dependency unless in verbose mode - if (type == Type.VERBOSE || getArchive(origin) != getArchive(target)) { - v.visit(origin, target, r.getTargetProfile(target)); - } + public void visitDependences(Archive source, Visitor v) { + ArchiveDeps r = results.get(source); + for (String origin : r.deps.keySet()) { + for (String target : r.deps.get(origin)) { + Archive archive = getArchive(target); + assert source == getArchive(origin); + Profile profile = r.getTargetProfile(target); + + // filter intra-dependency unless in verbose mode + if (type == Type.VERBOSE || archive != source) { + v.visitDependence(origin, source, target, archive, + profile != null ? profile.toString() : ""); } } } @@ -151,29 +155,15 @@ return map.containsKey(name) ? map.get(name) : NOT_FOUND; } - /** - * Returns the file name of the archive for non-JRE class or - * internal JRE classes. It returns empty string for SE API. - */ - public String getArchiveName(String target, String profile) { - Archive source = getArchive(target); - String name = source.getFileName(); - if (PlatformClassPath.contains(source)) - return profile.isEmpty() ? "JDK internal API (" + name + ")" : ""; - return name; - } - private abstract class ArchiveDeps implements Archive.Visitor { final Archive archive; - final Set requiredArchives; - final SortedSet targetNames; + final Map requireArchives; final SortedMap> deps; - + Profile profile = null; ArchiveDeps(Archive archive) { this.archive = archive; - this.requiredArchives = new HashSet(); - this.targetNames = new TreeSet(); - this.deps = new TreeMap>(); + this.requireArchives = new HashMap<>(); + this.deps = new TreeMap<>(); } void add(String loc) { @@ -188,17 +178,19 @@ void add(String origin, String target) { SortedSet set = deps.get(origin); if (set == null) { - set = new TreeSet(); - deps.put(origin, set); + deps.put(origin, set = new TreeSet<>()); } if (!set.contains(target)) { set.add(target); + // find the corresponding profile + Profile p = getTargetProfile(target); + if (profile == null || (p != null && profile.profile < p.profile)) { + profile = p; + } } } - public abstract void visit(Location o, Location t); - public abstract String getTargetProfile(String target); - + public abstract Profile getTargetProfile(String target); } private class ClassVisitor extends ArchiveDeps { @@ -211,9 +203,9 @@ public void visit(Location o, Location t) { add(o.getClassName(), t.getClassName()); } - public String getTargetProfile(String target) { + public Profile getTargetProfile(String target) { int i = target.lastIndexOf('.'); - return (i > 0) ? Profiles.getProfileName(target.substring(0, i)) : ""; + return (i > 0) ? Profile.getProfile(target.substring(0, i)) : null; } } @@ -231,8 +223,8 @@ String pkg = loc.getPackageName(); return pkg.isEmpty() ? "" : pkg; } - public String getTargetProfile(String target) { - return Profiles.getProfileName(target); + public Profile getTargetProfile(String target) { + return Profile.getProfile(target); } } }