You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by be...@apache.org on 2009/05/09 20:33:08 UTC

svn commit: r773258 - in /maven/components/branches/MNG-2766: maven-compat/src/main/java/org/apache/maven/artifact/resolver/ maven-core/src/main/java/org/apache/maven/project/artifact/ maven-core/src/test/java/org/apache/maven/project/ maven-core/src/t...

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