1 package org.apache.maven.plugins.invoker;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;
23
24 import java.io.File;
25 import java.io.FileReader;
26 import java.io.IOException;
27 import java.util.ArrayList;
28 import java.util.List;
29
30 import org.apache.maven.plugin.MojoFailureException;
31 import org.apache.maven.plugins.invoker.model.BuildJob;
32 import org.apache.maven.plugin.logging.Log;
33 import org.apache.maven.shared.utils.io.IOUtil;
34
35
36
37
38
39
40 class InvokerSession
41 {
42 private static final String SEPARATOR = buffer().strong(
43 "-------------------------------------------------" ).toString();
44
45 private List<BuildJob> buildJobs;
46
47 private List<BuildJob> failedJobs;
48
49 private List<BuildJob> errorJobs;
50
51 private List<BuildJob> successfulJobs;
52
53 private List<BuildJob> skippedJobs;
54
55
56
57
58 InvokerSession()
59 {
60 buildJobs = new ArrayList<>();
61 }
62
63
64
65
66
67
68 InvokerSession( List<BuildJob> buildJobs )
69 {
70 this.buildJobs = new ArrayList<>( buildJobs );
71 }
72
73
74
75
76
77
78 public void addJob( BuildJob buildJob )
79 {
80 buildJobs.add( buildJob );
81
82 resetStats();
83 }
84
85
86
87
88
89
90 public void setJobs( List<? extends BuildJob> buildJobs )
91 {
92 this.buildJobs = new ArrayList<>( buildJobs );
93
94 resetStats();
95 }
96
97
98
99
100
101
102 public List<BuildJob> getJobs()
103 {
104 return buildJobs;
105 }
106
107
108
109
110
111
112 public List<BuildJob> getSuccessfulJobs()
113 {
114 updateStats();
115
116 return successfulJobs;
117 }
118
119
120
121
122
123
124 public List<BuildJob> getFailedJobs()
125 {
126 updateStats();
127
128 return failedJobs;
129 }
130
131
132
133
134
135
136 public List<BuildJob> getErrorJobs()
137 {
138 updateStats();
139
140 return errorJobs;
141 }
142
143
144
145
146
147
148 public List<BuildJob> getSkippedJobs()
149 {
150 updateStats();
151
152 return skippedJobs;
153 }
154
155 private void resetStats()
156 {
157 successfulJobs = null;
158 failedJobs = null;
159 skippedJobs = null;
160 errorJobs = null;
161 }
162
163 private void updateStats()
164 {
165 if ( successfulJobs != null && skippedJobs != null && failedJobs != null && errorJobs != null )
166 {
167 return;
168 }
169
170 successfulJobs = new ArrayList<>();
171 failedJobs = new ArrayList<>();
172 skippedJobs = new ArrayList<>();
173 errorJobs = new ArrayList<>();
174
175 for ( BuildJob buildJob : buildJobs )
176 {
177 if ( BuildJob.Result.SUCCESS.equals( buildJob.getResult() ) )
178 {
179 successfulJobs.add( buildJob );
180 }
181 else if ( BuildJob.Result.SKIPPED.equals( buildJob.getResult() ) )
182 {
183 skippedJobs.add( buildJob );
184 }
185 else if ( BuildJob.Result.ERROR.equals( buildJob.getResult() ) )
186 {
187 errorJobs.add( buildJob );
188 }
189 else if ( buildJob.getResult() != null )
190 {
191 failedJobs.add( buildJob );
192 }
193 }
194 }
195
196
197
198
199
200
201
202 public void logSummary( Log logger, boolean ignoreFailures )
203 {
204 updateStats();
205
206 logger.info( SEPARATOR );
207 logger.info( "Build Summary:" );
208 logger.info( " Passed: " + successfulJobs.size()
209 + ", Failed: " + failedJobs.size()
210 + ", Errors: " + errorJobs.size()
211 + ", Skipped: " + skippedJobs.size() );
212 logger.info( SEPARATOR );
213
214 logBuildJobList( logger, ignoreFailures, "The following builds failed:", failedJobs );
215 logBuildJobList( logger, ignoreFailures, "The following builds finished with error:", errorJobs );
216 logBuildJobList( logger, ignoreFailures, "The following builds was skipped:", skippedJobs );
217 }
218
219 public void logFailedBuildLog( Log logger, boolean ignoreFailures )
220 throws MojoFailureException
221 {
222 List<BuildJob> jobToLogs = new ArrayList<>( failedJobs );
223 jobToLogs.addAll( errorJobs );
224
225 for ( BuildJob buildJob: jobToLogs )
226 {
227 File buildLogFile = buildJob.getBuildlog() != null ? new File( buildJob.getBuildlog() ) : null;
228 if ( buildLogFile != null && buildLogFile.exists() )
229 {
230 try
231 {
232
233
234 StringBuilder buildLogMessage = new StringBuilder( );
235 buildLogMessage.append( System.lineSeparator() );
236 buildLogMessage.append( System.lineSeparator() );
237 buildLogMessage.append( "*** begin build.log for: " + buildJob.getProject() + " ***" );
238 buildLogMessage.append( System.lineSeparator() );
239 buildLogMessage.append( IOUtil.toString( new FileReader( buildLogFile ) ) );
240 buildLogMessage.append( "*** end build.log for: " + buildJob.getProject() + " ***" );
241 buildLogMessage.append( System.lineSeparator() );
242
243 logWithLevel( logger, ignoreFailures, SEPARATOR );
244 logWithLevel( logger, ignoreFailures, buildLogMessage.toString() );
245 logWithLevel( logger, ignoreFailures, SEPARATOR );
246 logWithLevel( logger, ignoreFailures, "" );
247
248 }
249 catch ( IOException e )
250 {
251 throw new MojoFailureException( e.getMessage(), e );
252 }
253 }
254 }
255 }
256
257
258
259
260
261
262
263
264
265 public void handleFailures( Log logger, boolean ignoreFailures )
266 throws MojoFailureException
267 {
268 updateStats();
269
270 if ( !failedJobs.isEmpty() )
271 {
272 String message = failedJobs.size() + " build" + ( failedJobs.size() == 1 ? "" : "s" ) + " failed.";
273
274 if ( ignoreFailures )
275 {
276 logger.warn( "Ignoring that " + message );
277 }
278 else
279 {
280 throw new MojoFailureException( message + " See console output above for details." );
281 }
282 }
283
284 if ( !errorJobs.isEmpty() )
285 {
286 String message = errorJobs.size() + " build" + ( errorJobs.size() == 1 ? "" : "s" ) + " in error.";
287
288 if ( ignoreFailures )
289 {
290 logger.warn( "Ignoring that " + message );
291 }
292 else
293 {
294 throw new MojoFailureException( message + " See console output above for details." );
295 }
296 }
297 }
298
299
300
301
302
303
304
305
306 private void logBuildJobList( Log logger, boolean warn, String header, List<BuildJob> buildJobs )
307 {
308 if ( buildJobs.isEmpty() )
309 {
310 return;
311 }
312
313 logWithLevel( logger, warn, header );
314
315 for ( BuildJob buildJob : buildJobs )
316 {
317 logWithLevel( logger, warn, "* " + buildJob.getProject() );
318 }
319
320 logger.info( SEPARATOR );
321 }
322
323
324
325
326
327
328
329
330 private void logWithLevel( Log logger, boolean warn, String message )
331 {
332
333 if ( warn )
334 {
335 logger.warn( message );
336 }
337 else
338 {
339 logger.error( message );
340 }
341 }
342 }