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