View Javadoc

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 1052409 2010-12-23 23:13:13Z olamy $
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      {
92          this.properties = ( properties != null ) ? properties : new Properties();
93      }
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         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         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         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         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         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         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         String[] keys =
165             { PROJECT, GOALS, PROFILES, MAVEN_OPTS, FAILURE_BEHAVIOR, NON_RECURSIVE, OFFLINE, SYSTEM_PROPERTIES_FILE };
166         for ( int i = 0; i < keys.length; i++ )
167         {
168             if ( properties.getProperty( keys[i] + '.' + index ) != null )
169             {
170                 return true;
171             }
172         }
173         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         String project = get( PROJECT, index );
186         if ( project != null )
187         {
188             File file = new File( request.getBaseDirectory(), project );
189             if ( file.isFile() )
190             {
191                 request.setBaseDirectory( file.getParentFile() );
192                 request.setPomFile( file );
193             }
194             else
195             {
196                 request.setBaseDirectory( file );
197                 request.setPomFile( null );
198             }
199         }
200 
201         String goals = get( GOALS, index );
202         if ( goals != null )
203         {
204             request.setGoals( new ArrayList<String>( Arrays.asList( StringUtils.split( goals, ", \t\n\r\f" ) ) ) );
205         }
206 
207         String profiles = get( PROFILES, index );
208         if ( profiles != null )
209         {
210             request.setProfiles( new ArrayList<String>( Arrays.asList( StringUtils.split( profiles, ", \t\n\r\f" ) ) ) );
211         }
212 
213         String mvnOpts = get( MAVEN_OPTS, index );
214         if ( mvnOpts != null )
215         {
216             request.setMavenOpts( mvnOpts );
217         }
218 
219         String failureBehavior = get( FAILURE_BEHAVIOR, index );
220         if ( failureBehavior != null )
221         {
222             request.setFailureBehavior( failureBehavior );
223         }
224 
225         String nonRecursive = get( NON_RECURSIVE, index );
226         if ( nonRecursive != null )
227         {
228             request.setRecursive( !Boolean.valueOf( nonRecursive ).booleanValue() );
229         }
230 
231         String offline = get( OFFLINE, index );
232         if ( offline != null )
233         {
234             request.setOffline( Boolean.valueOf( offline ).booleanValue() );
235         }
236     }
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         boolean nonZeroExit = "failure".equalsIgnoreCase( get( "invoker.buildResult", index ) );
249         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         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         if ( index < 0 )
276         {
277             throw new IllegalArgumentException( "invalid invocation index: " + index );
278         }
279 
280         String value = properties.getProperty( key + '.' + index );
281         if ( value == null )
282         {
283             value = properties.getProperty( key );
284         }
285         return value;
286     }
287 
288 }