Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[MENFORCER-458] Move Build-in rules to new API #236

Merged
merged 1 commit into from
Jan 19, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,23 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.plugins.enforcer;
package org.apache.maven.enforcer.rules.dependency;

import javax.inject.Inject;
import javax.inject.Named;

import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.commons.lang3.StringUtils;
import org.apache.maven.RepositoryUtils;
import org.apache.maven.enforcer.rule.api.EnforcerRule;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
import org.apache.maven.enforcer.rules.AbstractStandardEnforcerRule;
import org.apache.maven.enforcer.rules.utils.ArtifactMatcher;
import org.apache.maven.enforcer.rules.utils.ArtifactUtils;
import org.apache.maven.execution.MavenSession;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
import org.eclipse.aether.graph.Dependency;
import org.eclipse.aether.graph.DependencyNode;
Expand All @@ -43,7 +45,8 @@
*
* @author Jakub Senko
*/
public class BanTransitiveDependencies extends AbstractNonCacheableEnforcerRule implements EnforcerRule {
@Named("banTransitiveDependencies")
public final class BanTransitiveDependencies extends AbstractStandardEnforcerRule {

/**
* Specify the dependencies that will be ignored. This can be a list of artifacts in the format
Expand All @@ -63,6 +66,16 @@ public class BanTransitiveDependencies extends AbstractNonCacheableEnforcerRule
*/
private List<String> includes;

private final MavenSession session;

private final ResolveUtil resolveUtil;

@Inject
public BanTransitiveDependencies(MavenSession session, ResolveUtil resolveUtil) {
this.session = Objects.requireNonNull(session);
this.resolveUtil = Objects.requireNonNull(resolveUtil);
}

/**
* Searches dependency tree recursively for transitive dependencies that are not excluded, while generating nice
* info message along the way.
Expand Down Expand Up @@ -126,24 +139,23 @@ private static boolean searchTree(
}

@Override
public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {
MavenSession session;
try {
session = (MavenSession) helper.evaluate("${session}");
} catch (ExpressionEvaluationException e) {
throw new RuntimeException(e);
}
public void execute() throws EnforcerRuleException {
ArtifactTypeRegistry artifactTypeRegistry =
session.getRepositorySession().getArtifactTypeRegistry();
ArtifactMatcher exclusions = new ArtifactMatcher(excludes, includes);
Set<Dependency> directDependencies = session.getCurrentProject().getDependencies().stream()
.map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry))
.collect(Collectors.toSet());

DependencyNode rootNode = ArtifactUtils.resolveTransitiveDependencies(helper);
DependencyNode rootNode = resolveUtil.resolveTransitiveDependencies();
StringBuilder generatedMessage = new StringBuilder();
if (searchTree(rootNode, 0, exclusions, directDependencies, generatedMessage)) {
throw new EnforcerRuleException(ofNullable(getMessage()).orElse(generatedMessage.toString()));
}
}

@Override
public String toString() {
return String.format("BanTransitiveDependencies[message=%s, excludes=%s]", getMessage(), excludes);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,43 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.plugins.enforcer;
package org.apache.maven.enforcer.rules.dependency;

import javax.inject.Inject;
import javax.inject.Named;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.enforcer.rules.utils.ArtifactUtils;
import org.apache.maven.execution.MavenSession;

/**
* This rule checks that lists of dependencies are not included.
*
* @author <a href="mailto:[email protected]">Brian Fox</a>
*/
public class BannedDependencies extends BannedDependenciesBase {
@Named("bannedDependencies")
public final class BannedDependencies extends BannedDependenciesBase {

@Inject
BannedDependencies(MavenSession session, ResolveUtil resolveUtil) {
super(session, resolveUtil);
}

@Override
protected boolean validate(Artifact artifact) {
return !ArtifactUtils.matchDependencyArtifact(artifact, excludes)
|| ArtifactUtils.matchDependencyArtifact(artifact, includes);
return !ArtifactUtils.matchDependencyArtifact(artifact, getExcludes())
|| ArtifactUtils.matchDependencyArtifact(artifact, getIncludes());
}

@Override
protected String getErrorMessage() {
return "banned via the exclude/include list";
}

@Override
public String toString() {
return String.format(
"BannedDependencies[message=%s, excludes=%s, includes=%s, searchTransitive=%b]",
getMessage(), getExcludes(), getIncludes(), isSearchTransitive());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,25 @@
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.maven.plugins.enforcer;
package org.apache.maven.enforcer.rules.dependency;

import java.util.List;
import java.util.Objects;

import org.apache.commons.lang3.StringUtils;
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.enforcer.rules.AbstractStandardEnforcerRule;
import org.apache.maven.enforcer.rules.utils.ArtifactUtils;
import org.apache.maven.execution.MavenSession;
import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
import org.eclipse.aether.graph.DependencyNode;

/**
* Abstract base class for rules which validate the transitive
* dependency tree by traversing all children and validating every
* dependency artifact.
*/
abstract class BannedDependenciesBase extends AbstractNonCacheableEnforcerRule {
abstract class BannedDependenciesBase extends AbstractStandardEnforcerRule {

/**
* Specify the banned dependencies. This can be a list of artifacts in the format
Expand All @@ -46,7 +46,7 @@ abstract class BannedDependenciesBase extends AbstractNonCacheableEnforcerRule {
* @see #setExcludes(List)
* @see #getExcludes()
*/
protected List<String> excludes = null;
private List<String> excludes = null;

/**
* Specify the allowed dependencies. This can be a list of artifacts in the format
Expand All @@ -60,39 +60,55 @@ abstract class BannedDependenciesBase extends AbstractNonCacheableEnforcerRule {
* @see #setIncludes(List)
* @see #getIncludes()
*/
protected List<String> includes = null;
private List<String> includes = null;

/** Specify if transitive dependencies should be searched (default) or only look at direct dependencies. */
private boolean searchTransitive = true;

private final MavenSession session;

private final ResolveUtil resolveUtil;

BannedDependenciesBase(MavenSession session, ResolveUtil resolveUtil) {
this.session = Objects.requireNonNull(session);
this.resolveUtil = Objects.requireNonNull(resolveUtil);
}

protected MavenSession getSession() {
return session;
}

@Override
public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {
MavenSession session;
try {
session = (MavenSession) helper.evaluate("${session}");
} catch (ExpressionEvaluationException e) {
throw new EnforcerRuleException("Cannot resolve MavenSession", e);
}
public void execute() throws EnforcerRuleException {

if (!searchTransitive) {
String result = session.getCurrentProject().getDependencyArtifacts().stream()
.filter(a -> !validate(a))
.collect(
StringBuilder::new,
(messageBuilder, node) -> messageBuilder
.append(System.lineSeparator())
.append(node.getId())
.append(" <--- ")
.append(getErrorMessage()),
(m1, m2) -> m1.append(m2.toString()))
.toString();
if (!result.isEmpty()) {
throw new EnforcerRuleException(result);
String message = "";
if (getMessage() != null) {
message = getMessage() + System.lineSeparator();
}
throw new EnforcerRuleException(message + result);
}
} else {
StringBuilder messageBuilder = new StringBuilder();
DependencyNode rootNode = ArtifactUtils.resolveTransitiveDependencies(helper);
DependencyNode rootNode = resolveUtil.resolveTransitiveDependencies();
if (!validate(rootNode, 0, messageBuilder)) {
throw new EnforcerRuleException(messageBuilder.toString());
String message = "";
if (getMessage() != null) {
message = getMessage() + System.lineSeparator();
}
throw new EnforcerRuleException(message + messageBuilder);
}
}
}
Expand Down Expand Up @@ -127,15 +143,6 @@ protected boolean validate(DependencyNode node, int level, StringBuilder message
*/
protected abstract boolean validate(Artifact dependency);

/**
* Checks if is search transitive.
*
* @return the searchTransitive
*/
public boolean isSearchTransitive() {
return this.searchTransitive;
}

/**
* Sets the search transitive.
*
Expand Down Expand Up @@ -193,4 +200,8 @@ public List<String> getIncludes() {
public void setIncludes(List<String> theIncludes) {
this.includes = theIncludes;
}

public boolean isSearchTransitive() {
return searchTransitive;
}
}
Loading