hi all,

it seems there is a buggy case at validator script generation(at
findCommonsValidators method to be exact).. issue is; when i use a component
inside another parent component(that's NOT RENDERED), it's still generating
validator scripts for my child component.. this causes script errors when i
submitted my page... Because, there is a validation script exists for a not
rendered(because parent's not rendered) component.

To visualize;
<h:panelGroup rendered="false"> // child components won't be rendered
because parent's not rendered
 <h:inputText id="txt_name" ....>
  <s:commonsValidator type="required" arg="Name" server="true"
client="true" />
 </h:inputText>
</h:panelGroup>

as seen above, my textbox(txt_name) won't be rendered since it's parent
won't be rendered.. But client validator scripts are still being generated
for this field. This causes javascript errors at form submit...

Should we enter an issue for this case?

Below is a test method for the case; (necessary methods already in jar's
test package)
/*-------------------------------------------------------------------*/
   public void testScriptNotGeneratedForComponentsInsideNotRenderedParent()
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 parent panel component
       HtmlPanelBox panelbox = createPanelBox("pnl_name", form1);

       //create a dummy component 1
       HtmlInputText component1 = createInputText("txt_name", panelbox);

       //create a required field/server rule
       CommonsValidator validator1 = createValidator(component1,
"required", null);

       //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));
       }
   }
/*-------------------------------------------------------------------*/

hope the issue is clear enough...

best regards,


Hasan...

Reply via email to