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/02/19 01:51:01 UTC

[jira] Commented: (VELOCITY-701) migrating from 1.4 to 1.6.1 iteration over a List no longer works

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

Nathan Bubna commented on VELOCITY-701:
---------------------------------------

The trouble seems to be with abstract public methods declared in abstract classes and implemented in non-public classes.  An enum class with an abstract public method shows this, but it also happens with things like:

public abstract Foo {
  public abstract String getBar();
}
Foo foo = new Foo() { public String getBar() { return "bar"; } };

I think this worked in Velocity 1.4 because the ClassMap implementation was based off of Class.getMethods, whereas it was changed to Class.getDeclaredMethods in 1.5 to speed things up.  Calling getDeclaredMethods on Foo doesn't return getBar, which is surprising as the declaration is right there.   I haven't yet figured out how i want to fix this.

> migrating from 1.4 to 1.6.1 iteration over a List no longer works
> -----------------------------------------------------------------
>
>                 Key: VELOCITY-701
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-701
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.6.1
>         Environment: Linux, Sun Java 1.5
>            Reporter: chad davis
>
> I have a template that references a List returned by a method on an Enum.  The method is defined as an abstract member of the enum.  This used to work on 1.4, but doesn't work on 1.6.1  I'm able to get it to work on 1.6.1 by changing the abstract method to a regular method of the Enum, which is then overridden by each instance of the enum.  Here's the code that doesn't work.  
> Again, it seems to be the abstract modifier, becuase if I change that method to something like
> public List getMyList() { return new ArrayList(); }
> And then just override it in my enum instances, everything works fine.  
> public enum Thing {
>            NUMBER_ONE(  ){
>                        public List<String> getInnerThings() {
>                                //initialize innerThings if this is first time
>                                if ( this.innerThings == null ) {
>                                        innerThings = new ArrayList<String>();
>                                        innerThings.add( "blah blah" );
>                                        innerThings.add("blah blah"  );
>                                }
>                                return innerThings;
>                        }
>                },
>                 NUMBER_TWO(  ){
>                        public List<String> getinnerThings() {
>                                //initialize innerThings if this is first time
>                                if ( this.innerThings == null ) {
>                                        innerThings = new ArrayList<String>();
>                                        innerThings.add( "blah blah" );
>                                        innerThings.add("blah blah"  );
>                                }
>                                return innerThings;
>                        }
>                },
>                 NUMBER_THREE(  ){
>                        public List<String> getinnerThings() {
>                                if ( this.innerThings == null ) {
>                                        innerThings = new ArrayList<String>();
>                                        innerThings.add( "blah blah" );
>                                        innerThings.add("blah blah"  );
>                                }
>                                return innerThings;
>                        }
>                };
>        List<String> innerThings;
>        //This was an abstract method, but Velocity 1.6 quite working with it.
>        public abstract List<String> getinnerThings();
> }

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