From: "James Strachan" <[EMAIL PROTECTED]>
> From: "Stephen Haberman" <[EMAIL PROTECTED]>
> > I've been working on a build.xml file and I was thinking of
> > incorporating exportAll/exportRef functionality. I could just do a
> > replace of all </?ant with </?maven-ant. But then I'd have to go in and
> > manually turn on the exportAll/exportRefs for each one.
> >
> > Instead of defaulting them to false, what if you default them to
> > maven.ant.exportAll and maven.ant.exportRefs respectively? That way I
> > could set the properties once and not worry about them from then on.
>
> +1. I think thats a great idea. Users can always use <ant> instead of
> <maven-ant> if they prefer.

I've attached a modified patch to the <maven-ant> task that does exactly
this; by default all references and properties are exported by <maven-ant>.
Its all documented in the javadoc. Will put some user documentation together
soon (once I know the change gets committed ;-)

James

Index: src/java/org/apache/maven/ant/Ant.java
===================================================================
RCS file: /home/cvs/jakarta-turbine-maven/src/java/org/apache/maven/ant/Ant.java,v
retrieving revision 1.2
diff -u -r1.2 Ant.java
--- src/java/org/apache/maven/ant/Ant.java      22 Apr 2002 00:15:04 -0000      1.2
+++ src/java/org/apache/maven/ant/Ant.java      24 May 2002 07:00:52 -0000
@@ -121,6 +121,12 @@
     /** should we inherit references from the parent ? */
     private boolean inheritRefs = false;
 
+    /** should we export all properties to the parent ? */
+    private boolean exportAll = true;
+    
+    /** should we export references to the parent ? */
+    private boolean exportRefs = true;
+    
     /** the properties to pass to the new project */
     private Vector properties = new Vector();
 
@@ -154,6 +160,33 @@
     }
 
     /**
+     * <p>If true, all properties defined in the child Project
+     * are exported to the parent Project so long as they are not
+     * already defined. No properties will ever be overwritten.
+     * If false, properties are not exported to the parent project
+     * </p>
+     * 
+     * <p>This property defaults to true</p>
+     */
+    public void setExportAll(boolean value) {
+        exportAll = value;
+    }
+
+    /**
+     * <p>If true, all references will be exported from the child Project
+     * into the parent Project after the child project has been executed
+     * providing they don't already exist in the parent Project.
+     * No references will ever be overwritten.
+     * If false, references are not exported to the parent project
+     * </p>
+     * 
+     * <p>This property defaults to true</p>
+     */
+    public void setExportRefs(boolean value) {
+        exportRefs = value;
+    }
+
+    /**
      * Creates a Project instance for the project to call.
      */
     public void init()
@@ -403,6 +436,9 @@
             }
 
             newProject.executeTarget(target);
+            
+            exportProperties();
+            exportReferences();
         }
         finally
         {
@@ -451,14 +487,13 @@
         Hashtable thisReferences = (Hashtable) project.getReferences().clone();
         Hashtable newReferences = newProject.getReferences();
         Enumeration e;
-        if (references.size() > 0)
+        if (references.size() > 0) 
         {
             for (e = references.elements(); e.hasMoreElements(); ) 
             {
                 Reference ref = (Reference) e.nextElement();
                 String refid = ref.getRefId();
-                if (refid == null) 
-                {
+                if (refid == null) {
                     throw new BuildException("the refid attribute is required"
                                              + " for reference elements");
                 }
@@ -482,12 +517,12 @@
 
         // Now add all references that are not defined in the
         // subproject, if inheritRefs is true
-        if (inheritRefs)
+        if (inheritRefs) 
         {
-            for (e = thisReferences.keys(); e.hasMoreElements(); )
+            for (e = thisReferences.keys(); e.hasMoreElements(); ) 
             {
                 String key = (String) e.nextElement();
-                if (newReferences.containsKey(key))
+                if (newReferences.containsKey(key)) 
                 {
                     continue;
                 }
@@ -509,8 +544,25 @@
         //Object orig = project.getReference(oldKey);
         // Changed this to make it work with ant 1.4
         Object orig = project.getReferences().get(oldKey);
-        Class c = orig.getClass();
+        
+        copyReference(orig, newKey, newProject);
+    }
+
+    /**
+     * Try to clone the given reference .
+     *
+     * <p>If we cannot clone it, lets reuse the existing 
+     * reference and keep our fingers crossed.</p>
+     * 
+     * @param orig is the reference to be cloned
+     * @param key is the key for the newly created reference
+     * @param aProject is the project to add the new reference to
+     * @return a new cloned reference, ready for adding to a different project
+     */
+    private void copyReference(Object orig, String key, Project aProject)
+    {
         Object copy = orig;
+        Class c = orig.getClass();
         try
         {
             Method cloneM = c.getMethod("clone", new Class[0]);
@@ -527,7 +579,7 @@
 
         if (copy instanceof ProjectComponent)
         {
-            ((ProjectComponent) copy).setProject(newProject);
+            ((ProjectComponent) copy).setProject(aProject);
         }
         else
         {
@@ -537,7 +589,7 @@
                     c.getMethod("setProject", new Class[] {Project.class});
                 if (setProjectM != null)
                 {
-                    setProjectM.invoke(copy, new Object[] {newProject});
+                    setProjectM.invoke(copy, new Object[] {aProject});
                 }
             }
             catch (NoSuchMethodException e)
@@ -548,11 +600,68 @@
             catch (Exception e2)
             {
                 String msg = "Error setting new project instance for "
-                    + "reference with id " + oldKey;
+                    + "reference with new id " + key;
                 throw new BuildException(msg, e2, location);
             }
         }
-        newProject.addReference(newKey, copy);
+        aProject.addReference(key, copy);
+    }
+
+    /**
+     * Export any references defined in the child project to the parent
+     * Project providing that they don't already exist in the parent
+     * project.
+     */
+    private void exportReferences() throws BuildException {
+        if (exportRefs) {
+            Hashtable thisReferences = (Hashtable) project.getReferences().clone();
+            Hashtable newReferences = newProject.getReferences();
+            
+            for (Enumeration e = newReferences.keys(); e.hasMoreElements(); )
+            {
+                String refid = (String) e.nextElement();
+                if (refid != null)
+                {
+                    // do not overwrite any existing references
+                    if (!thisReferences.containsKey(refid)) 
+                    {
+                        Object reference = newReferences.get(refid);
+                        
+                        log("exporting reference for id: " + refid, 
+Project.MSG_VERBOSE);
+                        
+                        copyReference(reference, refid, project);
+                    }
+                }
+            }
+        }
+    }
+    
+
+    /**
+     * Export any properties defined in the child project to the parent
+     * Project providing that they don't already exist in the parent
+     * project.
+     */
+    private void exportProperties() throws BuildException {
+        if (exportAll) {
+            Hashtable thisProperties = (Hashtable) project.getProperties().clone();
+            Hashtable newProperties = newProject.getProperties();
+            
+            for (Enumeration e = newProperties.keys(); e.hasMoreElements(); )
+            {
+                String key = (String) e.nextElement();
+                if (key != null)
+                {
+                    // do not overwrite any existing properties
+                    if (!thisProperties.containsKey(key)) 
+                    {
+                        log("exporting property for key: " + key, 
+Project.MSG_VERBOSE);
+                        
+                        project.setProperty(key, newProject.getProperty(key));
+                    }
+                }
+            }
+        }
     }
 
     /**

--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to