View Javadoc
1   package org.apache.maven.plugin;
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 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   * @author Jason van Zyl
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         // TODO Auto-generated method stub
455         return null;
456     }
457 
458 }