[DIGESTER-154] The DigesterBinder is not able to load primitive classes by name
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/digester/trunk@1210678 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java b/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java
new file mode 100644
index 0000000..7ff09ac
--- /dev/null
+++ b/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java
@@ -0,0 +1,71 @@
+package org.apache.commons.digester3.binder;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+
+/*
+ * 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.
+ */
+
+final class BinderClassLoader
+ extends ClassLoader
+{
+
+ private static final Map<String, Class<?>> PRIMITIVE_TYPES;
+ static
+ {
+ HashMap<String, Class<?>> primitiveTypes = new HashMap<String, Class<?>>();
+ primitiveTypes.put( "boolean", boolean.class );
+ primitiveTypes.put( "byte", byte.class );
+ primitiveTypes.put( "short", short.class );
+ primitiveTypes.put( "int", int.class );
+ primitiveTypes.put( "char", char.class );
+ primitiveTypes.put( "long", long.class );
+ primitiveTypes.put( "float", float.class );
+ primitiveTypes.put( "double", double.class );
+ PRIMITIVE_TYPES = Collections.unmodifiableMap( primitiveTypes );
+ }
+
+ private final ClassLoader adaptedClassLoader;
+
+ public BinderClassLoader( ClassLoader adaptedClassLoader )
+ {
+ this.adaptedClassLoader = adaptedClassLoader;
+ }
+
+ public ClassLoader getAdaptedClassLoader()
+ {
+ return adaptedClassLoader;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected synchronized Class<?> loadClass( String name, boolean resolve )
+ throws ClassNotFoundException
+ {
+ if ( PRIMITIVE_TYPES.containsKey( name ) )
+ {
+ return PRIMITIVE_TYPES.get( name );
+ }
+ return adaptedClassLoader.loadClass( name );
+ }
+
+}
diff --git a/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java b/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java
index caefc58..6884356 100644
--- a/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java
+++ b/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java
@@ -113,7 +113,7 @@
* used to load Digester itself, is used, based on the value of the
* <code>useContextClassLoader</code> variable.
*/
- private ClassLoader classLoader;
+ private BinderClassLoader classLoader;
/**
* An optional class that substitutes values in attributes and body text. This may be null and so a null check is
@@ -196,7 +196,7 @@
throw new IllegalArgumentException( "Parameter 'classLoader' cannot be null" );
}
- this.classLoader = classLoader;
+ this.classLoader = new BinderClassLoader( classLoader );
return this;
}
@@ -550,7 +550,8 @@
}
Digester digester = new Digester( reader );
- digester.setClassLoader( classLoader );
+ // the ClassLoader adapter is no needed anymore
+ digester.setClassLoader( classLoader.getAdaptedClassLoader() );
digester.setRules( rules );
digester.setSubstitutor( substitutor );
digester.registerAll( entityValidator );
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 67a3b26..cafb380 100644
--- a/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java
+++ b/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java
@@ -22,9 +22,6 @@
import static java.lang.String.format;
import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
import org.apache.commons.digester3.ObjectCreateRule;
@@ -36,20 +33,7 @@
public final class ObjectCreateBuilder
extends AbstractBackToLinkedRuleBuilder<ObjectCreateRule>
{
- private static final Map<String, Class<?>> PRIMITIVE_TYPES;
- static
- {
- HashMap<String, Class<?>> primitiveTypes = new HashMap<String, Class<?>>();
- primitiveTypes.put("boolean", boolean.class);
- primitiveTypes.put("byte", byte.class);
- primitiveTypes.put("short", short.class);
- primitiveTypes.put("int", int.class);
- primitiveTypes.put("char", char.class);
- primitiveTypes.put("long", long.class);
- primitiveTypes.put("float", float.class);
- primitiveTypes.put("double", double.class);
- PRIMITIVE_TYPES = Collections.unmodifiableMap(primitiveTypes);
- }
+
private final ClassLoader classLoader;
@@ -151,11 +135,6 @@
Class<?>[] paramTypes = new Class<?>[paramTypeNames.length];
for ( int i = 0; i < paramTypeNames.length; i++ )
{
- if ( PRIMITIVE_TYPES.containsKey( paramTypeNames[i] ) )
- {
- paramTypes[i] = PRIMITIVE_TYPES.get( paramTypeNames[i] );
- continue;
- }
try
{
paramTypes[i] = classLoader.loadClass( paramTypeNames[i] );
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 58862ad..f8f0869 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
@@ -19,7 +19,7 @@
<digester-rules>
<pattern value="toplevel/bean">
<object-create-rule classname="org.apache.commons.digester3.TestBean"
- paramtypes="java.lang.Boolean,java.lang.Double" params="true,0" />
+ paramtypes="boolean,double" params="true,0" />
<call-param-rule paramnumber="0" attrname="boolean" />
<call-param-rule paramnumber="1" attrname="double" />
</pattern>