001 package org.apache.maven.plugin; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import java.io.File; 023 import java.util.ArrayList; 024 import java.util.Collections; 025 import java.util.List; 026 import java.util.Map; 027 import java.util.Properties; 028 029 import org.apache.maven.AbstractCoreMavenComponentTestCase; 030 import org.apache.maven.artifact.Artifact; 031 import org.apache.maven.artifact.ArtifactUtils; 032 import org.apache.maven.artifact.repository.ArtifactRepository; 033 import org.apache.maven.execution.DefaultMavenExecutionRequest; 034 import org.apache.maven.execution.DefaultMavenExecutionResult; 035 import org.apache.maven.execution.MavenExecutionRequest; 036 import org.apache.maven.execution.MavenSession; 037 import org.apache.maven.model.Build; 038 import org.apache.maven.model.Dependency; 039 import org.apache.maven.model.Model; 040 import org.apache.maven.plugin.descriptor.MojoDescriptor; 041 import org.apache.maven.plugin.descriptor.PluginDescriptor; 042 import org.apache.maven.project.DuplicateProjectException; 043 import org.apache.maven.project.MavenProject; 044 import org.apache.maven.repository.RepositorySystem; 045 import org.codehaus.plexus.MutablePlexusContainer; 046 import org.codehaus.plexus.PlexusContainer; 047 import org.codehaus.plexus.component.configurator.expression.ExpressionEvaluator; 048 import org.codehaus.plexus.util.dag.CycleDetectedException; 049 050 /** 051 * @author Jason van Zyl 052 */ 053 public class PluginParameterExpressionEvaluatorTest 054 extends AbstractCoreMavenComponentTestCase 055 { 056 private static final String FS = System.getProperty( "file.separator" ); 057 058 private RepositorySystem factory; 059 060 public void setUp() 061 throws Exception 062 { 063 super.setUp(); 064 factory = lookup( RepositorySystem.class ); 065 } 066 067 @Override 068 protected void tearDown() 069 throws Exception 070 { 071 factory = null; 072 super.tearDown(); 073 } 074 075 public void testPluginDescriptorExpressionReference() 076 throws Exception 077 { 078 MojoExecution exec = newMojoExecution(); 079 080 MavenSession session = newMavenSession(); 081 082 Object result = new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin}" ); 083 084 System.out.println( "Result: " + result ); 085 086 assertSame( "${plugin} expression does not return plugin descriptor.", 087 exec.getMojoDescriptor().getPluginDescriptor(), 088 result ); 089 } 090 091 public void testPluginArtifactsExpressionReference() 092 throws Exception 093 { 094 MojoExecution exec = newMojoExecution(); 095 096 Artifact depArtifact = createArtifact( "group", "artifact", "1" ); 097 098 List<Artifact> deps = new ArrayList<Artifact>(); 099 deps.add( depArtifact ); 100 101 exec.getMojoDescriptor().getPluginDescriptor().setArtifacts( deps ); 102 103 MavenSession session = newMavenSession(); 104 105 @SuppressWarnings( "unchecked" ) 106 List<Artifact> depResults = 107 (List<Artifact>) new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifacts}" ); 108 109 System.out.println( "Result: " + depResults ); 110 111 assertNotNull( depResults ); 112 assertEquals( 1, depResults.size() ); 113 assertSame( "dependency artifact is wrong.", depArtifact, depResults.get( 0 ) ); 114 } 115 116 public void testPluginArtifactMapExpressionReference() 117 throws Exception 118 { 119 MojoExecution exec = newMojoExecution(); 120 121 Artifact depArtifact = createArtifact( "group", "artifact", "1" ); 122 123 List<Artifact> deps = new ArrayList<Artifact>(); 124 deps.add( depArtifact ); 125 126 exec.getMojoDescriptor().getPluginDescriptor().setArtifacts( deps ); 127 128 MavenSession session = newMavenSession(); 129 130 @SuppressWarnings( "unchecked" ) 131 Map<String, Artifact> depResults = 132 (Map<String, Artifact>) new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifactMap}" ); 133 134 System.out.println( "Result: " + depResults ); 135 136 assertNotNull( depResults ); 137 assertEquals( 1, depResults.size() ); 138 assertSame( "dependency artifact is wrong.", 139 depArtifact, 140 depResults.get( ArtifactUtils.versionlessKey( depArtifact ) ) ); 141 } 142 143 public void testPluginArtifactIdExpressionReference() 144 throws Exception 145 { 146 MojoExecution exec = newMojoExecution(); 147 148 MavenSession session = newMavenSession(); 149 150 Object result = new PluginParameterExpressionEvaluator( session, exec ).evaluate( "${plugin.artifactId}" ); 151 152 System.out.println( "Result: " + result ); 153 154 assertSame( "${plugin.artifactId} expression does not return plugin descriptor's artifactId.", 155 exec.getMojoDescriptor().getPluginDescriptor().getArtifactId(), 156 result ); 157 } 158 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 public void testEscapedVariablePassthrough() 182 throws Exception 183 { 184 String var = "${var}"; 185 186 Model model = new Model(); 187 model.setVersion( "1" ); 188 189 MavenProject project = new MavenProject( model ); 190 191 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() ); 192 193 Object value = ee.evaluate( "$" + var ); 194 195 assertEquals( var, value ); 196 } 197 198 public void testEscapedVariablePassthroughInLargerExpression() 199 throws Exception 200 { 201 String var = "${var}"; 202 String key = var + " with version: ${project.version}"; 203 204 Model model = new Model(); 205 model.setVersion( "1" ); 206 207 MavenProject project = new MavenProject( model ); 208 209 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() ); 210 211 Object value = ee.evaluate( "$" + key ); 212 213 assertEquals( "${var} with version: 1", value ); 214 } 215 216 public void testMultipleSubExpressionsInLargerExpression() 217 throws Exception 218 { 219 String key = "${project.artifactId} with version: ${project.version}"; 220 221 Model model = new Model(); 222 model.setArtifactId( "test" ); 223 model.setVersion( "1" ); 224 225 MavenProject project = new MavenProject( model ); 226 227 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() ); 228 229 Object value = ee.evaluate( key ); 230 231 assertEquals( "test with version: 1", value ); 232 } 233 234 public void testMissingPOMPropertyRefInLargerExpression() 235 throws Exception 236 { 237 String expr = "/path/to/someproject-${baseVersion}"; 238 239 MavenProject project = new MavenProject( new Model() ); 240 241 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() ); 242 243 Object value = ee.evaluate( expr ); 244 245 assertEquals( expr, value ); 246 } 247 248 public void testPOMPropertyExtractionWithMissingProject_WithDotNotation() 249 throws Exception 250 { 251 String key = "m2.name"; 252 String checkValue = "value"; 253 254 Properties properties = new Properties(); 255 properties.setProperty( key, checkValue ); 256 257 Model model = new Model(); 258 model.setProperties( properties ); 259 260 MavenProject project = new MavenProject( model ); 261 262 ExpressionEvaluator ee = createExpressionEvaluator( project, null, new Properties() ); 263 264 Object value = ee.evaluate( "${" + key + "}" ); 265 266 assertEquals( checkValue, value ); 267 } 268 269 public void testBasedirExtractionWithMissingProject() 270 throws Exception 271 { 272 ExpressionEvaluator ee = createExpressionEvaluator( null, null, new Properties() ); 273 274 Object value = ee.evaluate( "${basedir}" ); 275 276 assertEquals( System.getProperty( "user.dir" ), value ); 277 } 278 279 public void testValueExtractionFromSystemPropertiesWithMissingProject() 280 throws Exception 281 { 282 String sysprop = "PPEET_sysprop1"; 283 284 Properties executionProperties = new Properties(); 285 286 if ( executionProperties.getProperty( sysprop ) == null ) 287 { 288 executionProperties.setProperty( sysprop, "value" ); 289 } 290 291 ExpressionEvaluator ee = createExpressionEvaluator( null, null, executionProperties ); 292 293 Object value = ee.evaluate( "${" + sysprop + "}" ); 294 295 assertEquals( "value", value ); 296 } 297 298 public void testValueExtractionFromSystemPropertiesWithMissingProject_WithDotNotation() 299 throws Exception 300 { 301 String sysprop = "PPEET.sysprop2"; 302 303 Properties executionProperties = new Properties(); 304 305 if ( executionProperties.getProperty( sysprop ) == null ) 306 { 307 executionProperties.setProperty( sysprop, "value" ); 308 } 309 310 ExpressionEvaluator ee = createExpressionEvaluator( null, null, executionProperties ); 311 312 Object value = ee.evaluate( "${" + sysprop + "}" ); 313 314 assertEquals( "value", value ); 315 } 316 317 @SuppressWarnings( "deprecation" ) 318 private static MavenSession createSession( PlexusContainer container, ArtifactRepository repo, Properties properties ) 319 throws CycleDetectedException, DuplicateProjectException 320 { 321 MavenExecutionRequest request = new DefaultMavenExecutionRequest() 322 .setSystemProperties( properties ) 323 .setGoals( Collections.<String>emptyList() ) 324 .setBaseDirectory( new File( "" ) ) 325 .setLocalRepository( repo ); 326 327 return new MavenSession( container, request, new DefaultMavenExecutionResult(), Collections.<MavenProject>emptyList() ); 328 } 329 330 public void testLocalRepositoryExtraction() 331 throws Exception 332 { 333 ExpressionEvaluator expressionEvaluator = 334 createExpressionEvaluator( createDefaultProject(), null, new Properties() ); 335 Object value = expressionEvaluator.evaluate( "${localRepository}" ); 336 337 assertEquals( "local", ( (ArtifactRepository) value ).getId() ); 338 } 339 340 public void testTwoExpressions() 341 throws Exception 342 { 343 Build build = new Build(); 344 build.setDirectory( "expected-directory" ); 345 build.setFinalName( "expected-finalName" ); 346 347 Model model = new Model(); 348 model.setBuild( build ); 349 350 ExpressionEvaluator expressionEvaluator = 351 createExpressionEvaluator( new MavenProject( model ), null, new Properties() ); 352 353 Object value = expressionEvaluator.evaluate( "${project.build.directory}" + FS + "${project.build.finalName}" ); 354 355 assertEquals( "expected-directory" + File.separatorChar + "expected-finalName", value ); 356 } 357 358 public void testShouldExtractPluginArtifacts() 359 throws Exception 360 { 361 PluginDescriptor pd = new PluginDescriptor(); 362 363 Artifact artifact = createArtifact( "testGroup", "testArtifact", "1.0" ); 364 365 pd.setArtifacts( Collections.singletonList( artifact ) ); 366 367 ExpressionEvaluator ee = createExpressionEvaluator( createDefaultProject(), pd, new Properties() ); 368 369 Object value = ee.evaluate( "${plugin.artifacts}" ); 370 371 assertTrue( value instanceof List ); 372 373 @SuppressWarnings( "unchecked" ) 374 List<Artifact> artifacts = (List<Artifact>) value; 375 376 assertEquals( 1, artifacts.size() ); 377 378 Artifact result = artifacts.get( 0 ); 379 380 assertEquals( "testGroup", result.getGroupId() ); 381 } 382 383 private MavenProject createDefaultProject() 384 { 385 return new MavenProject( new Model() ); 386 } 387 388 private ExpressionEvaluator createExpressionEvaluator( MavenProject project, PluginDescriptor pluginDescriptor, Properties executionProperties ) 389 throws Exception 390 { 391 ArtifactRepository repo = factory.createDefaultLocalRepository(); 392 393 MutablePlexusContainer container = (MutablePlexusContainer) getContainer(); 394 MavenSession session = createSession( container, repo, executionProperties ); 395 session.setCurrentProject( project ); 396 397 MojoDescriptor mojo = new MojoDescriptor(); 398 mojo.setPluginDescriptor( pluginDescriptor ); 399 mojo.setGoal( "goal" ); 400 401 MojoExecution mojoExecution = new MojoExecution( mojo ); 402 403 return new PluginParameterExpressionEvaluator( session, mojoExecution ); 404 } 405 406 protected Artifact createArtifact( String groupId, String artifactId, String version ) 407 throws Exception 408 { 409 Dependency dependency = new Dependency(); 410 dependency.setGroupId( groupId ); 411 dependency.setArtifactId( artifactId ); 412 dependency.setVersion( version ); 413 dependency.setType( "jar" ); 414 dependency.setScope( "compile" ); 415 416 return factory.createDependencyArtifact( dependency ); 417 } 418 419 private MojoExecution newMojoExecution() 420 { 421 PluginDescriptor pd = new PluginDescriptor(); 422 pd.setArtifactId( "my-plugin" ); 423 pd.setGroupId( "org.myco.plugins" ); 424 pd.setVersion( "1" ); 425 426 MojoDescriptor md = new MojoDescriptor(); 427 md.setPluginDescriptor( pd ); 428 429 pd.addComponentDescriptor( md ); 430 431 return new MojoExecution( md ); 432 } 433 434 private MavenSession newMavenSession() 435 throws Exception 436 { 437 return createMavenSession( null ); 438 } 439 440 @Override 441 protected String getProjectsDirectory() 442 { 443 // TODO Auto-generated method stub 444 return null; 445 } 446 447 }