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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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"


Reply via email to