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.List;
36  import java.util.Set;
37  
38  /**
39   * @version $Id: FilterUtils.java 1517906 2013-08-27 18:25:03Z krosenvold $
40   */
41  public final class FilterUtils
42  {
43  
44      private FilterUtils()
45      {
46      }
47  
48      public static void filterProjects( final Set<MavenProject> projects, final List<String> includes,
49                                         final List<String> excludes, final boolean actTransitively, final Logger logger )
50      {
51          final List<PatternIncludesArtifactFilter> allFilters = new ArrayList<PatternIncludesArtifactFilter>();
52  
53          final AndArtifactFilter filter = new AndArtifactFilter();
54  
55          if ( !includes.isEmpty() )
56          {
57              final PatternIncludesArtifactFilter includeFilter =
58                  new PatternIncludesArtifactFilter( includes, actTransitively );
59  
60              filter.add( includeFilter );
61              allFilters.add( includeFilter );
62          }
63          if ( !excludes.isEmpty() )
64          {
65              final PatternExcludesArtifactFilter excludeFilter =
66                  new PatternExcludesArtifactFilter( excludes, actTransitively );
67  
68              filter.add( excludeFilter );
69              allFilters.add( excludeFilter );
70          }
71  
72          for ( final Iterator<MavenProject> it = projects.iterator(); it.hasNext(); )
73          {
74              final MavenProject project = it.next();
75              final Artifact artifact = project.getArtifact();
76  
77              if ( !filter.include( artifact ) )
78              {
79                  it.remove();
80              }
81          }
82  
83          for (final PatternIncludesArtifactFilter f : allFilters) {
84              if (f != null) {
85                  f.reportMissedCriteria(logger);
86              }
87          }
88      }
89  
90      public static void filterArtifacts( final Set<Artifact> artifacts, final List<String> includes,
91                                          final List<String> excludes, final boolean strictFiltering,
92                                          final boolean actTransitively, final Logger logger,
93                                          final ArtifactFilter... additionalFilters )
94          throws InvalidAssemblerConfigurationException
95      {
96          final List<ArtifactFilter> allFilters = new ArrayList<ArtifactFilter>();
97  
98          final AndArtifactFilter filter = new AndArtifactFilter();
99  
100         if ( additionalFilters != null && additionalFilters.length > 0 )
101         {
102             for ( final ArtifactFilter additionalFilter : additionalFilters )
103             {
104                 if ( additionalFilter != null )
105                 {
106                     filter.add( additionalFilter );
107                 }
108             }
109         }
110 
111         if ( !includes.isEmpty() )
112         {
113             final ArtifactFilter includeFilter = new PatternIncludesArtifactFilter( includes, actTransitively );
114 
115             filter.add( includeFilter );
116 
117             allFilters.add( includeFilter );
118         }
119 
120         if ( !excludes.isEmpty() )
121         {
122             final ArtifactFilter excludeFilter = new PatternExcludesArtifactFilter( excludes, actTransitively );
123 
124             filter.add( excludeFilter );
125 
126             allFilters.add( excludeFilter );
127         }
128 
129         // FIXME: Why is this added twice??
130         // if ( additionalFilters != null && !additionalFilters.isEmpty() )
131         // {
132         // allFilters.addAll( additionalFilters );
133         // }
134 
135         for ( final Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
136         {
137             final Artifact artifact = it.next();
138 
139             if ( !filter.include( artifact ) )
140             {
141                 it.remove();
142 
143                 if ( logger.isDebugEnabled() )
144                 {
145                     logger.debug( artifact.getId() + " was removed by one or more filters." );
146                 }
147             }
148         }
149 
150         reportFilteringStatistics( allFilters, logger );
151 
152         for (final ArtifactFilter f : allFilters) {
153             if (f instanceof StatisticsReportingArtifactFilter) {
154                 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
155 
156                 if (strictFiltering && sFilter.hasMissedCriteria()) {
157                     throw new InvalidAssemblerConfigurationException(
158                             "One or more filters had unmatched criteria. Check debug log for more information.");
159                 }
160             }
161         }
162     }
163 
164     public static void reportFilteringStatistics( final Collection<ArtifactFilter> filters, final Logger logger )
165     {
166         for (final ArtifactFilter f : filters) {
167             if (f instanceof StatisticsReportingArtifactFilter) {
168                 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
169 
170                 if (logger.isDebugEnabled()) {
171                     logger.debug("Statistics for " + sFilter + "\n");
172                 }
173 
174                 sFilter.reportMissedCriteria(logger);
175                 sFilter.reportFilteredArtifacts(logger);
176             }
177         }
178     }
179 
180 }