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;
+        }
+    }
+}


Reply via email to