You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ant.apache.org by ru...@locus.apache.org on 2000/02/15 04:58:19 UTC
cvs commit: jakarta-ant/src/main/org/apache/tools/ant ProjectHelper.java
rubys 00/02/14 19:58:19
Modified: src/main/org/apache/tools/ant ProjectHelper.java
Log:
add support for nested properties
Revision Changes Path
1.5 +57 -13 jakarta-ant/src/main/org/apache/tools/ant/ProjectHelper.java
Index: ProjectHelper.java
===================================================================
RCS file: /home/cvs/jakarta-ant/src/main/org/apache/tools/ant/ProjectHelper.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ProjectHelper.java 2000/02/13 18:19:59 1.4
+++ ProjectHelper.java 2000/02/15 03:58:19 1.5
@@ -225,23 +225,67 @@
// into the task
NamedNodeMap nodeMap = element.getAttributes();
- configureTask(project, task, nodeMap);
+ configure(project, task, nodeMap);
task.init();
task.setTarget(target);
target.addTask(task);
+
+ processNestedProperties(project, task, element);
}
}
}
}
+
+ private static void processNestedProperties(Project project,
+ Object target,
+ Element targetElement)
+ throws BuildException
+ {
+ Class targetClass = target.getClass();
+ NodeList list = targetElement.getChildNodes();
+
+ for (int i = 0; i < list.getLength(); i++) {
+ Node node = list.item(i);
+
+ // right now, all we are interested in is element nodes
+ // not quite sure what to do with others except drop 'em
+
+ if (node.getNodeType() == Node.ELEMENT_NODE) {
+ Element element = (Element)node;
+ String propType = element.getTagName();
+ String methodName = "add" +
+ Character.toUpperCase(propType.charAt(0)) +
+ propType.substring(1);
+
+ try {
+ Method addProp =
+ targetClass.getMethod(methodName, new Class[]{});
+ Object child = addProp.invoke(target, new Object[] {});
+
+ NamedNodeMap nodeMap = element.getAttributes();
+ configure(project, child, nodeMap);
+
+ processNestedProperties(project, child, element);
+ } catch (NoSuchMethodException nsme) {
+ throw new BuildException(targetClass +
+ " does not support nested " + propType + " properties");
+ } catch (InvocationTargetException ite) {
+ throw new BuildException(ite.getMessage());
+ } catch (IllegalAccessException iae) {
+ throw new BuildException(iae.getMessage());
+ }
+
+ }
+ }
+ }
- private static void configureTask(Project project,
- Task taskInst,
- NamedNodeMap nodeMap)
+ private static void configure(Project project,
+ Object target,
+ NamedNodeMap nodeMap)
throws BuildException
{
- Object task=taskInst;
- if( task instanceof TaskAdapter )
- task=((TaskAdapter)task).getProxy();
+ if( target instanceof TaskAdapter )
+ target=((TaskAdapter)target).getProxy();
// XXX
// instead of doing this introspection each time around, I
@@ -251,9 +295,9 @@
Hashtable propertySetters = new Hashtable();
BeanInfo beanInfo;
try {
- beanInfo = Introspector.getBeanInfo(task.getClass());
+ beanInfo = Introspector.getBeanInfo(target.getClass());
} catch (IntrospectionException ie) {
- String msg = "Can't introspect task class: " + task.getClass();
+ String msg = "Can't introspect class: " + target.getClass();
throw new BuildException(msg);
}
@@ -287,18 +331,18 @@
if (node.getNodeType() == Node.ATTRIBUTE_NODE) {
Attr attr = (Attr)node;
- // reflect these into the task
+ // reflect these into the target
Method setMethod = (Method)propertySetters.get(attr.getName());
if (setMethod == null) {
String msg = "Configuration property \"" + attr.getName() +
- "\" does not have a setMethod in " + task.getClass();
+ "\" does not have a setMethod in " + target.getClass();
throw new BuildException(msg);
}
String value=replaceProperties( attr.getValue(), project.getProperties() );
try {
- setMethod.invoke(task, new String[] {value});
+ setMethod.invoke(target, new String[] {value});
} catch (IllegalAccessException iae) {
String msg = "Error setting value for attrib: " +
attr.getName();
@@ -306,7 +350,7 @@
throw new BuildException(msg);
} catch (InvocationTargetException ie) {
String msg = "Error setting value for attrib: " +
- attr.getName() + " in " + task.getClass().getName();
+ attr.getName() + " in " + target.getClass().getName();
ie.printStackTrace();
ie.getTargetException().printStackTrace();
throw new BuildException(msg);