Uploaded image for project: 'Maven Enforcer Plugin'
  1. Maven Enforcer Plugin
  2. MENFORCER-136

New enforcer for environment variables

    XMLWordPrintableJSON

Details

    • New Feature
    • Status: Closed
    • Major
    • Resolution: Fixed
    • None
    • 1.2
    • Standard Rules
    • None
    • Patch

    Description

      I made this rule for my project, but I think it would be a nice inclusion from the project.

      This is particularly useful when running integration tests that needs application server, like when using arquillian + jboss (http://arquillian.org/guides/getting_started/#test_across_containers)

      Index: enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractPropertyEnforcerRule.java
      ===================================================================
      --- enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractPropertyEnforcerRule.java	(revision 0)
      +++ enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/AbstractPropertyEnforcerRule.java	(revision 0)
      @@ -0,0 +1,82 @@
      +package org.apache.maven.plugins.enforcer;
      +
      +import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
      +import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
      +
      +/**
      + * Abstract enforcer rule that give a foundation to validate properties from multiple sources.
      + * 
      + * @author Paul Gier
      + * @author <a href='mailto:marvin[at]marvinformatics[dot]com'>Marvin Froeder</a>
      + * @version $Id: AbstractPropertyEnforcerRule.java $
      + */
      +public abstract class AbstractPropertyEnforcerRule
      +    extends AbstractNonCacheableEnforcerRule
      +{
      +
      +    /**
      +     * Match the property value to a given regular expression. Defaults to <code>null</code> (any value is ok).
      +     */
      +    public String regex = null;
      +
      +    /** Specify a warning message if the regular expression is not matched. */
      +    public String regexMessage = null;
      +
      +    public AbstractPropertyEnforcerRule()
      +    {
      +        super();
      +    }
      +
      +    /**
      +     * Execute the rule.
      +     * 
      +     * @param helper the helper
      +     * @throws EnforcerRuleException the enforcer rule exception
      +     */
      +    public void execute( EnforcerRuleHelper helper )
      +        throws EnforcerRuleException
      +    {
      +        Object propValue = resolveValue( helper );
      +
      +        // Check that the property is not null or empty string
      +        if ( propValue == null )
      +        {
      +            if ( message == null )
      +            {
      +                message = getName() + " \"" + getPropertyName() + "\" is required for this build.";
      +            }
      +            throw new EnforcerRuleException( message );
      +        }
      +        // If there is a regex, check that the property matches it
      +        if ( regex != null && !propValue.toString().matches( regex ) )
      +        {
      +            if ( regexMessage == null )
      +            {
      +                regexMessage =
      +                    getName() + " \"" + getPropertyName() + "\" evaluates to \"" + propValue + "\".  "
      +                        + "This does not match the regular expression \"" + regex + "\"";
      +            }
      +            throw new EnforcerRuleException( regexMessage );
      +        }
      +    }
      +
      +    /**
      +     * How the property that is being evaluated is called
      +     */
      +    public abstract String getName();
      +
      +    /**
      +     * The name of the property currently being evaluated, this is used for default message pourpouses only
      +     */
      +    public abstract String getPropertyName();
      +
      +    /**
      +     * Resolves the property value
      +     * 
      +     * @param helper
      +     * @throws EnforcerRuleException
      +     */
      +    public abstract Object resolveValue( EnforcerRuleHelper helper )
      +        throws EnforcerRuleException;
      +
      +}
      \ No newline at end of file
      Index: enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireEnvironmentVariable.java
      ===================================================================
      --- enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireEnvironmentVariable.java	(revision 0)
      +++ enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireEnvironmentVariable.java	(revision 0)
      @@ -0,0 +1,73 @@
      +package org.apache.maven.plugins.enforcer;
      +
      +/*
      + * 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.
      + */
      +
      +import org.apache.maven.enforcer.rule.api.EnforcerRule;
      +import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
      +
      +/**
      + * This rule checks that certain environment variable is set.
      + * 
      + * @author <a href='mailto:marvin[at]marvinformatics[dot]com'>Marvin Froeder</a>
      + */
      +public class RequireEnvironmentVariable
      +    extends AbstractPropertyEnforcerRule
      +{
      +
      +    /** Specify the required variable. */
      +    public String variableName = null;
      +
      +    @Override
      +    public String resolveValue( EnforcerRuleHelper helper )
      +    {
      +        String envValue = System.getenv( variableName );
      +        return envValue;
      +    }
      +
      +    public boolean isCacheable()
      +    {
      +        // environment variables won't change while maven is on the run
      +        return true;
      +    }
      +
      +    public boolean isResultValid( EnforcerRule cachedRule )
      +    {
      +        // this rule shall always have the same result, since environment
      +        // variables are set before maven is launched
      +        return true;
      +    }
      +
      +    public String getCacheId()
      +    {
      +        return variableName;
      +    }
      +
      +    @Override
      +    public String getPropertyName()
      +    {
      +        return variableName;
      +    }
      +
      +    @Override
      +    public String getName()
      +    {
      +        return "Environment variable";
      +    }
      +}
      Index: enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java
      ===================================================================
      --- enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java	(revision 1362071)
      +++ enforcer-rules/src/main/java/org/apache/maven/plugins/enforcer/RequireProperty.java	(working copy)
      @@ -25,29 +25,18 @@
       
       /**
        * This rule checks that certain properties are set.
      - *
      + * 
        * @author Paul Gier
        */
       public class RequireProperty
      -    extends AbstractNonCacheableEnforcerRule
      +    extends AbstractPropertyEnforcerRule
       {
       
           /** Specify the required property. */
           public String property = null;
       
      -    /** Match the property value to a given regular expression. Defaults to <code>null</code> (any value is ok). */
      -    public String regex = null;
      -
      -    /** Specify a warning message if the regular expression is not matched. */
      -    public String regexMessage = null;
      -
      -    /**
      -     * Execute the rule.
      -     *
      -     * @param helper the helper
      -     * @throws EnforcerRuleException the enforcer rule exception
      -     */
      -    public void execute( EnforcerRuleHelper helper )
      +    @Override
      +    public Object resolveValue( EnforcerRuleHelper helper )
               throws EnforcerRuleException
           {
               Object propValue = null;
      @@ -59,26 +48,23 @@
               {
                   throw new EnforcerRuleException( "Unable to evaluate property: " + property, eee );
               }
      +        return propValue;
      +    }
       
      -        // Check that the property is not null or empty string
      -        if ( propValue == null )
      -        {
      -            if ( message == null )
      -            {
      -                message = "Property \"" + property + "\" is required for this build.";
      -            }
      -            throw new EnforcerRuleException( message );
      -        }
      -        // If there is a regex, check that the property matches it
      -        if ( regex != null && !propValue.toString().matches( regex ) )
      -        {
      -            if ( regexMessage == null )
      -            {
      -                regexMessage =
      -                    "Property \"" + property + "\" evaluates to \"" + propValue + "\".  " +
      -                        "This does not match the regular expression \"" + regex + "\"";
      -            }
      -            throw new EnforcerRuleException( regexMessage );
      -        }
      +    protected String resolveValue()
      +    {
      +        return null;
           }
      +
      +    @Override
      +    public String getPropertyName()
      +    {
      +        return property;
      +    }
      +
      +    @Override
      +    public String getName()
      +    {
      +        return "Property";
      +    }
       }
      Index: enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireEnvironmentVariable.java
      ===================================================================
      --- enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireEnvironmentVariable.java	(revision 0)
      +++ enforcer-rules/src/test/java/org/apache/maven/plugins/enforcer/TestRequireEnvironmentVariable.java	(revision 0)
      @@ -0,0 +1,112 @@
      +package org.apache.maven.plugins.enforcer;
      +
      +/*
      + * 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.
      + */
      +
      +import junit.framework.TestCase;
      +
      +import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
      +import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
      +
      +/**
      + * Unit test for {@link RequireEnvironmentVariable}}
      + *
      + * @author <a href='mailto:marvin[at]marvinformatics[dot]com'>Marvin Froeder</a>
      + */
      +public class TestRequireEnvironmentVariable
      +    extends TestCase
      +{
      +
      +    /**
      +     * Test rule.
      +     *
      +     * @throws EnforcerRuleException the enforcer rule exception
      +     */
      +    public void testRule()
      +        throws EnforcerRuleException
      +    {
      +        MockProject project = new MockProject();
      +        project.setProperty( "testProp", "This is a test." );
      +        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper( project );
      +
      +        RequireEnvironmentVariable rule = new RequireEnvironmentVariable();
      +        // this env variable should not be set
      +        rule.variableName = "JUNK";
      +
      +        try
      +        {
      +            rule.execute( helper );
      +            fail( "Expected an exception." );
      +        }
      +        catch ( EnforcerRuleException e )
      +        {
      +            // expected to catch this.
      +        }
      +
      +        // PATH shall be common to windows and linux
      +        rule.variableName = "PATH";
      +        try
      +        {
      +            rule.execute( helper );
      +        }
      +        catch ( EnforcerRuleException e )
      +        {
      +            fail( "This should not throw an exception" );
      +        }
      +    }
      +
      +    /**
      +     * Test rule with regex.
      +     *
      +     * @throws EnforcerRuleException the enforcer rule exception
      +     */
      +    public void testRuleWithRegex()
      +        throws EnforcerRuleException
      +    {
      +        EnforcerRuleHelper helper = EnforcerTestUtils.getHelper();
      +
      +        RequireEnvironmentVariable rule = new RequireEnvironmentVariable();
      +        rule.variableName = "PATH";
      +        // This expression should not match the property
      +        // value
      +        rule.regex = "[^abc]";
      +
      +        try
      +        {
      +            rule.execute( helper );
      +            fail( "Expected an exception." );
      +        }
      +        catch ( EnforcerRuleException e )
      +        {
      +            // expected to catch this.
      +        }
      +
      +        // can't really predict what a PATH will looks like, just enforce it ain't empty
      +        rule.regex = ".{1,}";
      +        try
      +        {
      +            rule.execute( helper );
      +        }
      +        catch ( EnforcerRuleException e )
      +        {
      +            fail( "This should not throw an exception" );
      +        }
      +    }
      +
      +}
      Index: pom.xml
      ===================================================================
      --- pom.xml	(revision 1362071)
      +++ pom.xml	(working copy)
      @@ -48,6 +48,13 @@
           </developer>
         </developers>
       
      +  <contributors>
      +    <contributor>
      +      <name>Marvin Froeder</name>
      +      <email>marvin@marvinformatics.com</email>
      +    </contributor>
      +  </contributors>
      +
         <mailingLists>
           <mailingList>
             <name>Maven User List</name>
      @@ -262,6 +269,33 @@
                   <tagBase>https://svn.apache.org/repos/asf/maven/enforcer/tags</tagBase>
                 </configuration>
               </plugin>
      +        <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
      +        <plugin>
      +        	<groupId>org.eclipse.m2e</groupId>
      +        	<artifactId>lifecycle-mapping</artifactId>
      +        	<version>1.0.0</version>
      +        	<configuration>
      +        		<lifecycleMappingMetadata>
      +        			<pluginExecutions>
      +        				<pluginExecution>
      +        					<pluginExecutionFilter>
      +        						<groupId>org.codehaus.plexus</groupId>
      +        						<artifactId>
      +        							plexus-maven-plugin
      +        						</artifactId>
      +        						<versionRange>[1.3.8,)</versionRange>
      +        						<goals>
      +        							<goal>descriptor</goal>
      +        						</goals>
      +        					</pluginExecutionFilter>
      +        					<action>
      +        						<ignore></ignore>
      +        					</action>
      +        				</pluginExecution>
      +        			</pluginExecutions>
      +        		</lifecycleMappingMetadata>
      +        	</configuration>
      +        </plugin>
             </plugins>
           </pluginManagement>
         </build>
      

      Attachments

        Activity

          People

            olamy Olivier Lamy
            velo velo
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: