--- a/langtools/src/share/classes/com/sun/tools/jdeps/PlatformClassPath.java Thu Oct 17 13:50:00 2013 +0200
+++ b/langtools/src/share/classes/com/sun/tools/jdeps/PlatformClassPath.java Thu Oct 17 13:19:48 2013 -0700
@@ -24,11 +24,11 @@
*/
package com.sun.tools.jdeps;
-import java.io.File;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.*;
@@ -38,45 +38,38 @@
*/
class PlatformClassPath {
private final static List<Archive> javaHomeArchives = init();
+
static List<Archive> getArchives() {
return javaHomeArchives;
}
- static boolean contains(Archive archive) {
- return javaHomeArchives.contains(archive);
+ private static List<Archive> init() {
+ List<Archive> result = new ArrayList<>();
+ Path home = Paths.get(System.getProperty("java.home"));
+ try {
+ if (home.endsWith("jre")) {
+ // jar files in <javahome>/jre/lib
+ result.addAll(addJarFiles(home.resolve("lib")));
+ } else if (Files.exists(home.resolve("lib"))) {
+ // either a JRE or a jdk build image
+ Path classes = home.resolve("classes");
+ if (Files.isDirectory(classes)) {
+ // jdk build outputdir
+ result.add(new JDKArchive(classes, ClassFileReader.newInstance(classes)));
+ }
+ // add other JAR files
+ result.addAll(addJarFiles(home.resolve("lib")));
+ } else {
+ throw new RuntimeException("\"" + home + "\" not a JDK home");
+ }
+ return result;
+ } catch (IOException e) {
+ throw new Error(e);
+ }
}
- private static List<Archive> init() {
- List<Archive> result = new ArrayList<Archive>();
- String javaHome = System.getProperty("java.home");
- File jre = new File(javaHome, "jre");
- File lib = new File(javaHome, "lib");
-
- try {
- if (jre.exists() && jre.isDirectory()) {
- result.addAll(addJarFiles(new File(jre, "lib")));
- result.addAll(addJarFiles(lib));
- } else if (lib.exists() && lib.isDirectory()) {
- // either a JRE or a jdk build image
- File classes = new File(javaHome, "classes");
- if (classes.exists() && classes.isDirectory()) {
- // jdk build outputdir
- result.add(new Archive(classes, ClassFileReader.newInstance(classes)));
- }
- // add other JAR files
- result.addAll(addJarFiles(lib));
- } else {
- throw new RuntimeException("\"" + javaHome + "\" not a JDK home");
- }
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- return result;
- }
-
- private static List<Archive> addJarFiles(File f) throws IOException {
- final List<Archive> result = new ArrayList<Archive>();
- final Path root = f.toPath();
+ private static List<Archive> addJarFiles(final Path root) throws IOException {
+ final List<Archive> result = new ArrayList<>();
final Path ext = root.resolve("ext");
Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
@Override
@@ -91,17 +84,30 @@
}
}
@Override
- public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
+ public FileVisitResult visitFile(Path p, BasicFileAttributes attrs)
throws IOException
{
- File f = file.toFile();
- String fn = f.getName();
- if (fn.endsWith(".jar") && !fn.equals("alt-rt.jar")) {
- result.add(new Archive(f, ClassFileReader.newInstance(f)));
+ String fn = p.getFileName().toString();
+ if (fn.endsWith(".jar")) {
+ // JDK may cobundle with JavaFX that doesn't belong to any profile
+ // Treat jfxrt.jar as regular Archive
+ result.add(fn.equals("jfxrt.jar")
+ ? new Archive(p, ClassFileReader.newInstance(p))
+ : new JDKArchive(p, ClassFileReader.newInstance(p)));
}
return FileVisitResult.CONTINUE;
}
});
return result;
}
+
+ /**
+ * A JDK archive is part of the JDK containing the Java SE API
+ * or implementation classes (i.e. JDK internal API)
+ */
+ static class JDKArchive extends Archive {
+ JDKArchive(Path p, ClassFileReader reader) {
+ super(p, reader);
+ }
+ }
}