Coverage Report - org.apache.maven.plugin.invoker.InvokerProperties
 
Classes in this File Line Coverage Branch Coverage Complexity
InvokerProperties
78%
38/49
84%
27/32
2,273
 
 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 816946 2009-09-19 19:27:43Z bentmann $
 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  10
     {
 92  10
         this.properties = ( properties != null ) ? properties : new Properties();
 93  10
     }
 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  1
         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 OS families on which this build job should be run.
 137  
      * 
 138  
      * @return The specification of OS families or an empty string if not set.
 139  
      */
 140  
     public String getOsFamily()
 141  
     {
 142  0
         return this.properties.getProperty( "invoker.os.family", "" );
 143  
     }
 144  
 
 145  
     /**
 146  
      * Determines whether these invoker properties contain a build definition for the specified invocation index.
 147  
      * 
 148  
      * @param index The one-based index of the invocation to check for, must not be negative.
 149  
      * @return <code>true</code> if the invocation with the specified index is defined, <code>false</code> otherwise.
 150  
      */
 151  
     public boolean isInvocationDefined( int index )
 152  
     {
 153  0
         String[] keys =
 154  
             { PROJECT, GOALS, PROFILES, MAVEN_OPTS, FAILURE_BEHAVIOR, NON_RECURSIVE, OFFLINE, SYSTEM_PROPERTIES_FILE };
 155  0
         for ( int i = 0; i < keys.length; i++ )
 156  
         {
 157  0
             if ( properties.getProperty( keys[i] + '.' + index ) != null )
 158  
             {
 159  0
                 return true;
 160  
             }
 161  
         }
 162  0
         return false;
 163  
     }
 164  
 
 165  
     /**
 166  
      * Configures the specified invocation request from these invoker properties. Settings not present in the invoker
 167  
      * properties will be left unchanged in the invocation request.
 168  
      * 
 169  
      * @param request The invocation request to configure, must not be <code>null</code>.
 170  
      * @param index The one-based index of the invocation to configure, must not be negative.
 171  
      */
 172  
     public void configureInvocation( InvocationRequest request, int index )
 173  
     {
 174  25
         String project = get( PROJECT, index );
 175  25
         if ( project != null )
 176  
         {
 177  2
             File file = new File( request.getBaseDirectory(), project );
 178  2
             if ( file.isFile() )
 179  
             {
 180  1
                 request.setBaseDirectory( file.getParentFile() );
 181  1
                 request.setPomFile( file );
 182  
             }
 183  
             else
 184  
             {
 185  1
                 request.setBaseDirectory( file );
 186  1
                 request.setPomFile( null );
 187  
             }
 188  
         }
 189  
 
 190  25
         String goals = get( GOALS, index );
 191  25
         if ( goals != null )
 192  
         {
 193  4
             request.setGoals( new ArrayList( Arrays.asList( StringUtils.split( goals, ", \t\n\r\f" ) ) ) );
 194  
         }
 195  
 
 196  25
         String profiles = get( PROFILES, index );
 197  25
         if ( profiles != null )
 198  
         {
 199  4
             request.setProfiles( new ArrayList( Arrays.asList( StringUtils.split( profiles, ", \t\n\r\f" ) ) ) );
 200  
         }
 201  
 
 202  25
         String mvnOpts = get( MAVEN_OPTS, index );
 203  25
         if ( mvnOpts != null )
 204  
         {
 205  1
             request.setMavenOpts( mvnOpts );
 206  
         }
 207  
 
 208  25
         String failureBehavior = get( FAILURE_BEHAVIOR, index );
 209  25
         if ( failureBehavior != null )
 210  
         {
 211  1
             request.setFailureBehavior( failureBehavior );
 212  
         }
 213  
 
 214  25
         String nonRecursive = get( NON_RECURSIVE, index );
 215  25
         if ( nonRecursive != null )
 216  
         {
 217  2
             request.setRecursive( !Boolean.valueOf( nonRecursive ).booleanValue() );
 218  
         }
 219  
 
 220  25
         String offline = get( OFFLINE, index );
 221  25
         if ( offline != null )
 222  
         {
 223  2
             request.setOffline( Boolean.valueOf( offline ).booleanValue() );
 224  
         }
 225  25
     }
 226  
 
 227  
     /**
 228  
      * Checks whether the specified exit code matches the one expected for the given invocation.
 229  
      * 
 230  
      * @param exitCode The exit code of the Maven invocation to check.
 231  
      * @param index The index of the invocation for which to check the exit code, must not be negative.
 232  
      * @return <code>true</code> if the exit code is zero and a success was expected or if the exit code is non-zero and
 233  
      *         a failue was expected, <code>false</code> otherwise.
 234  
      */
 235  
     public boolean isExpectedResult( int exitCode, int index )
 236  
     {
 237  6
         boolean nonZeroExit = "failure".equalsIgnoreCase( get( "invoker.buildResult", index ) );
 238  6
         return ( exitCode != 0 ) == nonZeroExit;
 239  
     }
 240  
 
 241  
     /**
 242  
      * Gets the path to the properties file used to set the system properties for the specified execution.
 243  
      * 
 244  
      * @param index The index of the invocation for which to check the exit code, must not be negative.
 245  
      * @return The path to the properties file or <code>null</code> if not set.
 246  
      */
 247  
     public String getSystemPropertiesFile( int index )
 248  
     {
 249  0
         return get( SYSTEM_PROPERTIES_FILE, index );
 250  
     }
 251  
 
 252  
     /**
 253  
      * Gets a value from the invoker properties. The invoker properties are intended to describe the invocation settings
 254  
      * for multiple builds of the same project. For this reason, the properties are indexed. First, a property named
 255  
      * <code>key.index</code> will be queried. If this property does not exist, the value of the property named
 256  
      * <code>key</code> will finally be returned.
 257  
      * 
 258  
      * @param key The (base) key for the invoker property to lookup, must not be <code>null</code>.
 259  
      * @param index The index of the invocation for which to retrieve the value, must not be negative.
 260  
      * @return The value for the requested invoker property or <code>null</code> if not defined.
 261  
      */
 262  
     String get( String key, int index )
 263  
     {
 264  185
         if ( index < 0 )
 265  
         {
 266  0
             throw new IllegalArgumentException( "invalid invocation index: " + index );
 267  
         }
 268  
 
 269  185
         String value = properties.getProperty( key + '.' + index );
 270  185
         if ( value == null )
 271  
         {
 272  184
             value = properties.getProperty( key );
 273  
         }
 274  185
         return value;
 275  
     }
 276  
 
 277  
 }