1 package org.apache.maven.plugin;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.File;
23 import java.util.ArrayList;
24 import java.util.Collections;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Properties;
28
29 import org.apache.maven.AbstractCoreMavenComponentTestCase;
30 import org.apache.maven.artifact.Artifact;
31 import org.apache.maven.artifact.ArtifactUtils;
32 import org.apache.maven.artifact.repository.ArtifactRepository;
33 import org.apache.maven.execution.DefaultMavenExecutionRequest;
34 import org.apache.maven.execution.DefaultMavenExecutionResult;
35 import org.apache.maven.execution.MavenExecutionRequest;
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.Model;
40 import org.apache.maven.plugin.descriptor.MojoDescriptor;
41 import org.apache.maven.plugin.descriptor.PluginDescriptor;
42 import org.apache.maven.project.DuplicateProjectException;
43 import org.apache.maven.project.MavenProject;
44 import org.apache.maven.repository.RepositorySystem;
45 import org.codehaus.plexus.MutablePlexusContainer;
46 import org.codehaus.plexus.PlexusContainer;
47 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator;
48 import org.codehaus.plexus.util.dag.CycleDetectedException;
49 import org.junit.jupiter.api.Test;
50
51 import static org.codehaus.plexus.testing.PlexusExtension.getTestFile;
52 import static org.junit.jupiter.api.Assertions.assertEquals;
53 import static org.junit.jupiter.api.Assertions.assertNotNull;
54 import static org.junit.jupiter.api.Assertions.assertSame;
55 import static org.junit.jupiter.api.Assertions.assertTrue;
56
57 import javax.inject.Inject;
58
59
60
61
62 public class PluginParameterExpressionEvaluatorTest
63 extends AbstractCoreMavenComponentTestCase
64 {
65 private static final String FS = File.separator;
66
67 @Inject
68 private RepositorySystem factory;
69
70 @Test
71 public void testPluginDescriptorExpressionReference()
72 throws Exception
73 {
74 MojoExecution exec = newMojoExecution();
75
76 MavenSession session = newMavenSession();
77
78 Object result = new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin}" );
79
80 System.out.println( "Result: " + result );
81
82 assertSame( exec.getMojoDescriptor().getPluginDescriptor(),
83 result,
84 "${plugin} expression does not return plugin descriptor." );
85 }
86
87 @Test
88 public void testPluginArtifactsExpressionReference()
89 throws Exception
90 {
91 MojoExecution exec = newMojoExecution();
92
93 Artifact depArtifact = createArtifact( "group", "artifact", "1" );
94
95 List<Artifact> deps = new ArrayList<>();
96 deps.add( depArtifact );
97
98 exec.getMojoDescriptor().getPluginDescriptor().setArtifacts( deps );
99
100 MavenSession session = newMavenSession();
101
102 @SuppressWarnings( "unchecked" )
103 List<Artifact> depResults =
104 (List<Artifact>) new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifacts}" );
105
106 System.out.println( "Result: " + depResults );
107
108 assertNotNull( depResults );
109 assertEquals( 1, depResults.size() );
110 assertSame( depArtifact, depResults.get( 0 ), "dependency artifact is wrong." );
111 }
112
113 @Test
114 public void testPluginArtifactMapExpressionReference()
115 throws Exception
116 {
117 MojoExecution exec = newMojoExecution();
118
119 Artifact depArtifact = createArtifact( "group", "artifact", "1" );
120
121 List<Artifact> deps = new ArrayList<>();
122 deps.add( depArtifact );
123
124 exec.getMojoDescriptor().getPluginDescriptor().setArtifacts( deps );
125
126 MavenSession session = newMavenSession();
127
128 @SuppressWarnings( "unchecked" )
129 Map<String, Artifact> depResults =
130 (Map<String, Artifact>) new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifactMap}" );
131
132 System.out.println( "Result: " + depResults );
133
134 assertNotNull( depResults );
135 assertEquals( 1, depResults.size() );
136 assertSame( depArtifact,
137 depResults.get( ArtifactUtils.versionlessKey( depArtifact ) ),
138 "dependency artifact is wrong." );
139 }
140
141 @Test
142 public void testPluginArtifactIdExpressionReference()
143 throws Exception
144 {
145 MojoExecution exec = newMojoExecution();
146
147 MavenSession session = newMavenSession();
148
149 Object result = new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifactId}" );
150
151 System.out.println( "Result: " + result );
152
153 assertSame( exec.getMojoDescriptor().getPluginDescriptor().getArtifactId(),
154 result,
155 "${plugin.artifactId} expression does not return plugin descriptor's artifactId." );
156 }
157
158 @Test
159 public void testValueExtractionWithAPomValueContainingAPath()
160 throws Exception
161 {
162 String expected = getTestFile( "target/test-classes/target/classes" ).getCanonicalPath();
163
164 Build build = new Build();
165 build.setDirectory( expected.substring( 0, expected.length() - "/classes".length() ) );
166
167 Model model = new Model();
168 model.setBuild( build );
169
170 MavenProject project = new MavenProject( model );
171 project.setFile( new File( "pom.xml" ).getCanonicalFile() );
172
173 ExpressionEvaluator expressionEvaluator = createExpressionEvaluator( project, null, new Properties() );
174
175 Object value = expressionEvaluator.evaluate( "${project.build.directory}/classes" );
176 String actual = new File( value.toString() ).getCanonicalPath();
177
178 assertEquals( expected, actual );
179 }
180
181 @Test
182 public void testEscapedVariablePassthrough()
183 throws Exception
184 {
185 String var = "${var}";
186
187 Model model = new Model();
188 model.setVersion( "1" );
189
190 MavenProject project = new MavenProject( model );
191
192 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
193
194 Object value = ee.evaluate( "$" + var );
195
196 assertEquals( var, value );
197 }
198
199 @Test
200 public void testEscapedVariablePassthroughInLargerExpression()
201 throws Exception
202 {
203 String var = "${var}";
204 String key = var + " with version: ${project.version}";
205
206 Model model = new Model();
207 model.setVersion( "1" );
208
209 MavenProject project = new MavenProject( model );
210
211 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
212
213 Object value = ee.evaluate( "$" + key );
214
215 assertEquals( "${var} with version: 1", value );
216 }
217
218 @Test
219 public void testMultipleSubExpressionsInLargerExpression()
220 throws Exception
221 {
222 String key = "${project.artifactId} with version: ${project.version}";
223
224 Model model = new Model();
225 model.setArtifactId( "test" );
226 model.setVersion( "1" );
227
228 MavenProject project = new MavenProject( model );
229
230 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
231
232 Object value = ee.evaluate( key );
233
234 assertEquals( "test with version: 1", value );
235 }
236
237 @Test
238 public void testMissingPOMPropertyRefInLargerExpression()
239 throws Exception
240 {
241 String expr = "/path/to/someproject-${baseVersion}";
242
243 MavenProject project = new MavenProject( new Model() );
244
245 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
246
247 Object value = ee.evaluate( expr );
248
249 assertEquals( expr, value );
250 }
251
252 @Test
253 public void testPOMPropertyExtractionWithMissingProject_WithDotNotation()
254 throws Exception
255 {
256 String key = "m2.name";
257 String checkValue = "value";
258
259 Properties properties = new Properties();
260 properties.setProperty( key, checkValue );
261
262 Model model = new Model();
263 model.setProperties( properties );
264
265 MavenProject project = new MavenProject( model );
266
267 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() );
268
269 Object value = ee.evaluate( "${" + key + "}" );
270
271 assertEquals( checkValue, value );
272 }
273
274 @Test
275 public void testBasedirExtractionWithMissingProject()
276 throws Exception
277 {
278 ExpressionEvaluator ee = createExpressionEvaluator( null, null, new Properties() );
279
280 Object value = ee.evaluate( "${basedir}" );
281
282 assertEquals( System.getProperty( "user.dir" ), value );
283 }
284
285 @Test
286 public void testValueExtractionFromSystemPropertiesWithMissingProject()
287 throws Exception
288 {
289 String sysprop = "PPEET_sysprop1";
290
291 Properties executionProperties = new Properties();
292
293 if ( executionProperties.getProperty( sysprop ) == null )
294 {
295 executionProperties.setProperty( sysprop, "value" );
296 }
297
298 ExpressionEvaluator ee = createExpressionEvaluator( null, null, executionProperties );
299
300 Object value = ee.evaluate( "${" + sysprop + "}" );
301
302 assertEquals( "value", value );
303 }
304
305 @Test
306 public void testValueExtractionFromSystemPropertiesWithMissingProject_WithDotNotation()
307 throws Exception
308 {
309 String sysprop = "PPEET.sysprop2";
310
311 Properties executionProperties = new Properties();
312
313 if ( executionProperties.getProperty( sysprop ) == null )
314 {
315 executionProperties.setProperty( sysprop, "value" );
316 }
317
318 ExpressionEvaluator ee = createExpressionEvaluator( null, null, executionProperties );
319
320 Object value = ee.evaluate( "${" + sysprop + "}" );
321
322 assertEquals( "value", value );
323 }
324
325 @SuppressWarnings( "deprecation" )
326 private static MavenSession createSession( PlexusContainer container, ArtifactRepository repo, Properties properties )
327 throws CycleDetectedException, DuplicateProjectException
328 {
329 MavenExecutionRequest request = new DefaultMavenExecutionRequest()
330 .setSystemProperties( properties )
331 .setGoals( Collections.<String>emptyList() )
332 .setBaseDirectory( new File( "" ) )
333 .setLocalRepository( repo );
334
335 return new MavenSession( container, request, new DefaultMavenExecutionResult(), Collections.<MavenProject>emptyList() );
336 }
337
338 @Test
339 public void testLocalRepositoryExtraction()
340 throws Exception
341 {
342 ExpressionEvaluator expressionEvaluator =
343 createExpressionEvaluator( createDefaultProject(), null, new Properties() );
344 Object value = expressionEvaluator.evaluate( "${localRepository}" );
345
346 assertEquals( "local", ( (ArtifactRepository) value ).getId() );
347 }
348
349 @Test
350 public void testTwoExpressions()
351 throws Exception
352 {
353 Build build = new Build();
354 build.setDirectory( "expected-directory" );
355 build.setFinalName( "expected-finalName" );
356
357 Model model = new Model();
358 model.setBuild( build );
359
360 ExpressionEvaluator expressionEvaluator =
361 createExpressionEvaluator( new MavenProject( model ), null, new Properties() );
362
363 Object value = expressionEvaluator.evaluate( "${project.build.directory}" + FS + "${project.build.finalName}" );
364
365 assertEquals( "expected-directory" + File.separatorChar + "expected-finalName", value );
366 }
367
368 @Test
369 public void testShouldExtractPluginArtifacts()
370 throws Exception
371 {
372 PluginDescriptor pd = new PluginDescriptor();
373
374 Artifact artifact = createArtifact( "testGroup", "testArtifact", "1.0" );
375
376 pd.setArtifacts( Collections.singletonList( artifact ) );
377
378 ExpressionEvaluator ee = createExpressionEvaluator( createDefaultProject(), pd, new Properties() );
379
380 Object value = ee.evaluate( "${plugin.artifacts}" );
381
382 assertTrue( value instanceof List );
383
384 @SuppressWarnings( "unchecked" )
385 List<Artifact> artifacts = (List<Artifact>) value;
386
387 assertEquals( 1, artifacts.size() );
388
389 Artifact result = artifacts.get( 0 );
390
391 assertEquals( "testGroup", result.getGroupId() );
392 }
393
394 private MavenProject createDefaultProject()
395 {
396 return new MavenProject( new Model() );
397 }
398
399 private ExpressionEvaluator createExpressionEvaluator( MavenProject project, PluginDescriptor pluginDescriptor, Properties executionProperties )
400 throws Exception
401 {
402 ArtifactRepository repo = factory.createDefaultLocalRepository();
403
404 MutablePlexusContainer container = (MutablePlexusContainer) getContainer();
405 MavenSession session = createSession( container, repo, executionProperties );
406 session.setCurrentProject( project );
407
408 MojoDescriptor mojo = new MojoDescriptor();
409 mojo.setPluginDescriptor( pluginDescriptor );
410 mojo.setGoal( "goal" );
411
412 MojoExecution mojoExecution = new MojoExecution( mojo );
413
414 return new PluginParameterExpressionEvaluator( session, mojoExecution );
415 }
416
417 protected Artifact createArtifact( String groupId, String artifactId, String version )
418 throws Exception
419 {
420 Dependency dependency = new Dependency();
421 dependency.setGroupId( groupId );
422 dependency.setArtifactId( artifactId );
423 dependency.setVersion( version );
424 dependency.setType( "jar" );
425 dependency.setScope( "compile" );
426
427 return factory.createDependencyArtifact( dependency );
428 }
429
430 private MojoExecution newMojoExecution()
431 {
432 PluginDescriptor pd = new PluginDescriptor();
433 pd.setArtifactId( "my-plugin" );
434 pd.setGroupId( "org.myco.plugins" );
435 pd.setVersion( "1" );
436
437 MojoDescriptor md = new MojoDescriptor();
438 md.setPluginDescriptor( pd );
439
440 pd.addComponentDescriptor( md );
441
442 return new MojoExecution( md );
443 }
444
445 private MavenSession newMavenSession()
446 throws Exception
447 {
448 return createMavenSession( null );
449 }
450
451 @Override
452 protected String getProjectsDirectory()
453 {
454
455 return null;
456 }
457
458 }