You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Nathan Bubna (JIRA)" <de...@velocity.apache.org> on 2009/07/31 00:14:14 UTC

[jira] Resolved: (VELOCITY-730) Property references don't work with maps that implement Map indirectly (such as Google Collections ImmutableMap)

     [ https://issues.apache.org/jira/browse/VELOCITY-730?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Nathan Bubna resolved VELOCITY-730.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 1.7

Ok, the flaw that kept MapGet/SetExecutor from handling the map.key syntax when the map class didn't directly implement Map has been resolved.

> 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
>             Fix For: 1.7
>
>
> 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: dev-unsubscribe@velocity.apache.org
For additional commands, e-mail: dev-help@velocity.apache.org