Author: jkuhnert
Date: Tue May  1 06:48:46 2007
New Revision: 534087

URL: http://svn.apache.org/viewvc?view=rev&rev=534087
Log:
There was a bug in the event connection visitor where it wouldn't take into 
account that multiple pages may be loaded in a single threaded service run and 
so incorrectly thought all forms had been found for a particular page when they 
were actually just the last pages forms. 

Also fixed bug where RenderBody wasn't able to correctly be iterated over for 
containing components because of the special relationship between it and 
BaseComponent.

Modified:
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractComponent.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/BaseComponent.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/components/RenderBody.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/Component.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/pageload/EventConnectionVisitor.java
    
tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/pageload/TestEventConnectionVisitor.java

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractComponent.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractComponent.java?view=diff&rev=534087&r1=534086&r2=534087
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractComponent.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractComponent.java
 Tue May  1 06:48:46 2007
@@ -94,13 +94,13 @@
      * The number of [EMAIL PROTECTED] IRender}objects in the body of this 
component.
      */
 
-    private int _bodyCount = 0;
+    protected int _bodyCount = 0;
 
     /**
      * An aray of elements in the body of this component.
      */
 
-    private IRender[] _body;
+    protected IRender[] _body;
 
     /**
      * The components' asset map.
@@ -210,18 +210,18 @@
 
         _body[_bodyCount++] = element;
     }
+
     
-    /**
-     * Returns the list of of [EMAIL PROTECTED] IRender} elements contained by 
this component. Ie whatever
-     * has been added via [EMAIL PROTECTED] #addBody(IRender)}.
-     * 
-     * @return The values, if any. Null otherwise.
-     */
     public IRender[] getContainedRenderers()
     {
         return _body;
     }
-    
+
+    public IRender[] getInnerRenderers()
+    {
+        return null;
+    }
+
     /**
      * Invokes [EMAIL PROTECTED] #finishLoad()}. Subclasses may overide as 
needed, but must invoke this
      * implementation. [EMAIL PROTECTED] BaseComponent} loads its HTML 
template.

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/BaseComponent.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/BaseComponent.java?view=diff&rev=534087&r1=534086&r2=534087
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/BaseComponent.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/BaseComponent.java
 Tue May  1 06:48:46 2007
@@ -72,9 +72,19 @@
     {
         return _outer;
     }
+    
+    public IRender[] getInnerRenderers()
+    {
+        return _body;
+    }
 
     /**
      * Reads the receiver's template and figures out which elements wrap which 
other elements.
+     *
+     * @param cycle
+     *          The current request.
+     * @param loader
+     *          The service responsible for loading / resolving a page spec.
      */
 
     private void readTemplate(IRequestCycle cycle, IPageLoader loader)

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/components/RenderBody.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/components/RenderBody.java?view=diff&rev=534087&r1=534086&r2=534087
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/components/RenderBody.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/components/RenderBody.java
 Tue May  1 06:48:46 2007
@@ -14,10 +14,8 @@
 
 package org.apache.tapestry.components;
 
-import org.apache.tapestry.AbstractComponent;
-import org.apache.tapestry.IComponent;
-import org.apache.tapestry.IMarkupWriter;
-import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.*;
+import org.apache.tapestry.internal.Component;
 
 /**
  * Renders the text and components wrapped by a component. [<a
@@ -39,5 +37,12 @@
         IComponent container = getContainer();
 
         container.renderBody(writer, cycle);
+    }
+
+    public IRender[] getContainedRenderers()
+    {
+        Component container = (Component) getContainer();
+
+        return container.getInnerRenderers();
     }
 }

Modified: 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/Component.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/Component.java?view=diff&rev=534087&r1=534086&r2=534087
==============================================================================
--- 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/Component.java
 (original)
+++ 
tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/internal/Component.java
 Tue May  1 06:48:46 2007
@@ -20,5 +20,12 @@
      */
     IRender[] getContainedRenderers();
 
-    
+    /**
+     * In some rare cases a component has both outer and inner renderers - 
such as with [EMAIL PROTECTED] org.apache.tapestry.BaseComponent}. This
+     * value should return the normal inner renderers most components do in 
those instances while the other
+     * [EMAIL PROTECTED] #getContainedRenderers()} should return the outer 
renderers.
+     * 
+     * @return The inner renderers if this component supports more than one 
type, null otherwise.
+     */
+    IRender[] getInnerRenderers();
 }

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?view=diff&rev=534087&r1=534086&r2=534087
==============================================================================
--- 
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
 Tue May  1 06:48:46 2007
@@ -4,6 +4,7 @@
 import org.apache.hivemind.PoolManageable;
 import org.apache.tapestry.IComponent;
 import org.apache.tapestry.IForm;
+import org.apache.tapestry.IPage;
 import org.apache.tapestry.IRender;
 import org.apache.tapestry.form.IFormComponent;
 import org.apache.tapestry.internal.Component;
@@ -24,6 +25,7 @@
 
     IComponentEventInvoker _invoker;
 
+    IPage _currentPage = null;
     List _forms = new ArrayList();
 
     public void visitComponent(IComponent component)
@@ -31,6 +33,8 @@
         if (component.getSpecification().getTargetsResolved())
             return;
 
+        checkComponentPage(component);
+        
         Map events = component.getSpecification().getComponentEvents();
         Iterator it = events.keySet().iterator();
 
@@ -223,12 +227,28 @@
         return null;
     }
 
+    void checkComponentPage(IComponent component)
+    {
+        if (_currentPage == null) {
+
+            _currentPage = component.getPage();
+            _forms.clear();
+        } else if (component.getPage() != _currentPage) {
+
+            _currentPage = component.getPage();
+            _forms.clear();
+        }
+    }
+
     public void activateService()
     {
+        _currentPage = null;
+        _forms.clear();
     }
 
     public void passivateService()
     {
+        _currentPage = null;
         _forms.clear();
     }
 

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?view=diff&rev=534087&r1=534086&r2=534087
==============================================================================
--- 
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
 Tue May  1 06:48:46 2007
@@ -106,14 +106,12 @@
         verify();
     }
 
-    
-
     IComponent newComponent(IComponentSpecification spec, String findCompId, 
Object... args)
     {
         IComponent comp = newComponent(spec);
         IPage page = newMock(IPage.class);
 
-        expect(comp.getPage()).andReturn(page);
+        expect(comp.getPage()).andReturn(page).anyTimes();
 
         Map comps = new HashMap();
         comps.put(findCompId, comp);


Reply via email to