[ 
https://issues.apache.org/jira/browse/VELOCITY-730?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12737259#action_12737259
 ] 

Nathan Bubna commented on VELOCITY-730:
---------------------------------------

Yeah, i can see that this would fail, though it's not because the subclasses 
don't themselves implement Map, but rather that ImmutableMap and descendants 
are implementors of ConcurrentMap which is a subinterface of Map.  We hit a 
similar problem in the ClassMap class recently (VELOCITY-689).  In this case, i 
think your solution is probably the best one, as it keeps it simple.

Thanks for reporting this.

> Property references don't work with maps that implement Map indirectly (such 
> as Google Collections ImmutableMap)
> ----------------------------------------------------------------------------------------------------------------
>
>                 Key: VELOCITY-730
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-730
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.6.1
>            Reporter: Tim Moore
>
> If you pass a map created using Google Collections ImmutableMap into a 
> Velocity context, and try to access its values using "map.key" style property 
> syntax, it fails to resolve.
> I believe the problem is in MapGetExecutor:
> http://svn.apache.org/viewvc/velocity/engine/tags/1.6.1/src/java/org/apache/velocity/runtime/parser/node/MapGetExecutor.java?view=co
> Specifically, this code:
>         Class [] interfaces = clazz.getInterfaces();
>         for (int i = 0 ; i < interfaces.length; i++)
>         {
>             if (interfaces[i].equals(Map.class))
>             {
> ...
> The sneaky thing about ImmutableMap is that ImmutableMap.of(...) doesn't 
> return an instance of ImmutableMap, but one of serveral subclasses optimized 
> for however many items are in the map. These subclasses extend ImmutableMap 
> but do not directly implement Map, so that code above fails to recognize them.
> A simpler and more accurate way to tell whether the class implements Map, 
> either directory or indirectly, is "if (Map.class.isAssignableFrom(clazz))..."

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to