1 package org.apache.maven.plugins.enforcer;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.util.ArrayList;
23 import java.util.Hashtable;
24 import java.util.Iterator;
25
26 import org.apache.maven.enforcer.rule.api.EnforcerRule;
27 import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
28 import org.apache.maven.enforcer.rule.api.EnforcerRuleHelper;
29 import org.apache.maven.execution.MavenSession;
30 import org.apache.maven.plugin.AbstractMojo;
31 import org.apache.maven.plugin.MojoExecutionException;
32 import org.apache.maven.plugin.logging.Log;
33 import org.apache.maven.project.MavenProject;
34 import org.apache.maven.project.path.PathTranslator;
35 import org.codehaus.plexus.PlexusConstants;
36 import org.codehaus.plexus.PlexusContainer;
37 import org.codehaus.plexus.context.Context;
38 import org.codehaus.plexus.context.ContextException;
39 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Contextualizable;
40
41
42
43
44
45
46
47
48
49
50
51
52 public class EnforceMojo
53 extends AbstractMojo
54 implements Contextualizable
55 {
56
57
58
59
60
61
62 protected PathTranslator translator;
63
64
65
66
67
68
69
70 protected MavenSession session;
71
72
73
74
75
76
77
78
79 protected MavenProject project;
80
81
82
83
84
85
86
87 protected boolean fail = true;
88
89
90
91
92
93
94
95 protected boolean skip = false;
96
97
98
99
100
101
102
103 protected boolean failFast = false;
104
105
106
107
108
109
110
111
112 private EnforcerRule[] rules;
113
114
115
116
117
118
119
120
121 protected boolean ignoreCache = false;
122
123
124
125
126 protected static Hashtable cache = new Hashtable();
127
128
129
130
131 protected PlexusContainer container;
132
133 public void contextualize ( Context context )
134 throws ContextException
135 {
136 container = (PlexusContainer) context.get( PlexusConstants.PLEXUS_KEY );
137 }
138
139
140
141
142 public void execute ()
143 throws MojoExecutionException
144 {
145 Log log = this.getLog();
146
147 EnforcerExpressionEvaluator evaluator = new EnforcerExpressionEvaluator( session, translator, project );
148
149
150 if ( !skip )
151 {
152
153 ArrayList list = new ArrayList();
154
155
156 if ( rules != null && rules.length > 0 )
157 {
158 String currentRule = "Unknown";
159
160
161 EnforcerRuleHelper helper = new DefaultEnforcementRuleHelper( session, evaluator, log, container );
162
163
164
165 if ( !fail )
166 {
167 failFast = false;
168 }
169
170
171 for ( int i = 0; i < rules.length; i++ )
172 {
173
174
175 EnforcerRule rule = rules[i];
176 if ( rule != null )
177 {
178
179
180 currentRule = rule.getClass().getName();
181 log.debug( "Executing rule: " + currentRule );
182 try
183 {
184 if ( ignoreCache || shouldExecute( rule ) )
185 {
186
187
188 synchronized ( rule )
189 {
190 rule.execute( helper );
191 }
192 }
193 }
194 catch ( EnforcerRuleException e )
195 {
196
197
198
199 if ( failFast )
200 {
201 throw new MojoExecutionException( currentRule + " failed with message:\n"
202 + e.getMessage(), e );
203 }
204 else
205 {
206 list.add( "Rule " + i + ": " + currentRule + " failed with message:\n" + e.getMessage() );
207 log.debug( "Adding failure due to exception", e );
208 }
209 }
210 }
211 }
212
213
214 if ( !list.isEmpty() )
215 {
216 Iterator iter = list.iterator();
217 while ( iter.hasNext() )
218 {
219 String failure = (String) iter.next();
220 log.warn( failure );
221 }
222 if ( fail )
223 {
224 throw new MojoExecutionException(
225 "Some Enforcer rules have failed. Look above for specific messages explaining why the rule failed." );
226 }
227 }
228 }
229 else
230 {
231 throw new MojoExecutionException(
232 "No rules are configured. Use the skip flag if you want to disable execution." );
233 }
234 }
235 else
236 {
237 log.info( "Skipping Rule Enforcement." );
238 }
239 }
240
241
242
243
244
245
246
247
248 protected boolean shouldExecute ( EnforcerRule rule )
249 {
250 if ( rule.isCacheable() )
251 {
252 Log log = this.getLog();
253 log.debug( "Rule " + rule.getClass().getName() + " is cacheable." );
254 String key = rule.getClass().getName() + " " + rule.getCacheId();
255 if ( EnforceMojo.cache.containsKey( key ) )
256 {
257 log.debug( "Key " + key + " was found in the cache" );
258 if ( rule.isResultValid( (EnforcerRule) cache.get( key ) ) )
259 {
260 log.debug( "The cached results are still valid. Skipping the rule: "+rule.getClass().getName() );
261 return false;
262 }
263 }
264
265
266 EnforceMojo.cache.put( key, rule );
267 }
268 return true;
269 }
270
271
272
273
274 public boolean isFail ()
275 {
276 return this.fail;
277 }
278
279
280
281
282 public void setFail ( boolean theFail )
283 {
284 this.fail = theFail;
285 }
286
287
288
289
290 public EnforcerRule[] getRules ()
291 {
292 return this.rules;
293 }
294
295
296
297
298 public void setRules ( EnforcerRule[] theRules )
299 {
300 this.rules = theRules;
301 }
302
303
304
305
306 public boolean isSkip ()
307 {
308 return this.skip;
309 }
310
311
312
313
314 public void setSkip ( boolean theSkip )
315 {
316 this.skip = theSkip;
317 }
318
319
320
321
322 public boolean isFailFast ()
323 {
324 return this.failFast;
325 }
326
327
328
329
330 public void setFailFast ( boolean theFailFast )
331 {
332 this.failFast = theFailFast;
333 }
334
335
336
337
338 public MavenProject getProject ()
339 {
340 return this.project;
341 }
342
343
344
345
346 public void setProject ( MavenProject theProject )
347 {
348 this.project = theProject;
349 }
350
351
352
353
354 public MavenSession getSession ()
355 {
356 return this.session;
357 }
358
359
360
361
362 public void setSession ( MavenSession theSession )
363 {
364 this.session = theSession;
365 }
366
367
368
369
370 public PathTranslator getTranslator ()
371 {
372 return this.translator;
373 }
374
375
376
377
378 public void setTranslator ( PathTranslator theTranslator )
379 {
380 this.translator = theTranslator;
381 }
382 }