You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by br...@apache.org on 2007/11/07 22:24:36 UTC

svn commit: r592902 - in /maven/enforcer/trunk: ./ enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/ enforcer-rules/ enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/ enforcer-rules/src/test/java/org/apache/maven/plugins/enfo...

Author: brianf
Date: Wed Nov  7 13:24:35 2007
New Revision: 592902

URL: http://svn.apache.org/viewvc?rev=592902&view=rev
Log:
MENFORCER-12: new rule caching system to improve rule performance on multi-module builds

Modified:
    maven/enforcer/trunk/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java
    maven/enforcer/trunk/enforcer-rules/pom.xml
    maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java
    maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java
    maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java
    maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java
    maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java
    maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
    maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java
    maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
    maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java
    maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java
    maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java
    maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java
    maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java
    maven/enforcer/trunk/maven-enforcer-plugin/pom.xml
    maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceMojo.java
    maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java
    maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/MockEnforcerRule.java
    maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java
    maven/enforcer/trunk/pom.xml

Modified: maven/enforcer/trunk/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java (original)
+++ maven/enforcer/trunk/enforcer-api/src/main/java/org/apache/maven/enforcer/rule/api/EnforcerRule.java Wed Nov  7 13:24:35 2007
@@ -30,7 +30,7 @@
 public interface EnforcerRule
 {
     /**
-     * This is the inteface into the rule. This method should throw an exception
+     * This is the interface into the rule. This method should throw an exception
      * containing a reason message if the rule fails the check. The plugin will
      * then decide based on the fail flag if it should stop or just log the
      * message as a warning.
@@ -43,5 +43,32 @@
      */
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException;
+    
+    /**
+     * This method tells the enforcer if the rule results may be cached. If the result is true,
+     * the results will be remembered for future executions in the same build (ie children). Subsequent
+     * iterations of the rule will be queried to see if they are also cacheable. This will allow the rule to be
+     * uncached further down the tree if needed.
+     *        
+     * @return
+     */
+    public boolean isCacheable();
+    
+    /**
+     * 
+     * @param cachedRule the last cached instance of the rule. This is to be used by the rule to 
+     * potentially determine if the results are still valid (ie if the configuration has been overridden)
+     * @return true if the stored results are valid for the same id.
+     */
+    public boolean isResultValid(EnforcerRule cachedRule);
+    
+    /**
+     * If the rule is to be cached, this id is used as part of the key. This can allow rules to take parameters
+     * that allow multiple results of the same rule to be cached.
+     * @return id to be used by the enforcer to determine uniqueness of cache results. The ids only need to be unique 
+     * within a given rule implementation as the full key will be [classname]-[id]
+     */
+    public String getCacheId();
+    
 
 }

Modified: maven/enforcer/trunk/enforcer-rules/pom.xml
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/pom.xml?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/pom.xml (original)
+++ maven/enforcer/trunk/enforcer-rules/pom.xml Wed Nov  7 13:24:35 2007
@@ -34,13 +34,7 @@
 	<description>This component contains the standard Enforcer Rules</description>
 	<build>
 		<plugins>
-			<plugin>
-				<artifactId>maven-compiler-plugin</artifactId>
-				<configuration>
-					<source>1.4</source>
-					<target>1.4</target>
-				</configuration>
-			</plugin>
+
 			<plugin>
 				<groupId>org.codehaus.plexus</groupId>
 				<artifactId>plexus-maven-plugin</artifactId>
@@ -69,54 +63,44 @@
 			<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-artifact</artifactId>
-			<version>2.0.7</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-plugin-api</artifactId>
-			<version>2.0.7</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-project</artifactId>
-			<version>2.0.7</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-core</artifactId>
-			<version>2.0.7</version>
 		</dependency>
 		<dependency>
 			<groupId>org.codehaus.plexus</groupId>
 			<artifactId>plexus-utils</artifactId>
-			<version>1.4.5</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven.shared</groupId>
 			<artifactId>maven-plugin-testing-harness</artifactId>
 			<scope>test</scope>
-			<version>1.1</version>
 		</dependency>
         <dependency>
             <groupId>commons-lang</groupId>
             <artifactId>commons-lang</artifactId>
-			<version>2.3</version>
         </dependency>
        <dependency>
             <groupId>org.apache.maven.enforcer</groupId>
             <artifactId>enforcer-api</artifactId>
-			<version>1.0-alpha-3-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.beanshell</groupId>
             <artifactId>bsh</artifactId>
-			<version>2.0b4</version>
+	  <version>2.0b4</version>
         </dependency>
 		<dependency>
 			<groupId>junit</groupId>
-			<artifactId>junit</artifactId>
-			<version>3.8.1</version>
-			<scope>test</scope>
+	                    <artifactId>junit</artifactId>
 		</dependency>	
 	</dependencies>
 </project>

Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractBanDependencies.java Wed Nov  7 13:24:35 2007
@@ -151,4 +151,30 @@
     {
         this.searchTransitive = theSearchTransitive;
     }
+    
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        return "0";
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+     */
+    public boolean isCacheable ()
+    {
+        //dependencies change per project, therefore they must always be rerun.
+        return false;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     */
+    public boolean isResultValid ( EnforcerRule theCachedRule )
+    {
+        //dependencies change per project, therefore they must always be rerun.
+        return false;
+    }
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractVersionEnforcer.java Wed Nov  7 13:24:35 2007
@@ -24,6 +24,7 @@
 import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
 import org.apache.maven.artifact.versioning.Restriction;
 import org.apache.maven.artifact.versioning.VersionRange;
+import org.apache.maven.enforcer.rule.api.EnforcerRule;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.logging.Log;
@@ -160,6 +161,42 @@
         return matched;
     }
 
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        if (StringUtils.isNotEmpty( version ))
+        {
+            //return the hashcodes of the parameter that matters
+            return ""+version.hashCode();
+        }
+        else
+        {
+            return "0";
+        }
+
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+     */
+    public boolean isCacheable ()
+    {
+        //the maven version is not going to change between projects in the same build.
+        return true;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     */
+    public boolean isResultValid ( EnforcerRule theCachedRule )
+    {
+        //i will always return the hash of the parameters as my id. If my parameters are the same, this
+        //rule must always have the same result.
+        return true;
+    }
+    
     /**
      * @return the version
      */
@@ -176,4 +213,6 @@
     {
         this.version = theVersion;
     }
+    
+    
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/EvaluateBeanshell.java Wed Nov  7 13:24:35 2007
@@ -64,7 +64,7 @@
      * @parameter
      */
     public String message;
-
+    
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
     {
@@ -131,6 +131,30 @@
             log.warn( "Couldn't evaluate condition: " + script, ex );
         }
         return evaluation.booleanValue();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        return "" + this.condition.hashCode();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+     */
+    public boolean isCacheable ()
+    {
+        return false;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     */
+    public boolean isResultValid ( EnforcerRule theCachedRule )
+    {
+        return false;
     }
 
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireNoRepositories.java Wed Nov  7 13:24:35 2007
@@ -108,4 +108,28 @@
         }
         return badModels;
     }
+    
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        return "0";
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+     */
+    public boolean isCacheable ()
+    {
+        return false;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     */
+    public boolean isResultValid ( EnforcerRule theCachedRule )
+    {
+        return false;
+    }
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireOS.java Wed Nov  7 13:24:35 2007
@@ -93,27 +93,9 @@
      */
     public boolean display = false;
 
-    private Set validFamilies = null;
-
-    public static final String OS_NAME = System.getProperty( "os.name" ).toLowerCase( Locale.US );
-
-    public static final String OS_ARCH = System.getProperty( "os.arch" ).toLowerCase( Locale.US );
-
-    public static final String OS_VERSION = System.getProperty( "os.version" ).toLowerCase( Locale.US );
-
     public RequireOS()
     {
-        validFamilies = new HashSet();
-        validFamilies.add( "dos" );
-        validFamilies.add( "mac" );
-        validFamilies.add( "netware" );
-        validFamilies.add( "os/2" );
-        validFamilies.add( "tandem" );
-        validFamilies.add( "unix" );
-        validFamilies.add( "windows" );
-        validFamilies.add( "win9x" );
-        validFamilies.add( "z/os" );
-        validFamilies.add( "os/400" );
+
     }
 
     public void execute( EnforcerRuleHelper helper )
@@ -134,8 +116,8 @@
             {
                 if ( StringUtils.isEmpty( message ) )
                 {
-                    message = ( "OS Arch: " + RequireOS.OS_ARCH + " Family: " + determineOsFamily() + " Name: "
-                        + RequireOS.OS_NAME + " Version: " + RequireOS.OS_VERSION + " is not allowed by"
+                    message = ( "OS Arch: " + Os.OS_ARCH + " Family: " + Os.OS_FAMILY + " Name: "
+                        + Os.OS_NAME + " Version: " + Os.OS_VERSION + " is not allowed by"
                         + ( arch != null ? " Arch=" + arch : "" ) + ( family != null ? " Family=" + family : "" )
                         + ( name != null ? " Name=" + name : "" ) + ( version != null ? " Version=" + version : "" ) );
                 }
@@ -145,7 +127,7 @@
         else
         {
             StringBuffer buffer = new StringBuffer( 50 );
-            Iterator iter = validFamilies.iterator();
+            Iterator iter = Os.getValidFamilies().iterator();
             while ( iter.hasNext() )
             {
                 buffer.append( iter.next() );
@@ -163,8 +145,8 @@
      */
     public void displayOSInfo( Log log, boolean info )
     {
-        String string = "OS Info: Arch: " + RequireOS.OS_ARCH + " Family: " + determineOsFamily() + " Name: "
-            + RequireOS.OS_NAME + " Version: " + RequireOS.OS_VERSION;
+        String string = "OS Info: Arch: " + Os.OS_ARCH + " Family: " + Os.OS_FAMILY + " Name: "
+            + Os.OS_NAME + " Version: " + Os.OS_VERSION;
 
         if ( !info )
         {
@@ -176,24 +158,6 @@
         }
     }
 
-    /**
-     * Helper method to determine the current OS family.
-     * 
-     * @return name of current OS family.
-     */
-    public String determineOsFamily()
-    {
-        Iterator iter = getValidFamilies().iterator();
-        while ( iter.hasNext() )
-        {
-            String fam = (String) iter.next();
-            if ( Os.isFamily( fam ) )
-            {
-                return fam;
-            }
-        }
-        return null;
-    }
 
     /**
      * Helper method to determine if the current OS is
@@ -296,7 +260,7 @@
         // in case they are checking !family
         theFamily = StringUtils.stripStart( theFamily, "!" );
 
-        return ( StringUtils.isEmpty( theFamily ) || validFamilies.contains( theFamily ) );
+        return ( StringUtils.isEmpty( theFamily ) || Os.getValidFamilies().contains( theFamily ) );
     }
 
     /**
@@ -362,21 +326,49 @@
     {
         this.version = theVersion;
     }
+    
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        //return the hashcodes of all the parameters
+        StringBuffer b = new StringBuffer();
+        if (StringUtils.isNotEmpty( version ))
+        {
+            b.append( version.hashCode() );
+        }
+        if (StringUtils.isNotEmpty( name ))
+        {
+            b.append( name.hashCode() );
+        }
+        if (StringUtils.isNotEmpty( arch ))
+        {
+            b.append( arch.hashCode() );
+        }
+        if (StringUtils.isNotEmpty( family ))
+        {
+            b.append( family.hashCode() );
+        }
+        return b.toString();
+    }
 
-    /**
-     * @return the validFamilies
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
      */
-    public Set getValidFamilies()
+    public boolean isCacheable ()
     {
-        return this.validFamilies;
+        //the os is not going to change between projects in the same build.
+        return true;
     }
 
-    /**
-     * @param theValidFamilies the validFamilies to set
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
      */
-    public void setValidFamilies( Set theValidFamilies )
+    public boolean isResultValid ( EnforcerRule theCachedRule )
     {
-        this.validFamilies = theValidFamilies;
+        //i will always return the hash of the parameters as my id. If my parameters are the same, this
+        //rule must always have the same result.
+        return true;
     }
-
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequirePluginVersions.java Wed Nov  7 13:24:35 2007
@@ -648,4 +648,28 @@
     {
         this.utils = theUtils;
     }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        return "0";
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+     */
+    public boolean isCacheable ()
+    {
+        return false;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     */
+    public boolean isResultValid ( EnforcerRule theCachedRule )
+    {
+        return false;
+    }
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java Wed Nov  7 13:24:35 2007
@@ -23,6 +23,7 @@
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluationException;
+import org.codehaus.plexus.util.StringUtils;
 
 /**
  * This rule checks that certain properties are set.
@@ -98,6 +99,42 @@
     		}
     		throw new EnforcerRuleException(regexMessage);
     	}
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        //return the hashcodes of all the parameters
+        StringBuffer b = new StringBuffer();
+        if (StringUtils.isNotEmpty( property ))
+        {
+            b.append( property.hashCode() );
+        }
+        if (StringUtils.isNotEmpty( regex ))
+        {
+            b.append( regex.hashCode() );
+        }
+        return b.toString();
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+     */
+    public boolean isCacheable ()
+    {
+        // TODO Auto-generated method stub
+        return false;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     */
+    public boolean isResultValid ( EnforcerRule theCachedRule )
+    {
+        // TODO Auto-generated method stub
+        return false;
     }
 
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestMavenVersion.java Wed Nov  7 13:24:35 2007
@@ -62,4 +62,10 @@
         rule.execute( helper );
 
     }
+    
+    public void testId ()
+    {
+        RequireMavenVersion rule = new RequireMavenVersion();
+        rule.getCacheId();
+    }
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestNoSnapshots.java Wed Nov  7 13:24:35 2007
@@ -84,4 +84,10 @@
             helper.getLog().debug(e.getMessage());
         }
     }
+    
+    public void testId ()
+    {
+        NoSnapshots rule = new NoSnapshots();
+        rule.getCacheId();
+    }
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireJavaVersion.java Wed Nov  7 13:24:35 2007
@@ -85,4 +85,10 @@
         rule.execute( helper );
 
     }
+    
+    public void testId ()
+    {
+        RequireJavaVersion rule = new RequireJavaVersion();
+        rule.getCacheId();
+    }
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireOS.java Wed Nov  7 13:24:35 2007
@@ -44,22 +44,21 @@
         RequireOS rule = new RequireOS();
         rule.displayOSInfo( log, true );
 
-        Iterator iter = rule.getValidFamilies().iterator();
+        Iterator iter = Os.getValidFamilies().iterator();
         String validFamily = null;
         String invalidFamily = null;
-        while ( iter.hasNext() && ( validFamily == null || invalidFamily == null ) )
+        while ( iter.hasNext())
         {
             String fam = (String) iter.next();
-            if ( Os.isFamily( fam ) )
-            {
-                validFamily = fam;
-            }
-            else
+            if ( !Os.isFamily( fam ) )
             {
                 invalidFamily = fam;
+                break;
             }
         }
 
+        validFamily = Os.OS_FAMILY;
+        
         log.info( "Testing Mojo Using Valid Family: " + validFamily + " Invalid Family: " + invalidFamily );
 
         rule.setFamily( validFamily );
@@ -83,7 +82,7 @@
         }
 
         rule.setFamily( null );
-        rule.setArch( RequireOS.OS_ARCH );
+        rule.setArch( Os.OS_ARCH );
         assertTrue( rule.isAllowed() );
 
         rule.setArch( "somecrazyarch" );
@@ -94,7 +93,7 @@
 
         rule.setArch( null );
 
-        rule.setName( RequireOS.OS_NAME );
+        rule.setName( Os.OS_NAME );
         assertTrue( rule.isAllowed() );
 
         rule.setName( "somecrazyname" );
@@ -105,7 +104,7 @@
 
         rule.setName( null );
 
-        rule.setVersion( RequireOS.OS_VERSION );
+        rule.setVersion( Os.OS_VERSION );
         assertTrue( rule.isAllowed() );
 
         rule.setVersion( "somecrazyversion" );
@@ -113,6 +112,12 @@
 
         rule.setVersion( "!somecrazyversion" );
         assertTrue( rule.isAllowed() );
+    }
+    
+    public void testId ()
+    {
+        RequireOS rule = new RequireOS();
+        rule.getCacheId();
     }
 
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequirePluginVersions.java Wed Nov  7 13:24:35 2007
@@ -123,4 +123,10 @@
         // there should be 3
         assertEquals( 3, plugins.size() );
     }
+    
+    public void testId ()
+    {
+        RequirePluginVersions rule = new RequirePluginVersions();
+        rule.getCacheId();
+    }
 }

Modified: maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java (original)
+++ maven/enforcer/trunk/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireProperty.java Wed Nov  7 13:24:35 2007
@@ -28,13 +28,15 @@
  * @author Paul Gier
  * 
  */
-public class TestRequireProperty extends TestCase
+public class TestRequireProperty
+    extends TestCase
 {
-    public void testRule() throws EnforcerRuleException
+    public void testRule ()
+        throws EnforcerRuleException
     {
-    	MockProject project = new MockProject();
-    	project.setProperty("testProp", "This is a test.");
-        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(project);
+        MockProject project = new MockProject();
+        project.setProperty( "testProp", "This is a test." );
+        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
 
         RequireProperty rule = new RequireProperty();
         // this property should not be set
@@ -50,29 +52,32 @@
             // expected to catch this.
         }
 
-        // this property should be set by the surefire plugin
+        // this property should be set by the surefire
+        // plugin
         rule.property = "testProp";
-        try 
+        try
         {
-        	rule.execute( helper );
-        } 
+            rule.execute( helper );
+        }
         catch ( EnforcerRuleException e )
         {
-        	fail("This should not throw an exception");
+            fail( "This should not throw an exception" );
         }
     }
-    
-    public void testRuleWithRegex() throws EnforcerRuleException
+
+    public void testRuleWithRegex ()
+        throws EnforcerRuleException
     {
-    	MockProject project = new MockProject();
-    	project.setProperty("testProp", "This is a test.");
-        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper(project);
+        MockProject project = new MockProject();
+        project.setProperty( "testProp", "This is a test." );
+        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
 
         RequireProperty rule = new RequireProperty();
         rule.property = "testProp";
-        // This expression should not match the property value
+        // This expression should not match the property
+        // value
         rule.regex = "[^abc]";
-        
+
         try
         {
             rule.execute( helper );
@@ -85,13 +90,19 @@
 
         // this expr should match the property
         rule.regex = "[This].*[.]";
-        try 
+        try
         {
-        	rule.execute( helper );
-        } 
+            rule.execute( helper );
+        }
         catch ( EnforcerRuleException e )
         {
-        	fail("This should not throw an exception");
+            fail( "This should not throw an exception" );
         }
+    }
+
+    public void testId ()
+    {
+        RequireProperty rule = new RequireProperty();
+        rule.getCacheId();
     }
 }

Modified: maven/enforcer/trunk/maven-enforcer-plugin/pom.xml
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/pom.xml?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/maven-enforcer-plugin/pom.xml (original)
+++ maven/enforcer/trunk/maven-enforcer-plugin/pom.xml Wed Nov  7 13:24:35 2007
@@ -20,9 +20,9 @@
 -->
 	<modelVersion>4.0.0</modelVersion>
 	<parent>
-		<artifactId>maven-plugins</artifactId>
-		<groupId>org.apache.maven.plugins</groupId>
-		<version>8</version>
+	    <groupId>org.apache.maven.enforcer</groupId>
+              <artifactId>enforcer</artifactId>
+	    <version>1-SNAPSHOT</version>
 	</parent>
 	<groupId>org.apache.maven.plugins</groupId>
 	<artifactId>maven-enforcer-plugin</artifactId>
@@ -74,17 +74,7 @@
 				</executions>
 			</plugin>
 		</plugins>
-	    <pluginManagement>
-          <plugins>
-            <plugin>
-              <artifactId>maven-release-plugin</artifactId>
-              <configuration>
-                <tagBase>https://svn.apache.org/repos/asf/maven/enforcer/tags</tagBase>
-              </configuration>
-            </plugin>
-          </plugins>
-        </pluginManagement>
-		<resources>
+ 		<resources>
 			<!-- Include super-pom defined main/resources
 			Removing this section will break the build.
 			Since we have defined a new build/resources
@@ -97,63 +87,51 @@
 		</resources>
 	</build>
 	<dependencies>
-		<dependency>
-			<groupId>org.apache.maven</groupId>
-			<artifactId>maven-artifact</artifactId>
-			<version>2.0.7</version>
-		</dependency>
+	  <dependency>
+              <groupId>org.apache.maven</groupId>
+              <artifactId>maven-artifact</artifactId>
+	</dependency>
 		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-plugin-api</artifactId>
-			<version>2.0.7</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-project</artifactId>
-			<version>2.0.7</version>
 		</dependency>
 		<dependency>
 			<groupId>org.apache.maven</groupId>
 			<artifactId>maven-core</artifactId>
-			<version>2.0.7</version>
 		</dependency>
 		<dependency>
 			<groupId>org.codehaus.plexus</groupId>
 			<artifactId>plexus-utils</artifactId>
-			<version>1.4.6</version>
 		</dependency>
-        <dependency>
-            <groupId>commons-lang</groupId>
-            <artifactId>commons-lang</artifactId>
-			<version>2.3</version>
-        </dependency>
+                   <dependency>
+                      <groupId>commons-lang</groupId>
+                      <artifactId>commons-lang</artifactId>
+                   </dependency>
         <dependency>
             <groupId>org.apache.maven.enforcer</groupId>
             <artifactId>enforcer-api</artifactId>
-			<version>1.0-alpha-3-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven.enforcer</groupId>
             <artifactId>enforcer-rules</artifactId>
-			<version>1.0-SNAPSHOT</version>
         </dependency>
         <dependency>
             <groupId>org.apache.maven.enforcer</groupId>
             <artifactId>enforcer-rules</artifactId>
-            <version>1.0-SNAPSHOT</version>
             <classifier>tests</classifier>
-            <scope>test</scope>
         </dependency>
         <dependency>
             <groupId>org.beanshell</groupId>
             <artifactId>bsh</artifactId>
-			<version>2.0b4</version>
+           <version>2.0b4</version>
         </dependency>
-		<dependency>
-			<groupId>org.apache.maven.shared</groupId>
-			<artifactId>maven-plugin-testing-harness</artifactId>
-			<scope>test</scope>
-			<version>1.1</version>
-		</dependency>
-	</dependencies>
+        <dependency>
+          <groupId>org.apache.maven.shared</groupId>
+	<artifactId>maven-plugin-testing-harness</artifactId>
+        </dependency>
+     </dependencies>
 </project>

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=592902&r1=592901&r2=592902&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 Wed Nov  7 13:24:35 2007
@@ -20,6 +20,7 @@
  */
 
 import java.util.ArrayList;
+import java.util.Hashtable;
 import java.util.Iterator;
 
 import org.apache.maven.enforcer.rule.api.EnforcerRule;
@@ -33,12 +34,15 @@
 import org.apache.maven.project.path.PathTranslator;
 
 /**
- * This goal executes the defined enforcer-rules once per module.
+ * This goal executes the defined enforcer-rules once per
+ * module.
+ * 
  * @requiresDependencyResolution test
  * @goal enforce
  * @author <a href="mailto:brianf@apache.org">Brian Fox</a>
  * @phase validate
- * @version $Id$
+ * @version $Id: EnforceMojo.java 571676 2007-09-01
+ *          03:28:56Z brianf $
  */
 public class EnforceMojo
     extends AbstractMojo
@@ -70,26 +74,30 @@
     /**
      * Flag to fail the build if a version check fails.
      * 
-     * @parameter expression="${enforcer.fail}" default-value="true"
+     * @parameter expression="${enforcer.fail}"
+     *            default-value="true"
      */
     protected boolean fail = true;
 
     /**
      * Flag to easily skip all checks
      * 
-     * @parameter expression="${enforcer.skip}" default-value="false"
+     * @parameter expression="${enforcer.skip}"
+     *            default-value="false"
      */
     protected boolean skip = false;
 
     /**
      * Fail on the first rule that doesn't pass
      * 
-     * @parameter expression="${enforcer.failFast}" default-value="false"
+     * @parameter expression="${enforcer.failFast}"
+     *            default-value="false"
      */
     protected boolean failFast = false;
 
     /**
-     * List of objects that implement the EnforcerRule interface to execute.
+     * Array of objects that implement the EnforcerRule
+     * interface to execute.
      * 
      * @parameter
      * @required
@@ -97,14 +105,20 @@
     private EnforcerRule[] rules;
     
     /**
-     * True if dependencies are resolved
+     * 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 expression="${enforcer.ignoreCache}"
+     *  default-value="false"
      */
-    private boolean dependenciesAreResolved = false;
+     protected boolean ignoreCache = false;
+    
+    protected static Hashtable cache = new Hashtable();
 
     /**
      * Entry point to the mojo
      */
-    public void execute()
+    public void execute ()
         throws MojoExecutionException
     {
         Log log = this.getLog();
@@ -125,13 +139,14 @@
                 // create my helper
                 EnforcerRuleHelper helper = new DefaultEnforcementRuleHelper( session, evaluator, log );
 
-                // if we are only warning, then disable failFast
+                // if we are only warning, then disable
+                // failFast
                 if ( !fail )
                 {
                     failFast = false;
                 }
 
-                // go through each rul
+                // go through each rule
                 for ( int i = 0; i < rules.length; i++ )
                 {
 
@@ -139,17 +154,22 @@
                     EnforcerRule rule = rules[i];
                     if ( rule != null )
                     {
-                        // store the current rule for logging purposes
+                        // store the current rule for
+                        // logging purposes
                         currentRule = rule.getClass().getName();
                         log.debug( "Executing rule: " + currentRule );
                         try
                         {
-                            // execute the rule
-                            rules[i].execute( helper );
+                            if ( ignoreCache || shouldExecute( rule ) )
+                            {
+                                // execute the rule
+                                rules[i].execute( helper );
+                            }
                         }
                         catch ( EnforcerRuleException e )
                         {
-                            // i can throw an exception because failfast will be
+                            // i can throw an exception
+                            // because failfast will be
                             // false if fail is false.
                             if ( failFast )
                             {
@@ -175,7 +195,8 @@
                     }
                     if ( fail )
                     {
-                        throw new MojoExecutionException( "Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed." );
+                        throw new MojoExecutionException(
+                                                          "Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed." );
                     }
                 }
             }
@@ -192,18 +213,47 @@
     }
 
     /**
+     * This method determines if a rule should execute based
+     * on the cache
+     * 
+     * @param rule
+     * @return
+     */
+    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.info( "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()
+    public boolean isFail ()
     {
         return this.fail;
     }
 
     /**
-     * @param theFail
-     *            the fail to set
+     * @param theFail the fail to set
      */
-    public void setFail( boolean theFail )
+    public void setFail ( boolean theFail )
     {
         this.fail = theFail;
     }
@@ -211,16 +261,15 @@
     /**
      * @return the rules
      */
-    public EnforcerRule[] getRules()
+    public EnforcerRule[] getRules ()
     {
         return this.rules;
     }
 
     /**
-     * @param theRules
-     *            the rules to set
+     * @param theRules the rules to set
      */
-    public void setRules( EnforcerRule[] theRules )
+    public void setRules ( EnforcerRule[] theRules )
     {
         this.rules = theRules;
     }
@@ -228,16 +277,15 @@
     /**
      * @return the skip
      */
-    public boolean isSkip()
+    public boolean isSkip ()
     {
         return this.skip;
     }
 
     /**
-     * @param theSkip
-     *            the skip to set
+     * @param theSkip the skip to set
      */
-    public void setSkip( boolean theSkip )
+    public void setSkip ( boolean theSkip )
     {
         this.skip = theSkip;
     }
@@ -245,16 +293,15 @@
     /**
      * @return the failFast
      */
-    public boolean isFailFast()
+    public boolean isFailFast ()
     {
         return this.failFast;
     }
 
     /**
-     * @param theFailFast
-     *            the failFast to set
+     * @param theFailFast the failFast to set
      */
-    public void setFailFast( boolean theFailFast )
+    public void setFailFast ( boolean theFailFast )
     {
         this.failFast = theFailFast;
     }
@@ -262,16 +309,15 @@
     /**
      * @return the project
      */
-    public MavenProject getProject()
+    public MavenProject getProject ()
     {
         return this.project;
     }
 
     /**
-     * @param theProject
-     *            the project to set
+     * @param theProject the project to set
      */
-    public void setProject( MavenProject theProject )
+    public void setProject ( MavenProject theProject )
     {
         this.project = theProject;
     }
@@ -279,16 +325,15 @@
     /**
      * @return the session
      */
-    public MavenSession getSession()
+    public MavenSession getSession ()
     {
         return this.session;
     }
 
     /**
-     * @param theSession
-     *            the session to set
+     * @param theSession the session to set
      */
-    public void setSession( MavenSession theSession )
+    public void setSession ( MavenSession theSession )
     {
         this.session = theSession;
     }
@@ -296,33 +341,16 @@
     /**
      * @return the translator
      */
-    public PathTranslator getTranslator()
+    public PathTranslator getTranslator ()
     {
         return this.translator;
     }
 
     /**
-     * @param theTranslator
-     *            the translator to set
+     * @param theTranslator the translator to set
      */
-    public void setTranslator( PathTranslator theTranslator )
+    public void setTranslator ( PathTranslator theTranslator )
     {
         this.translator = theTranslator;
-    }
-
-    /**
-     * @return the dependenciesAreResolved
-     */
-    public boolean isDependenciesAreResolved ()
-    {
-        return this.dependenciesAreResolved;
-    }
-
-    /**
-     * @param theDependenciesAreResolved the dependenciesAreResolved to set
-     */
-    public void setDependenciesAreResolved ( boolean theDependenciesAreResolved )
-    {
-        this.dependenciesAreResolved = theDependenciesAreResolved;
     }
 }

Modified: maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java (original)
+++ maven/enforcer/trunk/maven-enforcer-plugin/src/main/java/org/apache/maven/plugins/enforcer/EnforceOnceMojo.java Wed Nov  7 13:24:35 2007
@@ -37,7 +37,7 @@
     public void execute()
         throws MojoExecutionException
     {
-        this.getLog().warn( "enforcer:enforce-once is deprecated. Use enforcer:enforce instead. See MENFORCER-11 for more information." );
+        this.getLog().warn( "enforcer:enforce-once is deprecated. Use enforcer:enforce instead. See MENFORCER-11/MENFORCER-12 for more information." );
         super.execute();
     }
 }

Modified: maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/MockEnforcerRule.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/MockEnforcerRule.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/MockEnforcerRule.java (original)
+++ maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/MockEnforcerRule.java Wed Nov  7 13:24:35 2007
@@ -32,15 +32,31 @@
 {
 
     public boolean failRule = false;
+    
+    public String cacheId="";
+    
+    public boolean isCacheable = false;
+    
+    public boolean isResultValid = false;
+    
+    public boolean executed = false;
 
     public MockEnforcerRule( boolean fail )
     {
         this.failRule = fail;
     }
 
+    public MockEnforcerRule( boolean fail, String cacheId, boolean isCacheable, boolean isResultValid )
+    {
+        this.failRule = fail;
+        this.isCacheable = isCacheable;
+        this.isResultValid= isResultValid;
+        this.cacheId = cacheId;
+    }
     public void execute( EnforcerRuleHelper helper )
         throws EnforcerRuleException
     {
+        executed = true;
         if ( isFailRule() )
         {
             throw new EnforcerRuleException( " this condition is not allowed." );
@@ -62,6 +78,62 @@
     public void setFailRule( boolean theFailRule )
     {
         this.failRule = theFailRule;
+    }
+
+    /**
+     * @return the isResultValid
+     */
+    public boolean isResultValid ()
+    {
+        return this.isResultValid;
+    }
+
+    /**
+     * @param theIsResultValid the isResultValid to set
+     */
+    public void setResultValid ( boolean theIsResultValid )
+    {
+        this.isResultValid = theIsResultValid;
+    }
+
+    /**
+     * @param theCacheId the cacheId to set
+     */
+    public void setCacheId ( String theCacheId )
+    {
+        this.cacheId = theCacheId;
+    }
+
+    /**
+     * @param theIsCacheable the isCacheable to set
+     */
+    public void setCacheable ( boolean theIsCacheable )
+    {
+        this.isCacheable = theIsCacheable;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#getCacheId()
+     */
+    public String getCacheId ()
+    {
+        return cacheId;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isCacheable()
+     */
+    public boolean isCacheable ()
+    {
+        return isCacheable;
+    }
+
+    /* (non-Javadoc)
+     * @see org.apache.maven.enforcer.rule.api.EnforcerRule#isResultValid(org.apache.maven.enforcer.rule.api.EnforcerRule)
+     */
+    public boolean isResultValid ( EnforcerRule theCachedRule )
+    {
+        return isResultValid;
     }
 
 }

Modified: maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java (original)
+++ maven/enforcer/trunk/maven-enforcer-plugin/src/test/java/org/apache/maven/plugins/enforcer/TestEnforceMojo.java Wed Nov  7 13:24:35 2007
@@ -34,7 +34,7 @@
     extends TestCase
 {
 
-    public void testEnforceMojo()
+    public void testEnforceMojo ()
         throws MojoExecutionException
     {
         EnforceMojo mojo = new EnforceMojo();
@@ -87,5 +87,152 @@
         ( (MockEnforcerRule) rules[1] ).setFailRule( false );
         mojo.execute();
 
+    }
+
+    public void testCaching () throws MojoExecutionException
+    {
+        EnforceMojo mojo = new EnforceMojo();
+        mojo.setFail( true );
+        mojo.setSession( EnforcerTestUtils.getMavenSession() );
+        mojo.setProject( new MockProject() );
+
+        MockEnforcerRule[] rules = new MockEnforcerRule[10];
+        
+        //check that basic caching works.
+        rules[0] = new MockEnforcerRule( false, "", true, true );
+        rules[1] = new MockEnforcerRule( false, "", true, true );
+        mojo.setRules( rules );
+
+        EnforceMojo.cache.clear();
+        mojo.execute();
+        
+        assertTrue( "Expected this rule to be executed.",rules[0].executed );
+        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
+        
+        //check that skip caching works.
+        rules[0] = new MockEnforcerRule( false, "", true, true );
+        rules[1] = new MockEnforcerRule( false, "", true, true );
+        mojo.setRules( rules );
+
+        EnforceMojo.cache.clear();
+        mojo.ignoreCache = true;
+        mojo.execute();
+        
+        assertTrue( "Expected this rule to be executed.",rules[0].executed );
+        assertTrue( "Expected this rule to be executed.",rules[1].executed );
+        
+        mojo.ignoreCache = false;
+        
+        //check that different ids are compared.
+        rules[0] = new MockEnforcerRule( false, "1", true, true );
+        rules[1] = new MockEnforcerRule( false, "2", true, true );
+        rules[2] = new MockEnforcerRule( false, "2", true, true );
+        mojo.setRules( rules );
+
+        EnforceMojo.cache.clear();
+        mojo.execute();
+        
+        assertTrue( "Expected this rule to be executed.",rules[0].executed );
+        assertTrue( "Expected this rule to be executed.",rules[1].executed);
+        assertFalse( "Expected this rule not to be executed.",rules[2].executed);
+        
+        //check that future overrides are working
+        rules[0] = new MockEnforcerRule( false, "1", true, true );
+        rules[1] = new MockEnforcerRule( false, "1", false, true );
+        rules[2] = null;
+        mojo.setRules( rules );
+
+        EnforceMojo.cache.clear();
+        mojo.execute();
+        
+        assertTrue( "Expected this rule to be executed.",rules[0].executed );
+        assertTrue( "Expected this rule to be executed.",rules[1].executed);
+
+        //check that future isResultValid is used
+        rules[0] = new MockEnforcerRule( false, "1", true, true );
+        rules[1] = new MockEnforcerRule( false, "1", true, false );
+        rules[2] = null;
+        mojo.setRules( rules );
+
+        EnforceMojo.cache.clear();
+        mojo.execute();
+        
+        assertTrue( "Expected this rule to be executed.",rules[0].executed );
+        assertTrue( "Expected this rule to be executed.",rules[1].executed);
+
+    }
+    
+    public void testCachePersistence1() throws MojoExecutionException
+    {
+        EnforceMojo mojo = new EnforceMojo();
+        mojo.setFail( true );
+        mojo.setSession( EnforcerTestUtils.getMavenSession() );
+        mojo.setProject( new MockProject() );
+
+        MockEnforcerRule[] rules = new MockEnforcerRule[10];
+        
+        //check that basic caching works.
+        rules[0] = new MockEnforcerRule( false, "", true, true );
+        rules[1] = new MockEnforcerRule( false, "", true, true );
+        mojo.setRules( rules );
+
+        EnforceMojo.cache.clear();
+        mojo.execute();
+        
+        assertTrue( "Expected this rule to be executed.",rules[0].executed );
+        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
+        
+    }
+    
+    public void testCachePersistence2() throws MojoExecutionException
+    {
+        EnforceMojo mojo = new EnforceMojo();
+        mojo.setFail( true );
+        mojo.setSession( EnforcerTestUtils.getMavenSession() );
+        mojo.setProject( new MockProject() );
+
+        MockEnforcerRule[] rules = new MockEnforcerRule[10];
+        
+        //check that basic caching works.
+        rules[0] = new MockEnforcerRule( false, "", true, true );
+        rules[1] = new MockEnforcerRule( false, "", true, true );
+        mojo.setRules( rules );
+
+        mojo.execute();
+        
+        assertFalse( "Expected this rule not to be executed.",rules[0].executed);
+        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
+        
+    }
+    
+    public void testCachePersistence3() throws MojoExecutionException
+    {
+        System.gc();
+        
+        try
+        {
+            Thread.sleep( 1000 );
+        }
+        catch ( InterruptedException e )
+        {
+        }
+        
+        EnforceMojo mojo = new EnforceMojo();
+        mojo.setFail( true );
+        mojo.setSession( EnforcerTestUtils.getMavenSession() );
+        mojo.setProject( new MockProject() );
+
+        MockEnforcerRule[] rules = new MockEnforcerRule[10];
+        
+        //check that basic caching works.
+        rules[0] = new MockEnforcerRule( false, "", true, true );
+        rules[1] = new MockEnforcerRule( false, "", true, true );
+        mojo.setRules( rules );
+
+        mojo.execute();
+        
+        assertFalse( "Expected this rule not to be executed.",rules[0].executed);
+        assertFalse( "Expected this rule not to be executed.",rules[1].executed);
+        
     }
 }

Modified: maven/enforcer/trunk/pom.xml
URL: http://svn.apache.org/viewvc/maven/enforcer/trunk/pom.xml?rev=592902&r1=592901&r2=592902&view=diff
==============================================================================
--- maven/enforcer/trunk/pom.xml (original)
+++ maven/enforcer/trunk/pom.xml Wed Nov  7 13:24:35 2007
@@ -123,15 +123,47 @@
 	  </resource>
     </resources>
     <pluginManagement>
-       <plugins>
-        <plugin>
-          <artifactId>maven-release-plugin</artifactId>
-          <configuration>
-            <tagBase>https://svn.apache.org/repos/asf/maven/enforcer/tags</tagBase>
-          </configuration>
-        </plugin>
-      </plugins>
-    </pluginManagement>
+    <plugins>
+      <plugin>    
+        <artifactId>maven-install-plugin</artifactId>
+        <version>2.2</version>
+      </plugin>
+      <plugin>    
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>2.0.2</version>
+		<configuration>
+          <source>1.4</source>
+          <target>1.4</target>
+        </configuration>
+      </plugin>
+      <plugin>    
+        <artifactId>maven-deploy-plugin</artifactId>
+        <version>2.3</version>
+      </plugin>
+      <plugin>    
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.1</version>
+      </plugin>
+      <plugin>    
+        <artifactId>maven-surefire-plugin</artifactId>
+        <version>2.3</version>
+      </plugin>
+      <plugin>    
+        <artifactId>maven-plugin-plugin</artifactId>
+        <version>2.3</version>
+      </plugin>
+      <plugin>    
+        <artifactId>maven-resources-plugin</artifactId>
+        <version>2.2</version>
+      </plugin>
+      <plugin>
+        <artifactId>maven-release-plugin</artifactId>
+        <configuration>
+          <tagBase>https://svn.apache.org/repos/asf/maven/enforcer/tags</tagBase>
+        </configuration>
+      </plugin>
+    </plugins>
+  </pluginManagement>
   </build>
     <distributionManagement>
     <site>
@@ -150,6 +182,69 @@
     </repository>
   </repositories>
   
+  	<dependencyManagement>
+	  <dependencies>
+	  	<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-artifact</artifactId>
+			<version>2.0.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-plugin-api</artifactId>
+			<version>2.0.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-project</artifactId>
+			<version>2.0.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-core</artifactId>
+			<version>2.0.7</version>
+		</dependency>
+		<dependency>
+			<groupId>org.codehaus.plexus</groupId>
+			<artifactId>plexus-utils</artifactId>
+			<version>1.4.6</version>
+		</dependency>
+	    <dependency>
+		  <groupId>junit</groupId>
+		  <artifactId>junit</artifactId>
+		  <version>4.4</version>
+		  <scope>test</scope>
+		</dependency>
+        <dependency>
+          <groupId>commons-lang</groupId>
+          <artifactId>commons-lang</artifactId>
+          <version>2.3</version>
+        </dependency>
+       <dependency>
+            <groupId>org.apache.maven.enforcer</groupId>
+            <artifactId>enforcer-api</artifactId>
+			<version>1.0-alpha-3-SNAPSHOT</version>
+        </dependency>	
+        <dependency>
+            <groupId>org.apache.maven.enforcer</groupId>
+            <artifactId>enforcer-rules</artifactId>
+			<version>1.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.maven.enforcer</groupId>
+            <artifactId>enforcer-rules</artifactId>
+            <version>1.0-SNAPSHOT</version>
+            <classifier>tests</classifier>
+            <scope>test</scope>
+        </dependency>	
+		<dependency>
+			<groupId>org.apache.maven.shared</groupId>
+			<artifactId>maven-plugin-testing-harness</artifactId>
+			<scope>test</scope>
+			<version>1.1</version>
+		</dependency>		
+	  </dependencies>
+	</dependencyManagement>
     <modules>
 	    <module>enforcer-api</module>
 		<module>enforcer-rules</module>