restored ObjectCreateRule constructor via meta XML declaration

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/digester/trunk@1209995 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java b/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java
index e9a0625..7888dd5 100644
--- a/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java
+++ b/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java
@@ -19,6 +19,10 @@
  * under the License.
  */
 
+import static java.lang.String.format;
+
+import java.util.Arrays;
+
 import org.apache.commons.digester3.ObjectCreateRule;
 
 /**
@@ -112,6 +116,40 @@
      * @return
      * @since 3.2
      */
+    public ObjectCreateBuilder usingConstructor( String...paramTypeNames )
+    {
+        if ( paramTypeNames == null )
+        {
+            reportError( "createObject().usingConstructor( String[] )", "NULL parametersTypes not allowed" );
+        }
+
+        Class<?>[] paramTypes = null;
+        if ( paramTypeNames != null )
+        {
+            paramTypes = new Class<?>[paramTypeNames.length];
+            for ( int i = 0; i < paramTypeNames.length; i++ )
+            {
+                try
+                {
+                    paramTypes[i] = classLoader.loadClass( paramTypeNames[i] );
+                }
+                catch ( ClassNotFoundException e )
+                {
+                    this.reportError( format( "createObject().usingConstructor( %s )",
+                                              Arrays.toString( paramTypeNames ) ),
+                                      format( "class '%s' cannot be load", paramTypeNames[i] ) );
+                }
+            }
+        }
+
+        return usingConstructor( paramTypes );
+    }
+
+    /**
+     *
+     * @return
+     * @since 3.2
+     */
     public ObjectCreateBuilder usingConstructor( Class<?>...constructorArgumentsType )
     {
         if ( constructorArgumentsType == null )
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/ObjectCreateRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/ObjectCreateRule.java
index 0bc38fb..d179c4b 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/ObjectCreateRule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/ObjectCreateRule.java
@@ -19,6 +19,8 @@
  * under the License.
  */
 
+import java.util.StringTokenizer;
+
 import org.apache.commons.digester3.binder.LinkedRuleBuilder;
 import org.apache.commons.digester3.binder.ObjectCreateBuilder;
 import org.apache.commons.digester3.binder.RulesBinder;
@@ -46,14 +48,19 @@
         ObjectCreateBuilder builder = linkedRuleBuilder.createObject()
             .ofType( attributes.getValue( "classname" ) )
             .ofTypeSpecifiedByAttribute( attributes.getValue( "attrname" ) );
-        getDigester().push( builder );
-    }
 
-    @Override
-    public void end( String namespace, String name )
-        throws Exception
-    {
-        getDigester().pop();
+        String paramTypesStr = attributes.getValue( "paramtypes" );
+        if ( paramTypesStr != null && paramTypesStr.length() > 0 )
+        {
+            StringTokenizer tokens = new StringTokenizer( paramTypesStr, " \t\n\r," );
+            String[] paramTypeNames = new String[tokens.countTokens()];
+            int counter = 0;
+            while ( tokens.hasMoreTokens() )
+            {
+                paramTypeNames[counter++] = tokens.nextToken();
+            }
+            builder.usingConstructor( paramTypeNames );
+        }
     }
 
 }
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/ObjectParamRule.java b/src/main/java/org/apache/commons/digester3/xmlrules/ObjectParamRule.java
deleted file mode 100644
index 2cb1669..0000000
--- a/src/main/java/org/apache/commons/digester3/xmlrules/ObjectParamRule.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.apache.commons.digester3.xmlrules;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import static org.apache.commons.beanutils.ConvertUtils.convert;
-
-import org.apache.commons.digester3.binder.LinkedRuleBuilder;
-import org.apache.commons.digester3.binder.ObjectParamBuilder;
-import org.apache.commons.digester3.binder.RulesBinder;
-import org.xml.sax.Attributes;
-
-/**
- * 
- */
-final class ObjectParamRule
-    extends AbstractXmlRule
-{
-
-    public ObjectParamRule( RulesBinder targetRulesBinder, PatternStack patternStack )
-    {
-        super( targetRulesBinder, patternStack );
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    protected void bindRule( LinkedRuleBuilder linkedRuleBuilder, Attributes attributes )
-        throws Exception
-    {
-        // create callparamrule
-        int paramIndex = Integer.parseInt( attributes.getValue( "paramnumber" ) );
-
-        String attributeName = attributes.getValue( "attrname" );
-        String type = attributes.getValue( "type" );
-        String value = attributes.getValue( "value" );
-
-        // type name is requried
-        if ( type == null )
-        {
-            throw new RuntimeException( "Attribute 'type' is required." );
-        }
-
-        // create object instance
-        Object param = null;
-        Class<?> clazz = Class.forName( type );
-        if ( value == null )
-        {
-            param = clazz.newInstance();
-        }
-        else
-        {
-            param = convert( value, clazz );
-        }
-
-        ObjectParamBuilder<?> builder = linkedRuleBuilder.objectParam( param ).ofIndex( paramIndex );
-        if ( attributeName != null )
-        {
-            builder.matchingAttribute( attributeName );
-        }
-    }
-
-}
diff --git a/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java b/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java
index 6a5ba25..8d572ef 100644
--- a/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java
+++ b/src/main/java/org/apache/commons/digester3/xmlrules/XmlRulesModule.java
@@ -85,7 +85,6 @@
 
             forPattern( "*/call-method-rule" ).addRule( new CallMethodRule( targetRulesBinder, patternStack ) );
             forPattern( "*/call-param-rule" ).addRule( new CallParamRule( targetRulesBinder, patternStack ) );
-            forPattern( "*/object-param-rule" ).addRule( new ObjectParamRule( targetRulesBinder, patternStack ) );
 
             forPattern( "*/factory-create-rule" ).addRule( new FactoryCreateRule( targetRulesBinder, patternStack ) );
             forPattern( "*/node-create-rule" ).addRule( new NodeCreateRule( targetRulesBinder, patternStack ) );
diff --git a/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd b/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd
index 921fab7..942a807 100644
--- a/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd
+++ b/src/main/resources/org/apache/commons/digester3/xmlrules/digester-rules.dtd
@@ -185,15 +185,12 @@
     ignore-exceptions  CDATA #IMPLIED>
 
 <!-- ObjectCreateRule -->
-<!ELEMENT object-create-rule (constructor-argument)*>
+<!ELEMENT object-create-rule EMPTY>
 <!ATTLIST object-create-rule
-    pattern   CDATA #IMPLIED
-    classname CDATA #REQUIRED
-    attrname  CDATA #IMPLIED>
-<!ELEMENT constructor-argument EMPTY>
-<!ATTLIST constructor-argument
-    attrname  CDATA #IMPLIED
-    type      CDATA #REQUIRED>
+    pattern    CDATA #IMPLIED
+    classname  CDATA #REQUIRED
+    attrname   CDATA #IMPLIED
+    paramtypes CDATA #IMPLIED>
 
 <!-- SetPropertiesRule -->
 <!ELEMENT set-properties-rule (alias)*>
diff --git a/src/site/resources/dtds/digester-rules-3.0.dtd b/src/site/resources/dtds/digester-rules-3.0.dtd
index 921fab7..942a807 100644
--- a/src/site/resources/dtds/digester-rules-3.0.dtd
+++ b/src/site/resources/dtds/digester-rules-3.0.dtd
@@ -185,15 +185,12 @@
     ignore-exceptions  CDATA #IMPLIED>
 
 <!-- ObjectCreateRule -->
-<!ELEMENT object-create-rule (constructor-argument)*>
+<!ELEMENT object-create-rule EMPTY>
 <!ATTLIST object-create-rule
-    pattern   CDATA #IMPLIED
-    classname CDATA #REQUIRED
-    attrname  CDATA #IMPLIED>
-<!ELEMENT constructor-argument EMPTY>
-<!ATTLIST constructor-argument
-    attrname  CDATA #IMPLIED
-    type      CDATA #REQUIRED>
+    pattern    CDATA #IMPLIED
+    classname  CDATA #REQUIRED
+    attrname   CDATA #IMPLIED
+    paramtypes CDATA #IMPLIED>
 
 <!-- SetPropertiesRule -->
 <!ELEMENT set-properties-rule (alias)*>
diff --git a/src/test/java/org/apache/commons/digester3/Digester153TestCase.java b/src/test/java/org/apache/commons/digester3/Digester153TestCase.java
index 325924a..d79204b 100644
--- a/src/test/java/org/apache/commons/digester3/Digester153TestCase.java
+++ b/src/test/java/org/apache/commons/digester3/Digester153TestCase.java
@@ -26,6 +26,7 @@
 import org.apache.commons.digester3.annotations.FromAnnotationsRuleModule;
 import org.apache.commons.digester3.binder.AbstractRulesModule;
 import org.apache.commons.digester3.binder.RulesModule;
+import org.apache.commons.digester3.xmlrules.FromXmlRulesModule;
 import org.junit.Test;
 
 /**
@@ -122,7 +123,7 @@
         } );
     }
 
-    /* @Test
+    @Test
     public void basicConstructorViaXML()
         throws Exception
     {
@@ -136,7 +137,7 @@
             }
 
         } );
-    } */
+    }
 
     private void succesfullConstructor( RulesModule rulesModule )
         throws Exception
diff --git a/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml b/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml
index cc3a595..a4ecc48 100644
--- a/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml
+++ b/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml
@@ -18,9 +18,9 @@
 -->
 <digester-rules>
   <pattern value="toplevel/bean">
-    <object-create-rule classname="org.apache.commons.digester3.TestBean">
-      <constructor-argument attrname="boolean" type="java.lang.Boolean" />
-      <constructor-argument attrname="double" type="java.lang.Double" />
-    </object-create-rule>
+    <object-create-rule classname="org.apache.commons.digester3.TestBean"
+      paramtypes="java.lang.Boolean,java.lang.Double" />
+    <call-param-rule paramnumber="0" attrname="boolean" />
+    <call-param-rule paramnumber="1" attrname="double" />
   </pattern>
 </digester-rules>