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.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   * @author Olivier Lamy
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 }