You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ke...@apache.org on 2007/01/17 01:46:50 UTC

svn commit: r496904 - in /maven/components/trunk/maven-embedder/src: main/java/org/apache/maven/embedder/ test/extensions/ test/extensions/META-INF/ test/extensions/META-INF/plexus/ test/java/org/apache/maven/embedder/ test/resources/META-INF/ test/res...

Author: kenney
Date: Tue Jan 16 16:46:49 2007
New Revision: 496904

URL: http://svn.apache.org/viewvc?view=rev&rev=496904
Log:
Implemented embedder extensions. You can register a set of URLs that
are scanned for components, after the container is started, that
will override any core components defined.

o Updated (Default)MavenEmbedRequest with a getter/setter for the extension list;

o Updated the MavenEmbedder to scan the extensions.

o Added testcase: dummy component implementation and components.xml to specify
  the override. 
  
o Also added pom.properties since running unit tests in an IDE
  will fail because the pom.properties is generated only inside the archive,
  and with project references inside the IDE that resource is not available.


Added:
    maven/components/trunk/maven-embedder/src/test/extensions/
    maven/components/trunk/maven-embedder/src/test/extensions/META-INF/
    maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/
    maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/components.xml   (with props)
    maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/CustomArtifactFactory.java   (with props)
    maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/TestComponentOverride.java   (with props)
    maven/components/trunk/maven-embedder/src/test/resources/META-INF/
    maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/
    maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/
    maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/
    maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties   (with props)
Modified:
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/DefaultMavenEmbedRequest.java
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedRequest.java
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/DefaultMavenEmbedRequest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/DefaultMavenEmbedRequest.java?view=diff&rev=496904&r1=496903&r2=496904
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/DefaultMavenEmbedRequest.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/DefaultMavenEmbedRequest.java Tue Jan 16 16:46:49 2007
@@ -46,6 +46,11 @@
     private Properties systemProperties;
 
     /**
+     * List<URL>.
+     */
+    private List extensions = new ArrayList();
+
+    /**
      * Creates a new instance of DefaultMavenEmbedRequest
      */
     public DefaultMavenEmbedRequest()
@@ -138,4 +143,13 @@
         return systemProperties != null ? systemProperties : System.getProperties();
     }
 
+    public void addExtension( URL url )
+    {
+        extensions.add( url );
+    }
+
+    public List getExtensions()
+    {
+        return extensions;
+    }
 }

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedRequest.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedRequest.java?view=diff&rev=496904&r1=496903&r2=496904
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedRequest.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedRequest.java Tue Jan 16 16:46:49 2007
@@ -79,4 +79,8 @@
     ContainerCustomizer getContainerCustomizer();
 
     Properties getSystemProperties();
+
+    void addExtension( URL url );
+
+    List getExtensions();
 }

Modified: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java?view=diff&rev=496904&r1=496903&r2=496904
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java (original)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder.java Tue Jan 16 16:46:49 2007
@@ -20,9 +20,9 @@
 import org.apache.maven.MavenTools;
 import org.apache.maven.SettingsConfigurationException;
 import org.apache.maven.artifact.Artifact;
+import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.handler.ArtifactHandler;
 import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager;
-import org.apache.maven.artifact.factory.ArtifactFactory;
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
@@ -37,8 +37,8 @@
 import org.apache.maven.execution.MavenExecutionResult;
 import org.apache.maven.lifecycle.LifecycleExecutor;
 import org.apache.maven.model.Model;
-import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.apache.maven.model.io.jdom.MavenJDOMWriter;
+import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
 import org.apache.maven.plugin.descriptor.PluginDescriptorBuilder;
 import org.apache.maven.profiles.DefaultProfileManager;
 import org.apache.maven.profiles.ProfileManager;
@@ -47,13 +47,16 @@
 import org.apache.maven.project.ProjectBuildingException;
 import org.apache.maven.settings.Settings;
 import org.codehaus.plexus.DefaultPlexusContainer;
-import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.MutablePlexusContainer;
 import org.codehaus.plexus.PlexusContainerException;
 import org.codehaus.plexus.classworlds.ClassWorld;
 import org.codehaus.plexus.classworlds.realm.ClassRealm;
+import org.codehaus.plexus.classworlds.realm.DuplicateRealmException;
+import org.codehaus.plexus.classworlds.realm.NoSuchRealmException;
 import org.codehaus.plexus.component.repository.ComponentDescriptor;
 import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.component.repository.exception.ComponentRepositoryException;
 import org.codehaus.plexus.configuration.PlexusConfiguration;
 import org.codehaus.plexus.configuration.PlexusConfigurationException;
 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
@@ -62,8 +65,10 @@
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.Writer;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -73,7 +78,7 @@
  */
 public class MavenEmbedder
 {
-    private PlexusContainer container;
+    private MutablePlexusContainer container;
 
     // ----------------------------------------------------------------------
     // Components
@@ -420,7 +425,7 @@
         {
             throw new MavenEmbedderException( "Error starting Maven embedder.", e );
         }
-        
+
         if ( logger != null )
         {
             MavenEmbedderLoggerManager loggerManager =
@@ -436,6 +441,8 @@
                 req.getContainerCustomizer().customize( container );
             }
 
+            handleExtensions( req.getExtensions() );
+
             // ----------------------------------------------------------------------
             // Lookup each of the components we need to provide the desired
             // client interface.
@@ -497,6 +504,45 @@
     // ----------------------------------------------------------------------
     // Lifecycle
     // ----------------------------------------------------------------------
+
+    private void handleExtensions( List extensions )
+        throws MavenEmbedderException
+    {
+        ClassRealm childRealm;
+        try
+        {
+            childRealm = container.getContainerRealm().createChildRealm( "embedder-extensions" );
+        }
+        catch ( DuplicateRealmException e1 )
+        {
+            try
+            {
+                childRealm = classWorld.getRealm( "embedder-extensions" );
+            }
+            catch ( NoSuchRealmException e )
+            {
+                throw new MavenEmbedderException( "Cannot create realm 'extensions'", e );
+            }
+        }
+
+        for ( Iterator it = extensions.iterator(); it.hasNext(); )
+        {
+            childRealm.addURL( (URL) it.next() );
+        }
+
+        try
+        {
+            container.discoverComponents( childRealm, true );
+        }
+        catch ( PlexusConfigurationException e )
+        {
+            throw new MavenEmbedderException( "Configuration error while discovering extension components", e );
+        }
+        catch ( ComponentRepositoryException e )
+        {
+            throw new MavenEmbedderException( "Component repository error while discovering extension components", e );
+        }
+    }
 
     public void stop()
         throws MavenEmbedderException

Added: maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/components.xml
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/components.xml?view=auto&rev=496904
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/components.xml (added)
+++ maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/components.xml Tue Jan 16 16:46:49 2007
@@ -0,0 +1,8 @@
+<component-set>
+  <components>
+    <component>
+      <role>org.apache.maven.artifact.factory.ArtifactFactory</role>
+      <implementation>org.apache.maven.embedder.CustomArtifactFactory</implementation>
+    </component>
+  </components>
+</component-set>
\ No newline at end of file

Propchange: maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-embedder/src/test/extensions/META-INF/plexus/components.xml
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"

Added: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/CustomArtifactFactory.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/CustomArtifactFactory.java?view=auto&rev=496904
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/CustomArtifactFactory.java (added)
+++ maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/CustomArtifactFactory.java Tue Jan 16 16:46:49 2007
@@ -0,0 +1,14 @@
+package org.apache.maven.embedder;
+
+import org.apache.maven.artifact.factory.DefaultArtifactFactory;
+
+/**
+ *
+ * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
+ *
+ */
+public class CustomArtifactFactory
+    extends DefaultArtifactFactory
+{
+
+}

Propchange: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/CustomArtifactFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

Added: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/TestComponentOverride.java
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/TestComponentOverride.java?view=auto&rev=496904
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/TestComponentOverride.java (added)
+++ maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/TestComponentOverride.java Tue Jan 16 16:46:49 2007
@@ -0,0 +1,61 @@
+package org.apache.maven.embedder;
+
+import org.apache.maven.artifact.factory.ArtifactFactory;
+import org.codehaus.plexus.PlexusContainer;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+
+import java.io.File;
+
+import junit.framework.TestCase;
+
+/**
+ *
+ * @author <a href="mailto:kenney@apache.org">Kenney Westerhof</a>
+ *
+ */
+public class TestComponentOverride
+    extends TestCase
+{
+    private String basedir;
+
+    private MavenEmbedder maven;
+
+    protected PlexusContainer container;
+
+    protected void setUp()
+        throws Exception
+    {
+        basedir = System.getProperty( "basedir" );
+
+        maven = new MavenEmbedder( Thread.currentThread().getContextClassLoader(), new MavenEmbedderConsoleLogger() );
+
+        MavenEmbedRequest request = new DefaultMavenEmbedRequest();
+
+        request.addExtension( new File( basedir, "src/test/extensions" ).toURI().toURL() );
+
+        // register callback to get a hold of the container
+        request.setConfigurationCustomizer( new ContainerCustomizer()
+        {
+            public void customize( PlexusContainer container )
+            {
+                TestComponentOverride.this.container = container;
+            }
+        } );
+
+        maven.start( request );
+    }
+
+    public void testComponentOverride()
+        throws ComponentLookupException
+    {
+        ArtifactFactory factory = (ArtifactFactory) container.lookup( ArtifactFactory.class );
+
+        assertNotNull( factory );
+
+        assertTrue( "Expecting " + CustomArtifactFactory.class.getName() + " but was " + factory.getClass().getName(),
+                    CustomArtifactFactory.class.isAssignableFrom( factory.getClass() ) );
+
+        // test wheter the requirement is injected - if not, it nullpointers
+        factory.createArtifact( "testGroupId", "testArtifactId", "testVersion", "compile", "jar" );
+    }
+}

Propchange: maven/components/trunk/maven-embedder/src/test/java/org/apache/maven/embedder/TestComponentOverride.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

Added: maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties
URL: http://svn.apache.org/viewvc/maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties?view=auto&rev=496904
==============================================================================
--- maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties (added)
+++ maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties Tue Jan 16 16:46:49 2007
@@ -0,0 +1 @@
+version=2.1-SNAPSHOT
\ No newline at end of file

Propchange: maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: maven/components/trunk/maven-embedder/src/test/resources/META-INF/maven/org.apache.maven/maven-core/pom.properties
------------------------------------------------------------------------------
    svn:keywords = "Author Date Id Revision"