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.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Iterator;
25 import java.util.List;
26
27 import org.apache.maven.plugin.MojoFailureException;
28 import org.apache.maven.plugin.invoker.model.BuildJob;
29 import org.apache.maven.plugin.logging.Log;
30
31 /**
32 * Tracks a set of build jobs and their results.
33 *
34 * @author Benjamin Bentmann
35 */
36 class InvokerSession
37 {
38
39 private List buildJobs;
40
41 private List failedJobs;
42
43 private List successfulJobs;
44
45 private List skippedJobs;
46
47 /**
48 * Creates a new empty session.
49 */
50 public InvokerSession()
51 {
52 buildJobs = new ArrayList();
53 }
54
55 /**
56 * Creates a session that initially contains the specified build jobs.
57 *
58 * @param buildJobs The build jobs to set, must not be <code>null</code>.
59 */
60 public InvokerSession( BuildJob[] buildJobs )
61 {
62 this.buildJobs = new ArrayList( Arrays.asList( buildJobs ) );
63 }
64
65 /**
66 * Adds the specified build job to this session.
67 *
68 * @param buildJob The build job to add, must not be <code>null</code>.
69 */
70 public void addJob( BuildJob buildJob )
71 {
72 buildJobs.add( buildJob );
73
74 resetStats();
75 }
76
77 /**
78 * Sets the build jobs of this session.
79 *
80 * @param buildJobs The build jobs to set, must not be <code>null</code>.
81 */
82 public void setJobs( List buildJobs )
83 {
84 this.buildJobs = new ArrayList( buildJobs );
85
86 resetStats();
87 }
88
89 /**
90 * Gets the build jobs in this session.
91 *
92 * @return The build jobs in this session, can be empty but never <code>null</code>.
93 */
94 public List getJobs()
95 {
96 return buildJobs;
97 }
98
99 /**
100 * Gets the successful build jobs in this session.
101 *
102 * @return The successful build jobs in this session, can be empty but never <code>null</code>.
103 */
104 public List getSuccessfulJobs()
105 {
106 updateStats();
107
108 return successfulJobs;
109 }
110
111 /**
112 * Gets the failed build jobs in this session.
113 *
114 * @return The failed build jobs in this session, can be empty but never <code>null</code>.
115 */
116 public List getFailedJobs()
117 {
118 updateStats();
119
120 return failedJobs;
121 }
122
123 /**
124 * Gets the skipped build jobs in this session.
125 *
126 * @return The skipped build jobs in this session, can be empty but never <code>null</code>.
127 */
128 public List getSkippedJobs()
129 {
130 updateStats();
131
132 return skippedJobs;
133 }
134
135 private void resetStats()
136 {
137 successfulJobs = null;
138 failedJobs = null;
139 skippedJobs = null;
140 }
141
142 private void updateStats()
143 {
144 if ( successfulJobs != null && skippedJobs != null && failedJobs != null )
145 {
146 return;
147 }
148
149 successfulJobs = new ArrayList();
150 failedJobs = new ArrayList();
151 skippedJobs = new ArrayList();
152
153 for ( Iterator iterator = buildJobs.iterator(); iterator.hasNext(); )
154 {
155 BuildJob buildJob = (BuildJob) iterator.next();
156
157 if ( BuildJob.Result.SUCCESS.equals( buildJob.getResult() ) )
158 {
159 successfulJobs.add( buildJob );
160 }
161 else if ( BuildJob.Result.SKIPPED.equals( buildJob.getResult() ) )
162 {
163 skippedJobs.add( buildJob );
164 }
165 else if ( buildJob.getResult() != null )
166 {
167 failedJobs.add( buildJob );
168 }
169 }
170 }
171
172 /**
173 * Prints a summary of this session to the specified logger.
174 *
175 * @param logger The mojo logger to output messages to, must not be <code>null</code>.
176 * @param ignoreFailures A flag whether failures should be ignored or whether a build failure should be signaled.
177 */
178 public void logSummary( Log logger, boolean ignoreFailures )
179 {
180 updateStats();
181
182 String separator = "---------------------------------------";
183
184 logger.info( separator );
185 logger.info( "Execution Summary:" );
186 logger.info( " Builds Passing: " + successfulJobs.size() );
187 logger.info( " Builds Failing: " + failedJobs.size() );
188 logger.info( " Builds Skipped: " + skippedJobs.size() );
189 logger.info( separator );
190
191 if ( !failedJobs.isEmpty() )
192 {
193 String heading = "The following builds failed:";
194 if ( ignoreFailures )
195 {
196 logger.warn( heading );
197 }
198 else
199 {
200 logger.error( heading );
201 }
202
203 for ( Iterator it = failedJobs.iterator(); it.hasNext(); )
204 {
205 BuildJob buildJob = (BuildJob) it.next();
206
207 String item = "* " + buildJob.getProject();
208 if ( ignoreFailures )
209 {
210 logger.warn( item );
211 }
212 else
213 {
214 logger.error( item );
215 }
216 }
217
218 logger.info( separator );
219 }
220 }
221
222 /**
223 * Handles the build failures in this session.
224 *
225 * @param logger The mojo logger to output messages to, must not be <code>null</code>.
226 * @param ignoreFailures A flag whether failures should be ignored or whether a build failure should be signaled.
227 * @throws MojoFailureException If failures are present and not ignored.
228 */
229 public void handleFailures( Log logger, boolean ignoreFailures )
230 throws MojoFailureException
231 {
232 updateStats();
233
234 if ( !failedJobs.isEmpty() )
235 {
236 String message = failedJobs.size() + " build" + ( failedJobs.size() == 1 ? "" : "s" ) + " failed.";
237
238 if ( ignoreFailures )
239 {
240 logger.warn( "Ignoring that " + message );
241 }
242 else
243 {
244 throw new MojoFailureException( this, message, message );
245 }
246 }
247 }
248
249 }