Aled Sage created BROOKLYN-406:
----------------------------------

             Summary: Coercion using fromMap(map) - exception thrown away, and 
value not coerced
                 Key: BROOKLYN-406
                 URL: https://issues.apache.org/jira/browse/BROOKLYN-406
             Project: Brooklyn
          Issue Type: Bug
            Reporter: Aled Sage
             Fix For: 0.9.0


We had a {{ConfigKey<List<VolumeOptions>>}}, and were setting that in YAML 
using a map. We expected {{VolumeOptions.fromMap(map)}} to be called as part of 
{{getConfig(VOLUMES, val)}}. This does indeed happen.

However, if {{VolumeOptions.fromMap(map)}} throws an exception (e.g. because 
the input data was malformed), it does not report any problems and instead the 
{{getConfig}} just returns a list containing uncoerced map objects. As a 
result, we subsequently got a {{ClassCastException}} in our entity code.

This was extremely hard to figure out - it involved attaching a debugger, 
breakpointing and stepping through the coercion code.

---
Digging into the underlying cause, the problem is in this stacktrace:

{noformat}
"brooklyn-execmanager-PRYA08PS-104" daemon prio=5 tid=0x00007f82096c7000 
nid=0x14f0b runnable [0x0000700005eac000]
   java.lang.Thread.State: RUNNABLE
        at 
org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceWithFromMethod(TypeCoercerExtensible.java:204)
        at 
org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceInternal(TypeCoercerExtensible.java:135)
        at 
org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerce(TypeCoercerExtensible.java:107)
        at 
org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceCollection(TypeCoercerExtensible.java:263)
        at 
org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerceInternal(TypeCoercerExtensible.java:121)
        at 
org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.tryCoerce(TypeCoercerExtensible.java:107)
        at 
org.apache.brooklyn.util.javalang.coerce.TypeCoercerExtensible.coerce(TypeCoercerExtensible.java:97)
        at 
org.apache.brooklyn.util.core.flags.TypeCoercions.coerce(TypeCoercions.java:80)
        at 
org.apache.brooklyn.util.core.config.ConfigBag.coerceFirstNonNullKeyValue(ConfigBag.java:502)
        at 
org.apache.brooklyn.util.core.config.ConfigBag.get(ConfigBag.java:496)
        at 
org.apache.brooklyn.util.core.config.ConfigBag.get(ConfigBag.java:344)
{noformat}

The {{TypeCoercerExtensible.tryCoerceWithFromMethod}} accidentally throws away 
the exception! It is therefore treated as though there was no applicable 
coercion. However, because {{List<Map>}} can be cast to {{List}} then it 
returns it anyway.




--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to