1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.reporting.exec;
20
21 import java.io.File;
22 import java.nio.file.Paths;
23 import java.util.Arrays;
24 import java.util.Collections;
25 import java.util.List;
26
27 import org.apache.maven.DefaultMaven;
28 import org.apache.maven.Maven;
29 import org.apache.maven.RepositoryUtils;
30 import org.apache.maven.artifact.repository.ArtifactRepository;
31 import org.apache.maven.artifact.repository.ArtifactRepositoryFactory;
32 import org.apache.maven.artifact.repository.ArtifactRepositoryPolicy;
33 import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
34 import org.apache.maven.cli.MavenCli;
35 import org.apache.maven.cli.configuration.SettingsXmlConfigurationProcessor;
36 import org.apache.maven.execution.DefaultMavenExecutionRequest;
37 import org.apache.maven.execution.DefaultMavenExecutionResult;
38 import org.apache.maven.execution.MavenExecutionRequest;
39 import org.apache.maven.execution.MavenExecutionRequestPopulator;
40 import org.apache.maven.execution.MavenExecutionResult;
41 import org.apache.maven.execution.MavenSession;
42 import org.apache.maven.model.Build;
43 import org.apache.maven.model.Dependency;
44 import org.apache.maven.model.Plugin;
45 import org.apache.maven.model.PluginManagement;
46 import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
47 import org.apache.maven.project.MavenProject;
48 import org.apache.maven.settings.Settings;
49 import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
50 import org.apache.maven.settings.building.SettingsBuilder;
51 import org.apache.maven.settings.building.SettingsBuildingException;
52 import org.apache.maven.settings.building.SettingsBuildingRequest;
53 import org.codehaus.plexus.ContainerConfiguration;
54 import org.codehaus.plexus.PlexusConstants;
55 import org.codehaus.plexus.PlexusTestCase;
56 import org.codehaus.plexus.classworlds.realm.ClassRealm;
57 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
58 import org.eclipse.aether.RepositorySystemSession;
59 import org.eclipse.aether.artifact.Artifact;
60 import org.eclipse.aether.repository.RemoteRepository;
61 import org.eclipse.aether.repository.WorkspaceReader;
62 import org.eclipse.aether.repository.WorkspaceRepository;
63
64
65
66
67 public class TestDefaultMavenReportExecutor extends PlexusTestCase {
68 @Override
69 protected void customizeContainerConfiguration(
70 @SuppressWarnings("unused") final ContainerConfiguration configuration) {
71 super.customizeContainerConfiguration(configuration);
72 configuration.setAutoWiring(true).setClassPathScanning(PlexusConstants.SCANNING_CACHE);
73 }
74
75 MavenExecutionRequest request = null;
76
77 ArtifactRepository localArtifactRepository;
78
79 public void testSimpleLookup() throws Exception {
80 MavenReportExecutor mavenReportExecutor = lookup(MavenReportExecutor.class);
81 assertNotNull(mavenReportExecutor);
82 }
83
84 public void testSimpleBuildReports() throws Exception {
85 ReportSet reportSet = new ReportSet();
86 reportSet.getReports().add("test-javadoc");
87 reportSet.getReports().add("javadoc");
88
89 MavenProject mavenProject = getMavenProject();
90 List<MavenReportExecution> mavenReportExecutions = buildReports(mavenProject, reportSet);
91
92 assertNotNull(mavenReportExecutions);
93 assertEquals(2, mavenReportExecutions.size());
94 assertEquals(
95 "testapidocs/index",
96 mavenReportExecutions.get(0).getMavenReport().getOutputName());
97 assertEquals(
98 "apidocs/index", mavenReportExecutions.get(1).getMavenReport().getOutputName());
99 }
100
101 public void testMultipleReportSets() throws Exception {
102 ReportSet reportSet = new ReportSet();
103 reportSet.getReports().add("javadoc");
104 ReportSet reportSet2 = new ReportSet();
105 reportSet2.getReports().add("test-javadoc");
106 reportSet2.getReports().add("javadoc");
107
108 MavenProject mavenProject = getMavenProject();
109 List<MavenReportExecution> mavenReportExecutions = buildReports(mavenProject, reportSet, reportSet2);
110
111 assertNotNull(mavenReportExecutions);
112 assertEquals(3, mavenReportExecutions.size());
113 assertEquals(
114 "apidocs/index", mavenReportExecutions.get(0).getMavenReport().getOutputName());
115 assertEquals(
116 "testapidocs/index",
117 mavenReportExecutions.get(1).getMavenReport().getOutputName());
118 assertEquals(
119 "apidocs/index", mavenReportExecutions.get(2).getMavenReport().getOutputName());
120 }
121
122 public void testReportingPluginWithDependenciesInPluginManagement() throws Exception {
123 ReportSet reportSet = new ReportSet();
124 reportSet.getReports().add("javadoc");
125
126 MavenProject mavenProject = getMavenProject();
127 Plugin plugin = new Plugin();
128 plugin.setGroupId("org.apache.maven.plugins");
129 plugin.setArtifactId("maven-javadoc-plugin");
130 plugin.setVersion("3.4.0");
131 Dependency dependency = new Dependency();
132 dependency.setGroupId("commons-lang");
133 dependency.setArtifactId("commons-lang");
134 dependency.setVersion("2.6");
135 plugin.getDependencies().add(dependency);
136 mavenProject.getBuild().setPluginManagement(new PluginManagement());
137 mavenProject.getBuild().getPluginManagement().addPlugin(plugin);
138 List<MavenReportExecution> mavenReportExecutions = buildReports(mavenProject, reportSet);
139
140 assertNotNull(mavenReportExecutions);
141 assertEquals(1, mavenReportExecutions.size());
142 List<Dependency> dependencies = mavenReportExecutions.get(0).getPlugin().getDependencies();
143 assertEquals(1, dependencies.size());
144 assertEquals("commons-lang", dependencies.get(0).getGroupId());
145 assertEquals("2.6", dependencies.get(0).getVersion());
146 }
147
148 private List<MavenReportExecution> buildReports(MavenProject mavenProject, ReportSet... javadocReportSets)
149 throws Exception {
150 ClassLoader orig = Thread.currentThread().getContextClassLoader();
151 ClassRealm realm = getContainer().getContainerRealm();
152
153 Thread.currentThread().setContextClassLoader(realm);
154 try {
155 MavenReportExecutorRequest mavenReportExecutorRequest = new MavenReportExecutorRequest();
156
157 mavenReportExecutorRequest.setLocalRepository(getLocalRepo());
158
159 mavenReportExecutorRequest.setProject(mavenProject);
160
161 MavenSession mavenSession = getMavenSession(getLocalRepo(), mavenProject);
162 mavenSession.setCurrentProject(mavenProject);
163 mavenSession.setProjects(Arrays.asList(mavenProject));
164 mavenReportExecutorRequest.setMavenSession(mavenSession);
165
166 ReportPlugin reportPlugin = new ReportPlugin();
167 reportPlugin.setGroupId("org.apache.maven.plugins");
168 reportPlugin.setArtifactId("maven-javadoc-plugin");
169 reportPlugin.setVersion("3.4.0");
170
171 for (ReportSet reportSet : javadocReportSets) {
172 reportPlugin.getReportSets().add(reportSet);
173 }
174
175 List<ReportPlugin> reportPlugins = Arrays.asList(reportPlugin);
176
177 mavenReportExecutorRequest.setReportPlugins(reportPlugins.toArray(new ReportPlugin[1]));
178
179 MavenReportExecutor mavenReportExecutor = lookup(MavenReportExecutor.class);
180
181 return mavenReportExecutor.buildMavenReports(mavenReportExecutorRequest);
182 } finally {
183 Thread.currentThread().setContextClassLoader(orig);
184 }
185 }
186
187 protected MavenSession getMavenSession(ArtifactRepository localRepository, final MavenProject mavenProject)
188 throws Exception {
189 request = new DefaultMavenExecutionRequest();
190 request.setLocalRepository(localRepository);
191
192 request.setWorkspaceReader(new WorkspaceReader() {
193 @Override
194 public WorkspaceRepository getRepository() {
195 return new WorkspaceRepository();
196 }
197
198 @Override
199 public File findArtifact(Artifact artifact) {
200 return null;
201 }
202
203 @Override
204 public List<String> findVersions(Artifact artifact) {
205 return Collections.emptyList();
206 }
207 });
208 final Settings settings = getSettings();
209
210 getContainer().lookup(MavenExecutionRequestPopulator.class).populateFromSettings(request, settings);
211
212 getContainer().lookup(MavenExecutionRequestPopulator.class).populateDefaults(request);
213
214 request.setLocalRepository(getLocalRepo());
215 request.setLocalRepositoryPath(getLocalRepo().getBasedir());
216 request.setCacheNotFound(false);
217
218 request.setSystemProperties(System.getProperties());
219
220 MavenExecutionResult result = new DefaultMavenExecutionResult();
221
222 RepositorySystemSession repositorySystemSession = buildRepositorySystemSession(request);
223
224 return new MavenSession(getContainer(), repositorySystemSession, request, result) {
225 @Override
226 public MavenProject getTopLevelProject() {
227 return mavenProject;
228 }
229
230 @Override
231 public Settings getSettings() {
232 return settings;
233 }
234
235 @Override
236 public List<MavenProject> getProjects() {
237 return Arrays.asList(mavenProject);
238 }
239
240 @Override
241 public MavenProject getCurrentProject() {
242 return mavenProject;
243 }
244 };
245 }
246
247 private ArtifactRepository getLocalRepo() throws Exception {
248 ArtifactRepositoryFactory artifactRepositoryFactory = lookup(ArtifactRepositoryFactory.class);
249 ArtifactRepositoryLayout defaultArtifactRepositoryLayout = lookup(ArtifactRepositoryLayout.class, "default");
250 String updatePolicyFlag = ArtifactRepositoryPolicy.UPDATE_POLICY_ALWAYS;
251 String checksumPolicyFlag = ArtifactRepositoryPolicy.CHECKSUM_POLICY_WARN;
252 ArtifactRepositoryPolicy snapshotsPolicy =
253 new ArtifactRepositoryPolicy(true, updatePolicyFlag, checksumPolicyFlag);
254 ArtifactRepositoryPolicy releasesPolicy =
255 new ArtifactRepositoryPolicy(true, updatePolicyFlag, checksumPolicyFlag);
256 String localRepoPath =
257 System.getProperty("localRepository", MavenCli.USER_MAVEN_CONFIGURATION_HOME.getPath() + "/repository");
258 return artifactRepositoryFactory.createArtifactRepository(
259 "local",
260 Paths.get(localRepoPath).toUri().toASCIIString(),
261 defaultArtifactRepositoryLayout,
262 snapshotsPolicy,
263 releasesPolicy);
264 }
265
266 public Settings getSettings() throws ComponentLookupException, SettingsBuildingException {
267
268 SettingsBuildingRequest settingsBuildingRequest = new DefaultSettingsBuildingRequest();
269
270 settingsBuildingRequest.setGlobalSettingsFile(SettingsXmlConfigurationProcessor.DEFAULT_GLOBAL_SETTINGS_FILE);
271
272 settingsBuildingRequest.setUserSettingsFile(SettingsXmlConfigurationProcessor.DEFAULT_USER_SETTINGS_FILE);
273
274 settingsBuildingRequest.getSystemProperties().putAll(System.getProperties());
275
276 return getContainer()
277 .lookup(SettingsBuilder.class)
278 .build(settingsBuildingRequest)
279 .getEffectiveSettings();
280 }
281
282 protected MavenProject getMavenProject() {
283 MavenProjectStub mavenProjectStub = new MavenProjectStub() {
284 @Override
285 public List<RemoteRepository> getRemotePluginRepositories() {
286 if (super.getRemotePluginRepositories() == null) {
287 return RepositoryUtils.toRepos(request.getRemoteRepositories());
288 }
289 return super.getRemotePluginRepositories();
290 }
291
292 @Override
293 public List<ArtifactRepository> getRemoteArtifactRepositories() {
294 if (super.getRemotePluginRepositories() == null) {
295 return request.getRemoteRepositories();
296 }
297 return super.getRemoteArtifactRepositories();
298 }
299
300 @Override
301 public String getName() {
302 return "foo";
303 }
304
305 @Override
306 public String getVersion() {
307 return "1.0-SNAPSHOT";
308 }
309
310 @Override
311 public boolean isExecutionRoot() {
312 return true;
313 }
314
315 @Override
316 public List<String> getCompileSourceRoots() {
317 return Arrays.asList("src/main/java");
318 }
319
320 @Override
321 public List<String> getTestCompileSourceRoots() {
322 return Arrays.asList("src/test/java");
323 }
324 };
325
326 mavenProjectStub.setPackaging("jar");
327
328 Build build = new Build();
329
330 build.setOutputDirectory("target");
331
332 build.setSourceDirectory("src/main/java");
333
334 build.setTestSourceDirectory("src/test/java");
335
336 mavenProjectStub.setBuild(build);
337
338 return mavenProjectStub;
339 }
340
341 private RepositorySystemSession buildRepositorySystemSession(MavenExecutionRequest request)
342 throws ComponentLookupException {
343 DefaultMaven defaultMaven = (DefaultMaven) getContainer().lookup(Maven.class);
344
345 return defaultMaven.newRepositorySession(request);
346 }
347 }