You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by jk...@apache.org on 2006/08/13 05:25:49 UTC

svn commit: r431140 [1/2] - in /tapestry/tapestry4/trunk: tapestry-examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/ tapestry-framework/src/java/org/apache/tapestry/ tapestry-framework/src/java/org/apache/tapestry/engine/ tapestry-fra...

Author: jkuhnert
Date: Sat Aug 12 20:25:47 2006
New Revision: 431140

URL: http://svn.apache.org/viewvc?rev=431140&view=rev
Log:
Implemented IRequestCycle component stacks to support handling parent/child relationships (as much as makes
sense with components at least) in a better way than the previous property method. 

Modified:
    tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractComponent.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractPage.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IComponent.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IPage.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IRequestCycle.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/RequestCycle.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderLogic.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/valid/FieldLabel.java
    tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestAny.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestConditional.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestIfElse.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInsert.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInvokeListener.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestRenderBlock.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestCheckbox.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextArea.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextField.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestInsertText.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestRelation.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestShell.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/services/impl/DojoAjaxResponseBuilderTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/valid/FieldLabelTest.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/valid/TestValidField.java

Modified: tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java (original)
+++ tapestry/tapestry4/trunk/tapestry-examples/TimeTracker/src/java/org/apache/tapestry/timetracker/page/TaskEntryPage.java Sat Aug 12 20:25:47 2006
@@ -43,7 +43,7 @@
 public abstract class TaskEntryPage extends BasePage
 {
     
-    @Component(bindings = { "model=projectModel", "value=selectedProject",
+    @Component(id = "projectChoose", bindings = { "model=projectModel", "value=selectedProject",
             "displayName=message:choose.project", "filterOnChange=true",
             "validators=validators:required"})
     public abstract Autocompleter getProjectChoose();

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?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- 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 Sat Aug 12 20:25:47 2006
@@ -149,8 +149,6 @@
 
     private IContainedComponent _containedComponent;
     
-    /** @since 4.1 */
-    private IComponent _parent;
     
     public void addAsset(String name, IAsset asset)
     {
@@ -173,7 +171,7 @@
 
         if (_components == null)
             _components = new HashMap(MAP_SIZE);
-
+        
         _components.put(component.getId(), component);
     }
 
@@ -188,12 +186,6 @@
     {
         Defense.notNull(element, "element");
         
-        // Check to set parent/child relationships on components where the container
-        // logic doesn't always make sense.
-        
-        if (IComponent.class.isAssignableFrom(element.getClass()))
-            ((IComponent)element).setParent(this);
-        
         // Should check the specification to see if this component
         // allows body. Curently, this is checked by the component
         // in render(), which is silly.
@@ -222,16 +214,6 @@
 
         _body[_bodyCount++] = element;
     }
-
-    public IComponent getParent()
-    {
-        return _parent;
-    }
-    
-    public void setParent(IComponent parent)
-    {
-        _parent = parent;
-    }
     
     /**
      * Invokes {@link #finishLoad()}. Subclasses may overide as needed, but must invoke this
@@ -415,7 +397,7 @@
     {
         if (_page == null)
             return null;
-
+        
         return _page.getPageName() + "/" + getIdPath();
     }
 
@@ -432,17 +414,17 @@
 
         _id = value;
     }
-
+    
     public String getIdPath()
     {
         String containerIdPath;
-
+        
         if (_container == null)
             throw new NullPointerException(Tapestry
                     .format("AbstractComponent.null-container", this));
-
+        
         containerIdPath = _container.getIdPath();
-
+        
         if (containerIdPath == null)
             _idPath = _id;
         else
@@ -525,7 +507,7 @@
     public String toString()
     {
         StringBuffer buffer;
-
+        
         buffer = new StringBuffer(super.toString());
 
         buffer.append('[');
@@ -682,6 +664,8 @@
         {
             _rendering = true;
             
+            cycle.renderStackPush(this);
+            
             prepareForRender(cycle);
             
             renderComponent(writer, cycle);
@@ -697,6 +681,8 @@
             
             // @since 4.1
             _clientId = null;
+            
+            cycle.renderStackPop();
         }
     }
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractPage.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractPage.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractPage.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/AbstractPage.java Sat Aug 12 20:25:47 2006
@@ -242,8 +242,6 @@
         {
             firePageBeginRender();
             
-            beginResponse(cycle.isRewinding() ? NullWriter.getSharedInstance() : builder.getWriter(), cycle);
-            
             if (!cycle.isRewinding())
                 cycle.commitPageChanges();
             
@@ -280,16 +278,6 @@
         Tapestry.addMethodInvocation(Tapestry.ABSTRACTPAGE_VALIDATE_METHOD_ID);
 
         firePageValidate();
-    }
-
-    /**
-     * Does nothing, subclasses may override as needed.
-     * 
-     * @deprecated To be removed in 4.0. Implement {@link PageRenderListener}instead.
-     */
-
-    public void beginResponse(IMarkupWriter writer, IRequestCycle cycle)
-    {
     }
 
     public IRequestCycle getRequestCycle()

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IComponent.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IComponent.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IComponent.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IComponent.java Sat Aug 12 20:25:47 2006
@@ -66,20 +66,6 @@
     void addBody(IRender element);
     
     /**
-     * When {@link IComponent} instances are added to a {@link IComponent}s body, this method
-     * should be called to tell the instance who encloses them.
-     * 
-     * @param parent The component that contains this instance as a body element.
-     */
-    void setParent(IComponent parent);
-    
-    /**
-     * If this instance has a containing parent returns that instance.
-     * @return The containing parent, if any.
-     */
-    IComponent getParent();
-    
-    /**
      * Returns the asset map for the component, which may be empty but will not be null.
      * <p>
      * The return value is unmodifiable.

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=431140&r1=431139&r2=431140&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 Sat Aug 12 20:25:47 2006
@@ -195,19 +195,6 @@
     ContentType getResponseContentType();
 
     /**
-     * Invoked just before rendering of the page is initiated. This gives the page a chance to
-     * perform any additional setup. One possible behavior is to set HTTP headers and cookies before
-     * any output is generated.
-     * <p>
-     * The timing of this explicitly <em>before</em>
-     * {@link org.apache.tapestry.engine.IPageRecorder page recorder}changes are committed.
-     * Rendering occurs <em>after</em> the recorders are committed, when it is too late to make
-     * changes to dynamic page properties.
-     */
-
-    void beginResponse(IMarkupWriter writer, IRequestCycle cycle);
-
-    /**
      * Returns the current {@link IRequestCycle}. This is set when the page is loaded (or obtained
      * from the pool) and attached to the {@link IEngine engine}.
      */

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IRequestCycle.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IRequestCycle.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IRequestCycle.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/IRequestCycle.java Sat Aug 12 20:25:47 2006
@@ -140,6 +140,51 @@
     ResponseBuilder getResponseBuilder();
     
     /**
+     * Tests if the render component chain is empty, meaning no components have
+     * been loaded onto the stack yet.
+     * 
+     * @return True, if the current stack is empty.
+     */
+    boolean renderStackEmpty();
+    
+    /**
+     * Looks at the object at the top of the render stack without removing 
+     * the {@link IRender} from the stack.
+     * 
+     * @return The last (parent) item added to the current render stack.
+     */
+    IRender renderStackPeek();
+    
+    /**
+     * Removes the {@link IRender} at the top of the stack, if any.
+     * 
+     * @return The removed {@link IRender}, if any.
+     */
+    IRender renderStackPop();
+    
+    /**
+     * Pushes the specified render onto the current render stack.
+     * 
+     * @param render The {@link IRender} object being pushed.
+     * @return The added {@link IRender}.
+     */
+    IRender renderStackPush(IRender render);
+    
+    /**
+     * Returns the 1-based position where an object is on this stack. If the object 
+     * o occurs as an item in this stack, this method returns the distance from the 
+     * top of the stack of the occurrence nearest the top of the stack; the topmost 
+     * item on the stack is considered to be at distance 1. The equals method is used 
+     * to compare o to the items in this stack.
+     * 
+     * @param render The {@link IRender} being searched for.
+     * 
+     * @return the 1-based position from the top of the stack where the object is 
+     *          located; the return value -1  indicates that the object is not on the stack.
+     */
+    int renderStackSearch(IRender render);
+    
+    /**
      * Removes a previously stored attribute, if one with the given name exists.
      */
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/RequestCycle.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/RequestCycle.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/RequestCycle.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/engine/RequestCycle.java Sat Aug 12 20:25:47 2006
@@ -17,6 +17,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Stack;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -29,6 +30,7 @@
 import org.apache.tapestry.IEngine;
 import org.apache.tapestry.IForm;
 import org.apache.tapestry.IPage;
+import org.apache.tapestry.IRender;
 import org.apache.tapestry.IRequestCycle;
 import org.apache.tapestry.RedirectException;
 import org.apache.tapestry.RenderRewoundException;
@@ -120,6 +122,8 @@
 
     private IdAllocator _idAllocator = new IdAllocator();
 
+    private Stack _renderStack = new Stack();
+    
     /**
      * Standard constructor used to render a response page.
      * 
@@ -182,7 +186,8 @@
 
         _loadedPages = null;
         _pageRecorders = null;
-
+        _renderStack.clear();
+        
     }
 
     public IEngineService getService()
@@ -283,8 +288,10 @@
     
     public void setResponseBuilder(ResponseBuilder builder)
     {
+        // TODO: What scenerio requires setting the builder after the fact?
         //if (_responseBuilder != null)
           //  throw new IllegalArgumentException("A ResponseBuilder has already been set on this response.");
+        
         _responseBuilder = builder;
     }
     
@@ -293,6 +300,55 @@
         return _responseBuilder;
     }
     
+    /** 
+     * {@inheritDoc}
+     */
+    public boolean renderStackEmpty()
+    {
+        return _renderStack.isEmpty();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public IRender renderStackPeek()
+    {
+        if (_renderStack.size() < 1)
+            return null;
+        
+        return (IRender)_renderStack.peek();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public IRender renderStackPop()
+    {
+        if (_renderStack.size() == 0)
+            return null;
+        
+        return (IRender)_renderStack.pop();
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public IRender renderStackPush(IRender render)
+    {
+        if (_renderStack.size() > 0 && _renderStack.peek() == render)
+            return render;
+        
+        return (IRender)_renderStack.push(render);
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
+    public int renderStackSearch(IRender render)
+    {
+        return _renderStack.search(render);
+    }
+
     public boolean isRewinding()
     {
         return _rewinding;
@@ -336,7 +392,7 @@
         try
         {
             _page.renderPage(builder, this);
-
+            
         }
         catch (ApplicationRuntimeException ex)
         {

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderLogic.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderLogic.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderLogic.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/ComponentTemplateLoaderLogic.java Sat Aug 12 20:25:47 2006
@@ -153,7 +153,7 @@
 
         if (!_activeComponent.getSpecification().getAllowBody())
             throw createBodylessComponentException(_activeComponent);
-
+        
         _activeComponent.addBody(token);
     }
 
@@ -190,7 +190,7 @@
 
             if (!_activeComponent.getSpecification().getAllowBody())
                 throw createBodylessComponentException(_activeComponent);
-
+            
             _activeComponent.addBody(component);
         }
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseBuilder.java Sat Aug 12 20:25:47 2006
@@ -63,6 +63,8 @@
     // Map of specialized writers, like scripts
     private Map _writers = new HashMap();
     
+    private IRequestCycle _cycle;
+    
     /**
      * Creates a builder with a pre-configured {@link IMarkupWriter}. 
      * Currently only used for testing.
@@ -73,10 +75,16 @@
      *          A set of string ids of the components that may have 
      *          their responses rendered.
      */
-    public DojoAjaxResponseBuilder(IMarkupWriter writer, List parts)
+    public DojoAjaxResponseBuilder(IRequestCycle cycle, IMarkupWriter writer, List parts)
     {
+        Defense.notNull(cycle, "cycle");
+        Defense.notNull(writer, "writer");
+        
         _writer = writer;
-        if (parts != null) _parts.addAll(parts);
+        _cycle = cycle;
+        
+        if (parts != null) 
+            _parts.addAll(parts);
     }
     
     /**
@@ -90,10 +98,14 @@
      * @param webResponse
      *          Web response for output stream.
      */
-    public DojoAjaxResponseBuilder(RequestLocaleManager localeManager, 
+    public DojoAjaxResponseBuilder(IRequestCycle cycle, 
+            RequestLocaleManager localeManager, 
             MarkupWriterSource markupWriterSource,
             WebResponse webResponse, List errorPages)
     {
+        Defense.notNull(cycle, "cycle");
+        
+        _cycle = cycle;
         _localeManager = localeManager;
         _markupWriterSource = markupWriterSource;
         _webResponse = webResponse;
@@ -470,9 +482,9 @@
         if (_parts.contains(id))
             return true;
         
-        IComponent parent = target.getParent();
+        IComponent parent = (IComponent)_cycle.renderStackPeek();
         
-        if (parent != null)
+        if (parent != null && parent != target)
             return contains(parent);
         
         return false;

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DojoAjaxResponseContributorImpl.java Sat Aug 12 20:25:47 2006
@@ -60,7 +60,8 @@
         errorPages.add(_staleSessionPageName);
         errorPages.add(_staleLinkPageName);
         
-        return new DojoAjaxResponseBuilder(_localeManager, _markupWriterSource,
+        return new DojoAjaxResponseBuilder(cycle, _localeManager, 
+                _markupWriterSource,
                 _webResponse, errorPages);
     }
     

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/valid/FieldLabel.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/valid/FieldLabel.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/valid/FieldLabel.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/valid/FieldLabel.java Sat Aug 12 20:25:47 2006
@@ -62,9 +62,9 @@
         {
             if (field == null)
                 throw Tapestry.createRequiredParameterException(this, "field");
-
+            
             displayName = field.getDisplayName();
-
+            
             if (displayName == null)
                 throw new BindingException(ValidMessages.noDisplayName(this,
                         field), this, null, getBinding("field"), null);
@@ -73,16 +73,16 @@
         IValidationDelegate delegate = form.getDelegate();
 
         String id = field == null ? null : field.getClientId();
-
+        
         delegate.writeLabelPrefix(field, writer, cycle);
-
+        
         writer.begin("label");
 
         if (id != null) writer.attribute("for", id);
-
+        
         delegate.writeLabelAttributes(writer, cycle, field);
         renderInformalParameters(writer, cycle);
-
+        
         writer.print(displayName, getRaw());
 
         writer.end();

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/js/tapestry/form.js Sat Aug 12 20:25:47 2006
@@ -122,7 +122,7 @@
 			
 			dojo.event.connect(form, "onsubmit", this, "onFormSubmit");
 		} else {
-			dojo.log.warn("egisterForm(" + id + ") Form already registered.");
+			dojo.log.warn("registerForm(" + id + ") Form already registered.");
 		}
 	},
 	
@@ -177,6 +177,7 @@
 	 * 				   not specified assumes true.
 	 */
 	setFormValidating:function(formId, validate){
+		dojo.log.warn("setFormValidating called with value " + validate);
 		if (this.forms[formId]){
 			this.forms[formId].validateForm = validate ? true : false;
 		}
@@ -193,10 +194,13 @@
 		}
 		
 		var id=evt.target.getAttribute("id");
-		if (!id) return;
+		if (!id) {
+			dojo.log.warn("Form had no id attribute.");
+			return;
+		}
 		
 		var form = dojo.byId(id);
-		if (form.submitmode.value 
+		if (!dj_undef("value", form.submitmode)
 			&& (form.submitmode.value == "cancel" || form.submitmode.value == "refresh")) {
 			return;
 		}

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestAny.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestAny.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestAny.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestAny.java Sat Aug 12 20:25:47 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.components;
 
+import static org.easymock.EasyMock.expect;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertSame;
 
@@ -43,9 +44,13 @@
         IRequestCycle cycle = newMock(IRequestCycle.class);
         Location l = newLocation();
         
-        replay();
-        
         Any any = newInstance(Any.class, new Object[] { "location", l });
+        
+        expect(cycle.renderStackPush(any)).andReturn(any);
+        
+        expect(cycle.renderStackPop()).andReturn(any);
+        
+        replay();
 
         try
         {
@@ -67,18 +72,22 @@
         IMarkupWriter writer = newWriter();
         IRequestCycle cycle = newCycle(false, writer);
         
+        Any any = newInstance(Any.class,
+                new Object[] { "element", "span" });
+        
+        expect(cycle.renderStackPush(any)).andReturn(any);
+        
         writer.begin("span");
         
         IRender body = newRender();
         body.render(writer, cycle);
 
         writer.end("span");
-
+        
+        expect(cycle.renderStackPop()).andReturn(any);
+        
         replay();
-
-        Any any = newInstance(Any.class,
-                new Object[] { "element", "span" });
-
+        
         any.addBody(body);
 
         any.render(writer, cycle);
@@ -92,19 +101,23 @@
         IRequestCycle cycle = newCycle(false, writer);
         IRender body = newRender();
         IBinding binding = newBinding("fred");
-
+        
+        Any any = newInstance(Any.class, new Object[] { "element",
+            "span", "specification", new ComponentSpecification() });
+        
+        expect(cycle.renderStackPush(any)).andReturn(any);
+        
         writer.begin("span");
         writer.attribute("class", "fred");
 
         body.render(writer, cycle);
 
         writer.end("span");
-
+        
+        expect(cycle.renderStackPop()).andReturn(any);
+        
         replay();
 
-        Any any = newInstance(Any.class, new Object[] { "element",
-                "span", "specification", new ComponentSpecification() });
-
         any.addBody(body);
         any.setBinding("class", binding);
 
@@ -118,13 +131,17 @@
         IMarkupWriter writer = newWriter();
         IRequestCycle cycle = newCycle(true, writer);
         IRender body = newRender();
-
-        body.render(writer, cycle);
-
-        replay();
-
+        
         Any any = newInstance(Any.class,
                 new Object[] { "element", "span" });
+        
+        expect(cycle.renderStackPush(any)).andReturn(any);
+        
+        body.render(writer, cycle);
+        
+        expect(cycle.renderStackPop()).andReturn(any);
+        
+        replay();
 
         any.addBody(body);
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestConditional.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestConditional.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestConditional.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestConditional.java Sat Aug 12 20:25:47 2006
@@ -14,11 +14,14 @@
 
 package org.apache.tapestry.components;
 
+import static org.easymock.EasyMock.expect;
+
 import org.apache.tapestry.BaseComponentTestCase;
 import org.apache.tapestry.IBinding;
 import org.apache.tapestry.IMarkupWriter;
 import org.apache.tapestry.IRender;
 import org.apache.tapestry.IRequestCycle;
+import org.apache.tapestry.services.ResponseBuilder;
 import org.apache.tapestry.spec.IComponentSpecification;
 import org.testng.annotations.Test;
 
@@ -34,7 +37,7 @@
     private IRender newRender(IMarkupWriter writer, IRequestCycle cycle)
     {
         IRender render = newMock(IRender.class);
-
+        
         render.render(writer, cycle);
 
         return render;
@@ -61,12 +64,17 @@
         IMarkupWriter writer = newWriter();
         IRequestCycle cycle = newCycle(false, writer);
         IRender body = newRender(writer, cycle);
-
-        replay();
-
-        Conditional conditional = newInstance(Conditional.class, new Object[]
-        { "condition", Boolean.TRUE });
+        
+        Conditional conditional = newInstance(Conditional.class, 
+                new Object[] { "condition", Boolean.TRUE });
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         conditional.addBody(body);
+        
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
+        replay();
 
         conditional.render(writer, cycle);
 
@@ -76,17 +84,30 @@
     public void testIgnoreElementWhenRewinding()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(true, writer);
-        IRender body = newRender(writer, cycle);
-
+        IRequestCycle cycle = newCycle();
+        IRender body = newMock(IRender.class);
+        
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
+        
+        Conditional conditional = newInstance(Conditional.class, 
+                new Object[] { "condition", Boolean.TRUE, "element", "div" });
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
+        expect(cycle.isRewinding()).andReturn(true);
+        
+        expect(cycle.getResponseBuilder()).andReturn(builder);
+        
+        builder.render(writer, body, cycle);
+        
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
         replay();
-
-        Conditional conditional = newInstance(Conditional.class, new Object[]
-        { "condition", Boolean.TRUE, "element", "div" });
+        
         conditional.addBody(body);
-
+        
         conditional.render(writer, cycle);
-
+        
         verify();
     }
 
@@ -95,11 +116,25 @@
         IMarkupWriter writer = newWriter();
         IRequestCycle cycle = newCycle(false, null);
         
-        writer.begin("div");
-        
         IComponentSpecification spec = newSpec("informal", null);
         IBinding informal = newBinding("informal-value");
         
+        IRender body = newRender(writer, cycle);
+        
+        Conditional conditional = newInstance(Conditional.class, 
+                new Object[] { 
+            "condition", Boolean.TRUE, 
+            "element", "div", 
+            "specification", spec 
+        });
+        
+        conditional.addBody(body);
+        conditional.setBinding("informal", informal);
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
+        writer.begin("div");
+        
         writer.attribute("informal", "informal-value");
 
         // We've trained body, but there's no way to ensure,
@@ -110,16 +145,11 @@
         
         trainResponseBuilder(cycle, writer);
         
-        IRender body = newRender(writer, cycle);
-        
         writer.end("div");
         
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
         replay();
-
-        Conditional conditional = newInstance(Conditional.class, new Object[]
-        { "condition", Boolean.TRUE, "element", "div", "specification", spec });
-        conditional.addBody(body);
-        conditional.setBinding("informal", informal);
 
         conditional.render(writer, cycle);
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestIfElse.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestIfElse.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestIfElse.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestIfElse.java Sat Aug 12 20:25:47 2006
@@ -54,6 +54,13 @@
 
         IMarkupWriter writer = newWriter();
         
+        IfBean conditional = newInstance(IfBean.class, 
+                new Object[] { "condition", Boolean.TRUE });
+        
+        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         expect(cycle.isRewinding()).andReturn(false);
         
         expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(null);
@@ -64,19 +71,22 @@
         
         cycle.setAttribute(IfBean.IF_VALUE_ATTRIBUTE, Boolean.TRUE);
         
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
+        expect(cycle.renderStackPush(reverse)).andReturn(reverse);
+        
         expect(cycle.getAttribute(IfBean.IF_VALUE_ATTRIBUTE)).andReturn(Boolean.TRUE);
         
+        expect(cycle.renderStackPop()).andReturn(reverse);
+        
         IRender body2 = newRender();
         
         replay();
         
-        IfBean conditional = newInstance(IfBean.class, new Object[]
-        { "condition", Boolean.TRUE });
         conditional.addBody(body);
         
         conditional.render(writer, cycle);
         
-        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
         reverse.addBody(body2);
         reverse.render(writer, cycle);
 
@@ -88,12 +98,23 @@
         IRequestCycle cycle = newCycle();
         IMarkupWriter writer = newWriter();
         
+        IfBean conditional = newInstance(IfBean.class, 
+                new Object[] { "condition", Boolean.FALSE });
+        
+        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         expect(cycle.isRewinding()).andReturn(false);
         
         expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(null);
         
         cycle.setAttribute(IfBean.IF_VALUE_ATTRIBUTE, Boolean.FALSE);
         
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
+        expect(cycle.renderStackPush(reverse)).andReturn(reverse);
+        
         expect(cycle.getAttribute(IfBean.IF_VALUE_ATTRIBUTE)).andReturn(Boolean.FALSE);
         
         expect(cycle.isRewinding()).andReturn(false);
@@ -102,15 +123,14 @@
         
         IRender body = newRender();
         IRender body2 = newRender(writer, cycle);
-
+        
+        expect(cycle.renderStackPop()).andReturn(reverse);
+        
         replay();
-
-        IfBean conditional = newInstance(IfBean.class, new Object[]
-        { "condition", Boolean.FALSE });
+        
         conditional.addBody(body);
         conditional.render(writer, cycle);
-
-        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         reverse.addBody(body2);
         reverse.render(writer, cycle);
 
@@ -123,14 +143,18 @@
         
         IfBean conditional = newInstance(TestIfBean.class, 
         		new Object[] { "condition", Boolean.TRUE });
-
+        
+        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         IForm form = newMock(IForm.class);
         IRequestCycle cycle = newCycle();
-
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         expect(cycle.isRewinding()).andReturn(false);
         
         expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(form);
-
+        
         expect(form.getElementId(conditional)).andReturn("If");
         
         form.addHiddenValue("If", "T");
@@ -141,17 +165,21 @@
         
         cycle.setAttribute(IfBean.IF_VALUE_ATTRIBUTE, Boolean.TRUE);
         
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
+        expect(cycle.renderStackPush(reverse)).andReturn(reverse);
+        
         expect(cycle.getAttribute(IfBean.IF_VALUE_ATTRIBUTE)).andReturn(Boolean.TRUE);
         
         IRender body2 = newRender();
-
+        
+        expect(cycle.renderStackPop()).andReturn(reverse);
+        
         replay();
-
-
+        
         conditional.addBody(body);
         conditional.render(writer, cycle);
-
-        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         reverse.addBody(body2);
         reverse.render(writer, cycle);
 
@@ -165,9 +193,13 @@
         IfBean conditional = newInstance(TestIfBean.class, 
         		new Object[] { "condition", Boolean.FALSE });
 
+        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         IRequestCycle cycle = newCycle();
         IForm form = newMock(IForm.class);
         
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         expect(cycle.isRewinding()).andReturn(false);
         
         expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(form);
@@ -178,6 +210,10 @@
         
         cycle.setAttribute(IfBean.IF_VALUE_ATTRIBUTE, Boolean.FALSE);
         
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
+        expect(cycle.renderStackPush(reverse)).andReturn(reverse);
+        
         expect(cycle.getAttribute(IfBean.IF_VALUE_ATTRIBUTE)).andReturn(Boolean.FALSE);
         
         expect(cycle.isRewinding()).andReturn(false);
@@ -187,13 +223,13 @@
         IRender body = newRender();
         IRender body2 = newRender(writer, cycle);
 
+        expect(cycle.renderStackPop()).andReturn(reverse);
+        
         replay();
 
-
         conditional.addBody(body);
         conditional.render(writer, cycle);
-
-        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         reverse.addBody(body2);
         reverse.render(writer, cycle);
 
@@ -207,9 +243,13 @@
         IfBean conditional = newInstance(TestIfBean.class, 
         		new Object[] { "condition", Boolean.TRUE, "element", "div" });
         
+        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         IForm form = newMock(IForm.class);
         IRequestCycle cycle = newCycle();
-
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         expect(cycle.isRewinding()).andReturn(true);
         
         expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(form);
@@ -219,23 +259,28 @@
         expect(form.getElementId(conditional)).andReturn("If");
         
         expect(cycle.getParameter("If")).andReturn("T");
-
+        
         trainResponseBuilder(cycle, writer);
         
         IRender body = newRender(writer, cycle);
         
         cycle.setAttribute(IfBean.IF_VALUE_ATTRIBUTE, Boolean.TRUE);
-
+        
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
+        expect(cycle.renderStackPush(reverse)).andReturn(reverse);
+        
         expect(cycle.getAttribute(IfBean.IF_VALUE_ATTRIBUTE)).andReturn(Boolean.TRUE);
         
         IRender body2 = newRender();
 
+        expect(cycle.renderStackPop()).andReturn(reverse);
+        
         replay();
 
         conditional.addBody(body);
         conditional.render(writer, cycle);
-
-        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         reverse.addBody(body2);
         reverse.render(writer, cycle);
         
@@ -249,9 +294,13 @@
         IfBean conditional = newInstance(TestIfBean.class, 
         		new Object[] { "condition", Boolean.TRUE, "element", "div" });
         
+        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         IForm form = newMock(IForm.class);
         IRequestCycle cycle = newCycle();
-
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         expect(cycle.isRewinding()).andReturn(true);
         
         expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(form);
@@ -264,6 +313,10 @@
         
         cycle.setAttribute(IfBean.IF_VALUE_ATTRIBUTE, Boolean.FALSE);
         
+        expect(cycle.renderStackPop()).andReturn(conditional);
+        
+        expect(cycle.renderStackPush(reverse)).andReturn(reverse);
+        
         expect(cycle.getAttribute(IfBean.IF_VALUE_ATTRIBUTE)).andReturn(Boolean.FALSE);
         
         expect(cycle.isRewinding()).andReturn(true);
@@ -272,13 +325,14 @@
         
         IRender body = newRender();
         IRender body2 = newRender(writer, cycle);
-
+        
+        expect(cycle.renderStackPop()).andReturn(reverse);
+        
         replay();
 
         conditional.addBody(body);
         conditional.render(writer, cycle);
-
-        ElseBean reverse = (ElseBean) newInstance(ElseBean.class);
+        
         reverse.addBody(body2);
         reverse.render(writer, cycle);
         
@@ -294,6 +348,15 @@
         
         IRequestCycle cycle = newCycle();
 
+        IfBean conditional = newInstance(TestIfBean.class, 
+                new Object[] { 
+            "condition", Boolean.TRUE, 
+            "element", "div", 
+            "specification", spec 
+        });
+        
+        expect(cycle.renderStackPush(conditional)).andReturn(conditional);
+        
         expect(cycle.isRewinding()).andReturn(false);
         
         expect(cycle.getAttribute(TapestryUtils.FORM_ATTRIBUTE)).andReturn(null);
@@ -308,12 +371,11 @@
         trainResponseBuilder(cycle, writer);
         
         cycle.setAttribute(IfBean.IF_VALUE_ATTRIBUTE, Boolean.TRUE);
-
+        
+        expect(cycle.renderStackPop()).andReturn(conditional);
         
         replay();
-
-        IfBean conditional = newInstance(TestIfBean.class, new Object[]
-        { "condition", Boolean.TRUE, "element", "div", "specification", spec });
+        
         conditional.addBody(body);
         conditional.setBinding("informal", informal);
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInsert.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInsert.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInsert.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInsert.java Sat Aug 12 20:25:47 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.components;
 
+import static org.easymock.EasyMock.expect;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertSame;
 
@@ -56,11 +57,15 @@
 
     public void testRewinding()
     {
-        IRequestCycle cycle = newCycle(true, false);
-
-        replay();
-
+        IRequestCycle cycle = newCycle(true);
+        
         Insert insert = (Insert) newInstance(Insert.class);
+        
+        expect(cycle.renderStackPush(insert)).andReturn(insert);
+        
+        expect(cycle.renderStackPop()).andReturn(insert);
+        
+        replay();
 
         insert.render(null, cycle);
 
@@ -69,13 +74,17 @@
 
     public void testNullValue()
     {
-        IRequestCycle cycle = newCycle(false, false);
-
+        IRequestCycle cycle = newCycle(false);
+        
+        Insert insert = newInstance(Insert.class, 
+                new Object[] { "value", null });
+        
+        expect(cycle.renderStackPush(insert)).andReturn(insert);
+        
+        expect(cycle.renderStackPop()).andReturn(insert);
+        
         replay();
-
-        Insert insert = newInstance(Insert.class, new Object[]
-        { "value", null });
-
+        
         insert.render(null, cycle);
 
         verify();
@@ -84,14 +93,18 @@
     public void testNoFormat()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(false, false);
+        IRequestCycle cycle = newCycle(false);
+        
+        Insert insert = newInstance(Insert.class, 
+                new Object[] { "value", new Integer(42) });
+        
+        expect(cycle.renderStackPush(insert)).andReturn(insert);
         
         writer.print("42", false);
         
-        replay();
+        expect(cycle.renderStackPop()).andReturn(insert);
         
-        Insert insert = newInstance(Insert.class, new Object[]
-        { "value", new Integer(42) });
+        replay();
         
         insert.render(writer, cycle);
 
@@ -101,18 +114,22 @@
     public void testFormat()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(false, false);
-
+        IRequestCycle cycle = newCycle(false);
+        
         Date date = new Date();
         DateFormat format = DateFormat.getDateInstance();
         String expected = format.format(date);
         
+        Insert insert = newInstance(Insert.class, 
+                new Object[]{ "value", date, "format", format });
+        
+        expect(cycle.renderStackPush(insert)).andReturn(insert);
+        
         writer.print(expected, false);
         
-        replay();
+        expect(cycle.renderStackPop()).andReturn(insert);
         
-        Insert insert = newInstance(Insert.class, new Object[]
-        { "value", date, "format", format });
+        replay();
 
         insert.render(writer, cycle);
 
@@ -127,15 +144,20 @@
         
         Format format = DateFormat.getInstance();
         
-        IRequestCycle cycle = newCycle(false, false);
+        Insert insert = newInstance(Insert.class, 
+                new Object[] { "value", value, "format", format });
+        
+        IRequestCycle cycle = newCycle(false);
         IMarkupWriter writer = newWriter();
         
         IPage page = newBasePage("Flintstone");
         
+        expect(cycle.renderStackPush(insert)).andReturn(insert);
+        
+        expect(cycle.renderStackPop()).andReturn(insert);
+        
         replay();
         
-        Insert insert = newInstance(Insert.class, new Object[]
-        { "value", value, "format", format });
         insert.setBinding("format", binding);
         insert.setId("fred");
         insert.setPage(page);
@@ -160,16 +182,20 @@
 
     public void testRaw()
     {
-        IRequestCycle cycle = newCycle(false, false);
+        IRequestCycle cycle = newCycle(false);
         IMarkupWriter writer = newWriter();
-
+        
+        Insert insert = newInstance(Insert.class, 
+                new Object[] { "value", new Integer(42), "raw", Boolean.TRUE });
+        
+        expect(cycle.renderStackPush(insert)).andReturn(insert);
+        
         writer.print("42", true);
-
+        
+        expect(cycle.renderStackPop()).andReturn(insert);
+        
         replay();
 
-        Insert insert = newInstance(Insert.class, new Object[]
-        { "value", new Integer(42), "raw", Boolean.TRUE });
-
         insert.render(writer, cycle);
 
         verify();
@@ -182,22 +208,30 @@
         IRequestCycle cycle = newCycle(false, false);
         IMarkupWriter writer = newWriter();
         IComponentSpecification spec = newSpec("informal", null);
-
+        
+        Insert insert = newInstance(Insert.class, 
+                new Object[] { 
+            "value", "42", 
+            "specification", spec, 
+            "styleClass", "paisley" 
+        });
+        
+        expect(cycle.renderStackPush(insert)).andReturn(insert);
+        
         writer.begin("span");
         writer.attribute("class", "paisley");
         writer.attribute("informal", "informal-value");
         writer.print("42", false);
         writer.end();
-
+        
+        expect(cycle.renderStackPop()).andReturn(insert);
+        
         replay();
-
-        Insert insert = newInstance(Insert.class, new Object[]
-        { "value", "42", "specification", spec, "styleClass", "paisley" });
-
+        
         insert.setBinding("informal", informal);
 
         insert.render(writer, cycle);
 
         verify();
     }
-}
\ No newline at end of file
+}

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInvokeListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInvokeListener.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInvokeListener.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestInvokeListener.java Sat Aug 12 20:25:47 2006
@@ -14,6 +14,7 @@
 
 package org.apache.tapestry.components;
 
+import static org.easymock.EasyMock.expect;
 import static org.easymock.EasyMock.expectLastCall;
 import static org.testng.AssertJUnit.assertSame;
 
@@ -52,14 +53,22 @@
         ListenerInvoker invoker = newInvoker();
 
         Object[] parameters = new Object[0];
-
-        InvokeListener component = newInstance(InvokeListener.class, new Object[]
-        { "listener", listener, "parameters", parameters, "listenerInvoker", invoker, });
-
+        
+        InvokeListener component = newInstance(InvokeListener.class, 
+                new Object[] { 
+            "listener", listener, 
+            "parameters", parameters, 
+            "listenerInvoker", invoker, 
+        });
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         cycle.setListenerParameters(parameters);
         invoker.invokeListener(listener, component, cycle);
         cycle.setListenerParameters(null);
 
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -71,7 +80,7 @@
     {
         IMarkupWriter writer = newWriter();
         IRequestCycle cycle = newMock(IRequestCycle.class);
-
+        
         IActionListener listener = newListener();
         
         ListenerInvoker invoker = newMock(ListenerInvoker.class);
@@ -79,17 +88,25 @@
         Throwable t = new RuntimeException();
 
         Object[] parameters = new Object[0];
-
-        InvokeListener component = newInstance(InvokeListener.class, new Object[]
-        { "listener", listener, "parameters", parameters, "listenerInvoker", invoker, });
-
+        
+        InvokeListener component = newInstance(InvokeListener.class, 
+                new Object[] { 
+            "listener", listener, 
+            "parameters", parameters, 
+            "listenerInvoker", invoker, 
+        });
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         cycle.setListenerParameters(parameters);
 
         invoker.invokeListener(listener, component, cycle);
         expectLastCall().andThrow(t);
-
+        
         cycle.setListenerParameters(null);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         try

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestRenderBlock.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestRenderBlock.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestRenderBlock.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/components/TestRenderBlock.java Sat Aug 12 20:25:47 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.components;
 
+import static org.easymock.EasyMock.expect;
+
 import org.apache.tapestry.BaseComponentTestCase;
 import org.apache.tapestry.IMarkupWriter;
 import org.apache.tapestry.IRequestCycle;
@@ -31,10 +33,14 @@
     public void testNullBlock()
     {
         RenderBlock rb = (RenderBlock) newInstance(RenderBlock.class);
-
+        
         IMarkupWriter writer = newWriter();
         IRequestCycle cycle = newMock(IRequestCycle.class);
-
+        
+        expect(cycle.renderStackPush(rb)).andReturn(rb);
+        
+        expect(cycle.renderStackPop()).andReturn(rb);
+        
         replay();
 
         rb.render(writer, cycle);
@@ -46,18 +52,22 @@
     {
         Block b = (Block)newInstance(Block.class);
 
-        RenderBlock rb = newInstance(RenderBlock.class, new Object[]
-        { "block", b });
-
+        RenderBlock rb = newInstance(RenderBlock.class, 
+                new Object[] { "block", b });
+        
         IMarkupWriter writer = newWriter();
         IRequestCycle cycle = newMock(IRequestCycle.class);
-
+        
+        expect(cycle.renderStackPush(rb)).andReturn(rb);
+        
         b.renderForComponent(writer, cycle, rb);
 
+        expect(cycle.renderStackPop()).andReturn(rb);
+        
         replay();
 
         rb.render(writer, cycle);
 
         verify();
     }
-}
\ No newline at end of file
+}

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/dojo/form/TestAutocompleter.java Sat Aug 12 20:25:47 2006
@@ -83,6 +83,8 @@
         
         IValidationDelegate delegate = newDelegate();
         
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -107,6 +109,8 @@
             unreachable();
         }
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
         
         component.render(writer, cycle);
@@ -127,6 +131,8 @@
         
         IValidationDelegate delegate = newDelegate();
         
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -137,6 +143,8 @@
         trainIsRewinding(form, false);
         trainIsRewinding(cycle, true);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
         
         component.render(writer, cycle);
@@ -154,12 +162,6 @@
         IForm form = newMock(IForm.class);
         checkOrder(form, false);
         
-        expect(form.getName()).andReturn("testform").anyTimes();
-        
-        form.setFormFieldUpdating(true);
-        
-        IMarkupWriter writer = newBufferWriter();
-        
         MockDelegate delegate = new MockDelegate();
         
         IEngineService engine = newEngineService();
@@ -179,6 +181,14 @@
             "dataSqueezer", ds
         });
         
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
+        expect(form.getName()).andReturn("testform").anyTimes();
+        
+        form.setFormFieldUpdating(true);
+        
+        IMarkupWriter writer = newBufferWriter();
+        
         DirectServiceParameter dsp = 
             new DirectServiceParameter(component);
         
@@ -207,6 +217,8 @@
         expect(ds.squeeze(2)).andReturn("2p");
         
         script.execute(eq(component), eq(cycle), eq(prs), isA(Map.class));
+        
+        expect(cycle.renderStackPop()).andReturn(component);
         
         replay();
         

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormTest.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormTest.java Sat Aug 12 20:25:47 2006
@@ -89,6 +89,8 @@
                 "formSupport", support, "listener", listener, "listenerInvoker", invoker,
                 "delegate", delegate });
 
+        expect(cycle.renderStackPush(form)).andReturn(form);
+        
         trainStoreForm(cycle, form);
         
         trainIsRewinding(support, true);
@@ -102,7 +104,9 @@
         TapestryUtils.removeForm(cycle);
         
         delegate.setFormComponent(null);
-
+        
+        expect(cycle.renderStackPop()).andReturn(form);
+        
         replay();
 
         try
@@ -137,7 +141,9 @@
         { "id", "myform", "expectedWriter", writer, "expectedRequestCycle", cycle,
                 "formSupport", support, "response", response, "directService", direct, "method",
                 "post", "delegate", delegate });
-
+        
+        expect(cycle.renderStackPush(form)).andReturn(form);
+        
         trainStoreForm(cycle, form);
         
         trainIsRewinding(support, false);
@@ -158,6 +164,8 @@
         TapestryUtils.removeForm(cycle);
 
         delegate.setFormComponent(null);
+            
+        expect(cycle.renderStackPop()).andReturn(form);
         
         replay();
 
@@ -183,6 +191,8 @@
                 "formSupport", support, "response", response, "directService", direct, "method",
                 "post", "delegate", delegate, "scheme", "https", "port", new Integer(443) });
         
+        expect(cycle.renderStackPush(form)).andReturn(form);
+        
         trainStoreForm(cycle, form);
         
         trainIsRewinding(support, false);
@@ -204,6 +214,8 @@
         
         delegate.setFormComponent(null);
         
+        expect(cycle.renderStackPop()).andReturn(form);
+        
         replay();
 
         form.render(writer, cycle);
@@ -341,6 +353,8 @@
                 "formSupport", support, "response", response, "directService", direct, "method",
                 "post", "delegate", delegate, "focus", false });
 
+        expect(cycle.renderStackPush(form)).andReturn(form);
+        
         trainStoreForm(cycle, form);
         
         trainIsRewinding(support, false);
@@ -361,6 +375,8 @@
         TapestryUtils.removeForm(cycle);
 
         delegate.setFormComponent(null);
+        
+        expect(cycle.renderStackPop()).andReturn(form);
         
         replay();
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestCheckbox.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestCheckbox.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestCheckbox.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestCheckbox.java Sat Aug 12 20:25:47 2006
@@ -51,6 +51,8 @@
 
         IValidationDelegate delegate = newDelegate();
         
+        expect(cycle.renderStackPush(cb)).andReturn(cb);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, cb, false);
         trainGetDelegate(form, delegate);
@@ -78,6 +80,8 @@
         expect(delegate.isInError()).andReturn(false);
         
         delegate.registerForFocus(cb, ValidationConstants.NORMAL_FIELD);
+        
+        expect(cycle.renderStackPop()).andReturn(cb);
         
         replay();
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextArea.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextArea.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextArea.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextArea.java Sat Aug 12 20:25:47 2006
@@ -51,7 +51,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -74,6 +76,8 @@
             unreachable();
         }
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -97,7 +101,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -123,6 +129,8 @@
         trainGetDelegate(form, delegate);
         delegate.record(exception);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -146,7 +154,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -175,6 +185,8 @@
         trainGetDelegate(form, delegate);
         delegate.record(exception);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -191,10 +203,14 @@
         IForm form = newMock(IForm.class);
 
         IMarkupWriter writer = newWriter();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, true);
 
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -211,7 +227,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -221,7 +239,9 @@
         trainGetElementId(form, component, "barney");
         trainIsRewinding(form, false);
         trainIsRewinding(cycle, true);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -238,7 +258,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -247,7 +269,9 @@
 
         trainGetElementId(form, component, "barney");
         trainIsRewinding(form, true);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -271,7 +295,9 @@
 
         TextArea component = newInstance(TextArea.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs, "value", " text area value " });
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -300,6 +326,8 @@
 
         trainGetDelegate(form, delegate);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -323,7 +351,9 @@
 
         TextArea component = newInstance(TextArea.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs, "value", " text area value ", "disabled", Boolean.TRUE });
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -350,6 +380,8 @@
 
         trainGetDelegate(form, delegate);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -377,7 +409,9 @@
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs, "value", " text area value ", "specification", new ComponentSpecification() });
 
         component.setBinding("informal", binding);
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -396,7 +430,9 @@
         
         tfs.renderContributions(component, writer, cycle);
         vfs.renderContributions(component, writer, cycle);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -420,7 +456,9 @@
 
         TextArea component = newInstance(TextArea.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs });
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -446,6 +484,8 @@
         vfs.renderContributions(component, writer, cycle);
 
         trainGetDelegate(form, delegate);
+        
+        expect(cycle.renderStackPop()).andReturn(component);
         
         replay();
 

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextField.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextField.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextField.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/TestTextField.java Sat Aug 12 20:25:47 2006
@@ -51,9 +51,11 @@
         IForm form = newMock(IForm.class);
 
         IMarkupWriter writer = newWriter();
-
+        
         IValidationDelegate delegate = newDelegate();
         
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -78,6 +80,8 @@
             unreachable();
         }
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -102,7 +106,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -128,6 +134,8 @@
         trainGetDelegate(form, delegate);
         delegate.record(exception);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -152,7 +160,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -183,6 +193,8 @@
         trainGetDelegate(form, delegate);
         delegate.record(exception);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -199,12 +211,16 @@
         IRequestCycle cycle = newCycle();
         
         IForm form = newMock(IForm.class);
-
+        
         IMarkupWriter writer = newWriter();
 
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, true);
 
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -223,7 +239,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -233,7 +251,9 @@
         trainGetElementId(form, component, "barney");
         trainIsRewinding(form, false);
         trainIsRewinding(cycle, true);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -252,7 +272,9 @@
         IMarkupWriter writer = newWriter();
 
         IValidationDelegate delegate = newDelegate();
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -261,7 +283,9 @@
 
         trainGetElementId(form, component, "barney");
         trainIsRewinding(form, true);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -286,7 +310,9 @@
 
         TextField component = newInstance(TextField.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs, "value", new Integer(10) });
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -313,6 +339,8 @@
 
         trainGetDelegate(form, delegate);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -337,7 +365,9 @@
 
         TextField component = newInstance(TextField.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs, "value", new Integer(10), "hidden", Boolean.TRUE });
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -366,6 +396,8 @@
 
         trainGetDelegate(form, delegate);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -390,7 +422,9 @@
 
         TextField component = newInstance(TextField.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs, "value", new Integer(10), "disabled", Boolean.TRUE });
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -419,6 +453,8 @@
 
         trainGetDelegate(form, delegate);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -445,9 +481,11 @@
 
         TextField component = newInstance(TextField.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs, "value", new Integer(10), "specification", new ComponentSpecification() });
-
+        
         component.setBinding("informal", binding);
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -465,6 +503,8 @@
         tfs.renderContributions(component, writer, cycle);
         vfs.renderContributions(component, writer, cycle);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -489,7 +529,9 @@
 
         TextField component = newInstance(TextField.class, new Object[]
         { "name", "fred", "translatedFieldSupport", tfs, "validatableFieldSupport", vfs });
-
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         trainGetForm(cycle, form);
         trainWasPrerendered(form, writer, component, false);
         trainGetDelegate(form, delegate);
@@ -516,6 +558,8 @@
 
         trainGetDelegate(form, delegate);
         
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
         component.render(writer, cycle);
@@ -531,7 +575,7 @@
 
         TextField field = newInstance(TextField.class, new Object[]
         { "validatableFieldSupport", support, });
-
+        
         expect(support.isRequired(field)).andReturn(true);
 
         replay();

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestInsertText.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestInsertText.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestInsertText.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestInsertText.java Sat Aug 12 20:25:47 2006
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.html;
 
+import static org.easymock.EasyMock.*;
+
 import org.apache.tapestry.BaseComponentTestCase;
 import org.apache.tapestry.IMarkupWriter;
 import org.apache.tapestry.IRequestCycle;
@@ -31,11 +33,15 @@
     public void testRewinding()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(true, false);
-
-        replay();
-
+        IRequestCycle cycle = newCycle(true);
+        
         InsertText component = (InsertText) newInstance(InsertText.class);
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
+        replay();
 
         component.render(writer, cycle);
 
@@ -45,11 +51,15 @@
     public void testRenderNull()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(false, false);
-
-        replay();
+        IRequestCycle cycle = newCycle(false);
 
         InsertText component = (InsertText) newInstance(InsertText.class);
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
+        replay();
 
         component.render(writer, cycle);
 
@@ -59,21 +69,25 @@
     public void testRenderBreaks()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(false, false);
+        IRequestCycle cycle = newCycle(false);
+
+        InsertText component = (InsertText) newInstance(
+                InsertText.class,
+                "value",
+        "Now is the time\nfor all good men\nto come to the aid of their Tapestry.");
 
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         writer.print("Now is the time", false);
         writer.beginEmpty("br");
         writer.print("for all good men", false);
         writer.beginEmpty("br");
         writer.print("to come to the aid of their Tapestry.", false);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
 
-        InsertText component = (InsertText) newInstance(
-                InsertText.class,
-                "value",
-                "Now is the time\nfor all good men\nto come to the aid of their Tapestry.");
-
         component.finishLoad(cycle, null, null);
         component.render(writer, cycle);
 
@@ -83,8 +97,14 @@
     public void testRenderParas()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(false, false);
+        IRequestCycle cycle = newCycle(false);
 
+        InsertText component = newInstance(InsertText.class, 
+                new Object[] { "mode", InsertTextMode.PARAGRAPH, "value",
+        "Now is the time\nfor all good men\nto come to the aid of their Tapestry." });
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         writer.begin("p");
         writer.print("Now is the time", false);
         writer.end();
@@ -96,13 +116,11 @@
         writer.begin("p");
         writer.print("to come to the aid of their Tapestry.", false);
         writer.end();
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
-
-        InsertText component = newInstance(InsertText.class, new Object[]
-        { "mode", InsertTextMode.PARAGRAPH, "value",
-                "Now is the time\nfor all good men\nto come to the aid of their Tapestry." });
-
+        
         component.render(writer, cycle);
 
         verify();
@@ -111,16 +129,20 @@
     public void testRenderRaw()
     {
         IMarkupWriter writer = newWriter();
-        IRequestCycle cycle = newCycle(false, false);
+        IRequestCycle cycle = newCycle(false);
 
+        InsertText component = newInstance(InsertText.class, 
+                new Object[] { "value", "output\n<b>raw</b>", "raw", Boolean.TRUE });
+        
+        expect(cycle.renderStackPush(component)).andReturn(component);
+        
         writer.print("output", true);
         writer.beginEmpty("br");
         writer.print("<b>raw</b>", true);
-
+        
+        expect(cycle.renderStackPop()).andReturn(component);
+        
         replay();
-
-        InsertText component = newInstance(InsertText.class, new Object[]
-        { "value", "output\n<b>raw</b>", "raw", Boolean.TRUE });
 
         component.finishLoad(cycle, null, null);
         component.render(writer, cycle);

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestRelation.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestRelation.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestRelation.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestRelation.java Sat Aug 12 20:25:47 2006
@@ -41,11 +41,14 @@
     public void testRewinding()
     {
         IMarkupWriter writer = newWriter();
-
         IRequestCycle cycle = newCycle(true);
         
         Relation relation = newInstance(Relation.class, null);
-
+        
+        expect(cycle.renderStackPush(relation)).andReturn(relation);
+        
+        expect(cycle.renderStackPop()).andReturn(relation);
+        
         replay();
 
         relation.render(writer, cycle);
@@ -59,25 +62,27 @@
     public void testShellMissing()
     {
         IMarkupWriter writer = newWriter();
-
         IRequestCycle cycle = newCycle(false);
-        
         Location componentLocation = newMock(Location.class);
         
         Relation relation = newInstance(Relation.class, 
                 new Object[] {"location", componentLocation});
         
+        expect(cycle.renderStackPush(relation)).andReturn(relation);
+        
         trainGetShellFromCycle(cycle, null);
 
+        expect(cycle.renderStackPop()).andReturn(relation);
+        
         replay();
-
-        try
-        {
+        
+        try {
+            
             relation.render(writer, cycle);
             unreachable();
-        }
-        catch (ApplicationRuntimeException ex)
-        {
+            
+        } catch (ApplicationRuntimeException ex) {
+            
             assertEquals(ex.getLocation(), componentLocation);
         }
 
@@ -90,27 +95,29 @@
     public void testInvalidHrefParameter()
     {
         IMarkupWriter writer = newWriter();
-
         IRequestCycle cycle = newCycle(false);
-        
         Location componentLocation = newMock(Location.class);
         
-        Relation relation = newInstance(Relation.class, new Object[] 
-        {"location", componentLocation, "href", null});
+        Relation relation = newInstance(Relation.class, 
+                new Object[] {"location", componentLocation, "href", null});
         
         Shell shell = newInstance(Shell.class, null);
         
+        expect(cycle.renderStackPush(relation)).andReturn(relation);
+        
         trainGetShellFromCycle(cycle, shell);
 
+        expect(cycle.renderStackPop()).andReturn(relation);
+        
         replay();
-
-        try
-        {
+        
+        try {
+            
             relation.render(writer, cycle);
             unreachable();
-        }
-        catch (ApplicationRuntimeException ex)
-        {
+            
+        } catch (ApplicationRuntimeException ex) {
+            
             assertEquals(ex.getLocation(), componentLocation);
         }
 
@@ -121,4 +128,4 @@
     {
         expect(cycle.getAttribute(Shell.SHELL_ATTRIBUTE)).andReturn(shell);
     }    
-}
\ No newline at end of file
+}

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestShell.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestShell.java?rev=431140&r1=431139&r2=431140&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestShell.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/html/TestShell.java Sat Aug 12 20:25:47 2006
@@ -45,19 +45,27 @@
     {
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
-
+        
         IRequestCycle cycle = newCycle(true, writer);
         IRender body = newRender();
-
+        
         Shell shell = newInstance(Shell.class, null);
+        
+        expect(cycle.renderStackPush(shell)).andReturn(shell);
+        
         shell.addBody(body);
 
         trainStoreShellInCycle(cycle, shell);
         trainGetNestedWriter(writer, nested);
+        
         body.render(nested, cycle);
+        
         nested.close();
+        
         trainRemoveShellFromCycle(cycle);
-
+        
+        expect(cycle.renderStackPop()).andReturn(shell);
+        
         replay();
 
         shell.render(writer, cycle);