You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jd...@apache.org on 2007/10/25 06:04:05 UTC

svn commit: r588136 - in /maven/components/trunk/maven-core/src: main/java/org/apache/maven/extension/ test/java/org/apache/maven/execution/

Author: jdcasey
Date: Wed Oct 24 21:04:04 2007
New Revision: 588136

URL: http://svn.apache.org/viewvc?rev=588136&view=rev
Log:
Adding a couple unit tests for the project-level session, and fixing potential NPE when an extension is declared that already exists in the core distribution.

Added:
    maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/
    maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/MavenProjectSessionTest.java   (with props)
Modified:
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
    maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManagerException.java

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java?rev=588136&r1=588135&r2=588136&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/DefaultExtensionManager.java Wed Oct 24 21:04:04 2007
@@ -28,8 +28,7 @@
 import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
 import org.apache.maven.artifact.metadata.ResolutionGroup;
 import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionRequest;
 import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
 import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.artifact.resolver.filter.ArtifactFilter;
@@ -65,9 +64,8 @@
 
 import java.net.MalformedURLException;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
 import java.util.Iterator;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -207,11 +205,19 @@
             projectSessions.put( projectId, projectSession );
         }
 
-        // if the extension is null, or if it's already been added to the current project-session, skip it.
-        if ( ( extensionArtifact != null ) && !projectSession.containsExtensionRealm( extensionArtifact ) )
+        ArtifactFilter coreFilter = artifactFilterManager.getArtifactFilter();
+
+        // if the extension is null,
+        // if it's already been added to the current project-session,
+        // or if it's excluded by the core filter,
+        //
+        // skip it.
+        if ( ( extensionArtifact != null )
+             && !projectSession.containsExtensionRealm( extensionArtifact )
+             && coreFilter.include( extensionArtifact ) )
         {
             ArtifactFilter filter =
-                new ProjectArtifactExceptionFilter( artifactFilterManager.getArtifactFilter(), projectArtifact );
+                new ProjectArtifactExceptionFilter( coreFilter, projectArtifact );
 
             ResolutionGroup resolutionGroup;
 
@@ -229,25 +235,32 @@
             // not declare plexus-utils but need it. MNG-2900
             DefaultPluginManager.checkPlexusUtils( resolutionGroup, artifactFactory );
 
-            Set dependencies = new HashSet( resolutionGroup.getArtifacts() );
+            Set dependencies = new LinkedHashSet();
 
             dependencies.add( extensionArtifact );
+            dependencies.addAll( resolutionGroup.getArtifacts() );
+
+            ArtifactResolutionRequest dependencyReq = new ArtifactResolutionRequest().setArtifact( projectArtifact )
+                                                                           .setArtifactDependencies( dependencies )
+                                                                           .setFilter( filter )
+                                                                           .setLocalRepository( localRepository )
+                                                                           .setRemoteRepostories( remoteRepositories )
+                                                                           .setMetadataSource( artifactMetadataSource );
 
             // TODO: Make this work with managed dependencies, or an analogous management section in the POM.
-            ArtifactResolutionResult result;
-            try
-            {
-                result = artifactResolver.resolveTransitively( dependencies, projectArtifact,
-                                                      Collections.EMPTY_MAP, localRepository, remoteRepositories,
-                                                      artifactMetadataSource, filter );
-            }
-            catch ( ArtifactResolutionException e )
+            ArtifactResolutionResult result = artifactResolver.resolve( dependencyReq );
+
+            if ( result.hasCircularDependencyExceptions() || result.hasErrorArtifactExceptions()
+                 || result.hasMetadataResolutionExceptions() || result.hasVersionRangeViolations() )
             {
-                throw new ExtensionManagerException( "Unable to resolve one or more extension artifacts for: " + extensionArtifact.getId(), extensionArtifact, projectId, e );
+                throw new ExtensionManagerException( "Failed to resolve extension: " + extensionArtifact, extensionArtifact, projectId, result );
             }
-            catch ( ArtifactNotFoundException e )
+
+            Set resultArtifacts = result.getArtifacts();
+
+            if ( !extensionArtifact.isResolved() || ( extensionArtifact.getFile() == null ) )
             {
-                throw new ExtensionManagerException( "One or more extension artifacts is missing for: " + extensionArtifact.getId(), extensionArtifact, projectId, e );
+                throw new ExtensionManagerException( "Extension artifact was not resolved, or has no file associated with it.", extensionArtifact, projectId );
             }
 
             ClassRealm extensionRealm;
@@ -260,7 +273,7 @@
                 throw new ExtensionManagerException( "Unable to create extension ClassRealm for extension: " + extensionArtifact.getId() + " within session for project: " + projectId, extensionArtifact, projectId, e );
             }
 
-            for ( Iterator i = result.getArtifacts().iterator(); i.hasNext(); )
+            for ( Iterator i = resultArtifacts.iterator(); i.hasNext(); )
             {
                 Artifact a = (Artifact) i.next();
 

Modified: maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManagerException.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManagerException.java?rev=588136&r1=588135&r2=588136&view=diff
==============================================================================
--- maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManagerException.java (original)
+++ maven/components/trunk/maven-core/src/main/java/org/apache/maven/extension/ExtensionManagerException.java Wed Oct 24 21:04:04 2007
@@ -2,8 +2,7 @@
 
 import org.apache.maven.artifact.Artifact;
 import org.apache.maven.artifact.metadata.ArtifactMetadataRetrievalException;
-import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
-import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolutionResult;
 import org.codehaus.plexus.PlexusContainerException;
 import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
 import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
@@ -18,6 +17,7 @@
 
     private Artifact extensionArtifact;
     private final String projectId;
+    private ArtifactResolutionResult resolutionResult;
 
     public ExtensionManagerException( String message,
                                       Artifact extensionArtifact,
@@ -42,7 +42,7 @@
     public ExtensionManagerException( String message,
                                       Artifact extensionArtifact,
                                       String projectId,
-                                      ArtifactResolutionException cause )
+                                      MalformedURLException cause )
     {
         super( message, cause );
         this.extensionArtifact = extensionArtifact;
@@ -52,7 +52,7 @@
     public ExtensionManagerException( String message,
                                       Artifact extensionArtifact,
                                       String projectId,
-                                      ArtifactNotFoundException cause )
+                                      PlexusConfigurationException cause )
     {
         super( message, cause );
         this.extensionArtifact = extensionArtifact;
@@ -60,19 +60,17 @@
     }
 
     public ExtensionManagerException( String message,
-                                      Artifact extensionArtifact,
                                       String projectId,
-                                      MalformedURLException cause )
+                                      DuplicateRealmException cause )
     {
         super( message, cause );
-        this.extensionArtifact = extensionArtifact;
         this.projectId = projectId;
     }
 
     public ExtensionManagerException( String message,
                                       Artifact extensionArtifact,
                                       String projectId,
-                                      PlexusConfigurationException cause )
+                                      NoSuchRealmException cause )
     {
         super( message, cause );
         this.extensionArtifact = extensionArtifact;
@@ -81,7 +79,7 @@
 
     public ExtensionManagerException( String message,
                                       String projectId,
-                                      DuplicateRealmException cause )
+                                      PlexusContainerException cause )
     {
         super( message, cause );
         this.projectId = projectId;
@@ -90,7 +88,7 @@
     public ExtensionManagerException( String message,
                                       Artifact extensionArtifact,
                                       String projectId,
-                                      NoSuchRealmException cause )
+                                      ComponentRepositoryException cause )
     {
         super( message, cause );
         this.extensionArtifact = extensionArtifact;
@@ -98,21 +96,23 @@
     }
 
     public ExtensionManagerException( String message,
-                                      String projectId,
-                                      PlexusContainerException cause )
+                                      Artifact extensionArtifact,
+                                      String projectId )
     {
-        super( message, cause );
+        super( message );
+        this.extensionArtifact = extensionArtifact;
         this.projectId = projectId;
     }
 
     public ExtensionManagerException( String message,
                                       Artifact extensionArtifact,
                                       String projectId,
-                                      ComponentRepositoryException cause )
+                                      ArtifactResolutionResult result )
     {
-        super( message, cause );
+        super( message );
         this.extensionArtifact = extensionArtifact;
         this.projectId = projectId;
+        resolutionResult = result;
     }
 
     public Artifact getExtensionArtifact()
@@ -123,6 +123,11 @@
     public String getProjectId()
     {
         return projectId;
+    }
+
+    public ArtifactResolutionResult getArtifactResolutionResult()
+    {
+        return resolutionResult;
     }
 
 }

Added: maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/MavenProjectSessionTest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/MavenProjectSessionTest.java?rev=588136&view=auto
==============================================================================
--- maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/MavenProjectSessionTest.java (added)
+++ maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/MavenProjectSessionTest.java Wed Oct 24 21:04:04 2007
@@ -0,0 +1,164 @@
+package org.apache.maven.execution;
+
+import org.apache.maven.artifact.Artifact;
+import org.codehaus.plexus.PlexusContainerException;
+import org.codehaus.plexus.PlexusTestCase;
+import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
+import org.easymock.MockControl;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+public class MavenProjectSessionTest
+    extends PlexusTestCase
+{
+
+    private Set mockControls = new HashSet();
+
+    private void replay()
+    {
+        for ( Iterator it = mockControls.iterator(); it.hasNext(); )
+        {
+            MockControl ctl = (MockControl) it.next();
+            ctl.replay();
+        }
+    }
+
+    private void verify()
+    {
+        for ( Iterator it = mockControls.iterator(); it.hasNext(); )
+        {
+            MockControl ctl = (MockControl) it.next();
+            ctl.verify();
+        }
+    }
+
+    public void testAddExtensionRealmThenContainsExtensionRealm_ReturnTrue()
+        throws PlexusContainerException
+    {
+        String projectId = "org.test:test-project1:1";
+
+        MavenProjectSession session = new MavenProjectSession( projectId, getContainer() );
+
+        ArtifactMock extMock = new ArtifactMock( "org.test.dep", "ext1", "2" );
+
+        replay();
+
+        try
+        {
+            session.createExtensionRealm( extMock.artifact );
+        }
+        catch ( DuplicateRealmException e )
+        {
+            e.printStackTrace();
+
+            fail( "ClassRealm for extension should not exist yet." );
+        }
+
+        assertTrue( "Should return true for containsExtensionRealm after extension is added.", session.containsExtensionRealm( extMock.artifact ) );
+
+        verify();
+    }
+
+    public void testConstructDisposeConstruct_OneExtension_NoDuplicateRealmException()
+        throws PlexusContainerException
+    {
+        String projectId = "org.test:test-project1:1";
+
+        MavenProjectSession session = new MavenProjectSession( projectId, getContainer() );
+
+        ArtifactMock extMock = new ArtifactMock( "org.test.dep", "ext1", "2" );
+
+        replay();
+
+        try
+        {
+            session.createExtensionRealm( extMock.artifact );
+        }
+        catch ( DuplicateRealmException e )
+        {
+            e.printStackTrace();
+
+            fail( "ClassRealm for extension should not exist yet." );
+        }
+
+        session.dispose();
+
+        session = new MavenProjectSession( projectId, getContainer() );
+
+        try
+        {
+            session.createExtensionRealm( extMock.artifact );
+        }
+        catch ( DuplicateRealmException e )
+        {
+            e.printStackTrace();
+
+            fail( "Should have disposed ClassRealm for extension." );
+        }
+
+        verify();
+    }
+
+    public void testAddSameExtensionTwice_DuplicateRealmException()
+        throws PlexusContainerException
+    {
+        String projectId = "org.test:test-project1:1";
+
+        MavenProjectSession session = new MavenProjectSession( projectId, getContainer() );
+
+        ArtifactMock extMock = new ArtifactMock( "org.test.dep", "ext1", "2" );
+
+        replay();
+
+        try
+        {
+            session.createExtensionRealm( extMock.artifact );
+        }
+        catch ( DuplicateRealmException e )
+        {
+            e.printStackTrace();
+
+            fail( "ClassRealm for extension should not exist yet." );
+        }
+
+        try
+        {
+            session.createExtensionRealm( extMock.artifact );
+            fail( "Should not allow same extension to be added twice." );
+        }
+        catch ( DuplicateRealmException e )
+        {
+        }
+
+        verify();
+    }
+
+    private class ArtifactMock
+    {
+        private MockControl ctl;
+
+        private Artifact artifact;
+
+        public ArtifactMock( String groupId,
+                             String artifactId,
+                             String version )
+        {
+            ctl = MockControl.createControl( Artifact.class );
+            artifact = (Artifact) ctl.getMock();
+
+            artifact.getGroupId();
+            ctl.setReturnValue( groupId, MockControl.ZERO_OR_MORE );
+
+            artifact.getArtifactId();
+            ctl.setReturnValue( artifactId, MockControl.ZERO_OR_MORE );
+
+            artifact.getVersion();
+            ctl.setReturnValue( version, MockControl.ZERO_OR_MORE );
+
+            mockControls.add( ctl );
+        }
+    }
+
+}

Propchange: maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/MavenProjectSessionTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-core/src/test/java/org/apache/maven/execution/MavenProjectSessionTest.java
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"