You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by "Howard M. Lewis Ship (JIRA)" <ta...@jakarta.apache.org> on 2005/09/29 19:39:51 UTC

[jira] Closed: (TAPESTRY-601) EnhanceUtils needs null checks in the primitive unwrapper methods

     [ http://issues.apache.org/jira/browse/TAPESTRY-601?page=all ]
     
Howard M. Lewis Ship closed TAPESTRY-601:
-----------------------------------------

    Fix Version: 4.0
     Resolution: Fixed

> EnhanceUtils needs null checks in the primitive unwrapper methods
> -----------------------------------------------------------------
>
>          Key: TAPESTRY-601
>          URL: http://issues.apache.org/jira/browse/TAPESTRY-601
>      Project: Tapestry
>         Type: Bug
>   Components: Framework
>     Versions: 4.0
>     Reporter: Ben Pryor
>     Assignee: Howard M. Lewis Ship
>      Fix For: 4.0
>  Attachments: patch.txt
>
> The EnhanceUtils class contains a number of "primitive unwrapper" methods that are called from generated methods in enhanced classes. These methods take the form of:
> public static <primitive-type> toType(IBinding binding)
> {
>    Type wrapped = (Type) binding.getObject(Type.class);
>    return wrapped.primitiveValue();
> }
> The problem is that binding.getObject() can sometimes return null, causing the wrapped.primitiveValue() to throw an NPE.
> This scenario happens when a container declares a property using the <property name="myname" /> syntax, and does not declare any abstract accessor methods for it.  If this property is then bound to a component parameter, and that parameter has an abstract accessor method that returns a primitive type, the above scenario can occur. 
> The reason is that to support a property declared as above, Tapestry creates a java.lang.Object field in the container class. This field gets the default Object value of null if no additional initialization is done to it.  When this property is bound to a component parameter as described above, Tapestry generates calls to the appropriate primitive unwrapper method in the generated accessor.
> The fix is to null check the return from binding.getObject in the methods above, and to return the default value of the primitive type - 0, or false for boolean.
> Note that this was not an issue in Tapestry 3.  The reason is that all <property-specifications> needed to have a type attribute, and the generated field was of that type.  So if you were declaring a property that would be bound to a parameter that expected a primitive type, there was never a possibility of a null value.
> So again, the proposed fix for all the primitive unwrapper methods:
> public static <primitive-type> toType(IBinding binding)
> {
>    Type wrapped = (Type) binding.getObject(Type.class);
>    if (wrapped == null) return <default-primitive-value>;
>    return wrapped.primitiveValue();
> }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira


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