jstrachan    02/05/27 01:04:15

  Modified:    src/java/org/apache/maven/ant Ant.java
  Log:
  Patched the <ant> task so that references and properties can be exported to the 
projects build.xml
  
  This allows a projects build.xml to call Maven to download the jars, set the 
classpath and build the code and then do some other task, such as running example 
programs or specific test cases.
  
  Revision  Changes    Path
  1.3       +120 -11   jakarta-turbine-maven/src/java/org/apache/maven/ant/Ant.java
  
  Index: Ant.java
  ===================================================================
  RCS file: /home/cvs/jakarta-turbine-maven/src/java/org/apache/maven/ant/Ant.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- Ant.java  22 Apr 2002 00:15:04 -0000      1.2
  +++ Ant.java  27 May 2002 08:04:15 -0000      1.3
  @@ -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