From 0f9916fb8a717530bec087d3e85056af03ab82ad Mon Sep 17 00:00:00 2001 From: Andres Almiray Date: Wed, 24 Feb 2021 13:49:17 +0100 Subject: [PATCH 1/3] Issue #92. Configure artifact resolution with transitivity fore remote repositories --- .../layrry/it/test/LayrryIntegrationIT.java | 42 ++++-- .../test/resources/layers-transitivity.toml | 39 ++++++ .../test/resources/layers-transitivity.yml | 46 +++++++ .../config/toml/TomlLayersConfigParser.java | 1 + .../org/moditect/layrry/config/Resolve.java | 10 ++ .../org/moditect/layrry/RemoteResolve.java | 20 ++- .../layrry/internal/LayersFactory.java | 1 + .../moditect/layrry/internal/LayersImpl.java | 128 ++++++++++++------ .../layrry/internal/RemoteResolveImpl.java | 13 ++ ...rableRemoteArtifactResolverSystemImpl.java | 20 ++- .../internal/resolver/RemoteResolve.java | 16 ++- 11 files changed, 268 insertions(+), 68 deletions(-) create mode 100644 integration-test/it-runner/src/test/resources/layers-transitivity.toml create mode 100644 integration-test/it-runner/src/test/resources/layers-transitivity.yml diff --git a/integration-test/it-runner/src/test/java/org/moditect/layrry/it/test/LayrryIntegrationIT.java b/integration-test/it-runner/src/test/java/org/moditect/layrry/it/test/LayrryIntegrationIT.java index 68aff5ff..2ba7586e 100644 --- a/integration-test/it-runner/src/test/java/org/moditect/layrry/it/test/LayrryIntegrationIT.java +++ b/integration-test/it-runner/src/test/java/org/moditect/layrry/it/test/LayrryIntegrationIT.java @@ -57,21 +57,21 @@ public void runLayersFromApiWithFlatRepository() { .resolve(Resolvers.local() .withLocalRepo("flat", Paths.get("target/repositories/flat").toAbsolutePath(), "flat")) .layer("log") - .withModule("org.apache.logging.log4j:log4j-api:2.14.0") - .withModule("org.apache.logging.log4j:log4j-core:2.14.0") - .withModule("org.moditect.layrry.it:it-logconfig:1.0.0") + .withModule("org.apache.logging.log4j:log4j-api:2.14.0") + .withModule("org.apache.logging.log4j:log4j-core:2.14.0") + .withModule("org.moditect.layrry.it:it-logconfig:1.0.0") .layer("foo") - .withParent("log") - .withModule("org.moditect.layrry.it:it-greeter:1.0.0") - .withModule("org.moditect.layrry.it:it-foo:1.0.0") + .withParent("log") + .withModule("org.moditect.layrry.it:it-greeter:1.0.0") + .withModule("org.moditect.layrry.it:it-foo:1.0.0") .layer("bar") - .withParent("log") - .withModule("org.moditect.layrry.it:it-greeter:2.0.0") - .withModule("org.moditect.layrry.it:it-bar:1.0.0") + .withParent("log") + .withModule("org.moditect.layrry.it:it-greeter:2.0.0") + .withModule("org.moditect.layrry.it:it-bar:1.0.0") .layer("app") - .withParent("foo") - .withParent("bar") - .withModule("org.moditect.layrry.it:it-app:1.0.0") + .withParent("foo") + .withParent("bar") + .withModule("org.moditect.layrry.it:it-app:1.0.0") .build(); layers.run("org.moditect.layrry.it.app/org.moditect.layrry.it.app.App", "Alice"); @@ -114,4 +114,22 @@ public void runLayersFromTomlWithFlatRepository() throws Exception { assertOutput(); } + + @Test + public void runLayersFromYamlWithtransitivity() throws Exception { + LayrryLauncher.launch("--layers-config", + Path.of("src", "test", "resources", "layers-transitivity.yml").toAbsolutePath().toString(), + "Alice"); + + assertOutput(); + } + + @Test + public void runLayersFromTomlWithtransitivity() throws Exception { + LayrryLauncher.launch("--layers-config", + Path.of("src", "test", "resources", "layers-transitivity.toml").toAbsolutePath().toString(), + "Alice"); + + assertOutput(); + } } diff --git a/integration-test/it-runner/src/test/resources/layers-transitivity.toml b/integration-test/it-runner/src/test/resources/layers-transitivity.toml new file mode 100644 index 00000000..9fb340e8 --- /dev/null +++ b/integration-test/it-runner/src/test/resources/layers-transitivity.toml @@ -0,0 +1,39 @@ +# +# Copyright 2020 The ModiTect authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +[resolve] + useTransitivity = true + +[layers.log] + modules = [ + "org.apache.logging.log4j:log4j-core:2.14.0", + "org.moditect.layrry.it:it-logconfig:1.0.0"] +[layers.foo] + parents = ["log"] + modules = [ + "org.moditect.layrry.it:it-greeter:1.0.0", + "org.moditect.layrry.it:it-foo:1.0.0"] +[layers.bar] + parents = ["log"] + modules = [ + "org.moditect.layrry.it:it-greeter:2.0.0", + "org.moditect.layrry.it:it-bar:1.0.0"] +[layers.app] + parents = ["foo", "bar"] + modules = ["org.moditect.layrry.it:it-app:1.0.0"] +[main] + module = "org.moditect.layrry.it.app" + class = "org.moditect.layrry.it.app.App" diff --git a/integration-test/it-runner/src/test/resources/layers-transitivity.yml b/integration-test/it-runner/src/test/resources/layers-transitivity.yml new file mode 100644 index 00000000..bc99c4e7 --- /dev/null +++ b/integration-test/it-runner/src/test/resources/layers-transitivity.yml @@ -0,0 +1,46 @@ +# +# Copyright 2020 The ModiTect authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +resolve: + useTransitivity: true + +layers: + log: + modules: + # - "org.apache.logging.log4j:log4j-api:2.14.0" + - "org.apache.logging.log4j:log4j-core:2.14.0" + - "org.moditect.layrry.it:it-logconfig:1.0.0" + foo: + parents: + - "log" + modules: + # - "org.moditect.layrry.it:it-greeter:1.0.0" + - "org.moditect.layrry.it:it-foo:1.0.0" + bar: + parents: + - "log" + modules: + # - "org.moditect.layrry.it:it-greeter:2.0.0" + - "org.moditect.layrry.it:it-bar:1.0.0" + app: + parents: + - "foo" + - "bar" + modules: + - "org.moditect.layrry.it:it-app:1.0.0" +main: + module: org.moditect.layrry.it.app + class: org.moditect.layrry.it.app.App diff --git a/layrry-config-toml/src/main/java/org/moditect/layrry/config/toml/TomlLayersConfigParser.java b/layrry-config-toml/src/main/java/org/moditect/layrry/config/toml/TomlLayersConfigParser.java index 37c709ba..5e11f666 100644 --- a/layrry-config-toml/src/main/java/org/moditect/layrry/config/toml/TomlLayersConfigParser.java +++ b/layrry-config-toml/src/main/java/org/moditect/layrry/config/toml/TomlLayersConfigParser.java @@ -87,6 +87,7 @@ private static void readResolve(LayersConfig config, TomlTable table) { resolve.setRemote((Boolean) table.getOrDefault("remote", true)); resolve.setWorkOffline((Boolean) table.getOrDefault("workOffline", false)); resolve.setUseMavenCentral((Boolean) table.getOrDefault("useMavenCentral", true)); + resolve.setUseTransitivity((Boolean) table.getOrDefault("useTransitivity", false)); resolve.setFromFile((String) table.get("fromFile")); readRepositories(resolve, (TomlTable) table.get("localRepositories")); } diff --git a/layrry-config/src/main/java/org/moditect/layrry/config/Resolve.java b/layrry-config/src/main/java/org/moditect/layrry/config/Resolve.java index 56161d62..98e3a80d 100644 --- a/layrry-config/src/main/java/org/moditect/layrry/config/Resolve.java +++ b/layrry-config/src/main/java/org/moditect/layrry/config/Resolve.java @@ -24,6 +24,7 @@ public class Resolve { private boolean remote = true; private boolean workOffline = false; private boolean useMavenCentral = true; + private boolean useTransitivity = false; private String fromFile; public Map getLocalRepositories() { @@ -58,6 +59,14 @@ public void setUseMavenCentral(boolean useMavenCentral) { this.useMavenCentral = useMavenCentral; } + public boolean isUseTransitivity() { + return useTransitivity; + } + + public void setUseTransitivity(boolean useTransitivity) { + this.useTransitivity = useTransitivity; + } + public String getFromFile() { return fromFile; } @@ -71,6 +80,7 @@ public String toString() { return "Resolve [remote=" + remote + ", workOffline=" + workOffline + ", useMavenCentral=" + useMavenCentral + + ", useTransitivity=" + useTransitivity + ", fromFile=" + fromFile + ", localRepositories=" + localRepositories + "]"; } diff --git a/layrry-core/src/main/java/org/moditect/layrry/RemoteResolve.java b/layrry-core/src/main/java/org/moditect/layrry/RemoteResolve.java index 89446487..e653684d 100644 --- a/layrry-core/src/main/java/org/moditect/layrry/RemoteResolve.java +++ b/layrry-core/src/main/java/org/moditect/layrry/RemoteResolve.java @@ -27,15 +27,15 @@ public interface RemoteResolve { * Sets whether to consult any repositories Maven (Maven local and remote); defaults to true. * * @param enabled Whether to consult any repositories Maven (Maven local and remote); defaults to true. - * @return Modified instance of {@code RemoteMaven} + * @return Modified instance of {@code RemoteResolve} */ RemoteResolve enabled(boolean enabled); /** - * Configures this {@link org.moditect.layrry.internal.resolver.RemoteResolve} from the specified file + * Configures this {@link RemoteResolve} from the specified file * - * @param file The file the {@link org.moditect.layrry.internal.resolver.RemoteResolve} should be configured from - * @return Modified instance of {@code RemoteMaven} + * @param file The file the {@link RemoteResolve} should be configured from + * @return Modified instance of {@code RemoteResolve} * @throws IllegalArgumentException * If the file is not specified, is a directory, or does not exist * @throws InvalidConfigurationFileException @@ -48,7 +48,7 @@ public interface RemoteResolve { * This method is able to override the value defined in settings.xml if loaded later. * * @param workOffline Whether to consult any remote Maven Repository in resolution; defaults to false. - * @return Modified instance of {@code RemoteMaven} + * @return Modified instance of {@code RemoteResolve} */ RemoteResolve workOffline(boolean workOffline); @@ -56,7 +56,15 @@ public interface RemoteResolve { * Sets whether to consult the Maven Central Repository in resolution; defaults to true. * * @param useMavenCentral Whether to consult the Maven Central Repository in resolution; defaults to true. - * @return Modified instance of {@code RemoteMaven} + * @return Modified instance of {@code RemoteResolve} */ RemoteResolve withMavenCentralRepo(boolean useMavenCentral); + + /** + * Sets whether to resolve transitive dependencies or not; defaults to false. + * + * @param useTransitivity Whether to resolve transitive dependencies or not; defaults to false. + * @return Modified instance of {@code RemoteResolve} + */ + RemoteResolve withTransitivity(boolean useTransitivity); } diff --git a/layrry-core/src/main/java/org/moditect/layrry/internal/LayersFactory.java b/layrry-core/src/main/java/org/moditect/layrry/internal/LayersFactory.java index b8eee33d..53254f44 100644 --- a/layrry-core/src/main/java/org/moditect/layrry/internal/LayersFactory.java +++ b/layrry-core/src/main/java/org/moditect/layrry/internal/LayersFactory.java @@ -56,6 +56,7 @@ private Layers configureResolve(LayersConfig layersConfig, Path layersConfigDir, remote.enabled(resolve.isRemote()); remote.workOffline(resolve.isWorkOffline()); remote.withMavenCentralRepo(resolve.isUseMavenCentral()); + remote.withTransitivity(resolve.isUseTransitivity()); String fromFilePath = resolve.getFromFile(); if (fromFilePath != null && !fromFilePath.isEmpty()) { remote.fromFile(layersConfigDir.resolve(resolve.getFromFile()).toAbsolutePath()); diff --git a/layrry-core/src/main/java/org/moditect/layrry/internal/LayersImpl.java b/layrry-core/src/main/java/org/moditect/layrry/internal/LayersImpl.java index b15b10dd..cabe2313 100644 --- a/layrry-core/src/main/java/org/moditect/layrry/internal/LayersImpl.java +++ b/layrry-core/src/main/java/org/moditect/layrry/internal/LayersImpl.java @@ -61,7 +61,7 @@ public class LayersImpl implements Layers { /** * The actual module layers by name. */ - private final Map moduleLayers; + private final Map moduleLayers; /** * Temporary directory where all plug-ins will be copied to. Modules will be @@ -79,6 +79,28 @@ public class LayersImpl implements Layers { private int pluginIndex = 0; + static class ModuleLayerInfo { + private final ModuleLayer moduleLayer; + private final List modulePathEntries; + + static ModuleLayerInfo of(ModuleLayer moduleLayer, List modulePathEntries) { + return new ModuleLayerInfo(moduleLayer, modulePathEntries); + } + + private ModuleLayerInfo(ModuleLayer moduleLayer, List modulePathEntries) { + this.moduleLayer = moduleLayer; + this.modulePathEntries = Collections.unmodifiableList(modulePathEntries); + } + + ModuleLayer getModuleLayer() { + return moduleLayer; + } + + List getModulePathEntries() { + return modulePathEntries; + } + } + public LayersImpl(Set pluginsDirectories, Map components, List localResolves, List remoteResolves) { @@ -95,6 +117,7 @@ public LayersImpl(Set pluginsDirectories, Map pluginsDirectories, Map pluginLayersByName = new HashMap<>(); + Map pluginLayersByName = new HashMap<>(); for (Entry entry : components.entrySet()) { Component component = entry.getValue(); @@ -122,7 +145,7 @@ public void run(String main, String... args) { if (!pluginsDirectories.isEmpty()) { Deployer deployer = new Deployer(pluginsDirectories); - for (Entry plugin : pluginLayersByName.entrySet()) { + for (Entry plugin : pluginLayersByName.entrySet()) { deployer.deploy(plugin.getKey(), plugin.getValue()); } } @@ -146,18 +169,18 @@ private void handleLayerComponent(String name, Layer component) { List modulePathEntries = getModulePathEntries(component); - List parentLayers = getParentLayers(name, component.getParents()); - ModuleLayer moduleLayer = createModuleLayer(parentLayers, modulePathEntries); + List parentLayers = getParentLayers(name, component.getParents()); + ModuleLayerInfo moduleLayerInfo = createModuleLayer(parentLayers, modulePathEntries); - moduleLayers.put(name, moduleLayer); + moduleLayers.put(name, moduleLayerInfo); event.name = name; - event.modules = moduleLayer.modules().stream().map(Module::getName).collect(Collectors.joining(", ")); + event.modules = moduleLayerInfo.getModuleLayer().modules().stream().map(Module::getName).collect(Collectors.joining(", ")); event.commit(); } - private Map handlePluginComponent(String name, Plugin plugin) throws IOException { - Map pluginLayersByName = new HashMap<>(); + private Map handlePluginComponent(String name, Plugin plugin) throws IOException { + Map pluginLayersByName = new HashMap<>(); // Expect .jar, .zip, .tar, .tar.gz as direct children // TODO: support nested dirs? @@ -179,30 +202,45 @@ private Map handlePluginComponent(String name, Plugin plugi Path pluginDir = pluginsWorkingDir.resolve(pluginIndex++ + "-" + pluginName); List modulePathEntries = unpackPluginArtifact(path, pluginDir); - List parentLayers = getParentLayers(name, plugin.getParents()); - ModuleLayer moduleLayer = createModuleLayer(parentLayers, modulePathEntries); + List parentLayers = getParentLayers(name, plugin.getParents()); + ModuleLayerInfo moduleLayerInfo = createModuleLayer(parentLayers, modulePathEntries); - moduleLayers.put(pluginName, moduleLayer); - pluginLayersByName.put(pluginName, moduleLayer); + moduleLayers.put(pluginName, moduleLayerInfo); + pluginLayersByName.put(pluginName, moduleLayerInfo); event.name = pluginName; - event.modules = moduleLayer.modules().stream().map(Module::getName).collect(Collectors.joining(", ")); + event.modules = moduleLayerInfo.getModuleLayer().modules().stream().map(Module::getName).collect(Collectors.joining(", ")); event.commit(); }); return pluginLayersByName; } - private ModuleLayer createModuleLayer(List parentLayers, List modulePathEntries) { + private ModuleLayerInfo createModuleLayer(List parentModuleLayerInfos, List modulePathEntries) { ClassLoader scl = ClassLoader.getSystemClassLoader(); - ModuleFinder finder = ModuleFinder.of(modulePathEntries.toArray(Path[]::new)); + // check only by filename + List parentModulePathEntries = parentModuleLayerInfos.stream() + .map(ModuleLayerInfo::getModulePathEntries) + .flatMap(List::stream) + .map(Path::getFileName) + .collect(Collectors.toList()); + + List filteredModulePathEntries = modulePathEntries.stream() + .filter(modulePathEntry -> !parentModulePathEntries.contains(modulePathEntry.getFileName())) + .collect(Collectors.toList()); + + ModuleFinder finder = ModuleFinder.of(filteredModulePathEntries.toArray(Path[]::new)); Set roots = finder.findAll() .stream() .map(m -> m.descriptor().name()) .collect(Collectors.toSet()); + List parentLayers = parentModuleLayerInfos.stream() + .map(ModuleLayerInfo::getModuleLayer) + .collect(Collectors.toList()); + Configuration appConfig = Configuration.resolve( finder, parentLayers.stream().map(ModuleLayer::configuration).collect(Collectors.toList()), @@ -210,7 +248,8 @@ private ModuleLayer createModuleLayer(List parentLayers, List roots ); - return ModuleLayer.defineModulesWithOneLoader(appConfig, parentLayers, scl).layer(); + ModuleLayer moduleLayer = ModuleLayer.defineModulesWithOneLoader(appConfig, parentLayers, scl).layer(); + return ModuleLayerInfo.of(moduleLayer, filteredModulePathEntries); } private List getModulePathEntries(Layer layer) { @@ -220,9 +259,9 @@ private List getModulePathEntries(Layer layer) { private Class getMainClass(String main) throws ClassNotFoundException { String[] parts = main.split("/"); - for(Entry entry : moduleLayers.entrySet()) { + for(Entry entry : moduleLayers.entrySet()) { try { - ClassLoader loader = entry.getValue().findLoader(parts[0]); + ClassLoader loader = entry.getValue().getModuleLayer().findLoader(parts[0]); return loader.loadClass(parts[1]); } catch(IllegalArgumentException iae) { @@ -233,19 +272,23 @@ private Class getMainClass(String main) throws ClassNotFoundException { throw new IllegalArgumentException("Module " + parts[0] + " not found"); } - private List getParentLayers(String name, List parents) { - List parentLayers = new ArrayList<>(); + private List getParentLayers(String name, List parents) { + List parentLayers = new ArrayList<>(); for (String parent : parents) { - ModuleLayer parentLayer = moduleLayers.get(parent); - if (parentLayer == null) { + ModuleLayerInfo moduleLayerInfo = moduleLayers.get(parent); + if (moduleLayerInfo == null) { throw new IllegalArgumentException("Layer '" + name + "': parent layer '" + parent + "' not configured yet"); } - parentLayers.add(parentLayer); + parentLayers.add(moduleLayerInfo); } - return parentLayers.isEmpty() ? List.of(ModuleLayer.boot()) : parentLayers; + return parentLayers.isEmpty() ? getModuleLayerInfoFromBootLayer() : parentLayers; + } + + private List getModuleLayerInfoFromBootLayer() { + return Collections.singletonList(ModuleLayerInfo.of(ModuleLayer.boot(),Collections.emptyList())); } private List unpackPluginArtifact(Path pluginArtifact, Path targetDir) { @@ -336,15 +379,15 @@ private void onDirectoryChange(DirectoryChangeEvent event, PluginsDirectory plug Path pluginDir = pluginsWorkingDir.resolve(pluginIndex++ + "-" + pluginName); List modulePathEntries = unpackPluginArtifact(event.path(), pluginDir); - List parentLayers = getParentLayers(pluginName, pluginDirectory.getParents()); + List parentLayers = getParentLayers(pluginName, pluginDirectory.getParents()); - ModuleLayer moduleLayer = createModuleLayer(parentLayers, modulePathEntries); + ModuleLayerInfo moduleLayerInfo = createModuleLayer(parentLayers, modulePathEntries); - moduleLayers.put(pluginName, moduleLayer); - deploy(pluginName, moduleLayer); + moduleLayers.put(pluginName, moduleLayerInfo); + deploy(pluginName, moduleLayerInfo); jfrEvent.name = pluginName; - jfrEvent.modules = moduleLayer.modules().stream().map(Module::getName).collect(Collectors.joining(", ")); + jfrEvent.modules = moduleLayerInfo.getModuleLayer().modules().stream().map(Module::getName).collect(Collectors.joining(", ")); jfrEvent.commit(); } else if (event.eventType() == EventType.DELETE) { @@ -357,21 +400,21 @@ else if (event.eventType() == EventType.DELETE) { PluginLayerRemovedEvent jfrEvent = new PluginLayerRemovedEvent(); jfrEvent.begin(); - ModuleLayer pluginLayer = moduleLayers.get(pluginName); - undeploy(pluginName, pluginLayer); + ModuleLayerInfo moduleLayerInfo = moduleLayers.get(pluginName); + undeploy(pluginName, moduleLayerInfo); moduleLayers.remove(pluginName); jfrEvent.name = pluginName; - jfrEvent.modules = pluginLayer.modules().stream().map(Module::getName).collect(Collectors.joining(", ")); + jfrEvent.modules = moduleLayerInfo.getModuleLayer().modules().stream().map(Module::getName).collect(Collectors.joining(", ")); jfrEvent.commit(); } } - public void deploy(String pluginName, ModuleLayer pluginLayer) { + public void deploy(String pluginName, ModuleLayerInfo pluginLayerInfo) { // for each existing layer, notify any potential lifecycle listeners about the new layer - for (ModuleLayer moduleLayer : moduleLayers.values()) { + for (ModuleLayerInfo moduleLayerInfo : moduleLayers.values()) { try { - notifyOnAddition.invoke(supportInstance, moduleLayer, pluginName, pluginLayer); + notifyOnAddition.invoke(supportInstance, moduleLayerInfo.getModuleLayer(), pluginName, pluginLayerInfo.getModuleLayer()); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new IllegalArgumentException(e); @@ -379,11 +422,11 @@ public void deploy(String pluginName, ModuleLayer pluginLayer) { } } - public void undeploy(String pluginName, ModuleLayer pluginLayer) { + public void undeploy(String pluginName, ModuleLayerInfo pluginLayerInfo) { // for each existing layer, notify any potential lifecycle listeners about the removed layer - for (ModuleLayer moduleLayer : moduleLayers.values()) { + for (ModuleLayerInfo moduleLayerInfo : moduleLayers.values()) { try { - notifyOnRemoval.invoke(supportInstance, moduleLayer, pluginName, pluginLayer); + notifyOnRemoval.invoke(supportInstance, moduleLayerInfo.getModuleLayer(), pluginName, pluginLayerInfo); } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new IllegalArgumentException(e); @@ -391,16 +434,17 @@ public void undeploy(String pluginName, ModuleLayer pluginLayer) { } } - private ModuleLayer getLayrryPlatformLayer(Map moduleLayers) { - for (Entry layer : moduleLayers.entrySet()) { + private ModuleLayer getLayrryPlatformLayer(Map moduleLayers) { + for (Entry layer : moduleLayers.entrySet()) { Optional platformModule = layer.getValue() + .getModuleLayer() .modules() .stream() .filter(m -> m.getName().equals("org.moditect.layrry.platform")) .findFirst(); if (platformModule.isPresent()) { - return layer.getValue(); + return layer.getValue().getModuleLayer(); } } diff --git a/layrry-core/src/main/java/org/moditect/layrry/internal/RemoteResolveImpl.java b/layrry-core/src/main/java/org/moditect/layrry/internal/RemoteResolveImpl.java index 7cf3dcfd..d4e7d7d5 100644 --- a/layrry-core/src/main/java/org/moditect/layrry/internal/RemoteResolveImpl.java +++ b/layrry-core/src/main/java/org/moditect/layrry/internal/RemoteResolveImpl.java @@ -24,6 +24,7 @@ public class RemoteResolveImpl implements RemoteResolve { private boolean enabled = true; private boolean workOffline; private boolean useMavenCentral = true; + private boolean useTransitivity = false; private Path fromFile; boolean enabled() { @@ -38,6 +39,10 @@ boolean useMavenCentral() { return useMavenCentral; } + boolean useTransitivity() { + return useTransitivity; + } + Path fromFile() { return fromFile; } @@ -50,6 +55,8 @@ public String toString() { .append(workOffline) .append(", useMavenCentral=") .append(useMavenCentral) + .append(", useTransitivity=") + .append(useTransitivity) .append(", fromFile=") .append(fromFile) .append("]") @@ -79,4 +86,10 @@ public RemoteResolveImpl withMavenCentralRepo(boolean useMavenCentral) { this.useMavenCentral = useMavenCentral; return this; } + + @Override + public RemoteResolveImpl withTransitivity(boolean useTransitivity) { + this.useTransitivity = useTransitivity; + return this; + } } diff --git a/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/ConfigurableRemoteArtifactResolverSystemImpl.java b/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/ConfigurableRemoteArtifactResolverSystemImpl.java index d18561ae..941a3e23 100644 --- a/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/ConfigurableRemoteArtifactResolverSystemImpl.java +++ b/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/ConfigurableRemoteArtifactResolverSystemImpl.java @@ -20,6 +20,7 @@ import org.jboss.shrinkwrap.resolver.api.ResolutionException; import org.jboss.shrinkwrap.resolver.api.maven.ConfigurableMavenResolverSystem; import org.jboss.shrinkwrap.resolver.api.maven.MavenFormatStage; +import org.jboss.shrinkwrap.resolver.api.maven.MavenStrategyStage; import java.nio.file.Path; import java.util.Collection; @@ -27,6 +28,7 @@ public class ConfigurableRemoteArtifactResolverSystemImpl implements ConfigurableRemoteArtifactResolverSystem { private final ConfigurableMavenResolverSystem delegate; private boolean enabled = true; + private boolean transitivity = false; public ConfigurableRemoteArtifactResolverSystemImpl(ConfigurableMavenResolverSystem delegate) { this.delegate = delegate; @@ -56,27 +58,37 @@ public RemoteResolve withMavenCentralRepo(boolean useMavenCentral) { return this; } + @Override + public RemoteResolve withTransitivity(boolean useTransitivity) { + this.transitivity = useTransitivity; + return this; + } + @Override public MavenFormatStage resolve() throws IllegalStateException, ResolutionException { if (!enabled) return new EmptyFormatStage(); - return delegate.resolve().withoutTransitivity(); + return resolveTransitivity(delegate.resolve()); } @Override public MavenFormatStage resolve(String canonicalForm) throws IllegalArgumentException, ResolutionException, CoordinateParseException { if (!enabled) return new EmptyFormatStage(); - return delegate.resolve(canonicalForm).withoutTransitivity(); + return resolveTransitivity(delegate.resolve(canonicalForm)); } @Override public MavenFormatStage resolve(String... canonicalForms) throws IllegalArgumentException, ResolutionException, CoordinateParseException { if (!enabled) return new EmptyFormatStage(); - return delegate.resolve(canonicalForms).withoutTransitivity(); + return resolveTransitivity(delegate.resolve(canonicalForms)); } @Override public MavenFormatStage resolve(Collection canonicalForms) throws IllegalArgumentException, ResolutionException, CoordinateParseException { if (!enabled) return new EmptyFormatStage(); - return delegate.resolve(canonicalForms).withoutTransitivity(); + return resolveTransitivity(delegate.resolve(canonicalForms)); + } + + private MavenFormatStage resolveTransitivity(MavenStrategyStage stage) { + return transitivity ? stage.withTransitivity() : stage.withoutTransitivity(); } } diff --git a/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/RemoteResolve.java b/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/RemoteResolve.java index ae81be26..312f5fe8 100644 --- a/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/RemoteResolve.java +++ b/layrry-core/src/main/java/org/moditect/layrry/internal/resolver/RemoteResolve.java @@ -27,7 +27,7 @@ public interface RemoteResolve { * Sets whether to consult any repositories Maven (Maven local and remote); defaults to true. * * @param enabled Whether to consult any repositories Maven (Maven local and remote); defaults to true. - * @return Modified instance of {@code RemoteMaven} + * @return Modified instance of {@code RemoteResolve} */ RemoteResolve enabled(boolean enabled); @@ -35,7 +35,7 @@ public interface RemoteResolve { * Configures this {@link RemoteResolve} from the specified file * * @param file The file the {@link RemoteResolve} should be configured from - * @return Modified instance of {@code RemoteMaven} + * @return Modified instance of {@code RemoteResolve} * @throws IllegalArgumentException * If the file is not specified, is a directory, or does not exist * @throws InvalidConfigurationFileException @@ -48,7 +48,7 @@ public interface RemoteResolve { * This method is able to override the value defined in settings.xml if loaded later. * * @param workOffline Whether to consult any remote Maven Repository in resolution; defaults to false. - * @return Modified instance of {@code RemoteMaven} + * @return Modified instance of {@code RemoteResolve} */ RemoteResolve workOffline(boolean workOffline); @@ -56,7 +56,15 @@ public interface RemoteResolve { * Sets whether to consult the Maven Central Repository in resolution; defaults to true. * * @param useMavenCentral Whether to consult the Maven Central Repository in resolution; defaults to true. - * @return Modified instance of {@code RemoteMaven} + * @return Modified instance of {@code RemoteResolve} */ RemoteResolve withMavenCentralRepo(boolean useMavenCentral); + + /** + * Sets whether to resolve transitive dependencies or not; defaults to false. + * + * @param useTransitivity Whether to resolve transitive dependencies or not; defaults to false. + * @return Modified instance of {@code RemoteResolve} + */ + RemoteResolve withTransitivity(boolean useTransitivity); } From 682c003c8f037aa5b7ce5f012fbd27ea08a311bc Mon Sep 17 00:00:00 2001 From: Andres Almiray Date: Wed, 24 Feb 2021 13:49:33 +0100 Subject: [PATCH 2/3] Update license check configuration in pom --- pom.xml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/pom.xml b/pom.xml index 2485b6f8..81c70290 100644 --- a/pom.xml +++ b/pom.xml @@ -336,22 +336,25 @@
etc/license.txt
true + + *.dot + LICENSE.txt + install-jdk.sh + .github/dependabot.yml + mvnw.cmd + .mvn/wrapper/maven-wrapper.properties + .mvn/wrapper/MavenWrapperDownloader.java + + + SCRIPT_STYLE + SCRIPT_STYLE +
check - - - *.dot - LICENSE.txt - install-jdk.sh - mvnw.cmd - .mvn/wrapper/maven-wrapper.properties - .mvn/wrapper/MavenWrapperDownloader.java - - From f7ddabc754ae896dd5ae9ffab65f39a5af036cb2 Mon Sep 17 00:00:00 2001 From: Andres Almiray Date: Wed, 24 Feb 2021 13:53:42 +0100 Subject: [PATCH 3/3] Issue #92. Simplify external configuration files for transitivity tests --- .../it-runner/src/test/resources/layers-transitivity.toml | 2 -- .../it-runner/src/test/resources/layers-transitivity.yml | 3 --- 2 files changed, 5 deletions(-) diff --git a/integration-test/it-runner/src/test/resources/layers-transitivity.toml b/integration-test/it-runner/src/test/resources/layers-transitivity.toml index 9fb340e8..4d0fe5fb 100644 --- a/integration-test/it-runner/src/test/resources/layers-transitivity.toml +++ b/integration-test/it-runner/src/test/resources/layers-transitivity.toml @@ -24,12 +24,10 @@ [layers.foo] parents = ["log"] modules = [ - "org.moditect.layrry.it:it-greeter:1.0.0", "org.moditect.layrry.it:it-foo:1.0.0"] [layers.bar] parents = ["log"] modules = [ - "org.moditect.layrry.it:it-greeter:2.0.0", "org.moditect.layrry.it:it-bar:1.0.0"] [layers.app] parents = ["foo", "bar"] diff --git a/integration-test/it-runner/src/test/resources/layers-transitivity.yml b/integration-test/it-runner/src/test/resources/layers-transitivity.yml index bc99c4e7..d36ef4b2 100644 --- a/integration-test/it-runner/src/test/resources/layers-transitivity.yml +++ b/integration-test/it-runner/src/test/resources/layers-transitivity.yml @@ -20,20 +20,17 @@ resolve: layers: log: modules: - # - "org.apache.logging.log4j:log4j-api:2.14.0" - "org.apache.logging.log4j:log4j-core:2.14.0" - "org.moditect.layrry.it:it-logconfig:1.0.0" foo: parents: - "log" modules: - # - "org.moditect.layrry.it:it-greeter:1.0.0" - "org.moditect.layrry.it:it-foo:1.0.0" bar: parents: - "log" modules: - # - "org.moditect.layrry.it:it-greeter:2.0.0" - "org.moditect.layrry.it:it-bar:1.0.0" app: parents: