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]