Author: bentmann
Date: Sat May  9 18:33:08 2009
New Revision: 773258

URL: http://svn.apache.org/viewvc?rev=773258&view=rev
Log:
o Fixed scope handling during transitive dependency resolution

Added:
    
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
   (with props)
Modified:
    
maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
    
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
    
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
    
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java

Modified: 
maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java?rev=773258&r1=773257&r2=773258&view=diff
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
 (original)
+++ 
maven/components/branches/MNG-2766/maven-compat/src/main/java/org/apache/maven/artifact/resolver/DefaultArtifactResolver.java
 Sat May  9 18:33:08 2009
@@ -382,7 +382,7 @@
             }
             catch ( ComponentLookupException e )
             {
-                // Won't happen
+                throw new IllegalStateException( "Failed to lookup metadata 
source implementation", e );
             }
         }
         

Modified: 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java?rev=773258&r1=773257&r2=773258&view=diff
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
 (original)
+++ 
maven/components/branches/MNG-2766/maven-core/src/main/java/org/apache/maven/project/artifact/MavenMetadataSource.java
 Sat May  9 18:33:08 2009
@@ -17,6 +17,7 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -30,10 +31,9 @@
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadata;
 import org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager;
 import 
org.apache.maven.artifact.repository.metadata.RepositoryMetadataResolutionException;
-import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
-import org.apache.maven.artifact.resolver.filter.ScopeArtifactFilter;
 import org.apache.maven.artifact.versioning.ArtifactVersion;
 import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
+import org.apache.maven.model.Dependency;
 import org.apache.maven.project.DefaultProjectBuilderConfiguration;
 import org.apache.maven.project.MavenProject;
 import org.apache.maven.project.MavenProjectBuilder;
@@ -87,20 +87,22 @@
             project = projectBuilder.buildFromRepository( pomArtifact, 
configuration );
 
             if ( !artifact.getArtifactHandler().isIncludesDependencies() )
-            {                
-                ArtifactFilter filter;
-                if ( artifact.getScope() == null )
-                {
-                    filter = null;
-                }
-                else
+            {
+                artifacts = new LinkedHashSet<Artifact>();
+
+                for ( Dependency d : project.getDependencies() )
                 {
-                    filter = new ScopeArtifactFilter( artifact.getScope() );
+                    String effectiveScope = getEffectiveScope( d.getScope(), 
artifact.getScope() );
+
+                    if ( effectiveScope != null )
+                    {
+                        Artifact dependencyArtifact =
+                            repositorySystem.createArtifact( d.getGroupId(), 
d.getArtifactId(), d.getVersion(),
+                                                             effectiveScope, 
d.getType() );
+
+                        artifacts.add( dependencyArtifact );
+                    }
                 }
-                                
-                artifacts = project.createArtifacts( filter );
-                
-                project.setArtifacts( artifacts );                
             }
         }
         catch ( ProjectBuildingException e )
@@ -114,6 +116,47 @@
         return new ResolutionGroup( pomArtifact, artifacts, remoteRepositories 
);
     }
 
+    private String getEffectiveScope( String originalScope, String 
inheritedScope )
+    {
+        String effectiveScope = Artifact.SCOPE_RUNTIME;
+
+        if ( originalScope == null )
+        {
+            originalScope = Artifact.SCOPE_COMPILE;
+        }
+
+        if ( inheritedScope == null )
+        {
+            // direct dependency retains its scope
+            effectiveScope = originalScope;
+        }
+        else if ( Artifact.SCOPE_TEST.equals( originalScope ) || 
Artifact.SCOPE_PROVIDED.equals( originalScope ) )
+        {
+            // test and provided are not transitive, so exclude them
+            effectiveScope = null;
+        }
+        else if ( Artifact.SCOPE_SYSTEM.equals( originalScope ) )
+        {
+            // system scope come through unchanged...
+            effectiveScope = Artifact.SCOPE_SYSTEM;
+        }
+        else if ( Artifact.SCOPE_COMPILE.equals( originalScope ) && 
Artifact.SCOPE_COMPILE.equals( inheritedScope ) )
+        {
+            // added to retain compile scope. Remove if you want compile 
inherited as runtime
+            effectiveScope = Artifact.SCOPE_COMPILE;
+        }
+        else if ( Artifact.SCOPE_TEST.equals( inheritedScope ) )
+        {
+            effectiveScope = Artifact.SCOPE_TEST;
+        }
+        else if ( Artifact.SCOPE_PROVIDED.equals( inheritedScope ) )
+        {
+            effectiveScope = Artifact.SCOPE_PROVIDED;
+        }
+
+        return effectiveScope;
+    }
+
     public List<ArtifactVersion> retrieveAvailableVersions( Artifact artifact, 
ArtifactRepository localRepository, List<ArtifactRepository> remoteRepositories 
)
         throws ArtifactMetadataRetrievalException
     {
@@ -166,4 +209,5 @@
 
         return versions;
     }
+
 }

Modified: 
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java?rev=773258&r1=773257&r2=773258&view=diff
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
 (original)
+++ 
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/AbstractMavenProjectTestCase.java
 Sat May  9 18:33:08 2009
@@ -79,8 +79,8 @@
         return markerFile.getAbsoluteFile().getParentFile();
     }
 
-    protected File getFileForClasspathResource( String resource )
-        throws FileNotFoundException, URISyntaxException
+    protected static File getFileForClasspathResource( String resource )
+        throws FileNotFoundException
     {
         ClassLoader cloader = Thread.currentThread().getContextClassLoader();
 
@@ -91,7 +91,7 @@
             throw new FileNotFoundException( "Unable to find: " + resource );
         }
 
-        return new File( new URI( resourceUrl.toString().replaceAll( " ", 
"%20" ) ) );
+        return new File( URI.create( resourceUrl.toString().replaceAll( " ", 
"%20" ) ) );
     }
 
     protected ArtifactRepository getLocalRepository()

Modified: 
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java?rev=773258&r1=773257&r2=773258&view=diff
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java
 (original)
+++ 
maven/components/branches/MNG-2766/maven-core/src/test/java/org/apache/maven/project/ProjectClasspathTest.java
 Sat May  9 18:33:08 2009
@@ -20,26 +20,39 @@
  */
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.util.Iterator;
+import java.util.List;
 
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
+import org.apache.maven.artifact.metadata.ResolutionGroup;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.project.artifact.MavenMetadataSource;
 
 public class ProjectClasspathTest
     extends AbstractMavenProjectTestCase
 {
-    private String dir = "projects/scope/";
-    
-    public void setUp() throws Exception 
-    {
-               super.setUp();
-               projectBuilder = lookup(MavenProjectBuilder.class, "test");
-       }
-    
+    private static final String dir = "projects/scope/";
+
+    public void setUp()
+        throws Exception
+    {
+        super.setUp();
+        projectBuilder = lookup( MavenProjectBuilder.class, "default" );
+    }
+
+    @Override
+    protected String getCustomConfigurationName()
+    {
+        return null;
+    }
+
     public void testProjectClasspath()
         throws Exception
     {
         File f = getFileForClasspathResource( dir + 
"project-with-scoped-dependencies.xml" );
-        
+
         MavenProject project = getProjectWithDependencies( f );
 
         Artifact artifact;
@@ -59,8 +72,8 @@
         assertNull( "Check no test dependencies are transitive", artifact );
 
         artifact = getArtifact( project, "maven-test-test", "scope-compile" );
-        assertNotNull(artifact);
-        
+        assertNotNull( artifact );
+
         System.out.println( "a = " + artifact );
         System.out.println( "b = " + artifact.getScope() );
         assertEquals( "Check scope", "test", artifact.getScope() );
@@ -107,23 +120,72 @@
     {
         String artifactId = "scope-" + scope;
         Artifact artifact = getArtifact( project, "maven-test", artifactId );
+        assertNotNull( artifact );
         assertEquals( "Check scope", scopeValue, artifact.getScope() );
     }
 
     private Artifact getArtifact( MavenProject project, String groupId, String 
artifactId )
-    {  
-       System.out.println( "[ Looking for " + groupId + ":" + artifactId + " 
]");
-        for ( Iterator i = project.getArtifacts().iterator(); i.hasNext(); )
+    {
+        System.out.println( "[ Looking for " + groupId + ":" + artifactId + " 
]" );
+        for ( Iterator<Artifact> i = project.getArtifacts().iterator(); 
i.hasNext(); )
         {
-            Artifact a = (Artifact) i.next();
-            System.out.println(a.toString());
+            Artifact a = i.next();
+            System.out.println( a.toString() );
             if ( artifactId.equals( a.getArtifactId() ) && 
a.getGroupId().equals( groupId ) )
             {
-                System.out.println("RETURN");
+                System.out.println( "RETURN" );
                 return a;
             }
         }
-        System.out.println("Return null");
+        System.out.println( "Return null" );
         return null;
     }
+
+    public static class TestMavenProjectBuilder
+        extends DefaultMavenProjectBuilder
+    {
+
+        @Override
+        public MavenProject buildFromRepository( Artifact artifact, 
ProjectBuilderConfiguration configuration )
+            throws ProjectBuildingException
+        {
+            if ( "maven-test".equals( artifact.getGroupId() ) )
+            {
+                String scope = artifact.getArtifactId().substring( 
"scope-".length() );
+                try
+                {
+                    artifact.setFile( getFileForClasspathResource( dir + 
"transitive-" + scope + "-dep.xml" ) );
+                }
+                catch ( FileNotFoundException e )
+                {
+                    throw new IllegalStateException( "Missing test POM for " + 
artifact );
+                }
+            }
+            if ( artifact.getFile() == null )
+            {
+                return new MavenProject();
+            }
+            return build( artifact.getFile(), configuration );
+        }
+    }
+
+    public static class MetadataSource
+        extends MavenMetadataSource
+    {
+
+        @Override
+        public ResolutionGroup retrieve( Artifact artifact, ArtifactRepository 
localRepository,
+                                         List<ArtifactRepository> 
remoteRepositories )
+            throws ArtifactMetadataRetrievalException
+        {
+            ResolutionGroup rg = super.retrieve( artifact, localRepository, 
remoteRepositories );
+            for ( Artifact a : rg.getArtifacts() )
+            {
+                a.setResolved( true );
+            }
+            return rg;
+        }
+
+    }
+
 }

Added: 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
URL: 
http://svn.apache.org/viewvc/maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml?rev=773258&view=auto
==============================================================================
--- 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
 (added)
+++ 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
 Sat May  9 18:33:08 2009
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plexus>
+  <components>
+    <component>
+      <role>org.apache.maven.project.MavenProjectBuilder</role>
+      <role-hint>default</role-hint>
+      
<implementation>org.apache.maven.project.ProjectClasspathTest$TestMavenProjectBuilder</implementation>
+      <isolated-realm>false</isolated-realm>
+      <requirements>
+        <requirement>
+          <role>org.codehaus.plexus.logging.Logger</role>
+          <role-hint>default</role-hint>
+          <field-name>logger</field-name>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.project.validation.ModelValidator</role>
+          <role-hint>default</role-hint>
+          <field-name>validator</field-name>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.lifecycle.LifecycleExecutor</role>
+          <role-hint>default</role-hint>
+          <field-name>lifecycle</field-name>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.repository.RepositorySystem</role>
+          <role-hint>default</role-hint>
+          <field-name>repositorySystem</field-name>
+        </requirement>
+        <requirement>
+          <role>java.util.List</role>
+          <field-name>listeners</field-name>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.model.interpolator.Interpolator</role>
+          <role-hint>default</role-hint>
+          <field-name>interpolator</field-name>
+        </requirement>
+        <requirement>
+          
<role>org.apache.maven.artifact.resolver.ResolutionErrorHandler</role>
+          <role-hint>default</role-hint>
+          <field-name>resolutionErrorHandler</field-name>
+        </requirement>
+      </requirements>
+    </component>
+    <component>
+      <role>org.apache.maven.artifact.metadata.ArtifactMetadataSource</role>
+      <role-hint>default</role-hint>
+      
<implementation>org.apache.maven.project.ProjectClasspathTest$MetadataSource</implementation>
+      <requirements>
+        <requirement>
+          
<role>org.apache.maven.artifact.repository.metadata.RepositoryMetadataManager</role>
+          <role-hint>default</role-hint>
+          <field-name>repositoryMetadataManager</field-name>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.repository.RepositorySystem</role>
+          <role-hint>default</role-hint>
+          <field-name>repositorySystem</field-name>
+        </requirement>
+        <requirement>
+          <role>org.apache.maven.project.MavenProjectBuilder</role>
+          <role-hint>default</role-hint>
+          <field-name>projectBuilder</field-name>
+        </requirement>
+        <requirement>
+          <role>org.codehaus.plexus.logging.Logger</role>
+          <role-hint>default</role-hint>
+          <field-name>logger</field-name>
+        </requirement>
+      </requirements>
+    </component>
+    <component>
+      <role>org.apache.maven.lifecycle.LifecycleExecutor</role>
+      
<implementation>org.apache.maven.project.EmptyLifecycleExecutor</implementation>
+    </component>
+  </components>
+</plexus>

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: 
maven/components/branches/MNG-2766/maven-core/src/test/resources/org/apache/maven/project/ProjectClasspathTest.xml
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision


Reply via email to