diff -r 024ed9c9ed13 -r 83c19f00452c langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/FSInfo.java Sun Aug 17 15:52:32 2014 +0100 @@ -0,0 +1,94 @@ + +package com.sun.tools.javac.file; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.StringTokenizer; +import java.util.jar.Attributes; +import java.util.jar.JarFile; +import java.util.jar.Manifest; + +import com.sun.tools.javac.util.Context; + +/** + * Get meta-info about files. Default direct (non-caching) implementation. + * @see CacheFSInfo + * + *

This is NOT part of any supported API. + * If you write code that depends on this, you do so at your own risk. + * This code and its internal interfaces are subject to change or + * deletion without notice. + */ +public class FSInfo { + + /** Get the FSInfo instance for this context. + * @param context the context + * @return the Paths instance for this context + */ + public static FSInfo instance(Context context) { + FSInfo instance = context.get(FSInfo.class); + if (instance == null) + instance = new FSInfo(); + return instance; + } + + protected FSInfo() { + } + + protected FSInfo(Context context) { + context.put(FSInfo.class, this); + } + + public File getCanonicalFile(File file) { + try { + return file.getCanonicalFile(); + } catch (IOException e) { + return file.getAbsoluteFile(); + } + } + + public boolean exists(File file) { + return file.exists(); + } + + public boolean isDirectory(File file) { + return file.isDirectory(); + } + + public boolean isFile(File file) { + return file.isFile(); + } + + public List getJarClassPath(File file) throws IOException { + String parent = file.getParent(); + try (JarFile jarFile = new JarFile(file)) { + Manifest man = jarFile.getManifest(); + if (man == null) + return Collections.emptyList(); + + Attributes attr = man.getMainAttributes(); + if (attr == null) + return Collections.emptyList(); + + String path = attr.getValue(Attributes.Name.CLASS_PATH); + if (path == null) + return Collections.emptyList(); + + List list = new ArrayList<>(); + + for (StringTokenizer st = new StringTokenizer(path); + st.hasMoreTokens(); ) { + String elt = st.nextToken(); + try { + File f = parent == null ? new File(elt): new File(file.toURI().resolve(elt)); + list.add(f); + } catch (IllegalArgumentException ex) {} + } + + return list; + } + } +}