src/share/classes/com/sun/tools/jdeps/PlatformClassPath.java

Wed, 27 Apr 2016 01:34:52 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:34:52 +0800
changeset 0
959103a6100f
child 2525
2eb010b6cb22
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/langtools/
changeset: 2573:53ca196be1ae
tag: jdk8u25-b17

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2012, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25 package com.sun.tools.jdeps;
aoqi@0 26
aoqi@0 27 import java.io.IOException;
aoqi@0 28 import java.nio.file.FileVisitResult;
aoqi@0 29 import java.nio.file.Files;
aoqi@0 30 import java.nio.file.Path;
aoqi@0 31 import java.nio.file.Paths;
aoqi@0 32 import java.nio.file.SimpleFileVisitor;
aoqi@0 33 import java.nio.file.attribute.BasicFileAttributes;
aoqi@0 34 import java.util.*;
aoqi@0 35
aoqi@0 36 /**
aoqi@0 37 * ClassPath for Java SE and JDK
aoqi@0 38 */
aoqi@0 39 class PlatformClassPath {
aoqi@0 40 private final static List<Archive> javaHomeArchives = init();
aoqi@0 41
aoqi@0 42 static List<Archive> getArchives() {
aoqi@0 43 return javaHomeArchives;
aoqi@0 44 }
aoqi@0 45
aoqi@0 46 private static List<Archive> init() {
aoqi@0 47 List<Archive> result = new ArrayList<>();
aoqi@0 48 Path home = Paths.get(System.getProperty("java.home"));
aoqi@0 49 try {
aoqi@0 50 if (home.endsWith("jre")) {
aoqi@0 51 // jar files in <javahome>/jre/lib
aoqi@0 52 result.addAll(addJarFiles(home.resolve("lib")));
aoqi@0 53 } else if (Files.exists(home.resolve("lib"))) {
aoqi@0 54 // either a JRE or a jdk build image
aoqi@0 55 Path classes = home.resolve("classes");
aoqi@0 56 if (Files.isDirectory(classes)) {
aoqi@0 57 // jdk build outputdir
aoqi@0 58 result.add(new JDKArchive(classes, ClassFileReader.newInstance(classes)));
aoqi@0 59 }
aoqi@0 60 // add other JAR files
aoqi@0 61 result.addAll(addJarFiles(home.resolve("lib")));
aoqi@0 62 } else {
aoqi@0 63 throw new RuntimeException("\"" + home + "\" not a JDK home");
aoqi@0 64 }
aoqi@0 65 return result;
aoqi@0 66 } catch (IOException e) {
aoqi@0 67 throw new Error(e);
aoqi@0 68 }
aoqi@0 69 }
aoqi@0 70
aoqi@0 71 private static List<Archive> addJarFiles(final Path root) throws IOException {
aoqi@0 72 final List<Archive> result = new ArrayList<>();
aoqi@0 73 final Path ext = root.resolve("ext");
aoqi@0 74 Files.walkFileTree(root, new SimpleFileVisitor<Path>() {
aoqi@0 75 @Override
aoqi@0 76 public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs)
aoqi@0 77 throws IOException
aoqi@0 78 {
aoqi@0 79 if (dir.equals(root) || dir.equals(ext)) {
aoqi@0 80 return FileVisitResult.CONTINUE;
aoqi@0 81 } else {
aoqi@0 82 // skip other cobundled JAR files
aoqi@0 83 return FileVisitResult.SKIP_SUBTREE;
aoqi@0 84 }
aoqi@0 85 }
aoqi@0 86 @Override
aoqi@0 87 public FileVisitResult visitFile(Path p, BasicFileAttributes attrs)
aoqi@0 88 throws IOException
aoqi@0 89 {
aoqi@0 90 String fn = p.getFileName().toString();
aoqi@0 91 if (fn.endsWith(".jar")) {
aoqi@0 92 // JDK may cobundle with JavaFX that doesn't belong to any profile
aoqi@0 93 // Treat jfxrt.jar as regular Archive
aoqi@0 94 result.add(fn.equals("jfxrt.jar")
aoqi@0 95 ? new Archive(p, ClassFileReader.newInstance(p))
aoqi@0 96 : new JDKArchive(p, ClassFileReader.newInstance(p)));
aoqi@0 97 }
aoqi@0 98 return FileVisitResult.CONTINUE;
aoqi@0 99 }
aoqi@0 100 });
aoqi@0 101 return result;
aoqi@0 102 }
aoqi@0 103
aoqi@0 104 /**
aoqi@0 105 * A JDK archive is part of the JDK containing the Java SE API
aoqi@0 106 * or implementation classes (i.e. JDK internal API)
aoqi@0 107 */
aoqi@0 108 static class JDKArchive extends Archive {
aoqi@0 109 JDKArchive(Path p, ClassFileReader reader) {
aoqi@0 110 super(p, reader);
aoqi@0 111 }
aoqi@0 112 }
aoqi@0 113 }

mercurial