1 package org.apache.maven.plugin.assembly.utils;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.apache.maven.artifact.Artifact;
23 import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
24 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
25 import org.apache.maven.plugin.assembly.InvalidAssemblerConfigurationException;
26 import org.apache.maven.project.MavenProject;
27 import org.apache.maven.shared.artifact.filter.PatternExcludesArtifactFilter;
28 import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter;
29 import org.apache.maven.shared.artifact.filter.StatisticsReportingArtifactFilter;
30 import org.codehaus.plexus.logging.Logger;
31
32 import java.util.ArrayList;
33 import java.util.Collection;
34 import java.util.Iterator;
35 import java.util.LinkedHashSet;
36 import java.util.List;
37 import java.util.Set;
38
39
40
41
42 public final class FilterUtils
43 {
44
45 private FilterUtils()
46 {
47 }
48
49 public static Set<MavenProject> filterProjects( final Set<MavenProject> projects, final List<String> includes,
50 final List<String> excludes, final boolean actTransitively,
51 final Logger logger )
52 {
53 final List<PatternIncludesArtifactFilter> allFilters = new ArrayList<PatternIncludesArtifactFilter>();
54
55 final AndArtifactFilter filter = new AndArtifactFilter();
56
57 if ( !includes.isEmpty() )
58 {
59 final PatternIncludesArtifactFilter includeFilter =
60 new PatternIncludesArtifactFilter( includes, actTransitively );
61
62 filter.add( includeFilter );
63 allFilters.add( includeFilter );
64 }
65 if ( !excludes.isEmpty() )
66 {
67 final PatternExcludesArtifactFilter excludeFilter =
68 new PatternExcludesArtifactFilter( excludes, actTransitively );
69
70 filter.add( excludeFilter );
71 allFilters.add( excludeFilter );
72 }
73
74 Set<MavenProject> result = new LinkedHashSet<MavenProject>( projects.size() );
75 for ( MavenProject project : projects )
76 {
77 final Artifact artifact = project.getArtifact();
78
79 if ( filter.include( artifact ) )
80 {
81 result.add( project );
82 }
83 }
84
85 for ( final PatternIncludesArtifactFilter f : allFilters )
86 {
87 if ( f != null )
88 {
89 f.reportMissedCriteria( logger );
90 }
91 }
92 return result;
93 }
94
95 public static void filterArtifacts( final Set<Artifact> artifacts, final List<String> includes,
96 final List<String> excludes, final boolean strictFiltering,
97 final boolean actTransitively, final Logger logger,
98 final ArtifactFilter... additionalFilters )
99 throws InvalidAssemblerConfigurationException
100 {
101 final List<ArtifactFilter> allFilters = new ArrayList<ArtifactFilter>();
102
103 final AndArtifactFilter filter = new AndArtifactFilter();
104
105 if ( additionalFilters != null && additionalFilters.length > 0 )
106 {
107 for ( final ArtifactFilter additionalFilter : additionalFilters )
108 {
109 if ( additionalFilter != null )
110 {
111 filter.add( additionalFilter );
112 }
113 }
114 }
115
116 if ( !includes.isEmpty() )
117 {
118 final ArtifactFilter includeFilter = new PatternIncludesArtifactFilter( includes, actTransitively );
119
120 filter.add( includeFilter );
121
122 allFilters.add( includeFilter );
123 }
124
125 if ( !excludes.isEmpty() )
126 {
127 final ArtifactFilter excludeFilter = new PatternExcludesArtifactFilter( excludes, actTransitively );
128
129 filter.add( excludeFilter );
130
131 allFilters.add( excludeFilter );
132 }
133
134
135
136
137
138
139
140 for ( final Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
141 {
142 final Artifact artifact = it.next();
143
144 if ( !filter.include( artifact ) )
145 {
146 it.remove();
147
148 if ( logger.isDebugEnabled() )
149 {
150 logger.debug( artifact.getId() + " was removed by one or more filters." );
151 }
152 }
153 }
154
155 reportFilteringStatistics( allFilters, logger );
156
157 for ( final ArtifactFilter f : allFilters )
158 {
159 if ( f instanceof StatisticsReportingArtifactFilter )
160 {
161 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
162
163 if ( strictFiltering && sFilter.hasMissedCriteria() )
164 {
165 throw new InvalidAssemblerConfigurationException(
166 "One or more filters had unmatched criteria. Check debug log for more information." );
167 }
168 }
169 }
170 }
171
172 public static void reportFilteringStatistics( final Collection<ArtifactFilter> filters, final Logger logger )
173 {
174 for ( final ArtifactFilter f : filters )
175 {
176 if ( f instanceof StatisticsReportingArtifactFilter )
177 {
178 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
179
180 if ( logger.isDebugEnabled() )
181 {
182 logger.debug( "Statistics for " + sFilter + "\n" );
183 }
184
185 sFilter.reportMissedCriteria( logger );
186 sFilter.reportFilteredArtifacts( logger );
187 }
188 }
189 }
190
191 }