View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven;
20  
21  import java.io.File;
22  import java.io.IOException;
23  import java.util.ArrayList;
24  import java.util.Arrays;
25  import java.util.List;
26  
27  import org.apache.maven.artifact.Artifact;
28  import org.apache.maven.execution.MavenExecutionRequest;
29  import org.apache.maven.execution.MavenExecutionResult;
30  import org.apache.maven.execution.MavenSession;
31  import org.apache.maven.model.Dependency;
32  import org.apache.maven.project.MavenProject;
33  import org.codehaus.plexus.PlexusContainer;
34  import org.codehaus.plexus.component.repository.ComponentDescriptor;
35  import org.junit.jupiter.api.Test;
36  
37  import static org.junit.jupiter.api.Assertions.assertEquals;
38  import static org.junit.jupiter.api.Assertions.assertFalse;
39  
40  class MavenLifecycleParticipantTest extends AbstractCoreMavenComponentTestCase {
41  
42      private static final String INJECTED_ARTIFACT_ID = "injected";
43  
44      public static class InjectDependencyLifecycleListener extends AbstractMavenLifecycleParticipant {
45  
46          @Override
47          public void afterProjectsRead(MavenSession session) {
48              MavenProject project = session.getProjects().get(0);
49  
50              Dependency dependency = new Dependency();
51              dependency.setArtifactId(INJECTED_ARTIFACT_ID);
52              dependency.setGroupId("foo");
53              dependency.setVersion("1.2.3");
54              dependency.setScope("system");
55              try {
56                  dependency.setSystemPath(new File(
57                                  "src/test/projects/lifecycle-executor/project-with-additional-lifecycle-elements/pom.xml")
58                          .getCanonicalPath());
59              } catch (IOException e) {
60                  throw new RuntimeException(e);
61              }
62  
63              project.getModel().addDependency(dependency);
64          }
65  
66          @Override
67          public void afterSessionStart(MavenSession session) {
68              session.getUserProperties().setProperty("injected", "bar");
69          }
70      }
71  
72      public static class InjectReactorDependency extends AbstractMavenLifecycleParticipant {
73          @Override
74          public void afterProjectsRead(MavenSession session) {
75              injectReactorDependency(session.getProjects(), "module-a", "module-b");
76          }
77  
78          private void injectReactorDependency(List<MavenProject> projects, String moduleFrom, String moduleTo) {
79              for (MavenProject project : projects) {
80                  if (moduleFrom.equals(project.getArtifactId())) {
81                      Dependency dependency = new Dependency();
82                      dependency.setArtifactId(moduleTo);
83                      dependency.setGroupId(project.getGroupId());
84                      dependency.setVersion(project.getVersion());
85  
86                      project.getModel().addDependency(dependency);
87                  }
88              }
89          }
90      }
91  
92      @Override
93      protected String getProjectsDirectory() {
94          return "src/test/projects/lifecycle-listener";
95      }
96  
97      @Test
98      void testDependencyInjection() throws Exception {
99          PlexusContainer container = getContainer();
100 
101         ComponentDescriptor<? extends AbstractMavenLifecycleParticipant> cd =
102                 new ComponentDescriptor<>(InjectDependencyLifecycleListener.class, container.getContainerRealm());
103         cd.setRoleClass(AbstractMavenLifecycleParticipant.class);
104         container.addComponentDescriptor(cd);
105 
106         Maven maven = container.lookup(Maven.class);
107         File pom = getProject("lifecycle-listener-dependency-injection");
108         MavenExecutionRequest request = createMavenExecutionRequest(pom);
109         request.setGoals(Arrays.asList("validate"));
110         MavenExecutionResult result = maven.execute(request);
111 
112         assertFalse(result.hasExceptions(), result.getExceptions().toString());
113 
114         MavenProject project = result.getProject();
115 
116         assertEquals("bar", project.getProperties().getProperty("foo"));
117 
118         ArrayList<Artifact> artifacts = new ArrayList<>(project.getArtifacts());
119 
120         assertEquals(1, artifacts.size());
121         assertEquals(INJECTED_ARTIFACT_ID, artifacts.get(0).getArtifactId());
122     }
123 
124     @Test
125     void testReactorDependencyInjection() throws Exception {
126         List<String> reactorOrder =
127                 getReactorOrder("lifecycle-participant-reactor-dependency-injection", InjectReactorDependency.class);
128         assertEquals(Arrays.asList("parent", "module-b", "module-a"), reactorOrder);
129     }
130 
131     private <T> List<String> getReactorOrder(String testProject, Class<T> participant) throws Exception {
132         PlexusContainer container = getContainer();
133 
134         ComponentDescriptor<T> cd = new ComponentDescriptor<>(participant, container.getContainerRealm());
135         cd.setRoleClass(AbstractMavenLifecycleParticipant.class);
136         container.addComponentDescriptor(cd);
137 
138         Maven maven = container.lookup(Maven.class);
139         File pom = getProject(testProject);
140         MavenExecutionRequest request = createMavenExecutionRequest(pom);
141         request.setGoals(Arrays.asList("validate"));
142         MavenExecutionResult result = maven.execute(request);
143 
144         assertFalse(result.hasExceptions(), result.getExceptions().toString());
145 
146         List<String> order = new ArrayList<>();
147         for (MavenProject project : result.getTopologicallySortedProjects()) {
148             order.add(project.getArtifactId());
149         }
150         return order;
151     }
152 }