Author: lukaszlenart Date: Thu Dec 13 10:42:09 2012 New Revision: 1421210 URL: http://svn.apache.org/viewvc?rev=1421210&view=rev Log: WW-3942 solves NPE in iterator tag
Added: struts/struts2/trunk/core/src/test/java/org/apache/struts2/components/IteratorComponentTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/IteratorComponent.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/IteratorComponent.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/IteratorComponent.java?rev=1421210&r1=1421209&r2=1421210&view=diff ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/IteratorComponent.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/components/IteratorComponent.java Thu Dec 13 10:42:09 2012 @@ -21,19 +21,18 @@ package org.apache.struts2.components; -import java.io.Writer; -import java.util.Iterator; -import java.util.List; -import java.util.Arrays; - +import com.opensymphony.xwork2.util.ValueStack; +import com.opensymphony.xwork2.util.logging.Logger; +import com.opensymphony.xwork2.util.logging.LoggerFactory; +import org.apache.struts2.util.MakeIterator; import org.apache.struts2.views.annotations.StrutsTag; import org.apache.struts2.views.annotations.StrutsTagAttribute; -import org.apache.struts2.util.MakeIterator; import org.apache.struts2.views.jsp.IteratorStatus; -import com.opensymphony.xwork2.util.ValueStack; -import com.opensymphony.xwork2.util.logging.Logger; -import com.opensymphony.xwork2.util.logging.LoggerFactory; +import java.io.Writer; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; /** * <!-- START SNIPPET: javadoc --> @@ -357,7 +356,7 @@ public class IteratorComponent extends C } } - class CounterIterator implements Iterator<Object> { + static class CounterIterator implements Iterator<Object> { private int step; private int end; private int currentIndex; @@ -380,7 +379,7 @@ public class IteratorComponent extends C if (hasNext()) { int nextIndex = peekNextIndex(); currentIndex += step; - return value != null ? values.get(nextIndex) : nextIndex; + return values != null ? values.get(nextIndex) : nextIndex; } else { throw new IndexOutOfBoundsException("Index " + ( currentIndex + step) + " must be less than or equal to " + end); } Added: struts/struts2/trunk/core/src/test/java/org/apache/struts2/components/IteratorComponentTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/components/IteratorComponentTest.java?rev=1421210&view=auto ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/components/IteratorComponentTest.java (added) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/components/IteratorComponentTest.java Thu Dec 13 10:42:09 2012 @@ -0,0 +1,91 @@ +package org.apache.struts2.components; + +import com.opensymphony.xwork2.ActionContext; +import com.opensymphony.xwork2.util.ValueStack; +import org.apache.struts2.StrutsTestCase; + +import java.io.StringWriter; +import java.util.Arrays; +import java.util.List; + +public class IteratorComponentTest extends StrutsTestCase { + + public void testIterator() throws Exception { + // given + final ValueStack stack = ActionContext.getContext().getValueStack(); + stack.push(new FooAction()); + + StringWriter out = new StringWriter(); + + IteratorComponent ic = new IteratorComponent(stack); + ic.setValue("items"); + ic.setVar("val"); + + Property prop = new Property(stack); + + ic.getComponentStack().push(prop); + ic.getComponentStack().push(prop); + ic.getComponentStack().push(prop); + ic.getComponentStack().push(prop); + + String body = " "; + + // when + assertTrue(ic.start(out)); + + + for (int i = 0; i < 4; i++) { + prop.start(out); + prop.end(out, body); + ic.end(out, null); + } + + // then + assertEquals("item1 item2 item3 item4 ", out.getBuffer().toString()); + } + + public void testIteratorWithBegin() throws Exception { + // given + final ValueStack stack = ActionContext.getContext().getValueStack(); + stack.push(new FooAction()); + + StringWriter out = new StringWriter(); + + IteratorComponent ic = new IteratorComponent(stack); + ic.setValue("items"); + ic.setVar("val"); + ic.setBegin("1"); + Property prop = new Property(stack); + + ic.getComponentStack().push(prop); + ic.getComponentStack().push(prop); + ic.getComponentStack().push(prop); + + String body = " "; + + // when + assertTrue(ic.start(out)); + + for (int i = 0; i < 3; i++) { + prop.start(out); + prop.end(out, body); + ic.end(out, null); + } + + // then + assertEquals("item2 item3 item4 ", out.getBuffer().toString()); + } + + static class FooAction { + + private List items; + + public FooAction() { + items = Arrays.asList("item1", "item2", "item3", "item4"); + } + + public List getItems() { + return items; + } + } +}