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