You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "William R. Zwicky (JIRA)" <de...@velocity.apache.org> on 2010/07/29 09:31:15 UTC

[jira] Commented: (VELOCITY-761) Can not reference a property declared in a super-interface and implemented in a non-public class

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

William R. Zwicky commented on VELOCITY-761:
--------------------------------------------

I found a related issue.  I'm trying to make get("property") work, and it has the same restriction -- If the class is not public, the method is not visible.  Since an instance of this class has been placed directly into the Velocity context, it seems very odd when methods go missing like this.  Velocity should either allow access to all public methods, or crash when the class is not public.

You also need a section in the documentation on how to build a context object, collecting into one place all the ways properties can be accessed.  This would be a good place to document these public/non-public rules.

Below is the class I'm trying to use.  It currently hides inside VelocityGetter.java, thus can't be public.

class MapList<K,V> extends AbstractList<V> {
    private Map<K,Integer> map;
    private List<V> values;

    public MapList(List<K> schema) {
        map = new HashMap<K, Integer>();
        for(int i=0; i<schema.size(); i++)
            map.put(schema.get(i), i);
    }

    public MapList(List<K> schema, List<V> values) {
        this(schema);
        this.values = values;
    }

    // === List interface === //

    @Override
    public V get(int index) {
        return values.get(index);
    }

    @Override
    public int size() {
        return values.size();
    }
    
    @Override
    public V set(int index, V value) {
        return values.set(index,value);
    }
    
    // === Extra Magic === //

    public void setValues(List<V> values) {
        this.values = values;
    }
    
//    public V get(K key) {
//        return values.get(map.get(key));
//    }
    
    public String get(String key) {
        return (String) values.get(map.get(key));
    }
}


> Can not reference a property declared in a super-interface and implemented in a non-public class
> ------------------------------------------------------------------------------------------------
>
>                 Key: VELOCITY-761
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-761
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.6.3
>            Reporter: Charles Miller
>
> Consider the following:
> public interface MyUser extends java.security.Principal { 
>      String getEmailAddress();
>  }
> class MyUserImpl implements MyUser {
>     public String getName() { ... }
>     public String getEmailAddress() { ... }
> }
> If I put a MyUserImpl in my Velocity context, $user.emailAddress will resolve, but $user.name will not.
> This is a problem with ClassMap#createMethodCache(). It ignores methods declared on the MyUserImpl class because the class is non-public, and it only looks up one level in the Interface hierarchy for methods defined on interfaces: so it will go up as far as the MyUser interface but not as far as the Principal interface.

-- 
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