Author: rfscholte Date: Tue Jul 7 20:26:14 2015 New Revision: 1689732 URL: http://svn.apache.org/r1689732 Log: Introduce ArtifactIncludeFilterTransformer
Added: maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java maven/shared/trunk/maven-common-artifact-filters/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java Modified: maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java Modified: maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java?rev=1689732&r1=1689731&r2=1689732&view=diff ============================================================================== --- maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java (original) +++ maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java Tue Jul 7 20:26:14 2015 @@ -19,7 +19,7 @@ package org.apache.maven.shared.artifact * under the License. */ -import java.util.List; +import java.util.Collection; import org.apache.maven.artifact.Artifact; @@ -32,12 +32,12 @@ import org.apache.maven.artifact.Artifac public class PatternExcludesArtifactFilter extends PatternIncludesArtifactFilter { - public PatternExcludesArtifactFilter( List<String> patterns ) + public PatternExcludesArtifactFilter( Collection<String> patterns ) { super( patterns ); } - public PatternExcludesArtifactFilter( List<String> patterns, boolean actTransitively ) + public PatternExcludesArtifactFilter( Collection<String> patterns, boolean actTransitively ) { super( patterns, actTransitively ); } Modified: maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java?rev=1689732&r1=1689731&r2=1689732&view=diff ============================================================================== --- maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java (original) +++ maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java Tue Jul 7 20:26:14 2015 @@ -20,6 +20,7 @@ package org.apache.maven.shared.artifact */ import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -51,12 +52,12 @@ public class PatternIncludesArtifactFilt private final List<String> filteredArtifactIds = new ArrayList<String>(); - public PatternIncludesArtifactFilter( final List<String> patterns ) + public PatternIncludesArtifactFilter( final Collection<String> patterns ) { this( patterns, false ); } - public PatternIncludesArtifactFilter( final List<String> patterns, final boolean actTransitively ) + public PatternIncludesArtifactFilter( final Collection<String> patterns, final boolean actTransitively ) { this.actTransitively = actTransitively; final List<String> pos = new ArrayList<String>(); Added: maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java?rev=1689732&view=auto ============================================================================== --- maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java (added) +++ maven/shared/trunk/maven-common-artifact-filters/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java Tue Jul 7 20:26:14 2015 @@ -0,0 +1,151 @@ +package org.apache.maven.shared.artifact.filter.resolve.transform; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.ArrayList; +import java.util.Collection; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.resolver.filter.AndArtifactFilter; +import org.apache.maven.artifact.resolver.filter.ArtifactFilter; +import org.apache.maven.artifact.resolver.filter.ExcludesArtifactFilter; +import org.apache.maven.shared.artifact.filter.PatternExcludesArtifactFilter; +import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter; +import org.apache.maven.shared.artifact.filter.resolve.AbstractFilter; +import org.apache.maven.shared.artifact.filter.resolve.AndFilter; +import org.apache.maven.shared.artifact.filter.resolve.ExclusionsFilter; +import org.apache.maven.shared.artifact.filter.resolve.FilterTransformer; +import org.apache.maven.shared.artifact.filter.resolve.OrFilter; +import org.apache.maven.shared.artifact.filter.resolve.PatternExclusionsFilter; +import org.apache.maven.shared.artifact.filter.resolve.PatternInclusionsFilter; +import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter; +import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; + +/** + * Makes it possible to use the TransformableFilters for Aether and as classic Maven ArtifactFilter. + * + * <strong>Note:</strong> the {@link AndFilter} and {@link ExclusionsFilter} are transformed to {@link ArtifactFilter} + * implementations of Maven Core + * + * @author Robert Scholte + * @since 3.0 + */ +public class ArtifactIncludeFilterTransformer implements FilterTransformer<ArtifactFilter> +{ + + @Override + public ArtifactFilter transform( final ScopeFilter scopeFilter ) + { + return new ArtifactFilter() + { + @Override + public boolean include( Artifact artifact ) + { + boolean isIncluded; + + if ( scopeFilter.getIncluded() != null ) + { + isIncluded = scopeFilter.getIncluded().contains( artifact.getScope() ); + } + else + { + isIncluded = true; + } + + boolean isExcluded; + + if ( scopeFilter.getExcluded() != null ) + { + isExcluded = scopeFilter.getExcluded().contains( artifact.getScope() ); + } + else + { + isExcluded = false; + } + + return isIncluded && !isExcluded; + } + }; + } + + @Override + public AndArtifactFilter transform( AndFilter andFilter ) + { + AndArtifactFilter filter = new AndArtifactFilter(); + + for ( TransformableFilter subFilter : andFilter.getFilters() ) + { + filter.add( subFilter.transform( this ) ); + } + + return filter; + } + + @Override + public ArtifactFilter transform( final ExclusionsFilter exclusionsFilter ) + { + return new ExcludesArtifactFilter( new ArrayList<String>( exclusionsFilter.getExcludes() ) ); + } + + @Override + public ArtifactFilter transform( OrFilter orFilter ) + { + final Collection<ArtifactFilter> filters = new ArrayList<ArtifactFilter>( orFilter.getFilters().size() ); + + for ( TransformableFilter subFilter : orFilter.getFilters() ) + { + filters.add( subFilter.transform( this ) ); + } + + return new ArtifactFilter() + { + @Override + public boolean include( Artifact artifact ) + { + for ( ArtifactFilter filter : filters ) + { + if ( filter.include( artifact ) ) + { + return true; + } + } + return false; + } + }; + } + + @Override + public ArtifactFilter transform( PatternExclusionsFilter patternExclusionsFilter ) + { + return new PatternExcludesArtifactFilter( patternExclusionsFilter.getExcludes() ); + } + + @Override + public ArtifactFilter transform( PatternInclusionsFilter patternInclusionsFilter ) + { + return new PatternIncludesArtifactFilter( patternInclusionsFilter.getIncludes() ); + } + + @Override + public ArtifactFilter transform( final AbstractFilter filter ) + { + throw new UnsupportedOperationException( "Not yet implemented" ); + } +} Added: maven/shared/trunk/maven-common-artifact-filters/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java URL: http://svn.apache.org/viewvc/maven/shared/trunk/maven-common-artifact-filters/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java?rev=1689732&view=auto ============================================================================== --- maven/shared/trunk/maven-common-artifact-filters/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java (added) +++ maven/shared/trunk/maven-common-artifact-filters/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java Tue Jul 7 20:26:14 2015 @@ -0,0 +1,162 @@ +package org.apache.maven.shared.artifact.filter.resolve.transform; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import static org.junit.Assert.*; + +import java.util.Arrays; +import java.util.Collections; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.artifact.factory.ArtifactFactory; +import org.apache.maven.artifact.resolver.filter.AndArtifactFilter; +import org.apache.maven.artifact.resolver.filter.ArtifactFilter; +import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter; +import org.apache.maven.plugin.testing.ArtifactStubFactory; +import org.apache.maven.plugin.testing.stubs.ArtifactStub; +import org.apache.maven.plugin.testing.stubs.StubArtifactRepository; +import org.apache.maven.shared.artifact.filter.PatternExcludesArtifactFilter; +import org.apache.maven.shared.artifact.filter.PatternIncludesArtifactFilter; +import org.apache.maven.shared.artifact.filter.resolve.AndFilter; +import org.apache.maven.shared.artifact.filter.resolve.ExclusionsFilter; +import org.apache.maven.shared.artifact.filter.resolve.OrFilter; +import org.apache.maven.shared.artifact.filter.resolve.PatternExclusionsFilter; +import org.apache.maven.shared.artifact.filter.resolve.PatternInclusionsFilter; +import org.apache.maven.shared.artifact.filter.resolve.ScopeFilter; +import org.apache.maven.shared.artifact.filter.resolve.TransformableFilter; +import org.eclipse.aether.artifact.DefaultArtifact; +import org.eclipse.aether.graph.DefaultDependencyNode; +import org.eclipse.aether.graph.Dependency; +import org.eclipse.aether.graph.DependencyNode; +import org.eclipse.aether.util.filter.AndDependencyFilter; +import org.eclipse.aether.util.filter.ExclusionsDependencyFilter; +import org.eclipse.aether.util.filter.OrDependencyFilter; +import org.eclipse.aether.util.filter.PatternExclusionsDependencyFilter; +import org.eclipse.aether.util.filter.PatternInclusionsDependencyFilter; +import org.eclipse.aether.util.filter.ScopeDependencyFilter; +import org.junit.Ignore; +import org.junit.Test; + +public class ArtifactIncludeFilterTransformerTest +{ + + private ArtifactIncludeFilterTransformer transformer = new ArtifactIncludeFilterTransformer(); + + private ArtifactStubFactory artifactFactory = new ArtifactStubFactory(); + + @Test + public void testTransformAndFilter() + throws Exception + { + AndFilter filter = + new AndFilter( + Arrays.<TransformableFilter>asList( ScopeFilter.including( "compile" ), + new ExclusionsFilter( Collections.singletonList( "x:a" ) ) ) ); + + AndArtifactFilter dependencyFilter = (AndArtifactFilter) filter.transform( transformer ); + + assertTrue( dependencyFilter.include( newArtifact( "g:a:v", "compile" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "x:a:v", "compile" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "g:a:v", "test" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "x:a:v", "test" ) ) ); + } + + @Test + public void testTransformExclusionsFilter() + throws Exception + { + ExclusionsFilter filter = new ExclusionsFilter( Collections.singletonList( "x:a" ) ); + + ArtifactFilter dependencyFilter = (ArtifactFilter) filter.transform( transformer ); + + assertTrue( dependencyFilter.include( newArtifact( "g:a:v", "compile" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "x:a:v", "compile" ) ) ); + } + + @Test + public void testTransformOrFilter() + throws Exception + { + OrFilter filter = + new OrFilter( Arrays.<TransformableFilter>asList( ScopeFilter.including( "compile" ), + ScopeFilter.including( "test" ) ) ); + + ArtifactFilter dependencyFilter = (ArtifactFilter) filter.transform( transformer ); + + assertTrue( dependencyFilter.include( newArtifact( "g:a:v", "compile" ) ) ); + + assertTrue( dependencyFilter.include( newArtifact( "g:a:v", "test" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "g:a:v", "runtime" ) ) ); + } + + @Test + public void testTransformScopeFilter() + throws Exception + { + ScopeFilter filter = ScopeFilter.including( Collections.singletonList( "runtime" ) ); + + ArtifactFilter dependencyFilter = (ArtifactFilter) filter.transform( transformer ); + + assertTrue( dependencyFilter.include( newArtifact( "g:a:v", "runtime" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "g:a:v", "compile" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "g:a:v", "test" ) ) ); + } + + @Test + public void testTransformPatternExclusionsFilter() + throws Exception + { + PatternExclusionsFilter filter = new PatternExclusionsFilter( Collections.singletonList( "x:*" ) ); + + PatternExcludesArtifactFilter dependencyFilter = (PatternExcludesArtifactFilter) filter.transform( transformer ); + + assertTrue( dependencyFilter.include( newArtifact( "g:a:v", "runtime" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "x:a:v", "runtime" ) ) ); + } + + @Test + public void testTransformPatternInclusionsFilter() + throws Exception + { + PatternInclusionsFilter filter = new PatternInclusionsFilter( Collections.singletonList( "g:*" ) ); + + PatternIncludesArtifactFilter dependencyFilter = (PatternIncludesArtifactFilter) filter.transform( transformer ); + + assertTrue( dependencyFilter.include( newArtifact( "g:a:v", "runtime" ) ) ); + + assertFalse( dependencyFilter.include( newArtifact( "x:a:v", "runtime" ) ) ); + } + + private Artifact newArtifact( String coor, String scope ) + throws Exception + { + String[] gav = coor.split( ":" ); + return artifactFactory.createArtifact( gav[0], gav[1], gav[2], scope ); + } + +}