ant-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From co...@apache.org
Subject cvs commit: jakarta-ant/src/main/org/apache/tools/ant IntrospectionHelper.java
Date Sat, 20 Jan 2001 11:10:26 GMT
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);
  
  
  

Mime
View raw message