conor 01/01/20 03:10:26
Modified: src/main/org/apache/tools/ant IntrospectionHelper.java
Log:
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
Revision Changes Path
1.12 +31 -6
jakarta-ant/src/main/org/apache/tools/ant/IntrospectionHelper.java
Index: IntrospectionHelper.java
===================================================================
RCS file:
/home/cvs/jakarta-ant/src/main/org/apache/tools/ant/IntrospectionHelper.java,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -r1.11 -r1.12
--- IntrospectionHelper.java 2001/01/03 14:18:26 1.11
+++ IntrospectionHelper.java 2001/01/20 11:10:25 1.12
@@ -96,6 +96,13 @@
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.
*/
private Class bean;
@@ -138,6 +145,14 @@
&& 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 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);