You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2013/07/25 13:19:09 UTC
svn commit: r1506895 -
/maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java
Author: olamy
Date: Thu Jul 25 11:19:09 2013
New Revision: 1506895
URL: http://svn.apache.org/r1506895
Log:
Implement switching between warnings and errors.
Modified:
maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java
Modified: maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java?rev=1506895&r1=1506894&r2=1506895&view=diff
==============================================================================
--- maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java (original)
+++ maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java Thu Jul 25 11:19:09 2013
@@ -19,12 +19,25 @@ package org.apache.maven.plugins.enforce
* under the License.
*/
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import org.apache.maven.enforcer.rule.api.EnforcerLevel;
import org.apache.maven.enforcer.rule.api.EnforcerRule;
+import org.apache.maven.enforcer.rule.api.EnforcerRule2;
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
+import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.maven.plugin.logging.Log;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
+import org.apache.maven.project.path.PathTranslator;
+import org.codehaus.plexus.PlexusConstants;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.context.Context;
+import org.codehaus.plexus.context.ContextException;
/**
* This goal executes the defined enforcer-rules once per
@@ -57,6 +70,180 @@ public class EnforceMojo
private EnforcerRule[] rules;
/**
+ * Use this flag to disable rule result caching. This will cause
+ * all rules to execute on each project even if the rule indicates it can
+ * safely be cached.
+ */
+ @Parameter( property = "enforcer.ignoreCache", defaultValue = "false" )
+ protected boolean ignoreCache = false;
+
+ /**
+ * This is a static variable used to persist the cached results across plugin invocations.
+ */
+ protected static Hashtable<String, EnforcerRule> cache = new Hashtable<String, EnforcerRule>();
+
+
+ // set by the contextualize method. Only way to get the
+ // plugin's container in 2.0.x
+ protected PlexusContainer container;
+
+ public void contextualize ( Context context )
+ throws ContextException
+ {
+ container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
+ }
+
+ /**
+ * Entry point to the mojo
+ * @throws MojoExecutionException
+ */
+ public void execute ()
+ throws MojoExecutionException
+ {
+ Log log = this.getLog();
+
+ EnforcerExpressionEvaluator evaluator = new EnforcerExpressionEvaluator( session, translator, project );
+
+ // the entire execution can be easily skipped
+ if ( !skip )
+ {
+ // list to store exceptions
+ List<String> list = new ArrayList<String>();
+
+ // make sure the rules exist
+ if ( rules != null && rules.length > 0 )
+ {
+ String currentRule = "Unknown";
+
+ // create my helper
+ EnforcerRuleHelper helper = new DefaultEnforcementRuleHelper( session, evaluator, log, container );
+
+ // if we are only warning, then disable
+ // failFast
+ if ( !fail )
+ {
+ failFast = false;
+ }
+
+ boolean hasErrors = false;
+
+ // go through each rule
+ for ( int i = 0; i < rules.length; i++ )
+ {
+
+ // prevent against empty rules
+ EnforcerRule rule = rules[i];
+ final EnforcerLevel level = getLevel( rule );
+ if ( rule != null )
+ {
+ // store the current rule for
+ // logging purposes
+ currentRule = rule.getClass().getName();
+ log.debug( "Executing rule: " + currentRule );
+ try
+ {
+ if ( ignoreCache || shouldExecute( rule ) )
+ {
+ // execute the rule
+ //noinspection SynchronizationOnLocalVariableOrMethodParameter
+ synchronized ( rule )
+ {
+ rule.execute( helper );
+ }
+ }
+ }
+ catch ( EnforcerRuleException e )
+ {
+ // i can throw an exception
+ // because failfast will be
+ // false if fail is false.
+ if ( failFast && level == EnforcerLevel.ERROR )
+ {
+ throw new MojoExecutionException( currentRule + " failed with message:\n"
+ + e.getMessage(), e );
+ }
+ else
+ {
+ if (level == EnforcerLevel.ERROR) {
+ hasErrors = true;
+ list.add( "Rule " + i + ": " + currentRule + " failed with message:\n" + e.getMessage() );
+ log.debug( "Adding failure due to exception" , e );
+ }
+ else
+ {
+ list.add( "Rule " + i + ": " + currentRule + " warned with message:\n" + e.getMessage() );
+ log.debug( "Adding warning due to exception" , e );
+ }
+ }
+ }
+ }
+ }
+
+ // if we found anything
+ if ( !list.isEmpty() )
+ {
+ for ( String failure : list )
+ {
+ log.warn( failure );
+ }
+ if ( fail && hasErrors )
+ {
+ throw new MojoExecutionException(
+ "Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed." );
+ }
+ }
+ }
+ else
+ {
+ throw new MojoExecutionException(
+ "No rules are configured. Use the skip flag if you want to disable execution." );
+ }
+ }
+ else
+ {
+ log.info( "Skipping Rule Enforcement." );
+ }
+ }
+
+ /**
+ * This method determines if a rule should execute based
+ * on the cache
+ *
+ * @param rule the rule to verify
+ * @return {@code true} if rule should be executed, otherwise {@code false}
+ */
+ protected boolean shouldExecute ( EnforcerRule rule )
+ {
+ if ( rule.isCacheable() )
+ {
+ Log log = this.getLog();
+ log.debug( "Rule " + rule.getClass().getName() + " is cacheable." );
+ String key = rule.getClass().getName() + " " + rule.getCacheId();
+ if ( EnforceMojo.cache.containsKey( key ) )
+ {
+ log.debug( "Key " + key + " was found in the cache" );
+ if ( rule.isResultValid( (EnforcerRule) cache.get( key ) ) )
+ {
+ log.debug( "The cached results are still valid. Skipping the rule: " + rule.getClass().getName() );
+ return false;
+ }
+ }
+
+ //add it to the cache of executed rules
+ EnforceMojo.cache.put( key, rule );
+ }
+ return true;
+ }
+
+ /**
+ * @return the fail
+ */
+ public boolean isFail ()
+ {
+ return this.fail;
+ }
+
+ /**
* @param theFail the fail to set
*/
public void setFail ( boolean theFail )
@@ -96,10 +283,6 @@ public class EnforceMojo
return failFast;
}
- @Override
- public boolean isFail() {
- return fail;
- }
@Override
protected String createRuleMessage( int i , String currentRule , EnforcerRuleException e )
@@ -107,4 +290,30 @@ public class EnforceMojo
return "Rule " + i + ": " + currentRule + " failed with message:\n" + e.getMessage();
}
+ /**
+ * @param theTranslator the translator to set
+ */
+ public void setTranslator ( PathTranslator theTranslator )
+ {
+ this.translator = theTranslator;
+ }
+
+ /**
+ * Returns the level of the rule, defaults to {@link EnforcerLevel#ERROR}
+ * for backwards compatibility.
+ *
+ * @param rule might be of type {@link EnforcerRule2}.
+ * @return level of the rule.
+ */
+ private EnforcerLevel getLevel( EnforcerRule rule )
+ {
+ if ( rule instanceof EnforcerRule2 )
+ {
+ return ( (EnforcerRule2) rule ).getLevel();
+ }
+ else
+ {
+ return EnforcerLevel.ERROR;
+ }
+ }
}