You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2011/04/29 14:54:56 UTC

svn commit: r1097803 - in /myfaces/core/branches/2.1.x/api/src: main/java/javax/faces/component/visit/VisitHint.java test/java/javax/faces/component/UIDataTest.java

Author: lu4242
Date: Fri Apr 29 12:54:56 2011
New Revision: 1097803

URL: http://svn.apache.org/viewvc?rev=1097803&view=rev
Log:
MYFACES-3025 2.1: implement VisitHint.SKIP_ITERATION support in UIData (thanks to Martin Koci for provide this patch)

Modified:
    myfaces/core/branches/2.1.x/api/src/main/java/javax/faces/component/visit/VisitHint.java
    myfaces/core/branches/2.1.x/api/src/test/java/javax/faces/component/UIDataTest.java

Modified: myfaces/core/branches/2.1.x/api/src/main/java/javax/faces/component/visit/VisitHint.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.1.x/api/src/main/java/javax/faces/component/visit/VisitHint.java?rev=1097803&r1=1097802&r2=1097803&view=diff
==============================================================================
--- myfaces/core/branches/2.1.x/api/src/main/java/javax/faces/component/visit/VisitHint.java (original)
+++ myfaces/core/branches/2.1.x/api/src/main/java/javax/faces/component/visit/VisitHint.java Fri Apr 29 12:54:56 2011
@@ -51,6 +51,8 @@ public enum VisitHint
     /**
      * Hint that indicates that the visit should traverse only full component
      * instances and not "virtual" ones like UIData rows and so on.
+     * 
+     * @since 2.1
      */
     SKIP_ITERATION,
 }
\ No newline at end of file

Modified: myfaces/core/branches/2.1.x/api/src/test/java/javax/faces/component/UIDataTest.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.1.x/api/src/test/java/javax/faces/component/UIDataTest.java?rev=1097803&r1=1097802&r2=1097803&view=diff
==============================================================================
--- myfaces/core/branches/2.1.x/api/src/test/java/javax/faces/component/UIDataTest.java (original)
+++ myfaces/core/branches/2.1.x/api/src/test/java/javax/faces/component/UIDataTest.java Fri Apr 29 12:54:56 2011
@@ -21,6 +21,7 @@ package javax.faces.component;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.List;
 
 import javax.faces.application.StateManager;
@@ -38,6 +39,7 @@ import javax.faces.render.Renderer;
 import org.apache.myfaces.Assert;
 import org.apache.myfaces.TestRunner;
 import org.apache.myfaces.test.base.AbstractJsfTestCase;
+import org.apache.myfaces.test.mock.visit.MockVisitContext;
 import org.easymock.classextension.EasyMock;
 import org.easymock.classextension.IMocksControl;
 
@@ -47,6 +49,7 @@ import org.easymock.classextension.IMock
  */
 public class UIDataTest extends AbstractJsfTestCase
 {
+
     public UIDataTest(String name)
     {
         super(name);
@@ -449,9 +452,11 @@ public class UIDataTest extends Abstract
         uidata.setValue(value);
         // header facet
         UIComponent headerFacet = new HtmlPanelGroup();
+        headerFacet.setId("headerFacet");
         uidata.setHeader(headerFacet);
         // footer facet
         UIComponent footerFacet = new HtmlPanelGroup();
+        footerFacet.setId("footerFacet");
         uidata.setFooter(footerFacet);
         // first child
         UIComponent child1 = new UIColumn();
@@ -460,6 +465,7 @@ public class UIDataTest extends Abstract
         child1.getFacets().put("someFacet", facetOfChild1);
         // child of first child
         UIOutput childOfChild1 = new UIOutput();
+        childOfChild1.setId("childOfColumn");
         child1.getChildren().add(childOfChild1);
         uidata.getChildren().add(child1);
         // second child (should not be processed --> != UIColumn)
@@ -484,7 +490,40 @@ public class UIDataTest extends Abstract
         
         uidata.visitTree(visitContextMock, callback);
         
-        control.verify();        
+        control.verify();
+        
+        // VisitHint.SKIP_ITERATION test:
+        
+        // (1) uiData with two rows - should iterate over row twice
+        MockVisitContext mockVisitContext = new MockVisitContext(facesContext, null);
+        CountingVisitCallback countingVisitCallback = new CountingVisitCallback(2);
+        uidata.visitTree(mockVisitContext, countingVisitCallback);
+        countingVisitCallback.verify();
+        
+        // (2) uiData with two values - should iterate over row ones - SKIP_ITERATION is used
+        mockVisitContext = new MockVisitContext(facesContext, EnumSet.of(VisitHint.SKIP_ITERATION));
+        countingVisitCallback = new CountingVisitCallback(1);
+        uidata.visitTree(mockVisitContext, countingVisitCallback);
+        countingVisitCallback.verify();
+        
+        // (3) uiData with five values - should iterate over row five times
+        value = new ArrayList<String>();
+        value.add("1");
+        value.add("2");
+        value.add("3");
+        value.add("4");
+        value.add("5");
+        uidata.setValue(value);
+        mockVisitContext = new MockVisitContext(facesContext, null);
+        countingVisitCallback = new CountingVisitCallback(5);
+        uidata.visitTree(mockVisitContext, countingVisitCallback);
+        countingVisitCallback.verify();
+        
+        // (4) uiData with five values - should iterate over child ones - SKIP_ITERATION is used
+        mockVisitContext = new MockVisitContext(facesContext, EnumSet.of(VisitHint.SKIP_ITERATION));
+        countingVisitCallback = new CountingVisitCallback(1);
+        uidata.visitTree(mockVisitContext, countingVisitCallback);
+        countingVisitCallback.verify();
     }
 
     
@@ -587,4 +626,36 @@ public class UIDataTest extends Abstract
         
     }
 
-}
\ No newline at end of file
+    private final class CountingVisitCallback implements VisitCallback {
+        
+        public final int expectedVisits;
+        
+        public CountingVisitCallback(int expectedRowVisits) {
+            super();
+            this.expectedVisits = expectedRowVisits;
+        }
+
+        public int headerFacetVisits = 0;
+        public int footerFacetVisits = 0;
+        public int rowVisits = 0;
+        
+        public VisitResult visit(VisitContext context, UIComponent target) {
+            
+            if ("headerFacet".equals(target.getId())) {
+                headerFacetVisits++;
+            } else if ("footerFacet".equals(target.getId())) {
+                footerFacetVisits++;
+            } else if ("childOfColumn".equals(target.getId())) {
+                rowVisits++;
+            }
+            return VisitResult.ACCEPT;
+        }
+        
+        public void verify() {
+                assertEquals("header facet must be visited only ones", 1, headerFacetVisits);
+                assertEquals("footer facet must be visited only ones", 1, footerFacetVisits);
+                assertEquals("Expected row visit does not match", expectedVisits, rowVisits);
+        }
+    }
+       
+}