You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@velocity.apache.org by "Michael Parmeley (JIRA)" <de...@velocity.apache.org> on 2009/11/13 15:37:39 UTC

[jira] Updated: (VELOCITY-657) $velocityHasNext not working properly (returns true even if iterator does not have next value)

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

Michael Parmeley updated VELOCITY-657:
--------------------------------------

    Comment: was deleted

(was: I am using velocity 1.6.2 and this is still occuring. Using $velocityHasNext does not work in nested loops.

For example:

I have: #foreach(${column} in ${columns})${column.columnName}#if(${velocityHasNext}),#end#end

However, if I have two columns named "foo" and "bar" this is resulting in "foobar". If I change the condition in the if statment to something cheesy like (3 > 2) then the expected results of "foo,bar" is generated.

So the $velocityHasNext is still not working in velocity 1.6.2.

I have this property in my velocity.properties:

directive.foreach.iterator.name = velocityHasNext
)

> $velocityHasNext not working properly (returns true even if iterator does not have next value)
> ----------------------------------------------------------------------------------------------
>
>                 Key: VELOCITY-657
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-657
>             Project: Velocity
>          Issue Type: Bug
>          Components: Engine
>    Affects Versions: 1.6
>            Reporter: Dominik Marks
>            Priority: Minor
>             Fix For: 1.6.2, 1.7
>
>         Attachments: velocity-657-testcase.patch
>
>
> Using the new "velocityHasNext" feature in loops does not work as expected.
> When using the following excerpt:
> #foreach ($value in $element.values)
>  $value 
>  #if( $velocityHasNext )
>   SEPARATOR
>  #end
> #end
> and having $element.values as e.g. "test1", "test2", "test3"
> I get
> test1 SEPARATOR test2 SEPARATOR test3 SEPARATOR
> but I would expect
> test1 SEPARATOR test2 SEPARATOR test3
> When looking into the source code, I see the following in org.apache.velocity.runtime.directive.Foreach.render():
> while (!maxNbrLoopsExceeded && i.hasNext())
>         {
>             // TODO: JDK 1.5+ -> Integer.valueOf()
>             put(context, counterName , new Integer(counter));
>             put(context, hasNextName, Boolean.valueOf(i.hasNext()));
>             Object value = i.next();
>             put(context, elementKey, value);
>       ....
> }
> Isn't this the wrong order of instructions?
> I would expect:
>             Object value = i.next();
>             put(context, hasNextName, Boolean.valueOf(i.hasNext()));
> So that the $velocityHasNext variable will be filled with the "hasNext" of the follow-up iteration and not with the "hasNext" of the current iteration (which will always be true, otherwise the loop has finished before).

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