Uploaded image for project: 'Velocity'
  1. Velocity
  2. VELOCITY-657

$velocityHasNext not working properly (returns true even if iterator does not have next value)

    XMLWordPrintableJSON

Details

    • Bug
    • Status: Closed
    • Minor
    • Resolution: Fixed
    • 1.6
    • 1.6.2, 1.7
    • Engine
    • None

    Description

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

      Attachments

        1. velocity-657-testcase.patch
          0.9 kB
          Jarkko Viinamäki

        Issue Links

          Activity

            People

              Unassigned Unassigned
              dmarks Dominik Marks
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: