1 package org.apache.maven.reporting.exec;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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 }