You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by Ja...@rzf.fin-nrw.de on 2003/08/22 12:38:54 UTC

RE: [VOTE] Ant/Antcall Returning properties and references [WAS] Re: ant 1.5.4 : Import

+1

Jan

> -----Original Message-----
> From: Antoine Levy-Lambert [mailto:antoine@antbuild.com]
> Sent: Friday, August 22, 2003 12:29 PM
> To: Ant Developers List
> Subject: [VOTE] Ant/Antcall Returning properties and references [WAS]
> Re: ant 1.5.4 : Import
> 
> 
> I think that the code of Dominique would add a lot of value to ant.
> Instead of committing the code as is, I would like simply to 
> add the new
> features to the <ant/> task.
> This means that it should be a no brainer to have these 
> features then also
> in <antcall/>
> Can we vote about introducing it ?
> I start with my +1
> Cheers,
> Antoine
> ----- Original Message -----
> From: "Dominique Devienne" <DD...@lgc.com>
> To: "'Ant Developers List'" <de...@ant.apache.org>
> Sent: Thursday, July 24, 2003 5:36 PM
> Subject: RE: ant 1.5.4 : Import
> 
> 
> > Then have a look at what I did in the past two days to do something
> similar
> > ;-) I created an <antreturn> task that piggybacks on <ant>, 
> and allows
> > returning properties and/or references from the called 
> build file back
> into
> > the caller's context (Project).
> >
> > That would take care of that use case ;-) --DD
> >
> > > -----Original Message-----
> > > From: Conor MacNeill [mailto:conor@cortexebusiness.com.au]
> > > Sent: Thursday, July 24, 2003 10:39 AM
> > > To: Ant Developers List
> > > Subject: Re: ant 1.5.4 : Import
> > >
> > > On Fri, 25 Jul 2003 01:23 am, Dominique Devienne wrote:
> > > >
> > > > I (strongly again ;) believe that imported build files should be
> > > designed
> > > > to be imported, and never used without being imported.
> > >
> > > I disagree (strongly :-). I think augmenting/overriding 
> an existing
> build
> > > file
> > > is a valid use for import. I recently changed the 
> checkstyle build I
> have
> > > been using (check.xml) to import Ant's build.xml to pick 
> up property
> defs
> > > for
> > > various locations. Have a look.
> > >
> > > Conor
> >
> >
> > <?xml version="1.0"?>
> >
> > <project name="AntReturnTest" default="test-returnProperty">
> >
> >   <!-- Our custom tasks we are testing -->
> >   <taskdef resource="com/lgc/buildmagic/tasks.properties" />
> >   <typedef resource="com/lgc/buildmagic/types.properties" />
> >
> >   <target name="test-returnProperty">
> >     <antreturn antfile="AntReturnNestedTest.xml" 
> target="set-properties">
> >       <return>
> >         <property name="propA" />
> >         <property name="propC" />
> >       </return>
> >     </antreturn>
> >   </target>
> >
> >   <target name="test-returnReference">
> >     <antreturn antfile="AntReturnNestedTest.xml" 
> target="set-references">
> >       <return>
> >         <reference refid="pathRef" />
> >         <reference refid="filesetRef" />
> >       </return>
> >     </antreturn>
> >   </target>
> >
> > </project>
> >
> > <?xml version="1.0"?>
> >
> > <project name="AntReturnNestedTest" default="set-properties">
> >
> >   <target name="set-properties">
> >     <property name="propA" value="a" />
> >     <property name="propB" value="bb" />
> >     <property name="propC" value="ccc" />
> >     <property name="propD" value="dddd" />
> >   </target>
> >
> >   <target name="set-references">
> >     <path id="pathRef" location="${basedir}" />
> >     <fileset id="filesetRef" dir="${basedir}">
> >       <include name="AntReturn*Test.xml" />
> >     </fileset>
> >     <patternset id="patternsetRef">
> >       <include name="dummy" />
> >     </patternset>
> >   </target>
> >
> > </project>
> >
> > // vim:ts=2:sw=2
> > package com.lgc.buildmagic.test;
> >
> > import org.apache.tools.ant.ProjectComponent;
> > import org.apache.tools.ant.types.Path;
> > import org.apache.tools.ant.types.FileSet;
> >
> > import com.lgc.buildmagic.util.BuildFileTestCase;
> >
> > /**
> >  * Tests &lt;antreturn&gt;.
> >  *
> >  * @author <a href="mailto:ddevienne@lgc.com">Dominique Devienne</a>
> >  * @version Jul 2003 - Copyright (c) 2003, Landmark Graphics Corp.
> >  */
> > public class AntReturnTest
> >              extends BuildFileTestCase {
> >
> >   public void testReturnProperty() {
> >     executeTarget("test-returnProperty");
> >
> >     assertProperty("propA", "a");
> >     assertProperty("propB", null);
> >     assertProperty("propC", "ccc");
> >     assertProperty("propD", null);
> >   }
> >
> >   private void assertProperty(String name, String expectedValue) {
> >     String value = getProject().getProperty(name);
> >     assertEquals(name + " property", value, expectedValue);
> >   }
> >
> >   public void testReturnReference() {
> >     executeTarget("test-returnReference");
> >
> >     assertReference("pathRef", Path.class);
> >     assertReference("filesetRef", FileSet.class);
> >     assertReference("patternsetRef", null);
> >   }
> >
> >   private void assertReference(String refid, Class expectedClass) {
> >     Object value = getProject().getReference(refid);
> >     if (expectedClass != null) {
> >       assertNotNull(refid + " reference", value);
> >       assertEquals(refid + " reference type", expectedClass,
> > value.getClass());
> >       assertSame(refid + " reference project", getProject(),
> >                  ((ProjectComponent)value).getProject());
> >     }
> >     else {
> >       assertEquals(refid + " reference found", false, value 
> != null);
> >     }
> >   }
> >
> > } // END class AntReturnTest
> >
> > // vim:ts=2:sw=2
> > package com.lgc.buildmagic;
> >
> > import java.util.List;
> > import java.util.Iterator;
> > import java.util.ArrayList;
> > import java.util.Collections;
> >
> > import org.apache.tools.ant.Project;
> > import org.apache.tools.ant.ProjectComponent;
> > import org.apache.tools.ant.BuildException;
> >
> > import org.apache.tools.ant.types.Reference;
> >
> > import org.apache.tools.ant.taskdefs.Ant;
> > import org.apache.tools.ant.taskdefs.Property;
> >
> > /**
> >  * ...
> >  *
> >  * @author <a href="mailto:ddevienne@lgc.com">Dominique Devienne</a>
> >  * @version Jul 2003 - Copyright (c) 2003, Landmark Graphics Corp.
> >  *
> >  * @ant.task category="control"
> >  */
> > public class AntReturn
> >              extends Ant {
> >
> >   private Project _newProject;
> >   private ReturnedElements _returns;
> >
> >   public void init() {
> >     super.init();
> >     setInheritAll(false);
> >     setInheritRefs(false);
> >   }
> >
> >   public void execute()
> >               throws BuildException {
> >     int returnCount = 0;
> >     if (_returns != null) {
> >       returnCount = _returns._references.size()
> >                   + _returns._properties.size();
> >     }
> >
> >     if (returnCount > 0 && _newProject == null) {
> >       // Create dummy property to get at nested project
> >       Property p = createProperty();
> >       
> p.setName("sdliugyhspuygh.asdjhriawu120983472$376asdbfandbfa7347");
> >       p.setValue("");
> >
> >       if (_newProject == null) {
> >         throw new BuildException("Cannot access nested Project
> BEFORE!!!");
> >       }
> >     }
> >
> >     super.execute();
> >
> >     if (returnCount < 1) {
> >       return; // Nothing to return
> >     }
> >
> >     // Set the returned properties in the outer project
> >     for (Iterator i = _returns._properties.iterator(); 
> i.hasNext();) {
> >       ReturnProperty retProperty = (ReturnProperty)i.next();
> >       String name = retProperty.getName();
> >       String value = _newProject.getProperty(name);
> >       if (value == null) {
> >         throw new BuildException("Cannot find property '" + 
> name + "'");
> >       }
> >       getProject().setNewProperty(retProperty.getToName(), value);
> >     }
> >
> >     // Set the returned properties in the outer project
> >     for (Iterator i = _returns._references.iterator(); 
> i.hasNext();) {
> >       ReturnReference retReference = (ReturnReference)i.next();
> >       String refid = retReference.getRefid();
> >       Object value = _newProject.getReference(refid);
> >       if (value == null) {
> >         throw new BuildException("Cannot find reference '" 
> + refid + "'");
> >       }
> >       if (value instanceof ProjectComponent) {
> >         ((ProjectComponent)value).setProject(getProject());
> >       }
> >       getProject().addReference(retReference.getToRefid(), value);
> >     }
> >   }
> >
> >   /** Intercept property creation to catch the new project. 
> Wicked! */
> >   public Property createProperty() {
> >     Property p = super.createProperty();
> >     _newProject = p.getProject();
> >     return p;
> >   }
> >
> >   /** Adds the set of properties/references to return. */
> >   public void addReturn(ReturnedElements returns) {
> >     if (_returns != null) {
> >       throw new BuildException("Can have only one nested <return>");
> >     }
> >     _returns = returns;
> >   }
> >
> >   /** Programatic convenience to select a property to return. */
> >   public void selectProperty(String name, String toName) {
> >     if (_returns == null) {
> >       addReturn(new ReturnedElements());
> >     }
> >     ReturnProperty p = new ReturnProperty();
> >     p.setName(name);
> >     if (toName != null) {
> >       p.setToName(toName);
> >     }
> >     _returns.addProperty(p);
> >   }
> >
> >   /** Programatic convenience to select a reference to return. */
> >   public void selectReference(String refid, String toRefid) {
> >     if (_returns == null) {
> >       addReturn(new ReturnedElements());
> >     }
> >     ReturnReference r = new ReturnReference();
> >     r.setRefid(refid);
> >     if (toRefid != null) {
> >       r.setToRefid(toRefid);
> >     }
> >     _returns.addReference(r);
> >   }
> >
> >   /** A property name to return from the called project. */
> >   public static class ReturnProperty {
> >     private String _name;
> >     private String _toName;
> >
> >     public void setName(String name) {
> >       _name = TaskUtils.assertNotEmpty(name, "name", true);
> >     }
> >     public void setToName(String toName) {
> >       _toName = TaskUtils.assertNotEmpty(toName, "toName", true);
> >     }
> >     public String getName() {
> >       TaskUtils.assertAttributeSet(_name, "name");
> >       return _name;
> >     }
> >     public String getToName() {
> >       return (_toName == null)? getName(): _toName;
> >     }
> >   } // END class AntReturn.ReturnProperty
> >
> >   /** A reference name to return from the called project. */
> >   public static class ReturnReference {
> >     private String _refid;
> >     private String _toRefid;
> >
> >     public void setRefid(String refid) {
> >       _refid = TaskUtils.assertNotEmpty(refid, "refid", true);
> >     }
> >     public void setToRefid(String toRefid) {
> >       _toRefid = TaskUtils.assertNotEmpty(toRefid, "toRefid", true);
> >     }
> >     public String getRefid() {
> >       TaskUtils.assertAttributeSet(_refid, "refid");
> >       return _refid;
> >     }
> >     public String getToRefid() {
> >       return (_toRefid == null)? getRefid(): _toRefid;
> >     }
> >   } // END class AntReturn.ReturnReference
> >
> >   /** List of properties and references to return from the 
> called project.
> > */
> >   public static class ReturnedElements {
> >     private List _properties = Collections.EMPTY_LIST;
> >     private List _references = Collections.EMPTY_LIST;
> >
> >     public void addProperty(ReturnProperty retProperty) {
> >       if (_properties == Collections.EMPTY_LIST) {
> >         _properties = new ArrayList(4);
> >       }
> >       _properties.add(retProperty);
> >     }
> >
> >     public void addReference(ReturnReference retReference) {
> >       if (_references == Collections.EMPTY_LIST) {
> >         _references = new ArrayList(4);
> >       }
> >       _references.add(retReference);
> >     }
> >   } // END class AntReturn.ReturnedElements
> >
> > } // END class AntReturn
> >
> >
> > 
> ---------------------------------------------------------------------
> > To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> > For additional commands, e-mail: dev-help@ant.apache.org
> >
> >
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@ant.apache.org
> For additional commands, e-mail: dev-help@ant.apache.org
>