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, true, "The following builds were skipped:", skippedJobs );
217 }
218
219 public void logFailedBuildLog( Log logger, boolean ignoreFailures )
220 throws MojoFailureException
221 {
222 updateStats();
223
224 List<BuildJob> jobToLogs = new ArrayList<>( failedJobs );
225 jobToLogs.addAll( errorJobs );
226
227 for ( BuildJob buildJob: jobToLogs )
228 {
229 File buildLogFile = buildJob.getBuildlog() != null ? new File( buildJob.getBuildlog() ) : null;
230 if ( buildLogFile != null && buildLogFile.exists() )
231 {
232 try
233 {
234
235
236 StringBuilder buildLogMessage = new StringBuilder( );
237 buildLogMessage.append( System.lineSeparator() );
238 buildLogMessage.append( System.lineSeparator() );
239 buildLogMessage.append( "*** begin build.log for: " + buildJob.getProject() + " ***" );
240 buildLogMessage.append( System.lineSeparator() );
241 try ( FileReader buildLogReader = new FileReader( buildLogFile ) )
242 {
243 buildLogMessage.append( IOUtil.toString( buildLogReader ) );
244 }
245 buildLogMessage.append( "*** end build.log for: " + buildJob.getProject() + " ***" );
246 buildLogMessage.append( System.lineSeparator() );
247
248 logWithLevel( logger, ignoreFailures, SEPARATOR );
249 logWithLevel( logger, ignoreFailures, buildLogMessage.toString() );
250 logWithLevel( logger, ignoreFailures, SEPARATOR );
251 logWithLevel( logger, ignoreFailures, "" );
252
253 }
254 catch ( IOException e )
255 {
256 throw new MojoFailureException( e.getMessage(), e );
257 }
258 }
259 }
260 }
261
262
263
264
265
266
267
268
269
270 public void handleFailures( Log logger, boolean ignoreFailures )
271 throws MojoFailureException
272 {
273 updateStats();
274
275 if ( !failedJobs.isEmpty() )
276 {
277 String message = failedJobs.size() + " build" + ( failedJobs.size() == 1 ? "" : "s" ) + " failed.";
278
279 if ( ignoreFailures )
280 {
281 logger.warn( "Ignoring that " + message );
282 }
283 else
284 {
285 throw new MojoFailureException( message + " See console output above for details." );
286 }
287 }
288
289 if ( !errorJobs.isEmpty() )
290 {
291 String message = errorJobs.size() + " build" + ( errorJobs.size() == 1 ? "" : "s" ) + " in error.";
292
293 if ( ignoreFailures )
294 {
295 logger.warn( "Ignoring that " + message );
296 }
297 else
298 {
299 throw new MojoFailureException( message + " See console output above for details." );
300 }
301 }
302 }
303
304
305
306
307
308
309
310
311 private void logBuildJobList( Log logger, boolean warn, String header, List<BuildJob> buildJobs )
312 {
313 if ( buildJobs.isEmpty() )
314 {
315 return;
316 }
317
318 logWithLevel( logger, warn, header );
319
320 for ( BuildJob buildJob : buildJobs )
321 {
322 logWithLevel( logger, warn, "* " + buildJob.getProject() );
323 }
324
325 logger.info( SEPARATOR );
326 }
327
328
329
330
331
332
333
334
335 private void logWithLevel( Log logger, boolean warn, String message )
336 {
337
338 if ( warn )
339 {
340 logger.warn( message );
341 }
342 else
343 {
344 logger.error( message );
345 }
346 }
347 }