<!--
  Copyright 2002,2004 The Apache Software Foundation.
  
  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at
  
       http://www.apache.org/licenses/LICENSE-2.0
  
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->

<j:jelly xmlns:j="jelly:core">
  <j:if test="${testMyList}">
    <j:set var="result.ordered">
      <j:forEach var="item" 
                 items="${myList}" 
                 varStatus="status"
                 begin="2"
                 end="6"
                 step="2">
        <j:choose>
          <j:when test="${status.first}">
            FIRST_
            ${status.begin}
            ${status.end}
            ${status.step}_
          </j:when>
          <j:when test="${status.last}">
            LAST_
          </j:when>
          <j:otherwise>
            MIDDLE_
          </j:otherwise>
        </j:choose>
        <j:if test="${not myList[status.index].equals(status.current)}">
          FAIL
        </j:if>
        ${status.count}
        ${status.index}
        ${status.current}
        /
      </j:forEach>
    </j:set>
  </j:if>
  
  <!-- next test -->
  <j:if test="${testNumList}">
    <j:set var="result.ordered">
      <j:forEach var="item" 
                 varStatus="status"
                 begin="2"
                 end="6"
                 step="2">
        <j:choose>
          <j:when test="${status.first}">
            FIRST_
            ${status.begin}
            ${status.end}
            ${status.step}_
          </j:when>
          <j:when test="${status.last}">
            LAST_
          </j:when>
          <j:otherwise>
            MIDDLE_
          </j:otherwise>
        </j:choose>
        ${status.count}
        ${status.index}
        ${status.current}
        /
      </j:forEach>
    </j:set>
  </j:if>
</j:jelly>
