Introduce ArtifactIncludeFilterTransformer

git-svn-id: https://svn.apache.org/repos/asf/maven/shared/trunk@1689732 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java b/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java
index b0d82ae..0dddb7b 100644
--- a/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java
+++ b/src/main/java/org/apache/maven/shared/artifact/filter/PatternExcludesArtifactFilter.java
@@ -19,7 +19,7 @@
  * under the License.
  */
 
-import java.util.List;
+import java.util.Collection;
 
 import org.apache.maven.artifact.Artifact;
 
@@ -32,12 +32,12 @@
 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 );
     }
diff --git a/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java b/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java
index e8bf919..0f33982 100644
--- a/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java
+++ b/src/main/java/org/apache/maven/shared/artifact/filter/PatternIncludesArtifactFilter.java
@@ -20,6 +20,7 @@
  */
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -51,12 +52,12 @@
 
     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>();
diff --git a/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java b/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java
new file mode 100644
index 0000000..a4ccace
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformer.java
@@ -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" );

+    }

+}

diff --git a/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java b/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java
new file mode 100644
index 0000000..fe3e2fe
--- /dev/null
+++ b/src/test/java/org/apache/maven/shared/artifact/filter/resolve/transform/ArtifactIncludeFilterTransformerTest.java
@@ -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 );

+    }

+

+}