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" <[EMAIL PROTECTED]> To: "'Ant Developers List'" <[EMAIL PROTECTED]> 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:[EMAIL PROTECTED] > > 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 <antreturn>. > * > * @author <a href="mailto:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]