Here is a simple example task: import java.util.*; import org.apache.tools.ant.DynamicConfigurator; import org.apache.tools.ant.Task;
public class Dy extends Task implements DynamicConfigurator { private String subName; private Map attributes = new HashMap(); private List elements = new ArrayList(); public Object createDynamicElement(String name) { Dy dy = new Dy(); dy.setSubName(name); dy.setProject(getProject()); elements.add(dy); return dy; } private void setSubName(String subName) { this.subName = subName; } private String getSubName() { return subName; } public void setDynamicAttribute(String name, String value) { attributes.put(name, value); } private void print(int level) { StringBuffer b = new StringBuffer(); for (int i = 0; i < level; ++i) { b.append(" "); } String indent = b.toString(); for (Iterator i = attributes.entrySet().iterator(); i.hasNext();) { Map.Entry e = (Map.Entry) i.next(); log(indent + e.getKey() + " = " + e.getValue()); } for (Iterator i = elements.iterator(); i.hasNext();) { Dy dy = (Dy) i.next(); log(indent + "element " + dy.getSubName()); dy.print(level + 1); } } public void execute() { log("Dy"); print(1); } } and the build.xml: <project name="t" default="t"> <target name="t"> <mkdir dir="classes"/> <javac srcdir="src" destdir="classes"/> <taskdef name="dy" classname="Dy" classpath="classes"/> <dy> <integration-test> <test on-components="foo,bar"> <include name="**/XYZComp/*Test"/> <configuration> <xyz-comp id="foo"/> <zyx-comp id="bar"> <arbitrary value="null"/> </zyx-comp> </configuration> </test> </integration-test> </dy> </target> </project> generates: Compiling 1 source file to /home/preilly/proj/learning/dy/classes Dy element integration-test element test on-components = foo,bar element include name = **/XYZComp/*Test element configuration element xyz-comp id = foo element zyx-comp id = bar element arbitrary value = null Peter. On Tuesday 20 May 2003 17:38, Berin Loritsch wrote: > peter reilly wrote: > > To embed the config information, the easiest > > is to map the info to objects. > > > > Ant introspection is very powerfull and easy > > to use for normal java data object. > > The problem is that it only works when you know in advance > what the configuration elements are going to be. In this > example, that is not the case. > > > Alternatively one can use the DynamicConfigurator > > interface. This provides the name of the unknown element > > and the name/value of unknown attributes. > > That might be something worth pursuing. Now, can I have > a mixture of DyanimicConfigurator objects and mapped > objects in the *same* task? Yes. > > Or more importantly as a child of one of the mapped > objects? Yes - you may implement what you want. Ant's introspection looks add the addX and setX patterns before handing the element/attribute over to DynamicConfigurator. > > For example: > > <integration-test> > <test on-components="foo,bar"> > <include name="**/XYZComp/*Test"/> > <configuration> > <xyz-comp id="foo"/> > <zyx-comp id="bar"> > <arbitrary value="null"/> > </zyx-comp> > </configuration> > </test> > </integration-test> > > The child of the <configuration/> element is completely > free-form, although the rest of the task elements would > map to real objects. > > Is there an Task already written that uses the DynamicConfigurator > where I can see how it works with it? > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED]