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);