Author: hlship
Date: Mon May 10 21:15:25 2010
New Revision: 942905
URL: http://svn.apache.org/viewvc?rev=942905&view=rev
Log:
TAP5-1141: Type coercion from arbitrary object to Boolean will NPE when the
object's toString() returns null (should coerce to false)
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java?rev=942905&r1=942904&r2=942905&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/main/java/org/apache/tapestry5/ioc/services/TapestryIOCModule.java
Mon May 10 21:15:25 2010
@@ -252,7 +252,7 @@ public final class TapestryIOCModule
{
public Boolean coerce(String input)
{
- String trimmed = input.trim();
+ String trimmed = input == null ? "" : input.trim();
if (trimmed.equalsIgnoreCase("false") || trimmed.length() ==
0) return false;
Modified:
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java?rev=942905&r1=942904&r2=942905&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-ioc/src/test/java/org/apache/tapestry5/ioc/internal/services/TypeCoercerImplTest.java
Mon May 10 21:15:25 2010
@@ -282,6 +282,7 @@ public class TypeCoercerImplTest extends
{ StringBuffer.class, Integer.class, "Object --> String, String -->
Long, Long --> Integer" },
{ void.class, Map.class, "null --> null" },
{ void.class, Boolean.class, "null --> Boolean" },
+ { Object[].class, Boolean.class, "Object[] --> java.util.List,
java.util.Collection --> Boolean" },
{ String[].class, List.class, "Object[] --> java.util.List" },
{ Float.class, Double.class, "Float --> Double" },
{ Double.class, BigDecimal.class, "Object --> String, String -->
java.math.BigDecimal" }, };
@@ -307,4 +308,25 @@ public class TypeCoercerImplTest extends
assertArraysEqual(result, input.toArray());
}
+
+ /** TAP5-1141 */
+ @Test
+ public void object_whose_toString_returns_null_to_boolean()
+ {
+ Object idiot = new Object()
+ {
+ public String toString()
+ {
+ return null;
+ }
+ };
+
+ // To be honest, the proper result here is up for grabs. The object is
not null, so you'd kind of think that the
+ // result should be true ... but the rules are to look for a known
coercion, and it finds Object --> String,
+ // String --> Boolean. Converting a null String is the same as an
empty String : false.
+
+ assertFalse(coercer.coerce(idiot, Boolean.class));
+
+ assertEquals(coercer.explain(idiot.getClass(), Boolean.class), "Object
--> String, String --> Boolean");
+ }
}