1 package org.apache.maven.plugins.dependency.fromDependencies;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.util.ArrayList;
24 import java.util.Collection;
25 import java.util.LinkedHashSet;
26 import java.util.Set;
27
28 import org.apache.maven.artifact.Artifact;
29 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
30 import org.apache.maven.plugin.MojoExecutionException;
31 import org.apache.maven.plugins.annotations.Component;
32 import org.apache.maven.plugins.annotations.Parameter;
33 import org.apache.maven.plugins.dependency.AbstractDependencyMojo;
34 import org.apache.maven.plugins.dependency.utils.DependencyStatusSets;
35 import org.apache.maven.plugins.dependency.utils.DependencyUtil;
36 import org.apache.maven.plugins.dependency.utils.translators.ArtifactTranslator;
37 import org.apache.maven.plugins.dependency.utils.translators.ClassifierTypeTranslator;
38 import org.apache.maven.project.MavenProject;
39 import org.apache.maven.project.ProjectBuilder;
40 import org.apache.maven.project.ProjectBuildingException;
41 import org.apache.maven.project.ProjectBuildingRequest;
42 import org.apache.maven.shared.artifact.ArtifactCoordinate;
43 import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterException;
44 import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter;
45 import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter;
46 import org.apache.maven.shared.artifact.filter.collection.ClassifierFilter;
47 import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts;
48 import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter;
49 import org.apache.maven.shared.artifact.filter.collection.ProjectTransitivityFilter;
50 import org.apache.maven.shared.artifact.filter.collection.ScopeFilter;
51 import org.apache.maven.shared.artifact.filter.collection.TypeFilter;
52 import org.apache.maven.shared.repository.RepositoryManager;
53 import org.apache.maven.shared.artifact.resolve.ArtifactResolver;
54 import org.apache.maven.shared.artifact.resolve.ArtifactResolverException;
55 import org.apache.maven.shared.dependencies.resolve.DependencyResolver;
56 import org.codehaus.plexus.util.StringUtils;
57
58
59
60
61
62
63
64
65 public abstract class AbstractDependencyFilterMojo
66 extends AbstractDependencyMojo
67 {
68 @Component
69 private ArtifactResolver artifactResolver;
70
71 @Component
72 private DependencyResolver dependencyResolver;
73
74 @Component
75 private RepositoryManager repositoryManager;
76
77
78
79
80
81
82 @Parameter( property = "overWriteReleases", defaultValue = "false" )
83 protected boolean overWriteReleases;
84
85
86
87
88
89
90 @Parameter( property = "overWriteSnapshots", defaultValue = "false" )
91 protected boolean overWriteSnapshots;
92
93
94
95
96
97
98 @Parameter( property = "overWriteIfNewer", defaultValue = "true" )
99 protected boolean overWriteIfNewer;
100
101
102
103
104
105
106 @Parameter( property = "excludeTransitive", defaultValue = "false" )
107 protected boolean excludeTransitive;
108
109
110
111
112
113
114 @Parameter( property = "includeTypes", defaultValue = "" )
115 protected String includeTypes;
116
117
118
119
120
121
122 @Parameter( property = "excludeTypes", defaultValue = "" )
123 protected String excludeTypes;
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138 @Parameter( property = "includeScope", defaultValue = "" )
139 protected String includeScope;
140
141
142
143
144
145
146 @Parameter( property = "excludeScope", defaultValue = "" )
147 protected String excludeScope;
148
149
150
151
152
153
154 @Parameter( property = "includeClassifiers", defaultValue = "" )
155 protected String includeClassifiers;
156
157
158
159
160
161
162 @Parameter( property = "excludeClassifiers", defaultValue = "" )
163 protected String excludeClassifiers;
164
165
166
167
168
169
170 @Parameter( property = "classifier", defaultValue = "" )
171 protected String classifier;
172
173
174
175
176
177
178 @Parameter( property = "type", defaultValue = "" )
179 protected String type;
180
181
182
183
184
185
186 @Parameter( property = "excludeArtifactIds", defaultValue = "" )
187 protected String excludeArtifactIds;
188
189
190
191
192
193
194 @Parameter( property = "includeArtifactIds", defaultValue = "" )
195 protected String includeArtifactIds;
196
197
198
199
200
201
202 @Parameter( property = "excludeGroupIds", defaultValue = "" )
203 protected String excludeGroupIds;
204
205
206
207
208
209
210 @Parameter( property = "includeGroupIds", defaultValue = "" )
211 protected String includeGroupIds;
212
213
214
215
216
217
218
219 @Parameter( property = "markersDirectory", defaultValue = "${project.build.directory}/dependency-maven-plugin-markers" )
220
221 protected File markersDirectory;
222
223
224
225
226
227
228 @Parameter( property = "mdep.prependGroupId", defaultValue = "false" )
229 protected boolean prependGroupId = false;
230
231 @Component
232 private ProjectBuilder projectBuilder;
233
234 @Component
235 private ArtifactHandlerManager artifactHandlerManager;
236
237
238
239
240
241
242 protected abstract ArtifactsFilter getMarkedArtifactFilter();
243
244
245
246
247
248
249
250
251 protected Set<Artifact> getResolvedDependencies( boolean stopOnFailure )
252 throws MojoExecutionException
253
254 {
255 DependencyStatusSets status = getDependencySets( stopOnFailure );
256
257 return status.getResolvedDependencies();
258 }
259
260
261
262
263
264
265 protected DependencyStatusSets getDependencySets( boolean stopOnFailure )
266 throws MojoExecutionException
267 {
268 return getDependencySets( stopOnFailure, false );
269 }
270
271
272
273
274
275
276
277
278
279
280 protected DependencyStatusSets getDependencySets( boolean stopOnFailure, boolean includeParents )
281 throws MojoExecutionException
282 {
283
284 FilterArtifacts filter = new FilterArtifacts();
285
286 filter.addFilter( new ProjectTransitivityFilter( getProject().getDependencyArtifacts(),
287 this.excludeTransitive ) );
288
289 filter.addFilter( new ScopeFilter( DependencyUtil.cleanToBeTokenizedString( this.includeScope ),
290 DependencyUtil.cleanToBeTokenizedString( this.excludeScope ) ) );
291
292 filter.addFilter( new TypeFilter( DependencyUtil.cleanToBeTokenizedString( this.includeTypes ),
293 DependencyUtil.cleanToBeTokenizedString( this.excludeTypes ) ) );
294
295 filter.addFilter( new ClassifierFilter( DependencyUtil.cleanToBeTokenizedString( this.includeClassifiers ),
296 DependencyUtil.cleanToBeTokenizedString( this.excludeClassifiers ) ) );
297
298 filter.addFilter( new GroupIdFilter( DependencyUtil.cleanToBeTokenizedString( this.includeGroupIds ),
299 DependencyUtil.cleanToBeTokenizedString( this.excludeGroupIds ) ) );
300
301 filter.addFilter( new ArtifactIdFilter( DependencyUtil.cleanToBeTokenizedString( this.includeArtifactIds ),
302 DependencyUtil.cleanToBeTokenizedString( this.excludeArtifactIds ) ) );
303
304
305 Set<Artifact> artifacts = getProject().getArtifacts();
306
307 if ( includeParents )
308 {
309
310 for ( Artifact dep : new ArrayList<Artifact>( artifacts ) )
311 {
312 addParentArtifacts( buildProjectFromArtifact( dep ), artifacts );
313 }
314
315
316 addParentArtifacts( getProject(), artifacts );
317 }
318
319
320 try
321 {
322 artifacts = filter.filter( artifacts );
323 }
324 catch ( ArtifactFilterException e )
325 {
326 throw new MojoExecutionException( e.getMessage(), e );
327 }
328
329
330 DependencyStatusSets status;
331 if ( StringUtils.isNotEmpty( classifier ) )
332 {
333 status = getClassifierTranslatedDependencies( artifacts, stopOnFailure );
334 }
335 else
336 {
337 status = filterMarkedDependencies( artifacts );
338 }
339
340 return status;
341 }
342
343 private MavenProject buildProjectFromArtifact( Artifact artifact )
344 throws MojoExecutionException
345 {
346 try
347 {
348 return projectBuilder.build( artifact, session.getProjectBuildingRequest() ).getProject();
349 }
350 catch ( ProjectBuildingException e )
351 {
352 throw new MojoExecutionException( e.getMessage(), e );
353 }
354 }
355
356 private void addParentArtifacts( MavenProject project, Set<Artifact> artifacts )
357 throws MojoExecutionException
358 {
359 while ( project.hasParent() )
360 {
361 project = project.getParent();
362
363 if ( artifacts.contains( project.getArtifact() ) )
364 {
365
366 break;
367 }
368 try
369 {
370 ProjectBuildingRequest buildingRequest = newResolveArtifactProjectBuildingRequest();
371
372 Artifact resolvedArtifact =
373 artifactResolver.resolveArtifact( buildingRequest, project.getArtifact() ).getArtifact();
374
375 artifacts.add( resolvedArtifact );
376 }
377 catch ( ArtifactResolverException e )
378 {
379 throw new MojoExecutionException( e.getMessage(), e );
380 }
381 }
382 }
383
384
385
386
387
388
389
390
391
392 protected DependencyStatusSets getClassifierTranslatedDependencies( Set<Artifact> artifacts, boolean stopOnFailure )
393 throws MojoExecutionException
394 {
395 Set<Artifact> unResolvedArtifacts = new LinkedHashSet<Artifact>();
396 Set<Artifact> resolvedArtifacts = artifacts;
397 DependencyStatusSets status = new DependencyStatusSets();
398
399
400
401
402 if ( StringUtils.isNotEmpty( classifier ) )
403 {
404 ArtifactTranslator translator =
405 new ClassifierTypeTranslator( artifactHandlerManager, this.classifier, this.type );
406 Collection<ArtifactCoordinate> coordinates = translator.translate( artifacts, getLog() );
407
408 status = filterMarkedDependencies( artifacts );
409
410
411 artifacts = status.getResolvedDependencies();
412
413
414 resolvedArtifacts = resolve( new LinkedHashSet<ArtifactCoordinate>( coordinates ), stopOnFailure );
415
416
417 unResolvedArtifacts.addAll( artifacts );
418 unResolvedArtifacts.removeAll( resolvedArtifacts );
419 }
420
421
422 status.setResolvedDependencies( resolvedArtifacts );
423 status.setUnResolvedDependencies( unResolvedArtifacts );
424
425 return status;
426 }
427
428
429
430
431
432
433
434
435 protected DependencyStatusSets filterMarkedDependencies( Set<Artifact> artifacts )
436 throws MojoExecutionException
437 {
438
439 FilterArtifacts filter = new FilterArtifacts();
440 filter.clearFilters();
441 filter.addFilter( getMarkedArtifactFilter() );
442
443 Set<Artifact> unMarkedArtifacts;
444 try
445 {
446 unMarkedArtifacts = filter.filter( artifacts );
447 }
448 catch ( ArtifactFilterException e )
449 {
450 throw new MojoExecutionException( e.getMessage(), e );
451 }
452
453
454 Set<Artifact> skippedArtifacts = new LinkedHashSet<Artifact>();
455 skippedArtifacts.addAll( artifacts );
456 skippedArtifacts.removeAll( unMarkedArtifacts );
457
458 return new DependencyStatusSets( unMarkedArtifacts, null, skippedArtifacts );
459 }
460
461
462
463
464
465
466
467
468 protected Set<Artifact> resolve( Set<ArtifactCoordinate> coordinates, boolean stopOnFailure )
469 throws MojoExecutionException
470 {
471 ProjectBuildingRequest buildingRequest = newResolveArtifactProjectBuildingRequest();
472
473 Set<Artifact> resolvedArtifacts = new LinkedHashSet<Artifact>();
474 for ( ArtifactCoordinate coordinate : coordinates )
475 {
476 try
477 {
478 Artifact artifact = artifactResolver.resolveArtifact( buildingRequest, coordinate ).getArtifact();
479 resolvedArtifacts.add( artifact );
480 }
481 catch ( ArtifactResolverException ex )
482 {
483
484 getLog().debug( "error resolving: " + coordinate );
485 getLog().debug( ex );
486 if ( stopOnFailure )
487 {
488 throw new MojoExecutionException( "error resolving: " + coordinate, ex );
489 }
490 }
491 }
492 return resolvedArtifacts;
493 }
494
495
496
497
498 public File getMarkersDirectory()
499 {
500 return this.markersDirectory;
501 }
502
503
504
505
506 public void setMarkersDirectory( File theMarkersDirectory )
507 {
508 this.markersDirectory = theMarkersDirectory;
509 }
510
511
512
513
514
515
516 public boolean isPrependGroupId()
517 {
518 return prependGroupId;
519 }
520
521
522
523
524 public void setPrependGroupId( boolean prependGroupId )
525 {
526 this.prependGroupId = prependGroupId;
527 }
528
529 protected final ArtifactResolver getArtifactResolver()
530 {
531 return artifactResolver;
532 }
533
534 protected final DependencyResolver getDependencyResolver()
535 {
536 return dependencyResolver;
537 }
538
539 protected final RepositoryManager getRepositoryManager()
540 {
541 return repositoryManager;
542 }
543 }