Coverage Report - org.apache.maven.plugin.invoker.InvokerProperties
 
Classes in this File Line Coverage Branch Coverage Complexity
InvokerProperties
76%
38/50
84%
27/32
2.167
 
 1  
 package org.apache.maven.plugin.invoker;
 2  
 
 3  
 /*
 4  
  * Licensed to the Apache Software Foundation (ASF) under one
 5  
  * or more contributor license agreements.  See the NOTICE file
 6  
  * distributed with this work for additional information
 7  
  * regarding copyright ownership.  The ASF licenses this file
 8  
  * to you under the Apache License, Version 2.0 (the
 9  
  * "License"); you may not use this file except in compliance
 10  
  * with the License.  You may obtain a copy of the License at
 11  
  *
 12  
  *  http://www.apache.org/licenses/LICENSE-2.0
 13  
  *
 14  
  * Unless required by applicable law or agreed to in writing,
 15  
  * software distributed under the License is distributed on an
 16  
  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 17  
  * KIND, either express or implied.  See the License for the
 18  
  * specific language governing permissions and limitations
 19  
  * under the License.
 20  
  */
 21  
 
 22  
 import java.io.File;
 23  
 import java.util.ArrayList;
 24  
 import java.util.Arrays;
 25  
 import java.util.Properties;
 26  
 
 27  
 import org.apache.maven.shared.invoker.InvocationRequest;
 28  
 import org.codehaus.plexus.util.StringUtils;
 29  
 
 30  
 /**
 31  
  * Provides a convenient facade around the <code>invoker.properties</code>.
 32  
  * 
 33  
  * @author Benjamin Bentmann
 34  
  * @version $Id: InvokerProperties.java 828136 2009-10-21 18:44:48Z stephenc $
 35  
  */
 36  
 class InvokerProperties
 37  
 {
 38  
 
 39  
     /**
 40  
      * The invoker properties being wrapped, never <code>null</code>.
 41  
      */
 42  
     private final Properties properties;
 43  
 
 44  
     /**
 45  
      * The constant for the invoker property.
 46  
      */
 47  
     private static final String PROJECT = "invoker.project";
 48  
 
 49  
     /**
 50  
      * The constant for the invoker property.
 51  
      */
 52  
     private static final String GOALS = "invoker.goals";
 53  
 
 54  
     /**
 55  
      * The constant for the invoker property.
 56  
      */
 57  
     private static final String PROFILES = "invoker.profiles";
 58  
 
 59  
     /**
 60  
      * The constant for the invoker property.
 61  
      */
 62  
     private static final String MAVEN_OPTS = "invoker.mavenOpts";
 63  
 
 64  
     /**
 65  
      * The constant for the invoker property.
 66  
      */
 67  
     private static final String FAILURE_BEHAVIOR = "invoker.failureBehavior";
 68  
 
 69  
     /**
 70  
      * The constant for the invoker property.
 71  
      */
 72  
     private static final String NON_RECURSIVE = "invoker.nonRecursive";
 73  
 
 74  
     /**
 75  
      * The constant for the invoker property.
 76  
      */
 77  
     private static final String OFFLINE = "invoker.offline";
 78  
 
 79  
     /**
 80  
      * The constant for the invoker property.
 81  
      */
 82  
     private static final String SYSTEM_PROPERTIES_FILE = "invoker.systemPropertiesFile";
 83  
 
 84  
     /**
 85  
      * Creates a new facade for the specified invoker properties. The properties will not be copied, so any changes to
 86  
      * them will be reflected by the facade.
 87  
      * 
 88  
      * @param properties The invoker properties to wrap, may be <code>null</code> if none.
 89  
      */
 90  
     public InvokerProperties( Properties properties )
 91  20
     {
 92  20
         this.properties = ( properties != null ) ? properties : new Properties();
 93  20
     }
 94  
 
 95  
     /**
 96  
      * Gets the invoker properties being wrapped.
 97  
      * 
 98  
      * @return The invoker properties being wrapped, never <code>null</code>.
 99  
      */
 100  
     public Properties getProperties()
 101  
     {
 102  2
         return this.properties;
 103  
     }
 104  
 
 105  
     /**
 106  
      * Gets the name of the corresponding build job.
 107  
      * 
 108  
      * @return The name of the build job or an empty string if not set.
 109  
      */
 110  
     public String getJobName()
 111  
     {
 112  0
         return this.properties.getProperty( "invoker.name", "" );
 113  
     }
 114  
 
 115  
     /**
 116  
      * Gets the description of the corresponding build job.
 117  
      * 
 118  
      * @return The description of the build job or an empty string if not set.
 119  
      */
 120  
     public String getJobDescription()
 121  
     {
 122  0
         return this.properties.getProperty( "invoker.description", "" );
 123  
     }
 124  
 
 125  
     /**
 126  
      * Gets the specification of JRE versions on which this build job should be run.
 127  
      * 
 128  
      * @return The specification of JRE versions or an empty string if not set.
 129  
      */
 130  
     public String getJreVersion()
 131  
     {
 132  0
         return this.properties.getProperty( "invoker.java.version", "" );
 133  
     }
 134  
 
 135  
     /**
 136  
      * Gets the specification of Maven versions on which this build job should be run.
 137  
      *
 138  
      * @return The specification of Maven versions on which this build job should be run.
 139  
      * @since 1.5
 140  
      */
 141  
     public String getMavenVersion()
 142  
     {
 143  0
         return this.properties.getProperty( "invoker.maven.version", "" );
 144  
     }
 145  
 
 146  
     /**
 147  
      * Gets the specification of OS families on which this build job should be run.
 148  
      * 
 149  
      * @return The specification of OS families or an empty string if not set.
 150  
      */
 151  
     public String getOsFamily()
 152  
     {
 153  0
         return this.properties.getProperty( "invoker.os.family", "" );
 154  
     }
 155  
 
 156  
     /**
 157  
      * Determines whether these invoker properties contain a build definition for the specified invocation index.
 158  
      * 
 159  
      * @param index The one-based index of the invocation to check for, must not be negative.
 160  
      * @return <code>true</code> if the invocation with the specified index is defined, <code>false</code> otherwise.
 161  
      */
 162  
     public boolean isInvocationDefined( int index )
 163  
     {
 164  0
         String[] keys =
 165  
             { PROJECT, GOALS, PROFILES, MAVEN_OPTS, FAILURE_BEHAVIOR, NON_RECURSIVE, OFFLINE, SYSTEM_PROPERTIES_FILE };
 166  0
         for ( int i = 0; i < keys.length; i++ )
 167  
         {
 168  0
             if ( properties.getProperty( keys[i] + '.' + index ) != null )
 169  
             {
 170  0
                 return true;
 171  
             }
 172  
         }
 173  0
         return false;
 174  
     }
 175  
 
 176  
     /**
 177  
      * Configures the specified invocation request from these invoker properties. Settings not present in the invoker
 178  
      * properties will be left unchanged in the invocation request.
 179  
      * 
 180  
      * @param request The invocation request to configure, must not be <code>null</code>.
 181  
      * @param index The one-based index of the invocation to configure, must not be negative.
 182  
      */
 183  
     public void configureInvocation( InvocationRequest request, int index )
 184  
     {
 185  50
         String project = get( PROJECT, index );
 186  50
         if ( project != null )
 187  
         {
 188  4
             File file = new File( request.getBaseDirectory(), project );
 189  4
             if ( file.isFile() )
 190  
             {
 191  2
                 request.setBaseDirectory( file.getParentFile() );
 192  2
                 request.setPomFile( file );
 193  
             }
 194  
             else
 195  
             {
 196  2
                 request.setBaseDirectory( file );
 197  2
                 request.setPomFile( null );
 198  
             }
 199  
         }
 200  
 
 201  50
         String goals = get( GOALS, index );
 202  50
         if ( goals != null )
 203  
         {
 204  8
             request.setGoals( new ArrayList( Arrays.asList( StringUtils.split( goals, ", \t\n\r\f" ) ) ) );
 205  
         }
 206  
 
 207  50
         String profiles = get( PROFILES, index );
 208  50
         if ( profiles != null )
 209  
         {
 210  8
             request.setProfiles( new ArrayList( Arrays.asList( StringUtils.split( profiles, ", \t\n\r\f" ) ) ) );
 211  
         }
 212  
 
 213  50
         String mvnOpts = get( MAVEN_OPTS, index );
 214  50
         if ( mvnOpts != null )
 215  
         {
 216  2
             request.setMavenOpts( mvnOpts );
 217  
         }
 218  
 
 219  50
         String failureBehavior = get( FAILURE_BEHAVIOR, index );
 220  50
         if ( failureBehavior != null )
 221  
         {
 222  2
             request.setFailureBehavior( failureBehavior );
 223  
         }
 224  
 
 225  50
         String nonRecursive = get( NON_RECURSIVE, index );
 226  50
         if ( nonRecursive != null )
 227  
         {
 228  4
             request.setRecursive( !Boolean.valueOf( nonRecursive ).booleanValue() );
 229  
         }
 230  
 
 231  50
         String offline = get( OFFLINE, index );
 232  50
         if ( offline != null )
 233  
         {
 234  4
             request.setOffline( Boolean.valueOf( offline ).booleanValue() );
 235  
         }
 236  50
     }
 237  
 
 238  
     /**
 239  
      * Checks whether the specified exit code matches the one expected for the given invocation.
 240  
      * 
 241  
      * @param exitCode The exit code of the Maven invocation to check.
 242  
      * @param index The index of the invocation for which to check the exit code, must not be negative.
 243  
      * @return <code>true</code> if the exit code is zero and a success was expected or if the exit code is non-zero and
 244  
      *         a failue was expected, <code>false</code> otherwise.
 245  
      */
 246  
     public boolean isExpectedResult( int exitCode, int index )
 247  
     {
 248  12
         boolean nonZeroExit = "failure".equalsIgnoreCase( get( "invoker.buildResult", index ) );
 249  12
         return ( exitCode != 0 ) == nonZeroExit;
 250  
     }
 251  
 
 252  
     /**
 253  
      * Gets the path to the properties file used to set the system properties for the specified execution.
 254  
      * 
 255  
      * @param index The index of the invocation for which to check the exit code, must not be negative.
 256  
      * @return The path to the properties file or <code>null</code> if not set.
 257  
      */
 258  
     public String getSystemPropertiesFile( int index )
 259  
     {
 260  0
         return get( SYSTEM_PROPERTIES_FILE, index );
 261  
     }
 262  
 
 263  
     /**
 264  
      * Gets a value from the invoker properties. The invoker properties are intended to describe the invocation settings
 265  
      * for multiple builds of the same project. For this reason, the properties are indexed. First, a property named
 266  
      * <code>key.index</code> will be queried. If this property does not exist, the value of the property named
 267  
      * <code>key</code> will finally be returned.
 268  
      * 
 269  
      * @param key The (base) key for the invoker property to lookup, must not be <code>null</code>.
 270  
      * @param index The index of the invocation for which to retrieve the value, must not be negative.
 271  
      * @return The value for the requested invoker property or <code>null</code> if not defined.
 272  
      */
 273  
     String get( String key, int index )
 274  
     {
 275  370
         if ( index < 0 )
 276  
         {
 277  0
             throw new IllegalArgumentException( "invalid invocation index: " + index );
 278  
         }
 279  
 
 280  370
         String value = properties.getProperty( key + '.' + index );
 281  370
         if ( value == null )
 282  
         {
 283  368
             value = properties.getProperty( key );
 284  
         }
 285  370
         return value;
 286  
     }
 287  
 
 288  
 }