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