View Javadoc
1   package org.apache.maven.plugins.assembly.utils;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
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         // FIXME: Why is this added twice??
139         // if ( additionalFilters != null && !additionalFilters.isEmpty() )
140         // {
141         // allFilters.addAll( additionalFilters );
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      * Results in a filter including the rootScope and its transitive scopes 
197      * 
198      * @param rootScope the root scope
199      * @return the filter
200      */
201     public static ScopeFilter newScopeFilter( final String rootScope )
202     {
203         return newScopeFilter( Collections.singleton( rootScope ) );
204     }
205     
206     /**
207      * Results in a filter including all rootScopes and their transitive scopes 
208      * 
209      * @param rootScopes all root scopes
210      * @return the filter
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 }