From a1a3cd61fd1c7e4b3911df1516d2203c6f877c06 Mon Sep 17 00:00:00 2001 From: Joseph Walton Date: Sun, 29 May 2022 22:57:31 +1000 Subject: [PATCH] [MENFORCER-420] Cache the results of getDependenciesToCheck across rules. Use an execution-scoped cache to store the results of the expensive call to getDependenciesToCheck so that it's not recomputed for each rule. Signed-off-by: Joseph Walton --- .../enforcer/rule/api/EnforcerRuleHelper.java | 10 ++++++++++ .../enforcer/AbstractBanDependencies.java | 18 ++++++++++++++++-- .../enforcer/DefaultEnforcementRuleHelper.java | 13 +++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java index 403be73d..727faef6 100644 --- a/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java +++ b/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRuleHelper.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Map; +import java.util.function.Supplier; import javax.annotation.Nonnull; @@ -131,4 +132,13 @@ List getComponentList ( String role ) * @return the container */ PlexusContainer getContainer(); + + /** + * Gets a cached value, or uses the provided producer to compute it. + * + * @param key a key to identify the value stored + * @param producer a supplier for the value if it's not already present + * @return a previously-cached or freshly-computed value + */ + Object getCache( String key, Supplier producer ); } diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java index 8a9735d0..b8434bd5 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java @@ -37,6 +37,8 @@ import java.util.HashSet; import java.util.Set; +import javax.annotation.Nonnull; + /** * Abstract Rule for banning dependencies. * @@ -77,7 +79,7 @@ public void execute( EnforcerRuleHelper helper ) try { - graphBuilder = (DependencyGraphBuilder) helper.getComponent( DependencyGraphBuilder.class ); + graphBuilder = helper.getComponent( DependencyGraphBuilder.class ); } catch ( ComponentLookupException e ) { @@ -89,7 +91,7 @@ public void execute( EnforcerRuleHelper helper ) buildingRequest.setProject( project ); // get the correct list of dependencies - Set dependencies = getDependenciesToCheck( buildingRequest ); + Set dependencies = getDependenciesToCheck( helper, buildingRequest ); // look for banned dependencies Set foundExcludes = checkDependencies( dependencies, helper.getLog() ); @@ -120,6 +122,18 @@ protected CharSequence getErrorMessage( Artifact artifact ) return "Found Banned Dependency: " + artifact.getId() + System.lineSeparator(); } + private Set getDependenciesToCheck( @Nonnull EnforcerRuleHelper helper, + ProjectBuildingRequest buildingRequest ) + { + String cacheKey = buildingRequest.getProject().getId() + "_" + searchTransitive; + + // check in the cache + Set dependencies = + (Set) helper.getCache( cacheKey, () -> getDependenciesToCheck( buildingRequest ) ); + + return dependencies; + } + protected Set getDependenciesToCheck( ProjectBuildingRequest buildingRequest ) { Set dependencies = null; diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java index e1c88585..7f807487 100644 --- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java +++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/DefaultEnforcementRuleHelper.java @@ -20,8 +20,10 @@ */ import java.io.File; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Supplier; import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper; import org.apache.maven.execution.MavenSession; @@ -50,6 +52,9 @@ public class DefaultEnforcementRuleHelper /** The container. */ private PlexusContainer container; + /** A cache. */ + private Map cache; + /** * Instantiates a new default enforcement rule helper. * @@ -71,6 +76,8 @@ public DefaultEnforcementRuleHelper( MavenSession session, ExpressionEvaluator e { this.container = session.getContainer(); } + + this.cache = new HashMap<>(); } @Override @@ -139,4 +146,10 @@ public PlexusContainer getContainer() { return container; } + + @Override + public Object getCache( String key, Supplier producer ) + { + return cache.computeIfAbsent( key, ( x ) -> producer.get() ); + } }