View Javadoc
1   package org.apache.maven.plugin.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 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   * @version $Id: FilterUtils.java 1639422 2014-11-13 18:08:07Z krosenvold $
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         // FIXME: Why is this added twice??
135         // if ( additionalFilters != null && !additionalFilters.isEmpty() )
136         // {
137         // allFilters.addAll( additionalFilters );
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 }