Return-Path: Mailing-List: contact ant-dev-help@jakarta.apache.org; run by ezmlm Delivered-To: mailing list ant-dev@jakarta.apache.org Received: (qmail 56799 invoked by uid 500); 20 Jan 2001 11:10:27 -0000 Delivered-To: apmail-jakarta-ant-cvs@apache.org Received: (qmail 56796 invoked by uid 1142); 20 Jan 2001 11:10:26 -0000 Date: 20 Jan 2001 11:10:26 -0000 Message-ID: <20010120111026.56795.qmail@apache.org> From: conor@apache.org To: jakarta-ant-cvs@apache.org Subject: cvs commit: jakarta-ant/src/main/org/apache/tools/ant IntrospectionHelper.java 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 As a byproduct, it also allows a task to support nested elements which cannot be mapped to valid Java method names, such as . 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);