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 999612 2010-09-21 20:34:50Z jdcasey $
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 Iterator<PatternIncludesArtifactFilter> it = allFilters.iterator(); it.hasNext(); )
84          {
85              final ArtifactFilter f = it.next();
86  
87              if ( f instanceof StatisticsReportingArtifactFilter )
88              {
89                  ( (StatisticsReportingArtifactFilter) f ).reportMissedCriteria( logger );
90              }
91          }
92      }
93  
94      public static void filterArtifacts( final Set<Artifact> artifacts, final List<String> includes,
95                                          final List<String> excludes, final boolean strictFiltering,
96                                          final boolean actTransitively, final Logger logger,
97                                          final ArtifactFilter... additionalFilters )
98          throws InvalidAssemblerConfigurationException
99      {
100         final List<ArtifactFilter> allFilters = new ArrayList<ArtifactFilter>();
101 
102         final AndArtifactFilter filter = new AndArtifactFilter();
103 
104         if ( additionalFilters != null && additionalFilters.length > 0 )
105         {
106             for ( final ArtifactFilter additionalFilter : additionalFilters )
107             {
108                 if ( additionalFilter != null )
109                 {
110                     filter.add( additionalFilter );
111                 }
112             }
113         }
114 
115         if ( !includes.isEmpty() )
116         {
117             final ArtifactFilter includeFilter = new PatternIncludesArtifactFilter( includes, actTransitively );
118 
119             filter.add( includeFilter );
120 
121             allFilters.add( includeFilter );
122         }
123 
124         if ( !excludes.isEmpty() )
125         {
126             final ArtifactFilter excludeFilter = new PatternExcludesArtifactFilter( excludes, actTransitively );
127 
128             filter.add( excludeFilter );
129 
130             allFilters.add( excludeFilter );
131         }
132 
133         // FIXME: Why is this added twice??
134         // if ( additionalFilters != null && !additionalFilters.isEmpty() )
135         // {
136         // allFilters.addAll( additionalFilters );
137         // }
138 
139         for ( final Iterator<Artifact> it = artifacts.iterator(); it.hasNext(); )
140         {
141             final Artifact artifact = it.next();
142 
143             if ( !filter.include( artifact ) )
144             {
145                 it.remove();
146 
147                 if ( logger.isDebugEnabled() )
148                 {
149                     logger.debug( artifact.getId() + " was removed by one or more filters." );
150                 }
151             }
152         }
153 
154         reportFilteringStatistics( allFilters, logger );
155 
156         for ( final Iterator<ArtifactFilter> it = allFilters.iterator(); it.hasNext(); )
157         {
158             final ArtifactFilter f = it.next();
159 
160             if ( f instanceof StatisticsReportingArtifactFilter )
161             {
162                 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
163 
164                 if ( strictFiltering && sFilter.hasMissedCriteria() )
165                 {
166                     throw new InvalidAssemblerConfigurationException(
167                                                                       "One or more filters had unmatched criteria. Check debug log for more information." );
168                 }
169             }
170         }
171     }
172 
173     public static void reportFilteringStatistics( final Collection<ArtifactFilter> filters, final Logger logger )
174     {
175         for ( final Iterator<ArtifactFilter> it = filters.iterator(); it.hasNext(); )
176         {
177             final ArtifactFilter f = it.next();
178 
179             if ( f instanceof StatisticsReportingArtifactFilter )
180             {
181                 final StatisticsReportingArtifactFilter sFilter = (StatisticsReportingArtifactFilter) f;
182 
183                 if ( logger.isDebugEnabled() )
184                 {
185                     logger.debug( "Statistics for " + sFilter + "\n" );
186                 }
187 
188                 sFilter.reportMissedCriteria( logger );
189                 sFilter.reportFilteredArtifacts( logger );
190             }
191         }
192     }
193 
194 }