Browse Source

Change to IntrospectionHelper to support creation of nested elements

through a createElement(String elementName) factory method. This has two
applications.

It allows a task to define what nested elements are supported
dynamically, perhaps through a configuration file. This is useful
for tasks that support a plug-in architecture, as I am trying to
achieve with <ejbjar>

As a byproduct, it also allows a task to support nested elements which
cannot be mapped to valid Java method names, such as <support-classes>. The
use of hyphenated compound names is relatively common style in XML DTDs


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@268485 13f79535-47bb-0310-9956-ffa450edef68
master
Conor MacNeill 24 years ago
parent
commit
9bc78e6c25
1 changed files with 31 additions and 6 deletions
  1. +31
    -6
      src/main/org/apache/tools/ant/IntrospectionHelper.java

+ 31
- 6
src/main/org/apache/tools/ant/IntrospectionHelper.java View File

@@ -95,6 +95,13 @@ public class IntrospectionHelper {
*/
private Method addText = null;

/**
* The method used to add nested elements which can't be added through
* nested creators. It allows a task to define a factory method for creating
* nested elements.
*/
private Method elementFactoryMethod = null;

/**
* The Class that's been introspected.
*/
@@ -138,6 +145,14 @@ public class IntrospectionHelper {
&& java.lang.String.class.equals(args[0])) {

addText = methods[i];
} else if ("createElement".equals(name)
&& !returnType.isArray()
&& !returnType.isPrimitive()
&& args.length == 1
&& java.lang.String.class.equals(args[0])) {

elementFactoryMethod = methods[i];

} else if (name.startsWith("set")
&& java.lang.Void.TYPE.equals(returnType)
@@ -266,13 +281,23 @@ public class IntrospectionHelper {
public Object createElement(Object element, String elementName)
throws BuildException {
NestedCreator nc = (NestedCreator) nestedCreators.get(elementName);
if (nc == null) {
String msg = "Class " + element.getClass().getName() +
" doesn't support the nested \"" + elementName + "\" element";
throw new BuildException(msg);
}
try {
return nc.create(element);
if (nc == null) {
Object nestedElement = null;
if (elementFactoryMethod != null) {
nestedElement
= elementFactoryMethod.invoke(element, new Object[] {elementName});
}
if (nestedElement == null) {
String msg = "Class " + element.getClass().getName() +
" doesn't support the nested \"" + elementName + "\" element";
throw new BuildException(msg);
}
return nestedElement;
}
else {
return nc.create(element);
}
} catch (IllegalAccessException ie) {
// impossible as getMethods should only return public methods
throw new BuildException(ie);


Loading…
Cancel
Save