Author: bentmann Date: Thu Dec 16 18:58:54 2010 New Revision: 1050096 URL: http://svn.apache.org/viewvc?rev=1050096&view=rev Log: [MNG-4936] Allow to better monitor and adjust a Maven build during CI
Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/BuildAbort.java (with props) maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/ (with props) maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java (with props) maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java (with props) maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/ (with props) maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java (with props) maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java (with props) maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java (with props) maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/DefaultEventSpyContext.java (with props) Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/AbstractMavenTransferListener.java maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/BatchModeMavenTransferListener.java maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ConsoleMavenTransferListener.java maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/QuietMavenTransferListener.java Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/BuildAbort.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/BuildAbort.java?rev=1050096&view=auto ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/BuildAbort.java (added) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/BuildAbort.java Thu Dec 16 18:58:54 2010 @@ -0,0 +1,39 @@ +package org.apache.maven; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A special throwable used to signal a graceful abort of the build. + */ +public class BuildAbort + extends Error +{ + + public BuildAbort( String message ) + { + super( message ); + } + + public BuildAbort( String message, Throwable cause ) + { + super( message, cause ); + } + +} Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/BuildAbort.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/BuildAbort.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=1050096&r1=1050095&r2=1050096&view=diff ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java (original) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java Thu Dec 16 18:58:54 2010 @@ -33,6 +33,7 @@ import java.util.Properties; import org.apache.maven.artifact.ArtifactUtils; import org.apache.maven.artifact.handler.manager.ArtifactHandlerManager; +import org.apache.maven.eventspy.internal.EventSpyDispatcher; import org.apache.maven.execution.DefaultMavenExecutionResult; import org.apache.maven.execution.ExecutionEvent; import org.apache.maven.execution.MavenExecutionRequest; @@ -143,6 +144,9 @@ public class DefaultMaven @Requirement private LegacySupport legacySupport; + @Requirement + private EventSpyDispatcher eventSpyDispatcher; + public MavenExecutionResult execute( MavenExecutionRequest request ) { MavenExecutionResult result; @@ -437,7 +441,7 @@ public class DefaultMaven session.setTransferListener( request.getTransferListener() ); - session.setRepositoryListener( new LoggingRepositoryListener( logger ) ); + session.setRepositoryListener( eventSpyDispatcher.chainListener( new LoggingRepositoryListener( logger ) ) ); session.setUserProps( request.getUserProperties() ); session.setSystemProps( request.getSystemProperties() ); @@ -564,7 +568,7 @@ public class DefaultMaven // if ( request.getPom() == null ) { - ModelSource modelSource = new UrlModelSource( getClass().getResource( "project/standalone.xml" ) ); + ModelSource modelSource = new UrlModelSource( DefaultMaven.class.getResource( "project/standalone.xml" ) ); MavenProject project = projectBuilder.build( modelSource, request.getProjectBuildingRequest() ).getProject(); project.setExecutionRoot( true ); Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/ ------------------------------------------------------------------------------ bugtraq:label = Enter issue ID: Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/ ------------------------------------------------------------------------------ bugtraq:message = Issue id: %BUGID% Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/ ------------------------------------------------------------------------------ bugtraq:number = false Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/ ------------------------------------------------------------------------------ bugtraq:url = http://jira.codehaus.org/browse/%BUGID% Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java?rev=1050096&view=auto ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java (added) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java Thu Dec 16 18:58:54 2010 @@ -0,0 +1,44 @@ +package org.apache.maven.eventspy; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +/** + * A skeleton eventspy that does nothing other than helping implementors. + */ +public abstract class AbstractEventSpy + implements EventSpy +{ + + public void init( Context context ) + throws Exception + { + } + + public void onEvent( Object event ) + throws Exception + { + } + + public void close() + throws Exception + { + } + +} Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/AbstractEventSpy.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java?rev=1050096&view=auto ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java (added) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java Thu Dec 16 18:58:54 2010 @@ -0,0 +1,50 @@ +package org.apache.maven.eventspy; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.Map; + +/** + * A core extension to monitor Maven's execution. Typically, such an extension gets loaded into Maven by specifying the + * system property {...@code maven.ext.class.path} on the command line. As soon as dependency injection is setup, Maven + * looks up all implementators of this interface and calls their {...@link #init(Context)} method. <em>Note:</em> + * Implementors are strongly advised to inherit from {...@link AbstractEventSpy} instead of directly implementing this + * interface. + */ +public interface EventSpy +{ + + interface Context + { + + Map<String, Object> getData(); + + } + + void init( Context context ) + throws Exception; + + void onEvent( Object event ) + throws Exception; + + void close() + throws Exception; + +} Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/EventSpy.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/ ------------------------------------------------------------------------------ bugtraq:label = Enter issue ID: Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/ ------------------------------------------------------------------------------ bugtraq:message = Issue id: %BUGID% Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/ ------------------------------------------------------------------------------ bugtraq:number = false Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/ ------------------------------------------------------------------------------ bugtraq:url = http://jira.codehaus.org/browse/%BUGID% Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java?rev=1050096&view=auto ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java (added) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java Thu Dec 16 18:58:54 2010 @@ -0,0 +1,155 @@ +package org.apache.maven.eventspy.internal; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.ArrayList; +import java.util.List; + +import org.apache.maven.eventspy.EventSpy; +import org.apache.maven.execution.ExecutionListener; +import org.codehaus.plexus.component.annotations.Component; +import org.codehaus.plexus.component.annotations.Requirement; +import org.codehaus.plexus.logging.Logger; +import org.sonatype.aether.RepositoryListener; + +/** + * Dispatches callbacks to all registered eventspies. + */ +...@component( role = EventSpyDispatcher.class ) +public class EventSpyDispatcher +{ + + @Requirement + private Logger logger; + + @Requirement( role = EventSpy.class ) + private List<EventSpy> eventSpies; + + public void setEventSpies( List<EventSpy> eventSpies ) + { + // make copy to get rid of needless overhead for dynamic lookups + this.eventSpies = new ArrayList<EventSpy>( eventSpies ); + } + + public List<EventSpy> getEventSpies() + { + return eventSpies; + } + + public ExecutionListener chainListener( ExecutionListener listener ) + { + if ( eventSpies.isEmpty() ) + { + return listener; + } + return new EventSpyExecutionListener( this, listener ); + } + + public RepositoryListener chainListener( RepositoryListener listener ) + { + if ( eventSpies.isEmpty() ) + { + return listener; + } + return new EventSpyRepositoryListener( this, listener ); + } + + public void init( EventSpy.Context context ) + { + if ( eventSpies.isEmpty() ) + { + return; + } + for ( EventSpy eventSpy : eventSpies ) + { + try + { + eventSpy.init( context ); + } + catch ( Exception e ) + { + String msg = "Failed to initialize spy " + eventSpy.getClass().getName() + ": " + e.getMessage(); + if ( logger.isDebugEnabled() ) + { + logger.warn( msg, e ); + } + else + { + logger.warn( msg ); + } + } + } + } + + public void onEvent( Object event ) + { + if ( eventSpies.isEmpty() ) + { + return; + } + for ( EventSpy eventSpy : eventSpies ) + { + try + { + eventSpy.onEvent( event ); + } + catch ( Exception e ) + { + String msg = "Failed to forward event to spy " + eventSpy.getClass().getName() + ": " + e.getMessage(); + if ( logger.isDebugEnabled() ) + { + logger.warn( msg, e ); + } + else + { + logger.warn( msg ); + } + } + } + } + + public void close() + { + if ( eventSpies.isEmpty() ) + { + return; + } + for ( EventSpy eventSpy : eventSpies ) + { + try + { + eventSpy.close(); + } + catch ( Exception e ) + { + String msg = "Failed to close spy " + eventSpy.getClass().getName() + ": " + e.getMessage(); + if ( logger.isDebugEnabled() ) + { + logger.warn( msg, e ); + } + else + { + logger.warn( msg ); + } + } + } + } + +} Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyDispatcher.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java?rev=1050096&view=auto ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java (added) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java Thu Dec 16 18:58:54 2010 @@ -0,0 +1,162 @@ +package org.apache.maven.eventspy.internal; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.apache.maven.execution.AbstractExecutionListener; +import org.apache.maven.execution.ExecutionEvent; +import org.apache.maven.execution.ExecutionListener; + +/** + * Forwards execution events to eventspies. + */ +class EventSpyExecutionListener + extends AbstractExecutionListener +{ + + private final EventSpyDispatcher dispatcher; + + private final ExecutionListener delegate; + + public EventSpyExecutionListener( EventSpyDispatcher dispatcher, ExecutionListener delegate ) + { + this.dispatcher = dispatcher; + this.delegate = delegate; + } + + @Override + public void projectDiscoveryStarted( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.projectDiscoveryStarted( event ); + } + + @Override + public void sessionStarted( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.sessionStarted( event ); + } + + @Override + public void sessionEnded( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.sessionEnded( event ); + } + + @Override + public void projectSkipped( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.projectSkipped( event ); + } + + @Override + public void projectStarted( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.projectStarted( event ); + } + + @Override + public void projectSucceeded( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.projectSucceeded( event ); + } + + @Override + public void projectFailed( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.projectFailed( event ); + } + + @Override + public void forkStarted( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.forkStarted( event ); + } + + @Override + public void forkSucceeded( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.forkSucceeded( event ); + } + + @Override + public void forkFailed( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.forkFailed( event ); + } + + @Override + public void mojoSkipped( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.mojoSkipped( event ); + } + + @Override + public void mojoStarted( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.mojoStarted( event ); + } + + @Override + public void mojoSucceeded( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.mojoSucceeded( event ); + } + + @Override + public void mojoFailed( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.mojoFailed( event ); + } + + @Override + public void forkedProjectStarted( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.forkedProjectStarted( event ); + } + + @Override + public void forkedProjectSucceeded( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.forkedProjectSucceeded( event ); + } + + @Override + public void forkedProjectFailed( ExecutionEvent event ) + { + dispatcher.onEvent( event ); + delegate.forkedProjectFailed( event ); + } + +} Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyExecutionListener.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Added: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java?rev=1050096&view=auto ============================================================================== --- maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java (added) +++ maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java Thu Dec 16 18:58:54 2010 @@ -0,0 +1,175 @@ +package org.apache.maven.eventspy.internal; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import org.sonatype.aether.AbstractRepositoryListener; +import org.sonatype.aether.RepositoryEvent; +import org.sonatype.aether.RepositoryListener; + +/** + * Forwards repository events to eventspies. + */ +class EventSpyRepositoryListener + extends AbstractRepositoryListener +{ + private final EventSpyDispatcher dispatcher; + + private final RepositoryListener delegate; + + public EventSpyRepositoryListener( EventSpyDispatcher dispatcher, RepositoryListener delegate ) + { + this.dispatcher = dispatcher; + this.delegate = delegate; + } + + @Override + public void artifactDeployed( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactDeployed( event ); + } + + @Override + public void artifactDeploying( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactDeploying( event ); + } + + @Override + public void artifactDescriptorInvalid( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactDescriptorInvalid( event ); + } + + @Override + public void artifactDescriptorMissing( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactDescriptorMissing( event ); + } + + @Override + public void artifactInstalled( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactInstalled( event ); + } + + @Override + public void artifactInstalling( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactInstalling( event ); + } + + @Override + public void artifactResolved( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactResolved( event ); + } + + @Override + public void artifactResolving( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactResolving( event ); + } + + @Override + public void metadataDeployed( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataDeployed( event ); + } + + @Override + public void metadataDeploying( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataDeploying( event ); + } + + @Override + public void metadataInstalled( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataInstalled( event ); + } + + @Override + public void metadataInstalling( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataInstalling( event ); + } + + @Override + public void metadataInvalid( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataInvalid( event ); + } + + @Override + public void metadataResolved( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataResolved( event ); + } + + @Override + public void metadataResolving( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataResolving( event ); + } + + @Override + public void artifactDownloaded( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactDownloaded( event ); + } + + @Override + public void artifactDownloading( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.artifactDownloading( event ); + } + + @Override + public void metadataDownloaded( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataDownloaded( event ); + } + + @Override + public void metadataDownloading( RepositoryEvent event ) + { + dispatcher.onEvent( event ); + delegate.metadataDownloading( event ); + } + +} Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/maven-3/trunk/maven-core/src/main/java/org/apache/maven/eventspy/internal/EventSpyRepositoryListener.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/AbstractMavenTransferListener.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/AbstractMavenTransferListener.java?rev=1050096&r1=1050095&r2=1050096&view=diff ============================================================================== --- maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/AbstractMavenTransferListener.java (original) +++ maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/AbstractMavenTransferListener.java Thu Dec 16 18:58:54 2010 @@ -29,7 +29,7 @@ import org.sonatype.aether.transfer.Tran import org.sonatype.aether.transfer.TransferEvent; import org.sonatype.aether.transfer.TransferResource; -abstract class AbstractMavenTransferListener +public abstract class AbstractMavenTransferListener extends AbstractTransferListener { Modified: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/BatchModeMavenTransferListener.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/BatchModeMavenTransferListener.java?rev=1050096&r1=1050095&r2=1050096&view=diff ============================================================================== --- maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/BatchModeMavenTransferListener.java (original) +++ maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/BatchModeMavenTransferListener.java Thu Dec 16 18:58:54 2010 @@ -21,7 +21,7 @@ package org.apache.maven.cli; import java.io.PrintStream; -class BatchModeMavenTransferListener +public class BatchModeMavenTransferListener extends AbstractMavenTransferListener { public BatchModeMavenTransferListener( PrintStream out ) Modified: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ConsoleMavenTransferListener.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ConsoleMavenTransferListener.java?rev=1050096&r1=1050095&r2=1050096&view=diff ============================================================================== --- maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ConsoleMavenTransferListener.java (original) +++ maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ConsoleMavenTransferListener.java Thu Dec 16 18:58:54 2010 @@ -32,7 +32,7 @@ import org.sonatype.aether.transfer.Tran * * @author <a href="mailto:br...@apache.org">Brett Porter</a> */ -class ConsoleMavenTransferListener +public class ConsoleMavenTransferListener extends AbstractMavenTransferListener { Added: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/DefaultEventSpyContext.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/DefaultEventSpyContext.java?rev=1050096&view=auto ============================================================================== --- maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/DefaultEventSpyContext.java (added) +++ maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/DefaultEventSpyContext.java Thu Dec 16 18:58:54 2010 @@ -0,0 +1,38 @@ +package org.apache.maven.cli; + +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import java.util.HashMap; +import java.util.Map; + +import org.apache.maven.eventspy.EventSpy; + +public class DefaultEventSpyContext + implements EventSpy.Context +{ + + private final Map<String, Object> data = new HashMap<String, Object>(); + + public Map<String, Object> getData() + { + return data; + } + +} Propchange: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/DefaultEventSpyContext.java ------------------------------------------------------------------------------ svn:eol-style = native Propchange: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/DefaultEventSpyContext.java ------------------------------------------------------------------------------ svn:keywords = Author Date Id Revision Modified: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java?rev=1050096&r1=1050095&r2=1050096&view=diff ============================================================================== --- maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java (original) +++ maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/ExecutionEventLogger.java Thu Dec 16 18:58:54 2010 @@ -40,7 +40,7 @@ import org.codehaus.plexus.logging.Logge * * @author Benjamin Bentmann */ -class ExecutionEventLogger +public class ExecutionEventLogger extends AbstractExecutionListener { private final Logger logger; Modified: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java?rev=1050096&r1=1050095&r2=1050096&view=diff ============================================================================== --- maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java (original) +++ maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/MavenCli.java Thu Dec 16 18:58:54 2010 @@ -33,8 +33,10 @@ import java.util.StringTokenizer; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.ParseException; import org.apache.commons.cli.UnrecognizedOptionException; +import org.apache.maven.BuildAbort; import org.apache.maven.InternalErrorException; import org.apache.maven.Maven; +import org.apache.maven.eventspy.internal.EventSpyDispatcher; import org.apache.maven.exception.DefaultExceptionHandler; import org.apache.maven.exception.ExceptionHandler; import org.apache.maven.exception.ExceptionSummary; @@ -59,6 +61,7 @@ import org.codehaus.plexus.DefaultContai import org.codehaus.plexus.DefaultPlexusContainer; import org.codehaus.plexus.PlexusContainer; import org.codehaus.plexus.classworlds.ClassWorld; +import org.codehaus.plexus.classworlds.realm.ClassRealm; import org.codehaus.plexus.component.repository.exception.ComponentLookupException; import org.codehaus.plexus.logging.Logger; import org.codehaus.plexus.util.StringUtils; @@ -92,6 +95,8 @@ public class MavenCli public static final File DEFAULT_USER_TOOLCHAINS_FILE = new File( userMavenConfigurationHome, "toolchains.xml" ); + private static final String EXT_CLASS_PATH = "maven.ext.class.path"; + private ClassWorld classWorld; // Per-instance container supports fast embedded execution of core ITs @@ -99,6 +104,8 @@ public class MavenCli private Logger logger; + private EventSpyDispatcher eventSpyDispatcher; + private ModelProcessor modelProcessor; private Maven maven; @@ -196,6 +203,12 @@ public class MavenCli // pure user error, suppress stack trace return 1; } + catch ( BuildAbort e ) + { + CLIReportingUtils.showError( logger, "ABORTED", e, cliRequest.showErrors ); + + return 2; + } catch ( Exception e ) { CLIReportingUtils.showError( logger, "Error executing Maven.", e, cliRequest.showErrors ); @@ -352,6 +365,7 @@ public class MavenCli ContainerConfiguration cc = new DefaultContainerConfiguration() .setClassWorld( cliRequest.classWorld ) + .setRealm( setupContainerRealm( cliRequest ) ) .setName( "maven" ); container = new DefaultPlexusContainer( cc ); @@ -368,6 +382,22 @@ public class MavenCli container.getLoggerManager().setThresholds( cliRequest.request.getLoggingLevel() ); + Thread.currentThread().setContextClassLoader( container.getContainerRealm() ); + + eventSpyDispatcher = container.lookup( EventSpyDispatcher.class ); + + DefaultEventSpyContext eventSpyContext = new DefaultEventSpyContext(); + Map<String, Object> data = eventSpyContext.getData(); + data.put( "plexus", container ); + data.put( "workingDirectory", cliRequest.workingDirectory ); + data.put( "systemProperties", cliRequest.systemProperties ); + data.put( "userProperties", cliRequest.userProperties ); + data.put( "versionProperties", CLIReportingUtils.getBuildProperties() ); + eventSpyDispatcher.init( eventSpyContext ); + + // refresh logger in case container got customized by spy + logger = container.getLoggerManager().getLoggerForComponent( MavenCli.class.getName(), null ); + maven = container.lookup( Maven.class ); executionRequestPopulator = container.lookup( MavenExecutionRequestPopulator.class ); @@ -389,9 +419,56 @@ public class MavenCli } } ); + logger.setThreshold( cliRequest.request.getLoggingLevel() ); + return logger; } + private ClassRealm setupContainerRealm( CliRequest cliRequest ) + throws Exception + { + ClassRealm containerRealm = null; + + String extClassPath = cliRequest.userProperties.getProperty( EXT_CLASS_PATH ); + if ( extClassPath == null ) + { + extClassPath = cliRequest.systemProperties.getProperty( EXT_CLASS_PATH ); + } + + if ( StringUtils.isNotEmpty( extClassPath ) ) + { + String[] jars = StringUtils.split( extClassPath, File.pathSeparator ); + + if ( jars.length > 0 ) + { + ClassRealm coreRealm = cliRequest.classWorld.getClassRealm( "plexus.core" ); + if ( coreRealm == null ) + { + coreRealm = (ClassRealm) cliRequest.classWorld.getRealms().iterator().next(); + } + + ClassRealm extRealm = cliRequest.classWorld.newRealm( "maven.ext", null ); + + logger.debug( "Populating class realm " + extRealm.getId() ); + + for ( String jar : jars ) + { + File file = resolveFile( new File( jar ), cliRequest.workingDirectory ); + + logger.debug( " Included " + file ); + + extRealm.addURL( file.toURI().toURL() ); + } + + extRealm.setParentRealm( coreRealm ); + + containerRealm = extRealm; + } + } + + return containerRealm; + } + protected void customizeContainer( PlexusContainer container ) { } @@ -448,8 +525,14 @@ public class MavenCli private int execute( CliRequest cliRequest ) { + eventSpyDispatcher.onEvent( cliRequest.request ); + MavenExecutionResult result = maven.execute( cliRequest.request ); + eventSpyDispatcher.onEvent( result ); + + eventSpyDispatcher.close(); + if ( result.hasExceptions() ) { ExceptionHandler handler = new DefaultExceptionHandler(); @@ -625,6 +708,8 @@ public class MavenCli settingsRequest.setSystemProperties( cliRequest.systemProperties ); settingsRequest.setUserProperties( cliRequest.userProperties ); + eventSpyDispatcher.onEvent( settingsRequest ); + logger.debug( "Reading global settings from " + getSettingsLocation( settingsRequest.getGlobalSettingsSource(), settingsRequest.getGlobalSettingsFile() ) ); logger.debug( "Reading user settings from " @@ -632,6 +717,8 @@ public class MavenCli SettingsBuildingResult settingsResult = settingsBuilder.build( settingsRequest ); + eventSpyDispatcher.onEvent( settingsResult ); + executionRequestPopulator.populateFromSettings( cliRequest.request, settingsResult.getEffectiveSettings() ); if ( !settingsResult.getProblems().isEmpty() && logger.isWarnEnabled() ) @@ -800,6 +887,7 @@ public class MavenCli } ExecutionListener executionListener = new ExecutionEventLogger( logger ); + executionListener = eventSpyDispatcher.chainListener( executionListener ); String alternatePomFile = null; if ( commandLine.hasOption( CLIManager.ALTERNATE_POM_FILE ) ) Modified: maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/QuietMavenTransferListener.java URL: http://svn.apache.org/viewvc/maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/QuietMavenTransferListener.java?rev=1050096&r1=1050095&r2=1050096&view=diff ============================================================================== --- maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/QuietMavenTransferListener.java (original) +++ maven/maven-3/trunk/maven-embedder/src/main/java/org/apache/maven/cli/QuietMavenTransferListener.java Thu Dec 16 18:58:54 2010 @@ -24,7 +24,7 @@ import org.sonatype.aether.transfer.Abst /** * @author Benjamin Bentmann */ -class QuietMavenTransferListener +public class QuietMavenTransferListener extends AbstractTransferListener {