# HG changeset patch # User jjg # Date 1480716943 28800 # Node ID 0ae183c295a0ea507c0788ff97472e1203dfa9e2 # Parent c698a1e60c0b74192f41dee04d7d6c1671e5fbd9 8162712: StandardJavaFileManager.getModuleLocation() can't find a module Reviewed-by: jlahoda diff -r c698a1e60c0b -r 0ae183c295a0 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 Fri Dec 02 10:48:37 2016 -0800 +++ b/langtools/src/jdk.compiler/share/classes/com/sun/tools/javac/file/Locations.java Fri Dec 02 14:15:43 2016 -0800 @@ -890,6 +890,8 @@ * like UPGRADE_MODULE_PATH and MODULE_PATH. */ private class ModulePathLocationHandler extends SimpleLocationHandler { + private Map pathModules; + ModulePathLocationHandler(Location location, Option... options) { super(location, options); } @@ -904,6 +906,12 @@ } @Override + public Location getLocationForModule(String moduleName) { + initPathModules(); + return pathModules.get(moduleName); + } + + @Override Iterable> listLocationsForModules() { if (searchPath == null) return Collections.emptyList(); @@ -921,6 +929,23 @@ super.setPaths(paths); } + private void initPathModules() { + if (pathModules != null) { + return; + } + + pathModules = new LinkedHashMap<>(); + + for (Set set : listLocationsForModules()) { + for (Location locn : set) { + if (locn instanceof ModuleLocationHandler) { + ModuleLocationHandler h = (ModuleLocationHandler) locn; + pathModules.put(h.moduleName, h); + } + } + } + } + private void checkValidModulePathEntry(Path p) { if (Files.isDirectory(p)) { // either an exploded module or a directory of modules @@ -1158,7 +1183,6 @@ private Map moduleLocations; private Map pathLocations; - ModuleSourcePathLocationHandler() { super(StandardLocation.MODULE_SOURCE_PATH, Option.MODULE_SOURCE_PATH); diff -r c698a1e60c0b -r 0ae183c295a0 langtools/test/tools/javac/modules/GetLocationForModuleTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/langtools/test/tools/javac/modules/GetLocationForModuleTest.java Fri Dec 02 14:15:43 2016 -0800 @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2016, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8162712 + * @summary StandardJavaFileManager.getModuleLocation() can't find a module + * @library /tools/lib + * @modules + * jdk.compiler/com.sun.tools.javac.api + * jdk.compiler/com.sun.tools.javac.main + * @build toolbox.JavacTask toolbox.ToolBox + * @run main GetLocationForModuleTest + */ + +import java.io.IOException; +import java.nio.file.*; +import java.util.*; +import javax.tools.*; +import toolbox.JavacTask; +import toolbox.ToolBox; + +public class GetLocationForModuleTest extends ModuleTestBase { + public static void main(String... args) throws Exception { + new GetLocationForModuleTest().run(Paths.get(".")); + } + + public void run(Path base) throws Exception { + // Set up some trivial modules + Path moduleSrc = base.resolve("module-src"); + Path m1 = moduleSrc.resolve("m1"); + tb.writeJavaFiles(m1, "module m1 { }"); + Path m2 = moduleSrc.resolve("m2"); + tb.writeJavaFiles(m2, "module m2 { }"); + + Path modulePath = base.resolve("module-path"); + Files.createDirectories(modulePath); + new JavacTask(tb) + .options("--module-source-path", moduleSrc.toString()) + .outdir(modulePath) + .files(findJavaFiles(moduleSrc)) + .run() + .writeAll(); + + // Init file manager + StandardJavaFileManager fm = + ToolProvider.getSystemJavaCompiler().getStandardFileManager(null, null, null); + fm.setLocationFromPaths(StandardLocation.MODULE_PATH, Arrays.asList(modulePath)); + + // Test + test(fm, StandardLocation.SYSTEM_MODULES, "java.base", "java.compiler"); + test(fm, StandardLocation.MODULE_PATH, "m1", "m2"); + } + + void test(JavaFileManager fm, JavaFileManager.Location locn, String... mods) throws IOException { + for (String mod : mods) { + JavaFileManager.Location modLocn = fm.getLocationForModule(locn, mod); + if (modLocn == null) { + error(locn.getName() + ": can't find " + mod); + } else { + System.err.println(locn.getName() + ": found " + mod + ": " + modLocn.getName()); + } + } + } +} +