subNodes = getAllDescendants(depNode);
- if (subNodes != null) {
- children.addAll(subNodes);
- }
+ /**
+ * Converts {@link DependencyNode} to {@link Artifact}; in comparison
+ * to {@link RepositoryUtils#toArtifact(org.eclipse.aether.artifact.Artifact)}, this method
+ * assigns {@link Artifact#getScope()} and {@link Artifact#isOptional()} based on
+ * the dependency information from the node.
+ *
+ * @param node {@link DependencyNode} to convert to {@link Artifact}
+ * @return target artifact
+ */
+ public static Artifact toArtifact(DependencyNode node) {
+ Artifact artifact = RepositoryUtils.toArtifact(node.getArtifact());
+ ofNullable(node.getDependency()).ifPresent(dependency -> {
+ ofNullable(dependency.getScope()).ifPresent(artifact::setScope);
+ artifact.setOptional(dependency.isOptional());
+ });
+ return artifact;
+ }
+
+ /**
+ * Retrieves the {@link DependencyNode} instance containing the result of the transitive dependency
+ * for the current {@link MavenProject}.
+ *
+ * @param helper (may not be null) an instance of the {@link EnforcerRuleHelper} class
+ * @param selectors zero or more {@link DependencySelector} instances
+ * @return a Dependency Node which is the root of the project's dependency tree
+ * @throws EnforcerRuleException thrown if the lookup fails
+ */
+ public static DependencyNode resolveTransitiveDependencies(
+ EnforcerRuleHelper helper, DependencySelector... selectors) throws EnforcerRuleException {
+ try {
+ RepositorySystem repositorySystem = helper.getComponent(RepositorySystem.class);
+ MavenSession session = (MavenSession) helper.evaluate("${session}");
+ MavenProject project = session.getCurrentProject();
+ ArtifactTypeRegistry artifactTypeRegistry =
+ session.getRepositorySession().getArtifactTypeRegistry();
+
+ DefaultRepositorySystemSession repositorySystemSession =
+ new DefaultRepositorySystemSession(session.getRepositorySession());
+ repositorySystemSession.setDependencyGraphTransformer(new ConflictResolver(
+ new NearestVersionSelector(),
+ new JavaScopeSelector(),
+ new SimpleOptionalitySelector(),
+ new JavaScopeDeriver()));
+ repositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true);
+ repositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true);
+ if (selectors.length > 0) {
+ repositorySystemSession.setDependencySelector(new AndDependencySelector(selectors));
}
+
+ CollectRequest collectRequest = new CollectRequest(
+ project.getDependencies().stream()
+ .map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry))
+ .collect(Collectors.toList()),
+ ofNullable(project.getDependencyManagement())
+ .map(DependencyManagement::getDependencies)
+ .map(list -> list.stream()
+ .map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry))
+ .collect(Collectors.toList()))
+ .orElse(null),
+ project.getRemoteProjectRepositories());
+ Artifact artifact = project.getArtifact();
+ collectRequest.setRootArtifact(RepositoryUtils.toArtifact(artifact));
+
+ return repositorySystem
+ .collectDependencies(repositorySystemSession, collectRequest)
+ .getRoot();
+ } catch (ExpressionEvaluationException | ComponentLookupException e) {
+ throw new EnforcerRuleException("Unable to lookup a component " + e.getLocalizedMessage(), e);
+ } catch (DependencyCollectionException e) {
+ throw new EnforcerRuleException("Could not build dependency tree " + e.getLocalizedMessage(), e);
}
- return children;
}
/**
- * Checks the set of dependencies against the list of patterns.
+ * Retrieves all child dependency artifacts from the given {@link DependencyNode} and returns them
+ * as a set of {@link Artifact}.
+ * Note: Thus, the result will not contain the root artifact.
+ * @param node root node
+ * @return set of all child dependency artifacts
+ */
+ public static Set getDependencyArtifacts(DependencyNode node) {
+ return getDependencyArtifacts(node, new HashSet<>());
+ }
+
+ private static Set getDependencyArtifacts(DependencyNode node, Set set) {
+ node.getChildren().forEach(child -> {
+ set.add(toArtifact(child));
+ getDependencyArtifacts(child, set);
+ });
+ return set;
+ }
+
+ /**
+ * Returns a subset of dependency artifacts that match the given collection of patterns
*
- * @param thePatterns the patterns
- * @param dependencies the dependencies
+ * @param dependencies dependency artifacts to match against patterns
+ * @param patterns patterns to match against the artifacts
* @return a set containing artifacts matching one of the patterns or null
* @throws EnforcerRuleException the enforcer rule exception
*/
- public static Set checkDependencies(Set dependencies, List thePatterns)
+ public static Set filterDependencyArtifacts(Set dependencies, Collection patterns)
throws EnforcerRuleException {
- Set foundMatches = null;
-
- if (thePatterns != null && thePatterns.size() > 0) {
-
- for (String pattern : thePatterns) {
- String[] subStrings = pattern.split(":");
- subStrings = StringUtils.stripAll(subStrings);
- String resultPattern = StringUtils.join(subStrings, ":");
+ try {
+ return ofNullable(patterns)
+ .map(collection -> collection.stream()
+ .map(p -> p.split(":"))
+ .map(StringUtils::stripAll)
+ .map(arr -> String.join(":", arr))
+ .flatMap(pattern ->
+ dependencies.stream().filter(artifact -> compareDependency(pattern, artifact)))
+ .collect(Collectors.toSet()))
+ .orElse(null);
+ } catch (IllegalArgumentException e) {
+ if (e.getCause() instanceof InvalidVersionSpecificationException) {
+ throw new EnforcerRuleException(e.getMessage());
+ }
+ throw e;
+ }
+ }
- for (Artifact artifact : dependencies) {
- if (compareDependency(resultPattern, artifact)) {
- // only create if needed
- if (foundMatches == null) {
- foundMatches = new HashSet();
- }
- foundMatches.add(artifact);
- }
- }
+ /**
+ * Checks if the given dependency artifact matches the given collection of patterns
+ *
+ * @param artifact dependency artifact to match against patterns
+ * @param patterns patterns to match against the artifacts
+ * @return {@code true} if the given artifact matches the set of patterns
+ */
+ public static boolean matchDependencyArtifact(Artifact artifact, Collection patterns) {
+ try {
+ return ofNullable(patterns)
+ .map(collection -> collection.stream()
+ .map(p -> p.split(":"))
+ .map(StringUtils::stripAll)
+ .map(arr -> String.join(":", arr))
+ .anyMatch(pattern -> compareDependency(pattern, artifact)))
+ .orElse(false);
+ } catch (IllegalArgumentException e) {
+ if (e.getCause() instanceof InvalidVersionSpecificationException) {
+ throw new IllegalArgumentException(e.getMessage());
}
+ throw e;
}
- return foundMatches;
}
/**
@@ -91,18 +209,8 @@ public static Set checkDependencies(Set dependencies, Listtrue if the artifact matches one of the patterns
- * @throws EnforcerRuleException the enforcer rule exception
*/
- static boolean compareDependency(String pattern, Artifact artifact) throws EnforcerRuleException {
-
- ArtifactMatcher.Pattern am = new Pattern(pattern);
- boolean result;
- try {
- result = am.match(artifact);
- } catch (InvalidVersionSpecificationException e) {
- throw new EnforcerRuleException("Invalid Version Range: ", e);
- }
-
- return result;
+ static boolean compareDependency(String pattern, Artifact artifact) {
+ return new Pattern(pattern).match(artifact);
}
}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
index f0aabbad..959b4878 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/DependencyVersionMap.java
@@ -23,38 +23,43 @@
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
-import org.apache.maven.artifact.Artifact;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.shared.dependency.graph.DependencyNode;
-import org.apache.maven.shared.dependency.graph.traversal.DependencyNodeVisitor;
+import org.eclipse.aether.artifact.Artifact;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.graph.DependencyVisitor;
/**
* @author Brian Fox
- *
*/
-public class DependencyVersionMap implements DependencyNodeVisitor {
+public class DependencyVersionMap implements DependencyVisitor, ParentNodeProvider {
+ private ParentsVisitor parentsVisitor;
private boolean uniqueVersions;
-
- private Map> idsToNode;
+ private final Map> idsToNode = new HashMap<>();
public DependencyVersionMap(Log log) {
- idsToNode = new HashMap<>();
+ this.parentsVisitor = new ParentsVisitor();
}
- public void setUniqueVersions(boolean uniqueVersions) {
+ public DependencyVersionMap setUniqueVersions(boolean uniqueVersions) {
this.uniqueVersions = uniqueVersions;
+ return this;
}
@Override
- public boolean visit(DependencyNode node) {
+ public boolean visitEnter(DependencyNode node) {
addDependency(node);
- return !containsConflicts(node);
+ return parentsVisitor.visitEnter(node) && !containsConflicts(node);
+ }
+
+ @Override
+ public boolean visitLeave(DependencyNode node) {
+ return parentsVisitor.visitLeave(node);
}
@Override
- public boolean endVisit(DependencyNode node) {
- return true;
+ public DependencyNode getParent(DependencyNode node) {
+ return parentsVisitor.getParent(node);
}
private String constructKey(DependencyNode node) {
@@ -67,12 +72,7 @@ private String constructKey(Artifact artifact) {
public void addDependency(DependencyNode node) {
String key = constructKey(node);
- List nodes = idsToNode.get(key);
- if (nodes == null) {
- nodes = new ArrayList<>();
- idsToNode.put(key, nodes);
- }
- nodes.add(node);
+ idsToNode.computeIfAbsent(key, k -> new ArrayList<>()).add(node);
}
private String getVersion(Artifact artifact) {
@@ -111,7 +111,7 @@ public List> getConflictedVersionNumbers(List inclu
if (formattedIncludes != null || formattedExcludes != null) {
filteredNodes = new ArrayList<>();
for (DependencyNode node : nodes) {
- if (includeArtifact(node.getArtifact(), formattedIncludes, formattedExcludes)) {
+ if (includeArtifact(node, formattedIncludes, formattedExcludes)) {
filteredNodes.add(node);
}
}
@@ -123,12 +123,12 @@ public List> getConflictedVersionNumbers(List inclu
return output;
}
- private static boolean includeArtifact(Artifact artifact, List includes, List excludes)
+ private static boolean includeArtifact(DependencyNode node, List includes, List excludes)
throws EnforcerRuleException {
boolean included = includes == null || includes.isEmpty();
if (!included) {
for (String pattern : includes) {
- if (ArtifactUtils.compareDependency(pattern, artifact)) {
+ if (ArtifactUtils.compareDependency(pattern, ArtifactUtils.toArtifact(node))) {
included = true;
break;
}
@@ -140,7 +140,7 @@ private static boolean includeArtifact(Artifact artifact, List includes,
boolean excluded = false;
if (excludes != null) {
for (String pattern : excludes) {
- if (ArtifactUtils.compareDependency(pattern, artifact)) {
+ if (ArtifactUtils.compareDependency(pattern, ArtifactUtils.toArtifact(node))) {
excluded = true;
break;
}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
index 6d6b4a4a..f8b854c0 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/EnforcerRuleUtils.java
@@ -19,16 +19,10 @@
package org.apache.maven.plugins.enforcer.utils;
import java.util.List;
-import org.apache.maven.artifact.factory.ArtifactFactory;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
import org.apache.maven.model.Plugin;
import org.apache.maven.model.ReportPlugin;
-import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
/**
* The Class EnforcerRuleUtils.
@@ -36,68 +30,15 @@
* @author Brian Fox
*/
public class EnforcerRuleUtils {
-
- /** The resolver. */
- ArtifactResolver resolver;
-
- /** The local. */
- ArtifactRepository local;
-
- /** The remote repositories. */
- List remoteRepositories;
-
- /** The log. */
- Log log;
-
- /** The project. */
- MavenProject project;
-
private EnforcerRuleHelper helper;
- /**
- * Instantiates a new enforcer rule utils.
- *
- * @param theFactory unused
- * @param theResolver the the resolver
- * @param theLocal the the local
- * @param theRemoteRepositories the the remote repositories
- * @param project the project
- * @param theLog the the log
- */
- public EnforcerRuleUtils(
- ArtifactFactory theFactory,
- ArtifactResolver theResolver,
- ArtifactRepository theLocal,
- List theRemoteRepositories,
- MavenProject project,
- Log theLog) {
- super();
- this.resolver = theResolver;
- this.local = theLocal;
- this.remoteRepositories = theRemoteRepositories;
- this.log = theLog;
- this.project = project;
- }
-
/**
* Instantiates a new enforcer rule utils.
*
* @param helper the helper
*/
public EnforcerRuleUtils(EnforcerRuleHelper helper) {
-
this.helper = helper;
- // get the various expressions out of the
- // helper.
- try {
- resolver = helper.getComponent(ArtifactResolver.class);
- local = (ArtifactRepository) helper.evaluate("${localRepository}");
- project = (MavenProject) helper.evaluate("${project}");
- remoteRepositories = project.getRemoteArtifactRepositories();
- } catch (ComponentLookupException | ExpressionEvaluationException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
}
private void resolve(Plugin plugin) {
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentNodeProvider.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentNodeProvider.java
new file mode 100644
index 00000000..0edecfaf
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentNodeProvider.java
@@ -0,0 +1,34 @@
+/*
+ * 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.enforcer.utils;
+
+import org.eclipse.aether.graph.DependencyNode;
+
+/**
+ * Provides the information about {@link org.eclipse.aether.graph.DependencyNode} parent nodes
+ */
+public interface ParentNodeProvider {
+
+ /**
+ * Returns the parent node of the given node
+ * @param node node to get the information for
+ * @return parent node or {@code null} is no information is known
+ */
+ DependencyNode getParent(DependencyNode node);
+}
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentsVisitor.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentsVisitor.java
new file mode 100644
index 00000000..98e10f06
--- /dev/null
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/utils/ParentsVisitor.java
@@ -0,0 +1,52 @@
+/*
+ * 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.enforcer.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Stack;
+import org.eclipse.aether.graph.DependencyNode;
+import org.eclipse.aether.graph.DependencyVisitor;
+
+/**
+ * A {@link DependencyVisitor} building a map of parent nodes
+ */
+public class ParentsVisitor implements DependencyVisitor, ParentNodeProvider {
+
+ private final Map parents = new HashMap<>();
+ private final Stack parentStack = new Stack<>();
+
+ @Override
+ public DependencyNode getParent(DependencyNode node) {
+ return parents.get(node);
+ }
+
+ @Override
+ public boolean visitEnter(DependencyNode node) {
+ parents.put(node, parentStack.isEmpty() ? null : parentStack.peek());
+ parentStack.push(node);
+ return true;
+ }
+
+ @Override
+ public boolean visitLeave(DependencyNode node) {
+ parentStack.pop();
+ return true;
+ }
+}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BannedDependenciesTestSetup.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BannedDependenciesTestSetup.java
index 69e8c85e..7d218620 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BannedDependenciesTestSetup.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/BannedDependenciesTestSetup.java
@@ -21,22 +21,22 @@
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
-import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
import org.apache.maven.plugin.testing.ArtifactStubFactory;
import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
public class BannedDependenciesTestSetup {
+ private final MavenProject project;
+
public BannedDependenciesTestSetup() throws IOException {
this.excludes = new ArrayList<>();
this.includes = new ArrayList<>();
ArtifactStubFactory factory = new ArtifactStubFactory();
- MockProject project = new MockProject();
+ project = new MockProject();
project.setArtifacts(factory.getMixedArtifacts());
project.setDependencyArtifacts(factory.getScopedArtifacts());
@@ -83,12 +83,9 @@ public void setExcludes(List excludes) {
private BannedDependencies newBannedDependenciesRule() {
return new BannedDependencies() {
@Override
- protected Set getDependenciesToCheck(ProjectBuildingRequest buildingRequest) {
- MavenProject project = buildingRequest.getProject();
-
- // the integration with dependencyGraphTree is verified with the integration tests
- // for unit-testing
- return isSearchTransitive() ? project.getArtifacts() : project.getDependencyArtifacts();
+ protected boolean validate(Artifact artifact) {
+ return (isSearchTransitive() ? project.getArtifacts() : project.getDependencyArtifacts())
+ .stream().map(super::validate).reduce(true, Boolean::logicalAnd);
}
};
}
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
index b920c397..c8876472 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/EnforcerTestUtils.java
@@ -18,15 +18,14 @@
*/
package org.apache.maven.plugins.enforcer;
+import static java.util.Arrays.asList;
import static org.mockito.Mockito.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
-import java.util.Arrays;
-import java.util.Collections;
import java.util.Properties;
-import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.DefaultArtifact;
+import org.apache.maven.RepositoryUtils;
+import org.apache.maven.artifact.handler.DefaultArtifactHandler;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
import org.apache.maven.execution.MavenExecutionRequest;
import org.apache.maven.execution.MavenExecutionResult;
@@ -41,13 +40,18 @@
import org.apache.maven.plugins.enforcer.utils.MockEnforcerExpressionEvaluator;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.ProjectBuildingRequest;
-import org.apache.maven.shared.dependency.graph.DependencyCollectorBuilder;
-import org.apache.maven.shared.dependency.graph.internal.DefaultDependencyNode;
import org.codehaus.plexus.PlexusContainer;
import org.codehaus.plexus.classworlds.ClassWorld;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
-import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
-import org.mockito.Mockito;
+import org.eclipse.aether.DefaultRepositorySystemSession;
+import org.eclipse.aether.RepositorySystem;
+import org.eclipse.aether.artifact.ArtifactType;
+import org.eclipse.aether.artifact.DefaultArtifact;
+import org.eclipse.aether.collection.CollectRequest;
+import org.eclipse.aether.collection.CollectResult;
+import org.eclipse.aether.collection.DependencyCollectionException;
+import org.eclipse.aether.graph.DefaultDependencyNode;
+import org.eclipse.aether.graph.DependencyNode;
/**
* The Class EnforcerTestUtils.
@@ -73,8 +77,9 @@ public static MavenSession getMavenSession() {
when(mer.getUserProperties()).thenReturn(new Properties());
when(mer.getSystemProperties()).thenReturn(systemProperties);
- MavenExecutionResult meresult = mock(MavenExecutionResult.class);
- return new MavenSession(mock, null, mer, meresult);
+ MavenExecutionResult meResult = mock(MavenExecutionResult.class);
+
+ return new MavenSession(mock, new DefaultRepositorySystemSession(), mer, meResult);
}
/**
@@ -106,6 +111,22 @@ public static EnforcerRuleHelper getHelper(MavenProject project) {
return getHelper(project, false);
}
+ private static RepositorySystem mockRepositorySystem() throws DependencyCollectionException {
+ ArtifactType jarType = RepositoryUtils.newArtifactType("jar", new DefaultArtifactHandler("jar"));
+ final DependencyNode node = new DefaultDependencyNode(
+ new DefaultArtifact("groupId", "artifactId", "classifier", "jar", "version", jarType));
+ node.setChildren(asList(
+ new DefaultDependencyNode(
+ new DefaultArtifact("groupId", "artifact", "classifier", "jar", "1.0.0", jarType)),
+ new DefaultDependencyNode(
+ new DefaultArtifact("groupId", "artifact", "classifier", "jar", "2.0.0", jarType))));
+
+ RepositorySystem mockRepositorySystem = mock(RepositorySystem.class);
+ when(mockRepositorySystem.collectDependencies(any(), any(CollectRequest.class)))
+ .then(i -> new CollectResult(i.getArgument(1)).setRoot(node));
+ return mockRepositorySystem;
+ }
+
/**
* Gets the helper.
*
@@ -114,43 +135,29 @@ public static EnforcerRuleHelper getHelper(MavenProject project) {
* @return the helper
*/
public static EnforcerRuleHelper getHelper(MavenProject project, boolean mockExpression) {
- MavenSession session = getMavenSession();
- MojoExecution mockExecution = mock(MojoExecution.class);
- ExpressionEvaluator eval;
- if (mockExpression) {
- eval = new MockEnforcerExpressionEvaluator(session);
- } else {
- session.setCurrentProject(project);
- eval = new PluginParameterExpressionEvaluator(session, mockExecution);
- }
- PlexusContainer container = Mockito.mock(PlexusContainer.class);
-
- Artifact artifact =
- new DefaultArtifact("groupId", "artifactId", "version", "compile", "jar", "classifier", null);
- Artifact v1 = new DefaultArtifact("groupId", "artifact", "1.0.0", "compile", "jar", "", null);
- Artifact v2 = new DefaultArtifact("groupId", "artifact", "2.0.0", "compile", "jar", "", null);
- final DefaultDependencyNode node = new DefaultDependencyNode(artifact);
- DefaultDependencyNode child1 = new DefaultDependencyNode(node, v1, null, null, null);
- child1.setChildren(Collections.emptyList());
- DefaultDependencyNode child2 = new DefaultDependencyNode(node, v2, null, null, null);
- child2.setChildren(Collections.emptyList());
- node.setChildren(Arrays.asList(child1, child2));
-
- try {
- when(container.lookup(DependencyCollectorBuilder.class)).thenReturn((buildingRequest, filter) -> node);
- } catch (ComponentLookupException e) {
- // test will fail
- }
- ClassWorld classWorld = new ClassWorld("test", EnforcerTestUtils.class.getClassLoader());
- MojoDescriptor mojoDescriptor = new MojoDescriptor();
- mojoDescriptor.setRealm(classWorld.getClassRealm("test"));
- when(mockExecution.getMojoDescriptor()).thenReturn(mojoDescriptor);
try {
+ MavenSession session = getMavenSession();
+ MojoExecution mockExecution = mock(MojoExecution.class);
+ ExpressionEvaluator eval;
+ if (mockExpression) {
+ eval = new MockEnforcerExpressionEvaluator(session);
+ } else {
+ session.setCurrentProject(project);
+ eval = new PluginParameterExpressionEvaluator(session, mockExecution);
+ }
+
+ PlexusContainer container = mock(PlexusContainer.class);
+ when(container.lookup(RepositorySystem.class)).then(i -> mockRepositorySystem());
+
+ ClassWorld classWorld = new ClassWorld("test", EnforcerTestUtils.class.getClassLoader());
+ MojoDescriptor mojoDescriptor = new MojoDescriptor();
+ mojoDescriptor.setRealm(classWorld.getClassRealm("test"));
+ when(mockExecution.getMojoDescriptor()).thenReturn(mojoDescriptor);
when(container.lookup(MojoExecution.class)).thenReturn(mockExecution);
- } catch (ComponentLookupException e) {
- // test will fail
+ return new DefaultEnforcementRuleHelper(session, eval, new SystemStreamLog(), container);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
}
- return new DefaultEnforcementRuleHelper(session, eval, new SystemStreamLog(), container);
}
/**
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
index 29736ea6..f83819ba 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireReleaseDeps.java
@@ -22,13 +22,12 @@
import java.io.IOException;
import java.util.Collections;
-import java.util.Set;
import org.apache.maven.artifact.Artifact;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
import org.apache.maven.plugin.testing.ArtifactStubFactory;
import org.apache.maven.plugins.enforcer.utils.EnforcerRuleUtilsHelper;
import org.apache.maven.project.MavenProject;
-import org.apache.maven.project.ProjectBuildingRequest;
+import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
/**
@@ -37,6 +36,12 @@
* @author Brian Fox
*/
class TestRequireReleaseDeps {
+ private MavenProject project;
+
+ @BeforeEach
+ public void setUp() {
+ project = new MockProject();
+ }
/**
* Test rule.
@@ -46,7 +51,6 @@ class TestRequireReleaseDeps {
@Test
void testRule() throws Exception {
ArtifactStubFactory factory = new ArtifactStubFactory();
- MockProject project = new MockProject();
EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(project);
project.setArtifacts(factory.getMixedArtifacts());
project.setDependencyArtifacts(factory.getScopedArtifacts());
@@ -95,7 +99,6 @@ void testWildcardIgnore() throws Exception {
rule.setSearchTransitive(false);
ArtifactStubFactory factory = new ArtifactStubFactory();
- MockProject project = new MockProject();
project.setArtifact(factory.getReleaseArtifact());
project.setDependencyArtifacts(Collections.singleton(factory.createArtifact("g", "a", "1.0-SNAPSHOT", "test")));
EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(project);
@@ -114,9 +117,7 @@ void testId() {
@Test
void parentShouldBeExcluded() throws IOException {
-
ArtifactStubFactory factory = new ArtifactStubFactory();
- MockProject project = new MockProject();
project.setArtifact(factory.getSnapshotArtifact());
MavenProject parent = new MockProject();
@@ -134,12 +135,9 @@ void parentShouldBeExcluded() throws IOException {
private RequireReleaseDeps newRequireReleaseDeps() {
return new RequireReleaseDeps() {
@Override
- protected Set getDependenciesToCheck(ProjectBuildingRequest buildingRequest) {
- MavenProject project = buildingRequest.getProject();
-
- // the integration with dependencyGraphTree is verified with the integration tests
- // for unit-testing
- return isSearchTransitive() ? project.getArtifacts() : project.getDependencyArtifacts();
+ protected boolean validate(Artifact artifactl) {
+ return (isSearchTransitive() ? project.getArtifacts() : project.getDependencyArtifacts())
+ .stream().map(super::validate).reduce(true, Boolean::logicalAnd);
}
};
}
diff --git a/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/invoker.properties b/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/invoker.properties
new file mode 100644
index 00000000..58b6526e
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/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.buildResult = failure
diff --git a/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/pom.xml b/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/pom.xml
new file mode 100644
index 00000000..33d215fe
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/pom.xml
@@ -0,0 +1,66 @@
+
+
+
+
+
+ 4.0.0
+
+ org.apache.maven.its.enforcer
+ test
+ 1.0
+
+
+
+
+
+
+ org.apache.maven.plugins.enforcer.its
+ menforcer128_api
+ 1.4.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-enforcer-plugin
+ @project.version@
+
+
+ test
+
+ enforce
+
+
+
+
+
+ org.apache.maven.plugins.enforcer.its:menforcer128_api
+
+
+
+
+
+
+
+
+
+
diff --git a/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/verify.groovy b/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/verify.groovy
new file mode 100644
index 00000000..415c0e3f
--- /dev/null
+++ b/maven-enforcer-plugin/src/it/projects/banned-dependencies-fail/verify.groovy
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+def buildLog = new File( basedir, 'build.log' ).text
+assert buildLog.contains( 'org.apache.maven.plugins.enforcer.its:menforcer128_api:jar:1.4.0 <--- banned via the exclude/include list' )
diff --git a/maven-enforcer-plugin/src/it/projects/banned-plugins-fails/verify.groovy b/maven-enforcer-plugin/src/it/projects/banned-plugins-fails/verify.groovy
index 1d825f36..7fd32569 100644
--- a/maven-enforcer-plugin/src/it/projects/banned-plugins-fails/verify.groovy
+++ b/maven-enforcer-plugin/src/it/projects/banned-plugins-fails/verify.groovy
@@ -16,6 +16,6 @@
* specific language governing permissions and limitations
* under the License.
*/
-File buildLog = new File( basedir, 'build.log' )
-assert buildLog.text.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.BannedPlugins failed with message:' )
-assert buildLog.text.contains( 'Found Banned Plugin: org.codehaus.mojo:build-helper-maven-plugin:maven-plugin' )
+def buildLog = new File( basedir, 'build.log' ).text
+assert buildLog.contains( '[ERROR] Rule 0: org.apache.maven.plugins.enforcer.BannedPlugins failed with message:' )
+assert buildLog =~ /org.codehaus.mojo:build-helper-maven-plugin:maven-plugin:.* <--- banned plugin/
diff --git a/maven-enforcer-plugin/src/it/projects/multimodule-ban-transitive-dependencies_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/multimodule-ban-transitive-dependencies_failure/verify.groovy
index 793e850e..c6657d7a 100644
--- a/maven-enforcer-plugin/src/it/projects/multimodule-ban-transitive-dependencies_failure/verify.groovy
+++ b/maven-enforcer-plugin/src/it/projects/multimodule-ban-transitive-dependencies_failure/verify.groovy
@@ -19,4 +19,4 @@
File buildLog = new File( basedir, 'build.log' )
assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.BanTransitiveDependencies failed with message:' )
-assert buildLog.text.contains( 'org.apache.maven.its.enforcer:module1:jar:1.0-SNAPSHOT:compile has transitive dependencies:' )
+assert buildLog.text.contains( 'org.apache.maven.its.enforcer:module1:jar:1.0-SNAPSHOT has transitive dependencies:' )
diff --git a/maven-enforcer-plugin/src/it/projects/multimodule-require-release-dependencies-exclude_failure/verify.groovy b/maven-enforcer-plugin/src/it/projects/multimodule-require-release-dependencies-exclude_failure/verify.groovy
index 437bb461..f091ed1d 100644
--- a/maven-enforcer-plugin/src/it/projects/multimodule-require-release-dependencies-exclude_failure/verify.groovy
+++ b/maven-enforcer-plugin/src/it/projects/multimodule-require-release-dependencies-exclude_failure/verify.groovy
@@ -19,4 +19,4 @@
File buildLog = new File( basedir, 'build.log' )
assert buildLog.text.contains( 'Rule 0: org.apache.maven.plugins.enforcer.RequireReleaseDeps failed with message:' )
-assert buildLog.text.contains( 'Found Banned Dependency: org.apache.maven.its.enforcer:module1:jar:1.0-SNAPSHOT' )
+assert buildLog.text =~ /org.apache.maven.its.enforcer:module1:jar:1.0-SNAPSHOT.*is not a release dependency/
\ No newline at end of file