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 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      {
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 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         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         String[] keys =
154             { PROJECT, GOALS, PROFILES, MAVEN_OPTS, FAILURE_BEHAVIOR, NON_RECURSIVE, OFFLINE, SYSTEM_PROPERTIES_FILE };
155         for ( int i = 0; i < keys.length; i++ )
156         {
157             if ( properties.getProperty( keys[i] + '.' + index ) != null )
158             {
159                 return true;
160             }
161         }
162         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         String project = get( PROJECT, index );
175         if ( project != null )
176         {
177             File file = new File( request.getBaseDirectory(), project );
178             if ( file.isFile() )
179             {
180                 request.setBaseDirectory( file.getParentFile() );
181                 request.setPomFile( file );
182             }
183             else
184             {
185                 request.setBaseDirectory( file );
186                 request.setPomFile( null );
187             }
188         }
189 
190         String goals = get( GOALS, index );
191         if ( goals != null )
192         {
193             request.setGoals( new ArrayList( Arrays.asList( StringUtils.split( goals, ", \t\n\r\f" ) ) ) );
194         }
195 
196         String profiles = get( PROFILES, index );
197         if ( profiles != null )
198         {
199             request.setProfiles( new ArrayList( Arrays.asList( StringUtils.split( profiles, ", \t\n\r\f" ) ) ) );
200         }
201 
202         String mvnOpts = get( MAVEN_OPTS, index );
203         if ( mvnOpts != null )
204         {
205             request.setMavenOpts( mvnOpts );
206         }
207 
208         String failureBehavior = get( FAILURE_BEHAVIOR, index );
209         if ( failureBehavior != null )
210         {
211             request.setFailureBehavior( failureBehavior );
212         }
213 
214         String nonRecursive = get( NON_RECURSIVE, index );
215         if ( nonRecursive != null )
216         {
217             request.setRecursive( !Boolean.valueOf( nonRecursive ).booleanValue() );
218         }
219 
220         String offline = get( OFFLINE, index );
221         if ( offline != null )
222         {
223             request.setOffline( Boolean.valueOf( offline ).booleanValue() );
224         }
225     }
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         boolean nonZeroExit = "failure".equalsIgnoreCase( get( "invoker.buildResult", index ) );
238         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         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         if ( index < 0 )
265         {
266             throw new IllegalArgumentException( "invalid invocation index: " + index );
267         }
268 
269         String value = properties.getProperty( key + '.' + index );
270         if ( value == null )
271         {
272             value = properties.getProperty( key );
273         }
274         return value;
275     }
276 
277 }