This is an automated email from the ASF dual-hosted git repository. sjaranowski pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-dependency-plugin.git
The following commit(s) were added to refs/heads/master by this push: new c8a22b6b [MDEP-689] Fixes ignored dependency filtering in go-offline goal (#417) c8a22b6b is described below commit c8a22b6b5623e0f9964176563ff00b1a36670063 Author: Lisa Hardy <116385169+ldha...@users.noreply.github.com> AuthorDate: Sat Nov 16 12:08:13 2024 -0500 [MDEP-689] Fixes ignored dependency filtering in go-offline goal (#417) --- pom.xml | 3 + .../invoker.properties | 18 + .../pom.xml | 109 ++++++ .../verify.groovy | 50 +++ .../AbstractDependencyFilterMojo.java | 4 +- .../dependency/resolvers/AbstractResolveMojo.java | 41 +++ .../dependency/resolvers/GoOfflineMojo.java | 61 +++- .../dependency/resolvers/ResolvePluginsMojo.java | 39 -- .../dependency/resolvers/GoOfflineMojoTest.java | 405 +++++++++++++++++++++ .../unit/go-offline-test/exclude-plugin-config.xml | 35 ++ .../go-offline-test/include-aid-plugin-config.xml | 25 ++ .../go-offline-test/include-gid-plugin-config.xml | 24 ++ .../include-scope-plugin-config.xml | 24 ++ .../include-types-plugin-config.xml | 24 ++ 14 files changed, 819 insertions(+), 43 deletions(-) diff --git a/pom.xml b/pom.xml index d02c0181..5cdf2565 100644 --- a/pom.xml +++ b/pom.xml @@ -59,6 +59,9 @@ under the License. <contributor> <name>Maarten Mulders</name> </contributor> + <contributor> + <name>Lisa Hardy</name> + </contributor> </contributors> <prerequisites> diff --git a/src/it/projects/mdep-689-apply-filtering-go-offline-goal/invoker.properties b/src/it/projects/mdep-689-apply-filtering-go-offline-goal/invoker.properties new file mode 100644 index 00000000..4623ccd6 --- /dev/null +++ b/src/it/projects/mdep-689-apply-filtering-go-offline-goal/invoker.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you 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. + +invoker.goals = clean ${project.groupId}:${project.artifactId}:${project.version}:go-offline diff --git a/src/it/projects/mdep-689-apply-filtering-go-offline-goal/pom.xml b/src/it/projects/mdep-689-apply-filtering-go-offline-goal/pom.xml new file mode 100644 index 00000000..a41847d9 --- /dev/null +++ b/src/it/projects/mdep-689-apply-filtering-go-offline-goal/pom.xml @@ -0,0 +1,109 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you 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. +--> + +<project xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.maven.plugins.dependency</groupId> + <artifactId>mdep-739-go-offline-respect-classifiers</artifactId> + <version>1.0.0-SNAPSHOT</version> + <description>Test that dependency:go-offline applies exclude filters</description> + <dependencies> + <dependency> <!-- excluded by excludeGroupId --> + <groupId>skip.this.groupid</groupId> + <artifactId>dummy-artifact</artifactId> + <version>1.0</version> + </dependency> + <dependency> <!-- excluded by excludeGroupId --> + <groupId>skip.this.groupid.too</groupId> + <artifactId>dummy-artifact</artifactId> + <version>1.0</version> + </dependency> + <dependency> <!-- excluded by excludeArtifactId --> + <groupId>org.junit.jupiter</groupId> + <artifactId>skip-this-artifact</artifactId> + <version>1.0</version> + </dependency> + <dependency> <!-- excluded by excludeArtifactId --> + <groupId>org.junit.jupiter</groupId> + <artifactId>skip-this-artifact-too</artifactId> + <version>1.0-SNAPSHOT</version> + </dependency> + <dependency> <!-- excluded by excludeClassifier --> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-access</artifactId> + <version>1.4.7</version> + <classifier>skipThisClassifier</classifier> + </dependency> + <dependency> <!-- excluded by excludeClassifier --> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-core</artifactId> + <version>1.5.6</version> + <classifier>skipThisClassifierToo</classifier> + </dependency> + <dependency><!-- should not be excluded --> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>2.0.13</version> + <scope>compile</scope> + </dependency> + <dependency> <!-- excluded by excludeScope --> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>1.5.4</version> + <scope>system</scope> + <!-- it doesn't matter what jar this points to, needs a systemPath to compile --> + <systemPath>${project.build.directory}/local-repo/junit/junit/4.13.2/junit-4.13.2.jar</systemPath> + </dependency> + <dependency><!-- should not be excluded --> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-simple</artifactId> + <version>2.0.13</version> + </dependency> + <dependency> <!-- excluded by excludeType --> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-examples</artifactId> + <version>1.4.7</version> + <type>ear</type> + </dependency> + </dependencies> + <build> + <pluginManagement> + <plugins> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <version>@project.version@</version> + <configuration> + <excludeGroupIds>skip.this.groupid,skip.this.groupid.too</excludeGroupIds> + <excludeArtifactIds>skip-this-artifact,skip-this-artifact-too</excludeArtifactIds> + <!-- the maven-common-artifact-filters library does not support comma delimited + scope exclusions. only one at a time. the other filters support comma delimited lists--> + <!-- <excludeScope>compile,system</excludeScope> --> + <excludeScope>system</excludeScope> + <excludeTypes>ear</excludeTypes> + <excludeClassifiers>skipThisClassifier,skipThisClassifierToo</excludeClassifiers> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> +</project> diff --git a/src/it/projects/mdep-689-apply-filtering-go-offline-goal/verify.groovy b/src/it/projects/mdep-689-apply-filtering-go-offline-goal/verify.groovy new file mode 100644 index 00000000..1bc9464f --- /dev/null +++ b/src/it/projects/mdep-689-apply-filtering-go-offline-goal/verify.groovy @@ -0,0 +1,50 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ + +File file = new File( basedir, "build.log" ) +assert file.exists() + +String buildLog = file.getText( "UTF-8" ) + +// Make sure non-exluded explicit dependencies are resolved +assert buildLog.contains( 'Resolved dependency: slf4j-simple-2.0.13.jar' ) +assert buildLog.contains( 'Resolved dependency: slf4j-api-2.0.13.jar' ) + +// Did group excludes work? +assert !buildLog.contains( 'Resolving artifact skip.this.groupid' ) + +// Did artifact excludes work? +assert !buildLog.contains( 'Resolving artifact org.junit.jupiter:skip-this-artifact' ) + +// Did scope exludes work? +assert !buildLog.contains( 'Resolving artifact ch.qos.logback:logback-classic' ) + +// Did type excludes work? +assert !buildLog.contains( 'Resolving artifact ch.qos.logback:logback-examples' ) + +// Did classifier excludes work? +assert !buildLog.contains( 'Resolving artifact ch.qos.logback:logback-core:jar:skipThisClassifierToo' ) +assert !buildLog.contains( 'Resolving artifact ch.qos.logback:logback-core' ) + +assert !buildLog.contains( 'Resolving artifact ch.qos.logback:logback-access:jar:skipThisClassifier' ) +assert !buildLog.contains( 'Resolving artifact ch.qos.logback:logback-access' ) + + + +return true diff --git a/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java b/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java index 655458b5..63a1cfa1 100644 --- a/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java +++ b/src/main/java/org/apache/maven/plugins/dependency/fromDependencies/AbstractDependencyFilterMojo.java @@ -136,7 +136,9 @@ public abstract class AbstractDependencyFilterMojo extends AbstractDependencyMoj /** * Scope threshold to exclude, if no value is defined for include. - * An empty string indicates no dependencies (default).<br> + * An empty string indicates no dependencies (default). Unlike the other + * exclusion parameters, this property does not support a comma-delimited + * list of scope exclusions. Just one scope may be excluded at a time.<br> * The scope threshold value being interpreted is the scope as * Maven filters for creating a classpath, not as specified in the pom. In summary: * <ul> diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java index a452968e..bf03a003 100644 --- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java +++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/AbstractResolveMojo.java @@ -22,6 +22,13 @@ import java.io.File; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.dependency.fromDependencies.AbstractDependencyFilterMojo; +import org.apache.maven.plugins.dependency.utils.DependencyUtil; +import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter; +import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter; +import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts; +import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter; +import org.apache.maven.shared.artifact.filter.collection.ScopeFilter; +import org.apache.maven.shared.artifact.filter.collection.TypeFilter; /** * @author <a href="mailto:bri...@apache.org">Brian Fox</a> @@ -52,4 +59,38 @@ public abstract class AbstractResolveMojo extends AbstractDependencyFilterMojo { */ @Parameter(property = "excludeReactor", defaultValue = "true") protected boolean excludeReactor; + + /** + * @return {@link FilterArtifacts} + */ + protected FilterArtifacts getArtifactsFilter() { + final FilterArtifacts filter = new FilterArtifacts(); + + if (excludeReactor) { + + filter.addFilter(new ExcludeReactorProjectsArtifactFilter(reactorProjects, getLog())); + } + + filter.addFilter(new ScopeFilter( + DependencyUtil.cleanToBeTokenizedString(this.includeScope), + DependencyUtil.cleanToBeTokenizedString(this.excludeScope))); + + filter.addFilter(new TypeFilter( + DependencyUtil.cleanToBeTokenizedString(this.includeTypes), + DependencyUtil.cleanToBeTokenizedString(this.excludeTypes))); + + filter.addFilter(new ClassifierFilter( + DependencyUtil.cleanToBeTokenizedString(this.includeClassifiers), + DependencyUtil.cleanToBeTokenizedString(this.excludeClassifiers))); + + filter.addFilter(new GroupIdFilter( + DependencyUtil.cleanToBeTokenizedString(this.includeGroupIds), + DependencyUtil.cleanToBeTokenizedString(this.excludeGroupIds))); + + filter.addFilter(new ArtifactIdFilter( + DependencyUtil.cleanToBeTokenizedString(this.includeArtifactIds), + DependencyUtil.cleanToBeTokenizedString(this.excludeArtifactIds))); + + return filter; + } } diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java index 1bc3e4d7..6ca1c396 100644 --- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java +++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojo.java @@ -25,13 +25,17 @@ import java.util.Set; import java.util.stream.Collectors; import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.DefaultArtifact; +import org.apache.maven.artifact.handler.DefaultArtifactHandler; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.model.Dependency; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.dependency.utils.DependencyUtil; import org.apache.maven.project.ProjectBuildingRequest; +import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException; import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter; +import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts; import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult; import org.apache.maven.shared.transfer.dependencies.DefaultDependableCoordinate; @@ -43,6 +47,7 @@ import org.apache.maven.shared.transfer.dependencies.resolve.DependencyResolverE * * @author <a href="mailto:bri...@apache.org">Brian Fox</a> * @author Maarten Mulders + * @author Lisa Hardy * @since 2.0 */ @Mojo(name = "go-offline", threadSafe = true) @@ -71,7 +76,7 @@ public class GoOfflineMojo extends AbstractResolveMojo { } } - } catch (DependencyResolverException e) { + } catch (DependencyResolverException | ArtifactFilterException e) { throw new MojoExecutionException(e.getMessage(), e); } } @@ -81,10 +86,13 @@ public class GoOfflineMojo extends AbstractResolveMojo { * * @return set of resolved dependency artifacts. * @throws DependencyResolverException in case of an error while resolving the artifacts. + * @throws ArtifactFilterException */ - protected Set<Artifact> resolveDependencyArtifacts() throws DependencyResolverException { + protected Set<Artifact> resolveDependencyArtifacts() throws DependencyResolverException, ArtifactFilterException { Collection<Dependency> dependencies = getProject().getDependencies(); + dependencies = filterDependencies(dependencies); + Set<DependableCoordinate> dependableCoordinates = dependencies.stream() .map(this::createDependendableCoordinateFromDependency) .collect(Collectors.toSet()); @@ -133,8 +141,9 @@ public class GoOfflineMojo extends AbstractResolveMojo { * * @return set of resolved plugin artifacts. * @throws DependencyResolverException in case of an error while resolving the artifacts. + * @throws ArtifactFilterException */ - protected Set<Artifact> resolvePluginArtifacts() throws DependencyResolverException { + protected Set<Artifact> resolvePluginArtifacts() throws DependencyResolverException, ArtifactFilterException { Set<Artifact> plugins = getProject().getPluginArtifacts(); Set<Artifact> reports = getProject().getReportArtifacts(); @@ -143,6 +152,9 @@ public class GoOfflineMojo extends AbstractResolveMojo { artifacts.addAll(reports); artifacts.addAll(plugins); + final FilterArtifacts filter = getArtifactsFilter(); + artifacts = filter.filter(artifacts); + Set<DependableCoordinate> dependableCoordinates = artifacts.stream() .map(this::createDependendableCoordinateFromArtifact) .collect(Collectors.toSet()); @@ -152,6 +164,16 @@ public class GoOfflineMojo extends AbstractResolveMojo { return resolveDependableCoordinate(buildingRequest, dependableCoordinates, "plugins"); } + private Collection<Dependency> filterDependencies(Collection<Dependency> deps) throws ArtifactFilterException { + + Set<Artifact> artifacts = createArtifactSetFromDependencies(deps); + + final FilterArtifacts filter = getArtifactsFilter(); + artifacts = filter.filter(artifacts); + + return createDependencySetFromArtifacts(artifacts); + } + private DependableCoordinate createDependendableCoordinateFromArtifact(final Artifact artifact) { final DefaultDependableCoordinate result = new DefaultDependableCoordinate(); result.setGroupId(artifact.getGroupId()); @@ -174,6 +196,39 @@ public class GoOfflineMojo extends AbstractResolveMojo { return result; } + private Set<Artifact> createArtifactSetFromDependencies(Collection<Dependency> deps) { + Set<Artifact> artifacts = new HashSet<>(); + for (Dependency dep : deps) { + DefaultArtifactHandler handler = new DefaultArtifactHandler(dep.getType()); + artifacts.add(new DefaultArtifact( + dep.getGroupId(), + dep.getArtifactId(), + dep.getVersion(), + dep.getScope(), + dep.getType(), + dep.getClassifier(), + handler)); + } + return artifacts; + } + + private Collection<Dependency> createDependencySetFromArtifacts(Set<Artifact> artifacts) { + Set<Dependency> dependencies = new HashSet<>(); + + for (Artifact artifact : artifacts) { + Dependency d = new Dependency(); + d.setGroupId(artifact.getGroupId()); + d.setArtifactId(artifact.getArtifactId()); + d.setVersion(artifact.getVersion()); + d.setType(artifact.getType()); + d.setClassifier(artifact.getClassifier()); + d.setScope(artifact.getScope()); + dependencies.add(d); + } + + return dependencies; + } + @Override protected ArtifactsFilter getMarkedArtifactFilter() { return null; diff --git a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java index 4c6e91ac..4a6a2378 100644 --- a/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java +++ b/src/main/java/org/apache/maven/plugins/dependency/resolvers/ResolvePluginsMojo.java @@ -33,13 +33,8 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.dependency.utils.DependencyUtil; import org.apache.maven.project.ProjectBuildingRequest; import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException; -import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter; import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter; -import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter; import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts; -import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter; -import org.apache.maven.shared.artifact.filter.collection.ScopeFilter; -import org.apache.maven.shared.artifact.filter.collection.TypeFilter; import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResult; import org.apache.maven.shared.transfer.dependencies.DefaultDependableCoordinate; @@ -174,40 +169,6 @@ public class ResolvePluginsMojo extends AbstractResolveMojo { return artifacts; } - /** - * @return {@link FilterArtifacts} - */ - private FilterArtifacts getArtifactsFilter() { - final FilterArtifacts filter = new FilterArtifacts(); - - if (excludeReactor) { - - filter.addFilter(new ExcludeReactorProjectsArtifactFilter(reactorProjects, getLog())); - } - - filter.addFilter(new ScopeFilter( - DependencyUtil.cleanToBeTokenizedString(this.includeScope), - DependencyUtil.cleanToBeTokenizedString(this.excludeScope))); - - filter.addFilter(new TypeFilter( - DependencyUtil.cleanToBeTokenizedString(this.includeTypes), - DependencyUtil.cleanToBeTokenizedString(this.excludeTypes))); - - filter.addFilter(new ClassifierFilter( - DependencyUtil.cleanToBeTokenizedString(this.includeClassifiers), - DependencyUtil.cleanToBeTokenizedString(this.excludeClassifiers))); - - filter.addFilter(new GroupIdFilter( - DependencyUtil.cleanToBeTokenizedString(this.includeGroupIds), - DependencyUtil.cleanToBeTokenizedString(this.excludeGroupIds))); - - filter.addFilter(new ArtifactIdFilter( - DependencyUtil.cleanToBeTokenizedString(this.includeArtifactIds), - DependencyUtil.cleanToBeTokenizedString(this.excludeArtifactIds))); - - return filter; - } - /** * This method resolves the plugin artifacts from the project. * diff --git a/src/test/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojoTest.java b/src/test/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojoTest.java new file mode 100644 index 00000000..caa00f16 --- /dev/null +++ b/src/test/java/org/apache/maven/plugins/dependency/resolvers/GoOfflineMojoTest.java @@ -0,0 +1,405 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you 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. + */ +package org.apache.maven.plugins.dependency.resolvers; + +import java.io.File; +import java.util.HashSet; +import java.util.Set; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenSession; +import org.apache.maven.plugin.testing.stubs.ArtifactStub; +import org.apache.maven.plugins.dependency.AbstractDependencyMojoTestCase; +import org.apache.maven.plugins.dependency.testUtils.stubs.DependencyProjectStub; +import org.apache.maven.project.MavenProject; +import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts; +import org.junit.jupiter.api.Disabled; + +public class GoOfflineMojoTest extends AbstractDependencyMojoTestCase { + private GoOfflineMojo subject; + + protected void setUp() throws Exception { + // required for mojo lookups to work + super.setUp("go-offline", true); + MavenProject project = new DependencyProjectStub(); + getContainer().addComponent(project, MavenProject.class.getName()); + + MavenSession session = newMavenSession(project); + getContainer().addComponent(session, MavenSession.class.getName()); + } + + String GROUP_EXCLUDE_PREFIX = "skip.this.groupid"; + + String ARTIFACT_EXCLUDE_PREFIX = "skip-this-artifact"; + + String CLASSIFIER_EXCLUDE_PREFIX = "skipThisClassifier"; + + String DUMMY_ARTIFACT_NAME = "dummy-artifact"; + + String STUB_ARTIFACT_VERSION = "3.14"; + + String VALID_GROUP = "org.junit.jupiter"; + + public void test_excludeGroupIds() throws Exception { + File testPom = new File(getBasedir(), "target/test-classes/unit/go-offline-test/exclude-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + Artifact artifact1 = new ArtifactStub(); + artifact1.setGroupId(GROUP_EXCLUDE_PREFIX); + artifact1.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact1.setVersion(STUB_ARTIFACT_VERSION); + + Artifact artifact2 = new ArtifactStub(); + artifact2.setGroupId(GROUP_EXCLUDE_PREFIX + ".too"); + artifact2.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact2.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + + Artifact artifact3 = new ArtifactStub(); + artifact3.setGroupId("dont.skip.me"); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion("1.0"); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + assertEquals(1, artifacts.size()); + assertTrue(artifacts.contains(artifact3)); + assertFalse(artifacts.contains(artifact1)); + assertFalse(artifacts.contains(artifact2)); + } + + public void test_excludeArtifactIds() throws Exception { + File testPom = new File(getBasedir(), "target/test-classes/unit/go-offline-test/exclude-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + Artifact artifact1 = new ArtifactStub(); + artifact1.setGroupId(VALID_GROUP); + artifact1.setArtifactId(ARTIFACT_EXCLUDE_PREFIX); + artifact1.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + + Artifact artifact2 = new ArtifactStub(); + artifact2.setGroupId(VALID_GROUP); + artifact2.setArtifactId(ARTIFACT_EXCLUDE_PREFIX + "-too"); + artifact2.setVersion(STUB_ARTIFACT_VERSION); + + Artifact artifact3 = new ArtifactStub(); + artifact3.setGroupId("dont.skip.me"); + artifact3.setArtifactId("dummy-artifact"); + artifact3.setVersion("1.0"); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + assertEquals(1, artifacts.size()); + assertTrue(artifacts.contains(artifact3)); + assertFalse(artifacts.contains(artifact1)); + assertFalse(artifacts.contains(artifact2)); + } + + public void test_excludeScope() throws Exception { + File testPom = new File(getBasedir(), "target/test-classes/unit/go-offline-test/exclude-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + Artifact artifact1 = new ArtifactStub(); + artifact1.setGroupId(VALID_GROUP); + artifact1.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact1.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + + Artifact artifact2 = new ArtifactStub(); + artifact2.setGroupId(VALID_GROUP); + artifact2.setArtifactId(DUMMY_ARTIFACT_NAME + "-too"); + artifact2.setVersion(STUB_ARTIFACT_VERSION); + artifact2.setScope("system"); + + Artifact artifact3 = new ArtifactStub(); + artifact3.setGroupId(VALID_GROUP); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion(STUB_ARTIFACT_VERSION); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + assertEquals(2, artifacts.size()); + assertTrue(artifacts.contains(artifact3)); + assertTrue(artifacts.contains(artifact1)); + assertFalse(artifacts.contains(artifact2)); + } + + public void test_excludeTypes() throws Exception { + File testPom = new File(getBasedir(), "target/test-classes/unit/go-offline-test/exclude-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + ArtifactStub artifact1 = new ArtifactStub(); + artifact1.setGroupId(VALID_GROUP); + artifact1.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact1.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + artifact1.setType("ear"); + + ArtifactStub artifact2 = new ArtifactStub(); + artifact2.setGroupId(VALID_GROUP); + artifact2.setArtifactId(DUMMY_ARTIFACT_NAME + "-too"); + artifact2.setVersion(STUB_ARTIFACT_VERSION); + artifact2.setType("war"); + + ArtifactStub artifact3 = new ArtifactStub(); + artifact3.setGroupId(VALID_GROUP); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion(STUB_ARTIFACT_VERSION); + artifact3.setType("pom"); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + assertEquals(1, artifacts.size()); + assertFalse(artifacts.contains(artifact3)); + assertTrue(artifacts.contains(artifact2)); + assertFalse(artifacts.contains(artifact1)); + } + + /** + * Can't set a classifier on the ArtifactStub as of maven-plugin-testing-harness-3.3.0, there is a getter but no + * setter. If that ever gets implemented, comment in these two lines to support unit testing for this case, rename + * xtest to test and remove the Junit 5 Disabled annotation + * + * @throws Exception + */ + @Disabled("Requires update to maven-plugin-test-harness to support this test") + public void xtest_excludeClassifiers() throws Exception { + File testPom = new File(getBasedir(), "target/test-classes/unit/go-offline-test/exclude-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + ArtifactStub artifact1 = new ArtifactStub(); + artifact1.setGroupId(VALID_GROUP); + artifact1.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact1.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + // artifact1.setClassifier(CLASSIFIER_EXCLUDE_PREFIX); + + ArtifactStub artifact2 = new ArtifactStub(); + artifact2.setGroupId(VALID_GROUP); + artifact2.setArtifactId(DUMMY_ARTIFACT_NAME + "-too"); + artifact2.setVersion(STUB_ARTIFACT_VERSION); + // artifact2.setClassifier(CLASSIFIER_EXCLUDE_PREFIX + "Too"); + + ArtifactStub artifact3 = new ArtifactStub(); + artifact3.setGroupId(VALID_GROUP); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion(STUB_ARTIFACT_VERSION); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + assertEquals(1, artifacts.size()); + assertFalse(artifacts.contains(artifact1)); + assertFalse(artifacts.contains(artifact2)); + assertTrue(artifacts.contains(artifact3)); + } + + String GROUP_INCLUDE_PREFIX = "include.this.groupid"; + + String ARTIFACT_INCLUDE_PREFIX = "include-this-artifact"; + + String CLASSIFIER_INCLUDE_PREFIX = "includeThisClassifier"; + + public void test_includeGroupIds() throws Exception { + File testPom = new File(getBasedir(), "target/test-classes/unit/go-offline-test/include-gid-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + Artifact artifact1 = new ArtifactStub(); + artifact1.setGroupId(GROUP_INCLUDE_PREFIX); + artifact1.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact1.setVersion(STUB_ARTIFACT_VERSION); + + Artifact artifact2 = new ArtifactStub(); + artifact2.setGroupId(GROUP_INCLUDE_PREFIX + ".too"); + artifact2.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact2.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + + Artifact artifact3 = new ArtifactStub(); + artifact3.setGroupId("skip.me"); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion("1.0"); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + + assertEquals(2, artifacts.size()); + assertFalse(artifacts.contains(artifact3)); + assertTrue(artifacts.contains(artifact1)); + assertTrue(artifacts.contains(artifact2)); + } + + public void test_includeArtifactIds() throws Exception { + File testPom = new File(getBasedir(), "target/test-classes/unit/go-offline-test/include-aid-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + Artifact artifact1 = new ArtifactStub(); + artifact1.setGroupId(VALID_GROUP); + artifact1.setArtifactId(ARTIFACT_INCLUDE_PREFIX); + artifact1.setVersion(STUB_ARTIFACT_VERSION); + + Artifact artifact2 = new ArtifactStub(); + artifact2.setGroupId(VALID_GROUP); + artifact2.setArtifactId(ARTIFACT_INCLUDE_PREFIX + "-too"); + artifact2.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + + Artifact artifact3 = new ArtifactStub(); + artifact3.setGroupId(VALID_GROUP); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion("1.0"); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + + assertEquals(2, artifacts.size()); + assertFalse(artifacts.contains(artifact3)); + assertTrue(artifacts.contains(artifact1)); + assertTrue(artifacts.contains(artifact2)); + } + + public void test_includeScope() throws Exception { + File testPom = + new File(getBasedir(), "target/test-classes/unit/go-offline-test/include-scope-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + Artifact artifact1 = new ArtifactStub(); + artifact1.setGroupId(VALID_GROUP); + artifact1.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact1.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + artifact1.setScope("provided"); + + Artifact artifact2 = new ArtifactStub(); + artifact2.setGroupId(VALID_GROUP); + artifact2.setArtifactId(DUMMY_ARTIFACT_NAME + "-too"); + artifact2.setVersion(STUB_ARTIFACT_VERSION); + artifact2.setScope("system"); + + Artifact artifact3 = new ArtifactStub(); + artifact3.setGroupId(VALID_GROUP); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion(STUB_ARTIFACT_VERSION); + artifact3.setScope("test"); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + assertEquals(1, artifacts.size()); + + assertTrue(artifacts.contains(artifact1)); + assertFalse(artifacts.contains(artifact2)); + assertFalse(artifacts.contains(artifact3)); + } + + public void test_includeTypes() throws Exception { + File testPom = + new File(getBasedir(), "target/test-classes/unit/go-offline-test/include-types-plugin-config.xml"); + + subject = (GoOfflineMojo) lookupMojo("go-offline", testPom); + assertNotNull(subject); + + ArtifactStub artifact1 = new ArtifactStub(); + artifact1.setGroupId(VALID_GROUP); + artifact1.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact1.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + artifact1.setType("ear"); + + ArtifactStub artifact2 = new ArtifactStub(); + artifact2.setGroupId(VALID_GROUP); + artifact2.setArtifactId(DUMMY_ARTIFACT_NAME + "-too"); + artifact2.setVersion(STUB_ARTIFACT_VERSION); + artifact2.setType("pom"); + + ArtifactStub artifact3 = new ArtifactStub(); + artifact3.setGroupId(VALID_GROUP); + artifact3.setArtifactId(DUMMY_ARTIFACT_NAME); + artifact3.setVersion(STUB_ARTIFACT_VERSION + "-SNAPSHOT"); + artifact3.setType("war"); + + Set<Artifact> artifacts = new HashSet<>(); + artifacts.add(artifact1); + artifacts.add(artifact2); + artifacts.add(artifact3); + + assertEquals(3, artifacts.size()); + FilterArtifacts filter = subject.getArtifactsFilter(); + artifacts = filter.filter(artifacts); + assertEquals(2, artifacts.size()); + + assertTrue(artifacts.contains(artifact1)); + assertTrue(artifacts.contains(artifact2)); + assertFalse(artifacts.contains(artifact3)); + } +} diff --git a/src/test/resources/unit/go-offline-test/exclude-plugin-config.xml b/src/test/resources/unit/go-offline-test/exclude-plugin-config.xml new file mode 100644 index 00000000..c80cf343 --- /dev/null +++ b/src/test/resources/unit/go-offline-test/exclude-plugin-config.xml @@ -0,0 +1,35 @@ +<!-- * Licensed to the Apache Software Foundation (ASF) under one * or more + contributor license agreements. See the NOTICE file * distributed with this + work for additional information * regarding copyright ownership. The ASF + licenses this file * to you 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. * --> +<project> + <build> + <plugins> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <version>@project.version@</version> + <configuration> + <excludeGroupIds>skip.this.groupid,skip.this.groupid.too + </excludeGroupIds> + <excludeArtifactIds>skip-this-artifact,skip-this-artifact-too + </excludeArtifactIds> + <!-- the maven-common-artifact-filters library does not support + comma delimited scope exclusions. only one at a time. the other filters support + comma delimited lists --> + <!-- <excludeScope>compile,system</excludeScope> --> + <excludeScope>system</excludeScope> + <excludeTypes>ear,pom</excludeTypes> + <excludeClassifiers>skipThisClassifier,skipThisClassifierToo + </excludeClassifiers> + </configuration> + </plugin> + </plugins> + </build> +</project> diff --git a/src/test/resources/unit/go-offline-test/include-aid-plugin-config.xml b/src/test/resources/unit/go-offline-test/include-aid-plugin-config.xml new file mode 100644 index 00000000..cd792ec8 --- /dev/null +++ b/src/test/resources/unit/go-offline-test/include-aid-plugin-config.xml @@ -0,0 +1,25 @@ +<!-- * Licensed to the Apache Software Foundation (ASF) under one * or more + contributor license agreements. See the NOTICE file * distributed with this + work for additional information * regarding copyright ownership. The ASF + licenses this file * to you 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. * --> +<project> + <build> + <plugins> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <version>@project.version@</version> + <configuration> + <includeArtifactIds>include-this-artifact,include-this-artifact-too + </includeArtifactIds> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/src/test/resources/unit/go-offline-test/include-gid-plugin-config.xml b/src/test/resources/unit/go-offline-test/include-gid-plugin-config.xml new file mode 100644 index 00000000..8d2c425a --- /dev/null +++ b/src/test/resources/unit/go-offline-test/include-gid-plugin-config.xml @@ -0,0 +1,24 @@ +<!-- * Licensed to the Apache Software Foundation (ASF) under one * or more + contributor license agreements. See the NOTICE file * distributed with this + work for additional information * regarding copyright ownership. The ASF + licenses this file * to you 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. * --> +<project> + <build> + <plugins> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <version>@project.version@</version> + <configuration> + <includeGroupIds>include.this.groupid,include.this.groupid.too</includeGroupIds> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/src/test/resources/unit/go-offline-test/include-scope-plugin-config.xml b/src/test/resources/unit/go-offline-test/include-scope-plugin-config.xml new file mode 100644 index 00000000..2230d2a8 --- /dev/null +++ b/src/test/resources/unit/go-offline-test/include-scope-plugin-config.xml @@ -0,0 +1,24 @@ +<!-- * Licensed to the Apache Software Foundation (ASF) under one * or more + contributor license agreements. See the NOTICE file * distributed with this + work for additional information * regarding copyright ownership. The ASF + licenses this file * to you 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. * --> +<project> + <build> + <plugins> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <version>@project.version@</version> + <configuration> + <includeScope>provided</includeScope> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/src/test/resources/unit/go-offline-test/include-types-plugin-config.xml b/src/test/resources/unit/go-offline-test/include-types-plugin-config.xml new file mode 100644 index 00000000..e7e2365f --- /dev/null +++ b/src/test/resources/unit/go-offline-test/include-types-plugin-config.xml @@ -0,0 +1,24 @@ +<!-- * Licensed to the Apache Software Foundation (ASF) under one * or more + contributor license agreements. See the NOTICE file * distributed with this + work for additional information * regarding copyright ownership. The ASF + licenses this file * to you 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. * --> +<project> + <build> + <plugins> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + <version>@project.version@</version> + <configuration> + <includeTypes>pom,ear</includeTypes> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file