View Javadoc
1   package org.apache.maven.shared.artifact.filter.resolve.transform;
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.Collection;
24  import java.util.List;
25  import java.util.regex.Matcher;
26  import java.util.regex.Pattern;
27  
28  import org.apache.maven.shared.artifact.filter.resolve.AbstractFilter;
29  import org.apache.maven.shared.artifact.filter.resolve.AndFilter;
30  import org.apache.maven.shared.artifact.filter.resolve.ExclusionsFilter;
31  import org.apache.maven.shared.artifact.filter.resolve.FilterTransformer;
32  import org.apache.maven.shared.artifact.filter.resolve.OrFilter;
33  import org.apache.maven.shared.artifact.filter.resolve.PatternExclusionsFilter;
34  import org.apache.maven.shared.artifact.filter.resolve.PatternInclusionsFilter;
35  import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter;
36  import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter;
37  import org.sonatype.aether.graph.DependencyFilter;
38  import org.sonatype.aether.graph.DependencyNode;
39  import org.sonatype.aether.util.filter.AndDependencyFilter;
40  import org.sonatype.aether.util.filter.ExclusionsDependencyFilter;
41  import org.sonatype.aether.util.filter.OrDependencyFilter;
42  import org.sonatype.aether.util.filter.PatternExclusionsDependencyFilter;
43  import org.sonatype.aether.util.filter.PatternInclusionsDependencyFilter;
44  import org.sonatype.aether.util.filter.ScopeDependencyFilter;
45  
46  /**
47   * FilterTransformer implementation for Sonatype Aether
48   * 
49   * @deprecated update to Maven 3.1.0 or later and replace Sonatype Aether with Eclipse Aether
50   * @author Robert Scholte  
51   * @since 3.0
52   */
53  @Deprecated
54  public class SonatypeAetherFilterTransformer
55      implements FilterTransformer<DependencyFilter>
56  {
57      /**
58       * When using as regular expression, group(1) + group(3) will be the coordinate, 
59       * group(2) will be the classifier.
60       */
61      private static final String GAE_C_V = "(.*:.*:.*):(.+)(:.*)";
62      
63      @Override
64      public AndDependencyFilter transform( AndFilter filter )
65      {
66          Collection<DependencyFilter> filters = new ArrayList<>( filter.getFilters().size() );
67          for ( TransformableFilter dependencyFilter : filter.getFilters() )
68          {
69              filters.add( dependencyFilter.transform( this ) );
70          }
71          return new AndDependencyFilter( filters );
72      }
73  
74      @Override
75      public ExclusionsDependencyFilter transform( ExclusionsFilter filter )
76      {
77          return new ExclusionsDependencyFilter( filter.getExcludes() );
78      }
79      
80      @Override
81      public OrDependencyFilter transform( OrFilter filter )
82      {
83          Collection<DependencyFilter> filters = new ArrayList<>( filter.getFilters().size() );
84          for ( TransformableFilter dependencyFilter : filter.getFilters() )
85          {
86              filters.add( dependencyFilter.transform( this ) );
87          }
88          return new OrDependencyFilter( filters );
89      }
90      
91      @Override
92      public ScopeDependencyFilter transform( ScopeFilter filter )
93      {
94          return new ScopeDependencyFilter( filter.getIncluded(), filter.getExcluded() );
95      }
96      
97      @Override
98      public DependencyFilter transform( PatternExclusionsFilter filter )
99      {
100         return new PatternExclusionsDependencyFilter( filter.getExcludes() );
101     }
102     
103     @Override
104     public DependencyFilter transform( PatternInclusionsFilter filter )
105     {
106      // if any include contains a classifier:
107         // split all includes and make it an or-filter for every include
108         // for the classifier, add an and-filter with a classifierfilter and patterninclusionfilter
109         
110         for ( String include : filter.getIncludes() )
111         {
112             if ( include.matches( GAE_C_V ) )
113             {
114                 return newAdvancedPatternInclusionFilter( filter.getIncludes() );
115             }
116         }
117         
118         return new PatternInclusionsDependencyFilter( filter.getIncludes() );
119     }
120     
121     @Override
122     public DependencyFilter transform( final AbstractFilter filter )
123     {
124         return new DependencyFilter()
125         {
126             @Override
127             public boolean accept( DependencyNode node, List<DependencyNode> parents )
128             {
129                 return filter.accept( new SonatypeAetherNode( node ), null );
130             }
131         };
132     }
133     
134     private DependencyFilter newAdvancedPatternInclusionFilter( Collection<String> includes )
135     {
136         List<DependencyFilter> filters = new ArrayList<>( includes.size() );
137 
138         Pattern pattern = Pattern.compile( GAE_C_V );
139         for ( String include : includes )
140         {
141             Matcher matcher = pattern.matcher( include );
142             if ( matcher.matches() )
143             {
144                 DependencyFilter patternFilter =
145                     new PatternInclusionsDependencyFilter( matcher.group( 1 ) + matcher.group( 3 ) );
146 
147                 final String classifier = matcher.group( 2 );
148                 
149                 DependencyFilter classifierFilter = new DependencyFilter()
150                 {
151                     @Override
152                     public boolean accept( DependencyNode node, List<DependencyNode> parents )
153                     {
154                         String nodeClassifier = node.getDependency().getArtifact().getClassifier();
155                         
156                         if ( nodeClassifier == null )
157                         {
158                             return false;
159                         }
160                         else 
161                         {
162                             return "*".equals( classifier ) || nodeClassifier.matches( classifier );
163                         }
164                     }
165                 };
166 
167                 filters.add( new AndDependencyFilter( patternFilter, classifierFilter ) );
168             }
169             else
170             {
171                 filters.add( new PatternInclusionsDependencyFilter( include ) );
172             }
173         }
174         return new OrDependencyFilter( filters );
175     }
176 }