[ 
https://issues.apache.org/jira/browse/BROOKLYN-406?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15754651#comment-15754651
 ] 

ASF GitHub Bot commented on BROOKLYN-406:
-----------------------------------------

Github user neykov commented on a diff in the pull request:

    https://github.com/apache/brooklyn-server/pull/477#discussion_r92826512
  
    --- Diff: 
utils/common/src/main/java/org/apache/brooklyn/util/javalang/coerce/TypeCoercerExtensible.java
 ---
    @@ -209,12 +226,19 @@ public static TypeCoercerExtensible newEmpty() {
                         try {
                             return Maybe.of((T) m.invoke(null, value));
                         } catch (Exception e) {
    -                        Maybe.absent(new ClassCoercionException("Cannot 
coerce type "+value.getClass()+" to "+targetType.getCanonicalName()+" 
("+value+"): "+m.getName()+" adapting failed, "+e));
    +                        exceptions.add(new ClassCoercionException("Cannot 
coerce type "+value.getClass()+" to "+targetType.getCanonicalName()+" 
("+value+"): "+m.getName()+" adapting failed", e));
                         }
                     }
                 }
             }
    -        return null;
    +        if (exceptions.isEmpty()) {
    +            return null;
    --- End diff --
    
    Worth adding a comment somewhere on the notation (caller):
      * null - no errors, continue with fallbacks (i.e. not found)
      * absent - had some kind of exception, continue with fallbacks
      * present - coercion successful, return value


> 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