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>