You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@maven.apache.org by br...@apache.org on 2005/06/10 03:43:22 UTC

svn commit: r189873 - in /maven/components/trunk/maven-artifact-ant: ./ src/main/java/org/apache/maven/artifact/ant/ src/main/resources/org/apache/maven/artifact/ant/

Author: brett
Date: Thu Jun  9 18:43:21 2005
New Revision: 189873

URL: http://svn.apache.org/viewcvs?rev=189873&view=rev
Log:
PR: MNG-460
Submitted by: Nicola Ken Barozzi
Reviewed by:  Brett Porter
(applied with modifications)

Replace setProperty by a chained property helper, set up automatically when the POM is first declared.


Removed:
    maven/components/trunk/maven-artifact-ant/src/main/java/org/apache/maven/artifact/ant/SetPropertyTask.java
Modified:
    maven/components/trunk/maven-artifact-ant/sample.build.xml
    maven/components/trunk/maven-artifact-ant/src/main/java/org/apache/maven/artifact/ant/Pom.java
    maven/components/trunk/maven-artifact-ant/src/main/resources/org/apache/maven/artifact/ant/antlib.xml

Modified: maven/components/trunk/maven-artifact-ant/sample.build.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact-ant/sample.build.xml?rev=189873&r1=189872&r2=189873&view=diff
==============================================================================
--- maven/components/trunk/maven-artifact-ant/sample.build.xml (original)
+++ maven/components/trunk/maven-artifact-ant/sample.build.xml Thu Jun  9 18:43:21 2005
@@ -2,11 +2,9 @@
   <target name="test-pom">
     <artifact:pom file="pom.xml" id="my.maven.project"/>
 
-    <artifact:setProperty property="my.artifactid" expression="project.artifactId" pomRefId="my.maven.project" />
-    <echo>Artifact ID = ${my.artifactid}</echo>
+    <echo>Artifact ID = ${my.maven.project:artifactId}</echo>
 
-    <artifact:setProperty property="my.parent.artifactid" expression="project.parent.artifactId" pomRefId="my.maven.project" />
-    <echo>Artifact ID = ${my.parent.artifactid}</echo>
+    <echo>Parent Artifact ID = ${my.maven.project:parent.artifactId}</echo>
   </target>
 
   <target name="foo">

Modified: maven/components/trunk/maven-artifact-ant/src/main/java/org/apache/maven/artifact/ant/Pom.java
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact-ant/src/main/java/org/apache/maven/artifact/ant/Pom.java?rev=189873&r1=189872&r2=189873&view=diff
==============================================================================
--- maven/components/trunk/maven-artifact-ant/src/main/java/org/apache/maven/artifact/ant/Pom.java (original)
+++ maven/components/trunk/maven-artifact-ant/src/main/java/org/apache/maven/artifact/ant/Pom.java Thu Jun  9 18:43:21 2005
@@ -18,6 +18,7 @@
 
 import org.apache.maven.artifact.repository.ArtifactRepository;
 import org.apache.maven.artifact.resolver.ArtifactResolutionException;
+import org.apache.maven.artifact.resolver.ArtifactResolver;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.CiManagement;
 import org.apache.maven.model.DependencyManagement;
@@ -30,25 +31,44 @@
 import org.apache.maven.project.MavenProjectBuilder;
 import org.apache.maven.project.ProjectBuildingException;
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.ProjectComponent;
+import org.apache.tools.ant.PropertyHelper;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.codehaus.plexus.util.introspection.ReflectionValueExtractor;
 
 import java.io.File;
+import java.util.Collections;
 
 /**
- * A POM.
+ * A POM typedef.
+ *
+ * Also an Ant Task that registers a handler called POMPropertyHelper
+ * that intercepts all calls to property value resolution and replies instead
+ * of Ant to properties that start with the id of the pom.
+ *
+ * Example:
+ * ${maven.project:artifactId}
  *
  * @author <a href="mailto:brett@apache.org">Brett Porter</a>
+ * @author <a href="mailto:nicolaken@apache.org">Nicola Ken Barozzi</a>
  * @version $Id$
  */
 public class Pom
-    extends ProjectComponent
+    extends AbstractArtifactTask
 {
     private String refid;
 
+    private String antId;
+
     private MavenProject mavenProject;
 
     private File file;
 
+    /**
+     * The property interceptor.
+     */
+    private final POMPropertyHelper helper = new POMPropertyHelper();
+
     public String getRefid()
     {
         return refid;
@@ -59,6 +79,11 @@
         this.refid = refid;
     }
 
+    public void setId( String id )
+    {
+        this.antId = id;
+    }
+
     protected Pom getInstance()
     {
         Pom instance = this;
@@ -81,11 +106,13 @@
 
     void initialise( MavenProjectBuilder builder, ArtifactRepository localRepository )
     {
+        // TODO: should this be in execute() too? Would that work when it is used as a type?
         if ( file != null )
         {
             try
             {
-                mavenProject = builder.build( file, localRepository );
+                // TODO: should the profiles be constructed and passed in here? From Ant, or perhaps settings?
+                mavenProject = builder.build( file, localRepository, Collections.EMPTY_LIST );
             }
             catch ( ProjectBuildingException e )
             {
@@ -235,6 +262,78 @@
     public String getId()
     {
         return getMavenProject().getId();
+    }
+
+    /**
+     * Registers POMPropertyHelper as a property interceptor
+     */
+    public void execute()
+    {
+        ArtifactRepository localRepo = createLocalArtifactRepository();
+        MavenProjectBuilder projectBuilder = (MavenProjectBuilder) lookup( MavenProjectBuilder.ROLE );
+        initialise( projectBuilder, localRepo );
+
+        Project project = getProject();
+
+        // Add a reference to this task/type
+        project.addReference( antId, this );
+
+        // Register the property interceptor
+        PropertyHelper phelper = PropertyHelper.getPropertyHelper( project );
+        helper.setNext( phelper.getNext() );
+        helper.setProject( project );
+        phelper.setNext( helper );
+    }
+
+    /**
+     * The property interceptor that handles the calls for "pom." properties
+     */
+    private class POMPropertyHelper
+        extends PropertyHelper
+    {
+        /**
+         * The method that gets called by Ant with every request of property
+         */
+        public Object getPropertyHook( String ns, String name, boolean user )
+        {
+
+            String prefix = antId + ":";
+
+            if ( !name.startsWith( prefix ) )
+            {
+                // pass on to next interceptor
+                return super.getPropertyHook( ns, name, user );
+            }
+            try
+            {
+                // else handle the property resolution
+                String expression = name.substring( prefix.length() );
+                return getPOMValue( "project." + expression );
+
+            }
+            catch ( Exception ex )
+            {
+                ex.printStackTrace();
+                return null;
+            }
+        }
+
+        private Object getPOMValue( String expression )
+        {
+            Object value = null;
+
+            try
+            {
+                value = ReflectionValueExtractor.evaluate( expression, getMavenProject() );
+            }
+            catch ( Exception e )
+            {
+                throw new BuildException( "Error extracting expression from POM", e );
+            }
+
+            return value;
+        }
+
     }
 
 }

Modified: maven/components/trunk/maven-artifact-ant/src/main/resources/org/apache/maven/artifact/ant/antlib.xml
URL: http://svn.apache.org/viewcvs/maven/components/trunk/maven-artifact-ant/src/main/resources/org/apache/maven/artifact/ant/antlib.xml?rev=189873&r1=189872&r2=189873&view=diff
==============================================================================
--- maven/components/trunk/maven-artifact-ant/src/main/resources/org/apache/maven/artifact/ant/antlib.xml (original)
+++ maven/components/trunk/maven-artifact-ant/src/main/resources/org/apache/maven/artifact/ant/antlib.xml Thu Jun  9 18:43:21 2005
@@ -1,15 +1,16 @@
 <?xml version="1.0"?>
 <antlib>
   <!-- Tasks -->
-  <typedef name="dependencies" classname="org.apache.maven.artifact.ant.DependenciesTask"/>
-  <typedef name="install" classname="org.apache.maven.artifact.ant.InstallTask"/>
-  <typedef name="deploy" classname="org.apache.maven.artifact.ant.DeployTask"/>
-  <typedef name="setProperty" classname="org.apache.maven.artifact.ant.SetPropertyTask"/>
+  <taskdef name="dependencies" classname="org.apache.maven.artifact.ant.DependenciesTask"/>
+  <taskdef name="install" classname="org.apache.maven.artifact.ant.InstallTask"/>
+  <taskdef name="deploy" classname="org.apache.maven.artifact.ant.DeployTask"/>
 
   <!-- Types -->
   <typedef name="localRepository" classname="org.apache.maven.artifact.ant.LocalRepository"/>
   <typedef name="remoteRepository" classname="org.apache.maven.artifact.ant.RemoteRepository"/>
   <typedef name="authentication" classname="org.apache.maven.artifact.ant.Authentication"/>
   <typedef name="proxy" classname="org.apache.maven.artifact.ant.Proxy"/>
-  <typedef name="pom" classname="org.apache.maven.artifact.ant.Pom"/>
+
+  <!-- Tasks that are also types -->
+  <taskdef name="pom" classname="org.apache.maven.artifact.ant.Pom"/>
 </antlib>



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@maven.apache.org
For additional commands, e-mail: dev-help@maven.apache.org