~~ 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 Environment Variable
  ------
  Karl-Heinz Marbaise
  ------
  2014-01-07
  ------

Require Environment Variable

  This rule checks that a specified environment variable is set.

  The following parameters are supported by this rule:
   
  * <<message>> - an optional message to the user if the rule fails.
   
  * <<variableName>> - The name of the environment variable to be checked for.

  * <<regex>> - an optional regular expression used to check the value of the property.

  * <<regexMessage>> - an optional message to the user if the regex check fails.

  []

  The regex is applied to the entire value of the environment variable (i.e. using the regex "match" method),
  and not just a substring of the environment variable value.

  Sample Plugin Configuration:
  
+---+
<project>
  [...]
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-enforcer-plugin</artifactId>
        <version>${project.version}</version>
        <executions>
          <execution>
            <id>enforce-environment-variable-is-set</id>
            <goals>
              <goal>enforce</goal>
            </goals>
            <configuration>
              <rules>
                <requireEnvironmentVariable>
                  <variableName>the_name_you_wish_to_be_checked</variableName>
                </requireEnvironmentVariable>
              </rules>
              <fail>true</fail>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  [...]
</project>
+---+
