Why an abstract class (abstract class AbstractMavenLifecycleParticipant) and not an interface ?
Perso, I'd prefer to lifecycleListeners = container.lookupList( MavenLifecycleParticipant.class ); instead of lifecycleListeners = container.lookupList( AbstractMavenLifecycleParticipant.class ); -- Olivier 2009/7/1 <[email protected]>: > Author: bentmann > Date: Tue Jun 30 22:36:30 2009 > New Revision: 789993 > > URL: http://svn.apache.org/viewvc?rev=789993&view=rev > Log: > [MNG-4224] maven lifecycle participant > Submitted by: Igor Fedorenko > > Added: > > maven/components/trunk/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java > (with props) > > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java > (with props) > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/ > (with props) > > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/ > (with props) > > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml > (with props) > Modified: > > maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java > > maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java > > maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java > > maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java > > maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java > > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenTest.java > > Added: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java?rev=789993&view=auto > ============================================================================== > --- > maven/components/trunk/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java > (added) > +++ > maven/components/trunk/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java > Tue Jun 30 22:36:30 2009 > @@ -0,0 +1,54 @@ > +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. > + */ > + > + > +import org.apache.maven.execution.MavenSession; > + > +/** > + * Allows core extensions to participate in build lifecycle. > + * > + * All callback methods (will) follow beforeXXX/afterXXX naming pattern to > + * indicate at what lifecycle point it is being called. > + * > + */ > +public abstract class AbstractMavenLifecycleParticipant > +{ > + > + /** > + * Invoked after all MavenProject instances have been created. > + * > + * This callback is intended to allow extensions to manipulate > MavenProjects > + * before they are sorted and actual build execution starts. > + */ > + public void afterProjectsRead( MavenSession session ) throws > MavenExecutionException > + { > + // do nothing > + } > + > + /** > + * Invoked after MavenSession instance has been created. > + * > + * This callback is intended to allow extensions to inject execution > properties, > + * activate profiles and perform similar tasks that affect MavenProject > + * instance construction. > + */ > + public void afterSessionStart( MavenSession session ) throws > MavenExecutionException > + { > + // do nothing > + } > + > +} > > Propchange: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/AbstractMavenLifecycleParticipant.java > ------------------------------------------------------------------------------ > svn:keywords = Author Date Id Revision > > Modified: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java?rev=789993&r1=789992&r2=789993&view=diff > ============================================================================== > --- > maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java > (original) > +++ > maven/components/trunk/maven-core/src/main/java/org/apache/maven/DefaultMaven.java > Tue Jun 30 22:36:30 2009 > @@ -22,7 +22,6 @@ > import java.util.Arrays; > import java.util.Collection; > import java.util.Date; > -import java.util.HashMap; > import java.util.LinkedHashMap; > import java.util.LinkedHashSet; > import java.util.List; > @@ -46,6 +45,7 @@ > import org.codehaus.plexus.PlexusContainer; > import org.codehaus.plexus.component.annotations.Component; > import org.codehaus.plexus.component.annotations.Requirement; > +import > org.codehaus.plexus.component.repository.exception.ComponentLookupException; > import org.codehaus.plexus.logging.Logger; > import org.codehaus.plexus.util.Os; > import org.codehaus.plexus.util.StringUtils; > @@ -86,13 +86,24 @@ > DelegatingLocalArtifactRepository delegatingLocalArtifactRepository = > new DelegatingLocalArtifactRepository( request.getLocalRepository() ); > > request.setLocalRepository( delegatingLocalArtifactRepository ); > - > - MavenSession session; > + > + MavenSession session = new MavenSession( container, request, result); > > - Map<String,MavenProject> projects; > + try > + { > + for ( AbstractMavenLifecycleParticipant listener : > getLifecycleParticipants() ) > + { > + listener.afterSessionStart( session ); > + } > + } > + catch ( MavenExecutionException e ) > + { > + return processResult( result, e ); > + } > > //TODO: optimize for the single project or no project > > + List<MavenProject> projects; > try > { > projects = getProjectsForMavenReactor( request ); > @@ -101,7 +112,7 @@ > if ( projects.isEmpty() ) > { > MavenProject project = > projectBuilder.buildStandaloneSuperProject( > request.getProjectBuildingRequest() ); > - projects.put( ArtifactUtils.key( project.getGroupId(), > project.getArtifactId(), project.getVersion() ), project ); > + projects.add( project ); > request.setProjectPresent( false ); > } > } > @@ -113,12 +124,28 @@ > { > return processResult( result, e ); > } > - > + > + session.setProjects( projects ); > + > + try > + { > + for ( AbstractMavenLifecycleParticipant listener : > getLifecycleParticipants() ) > + { > + listener.afterProjectsRead( session ); > + } > + } > + catch ( MavenExecutionException e ) > + { > + return processResult( result, e ); > + } > + > try > { > - ProjectSorter projectSorter = new ProjectSorter( > projects.values() ); > - > - session = new MavenSession( container, request, result, > projectSorter.getSortedProjects() ); > + ProjectSorter projectSorter = new ProjectSorter( > session.getProjects() ); > + > + projects = projectSorter.getSortedProjects(); > + > + session.setProjects( projects ); > } > catch ( CycleDetectedException e ) > { > @@ -132,14 +159,20 @@ > { > return processResult( result, e ); > } > - > + > // Desired order of precedence for local artifact repositories > // > // Reactor > // Workspace > // User Local Repository > - > - delegatingLocalArtifactRepository.setBuildReactor( new > ReactorArtifactRepository( projects ) ); > + try > + { > + delegatingLocalArtifactRepository.setBuildReactor( new > ReactorArtifactRepository( getProjectMap( session.getProjects() ) ) ); > + } > + catch ( MavenExecutionException e ) > + { > + return processResult( result, e ); > + } > > if ( result.hasExceptions() ) > { > @@ -162,6 +195,22 @@ > return result; > } > > + private List<AbstractMavenLifecycleParticipant> > getLifecycleParticipants() > + { > + // TODO injection of component lists does not work > + List<AbstractMavenLifecycleParticipant> lifecycleListeners; > + try > + { > + lifecycleListeners = container.lookupList( > AbstractMavenLifecycleParticipant.class ); > + } > + catch ( ComponentLookupException e1 ) > + { > + // this is just silly, lookupList should return an empty list! > + lifecycleListeners = new > ArrayList<AbstractMavenLifecycleParticipant>(); > + } > + return lifecycleListeners; > + } > + > private MavenExecutionResult processResult( MavenExecutionResult result, > Exception e ) > { > ExceptionHandler handler = new DefaultExceptionHandler(); > @@ -175,14 +224,14 @@ > return result; > } > > - protected Map<String,MavenProject> getProjectsForMavenReactor( > MavenExecutionRequest request ) > + private List<MavenProject> getProjectsForMavenReactor( > MavenExecutionRequest request ) > throws MavenExecutionException, ProjectBuildingException > { > // We have no POM file. > // > if ( request.getPom() == null || !request.getPom().exists() ) > { > - return new HashMap<String,MavenProject>(); > + return new ArrayList<MavenProject>(); > } > > List<File> files = Arrays.asList( request.getPom().getAbsoluteFile() > ); > @@ -191,6 +240,12 @@ > > collectProjects( projects, files, request ); > > + return projects; > + } > + > + private Map<String, MavenProject> getProjectMap( List<MavenProject> > projects ) > + throws org.apache.maven.DuplicateProjectException > + { > Map<String, MavenProject> index = new LinkedHashMap<String, > MavenProject>(); > Map<String, List<File>> collisions = new LinkedHashMap<String, > List<File>>(); > > > Modified: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java?rev=789993&r1=789992&r2=789993&view=diff > ============================================================================== > --- > maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java > (original) > +++ > maven/components/trunk/maven-core/src/main/java/org/apache/maven/execution/MavenSession.java > Tue Jun 30 22:36:30 2009 > @@ -31,7 +31,6 @@ > import org.apache.maven.project.ProjectBuildingRequest; > import org.apache.maven.settings.Settings; > import org.codehaus.plexus.PlexusContainer; > -import org.codehaus.plexus.util.dag.CycleDetectedException; > > /** > * @author Jason van Zyl > @@ -55,25 +54,37 @@ > > private MavenProject topLevelProject; > > + �...@deprecated > public MavenSession( PlexusContainer container, MavenExecutionRequest > request, MavenExecutionResult result, MavenProject project ) > - throws CycleDetectedException, DuplicateProjectException > { > this( container, request, result, Arrays.asList( new MavenProject[]{ > project } ) ); > } > > + �...@deprecated > public MavenSession( PlexusContainer container, MavenExecutionRequest > request, MavenExecutionResult result, List<MavenProject> projects ) > - throws CycleDetectedException, DuplicateProjectException > { > this.container = container; > this.request = request; > this.result = result; > + setProjects( projects ); > + } > + > + public MavenSession( PlexusContainer container, MavenExecutionRequest > request, MavenExecutionResult result ) > + { > + this.container = container; > + this.request = request; > + this.result = result; > + } > + > + public void setProjects( List<MavenProject> projects ) > + { > //TODO: Current for testing classes creating the session > if ( projects.size() > 0 ) > { > this.currentProject = projects.get( 0 ); > this.topLevelProject = projects.get( 0 ); > } > - this.projects = projects; > + this.projects = projects; > } > > @Deprecated > > Modified: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java?rev=789993&r1=789992&r2=789993&view=diff > ============================================================================== > --- > maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java > (original) > +++ > maven/components/trunk/maven-core/src/main/java/org/apache/maven/lifecycle/DefaultLifecycleExecutor.java > Tue Jun 30 22:36:30 2009 > @@ -806,7 +806,10 @@ > { > String phase = goalsForLifecyclePhase.getKey(); > String goals = goalsForLifecyclePhase.getValue(); > - parseLifecyclePhaseDefinitions( plugins, phase, goals ); > + if ( goals != null ) > + { > + parseLifecyclePhaseDefinitions( plugins, phase, > goals ); > + } > } > } > else if ( lifecycle.getDefaultPhases() != null ) > > Modified: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java?rev=789993&r1=789992&r2=789993&view=diff > ============================================================================== > --- > maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java > (original) > +++ > maven/components/trunk/maven-core/src/main/java/org/apache/maven/plugin/DefaultPluginManager.java > Tue Jun 30 22:36:30 2009 > @@ -222,7 +222,7 @@ > } > } > > - private PluginDescriptor parsebuildPluginDescriptor( InputStream is ) > + public PluginDescriptor parsebuildPluginDescriptor( InputStream is ) > throws IOException, PlexusConfigurationException > { > PluginDescriptor pluginDescriptor; > > Modified: > maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java?rev=789993&r1=789992&r2=789993&view=diff > ============================================================================== > --- > maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java > (original) > +++ > maven/components/trunk/maven-core/src/main/java/org/apache/maven/project/MavenProject.java > Tue Jun 30 22:36:30 2009 > @@ -164,7 +164,9 @@ > private RepositorySystem repositorySystem; > > private File parentFile; > - > + > + private Map<String, Object> context; > + > // > > public MavenProject() > @@ -1966,4 +1968,41 @@ > { > return groupId + ":" + artifactId + ":" + version; > } > + > + /** > + * Sets the value of the context value of this project identified > + * by the given key. If the supplied value is <code>null</code>, > + * the context value is removed from this project. > + * > + * Context values are intended to allow core extensions to associate > + * derived state with project instances. > + */ > + public void setContextValue( String key, Object value ) > + { > + if ( context == null ) > + { > + context = new HashMap<String, Object>(); > + } > + if ( value != null ) > + { > + context.put( key, value ); > + } > + else > + { > + context.remove( key ); > + } > + } > + > + /** > + * Returns context value of this project associated with the given key > + * or null if this project has no such value. > + */ > + public Object getContextValue( String key ) > + { > + if ( context == null ) > + { > + return null; > + } > + return context.get( key ); > + } > } > > Added: > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java?rev=789993&view=auto > ============================================================================== > --- > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java > (added) > +++ > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java > Tue Jun 30 22:36:30 2009 > @@ -0,0 +1,111 @@ > +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. > + */ > + > + > +import java.io.File; > +import java.io.IOException; > +import java.util.ArrayList; > + > +import org.apache.maven.artifact.Artifact; > +import org.apache.maven.execution.MavenExecutionRequest; > +import org.apache.maven.execution.MavenExecutionResult; > +import org.apache.maven.execution.MavenSession; > +import org.apache.maven.model.Dependency; > +import org.apache.maven.project.MavenProject; > +import org.codehaus.plexus.PlexusContainer; > +import org.codehaus.plexus.component.repository.ComponentDescriptor; > + > +public class MavenLifecycleParticipantTest > + extends AbstractCoreMavenComponentTestCase > +{ > + > + private static final String INJECTED_ARTIFACT_ID = "injected"; > + > + public static class InjectDependencyLifecycleListener > + extends AbstractMavenLifecycleParticipant > + { > + > + �...@override > + public void afterProjectsRead( MavenSession session ) > + { > + MavenProject project = session.getProjects().get( 0 ); > + > + Dependency dependency = new Dependency(); > + dependency.setArtifactId( INJECTED_ARTIFACT_ID ); > + dependency.setGroupId( "foo" ); > + dependency.setVersion( "1.2.3" ); > + dependency.setScope( "system" ); > + try > + { > + dependency.setSystemPath( new File( > + > "src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml" > ).getCanonicalPath() ); > + } > + catch ( IOException e ) > + { > + throw new RuntimeException( e ); > + } > + > + project.getModel().addDependency( dependency ); > + } > + > + �...@override > + public void afterSessionStart( MavenSession session ) > + { > + session.getExecutionProperties().setProperty( "injected", "bar" > ); > + } > + > + } > + > + �...@override > + protected void setupContainer() > + { > + super.setupContainer(); > + } > + > + �...@override > + protected String getProjectsDirectory() > + { > + return "src/test/projects/lifecycle-listener"; > + } > + > + public void testDependencyInjection() > + throws Exception > + { > + PlexusContainer container = getContainer(); > + > + ComponentDescriptor cd = > + new ComponentDescriptor( > InjectDependencyLifecycleListener.class, container.getContainerRealm() ); > + cd.setRoleClass( AbstractMavenLifecycleParticipant.class ); > + container.addComponentDescriptor( cd ); > + > + Maven maven = container.lookup( Maven.class ); > + File pom = getProject( "lifecycle-listener-dependency-injection" ); > + MavenExecutionRequest request = createMavenExecutionRequest( pom ); > + MavenExecutionResult result = maven.execute( request ); > + > + assertFalse( result.hasExceptions() ); > + > + MavenProject project = result.getProject(); > + > + assertEquals( "bar", project.getProperties().getProperty( "foo" ) ); > + > + ArrayList<Artifact> artifacts = new ArrayList<Artifact>( > project.getArtifacts() ); > + > + assertEquals( 1, artifacts.size() ); > + assertEquals( INJECTED_ARTIFACT_ID, artifacts.get( 0 > ).getArtifactId() ); > + } > +} > > Propchange: > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenLifecycleParticipantTest.java > ------------------------------------------------------------------------------ > svn:keywords = Author Date Id Revision > > Modified: > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenTest.java > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenTest.java?rev=789993&r1=789992&r2=789993&view=diff > ============================================================================== > --- > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenTest.java > (original) > +++ > maven/components/trunk/maven-core/src/test/java/org/apache/maven/MavenTest.java > Tue Jun 30 22:36:30 2009 > @@ -6,7 +6,6 @@ > import org.apache.maven.exception.ExceptionSummary; > import org.apache.maven.execution.MavenExecutionRequest; > import org.apache.maven.execution.MavenExecutionResult; > -import org.apache.maven.execution.MavenSession; > import org.codehaus.plexus.component.annotations.Requirement; > > public class MavenTest > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/ > ------------------------------------------------------------------------------ > bugtraq:label = Enter issue ID: > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/ > ------------------------------------------------------------------------------ > bugtraq:message = Issue id: %BUGID% > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/ > ------------------------------------------------------------------------------ > bugtraq:number = false > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/ > ------------------------------------------------------------------------------ > bugtraq:url = http://jira.codehaus.org/browse/%BUGID% > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/ > ------------------------------------------------------------------------------ > bugtraq:label = Enter issue ID: > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/ > ------------------------------------------------------------------------------ > bugtraq:message = Issue id: %BUGID% > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/ > ------------------------------------------------------------------------------ > bugtraq:number = false > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/ > ------------------------------------------------------------------------------ > bugtraq:url = http://jira.codehaus.org/browse/%BUGID% > > Added: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml > URL: > http://svn.apache.org/viewvc/maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml?rev=789993&view=auto > ============================================================================== > --- > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml > (added) > +++ > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml > Tue Jun 30 22:36:30 2009 > @@ -0,0 +1,12 @@ > +<project> > + <modelVersion>4.0.0</modelVersion> > + > + <groupId>org.apache.maven.lifecycle-listener.test</groupId> > + <artifactId>simple</artifactId> > + <version>1.0</version> > + > + <properties> > + <foo>${injected}</foo> > + </properties> > + > +</project> > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > maven/components/trunk/maven-core/src/test/projects/lifecycle-listener/lifecycle-listener-dependency-injection/pom.xml > ------------------------------------------------------------------------------ > svn:keywords = Author Date Id Revision > > > --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
