[MENFORCER-430] Allow one of many files in RequireFiles rules to pass
diff --git a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java
index 6b1de74..0d40987 100644
--- a/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java
+++ b/enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractRequireFiles.java
@@ -42,6 +42,9 @@
     /** if null file handles should be allowed. If they are allowed, it means treat it as a success. */
     private boolean allowNulls = false;
 
+    /** Allow that a single one of the files can make the rule to pass. */
+    private boolean satisfyAny;
+
     // check the file for the specific condition
     /**
      * Check one file.
@@ -82,32 +85,46 @@
             }
         }
 
-        // if anything was found, log it with the optional message.
-        if ( !failures.isEmpty() )
+        if ( satisfyAny )
         {
-            String message = getMessage();
-            
-            StringBuilder buf = new StringBuilder();
-            if ( message != null )
+            int passed = files.length - failures.size();
+            if ( passed == 0 )
             {
-                buf.append( message + System.lineSeparator() );
+                fail( failures );
             }
-            buf.append( getErrorMsg() );
-
-            for ( File file : failures )
-            {
-                if ( file != null )
-                {
-                    buf.append( file.getAbsolutePath() + System.lineSeparator() );
-                }
-                else
-                {
-                    buf.append( "(an empty filename was given and allowNulls is false)" + System.lineSeparator() );
-                }
-            }
-
-            throw new EnforcerRuleException( buf.toString() );
         }
+        // if anything was found, log it with the optional message.
+        else if ( !failures.isEmpty() )
+        {
+            fail( failures );
+        }
+    }
+
+    private void fail( List<File> failures )
+            throws EnforcerRuleException
+    {
+        String message = getMessage();
+
+        StringBuilder buf = new StringBuilder();
+        if ( message != null )
+        {
+            buf.append( message + System.lineSeparator() );
+        }
+        buf.append( getErrorMsg() );
+
+        for ( File file : failures )
+        {
+            if ( file != null )
+            {
+                buf.append( file.getAbsolutePath() + System.lineSeparator() );
+            }
+            else
+            {
+                buf.append( "(an empty filename was given and allowNulls is false)" + System.lineSeparator() );
+            }
+        }
+
+        throw new EnforcerRuleException( buf.toString() );
     }
 
     @Override
@@ -168,4 +185,14 @@
     {
         this.allowNulls = allowNulls;
     }
+
+    public boolean isSatisfyAny()
+    {
+        return satisfyAny;
+    }
+
+    public void setSatisfyAny( boolean satisfyAny )
+    {
+        this.satisfyAny = satisfyAny;
+    }
 }
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java
index 3ddd941..2cbe663 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesDontExist.java
@@ -136,6 +136,34 @@
         rule.execute( EnforcerTestUtils.getHelper() );

     }

 

+    @Test

+    public void testFileDoesNotExistSatisfyAny()

+            throws IOException

+    {

+        File f = File.createTempFile( "junit", null, temporaryFolder );

+        f.delete();

+

+        assertFalse( f.exists() );

+

+        File g = File.createTempFile( "junit", null, temporaryFolder );

+

+        assertTrue( g.exists() );

+

+        rule.setFiles( new File[] { f, g.getCanonicalFile() } );

+        rule.setSatisfyAny(true);

+

+        try

+        {

+            rule.execute( EnforcerTestUtils.getHelper() );

+        }

+        catch ( EnforcerRuleException e )

+        {

+            fail( "Unexpected Exception:" + e.getLocalizedMessage() );

+        }

+

+        g.delete();

+    }

+

     /**

      * Test id.

      */

diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java
index 3a35a73..91a386b 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesExist.java
@@ -22,6 +22,7 @@
 import static org.junit.jupiter.api.Assertions.*;
 
 import java.io.File;
+import java.io.IOException;
 
 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
 import org.junit.jupiter.api.Test;
@@ -121,6 +122,34 @@
 
     }
 
+    @Test
+    public void testFileExistsSatisfyAny()
+            throws IOException
+    {
+        File f = File.createTempFile( "junit", null, temporaryFolder );
+        f.delete();
+
+        assertFalse( f.exists() );
+
+        File g = File.createTempFile( "junit", null, temporaryFolder );
+
+        assertTrue( g.exists() );
+
+        rule.setFiles( new File[] { f, g.getCanonicalFile() } );
+        rule.setSatisfyAny(true);
+
+        try
+        {
+            rule.execute( EnforcerTestUtils.getHelper() );
+        }
+        catch ( EnforcerRuleException e )
+        {
+            fail( "Unexpected Exception:" + e.getLocalizedMessage() );
+        }
+
+        g.delete();
+    }
+
     /**
      * Test id.
      */
diff --git a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java
index 83e9184..a19383e 100644
--- a/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java
+++ b/enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireFilesSize.java
@@ -165,6 +165,33 @@
         }

     }

 

+    @Test

+    public void testRequireFilesSizeSatisfyAny()

+            throws IOException

+    {

+        File f = File.createTempFile( "junit", null, temporaryFolder );

+        try ( BufferedWriter out = new BufferedWriter( new FileWriter( f ) ) )

+        {

+            out.write( "123456789101112131415" );

+        }

+        assertTrue( f.length() > 10 );

+

+        File g = File.createTempFile( "junit", null, temporaryFolder );

+

+        rule.setFiles( new File[] { f, g } );

+        rule.setMaxsize( 10 );

+        rule.setSatisfyAny(true);

+

+        try

+        {

+            rule.execute( EnforcerTestUtils.getHelper() );

+        }

+        catch ( EnforcerRuleException e )

+        {

+            fail( "Unexpected Exception:" + e.getLocalizedMessage() );

+        }

+    }

+

     /**

      * Test id.

      */