You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by jk...@apache.org on 2006/08/19 19:12:41 UTC

svn commit: r432846 - in /tapestry/tapestry4/trunk: src/site/xdoc/components/ tapestry-framework/src/java/org/apache/tapestry/form/ tapestry-framework/src/java/org/apache/tapestry/services/ tapestry-framework/src/java/org/apache/tapestry/services/impl/...

Author: jkuhnert
Date: Sat Aug 19 10:12:40 2006
New Revision: 432846

URL: http://svn.apache.org/viewvc?rev=432846&view=rev
Log:
Fix for TAPESTRY-1063. FormSupportImpl was incorrectly grabbing a writer to output contents of the hidden 
form input blocks when the form itself is being updated in a request. Changed the logic such that if the form
is already being rendered in a dynamic render the hidden input fields use that writer instead of their own. 

Modified:
    tapestry/tapestry4/trunk/src/site/xdoc/components/Script.xml
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DefaultResponseBuilder.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/JSONResponseBuilder.java
    tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseContributorImpl.java
    tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormSupportTest.java

Modified: tapestry/tapestry4/trunk/src/site/xdoc/components/Script.xml
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/src/site/xdoc/components/Script.xml?rev=432846&r1=432845&r2=432846&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/src/site/xdoc/components/Script.xml (original)
+++ tapestry/tapestry4/trunk/src/site/xdoc/components/Script.xml Sat Aug 19 10:12:40 2006
@@ -85,7 +85,7 @@
                             <a href="../tapestry-framework/apidocs/org/apache/tapestry/IAsset.html">
                                 IAsset
                             </a>
-                            parameter. One of either scriptPath or scriptAsset must be specified.
+                            parameter. One of either script or scriptAsset must be specified.
                         </td>
                     </tr>
                     <tr>

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/FormSupportImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/FormSupportImpl.java?rev=432846&r1=432845&r2=432846&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/FormSupportImpl.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/form/FormSupportImpl.java Sat Aug 19 10:12:40 2006
@@ -711,7 +711,9 @@
      */
     protected IMarkupWriter getHiddenFieldWriter()
     {
-        if (!_fieldUpdating || !_cycle.getResponseBuilder().isDynamic()) {
+        if (!_cycle.getResponseBuilder().contains(_form) 
+                && (!_fieldUpdating 
+                        || !_cycle.getResponseBuilder().isDynamic()) ) {
             return _writer;
         }
         

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java?rev=432846&r1=432845&r2=432846&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/ResponseBuilder.java Sat Aug 19 10:12:40 2006
@@ -123,6 +123,17 @@
     void updateComponent(String id);
     
     /**
+     * Checks if the rendered response contains a particular component. Contains
+     * can mean many things. In the instance of a dynamic response it could potentially
+     * mean a component explicitly set to be updated - or a component that has a containing
+     * component explicitly set to be updated.
+     * 
+     * @param target The component to check containment of.
+     * @return True if response contains the specified component, false otherwise.
+     */
+    boolean contains(IComponent target);
+    
+    /**
      * Invoked by {@link PageRenderSupport} to write external js package
      * includes. This method will be invoked for each external script requesting
      * inclusion in the response.

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DefaultResponseBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DefaultResponseBuilder.java?rev=432846&r1=432845&r2=432846&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DefaultResponseBuilder.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/DefaultResponseBuilder.java Sat Aug 19 10:12:40 2006
@@ -141,6 +141,14 @@
     /** 
      * {@inheritDoc}
      */
+    public boolean contains(IComponent target)
+    {
+        return false;
+    }
+
+    /** 
+     * {@inheritDoc}
+     */
     public IMarkupWriter getWriter()
     {
         if (_writer == null)

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=432846&r1=432845&r2=432846&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 19 10:12:40 2006
@@ -485,7 +485,7 @@
      *          The component to check for.
      * @return True if the request should capture the components output.
      */
-    boolean contains(IComponent target)
+    public boolean contains(IComponent target)
     {
         if (target == null) 
             return false;

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseBuilder.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseBuilder.java?rev=432846&r1=432845&r2=432846&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseBuilder.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseBuilder.java Sat Aug 19 10:12:40 2006
@@ -16,8 +16,10 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
 
+import org.apache.hivemind.util.Defense;
 import org.apache.tapestry.IComponent;
 import org.apache.tapestry.IJSONRender;
 import org.apache.tapestry.IMarkupWriter;
@@ -55,6 +57,8 @@
 
     protected WebResponse _webResponse;
     
+    private IRequestCycle _cycle;
+    
     /**
      * Creates a new response builder with the required services it needs
      * to render the response when {@link #renderResponse(IRequestCycle)} is called.
@@ -66,10 +70,13 @@
      * @param webResponse
      *          Web response for output stream.
      */
-    public JSONResponseBuilder(RequestLocaleManager localeManager, 
+    public JSONResponseBuilder(IRequestCycle cycle, RequestLocaleManager localeManager, 
             MarkupWriterSource markupWriterSource,
             WebResponse webResponse)
     {
+        Defense.notNull(cycle, "cycle");
+        
+        _cycle = cycle;
         _localeManager = localeManager;
         _markupWriterSource = markupWriterSource;
         _webResponse = webResponse;
@@ -166,6 +173,47 @@
     {
         if (!_parts.contains(id))
             _parts.add(id);
+    }
+    
+    /**
+     * Determines if the specified component is contained in the 
+     * responses requested update parts.
+     * @param target
+     *          The component to check for.
+     * @return True if the request should capture the components output.
+     */
+    public boolean contains(IComponent target)
+    {
+        if (target == null) 
+            return false;
+        
+        String id = getComponentId(target);
+        
+        if (_parts.contains(id))
+            return true;
+        
+        Iterator it = _cycle.renderStackIterator();
+        while (it.hasNext()) {
+            
+            IComponent comp = (IComponent)it.next();
+            String compId = getComponentId(comp);
+            
+            if (comp != target && _parts.contains(compId))
+                return true;
+        }
+        
+        return false;
+    }
+    
+    /**
+     * Gets the id of the specified component, choosing the "id" element
+     * binding over any other id.
+     * @param comp
+     * @return The id of the component.
+     */
+    String getComponentId(IComponent comp)
+    {
+        return comp.getClientId();
     }
     
     /**

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseContributorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseContributorImpl.java?rev=432846&r1=432845&r2=432846&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseContributorImpl.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/java/org/apache/tapestry/services/impl/JSONResponseContributorImpl.java Sat Aug 19 10:12:40 2006
@@ -48,7 +48,7 @@
     public ResponseBuilder createBuilder(IRequestCycle cycle)
     throws IOException
     {
-        return new JSONResponseBuilder(_localeManager, _markupWriterSource,
+        return new JSONResponseBuilder(cycle, _localeManager, _markupWriterSource,
                 _webResponse);
     }
     

Modified: tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormSupportTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormSupportTest.java?rev=432846&r1=432845&r2=432846&view=diff
==============================================================================
--- tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormSupportTest.java (original)
+++ tapestry/tapestry4/trunk/tapestry-framework/src/test/org/apache/tapestry/form/FormSupportTest.java Sat Aug 19 10:12:40 2006
@@ -150,6 +150,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         ILink link = newLink();
         IRender render = newRender();
@@ -198,7 +199,7 @@
 
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "barney,wilma,barney_0");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "barney,wilma,barney_0");
 
         nested.close();
 
@@ -267,6 +268,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         PageRenderSupport support = newPageRenderSupport();
         ILink link = newLink();
@@ -318,7 +320,7 @@
 
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "");
 
         nested.close();
 
@@ -340,6 +342,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         PageRenderSupport support = newPageRenderSupport();
         ILink link = newLink();
@@ -388,7 +391,7 @@
 
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "");
 
         nested.close();
 
@@ -465,6 +468,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         PageRenderSupport support = newPageRenderSupport();
         ILink link = newLink();
@@ -512,7 +516,11 @@
         render.render(writer, cycle);
 
         writer.println();
-
+        
+        expect(cycle.getResponseBuilder()).andReturn(builder);
+        
+        expect(builder.contains(form)).andReturn(false);
+        
         trainDiv(writer, form);
 
         trainHidden(writer, "formids", "");
@@ -641,6 +649,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         PageRenderSupport support = newPageRenderSupport();
         ILink link = newLink();
@@ -685,7 +694,11 @@
         render.render(writer, cycle);
 
         writer.println();
-
+        
+        expect(cycle.getResponseBuilder()).andReturn(builder);
+        
+        expect(builder.contains(form)).andReturn(false);
+        
         trainDiv(writer, form);
 
         trainHidden(writer, "formids", "action_0");
@@ -714,6 +727,8 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
+        
         IValidationDelegate delegate = newDelegate();
         PageRenderSupport support = newPageRenderSupport();
         ILink link = newLink();
@@ -765,7 +780,7 @@
 
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "");
 
         nested.close();
 
@@ -997,6 +1012,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         ILink link = newLink();
         IRender render = newRender();
@@ -1042,7 +1058,7 @@
 
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "barney");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "barney");
 
         nested.close();
 
@@ -1070,6 +1086,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         ILink link = newLink();
         IRender render = newRender();
@@ -1130,7 +1147,7 @@
 
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "");
         
         nested.close();
 
@@ -1150,6 +1167,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         ILink link = newLink();
         IRender render = newRender();
@@ -1195,7 +1213,7 @@
 
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "barney");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "barney");
 
         nested.close();
 
@@ -1320,6 +1338,7 @@
         IMarkupWriter writer = newWriter();
         NestedMarkupWriter nested = newNestedWriter();
         IRequestCycle cycle = newCycle();
+        ResponseBuilder builder = newMock(ResponseBuilder.class);
         IValidationDelegate delegate = newDelegate();
         ILink link = newLink();
         IRender render = newRender();
@@ -1370,7 +1389,7 @@
         
         writer.println();
 
-        trainHiddenBlock(writer, form, "fred", "");
+        trainHiddenBlock(cycle, builder, writer, form, "fred", "");
 
         nested.close();
 
@@ -1446,8 +1465,14 @@
         writer.println();
     }
 
-    protected void trainHiddenBlock(IMarkupWriter writer, IForm form, String serviceName, String formIds)
+    protected void trainHiddenBlock(IRequestCycle cycle, ResponseBuilder builder,
+            IMarkupWriter writer, IForm form, 
+            String serviceName, String formIds)
     {
+        expect(cycle.getResponseBuilder()).andReturn(builder);
+        
+        expect(builder.contains(form)).andReturn(false);
+        
         trainDiv(writer, form);
         
         trainHidden(writer, "formids", formIds);