001    package org.apache.maven;
002    
003    /*
004     * Licensed to the Apache Software Foundation (ASF) under one or more contributor license
005     * agreements. See the NOTICE file distributed with this work for additional information regarding
006     * copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the
007     * "License"); you may not use this file except in compliance with the License. You may obtain a
008     * copy of the License at
009     * 
010     * http://www.apache.org/licenses/LICENSE-2.0
011     * 
012     * Unless required by applicable law or agreed to in writing, software distributed under the License
013     * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
014     * or implied. See the License for the specific language governing permissions and limitations under
015     * the License.
016     */
017    
018    
019    import java.io.File;
020    import java.io.IOException;
021    import java.util.ArrayList;
022    import java.util.Arrays;
023    
024    import org.apache.maven.artifact.Artifact;
025    import org.apache.maven.execution.MavenExecutionRequest;
026    import org.apache.maven.execution.MavenExecutionResult;
027    import org.apache.maven.execution.MavenSession;
028    import org.apache.maven.model.Dependency;
029    import org.apache.maven.project.MavenProject;
030    import org.codehaus.plexus.PlexusContainer;
031    import org.codehaus.plexus.component.repository.ComponentDescriptor;
032    
033    public class MavenLifecycleParticipantTest
034        extends AbstractCoreMavenComponentTestCase
035    {
036    
037        private static final String INJECTED_ARTIFACT_ID = "injected";
038    
039        public static class InjectDependencyLifecycleListener
040            extends AbstractMavenLifecycleParticipant
041        {
042    
043            @Override
044            public void afterProjectsRead( MavenSession session )
045            {
046                MavenProject project = session.getProjects().get( 0 );
047    
048                Dependency dependency = new Dependency();
049                dependency.setArtifactId( INJECTED_ARTIFACT_ID );
050                dependency.setGroupId( "foo" );
051                dependency.setVersion( "1.2.3" );
052                dependency.setScope( "system" );
053                try
054                {
055                    dependency.setSystemPath( new File(
056                                                        "src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml" ).getCanonicalPath() );
057                }
058                catch ( IOException e )
059                {
060                    throw new RuntimeException( e );
061                }
062    
063                project.getModel().addDependency( dependency );
064            }
065    
066            @Override
067            public void afterSessionStart( MavenSession session )
068            {
069                session.getUserProperties().setProperty( "injected", "bar" );
070            }
071    
072        }
073    
074        @Override
075        protected void setupContainer()
076        {
077            super.setupContainer();
078        }
079    
080        @Override
081        protected String getProjectsDirectory()
082        {
083            return "src/test/projects/lifecycle-listener";
084        }
085    
086        public void testDependencyInjection()
087            throws Exception
088        {
089            PlexusContainer container = getContainer();
090    
091            ComponentDescriptor<? extends AbstractMavenLifecycleParticipant> cd =
092                new ComponentDescriptor<InjectDependencyLifecycleListener>( InjectDependencyLifecycleListener.class,
093                                                                            container.getContainerRealm() );
094            cd.setRoleClass( AbstractMavenLifecycleParticipant.class );
095            container.addComponentDescriptor( cd );
096    
097            Maven maven = container.lookup( Maven.class );
098            File pom = getProject( "lifecycle-listener-dependency-injection" );
099            MavenExecutionRequest request = createMavenExecutionRequest( pom );
100            request.setGoals( Arrays.asList( "validate" ) );
101            MavenExecutionResult result = maven.execute( request );
102    
103            assertFalse( result.getExceptions().toString(), result.hasExceptions() );
104    
105            MavenProject project = result.getProject();
106            
107            assertEquals( "bar", project.getProperties().getProperty( "foo" ) );
108    
109            ArrayList<Artifact> artifacts = new ArrayList<Artifact>( project.getArtifacts() );
110    
111            assertEquals( 1, artifacts.size() );
112            assertEquals( INJECTED_ARTIFACT_ID, artifacts.get( 0 ).getArtifactId() );
113        }
114    }