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