1 package org.apache.maven.shared.artifact.filter.resolve.transform;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
48
49
50
51
52
53 @Deprecated
54 public class SonatypeAetherFilterTransformer
55 implements FilterTransformer<DependencyFilter>
56 {
57
58
59
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
107
108
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 }