Author: gvanmatre
Date: Tue May 22 19:49:38 2007
New Revision: 540820

URL: http://svn.apache.org/viewvc?view=rev&rev=540820
Log:
Partial fix for the validator script component's completely disregard for the 
rendered state of a parent 
containing a component that uses shale's common validator (SHALE-441).  Issue 
reported by Hasan Turksoy.  

Modified:
    
shale/framework/trunk/shale-validator/src/main/java/org/apache/shale/validator/faces/ValidatorScript.java
    
shale/framework/trunk/shale-validator/src/test/java/org/apache/shale/validator/CommonsValidatorTestCase.java

Modified: 
shale/framework/trunk/shale-validator/src/main/java/org/apache/shale/validator/faces/ValidatorScript.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-validator/src/main/java/org/apache/shale/validator/faces/ValidatorScript.java?view=diff&rev=540820&r1=540819&r2=540820
==============================================================================
--- 
shale/framework/trunk/shale-validator/src/main/java/org/apache/shale/validator/faces/ValidatorScript.java
 (original)
+++ 
shale/framework/trunk/shale-validator/src/main/java/org/apache/shale/validator/faces/ValidatorScript.java
 Tue May 22 19:49:38 2007
@@ -19,11 +19,13 @@
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.BitSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+
 import javax.faces.component.EditableValueHolder;
 import javax.faces.component.UIComponent;
 import javax.faces.component.UIComponentBase;
@@ -32,6 +34,7 @@
 import javax.faces.context.FacesContext;
 import javax.faces.context.ResponseWriter;
 import javax.faces.el.ValueBinding;
+
 import org.apache.commons.validator.ValidatorAction;
 import org.apache.commons.validator.Var;
 import org.apache.shale.util.Tags;
@@ -236,7 +239,21 @@
      * @param context The FacesContext for this request
      */
    private void findCommonsValidators(UIComponent c, FacesContext context) {
-      if (c instanceof EditableValueHolder && c.isRendered()) {
+      final int RENDERED_ATTR = 0;
+      final String[] RENDER_INDICATORS = {"rendered", "disabled", "readonly"}; 
+      BitSet VALID_VIEW_SET = new BitSet(3);
+      VALID_VIEW_SET.set(RENDERED_ATTR);
+
+      BitSet renderIndicatorSet = new BitSet(3);
+      for (int i = 0; i < RENDER_INDICATORS.length; i++) {
+          Boolean value = (Boolean) c.getAttributes().get(
+                  RENDER_INDICATORS[i]);
+          if (value != null && value.booleanValue()) {
+              renderIndicatorSet.set(i);
+          }
+      }
+      
+      if (c instanceof EditableValueHolder && 
renderIndicatorSet.equals(VALID_VIEW_SET)) {
          EditableValueHolder h = (EditableValueHolder) c;
          javax.faces.validator.Validator[] vs = h.getValidators();
          for (int i = 0; i < vs.length; i++) {
@@ -295,12 +312,14 @@
          }
       }
 
-      Iterator childrenIterator = c.getFacetsAndChildren();
-      while (childrenIterator.hasNext()) {
-         UIComponent child = (UIComponent) childrenIterator.next();
-         findCommonsValidators(child, context);
+      if (renderIndicatorSet.get(RENDERED_ATTR)) {
+          Iterator childrenIterator = c.getFacetsAndChildren();
+          while (childrenIterator.hasNext()) {
+              UIComponent child = (UIComponent) childrenIterator.next();
+              findCommonsValidators(child, context);
+          }
+          childrenIterator = null;
       }
-      childrenIterator = null;
    }
 
 

Modified: 
shale/framework/trunk/shale-validator/src/test/java/org/apache/shale/validator/CommonsValidatorTestCase.java
URL: 
http://svn.apache.org/viewvc/shale/framework/trunk/shale-validator/src/test/java/org/apache/shale/validator/CommonsValidatorTestCase.java?view=diff&rev=540820&r1=540819&r2=540820
==============================================================================
--- 
shale/framework/trunk/shale-validator/src/test/java/org/apache/shale/validator/CommonsValidatorTestCase.java
 (original)
+++ 
shale/framework/trunk/shale-validator/src/test/java/org/apache/shale/validator/CommonsValidatorTestCase.java
 Tue May 22 19:49:38 2007
@@ -1415,6 +1415,137 @@
         
         return writer.getBuffer();
     }
-    
+
+    public void testScriptNotGeneratedForComponentsInsideNotRenderedParent() 
+    throws Exception { 
+        // find the view root 
+        UIViewRoot root = facesContext.getViewRoot(); 
+        assertNotNull(root); 
+
+        UINamingContainer namingContainer = (UINamingContainer) 
+        application.createComponent("javax.faces.NamingContainer"); 
+        namingContainer.setRendered(false);
+        
+        namingContainer.setId(root.createUniqueId()); 
+        root.getChildren().add(root.getChildCount(), namingContainer); 
+
+        //create a form 1 
+        UIComponent form1 = this.createForm("test1", namingContainer); 
+
+
+        //create a dummy component 1 
+        HtmlInputText component1 = createInputText("txt_name", form1); 
+
+        //create a required field/server rule 
+        CommonsValidator validator1 = createValidator(component1, "required"); 
+
+        //create a script component 
+        ValidatorScript script = createValidatorScript(root); 
+
+        // render the javascript for the form 
+        StringBuffer htmlSnippet = encode(script); 
+
+        //System.out.println(htmlSnippet.toString()); 
+
+        // search tokens to test for in the javascript 
+        String[] searchTokens = { 
+                "test1_required()", 
+                "this[0] = new Array(\"test1:txt_name\");" 
+        }; 
+
+        // none of search tokens exist.. 
+        checkScriptForNotExist(htmlSnippet, searchTokens); 
+    } 
+
+    public void testScriptNotGeneratedForReadonlyComponents() 
+    throws Exception { 
+        // find the view root 
+        UIViewRoot root = facesContext.getViewRoot(); 
+        assertNotNull(root); 
+
+        UINamingContainer namingContainer = (UINamingContainer) 
+        application.createComponent("javax.faces.NamingContainer"); 
+        
+        namingContainer.setId(root.createUniqueId()); 
+        root.getChildren().add(root.getChildCount(), namingContainer); 
+
+        //create a form 1 
+        UIComponent form1 = this.createForm("test1", namingContainer); 
+
+
+        //create a dummy component 1 
+        HtmlInputText component1 = createInputText("txt_name", form1); 
+        component1.setReadonly(true);
+        
+        //create a required field/server rule 
+        CommonsValidator validator1 = createValidator(component1, "required"); 
+
+        //create a script component 
+        ValidatorScript script = createValidatorScript(root); 
+
+        // render the javascript for the form 
+        StringBuffer htmlSnippet = encode(script); 
+
+        //System.out.println(htmlSnippet.toString()); 
+
+        // search tokens to test for in the javascript 
+        String[] searchTokens = { 
+                "test1_required()", 
+                "this[0] = new Array(\"test1:txt_name\");" 
+        }; 
+
+        // none of search tokens exist.. 
+        checkScriptForNotExist(htmlSnippet, searchTokens); 
+    } 
+
+    public void testScriptNotGeneratedForDisabledComponents() 
+    throws Exception { 
+        // find the view root 
+        UIViewRoot root = facesContext.getViewRoot(); 
+        assertNotNull(root); 
+
+        UINamingContainer namingContainer = (UINamingContainer) 
+        application.createComponent("javax.faces.NamingContainer"); 
+        
+        namingContainer.setId(root.createUniqueId()); 
+        root.getChildren().add(root.getChildCount(), namingContainer); 
+
+        //create a form 1 
+        UIComponent form1 = this.createForm("test1", namingContainer); 
+
+
+        //create a dummy component 1 
+        HtmlInputText component1 = createInputText("txt_name", form1); 
+        component1.setDisabled(true);
+        
+        //create a required field/server rule 
+        CommonsValidator validator1 = createValidator(component1, "required"); 
+
+        //create a script component 
+        ValidatorScript script = createValidatorScript(root); 
+
+        // render the javascript for the form 
+        StringBuffer htmlSnippet = encode(script); 
+
+        //System.out.println(htmlSnippet.toString()); 
+
+        // search tokens to test for in the javascript 
+        String[] searchTokens = { 
+                "test1_required()", 
+                "this[0] = new Array(\"test1:txt_name\");" 
+        }; 
+
+        // none of search tokens exist.. 
+        checkScriptForNotExist(htmlSnippet, searchTokens); 
+    } 
+
+    private void checkScriptForNotExist(StringBuffer htmlSnippet, String[] 
+                                                                         
searchTokens) { 
+        for (int i = 0; i < searchTokens.length; i++) { 
+            Assert.assertFalse("Found: " + searchTokens[i], ( 
+                    htmlSnippet.indexOf(searchTokens[i]) != -1)); 
+        } 
+    } 
+
 
 }


Reply via email to