diff -r 2efb75c09230 -r 1153fab98d25 langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java --- a/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Wed May 11 20:28:22 2016 +0000 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Thu May 12 11:36:08 2016 -0700 @@ -68,6 +68,7 @@ import javax.tools.JavaFileManager; import javax.tools.JavaFileManager.Location; import javax.tools.StandardJavaFileManager; +import javax.tools.StandardJavaFileManager.PathFactory; import javax.tools.StandardLocation; import com.sun.tools.javac.code.Lint; @@ -121,7 +122,9 @@ private ModuleNameReader moduleNameReader; - static final Path javaHome = Paths.get(System.getProperty("java.home")); + private PathFactory pathFactory = Paths::get; + + static final Path javaHome = FileSystems.getDefault().getPath(System.getProperty("java.home")); static final Path thisSystemModules = javaHome.resolve("lib").resolve("modules"); Map fileSystems = new LinkedHashMap<>(); @@ -131,6 +134,10 @@ initHandlers(); } + Path getPath(String first, String... more) { + return pathFactory.getPath(first, more); + } + public void close() throws IOException { ListBuffer list = new ListBuffer<>(); closeables.forEach(closeable -> { @@ -155,6 +162,10 @@ this.fsInfo = fsInfo; } + void setPathFactory(PathFactory f) { + pathFactory = f; + } + boolean isDefaultBootClassPath() { BootClassPathLocationHandler h = (BootClassPathLocationHandler) getHandler(PLATFORM_CLASS_PATH); @@ -167,7 +178,7 @@ * @param searchPath The search path to be split * @return The elements of the path */ - private static Iterable getPathEntries(String searchPath) { + private Iterable getPathEntries(String searchPath) { return getPathEntries(searchPath, null); } @@ -181,7 +192,7 @@ * empty path elements * @return The elements of the path */ - private static Iterable getPathEntries(String searchPath, Path emptyPathDefault) { + private Iterable getPathEntries(String searchPath, Path emptyPathDefault) { ListBuffer entries = new ListBuffer<>(); for (String s: searchPath.split(Pattern.quote(File.pathSeparator), -1)) { if (s.isEmpty()) { @@ -189,7 +200,7 @@ entries.add(emptyPathDefault); } } else { - entries.add(Paths.get(s)); + entries.add(getPath(s)); } } return entries; @@ -465,7 +476,7 @@ // need to decide how best to report issue for benefit of // direct API call on JavaFileManager.handleOption(specifies IAE) // vs. command line decoding. - outputDir = (value == null) ? null : Paths.get(value); + outputDir = (value == null) ? null : getPath(value); return true; } @@ -606,7 +617,7 @@ protected SearchPath createPath() { return new SearchPath() .expandJarClassPaths(true) // Only search user jars for Class-Paths - .emptyPathDefault(Paths.get(".")); // Empty path elt ==> current directory + .emptyPathDefault(getPath(".")); // Empty path elt ==> current directory } private void lazy() { @@ -791,7 +802,7 @@ paths.addAll(modules); for (String s : files.split(Pattern.quote(File.pathSeparator))) { - paths.add(Paths.get(s)); + paths.add(getPath(s)); } return paths; @@ -1170,12 +1181,12 @@ for (String seg: segments) { int markStart = seg.indexOf(MARKER); if (markStart == -1) { - add(map, Paths.get(seg), null); + add(map, getPath(seg), null); } else { if (markStart == 0 || !isSeparator(seg.charAt(markStart - 1))) { throw new IllegalArgumentException("illegal use of " + MARKER + " in " + seg); } - Path prefix = Paths.get(seg.substring(0, markStart - 1)); + Path prefix = getPath(seg.substring(0, markStart - 1)); Path suffix; int markEnd = markStart + MARKER.length(); if (markEnd == seg.length()) { @@ -1184,7 +1195,7 @@ || seg.indexOf(MARKER, markEnd) != -1) { throw new IllegalArgumentException("illegal use of " + MARKER + " in " + seg); } else { - suffix = Paths.get(seg.substring(markEnd + 1)); + suffix = getPath(seg.substring(markEnd + 1)); } add(map, prefix, suffix); } @@ -1331,13 +1342,13 @@ } private class SystemModulesLocationHandler extends BasicLocationHandler { - private Path javaHome; + private Path systemJavaHome; private Path modules; private Map systemModules; SystemModulesLocationHandler() { super(StandardLocation.SYSTEM_MODULES, Option.SYSTEM); - javaHome = Paths.get(System.getProperty("java.home")); + systemJavaHome = Locations.javaHome; } @Override @@ -1347,11 +1358,11 @@ } if (value == null) { - javaHome = Paths.get(System.getProperty("java.home")); + systemJavaHome = Locations.javaHome; } else if (value.equals("none")) { - javaHome = null; + systemJavaHome = null; } else { - update(Paths.get(value)); + update(getPath(value)); } modules = null; @@ -1360,13 +1371,13 @@ @Override Collection getPaths() { - return (javaHome == null) ? null : Collections.singleton(javaHome); + return (systemJavaHome == null) ? null : Collections.singleton(systemJavaHome); } @Override void setPaths(Iterable files) throws IOException { if (files == null) { - javaHome = null; + systemJavaHome = null; } else { Iterator pathIter = files.iterator(); if (!pathIter.hasNext()) { @@ -1386,16 +1397,15 @@ } private void update(Path p) { - if (!isCurrentPlatform(p) && !Files.exists(p.resolve("jrt-fs.jar")) && !Files.exists(javaHome.resolve("modules"))) + if (!isCurrentPlatform(p) && !Files.exists(p.resolve("jrt-fs.jar")) && !Files.exists(systemJavaHome.resolve("modules"))) throw new IllegalArgumentException(p.toString()); - javaHome = p; + systemJavaHome = p; modules = null; } private boolean isCurrentPlatform(Path p) { - Path jh = Paths.get(System.getProperty("java.home")); try { - return Files.isSameFile(p, jh); + return Files.isSameFile(p, Locations.javaHome); } catch (IOException ex) { throw new IllegalArgumentException(p.toString(), ex); } @@ -1421,7 +1431,7 @@ return; } - if (javaHome == null) { + if (systemJavaHome == null) { systemModules = Collections.emptyMap(); return; } @@ -1431,15 +1441,15 @@ URI jrtURI = URI.create("jrt:/"); FileSystem jrtfs; - if (isCurrentPlatform(javaHome)) { + if (isCurrentPlatform(systemJavaHome)) { jrtfs = FileSystems.getFileSystem(jrtURI); } else { try { Map attrMap = - Collections.singletonMap("java.home", javaHome.toString()); + Collections.singletonMap("java.home", systemJavaHome.toString()); jrtfs = FileSystems.newFileSystem(jrtURI, attrMap); } catch (ProviderNotFoundException ex) { - URL javaHomeURL = javaHome.resolve("jrt-fs.jar").toUri().toURL(); + URL javaHomeURL = systemJavaHome.resolve("jrt-fs.jar").toUri().toURL(); ClassLoader currentLoader = Locations.class.getClassLoader(); URLClassLoader fsLoader = new URLClassLoader(new URL[] {javaHomeURL}, currentLoader); @@ -1454,7 +1464,7 @@ modules = jrtfs.getPath("/modules"); } catch (FileSystemNotFoundException | ProviderNotFoundException e) { - modules = javaHome.resolve("modules"); + modules = systemJavaHome.resolve("modules"); if (!Files.exists(modules)) throw new IOException("can't find system classes", e); }