Note that in the testcase XML you don't need @params if you're using the (boolean, double) constructor. The default constructor arguments were needed to avoid the NPEs that were thrown due to the (Boolean, Double) constructor calling { this( booleanProperty.booleanValue(), doubleProperty.doubleValue() ); }
Matt On Mon, Dec 5, 2011 at 4:27 PM, <simonetrip...@apache.org> wrote: > Author: simonetripodi > Date: Mon Dec 5 22:27:50 2011 > New Revision: 1210678 > > URL: http://svn.apache.org/viewvc?rev=1210678&view=rev > Log: > [DIGESTER-154] The DigesterBinder is not able to load primitive classes by > name > > Added: > > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java > (with props) > Modified: > > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java > > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java > > commons/proper/digester/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml > > Added: > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java > URL: > http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java?rev=1210678&view=auto > ============================================================================== > --- > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java > (added) > +++ > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java > Mon Dec 5 22:27:50 2011 > @@ -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 ); > + } > + > +} > > Propchange: > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Propchange: > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java > ------------------------------------------------------------------------------ > svn:keywords = Date Author Id Revision HeadURL > > Propchange: > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/BinderClassLoader.java > ------------------------------------------------------------------------------ > svn:mime-type = text/plain > > Modified: > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java > URL: > http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java?rev=1210678&r1=1210677&r2=1210678&view=diff > ============================================================================== > --- > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java > (original) > +++ > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/DigesterLoader.java > Mon Dec 5 22:27:50 2011 > @@ -113,7 +113,7 @@ public final class DigesterLoader > * 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 @@ public final class DigesterLoader > throw new IllegalArgumentException( "Parameter 'classLoader' > cannot be null" ); > } > > - this.classLoader = classLoader; > + this.classLoader = new BinderClassLoader( classLoader ); > return this; > } > > @@ -550,7 +550,8 @@ public final class DigesterLoader > } > > 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 ); > > Modified: > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java > URL: > http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java?rev=1210678&r1=1210677&r2=1210678&view=diff > ============================================================================== > --- > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java > (original) > +++ > commons/proper/digester/trunk/src/main/java/org/apache/commons/digester3/binder/ObjectCreateBuilder.java > Mon Dec 5 22:27:50 2011 > @@ -22,9 +22,6 @@ package org.apache.commons.digester3.bin > 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 @@ import org.apache.commons.digester3.Obje > 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 @@ public final class ObjectCreateBuilder > 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] ); > > Modified: > commons/proper/digester/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml > URL: > http://svn.apache.org/viewvc/commons/proper/digester/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml?rev=1210678&r1=1210677&r2=1210678&view=diff > ============================================================================== > --- > commons/proper/digester/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml > (original) > +++ > commons/proper/digester/trunk/src/test/resources/org/apache/commons/digester3/xmlrules/constructor-testrules.xml > Mon Dec 5 22:27:50 2011 > @@ -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> > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org For additional commands, e-mail: dev-h...@commons.apache.org