[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>