1 package org.apache.maven.plugins.assembly.utils;
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.Arrays;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.HashSet;
27 import java.util.Iterator;
28 import java.util.LinkedHashSet;
29 import java.util.List;
30 import java.util.Set;
31
32 import org.apache.maven.artifact.Artifact;
33 import org.apache.maven.artifact.resolver.filter.AndArtifactFilter;
34 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
35 import org.apache.maven.plugins.assembly.InvalidAssemblerConfigurationException;
36 import org.apache.maven.project.MavenProject;
37 import org.apache.maven.shared.artifact.filter.PatternExcludesArtifactFilter;
38 import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter;
39 import org.apache.maven.shared.artifact.filter.StatisticsReportingArtifactFilter;
40 import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter;
41 import org.slf4j.Logger;
42
43
44
45
46 public final class FilterUtils
47 {
48
49 private FilterUtils()
50 {
51 }
52
53 public static Set<MavenProject> filterProjects( final Set<MavenProject> projects, final List<String> includes,
54 final List<String> excludes, final boolean actTransitively,
55 final Logger logger )
56 {
57 final List<PatternIncludesArtifactFilter> allFilters = new ArrayList<>();
58
59 final AndArtifactFilter filter = new AndArtifactFilter();
60
61 if ( !includes.isEmpty() )
62 {
63 final PatternIncludesArtifactFilter includeFilter =
64 new PatternIncludesArtifactFilter( includes, actTransitively );
65
66 filter.add( includeFilter );
67 allFilters.add( includeFilter );
68 }
69 if ( !excludes.isEmpty() )
70 {
71 final PatternExcludesArtifactFilter excludeFilter =
72 new PatternExcludesArtifactFilter( excludes, actTransitively );
73
74 filter.add( excludeFilter );
75 allFilters.add( excludeFilter );
76 }
77
78 Set<MavenProject> result = new LinkedHashSet<>( projects.size() );
79 for ( MavenProject project : projects )
80 {
81 final Artifact artifact = project.getArtifact();
82
83 if ( filter.include( artifact ) )
84 {
85 result.add( project );
86 }
87 }
88
89 for ( final PatternIncludesArtifactFilter f : allFilters )
90 {
91 if ( f != null )
92 {
93 f.reportMissedCriteria( logger );
94 }
95 }
96 return result;
97 }
98
99 public static void filterArtifacts( final Set<Artifact> artifacts, final List<String> includes,
100 final List<String> excludes, final boolean strictFiltering,
101 final boolean actTransitively, final Logger logger,
102 final ArtifactFilter... additionalFilters )
103 throws InvalidAssemblerConfigurationException
104 {
105 final List<ArtifactFilter> allFilters = new ArrayList<>();
106
107 final AndArtifactFilter filter = new AndArtifactFilter();
108
109 if ( additionalFilters != null && additionalFilters.length > 0 )
110 {
111 for ( final ArtifactFilter additionalFilter : additionalFilters )
112 {
113 if ( additionalFilter != null )
114 {
115 filter.add( additionalFilter );
116 }
117 }
118 }
119
120 if ( !includes.isEmpty() )
121 {
122 final ArtifactFilter includeFilter = new PatternIncludesArtifactFilter( includes, actTransitively );
123
124 filter.add( includeFilter );
125
126 allFilters.add( includeFilter );
127 }
128
129 if ( !excludes.isEmpty() )
130 {
131 final ArtifactFilter excludeFilter = new PatternExcludesArtifactFilter( excludes, actTransitively );
132
133 filter.add( excludeFilter );
134
135 allFilters.add( excludeFilter );
136 }
137
138
139
140
141
142
143
144 for ( final Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
145 {
146 final Artifact artifact = it.next();
147
148 if ( !filter.include( artifact ) )
149 {
150 it.remove();
151
152 if ( logger.isDebugEnabled() )
153 {
154 logger.debug( artifact.getId() + " was removed by one or more filters." );
155 }
156 }
157 }
158
159 reportFilteringStatistics( allFilters, logger );
160
161 for ( final ArtifactFilter f : allFilters )
162 {
163 if ( f instanceof StatisticsReportingArtifactFilter )
164 {
165 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
166
167 if ( strictFiltering && sFilter.hasMissedCriteria() )
168 {
169 throw new InvalidAssemblerConfigurationException(
170 "One or more filters had unmatched criteria. Check debug log for more information." );
171 }
172 }
173 }
174 }
175
176 public static void reportFilteringStatistics( final Collection<ArtifactFilter> filters, final Logger logger )
177 {
178 for ( final ArtifactFilter f : filters )
179 {
180 if ( f instanceof StatisticsReportingArtifactFilter )
181 {
182 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
183
184 if ( logger.isDebugEnabled() )
185 {
186 logger.debug( "Statistics for " + sFilter + "\n" );
187 }
188
189 sFilter.reportMissedCriteria( logger );
190 sFilter.reportFilteredArtifacts( logger );
191 }
192 }
193 }
194
195
196
197
198
199
200
201 public static ScopeFilter newScopeFilter( final String rootScope )
202 {
203 return newScopeFilter( Collections.singleton( rootScope ) );
204 }
205
206
207
208
209
210
211
212 public static ScopeFilter newScopeFilter( final Collection<String> rootScopes )
213 {
214 Set<String> scopes = new HashSet<>();
215
216 for ( String rootScope : rootScopes )
217 {
218 if ( Artifact.SCOPE_COMPILE.equals( rootScope ) )
219 {
220 scopes.addAll( Arrays.asList( "compile", "provided", "system" ) );
221 }
222 if ( Artifact.SCOPE_PROVIDED.equals( rootScope ) )
223 {
224 scopes.add( "provided" );
225 }
226 if ( Artifact.SCOPE_RUNTIME.equals( rootScope ) )
227 {
228 scopes.addAll( Arrays.asList( "compile", "runtime" ) );
229 }
230 if ( Artifact.SCOPE_SYSTEM.equals( rootScope ) )
231 {
232 scopes.add( "system" );
233 }
234 if ( Artifact.SCOPE_TEST.equals( rootScope ) )
235 {
236 scopes.addAll( Arrays.asList( "compile", "provided", "runtime", "system", "test" ) );
237 }
238 }
239
240 return ScopeFilter.including( scopes );
241 }
242
243 }