You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Matt Benson <gu...@gmail.com> on 2011/12/05 23:37:01 UTC

Re: svn commit: r1210678 - in /commons/proper/digester/trunk/src: main/java/org/apache/commons/digester3/binder/ test/resources/org/apache/commons/digester3/xmlrules/

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,  <si...@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-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Re: svn commit: r1210678 - in /commons/proper/digester/trunk/src: main/java/org/apache/commons/digester3/binder/ test/resources/org/apache/commons/digester3/xmlrules/

Posted by Simone Tripodi <si...@apache.org>.
Hi Matt!!

indeed the commit contains too much informations here, I changed the
XML config just to see if the ClassLoader adapter is able to load
primitives by name, just moving the code you committed in the
ObjectCreate builder, so shared classloader across multiple binding is
able to provide the same feature.

I need to provide more specific testcase for that feature :P

Thanks for reviewing, really appreciated!

Simo

http://people.apache.org/~simonetripodi/
http://simonetripodi.livejournal.com/
http://twitter.com/simonetripodi
http://www.99soft.org/



On Mon, Dec 5, 2011 at 11:37 PM, Matt Benson <gu...@gmail.com> wrote:
> 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,  <si...@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-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org