You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2008/01/30 23:38:26 UTC

svn commit: r616930 - in /tapestry/tapestry4/trunk: ./ tapestry-framework/src/java/org/apache/tapestry/ tapestry-framework/src/java/org/apache/tapestry/dojo/html/ tapestry-framework/src/java/org/apache/tapestry/engine/ tapestry-framework/src/java/org/a...

Author: jkuhnert
Date: Wed Jan 30 14:38:23 2008
New Revision: 616930

URL: http://svn.apache.org/viewvc?rev=616930&view=rev
Log:
I hope it fixes TAPESTRY-2092.   

The "hacky" way that ComponentEventInvoker was finding a targeted component instance finally caught up with me.   Replaced hack with use of IComponent.getIdPath() && IPage.getNestedComponent().

Modified:
    tapestry/tapestry4/trunk/pom.xml
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/ComponentEvent.script
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IPage.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/ExternalService.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/BrowserEvent.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/PageValidateListener.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ElementEvent.script
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/ComponentEventProperty.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/EventBoundListener.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/impl/ComponentEventInvoker.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/link/ExternalLink.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/listener/ListenerMap.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pageload/EventConnectionVisitor.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentEventConnectionWorker.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/ComponentSpecification.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IEventListener.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/engine/DirectServiceTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/event/BrowserEventTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/ComponentEventPropertyTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/impl/ComponentEventInvokerTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/pageload/TestEventConnectionVisitor.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/spec/TestComponentSpecification.java

Modified: tapestry/tapestry4/trunk/pom.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/pom.xml?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/pom.xml (original)
+++ tapestry/tapestry4/trunk/pom.xml Wed Jan 30 14:38:23 2008
@@ -213,7 +213,7 @@
             <dependency>
                 <groupId>org.apache.tapestry</groupId>
                 <artifactId>tapestry-test</artifactId>
-                <version>4.1.3</version>
+                <version>4.1.4-SNAPSHOT</version>
                 <scope>test</scope>
             </dependency>
             <dependency>

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/ComponentEvent.script
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/ComponentEvent.script?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/ComponentEvent.script (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/ComponentEvent.script Wed Jan 30 14:38:23 2008
@@ -19,9 +19,9 @@
                 tapestry.cleanConnect("${clientId}", "${event[0]}", "event${event[1]}");
                 tapestry.event${event[1]}=function( event ){
                     
-                    var content={beventname:"${event[0]}", bcomponentid:"${component.id}"};
+                    var content={beventname:"${event[0]}", bcomponentidpath:"${component.extendedId}", bcomponentid:"${component.id}"};
                    
-                    tapestry.event.buildEventProperties( event, content, arguments);                    
+                    tapestry.event.buildEventProperties( event, content, arguments);
                     if (!content["beventtarget.id"]) {
                     	content["beventtarget.id"]="${clientId}";
                     }                                 
@@ -35,7 +35,7 @@
             <foreach expression="formEvents" key="formEvent">
                 tapestry.cleanConnect("${clientId}", "${formEvent[0]}", "formEvent${formEvent[4]}");
                 tapestry.formEvent${formEvent[4]}=function(e){
-                    var content={beventname:"${formEvent[0]}", bcomponentid:"${component.id}"};
+                    var content={beventname:"${formEvent[0]}", bcomponentidpath:"${component.extendedId}", bcomponentid:"${component.id}"};
                     tapestry.event.buildEventProperties(e, content, arguments);
                     if (!content["beventtarget.id"]){
                     	content["beventtarget.id"]="${clientId}";

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IPage.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IPage.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IPage.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IPage.java Wed Jan 30 14:38:23 2008
@@ -183,7 +183,7 @@
      * in) user should not be able to visit directly. This method acts as the first line of defense
      * against a malicous user hacking URLs.
      * <p>
-     * Pages that should be protected will typically throw a {@linkPageRedirectException}, to
+     * Pages that should be protected will typically throw a {@link PageRedirectException}, to
      * redirect the user to an appropriate part of the system (such as, a login page).
      * <p>
      * Since 3.0, it is easiest to not override this method, but to implement the

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/dojo/html/WidgetEvent.script Wed Jan 30 14:38:23 2008
@@ -18,7 +18,7 @@
             <foreach expression="events" key="event">
                 tapestry.cleanConnectWidget("${clientId}", "${event[0]}", "event${event[1]}");
                 tapestry.event${event[1]}=function(e){
-                    var content={beventname:"${event[0]}", bcomponentid:"${component.id}"};
+                    var content={beventname:"${event[0]}", bcomponentidpath:"${component.extendedId}", bcomponentid:"${component.id}"};
                     tapestry.event.buildEventProperties(e, content, arguments);
                     if (!content["beventtarget.id"]) content["beventtarget.id"]="${clientId}";
                     tapestry.bind("${url}", content);
@@ -30,7 +30,7 @@
             <foreach expression="formEvents" key="formEvent">
                 tapestry.cleanConnectWidget("${clientId}", "${formEvent[0]}", "formEvent${formEvent[4]}");
                 tapestry.formEvent${formEvent[4]}=function(e){
-                    var content={beventname:"${formEvent[0]}", bcomponentid:"${component.id}"};
+                    var content={beventname:"${formEvent[0]}", bcomponentidpath:"${component.extendedId}", bcomponentid:"${component.id}"};
                     tapestry.event.buildEventProperties(e, content, arguments);
                     if (!content["beventtarget.id"]) content["beventtarget.id"]="${clientId}";
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/ExternalService.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/ExternalService.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/ExternalService.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/ExternalService.java Wed Jan 30 14:38:23 2008
@@ -14,10 +14,6 @@
 
 package org.apache.tapestry.engine;
 
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.hivemind.util.Defense;
 import org.apache.tapestry.IExternalPage;
@@ -28,6 +24,10 @@
 import org.apache.tapestry.services.ResponseRenderer;
 import org.apache.tapestry.services.ServiceConstants;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * The external service enables external applications to reference Tapestry pages via a URL. Pages
  * which can be referenced by the external service must implement the {@link IExternalPage}
@@ -147,9 +147,7 @@
         }
         catch (ClassCastException ex)
         {
-            throw new ApplicationRuntimeException(EngineMessages.pageNotCompatible(
-                    rawPage,
-                    IExternalPage.class), rawPage, null, ex);
+            throw new ApplicationRuntimeException(EngineMessages.pageNotCompatible(rawPage,IExternalPage.class), rawPage, null, ex);
         }
         
         Object[] parameters = _linkFactory.extractListenerParameters(cycle);

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/BrowserEvent.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/BrowserEvent.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/BrowserEvent.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/BrowserEvent.java Wed Jan 30 14:38:23 2008
@@ -29,20 +29,21 @@
  */
 public class BrowserEvent
 {
-    public static final String NAME="beventname";
-    public static final String TYPE="beventtype";
-    public static final String KEYS="beventkeys";
-    public static final String CHAR_CODE="beventcharCode";
-    public static final String PAGE_X="beventpageX";
-    public static final String PAGE_Y="beventpageY";
-    public static final String LAYER_X="beventlayerX";
-    public static final String LAYER_Y="beventlayerY";
+    public static final String NAME = "beventname";
+    public static final String TYPE = "beventtype";
+    public static final String KEYS = "beventkeys";
+    public static final String CHAR_CODE = "beventcharCode";
+    public static final String PAGE_X = "beventpageX";
+    public static final String PAGE_Y = "beventpageY";
+    public static final String LAYER_X = "beventlayerX";
+    public static final String LAYER_Y = "beventlayerY";
 
-    public static final String TARGET="beventtarget";
-    public static final String TARGET_ATTR_ID="id";
+    public static final String TARGET = "beventtarget";
+    public static final String TARGET_ATTR_ID = "id";
     public static final String COMPONENT_ID = "bcomponentid";
+    public static final String COMPONENT_ID_PATH = "bcomponentidpath";
 
-    public static final String METHOD_ARGUMENTS="methodArguments";
+    public static final String METHOD_ARGUMENTS = "methodArguments";
 
     private String _name;
     private String _type;
@@ -54,7 +55,8 @@
     private String _layerY;
     private EventTarget _target;
     private String _componentId;
-    
+    private String _componentIdPath;
+
     private String _methodArguments;
     private JSONArray _methodArgumentsArray;
 
@@ -78,6 +80,7 @@
         _layerX = cycle.getParameter(LAYER_X);
         _layerY = cycle.getParameter(LAYER_Y);
         _componentId = cycle.getParameter(COMPONENT_ID);
+        _componentIdPath = cycle.getParameter(COMPONENT_ID_PATH);
 
         Map props = new HashMap();
         _target = new EventTarget(props);
@@ -100,22 +103,26 @@
      */
     public BrowserEvent(String name, EventTarget target)
     {
-        this(name, null, target);
+        this(name, null, null, target);
     }
 
     /**
      * Creates a new browser event with the specified
      * name/target properties.
      *
+     * <p>Currently used for testing only.</p>
+     *
      * @param name The name of the event, ie "onClick", "onBlur", etc..
      * @param componentId Component targeted.
+     * @param componentIdPath The id path of the component.
      * @param target The target of the client side event.
      */
-    public BrowserEvent(String name, String componentId, EventTarget target)
+    public BrowserEvent(String name, String componentId, String componentIdPath, EventTarget target)
     {
         _name = name;
         _target = target;
         _componentId = componentId;
+        _componentIdPath = componentIdPath;
     }
 
     /**
@@ -152,7 +159,18 @@
     {
         return _componentId;
     }
-    
+
+    /**
+     * If the event was generated for a {@link org.apache.tapestry.IComponent} - will be the
+     * value returned from {@link org.apache.tapestry.IComponent#getExtendedId()}.
+     *
+     * @return Component path id, or null if not present.
+     */
+    public String getComponentIdPath()
+    {
+        return _componentIdPath;
+    }
+
     /**
      * @return the charCode
      */
@@ -224,15 +242,15 @@
             try
             {
                 _methodArgumentsArray = _methodArguments != null
-                                        ? new JSONArray( _methodArguments )
-                                        : new JSONArray();
+                        ? new JSONArray( _methodArguments )
+                        : new JSONArray();
             }
             catch (ParseException ex)
             {
                 throw new ApplicationRuntimeException(ex);
             }
         }
-        
+
         return _methodArgumentsArray;
     }
 
@@ -271,6 +289,10 @@
                ", _layerY='" + _layerY + '\'' +
                '\n' +
                ", _target=" + _target +
+               '\n' +
+               ", _componentId='" + _componentId + '\'' +
+               '\n' +
+               ", _componentIdPath='" + _componentIdPath + '\'' +
                '\n' +
                ", _methodArguments='" + _methodArguments + '\'' +
                '\n' +

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/PageValidateListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/PageValidateListener.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/PageValidateListener.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/event/PageValidateListener.java Wed Jan 30 14:38:23 2008
@@ -35,6 +35,8 @@
      * May throw a {@link org.apache.tapestry.PageRedirectException}, to
      * redirect the user to an appropriate part of the system (such as, a login
      * page).
+     *
+     * @param event The originating event.
      */
 
     void pageValidate(PageEvent event);

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ElementEvent.script
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ElementEvent.script?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ElementEvent.script (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/html/ElementEvent.script Wed Jan 30 14:38:23 2008
@@ -44,7 +44,7 @@
                     <if-not expression="formEvent[2]">
                     tapestry.form.submit("${formName}");
                     </if-not>
-                    
+                        
                     tapestry.form.setFormValidating("${formName}", validateState);
                     </foreach>
                 };

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/ComponentEventProperty.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/ComponentEventProperty.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/ComponentEventProperty.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/ComponentEventProperty.java Wed Jan 30 14:38:23 2008
@@ -61,6 +61,7 @@
     /**
      * Adds a listener bound to the specified client side
      * events.
+     * 
      * @param events
      * @param methodName
      * @param async
@@ -86,7 +87,8 @@
     public void addListener(String[] events, String methodName, 
             String formId, boolean validateForm, boolean async, boolean focus, boolean autoSubmit)
     {
-        for (int i=0; i < events.length; i++) {
+        for (int i=0; i < events.length; i++)
+        {
             if (formId != null && formId.length() > 0)
             {
                 addFormEventListener(events[i], methodName, formId, validateForm, async, focus, autoSubmit);
@@ -140,15 +142,16 @@
         Iterator it = getEvents().iterator();
         List removeKeys = new ArrayList();
         
-        while (it.hasNext()) {
+        while (it.hasNext())
+        {
             String key = (String)it.next();
-
             List listeners = (List) _eventMap.get(key);
+
             Iterator lit = listeners.iterator();
-            while (lit.hasNext()) {
-                
+            while (lit.hasNext())
+            {    
                 EventBoundListener listener = (EventBoundListener) lit.next();
-
+                
                 listener.setFormId(formIdPath);
                 lit.remove();
                 
@@ -159,13 +162,14 @@
             
             // remove mapping if empty
             
-            if (listeners.size() == 0) {
+            if (listeners.size() == 0)
+            {
                 removeKeys.add(key);
             }
         }
 
-        for (int i=0; i < removeKeys.size(); i++) {
-            
+        for (int i=0; i < removeKeys.size(); i++)
+        {    
             _eventMap.remove(removeKeys.get(i));
         }
 
@@ -189,23 +193,25 @@
      * Replaces all instances of the existing component id mapped for this property with the new
      * {@link org.apache.tapestry.IComponent#getIdPath()} version.
      *
-     * @param idPath The component id path.
+     * @param extendedId The component extended id path.
+     * @param idPath The component idPath from the page.
      */
-    public void rewireComponentId(String idPath)
+    public void rewireComponentId(String extendedId, String idPath)
     {
-        _componentId = idPath;
+        _componentId = extendedId;
 
         Iterator it = getEvents().iterator();
         while (it.hasNext())
         {
             String key = (String) it.next();
-
             List listeners = (List)_eventMap.get(key);
 
-            for (int i=0; i < listeners.size(); i++) {
-
+            for (int i=0; i < listeners.size(); i++)
+            {
                 EventBoundListener listener = (EventBoundListener) listeners.get(i);
-                listener.setComponentId(idPath);
+
+                listener.setComponentId(extendedId);
+                listener.setComponentIdPath(idPath);
             }
         }
 
@@ -213,13 +219,14 @@
         while (it.hasNext())
         {
             String key = (String) it.next();
-
             List listeners = (List)_formEventMap.get(key);
 
-            for (int i=0; i < listeners.size(); i++) {
-
+            for (int i=0; i < listeners.size(); i++)
+            {
                 EventBoundListener listener = (EventBoundListener) listeners.get(i);
-                listener.setComponentId(idPath);
+
+                listener.setComponentId(extendedId);
+                listener.setComponentIdPath(idPath);
             }
         }
     }
@@ -243,7 +250,8 @@
     public List getEventListeners(String event)
     {
         List listeners = (List)_eventMap.get(event);
-        if (listeners == null) {
+        if (listeners == null)
+        {
             listeners = new ArrayList();
             _eventMap.put(event, listeners);
         }
@@ -263,7 +271,8 @@
     public List getFormEventListeners(String event)
     {
         List listeners = (List)_formEventMap.get(event);
-        if (listeners == null) {
+        if (listeners == null)
+        {
             listeners = new ArrayList();
             _formEventMap.put(event, listeners);
         }
@@ -311,8 +320,10 @@
         if (listeners == null) 
             return ret;
         
-        for (int i=0; i < listeners.size(); i++) {
+        for (int i=0; i < listeners.size(); i++)
+        {
             EventBoundListener listener = (EventBoundListener)listeners.get(i);
+
             if (listener.getFormId().equals(formId))
                 ret.add(listener);
         }
@@ -330,7 +341,8 @@
             List listeners = (List)source.get(event);
 
             List newListeners = new ArrayList();
-            for (int i=0; i < listeners.size(); i++) {
+            for (int i=0; i < listeners.size(); i++)
+            {
                 EventBoundListener listener = (EventBoundListener) listeners.get(i);
                 newListeners.add(listener.clone());
             }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/EventBoundListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/EventBoundListener.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/EventBoundListener.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/EventBoundListener.java Wed Jan 30 14:38:23 2008
@@ -28,6 +28,8 @@
     private boolean _validateForm;
     // The targeted component to listen to events on
     private String _componentId;
+    // The id path of the component that the listener method is connected to
+    private String _componentIdPath;
     
     // If targeting a form, whether or not to submit it asynchronously
     private boolean _async;
@@ -126,6 +128,11 @@
         _componentId = id;
     }
 
+    public void setComponentIdPath(String idPath)
+    {
+        _componentIdPath = idPath;
+    }
+
     /**
      * @return the validateForm
      */
@@ -153,6 +160,11 @@
     public boolean isAutoSubmit()
     {
         return _autoSubmit;
+    }
+
+    public String getComponentIdPath()
+    {
+        return _componentIdPath;
     }
 
     public Object clone()

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/impl/ComponentEventInvoker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/impl/ComponentEventInvoker.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/impl/ComponentEventInvoker.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/event/impl/ComponentEventInvoker.java Wed Jan 30 14:38:23 2008
@@ -15,10 +15,7 @@
 
 import edu.emory.mathcs.backport.java.util.concurrent.ConcurrentHashMap;
 import org.apache.hivemind.util.Defense;
-import org.apache.tapestry.IActionListener;
-import org.apache.tapestry.IComponent;
-import org.apache.tapestry.IForm;
-import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.*;
 import org.apache.tapestry.event.BrowserEvent;
 import org.apache.tapestry.event.ResetEventListener;
 import org.apache.tapestry.form.FormSupport;
@@ -29,7 +26,9 @@
 import org.apache.tapestry.spec.IComponentSpecification;
 import org.apache.tapestry.spec.IEventListener;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
 
 /**
@@ -76,9 +75,9 @@
         String formIdPath = form.getExtendedId();
 
         String targetId = (String)event.getTarget().get("id");
-        String componentId = event.getComponentId();
+        String componentIdPath = event.getComponentIdPath();
 
-        if (targetId == null || componentId == null)
+        if (targetId == null || componentIdPath == null)
             return;
 
         List comps = getFormEventListeners(formIdPath);
@@ -92,19 +91,13 @@
             IComponentSpecification spec = (IComponentSpecification)comps.get(i);
             EventBoundListener[] listeners = spec.getFormEvents(formIdPath, event);
 
-            IComponent target = null;
-            if (spec.isPageSpecification())
-            {
-                target = form.getPage();
-            } else {
-                target = findComponent(form.getPage().getComponents().values(), spec);
-            }
-
+            IPage page = form.getPage();
+            
             for (int e=0; e < listeners.length; e++)
             {
                 // ensure ~only~ the method that targeted this event gets called!
 
-                if (!listeners[e].getComponentId().endsWith(componentId))
+                if (!listeners[e].getComponentId().equals(componentIdPath))
                     continue;
 
                 // clear validation errors but not input if async validation is
@@ -119,6 +112,8 @@
                 if (!disableFocus && !listeners[e].shouldFocusForm())
                     disableFocus = true;
 
+                IComponent target = page.getNestedComponent(listeners[e].getComponentIdPath());
+
                 // defer execution until after form is done rewinding
 
                 form.addDeferredRunnable(
@@ -141,26 +136,18 @@
     {
         String idPath = component.getExtendedId();
         List listeners = getEventListeners(idPath);
+        
         if (listeners == null)
             return;
 
+        IPage page = component.getPage();
+
         for (int i = 0; i < listeners.size(); i++)
         {
             IComponentSpecification listener = (IComponentSpecification)listeners.get(i);
 
-            IComponent target;
-            ComponentEventProperty props;
-
-            if (listener.isPageSpecification())
-            {
-                target = component.getPage();
-                props = listener.getComponentEvents(idPath);
-            } else
-            {
-                target = findComponent(component.getPage().getComponents().values(), listener);
-                props = target.getSpecification().getComponentEvents(idPath);
-            }
-
+            ComponentEventProperty props = listener.getComponentEvents(idPath);
+            
             if (props == null)
                 continue;
 
@@ -169,6 +156,8 @@
             {
                 EventBoundListener eventListener = (EventBoundListener)clisteners.get(e);
 
+                IComponent target = page.getNestedComponent(eventListener.getComponentIdPath());
+                
                 _invoker.invokeListener(target.getListeners().getListener(eventListener.getMethodName()), target, cycle);
             }
 
@@ -193,30 +182,6 @@
 
             _invoker.invokeListener(component.getListeners().getListener(listener.getMethodName()), component, cycle);
         }
-    }
-
-    IComponent findComponent(Collection comps, IComponentSpecification spec)
-    {
-        IComponent ret = null;
-
-        Iterator it = comps.iterator();
-
-        while (it.hasNext())
-        {
-            IComponent comp = (IComponent)it.next();
-
-            if (comp.getSpecification().equals(spec))
-            {
-                ret = comp;
-                break;
-            }
-
-            ret = findComponent(comp.getComponents().values(), spec);
-            if (ret != null)
-                break;
-        }
-
-        return ret;
     }
 
     /** Local runnable for deferred form connections. */

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/link/ExternalLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/link/ExternalLink.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/link/ExternalLink.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/link/ExternalLink.java Wed Jan 30 14:38:23 2008
@@ -33,21 +33,17 @@
 
 public abstract class ExternalLink extends AbstractLinkComponent
 {
-
     public abstract IEngineService getExternalService();
 
     public ILink getLink(IRequestCycle cycle)
     {
-        Object[] serviceParameters = DirectLink
-                .constructServiceParameters(getParameters());
+        Object[] serviceParameters = DirectLink.constructServiceParameters(getParameters());
         
         INamespace namespace = getTargetNamespace();
         
-        String targetPage = (namespace==null) ?
-            getTargetPage() : namespace.constructQualifiedName(getTargetPage());
+        String targetPage = (namespace==null) ? getTargetPage() : namespace.constructQualifiedName(getTargetPage());
 
-        ExternalServiceParameter esp = new ExternalServiceParameter(
-                targetPage, serviceParameters);
+        ExternalServiceParameter esp = new ExternalServiceParameter(targetPage, serviceParameters);
 
         return getExternalService().getLink(false, esp);
     }
@@ -56,6 +52,5 @@
 
     public abstract String getTargetPage();
     
-    /** @since 4.1.4 **/
     public abstract INamespace getTargetNamespace();
 }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/listener/ListenerMap.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/listener/ListenerMap.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/listener/ListenerMap.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/listener/ListenerMap.java Wed Jan 30 14:38:23 2008
@@ -14,12 +14,12 @@
 
 package org.apache.tapestry.listener;
 
-import java.util.Collection;
-
 import org.apache.hivemind.ApplicationRuntimeException;
 import org.apache.tapestry.IActionListener;
 import org.apache.tapestry.IComponent;
 
+import java.util.Collection;
+
 /**
  * @author Howard M. Lewis Ship
  */
@@ -36,7 +36,7 @@
      *            the name of the method to invoke (the most appropriate method
      *            will be selected if there are multiple overloadings of the
      *            same method name)
-     * @returns an object implementing {@link IActionListener}.
+     * @return an object implementing {@link IActionListener}.
      * @throws ApplicationRuntimeException
      *             if the listener can not be created.
      */
@@ -50,7 +50,7 @@
 	 * @param component
 	 *          the component whose id is used to make up the name of the
 	 *          expected listener
-	 * @returns an object implementing {@link IActionListener}.
+	 * @return an object implementing {@link IActionListener}.
 	 * @throws ApplicationRuntimeException
 	 *          if the listener can not be found on the component
 	 */
@@ -59,7 +59,8 @@
     /**
      * Returns an unmodifiable collection of the names of the listeners
      * implemented by the target class.
-     * 
+     *
+     * @return List of known listener names.
      * @since 1.0.6
      */
     Collection getListenerNames();
@@ -67,7 +68,9 @@
     /**
      * Returns true if this ListenerMapImpl can provide a listener with the
      * given name.
-     * 
+     *
+     * @param name Name of the method to check listener existance of.
+     * @return True if there is a matching listener of that name,  false otherwise.
      * @since 2.2
      */
     boolean canProvideListener(String name);

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pageload/EventConnectionVisitor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pageload/EventConnectionVisitor.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pageload/EventConnectionVisitor.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pageload/EventConnectionVisitor.java Wed Jan 30 14:38:23 2008
@@ -32,32 +32,37 @@
         Map events = component.getSpecification().getComponentEvents();
         Set keySet = events.keySet();
         String[] compIds = (String[]) keySet.toArray(new String[keySet.size()]);
-        
+
         for (int i=0; i < compIds.length; i++)
         {
             String compId = compIds[i];
-            ComponentEventProperty property = (ComponentEventProperty) events.get(compId);
 
-            // find the targeted component
+            // find the targeted component, first search component children
+            // and then page children if not contained by component
 
-            IComponent comp = findComponent(compId, component.getPage());
+            IComponent comp = findComponent(compId, component);
+
+            if (comp == null && !IPage.class.isInstance(component))
+            {
+                comp = findComponent(compId, component.getPage());
+            }
 
             if (comp == null)
                 continue;
 
             if (Component.class.isInstance(comp))
                 ((Component)comp).setHasEvents(true);
-            
+
             // wire up with idPath
 
             String idPath = comp.getExtendedId();
-            
-            component.getSpecification().rewireComponentId(compId, idPath);
-            
+
+            component.getSpecification().rewireComponentId(compId, idPath, component.getIdPath());
+
             _invoker.addEventListener(idPath, component.getSpecification());
             wireFormEvents(comp, component.getSpecification());
         }
-        
+
         // find form element targets for re-mapping with proper idpath && IEventInvoker connection
 
         events = component.getSpecification().getElementEvents();
@@ -65,7 +70,8 @@
 
         // for efficiency later in ComponentEventConnectionWorker
 
-        if (events.size() > 0 && Component.class.isInstance(component)) {
+        if (events.size() > 0 && Component.class.isInstance(component))
+        {
             ((Component)component).setHasEvents(true);
         }
 
@@ -80,8 +86,8 @@
                 String key = (String) bindingIt.next();
                 List listeners = property.getFormEventListeners(key);
 
-                for (int i=0; i < listeners.size(); i++) {
-                    
+                for (int i=0; i < listeners.size(); i++)
+                {
                     EventBoundListener listener = (EventBoundListener) listeners.get(i);
                     wireElementFormEvents(listener, component, component.getSpecification());
                 }
@@ -115,7 +121,7 @@
                                                   component, component.getLocation(), null);
 
         String idPath = form.getExtendedId();
-        
+
         listener.setFormId(idPath);
         _invoker.addFormEventListener(idPath, spec);
     }
@@ -143,7 +149,7 @@
         Map components = target.getComponents();
         if (components == null)
             return null;
-        
+
         IComponent comp = (IComponent) components.get(id);
         if (comp != null)
             return comp;
@@ -178,8 +184,8 @@
 
     IForm findComponentForm(IFormComponent child)
     {
-        for (int i = 0; i < _forms.size(); i++) {
-
+        for (int i = 0; i < _forms.size(); i++)
+        {
             IForm form = (IForm) _forms.get(i);
 
             IComponent match = findContainedComponent(child.getExtendedId(), (Component)form);
@@ -201,8 +207,8 @@
         if (children == null)
             return null;
 
-        for (int i=0; i < children.length; i++) {
-
+        for (int i=0; i < children.length; i++)
+        {
             if (children[i] == null)
                 return null;
 
@@ -213,18 +219,18 @@
             if (found != null)
                 return found;
         }
-        
+
         return null;
     }
 
     void checkComponentPage(IComponent component)
     {
-        if (_currentPage == null) {
-
+        if (_currentPage == null)
+        {
             _currentPage = component.getPage();
             _forms.clear();
-        } else if (component.getPage() != _currentPage) {
-
+        } else if (component.getPage() != _currentPage)
+        {
             _currentPage = component.getPage();
             _forms.clear();
         }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentEventConnectionWorker.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentEventConnectionWorker.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentEventConnectionWorker.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentEventConnectionWorker.java Wed Jan 30 14:38:23 2008
@@ -101,7 +101,8 @@
 
             DeferredFormConnection that = (DeferredFormConnection) o;
 
-            if (_uniqueHash != null ? !_uniqueHash.equals(that._uniqueHash) : that._uniqueHash != null) return false;
+            if (_uniqueHash != null ? !_uniqueHash.equals(that._uniqueHash) : that._uniqueHash != null)
+                return false;
 
             return true;
         }
@@ -157,8 +158,8 @@
         if (props == null)
             return;
 
-        for (int i=0; i < props.length; i++) {
-
+        for (int i=0; i < props.length; i++)
+        {
             String clientId = component.getClientId();
 
             Map parms = new HashMap();
@@ -172,7 +173,7 @@
                 continue;
 
             DirectEventServiceParameter dsp =
-              new DirectEventServiceParameter((IDirectEvent)component, new Object[] {}, new String[] {}, false);
+                    new DirectEventServiceParameter((IDirectEvent)component, new Object[] {}, new String[] {}, false);
 
             parms.put("url", _eventEngine.getLink(false, dsp).getURL());
             parms.put("events", events);
@@ -191,7 +192,7 @@
             return;
 
         DirectEventServiceParameter dsp =
-          new DirectEventServiceParameter((IDirectEvent)component, new Object[] {}, new String[] {}, false);
+                new DirectEventServiceParameter((IDirectEvent)component, new Object[] {}, new String[] {}, false);
 
         String url = _eventEngine.getLink(false, dsp).getURL();
 
@@ -202,8 +203,8 @@
         Iterator keys = elements.keySet().iterator();
 
         // build our list of targets / events
-        while (keys.hasNext()) {
-
+        while (keys.hasNext())
+        {
             Map parms = new HashMap();
 
             String target = (String)keys.next();
@@ -238,9 +239,9 @@
     {
         List names = (List)cycle.getAttribute(FORM_NAME_LIST + form.getExtendedId());
 
-        if (names == null) {
+        if (names == null)
+        {
             names = new ArrayList();
-
             cycle.setAttribute(FORM_NAME_LIST + form.getExtendedId(), names);
         }
 
@@ -269,8 +270,8 @@
             if (props == null)
                 continue;
 
-            for (int e=0; e < props.length; e++) {
-
+            for (int e=0; e < props.length; e++)
+            {
                 Object[][] formEvents = buildFormEvents(cycle, form.getExtendedId(),
                                                         props[e].getFormEvents(), fConn._async,
                                                         fConn._validate, fConn._uniqueHash);
@@ -412,11 +413,6 @@
                                         listener.isAsync(),
                                         listener.isValidateForm(),
                                         ScriptUtils.functionHash(listener.hashCode() + (String) scriptParms.get("clientId")));
-                    
-                    /*deferFormConnection(formId, scriptParms,
-                                        listener.isAsync(),
-                                        listener.isValidateForm(),
-                                        ScriptUtils.functionHash(listener.hashCode() + (String) scriptParms.get("clientId")));*/
 
                     // re-looping over the same property -> event listener list would
                     // result in duplicate bindings so break out 
@@ -425,10 +421,10 @@
 
                 // form has been rendered so go ahead
                 retval.add(new Object[] {
-                  event, formNames,
-                  Boolean.valueOf(listener.isAsync()),
-                  Boolean.valueOf(listener.isValidateForm()),
-                  ScriptUtils.functionHash(listener)
+                        event, formNames,
+                        Boolean.valueOf(listener.isAsync()),
+                        Boolean.valueOf(listener.isValidateForm()),
+                        ScriptUtils.functionHash(listener)
                 });
             }
         }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/ComponentSpecification.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/ComponentSpecification.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/ComponentSpecification.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/ComponentSpecification.java Wed Jan 30 14:38:23 2008
@@ -736,22 +736,22 @@
         property.connectAutoSubmitEvents(form.getExtendedId());
     }
 
-    public void rewireComponentId(String componentId, String idPath)
+    public void rewireComponentId(String componentId, String extendedId, String idPath)
     {
         ComponentEventProperty prop = getComponentEvents(componentId);
         if (prop == null)
             return;
 
-        if (_componentEvents.containsKey(idPath))
+        if (_componentEvents.containsKey(extendedId))
             return;
 
         try {
 
             ComponentEventProperty clone = (ComponentEventProperty) prop.clone();
 
-            clone.rewireComponentId(idPath);
+            clone.rewireComponentId(extendedId, idPath);
 
-            _componentEvents.put(idPath, clone);
+            _componentEvents.put(extendedId, clone);
 
         } catch (CloneNotSupportedException e) {
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IEventListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IEventListener.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IEventListener.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/spec/IEventListener.java Wed Jan 30 14:38:23 2008
@@ -143,9 +143,11 @@
      * to use the more unique {@link org.apache.tapestry.IComponent#getIdPath()}.
      *
      * @param componentId
-     *          The basic component id.
+     *          The base component id.
+     * @param extendedId
+     *          The id of the component as returned by {@link org.apache.tapestry.IComponent#getExtendedId()}
      * @param idPath
-     *          The id of the component pre-pended with the path of components containing it.
+     *          The id of the component as returned by {@link org.apache.tapestry.IComponent#getIdPath()} 
      */
-    void rewireComponentId(String componentId, String idPath);
+    void rewireComponentId(String componentId, String extendedId, String idPath);
 }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/engine/DirectServiceTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/engine/DirectServiceTest.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/engine/DirectServiceTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/engine/DirectServiceTest.java Wed Jan 30 14:38:23 2008
@@ -32,9 +32,6 @@
 
 /**
  * Tests for {@link org.apache.tapestry.engine.DirectService}.
- * 
- * @author Howard M. Lewis Ship
- * @since 4.0
  */
 @Test
 public class DirectServiceTest extends ServiceTestCase
@@ -55,7 +52,7 @@
         return c;
     }
 
-    public void testGetLinkOnSamePage()
+    public void test_Get_Link_On_Same_Page()
     {
         IPage page = newPage("ThePage");
         IDirect c = newDirect(true);
@@ -93,7 +90,7 @@
         verify();
     }
 
-    public void testGetLinkOnSamePageForPost()
+    public void test_Get_Link_On_Same_Page_For_Post()
     {
         IPage page = newPage("ThePage");
         IDirect c = newDirect(true);
@@ -131,7 +128,7 @@
         verify();
     }
 
-    public void testGetLinkOnSamePageStateful()
+    public void test_Get_Link_On_Same_Page_Stateful()
     {   
         IDirect c = newDirect(true);
         
@@ -170,7 +167,7 @@
         verify();
     }
 
-    public void testGetLinkOnDifferentPage()
+    public void test_Get_Link_On_Different_Page()
     {
         IPage page = newPage("ActivePage");
         IPage componentPage = newPage("ComponentPage");
@@ -208,7 +205,7 @@
         verify();
     }
 
-    public void testServiceSimple() throws Exception
+    public void test_Service_Simple() throws Exception
     {
         Object[] parameters = new Object[0];
         IRequestCycle cycle = newCycle();

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/event/BrowserEventTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/event/BrowserEventTest.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/event/BrowserEventTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/event/BrowserEventTest.java Wed Jan 30 14:38:23 2008
@@ -72,6 +72,7 @@
         expect(cycle.getParameter(BrowserEvent.LAYER_X)).andReturn(null);
         expect(cycle.getParameter(BrowserEvent.LAYER_Y)).andReturn(null);
         expect(cycle.getParameter(BrowserEvent.COMPONENT_ID)).andReturn(null);
+        expect(cycle.getParameter(BrowserEvent.COMPONENT_ID_PATH)).andReturn(null);
         
         expect(cycle.getParameter(BrowserEvent.TARGET + "." + BrowserEvent.TARGET_ATTR_ID)).andReturn("element1");
     }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/ComponentEventPropertyTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/ComponentEventPropertyTest.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/ComponentEventPropertyTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/ComponentEventPropertyTest.java Wed Jan 30 14:38:23 2008
@@ -196,7 +196,8 @@
         assertEquals(prop.getFormEvents().size(), 1);
         
         String path = "new/Path/Id";
-        prop.rewireComponentId(path);
+        String idPath = "Home/" + path;
+        prop.rewireComponentId(path, idPath);
 
         assertEquals(prop.getComponentId(), path);
 
@@ -211,6 +212,7 @@
 
                 EventBoundListener listener = (EventBoundListener) listeners.get(i);
                 assertEquals(listener.getComponentId(), path);
+                assertEquals(listener.getComponentIdPath(), idPath);
             }
         }
 
@@ -224,6 +226,7 @@
 
                 EventBoundListener listener = (EventBoundListener) listeners.get(i);
                 assertEquals(listener.getComponentId(), path);
+                assertEquals(listener.getComponentIdPath(), idPath);
             }
         }
     }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/impl/ComponentEventInvokerTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/impl/ComponentEventInvokerTest.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/impl/ComponentEventInvokerTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/internal/event/impl/ComponentEventInvokerTest.java Wed Jan 30 14:38:23 2008
@@ -32,43 +32,43 @@
 
 /**
  * Tests functionality of {@link ComponentEventInvoker}.
- * 
+ *
  * @author jkuhnert
  */
 @Test
 public class ComponentEventInvokerTest extends BaseComponentTestCase
 {
-    
+
     public void test_Event_Properties()
     {
         IComponentSpecification spec = new ComponentSpecification();
         spec.addEventListener("comp1", new String[] {"onClick"}, "testFoo", null, false, false, false, false);
-        
+
         assert spec.getComponentEvents("comp1") != null;
         assert spec.getComponentEvents("comp1").getEvents().size() == 1;
-        
+
         ComponentEventProperty prop = spec.getComponentEvents("comp1");
         assertNotNull(prop);
         assertEquals(prop.getEventListeners("onClick").size(), 1);
-        
+
         prop = spec.getComponentEvents("comp2");
         assert prop == null;
     }
-    
+
     public void test_Form_Event_Properties()
     {
         IComponentSpecification spec = new ComponentSpecification();
         spec.addEventListener("comp1", new String[] {"onClick"}, "testFoo", "form", false, true, false, false);
         spec.addEventListener("comp1", new String[] {"onClick"}, "testBar", "form", false, true, false, false);
-        
+
         assert spec.getComponentEvents("comp1") != null;
-        
+
         ComponentEventProperty p = spec.getComponentEvents("comp1");
-        
+
         // should be only form events bound
         assertEquals(p.getEvents().size(), 0);
         assertEquals(p.getEventListeners("onClick").size(), 0);
-        
+
         assertEquals(p.getComponentId(), "comp1");
         assertEquals(p.getFormEventListeners("onClick").size(), 2);
         assertEquals(p.getFormEvents().size(), 1);
@@ -105,90 +105,84 @@
         IRequestCycle cycle = newCycle();
         IComponent comp = newComponent();
         checkOrder(comp, false);
-        
+
         IPage page = newMock(IPage.class);
         ListenerInvoker listenerInvoker = newMock(ListenerInvoker.class);
         ListenerMap listenerMap = newMock(ListenerMap.class);
         IActionListener listener1 = newMock(IActionListener.class);
 
         IComponentSpecification spec = new ComponentSpecification();
-        
-        Map comps = new HashMap();
-        comps.put("testId", comp);
-        
+
         Map tprops = new HashMap();
         tprops.put("id", "testId");
         BrowserEvent event = new BrowserEvent("onSelect", new EventTarget(tprops));
-        
+
         ComponentEventInvoker invoker = new ComponentEventInvoker();
         invoker.setInvoker(listenerInvoker);
-        
-        spec.addEventListener("testId", new String[] { "onSelect" }, 
-                "fooListener", null, false, false, false, false);
+
+        spec.addEventListener("testId", new String[] { "onSelect" },
+                              "fooListener", null, false, false, false, false);
         invoker.addEventListener("testId", spec);
 
         expect(comp.getExtendedId()).andReturn("testId").anyTimes();
         expect(comp.getSpecification()).andReturn(spec).anyTimes();
         expect(comp.getPage()).andReturn(page);
 
-        expect(page.getComponents()).andReturn(comps);
+        expect(page.getNestedComponent(null)).andReturn(comp);
         expect(comp.getListeners()).andReturn(listenerMap);
-        
+
         expect(listenerMap.getListener("fooListener")).andReturn(listener1);
-        
+
         listenerInvoker.invokeListener(listener1, comp, cycle);
-        
+
         replay();
-        
+
         invoker.invokeListeners(comp, cycle, event);
-        
+
         verify();
     }
-    
+
     public void test_Invoke_Element_Listener()
     {
         IRequestCycle cycle = newCycle();
         IComponent comp = newComponent();
         checkOrder(comp, false);
-        
+
         IPage page = newMock(IPage.class);
         IComponentSpecification spec = new ComponentSpecification();
-        
+
         ListenerInvoker listenerInvoker = newMock(ListenerInvoker.class);
         ListenerMap listenerMap = newMock(ListenerMap.class);
         IActionListener listener = newMock(IActionListener.class);
-        
-        Map comps = new HashMap();
-        comps.put("testId", comp);
-        
+
         Map tprops = new HashMap();
         tprops.put("id", "testId");
         BrowserEvent event = new BrowserEvent("onSelect", new EventTarget(tprops));
-        
+
         ComponentEventInvoker invoker = new ComponentEventInvoker();
         invoker.setInvoker(listenerInvoker);
-        
-        spec.addElementEventListener("testId", new String[] { "onSelect" }, 
-                "fooListener", null, false, true, true);
+
+        spec.addElementEventListener("testId", new String[] { "onSelect" },
+                                     "fooListener", null, false, true, true);
         invoker.addEventListener("testId", spec);
-        
+
         expect(comp.getExtendedId()).andReturn("testId").anyTimes();
         expect(comp.getSpecification()).andReturn(spec).anyTimes();
         expect(comp.getPage()).andReturn(page);
-        expect(page.getComponents()).andReturn(comps);
+
         expect(comp.getListeners()).andReturn(listenerMap);
-        
+
         expect(listenerMap.getListener("fooListener")).andReturn(listener);
-        
+
         listenerInvoker.invokeListener(listener, comp, cycle);
-        
+
         replay();
-        
+
         invoker.invokeListeners(comp, cycle, event);
-        
+
         verify();
     }
-    
+
     public void test_Invoke_Form_Listener()
     {
         IRequestCycle cycle = newCycle();
@@ -202,48 +196,42 @@
         IActionListener listener = newMock(IActionListener.class);
         IPage page = newMock(IPage.class);
         checkOrder(page, false);
-        
-        Map comps = new HashMap();
-        comps.put("form1", form);
-        
+
         Map tprops = new HashMap();
         tprops.put("id", "form1");
-        BrowserEvent event = new BrowserEvent("onSelect", "form1", new EventTarget(tprops));
-        
+        BrowserEvent event = new BrowserEvent("onSelect", "form1", "form1", new EventTarget(tprops));
+
         ComponentEventInvoker invoker = new ComponentEventInvoker();
         invoker.setInvoker(listenerInvoker);
-        
+
         spec.addEventListener("form1", new String[] { "onSelect" }, "fooListener",
-                "form1", false, false, false, false);
+                              "form1", false, false, false, false);
         invoker.addFormEventListener("form1", spec);
-        
+
         expect(formSupport.getForm()).andReturn(form);
         expect(form.getExtendedId()).andReturn("form1").anyTimes();
-        expect(form.getPage()).andReturn(page);
 
-        expect(page.getComponents()).andReturn(comps);
-        
-        expect(form.getSpecification()).andReturn(spec);
+        expect(form.getPage()).andReturn(page);
+        expect(page.getNestedComponent(null)).andReturn(form);        
         expect(form.getDelegate()).andReturn(delegate).anyTimes();
 
         delegate.clearErrors();
         expectLastCall().anyTimes();
 
         expect(form.getListeners()).andReturn(listenerMap);
-        
         expect(listenerMap.getListener("fooListener")).andReturn(listener);
-        
+
         form.addDeferredRunnable(isA(Runnable.class));
-        
+
         cycle.disableFocus();
-        
+
         replay();
-        
+
         invoker.invokeFormListeners(formSupport, cycle, event);
-        
+
         verify();
     }
-    
+
     public void test_Invoke_Form_Listener_Enabled_Focus()
     {
         IRequestCycle cycle = newCycle();
@@ -252,49 +240,48 @@
         FormSupport formSupport = newMock(FormSupport.class);
         IComponentSpecification spec = new ComponentSpecification();
         IValidationDelegate delegate = newMock(IValidationDelegate.class);
-        
+
         ListenerInvoker listenerInvoker = newMock(ListenerInvoker.class);
         ListenerMap listenerMap = newMock(ListenerMap.class);
         IActionListener listener = newMock(IActionListener.class);
         IPage page = newMock(IPage.class);
         checkOrder(page, false);
-        
+
         Map comps = new HashMap();
         comps.put("form1", form);
-        
+
         Map tprops = new HashMap();
         tprops.put("id", "form1");
-        BrowserEvent event = new BrowserEvent("onSelect", "form1", new EventTarget(tprops));
-        
+        BrowserEvent event = new BrowserEvent("onSelect", "form1", "form1", new EventTarget(tprops));
+
         ComponentEventInvoker invoker = new ComponentEventInvoker();
         invoker.setInvoker(listenerInvoker);
-        
+
         spec.addEventListener("form1", new String[] { "onSelect" }, "fooListener",
-                "form1", false, false, true, false);
+                              "form1", false, false, true, false);
         invoker.addFormEventListener("form1", spec);
-        
+
         expect(formSupport.getForm()).andReturn(form);
         expect(form.getExtendedId()).andReturn("form1").anyTimes();
+
         expect(form.getPage()).andReturn(page);
+        expect(page.getNestedComponent(null)).andReturn(form);
         
-        expect(page.getComponents()).andReturn(comps);
-        
-        expect(form.getSpecification()).andReturn(spec);
         expect(form.getDelegate()).andReturn(delegate).anyTimes();
 
         delegate.clearErrors();
         expectLastCall().anyTimes();
 
         expect(form.getListeners()).andReturn(listenerMap);
-        
+
         expect(listenerMap.getListener("fooListener")).andReturn(listener);
-        
+
         form.addDeferredRunnable(isA(Runnable.class));
-        
+
         replay();
-        
+
         invoker.invokeFormListeners(formSupport, cycle, event);
-        
+
         verify();
     }
 }

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/pageload/TestEventConnectionVisitor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/pageload/TestEventConnectionVisitor.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/pageload/TestEventConnectionVisitor.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/pageload/TestEventConnectionVisitor.java Wed Jan 30 14:38:23 2008
@@ -27,7 +27,7 @@
         IComponentSpecification spec = new ComponentSpecification();
         spec.addEventListener("comp1", new String[] {"onClick"}, "testFoo", null, false, false, false, false);
 
-        IComponent comp = newComponent(spec, "comp1", "path/");
+        IComponent comp = newComponent(spec, "comp1", "path/", "Home/");
         IComponentEventInvoker invoker = newMock(IComponentEventInvoker.class);
 
         invoker.addEventListener("path/comp1", spec);
@@ -81,7 +81,7 @@
     {
         IComponentSpecification spec = newMock(IComponentSpecification.class);
         IComponentEventInvoker invoker = newMock(IComponentEventInvoker.class);
-        IComponent comp = newComponent(spec, "comp1", "path/");
+        IComponent comp = newComponent(spec, "comp1", "path/", "Home/");
 
         ComponentEventProperty p = new ComponentEventProperty("comp1");
         p.addListener(new String[] {"onClick"}, "testFoo", null, false, false, false, false);
@@ -93,7 +93,7 @@
         expect(spec.getElementEvents()).andReturn(Collections.EMPTY_MAP);
 
         invoker.addEventListener("path/comp1", spec);
-        spec.rewireComponentId("comp1", "path/comp1");
+        spec.rewireComponentId("comp1", "path/comp1", "Home/path/comp1");
 
         replay();
 
@@ -118,9 +118,14 @@
         expect(page.getComponents()).andReturn(comps).anyTimes();
         expect(comp.getComponents()).andReturn(null).anyTimes();
 
-        if (args.length > 0) {
-            
+        if (args.length > 0)
+        {    
             expect(comp.getExtendedId()).andReturn(args[0] + findCompId).anyTimes();
+        }
+
+        if (args.length > 1)
+        {
+            expect(comp.getIdPath()).andReturn((String)args[1] + (String)args[0] + findCompId).anyTimes();
         }
 
         return comp;

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/spec/TestComponentSpecification.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/spec/TestComponentSpecification.java?rev=616930&r1=616929&r2=616930&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/spec/TestComponentSpecification.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/spec/TestComponentSpecification.java Wed Jan 30 14:38:23 2008
@@ -230,12 +230,12 @@
         assertEquals(cs.getComponentEvents().size(), 1);
         assert cs.getComponentEvents("comp") != null;
 
-        cs.rewireComponentId("unknown", "new/path");
+        cs.rewireComponentId("unknown", "new/path", "id/path");
 
         assertEquals(cs.getComponentEvents().size(), 1);
 
-        cs.rewireComponentId("comp", "page/comp");
-        cs.rewireComponentId("comp", "page/comp");
+        cs.rewireComponentId("comp", "page/comp", "id/path");
+        cs.rewireComponentId("comp", "page/comp", "id/path");
 
         assertEquals(cs.getComponentEvents().size(), 2);
         assert cs.getComponentEvents("comp") != null;