~~ Licensed to the Apache Software Foundation (ASF) under one
~~ or more contributor license agreements.  See the NOTICE file
~~ distributed with this work for additional information
~~ regarding copyright ownership.  The ASF licenses this file
~~ to you under the Apache License, Version 2.0 (the
~~ "License"); you may not use this file except in compliance
~~ with the License.  You may obtain a copy of the License at
~~
~~ http://www.apache.org/licenses/LICENSE-2.0
~~
~~ Unless required by applicable law or agreed to in writing,
~~ software distributed under the License is distributed on an
~~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
~~ KIND, either express or implied.  See the License for the
~~ specific language governing permissions and limitations
~~ under the License.    
 
  ------
  Require File Size
  ------
  Brian Fox
  ------
  August 2008
  ------

Require File Size

  This rule checks that the specified list of files exist and are within the specified size range.


   The following parameters are supported by this rule:
   
   * message - an optional message to the user if the rule fails.
   * files - A list of files to check. If this list is empty, the main project artifact will be checked.
   * maxsize - maximum size in bytes for this file
   * minsize - minimum size in bytes for this file
   * allowNulls - If null files should be allowed. If allowed, they will be treated as if they do exist. Default is false.
   []

   
  Sample Plugin Configuration:
  
+---+
<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>1.0</version>
        <executions>
          <execution>
            <id>enforce-file-size</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireFilesSize>
                  <maxSize>10000</maxSize>
                  <minSize>90</minsize>
                  <files>
                   <file>${project.outputDirectory}/foo.txt</file>
                   <file>${project.outputDirectory}/foo2.txt</file>
                  </files>
                </requireFilesSize>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
+---+
