1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 }