This "deep scan" seems wrong to me. It could pose both an unnecessary performance burden and potentially unexpected behaviour. The search algorithm defined by the UIComponent findComponent method [1] should be sufficient for specifying a target in any known naming container.

Consider this: A user attempts to reference an object in another naming container, but makes a mistake in the path portion of the id. This should cause the search to fail, but thanks to the deep scan, it finds the desired component by the simple id. Everything appears to work. A bit later, another user on the team adds a component to another naming container with the same simple id. All of a sudden, the search is finding the wrong component to submit - and a JIRA issue probably gets opened if they can't figure it out.

If we really want to encourage this sort of lazy specification of "for" attributes, then it needs to be both documented and consistent throughout the project. My feeling is that findComponent() is sufficient.

[1 tiny] http://tinyurl.com/2k8yzn
[1 long] http://java.sun.com/javaee/javaserverfaces/1.1_01/docs/api/javax/faces/component/UIComponent.html#findComponent(java.lang.String)

Regards,

Jeff Bischoff
Kenneth L Kurz & Associates, Inc.

Martin Marinschek wrote:
Why does the normal findComponent method fail for you?

regards,

Martin

On 2/13/07, [EMAIL PROTECTED] <[EMAIL PROTECTED]> wrote:
Author: imario
Date: Tue Feb 13 09:58:27 2007
New Revision: 507121

URL: http://svn.apache.org/viewvc?view=rev&rev=507121
Log:
use an aggressive strategy (traverse the whole tree) to search a component by id if the normal
uiComponent.findComponent failed. Is there a better way?


Modified:
myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/submitOnEvent/SubmitOnEventRenderer.java

Modified: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/submitOnEvent/SubmitOnEventRenderer.java URL: http://svn.apache.org/viewvc/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/submitOnEvent/SubmitOnEventRenderer.java?view=diff&rev=507121&r1=507120&r2=507121 ============================================================================== --- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/submitOnEvent/SubmitOnEventRenderer.java (original) +++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/submitOnEvent/SubmitOnEventRenderer.java Tue Feb 13 09:58:27 2007
@@ -30,6 +30,7 @@
 import javax.faces.component.UIInput;
 import javax.faces.component.UICommand;
 import java.io.IOException;
+import java.util.Iterator;

 /**
* Attach an event handler to an input element or use a global event handler to
@@ -74,7 +75,11 @@
             }

             forComponent = uiComponent.findComponent(forComponentId);
-            if (forComponent == null)
+                       if (forComponent == null)
+                       {
+ forComponent = findComponentAggressive(facesContext.getViewRoot(), forComponentId);
+                       }
+                       if (forComponent == null)
             {
throw new IllegalArgumentException("SubmitOnEvent: can't find 'for'-component '" + forComponentId + "'");
             }
@@ -119,4 +124,30 @@
         out.writeText(js.toString(), null);
         out.endElement(HTML.SCRIPT_ELEM);
     }
+
+       /**
+ * deep scan the tree and see if ANY naming container has a component with the
+        * given id
+        */
+ private UIComponent findComponentAggressive(UIComponent base, String id)
+       {
+               if (id.equals(base.getId()))
+               {
+                       return base;
+               }
+
+               Iterator iter = base.getFacetsAndChildren();
+               while (iter.hasNext())
+               {
+                       UIComponent child = (UIComponent) iter.next();
+
+ UIComponent found = findComponentAggressive(child, id);
+                       if (found != null)
+                       {
+                               return found;
+                       }
+               }
+
+               return null;
+       }
 }







Reply via email to