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