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