You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by jv...@apache.org on 2006/02/22 04:55:45 UTC

svn commit: r379670 - /maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder2.java

Author: jvanzyl
Date: Tue Feb 21 19:55:43 2006
New Revision: 379670

URL: http://svn.apache.org/viewcvs?rev=379670&view=rev
Log:
o adding jochen's MavenEmbedder2 as reference, i won't be replacing the embedder with it but I will cherry pick
  from it. Thanks for the contribution and I hope you'll help with some smaller patches! :-)

Added:
    maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder2.java   (with props)

Added: maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder2.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder2.java?rev=379670&view=auto
==============================================================================
--- maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder2.java (added)
+++ maven/components/trunk/maven-embedder/src/main/java/org/apache/maven/embedder/MavenEmbedder2.java Tue Feb 21 19:55:43 2006
@@ -0,0 +1,588 @@
+/*
+ * Copyright (c) 2006 Your Corporation. All Rights Reserved.
+ */
+package org.apache.maven.embedder;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.apache.maven.Maven;
+import org.apache.maven.SettingsConfigurationException;
+import org.apache.maven.artifact.manager.WagonManager;
+import org.apache.maven.artifact.repository.ArtifactRepository;
+import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
+import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
+import org.apache.maven.artifact.repository.DefaultArtifactRepository;
+import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
+import org.apache.maven.cli.BatchModeDownloadMonitor;
+import org.apache.maven.cli.ConsoleDownloadMonitor;
+import org.apache.maven.execution.DefaultMavenExecutionRequest;
+import org.apache.maven.execution.MavenExecutionRequest;
+import org.apache.maven.execution.ReactorManager;
+import org.apache.maven.monitor.event.DefaultEventDispatcher;
+import org.apache.maven.monitor.event.DefaultEventMonitor;
+import org.apache.maven.monitor.event.EventDispatcher;
+import org.apache.maven.plugin.Mojo;
+import org.apache.maven.profiles.DefaultProfileManager;
+import org.apache.maven.profiles.ProfileManager;
+import org.apache.maven.reactor.MavenExecutionException;
+import org.apache.maven.settings.MavenSettingsBuilder;
+import org.apache.maven.settings.RuntimeInfo;
+import org.apache.maven.settings.Settings;
+import org.codehaus.plexus.PlexusContainerException;
+import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
+import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
+import org.codehaus.plexus.embed.Embedder;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.logging.LoggerManager;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+
+
+/** Replacement for the {@link MavenEmbedder}.
+ */
+public class MavenEmbedder2 {
+	private final MavenEmbedderLogger logger;
+
+	private Embedder embedder;
+
+	private boolean debug, showErrors, batchMode, suppressPluginRegistry;
+	private boolean forcePluginUpdates, forcePluginUpdates2;
+	private boolean suppressPluginUpdates, offline, updateSnapshots;
+	private boolean checksumFailurePolicy, checksumWarningPolicy;
+	private boolean nonRecursive, failFast, failAtEnd, failNever;
+	private boolean reactor;
+	private String activateProfiles;
+	private Properties executionProperties;
+	private File userSettingsFile, alternatePomFile;
+
+	/** Creates a new instance with the given logger.
+	 */
+	public MavenEmbedder2(MavenEmbedderLogger pLogger) {
+		logger = pLogger;
+	}
+
+	/** Returns, whether debugging mode is on.
+	 */
+	public boolean isDebug() {
+		return debug;
+	}
+
+	/** Sets, whether debugging mode is on.
+	 */
+	public void setDebug(boolean pDebug) {
+		debug = pDebug;
+	}
+
+	/** Returns, whether stack traces are being shown.
+	 */
+	public boolean isShowErrors() {
+		return showErrors;
+	}
+
+	/** Sets, whether stack traces are being shown.
+	 */
+	public void setShowErrors(boolean pShowErrors) {
+		showErrors = pShowErrors;
+	}
+
+	/** Returns the set of predefined properties.
+	 */
+	public Properties getExecutionProperties() {
+		return executionProperties;
+	}
+
+	/** Sets the set of predefined properties.
+	 */
+	public void setExecutionProperties(Properties pExecutionProperties) {
+		executionProperties = pExecutionProperties;
+	}
+
+	/** Returns the location of an alternate file with
+	 * user settings.
+	 */
+	public File getUserSettingsFile() {
+		return userSettingsFile;
+	}
+
+	/** Sets the location of an alternate file with
+	 * user settings.
+	 */
+	public void setUserSettingsFile(File pUserSettingsPath) {
+		userSettingsFile = pUserSettingsPath;
+	}
+
+	/** Returns, whether batch mode is on.
+	 */
+	public boolean isBatchMode() {
+		return batchMode;
+	}
+
+	/** Sets, whether batch mode is on.
+	 */
+	public void setBatchMode(boolean pBatchMode) {
+		batchMode = pBatchMode;
+	}
+
+	/** Returns, whether the plugin registry is being suppressed.
+	 */
+	public boolean isSuppressPluginRegistry() {
+		return suppressPluginRegistry;
+	}
+
+	/** Sets, whether the plugin registry is being suppressed.
+	 */
+	public void setSuppressPluginRegistry(boolean pSuppressPluginRegistry) {
+		suppressPluginRegistry = pSuppressPluginRegistry;
+	}
+
+	/** Returns, whether plugin updates are being forced.
+	 */
+	public boolean isForcePluginUpdates() {
+		return forcePluginUpdates;
+	}
+
+	/** Sets, whether plugin updates are being forced.
+	 */
+	public void setForcePluginUpdates(boolean pForcePluginUpdates) {
+		forcePluginUpdates = pForcePluginUpdates;
+	}
+
+	/** Returns, whether plugin updates are being forced2.
+	 */
+	public boolean isForcePluginUpdates2() {
+		return forcePluginUpdates2;
+	}
+
+	/** Sets, whether plugin updates are being forced2.
+	 */
+	public void setForcePluginUpdates2(boolean pForcePluginUpdates2) {
+		forcePluginUpdates2 = pForcePluginUpdates2;
+	}
+
+	/** Returns a definition of profiles, which are being
+	 * activated.
+	 */
+    public String getActivateProfiles() {
+		return activateProfiles;
+	}
+
+    /** Sets a definition of profiles, which are being
+	 * activated.
+	 */
+	public void setActivateProfiles(String pActivateProfiles) {
+		activateProfiles = pActivateProfiles;
+	}
+
+	/** Returns, whether offline mode is enabled.
+	 */
+	public boolean isOffline() {
+		return offline;
+	}
+
+	/** Sets, whether offline mode is enabled.
+	 */
+	public void setOffline(boolean pOffline) {
+		offline = pOffline;
+	}
+
+	/** Returns, whether snapshots are being updated.
+	 */
+	public boolean isUpdateSnapshots() {
+		return updateSnapshots;
+	}
+
+	/** Sets, whether snapshots are being updated.
+	 */
+	public void setUpdateSnapshots(boolean pUpdateSnapshots) {
+		updateSnapshots = pUpdateSnapshots;
+	}
+
+	/** Returns, whether wrong checksums are considered a
+	 * failure.
+	 */
+	public boolean isChecksumFailurePolicy() {
+		return checksumFailurePolicy;
+	}
+
+	/** Sets, whether wrong checksums are considered a
+	 * failure.
+	 */
+	public void setChecksumFailurePolicy(boolean pChecksumFailurePolicy) {
+		checksumFailurePolicy = pChecksumFailurePolicy;
+	}
+
+	/** Returns, whether wrong checksums are considered a
+	 * warning.
+	 */
+	public boolean isChecksumWarningPolicy() {
+		return checksumWarningPolicy;
+	}
+
+	/** Sets, whether wrong checksums are considered a
+	 * warning.
+	 */
+	public void setChecksumWarningPolicy(boolean pChecksumWarningPolicy) {
+		checksumWarningPolicy = pChecksumWarningPolicy;
+	}
+
+	/** Returns, whether calling submodules is disabled.
+	 */
+	public boolean isNonRecursive() {
+		return nonRecursive;
+	}
+
+	/** Sets, whether calling submodules is disabled.
+	 */
+	public void setNonRecursive(boolean pNonRecursive) {
+		nonRecursive = pNonRecursive;
+	}
+
+	/** Returns, whether failures will abort the program.
+	 */
+	public boolean isFailFast() {
+		return failFast;
+	}
+
+	/** Sets, whether failures will abort the program.
+	 */
+	public void setFailFast(boolean pFailFast) {
+		failFast = pFailFast;
+	}
+
+	/** Returns, whether failures are reported at the end.
+	 */
+	public boolean isFailAtEnd() {
+		return failAtEnd;
+	}
+
+	/** Sets, whether failures are reported at the end.
+	 */
+	public void setFailAtEnd(boolean pFailAtEnd) {
+		failAtEnd = pFailAtEnd;
+	}
+
+	/** Returns, whether failures are suppressed.
+	 */
+	public boolean isFailNever() {
+		return failNever;
+	}
+
+	/** Sets, whether failures are suppressed.
+	 */
+	public void setFailNever(boolean pFailNever) {
+		failNever = pFailNever;
+	}
+
+	/** Returns, whether the reactor is on.
+	 */
+	public boolean isReactor() {
+		return reactor;
+	}
+
+	/** Sets, whether the reactor is on.
+	 */
+	public void setReactor(boolean pReactor) {
+		reactor = pReactor;
+	}
+
+	/** Returns the location of an alternate POM file.
+	 */
+	public File getAlternatePomFile() {
+		return alternatePomFile;
+	}
+
+	/** Sets the location of an alternate POM file.
+	 */
+	public void setAlternatePomFile(File pAlternatePomFile) {
+		alternatePomFile = pAlternatePomFile;
+	}
+
+	/** Returns, whether plugin updates are being suppressed.
+	 */
+    public boolean isSuppressPluginUpdates() {
+		return suppressPluginUpdates;
+	}
+
+	/** Sets, whether plugin updates are being suppressed.
+	 */
+	public void setSuppressPluginUpdates(boolean pSuppressPluginUpdates) {
+		suppressPluginUpdates = pSuppressPluginUpdates;
+	}
+
+	private Settings buildSettings()
+    	throws ComponentLookupException, SettingsConfigurationException
+	{
+
+    	Settings settings = null;
+
+    	MavenSettingsBuilder settingsBuilder = (MavenSettingsBuilder) embedder.lookup( MavenSettingsBuilder.ROLE );
+
+    	try
+    	{
+    		if ( userSettingsFile != null )
+    		{
+
+    			if ( userSettingsFile.exists() && !userSettingsFile.isDirectory() )
+    			{
+    				settings = settingsBuilder.buildSettings( userSettingsFile );
+    			}
+    			else
+    			{
+    				logger.warn( "WARNING: Alternate user settings file: " + userSettingsFile +
+                    	" is invalid. Using default path." );
+    			}
+    		}
+
+    		if ( settings == null )
+    		{
+    			settings = settingsBuilder.buildSettings();
+    		}
+    	}
+    	catch ( IOException e )
+    	{
+    		throw new SettingsConfigurationException( "Error reading settings file", e );
+    	}
+    	catch ( XmlPullParserException e )
+    	{
+    		throw new SettingsConfigurationException( e.getMessage(), e.getDetail(), e.getLineNumber(),
+    												  e.getColumnNumber() );
+    	}
+
+    	// why aren't these part of the runtime info? jvz.
+
+    	if ( isBatchMode() )
+    	{
+    		settings.setInteractiveMode( false );
+    	}
+
+    	if ( isSuppressPluginRegistry() )
+    	{
+    		settings.setUsePluginRegistry( false );
+    	}
+
+    	// Create settings runtime info
+
+    	settings.setRuntimeInfo( createRuntimeInfo( settings ) );
+
+    	return settings;
+	}
+
+    private RuntimeInfo createRuntimeInfo( Settings settings )
+    {
+        RuntimeInfo runtimeInfo = new RuntimeInfo( settings );
+
+        if ( isForcePluginUpdates() || isForcePluginUpdates2() )
+        {
+            runtimeInfo.setPluginUpdateOverride( Boolean.TRUE );
+        }
+        else if ( isSuppressPluginUpdates() )
+        {
+            runtimeInfo.setPluginUpdateOverride( Boolean.FALSE );
+        }
+
+        return runtimeInfo;
+    }
+
+    /** Executes the given set of goals in the given
+     * directory.
+     */
+	public void execute( String[] pGoals, File pBaseDir )
+		throws PlexusContainerException, ComponentLookupException,
+		SettingsConfigurationException, MavenExecutionException
+	{
+        embedder = new Embedder();
+        EventDispatcher eventDispatcher = new DefaultEventDispatcher();
+        embedder.start();
+
+        Settings settings = buildSettings();
+
+        Maven maven = null;
+        MavenExecutionRequest request = null;
+        final LoggerManager loggerManager;
+
+        // logger must be created first
+        loggerManager = (LoggerManager) embedder.lookup( LoggerManager.ROLE );
+
+        try {
+        	if ( debug )
+        	{
+        		loggerManager.setThreshold( Logger.LEVEL_DEBUG );
+        	}
+        	
+        	ProfileManager profileManager = new DefaultProfileManager( embedder.getContainer() );
+        	
+        	String profilesLine = getActivateProfiles();
+        	if ( profilesLine != null )
+        	{
+        		StringTokenizer profileTokens = new StringTokenizer( profilesLine, "," );
+        		
+        		while ( profileTokens.hasMoreTokens() )
+        		{
+        			String profileAction = profileTokens.nextToken().trim();
+        			
+        			if ( profileAction.startsWith( "-" ) )
+        			{
+        				profileManager.explicitlyDeactivate( profileAction.substring( 1 ) );
+        			}
+        			else if ( profileAction.startsWith( "+" ) )
+        			{
+        				profileManager.explicitlyActivate( profileAction.substring( 1 ) );
+        			}
+        			else
+        			{
+        				// TODO: deprecate this eventually!
+        				profileManager.explicitlyActivate( profileAction );
+        			}
+        		}
+        	}
+        	
+        	request = createRequest( settings, pGoals, eventDispatcher,
+        			loggerManager, profileManager, pBaseDir );
+        	
+        	setProjectFileOptions( request );
+        	
+        	maven = createMavenInstance( settings.isInteractiveMode() );
+        }
+        finally
+        {
+        	try
+        	{
+        		embedder.release( loggerManager );
+        	}
+        	catch ( ComponentLifecycleException e )
+        	{
+        		logger.fatalError( "Error releasing logging manager", e );
+        	}
+        }
+
+        maven.execute( request );
+	}
+
+
+    private MavenExecutionRequest createRequest( Settings settings, String[] goals,
+                                                 EventDispatcher eventDispatcher, LoggerManager loggerManager,
+                                                 ProfileManager profileManager,
+                                                 File baseDir)
+        throws ComponentLookupException
+    {
+        MavenExecutionRequest request;
+
+        ArtifactRepository localRepository = createLocalRepository( settings );
+
+        request = new DefaultMavenExecutionRequest( localRepository, settings, eventDispatcher,
+                                                    Arrays.asList(goals), baseDir.getPath(), profileManager,
+                                                    executionProperties, showErrors );
+
+        // TODO [BP]: do we set one per mojo? where to do it?
+        Logger log = loggerManager.getLoggerForComponent( Mojo.ROLE );
+
+        if ( log != null )
+        {
+            request.addEventMonitor( new DefaultEventMonitor( log ) );
+        }
+
+        if ( isNonRecursive() )
+        {
+            request.setRecursive( false );
+        }
+
+        if ( isFailFast() )
+        {
+            request.setFailureBehavior( ReactorManager.FAIL_FAST );
+        }
+        else if ( isFailAtEnd() )
+        {
+            request.setFailureBehavior( ReactorManager.FAIL_AT_END );
+        }
+        else if ( isFailNever() )
+        {
+            request.setFailureBehavior( ReactorManager.FAIL_NEVER );
+        }
+
+        return request;
+    }
+
+    private void setProjectFileOptions( MavenExecutionRequest request )
+    {
+        if ( isReactor() )
+        {
+            request.setReactorActive( true );
+        }
+        else if ( getAlternatePomFile() != null )
+        {
+            request.setPomFile( getAlternatePomFile().getPath() );
+        }
+    }
+
+    private Maven createMavenInstance( boolean interactive )
+        throws ComponentLookupException
+    {
+        // TODO [BP]: doing this here as it is CLI specific, though it doesn't feel like the right place (likewise logger).
+        WagonManager wagonManager = (WagonManager) embedder.lookup( WagonManager.ROLE );
+        if ( interactive )
+        {
+            wagonManager.setDownloadMonitor( new ConsoleDownloadMonitor() );
+        }
+        else
+        {
+            wagonManager.setDownloadMonitor( new BatchModeDownloadMonitor() );
+        }
+
+        wagonManager.setInteractive( interactive );
+
+        return (Maven) embedder.lookup( Maven.ROLE );
+    }
+
+    private ArtifactRepository createLocalRepository( Settings settings )
+        throws ComponentLookupException
+    {
+        // TODO: release
+        // TODO: something in plexus to show all active hooks?
+        ArtifactRepositoryLayout repositoryLayout =
+            (ArtifactRepositoryLayout) embedder.lookup( ArtifactRepositoryLayout.ROLE, "default" );
+
+        ArtifactRepositoryFactory artifactRepositoryFactory =
+            (ArtifactRepositoryFactory) embedder.lookup( ArtifactRepositoryFactory.ROLE );
+
+        String url = settings.getLocalRepository();
+
+        if ( !url.startsWith( "file:" ) )
+        {
+            url = "file://" + url;
+        }
+
+        ArtifactRepository localRepository = new DefaultArtifactRepository( "local", url, repositoryLayout );
+
+        boolean snapshotPolicySet = false;
+
+        if ( isOffline() )
+        {
+            settings.setOffline( true );
+
+            snapshotPolicySet = true;
+        }
+
+        if ( !snapshotPolicySet && isUpdateSnapshots() )
+        {
+            artifactRepositoryFactory.setGlobalUpdatePolicy( ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS );
+        }
+
+        if ( isChecksumFailurePolicy() )
+        {
+        	logger.info( "+ Enabling strict checksum verification on all artifact downloads." );
+
+            artifactRepositoryFactory.setGlobalChecksumPolicy( ArtifactRepositoryPolicy.CHECKSUM_POLICY_FAIL );
+        }
+        else if ( isChecksumWarningPolicy() )
+        {
+            System.out.println( "+ Disabling strict checksum verification on all artifact downloads." );
+
+            artifactRepositoryFactory.setGlobalChecksumPolicy( ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN );
+        }
+
+        return localRepository;
+    }
+}

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

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