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]