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"