View Javadoc
1   package org.apache.maven.reporting.exec;
2   
3   /*
4    * Licensed to the Apache Software Foundation (ASF) under one
5    * or more contributor license agreements.  See the NOTICE file
6    * distributed with this work for additional information
7    * regarding copyright ownership.  The ASF licenses this file
8    * to you under the Apache License, Version 2.0 (the
9    * "License"); you may not use this file except in compliance
10   * with the License.  You may obtain a copy of the License at
11   *
12   *   http://www.apache.org/licenses/LICENSE-2.0
13   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import org.apache.maven.DefaultMaven;
23  import org.apache.maven.Maven;
24  import org.apache.maven.RepositoryUtils;
25  import org.apache.maven.artifact.repository.ArtifactRepository;
26  import org.apache.maven.cli.MavenCli;
27  import org.apache.maven.execution.DefaultMavenExecutionRequest;
28  import org.apache.maven.execution.DefaultMavenExecutionResult;
29  import org.apache.maven.execution.MavenExecutionRequest;
30  import org.apache.maven.execution.MavenExecutionRequestPopulator;
31  import org.apache.maven.execution.MavenExecutionResult;
32  import org.apache.maven.execution.MavenSession;
33  import org.apache.maven.model.Build;
34  import org.apache.maven.model.Dependency;
35  import org.apache.maven.model.Plugin;
36  import org.apache.maven.model.PluginManagement;
37  import org.apache.maven.plugin.testing.stubs.MavenProjectStub;
38  import org.apache.maven.project.MavenProject;
39  import org.apache.maven.repository.RepositorySystem;
40  import org.apache.maven.settings.Settings;
41  import org.apache.maven.settings.building.DefaultSettingsBuildingRequest;
42  import org.apache.maven.settings.building.SettingsBuilder;
43  import org.apache.maven.settings.building.SettingsBuildingException;
44  import org.apache.maven.settings.building.SettingsBuildingRequest;
45  import org.codehaus.plexus.ContainerConfiguration;
46  import org.codehaus.plexus.PlexusConstants;
47  import org.codehaus.plexus.PlexusTestCase;
48  import org.codehaus.plexus.classworlds.realm.ClassRealm;
49  import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
50  import org.eclipse.aether.RepositorySystemSession;
51  import org.eclipse.aether.artifact.Artifact;
52  import org.eclipse.aether.repository.RemoteRepository;
53  import org.eclipse.aether.repository.WorkspaceReader;
54  import org.eclipse.aether.repository.WorkspaceRepository;
55  
56  import java.io.File;
57  import java.util.Arrays;
58  import java.util.Collections;
59  import java.util.List;
60  
61  /**
62   * @author Olivier Lamy
63   */
64  public class TestDefaultMavenReportExecutor
65      extends PlexusTestCase
66  {
67      @Override
68      protected void customizeContainerConfiguration( @SuppressWarnings( "unused" ) final ContainerConfiguration configuration )
69      {
70          super.customizeContainerConfiguration( configuration );
71          configuration.setAutoWiring( true ).setClassPathScanning( PlexusConstants.SCANNING_CACHE );
72      }
73  
74      MavenExecutionRequest request = null;
75  
76      ArtifactRepository localArtifactRepository;
77  
78      public void testSimpleLookup()
79          throws Exception
80      {
81          MavenReportExecutor mavenReportExecutor = lookup( MavenReportExecutor.class );
82          assertNotNull( mavenReportExecutor );
83      }
84  
85      public void testSimpleBuildReports()
86          throws Exception
87      {
88          ReportSet reportSet = new ReportSet();
89          reportSet.getReports().add( "test-javadoc" );
90          reportSet.getReports().add( "javadoc" );
91  
92          MavenProject mavenProject = getMavenProject();
93          List<MavenReportExecution> mavenReportExecutions = buildReports( mavenProject, reportSet );
94  
95          assertNotNull( mavenReportExecutions );
96          assertEquals( 2, mavenReportExecutions.size() );
97          assertEquals( "testapidocs/index", mavenReportExecutions.get( 0 ).getMavenReport().getOutputName() );
98          assertEquals( "apidocs/index", mavenReportExecutions.get( 1 ).getMavenReport().getOutputName() );
99      }
100 
101     public void testMultipleReportSets()
102         throws Exception
103     {
104         ReportSet reportSet = new ReportSet();
105         reportSet.getReports().add( "javadoc" );
106         ReportSet reportSet2 = new ReportSet();
107         reportSet2.getReports().add( "test-javadoc" );
108         reportSet2.getReports().add( "javadoc" );
109 
110         MavenProject mavenProject = getMavenProject();
111         List<MavenReportExecution> mavenReportExecutions = buildReports( mavenProject, reportSet, reportSet2 );
112 
113         assertNotNull( mavenReportExecutions );
114         assertEquals( 3, mavenReportExecutions.size() );
115         assertEquals( "apidocs/index", mavenReportExecutions.get( 0 ).getMavenReport().getOutputName() );
116         assertEquals( "testapidocs/index", mavenReportExecutions.get( 1 ).getMavenReport().getOutputName() );
117         assertEquals( "apidocs/index", mavenReportExecutions.get( 2 ).getMavenReport().getOutputName() );
118     }
119 
120     public void testReportingPluginWithDependenciesInPluginManagement()
121         throws Exception
122     {
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     {
151         ClassLoader orig = Thread.currentThread().getContextClassLoader();
152         ClassRealm realm = getContainer().getContainerRealm();
153 
154         Thread.currentThread().setContextClassLoader( realm );
155         try
156         {
157             MavenReportExecutorRequest mavenReportExecutorRequest = new MavenReportExecutorRequest();
158 
159             mavenReportExecutorRequest.setLocalRepository( getLocalArtifactRepository() );
160 
161             mavenReportExecutorRequest.setProject( mavenProject );
162 
163             MavenSession mavenSession = getMavenSession( getLocalArtifactRepository(), mavenProject );
164             mavenSession.setCurrentProject( mavenProject );
165             mavenSession.setProjects( Arrays.asList( mavenProject ) );
166             mavenReportExecutorRequest.setMavenSession( mavenSession );
167 
168             ReportPlugin reportPlugin = new ReportPlugin();
169             reportPlugin.setGroupId( "org.apache.maven.plugins" );
170             reportPlugin.setArtifactId( "maven-javadoc-plugin" );
171             reportPlugin.setVersion( "3.4.0" );
172 
173             for ( ReportSet reportSet : javadocReportSets )
174             {
175                 reportPlugin.getReportSets().add( reportSet );
176             }
177 
178             List<ReportPlugin> reportPlugins = Arrays.asList( reportPlugin );
179 
180             mavenReportExecutorRequest.setReportPlugins( reportPlugins.toArray( new ReportPlugin[1] ) );
181 
182             MavenReportExecutor mavenReportExecutor = lookup( MavenReportExecutor.class );
183 
184             return mavenReportExecutor.buildMavenReports( mavenReportExecutorRequest );
185         }
186         finally
187         {
188             Thread.currentThread().setContextClassLoader( orig );
189         }
190     }
191 
192     protected MavenSession getMavenSession( ArtifactRepository localRepository, final MavenProject mavenProject )
193         throws Exception
194     {
195         request = new DefaultMavenExecutionRequest();
196         request.setLocalRepository( localRepository );
197 
198         request.setWorkspaceReader( new WorkspaceReader()
199         {
200             @Override
201             public WorkspaceRepository getRepository()
202             {
203                 return new WorkspaceRepository();
204             }
205 
206             @Override
207             public File findArtifact( Artifact artifact )
208             {
209                 return null;
210             }
211 
212             @Override
213             public List<String> findVersions( Artifact artifact )
214             {
215                 return Collections.emptyList();
216             }
217         } );
218         final Settings settings = getSettings();
219 
220         getContainer().lookup( MavenExecutionRequestPopulator.class ).populateFromSettings( request, settings );
221 
222         getContainer().lookup( MavenExecutionRequestPopulator.class ).populateDefaults( request );
223 
224         request.setLocalRepository( getLocalArtifactRepository() );
225         request.setLocalRepositoryPath( getLocalArtifactRepository().getBasedir() );
226         request.setCacheNotFound( false );
227 
228         request.setSystemProperties( System.getProperties() );
229 
230         MavenExecutionResult result = new DefaultMavenExecutionResult();
231 
232         RepositorySystemSession repositorySystemSession = buildRepositorySystemSession( request );
233 
234         return new MavenSession( getContainer(), repositorySystemSession, request, result )
235         {
236             @Override
237             public MavenProject getTopLevelProject()
238             {
239                 return mavenProject;
240             }
241 
242             @Override
243             public Settings getSettings()
244             {
245                 return settings;
246             }
247 
248             @Override
249             public List<MavenProject> getProjects()
250             {
251                 return Arrays.asList( mavenProject );
252             }
253 
254             @Override
255             public MavenProject getCurrentProject()
256             {
257                 return mavenProject;
258             }
259 
260         };
261     }
262 
263     private ArtifactRepository getLocalArtifactRepository()
264         throws Exception
265     {
266         if ( localArtifactRepository != null )
267         {
268             return localArtifactRepository;
269         }
270         String localRepoPath =
271             System.getProperty( "localRepository", MavenCli.userMavenConfigurationHome.getPath() + "/repository" );
272 
273         localArtifactRepository = lookup( RepositorySystem.class ).createLocalRepository( new File( localRepoPath ) );
274         return localArtifactRepository;
275     }
276 
277     public Settings getSettings()
278         throws ComponentLookupException, SettingsBuildingException
279     {
280 
281         SettingsBuildingRequest settingsBuildingRequest = new DefaultSettingsBuildingRequest();
282 
283         settingsBuildingRequest.setGlobalSettingsFile( MavenCli.DEFAULT_GLOBAL_SETTINGS_FILE );
284 
285         settingsBuildingRequest.setUserSettingsFile( MavenCli.DEFAULT_USER_SETTINGS_FILE );
286 
287         settingsBuildingRequest.getSystemProperties().putAll( System.getProperties() );
288 
289         return getContainer().lookup( SettingsBuilder.class )
290                 .build( settingsBuildingRequest ).getEffectiveSettings();
291 
292     }
293 
294     protected MavenProject getMavenProject()
295     {
296         MavenProjectStub mavenProjectStub = new MavenProjectStub()
297         {
298             @Override
299             public List<RemoteRepository> getRemotePluginRepositories()
300             {
301                 if ( super.getRemotePluginRepositories() == null )
302                 {
303                     return RepositoryUtils.toRepos( request.getRemoteRepositories() );
304                 }
305                 return super.getRemotePluginRepositories();
306             }
307 
308             @Override
309             public List<ArtifactRepository> getRemoteArtifactRepositories()
310             {
311                 if ( super.getRemotePluginRepositories() == null )
312                 {
313                     return request.getRemoteRepositories();
314                 }
315                 return super.getRemoteArtifactRepositories();
316             }
317 
318             @Override
319             public String getName()
320             {
321                 return "foo";
322             }
323 
324             @Override
325             public String getVersion()
326             {
327                 return "1.0-SNAPSHOT";
328             }
329 
330             @Override
331             public boolean isExecutionRoot()
332             {
333                 return true;
334             }
335 
336             @Override
337             public List<String> getCompileSourceRoots()
338             {
339                 return Arrays.asList( "src/main/java" );
340             }
341 
342             @Override
343             public List<String> getTestCompileSourceRoots()
344             {
345                 return Arrays.asList( "src/test/java" );
346             }
347         };
348 
349         mavenProjectStub.setPackaging( "jar" );
350 
351         Build build = new Build();
352 
353         build.setOutputDirectory( "target" );
354 
355         build.setSourceDirectory( "src/main/java" );
356 
357         build.setTestSourceDirectory( "src/test/java" );
358 
359         mavenProjectStub.setBuild( build );
360 
361         return mavenProjectStub;
362     }
363 
364     private RepositorySystemSession buildRepositorySystemSession( MavenExecutionRequest request )
365         throws ComponentLookupException
366     {
367         DefaultMaven defaultMaven = (DefaultMaven) getContainer().lookup( Maven.class );
368 
369         return defaultMaven.newRepositorySession( request );
370     }
371 
372 }