8231882: --add-modules ALL-MODULE-PATH is not handled properly JDK-8200758-branch
authorherrick
Fri, 04 Oct 2019 18:13:05 -0400
branchJDK-8200758-branch
changeset 58466 47f0d21c7e8d
parent 58464 d82489644b15
child 58538 12c965587689
8231882: --add-modules ALL-MODULE-PATH is not handled properly Reviewed-by: asemenyuk, almatvee
src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkBundlerHelper.java
src/jdk.jpackage/share/classes/jdk/jpackage/internal/ModuleManager.java
test/jdk/tools/jpackage/share/jdk/jpackage/tests/BasicTest.java
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkBundlerHelper.java	Fri Oct 04 14:56:02 2019 -0400
+++ b/src/jdk.jpackage/share/classes/jdk/jpackage/internal/JLinkBundlerHelper.java	Fri Oct 04 18:13:05 2019 -0400
@@ -282,29 +282,17 @@
 
     private static Set<String> removeInvalidModules(
             List<Path> modulePath, Set<String> modules) {
-        Set<String> result = new LinkedHashSet<String>();
-        ModuleManager mm = new ModuleManager(modulePath);
-        List<ModFile> lmodfiles =
-                mm.getModules(EnumSet.of(ModuleManager.SearchType.ModularJar,
-                        ModuleManager.SearchType.Jmod,
-                        ModuleManager.SearchType.ExplodedModule));
-
-        HashMap<String, ModFile> validModules = new HashMap<>();
-
-        for (ModFile modFile : lmodfiles) {
-            validModules.put(modFile.getModName(), modFile);
-        }
-
-        for (String name : modules) {
-            if (validModules.containsKey(name)) {
-                result.add(name);
-            } else {
-                Log.error(MessageFormat.format(
-                        I18N.getString("warning.module.does.not.exist"), name));
+        ModuleFinder moduleFinder = ModuleFinder.compose(
+                ModuleFinder.of(modulePath.toArray(Path[]::new)),
+                ModuleFinder.ofSystem());
+        return modules.stream().filter(moduleName -> {
+            if (moduleFinder.find(moduleName).isEmpty()) {
+                Log.error(MessageFormat.format(I18N.getString(
+                        "warning.module.does.not.exist"), moduleName));
+                return false;
             }
-        }
-
-        return result;
+            return true;
+        }).collect(Collectors.toSet());
     }
 
     private static class ModuleHelper {
@@ -351,18 +339,16 @@
             return modules;
         }
 
-        private static Set<String> getModuleNamesFromPath(List<Path> Value) {
-            Set<String> result = new LinkedHashSet<String>();
-            ModuleManager mm = new ModuleManager(Value);
-            List<ModFile> modFiles = mm.getModules(
-                    EnumSet.of(ModuleManager.SearchType.ModularJar,
-                    ModuleManager.SearchType.Jmod,
-                    ModuleManager.SearchType.ExplodedModule));
+        private static Set<String> getModuleNamesFromPath(List<Path> paths) {
 
-            for (ModFile modFile : modFiles) {
-                result.add(modFile.getModName());
-            }
-            return result;
+            return ModuleFinder.compose(
+                    ModuleFinder.of(paths.toArray(Path[]::new)),
+                    ModuleFinder.ofSystem())
+                    .findAll()
+                    .stream()
+                    .map(ModuleReference::descriptor)
+                    .map(ModuleDescriptor::name)
+                    .collect(Collectors.toSet());
         }
     }
 
--- a/src/jdk.jpackage/share/classes/jdk/jpackage/internal/ModuleManager.java	Fri Oct 04 14:56:02 2019 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2016, 2019, 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.  Oracle designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Oracle in the LICENSE file that accompanied this code.
- *
- * 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.
- */
-
-package jdk.jpackage.internal;
-
-import java.io.File;
-import java.nio.file.Path;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.List;
-
-final class ModuleManager {
-    private final List<String> folders = new ArrayList<String>();
-
-    enum SearchType {UnnamedJar, ModularJar, Jmod, ExplodedModule}
-
-    ModuleManager(String folders) {
-        super();
-        String lfolders = folders.replaceAll("^\"|\"$", "");
-        List<Path> paths = new ArrayList<Path>();
-
-        for (String folder :
-                Arrays.asList(lfolders.split(File.pathSeparator))) {
-            File file = new File(folder);
-            paths.add(file.toPath());
-        }
-
-        initialize(paths);
-    }
-
-    ModuleManager(List<Path> Paths) {
-        super();
-        initialize(Paths);
-    }
-
-    private void initialize(List<Path> Paths) {
-        for (Path path : Paths) {
-            folders.add(path.toString().replaceAll("^\"|\"$", ""));
-        }
-    }
-
-    List<ModFile> getModules(EnumSet<SearchType> Search) {
-        List<ModFile> result = new ArrayList<ModFile>();
-
-        for (String folder : folders) {
-            result.addAll(getAllModulesInDirectory(folder, Search));
-        }
-
-        return result;
-    }
-
-    private static List<ModFile> getAllModulesInDirectory(String folder,
-            EnumSet<SearchType> Search) {
-        List<ModFile> result = new ArrayList<ModFile>();
-        File lfolder = new File(folder);
-        File[] files = { lfolder };
-        if (lfolder.isDirectory()) {
-            files = lfolder.listFiles();
-        }
-
-        if (files != null) {
-            for (File file : files) {
-                ModFile modFile = new ModFile(file);
-
-                switch (modFile.getModType()) {
-                    case Unknown:
-                        break;
-                    case UnnamedJar:
-                        if (Search.contains(SearchType.UnnamedJar)) {
-                            result.add(modFile);
-                        }
-                        break;
-                    case ModularJar:
-                        if (Search.contains(SearchType.ModularJar)) {
-                            result.add(modFile);
-                        }
-                        break;
-                    case Jmod:
-                        if (Search.contains(SearchType.Jmod)) {
-                            result.add(modFile);
-                        }
-                        break;
-                    case ExplodedModule:
-                        if (Search.contains(SearchType.ExplodedModule)) {
-                            result.add(modFile);
-                        }
-                        break;
-                }
-            }
-        }
-        return result;
-    }
-}
--- a/test/jdk/tools/jpackage/share/jdk/jpackage/tests/BasicTest.java	Fri Oct 04 14:56:02 2019 -0400
+++ b/test/jdk/tools/jpackage/share/jdk/jpackage/tests/BasicTest.java	Fri Oct 04 18:13:05 2019 -0400
@@ -105,8 +105,9 @@
     }
 
     @Test
-//    @Parameter("ALL-MODULE-PATH") ; This test fails
+    @Parameter("ALL-MODULE-PATH")
     @Parameter("ALL-DEFAULT")
+    @Parameter("jdk.desktop,jdk.jartool")
     public void testAddModules(String addModulesArg) {
         JPackageCommand cmd = new JPackageCommand()
             .helloAppImage("com.other/com.other.Hello");