Author: mgrigorov
Date: Wed Oct 5 09:38:29 2011
New Revision: 1179121
URL: http://svn.apache.org/viewvc?rev=1179121&view=rev
Log:
WICKET-4105 Using ajax to update a component that has an
AbstractTransformerBehavior attached throws a ClassCastException
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/transformer/AbstractTransformerBehavior.java
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/transformer/AbstractTransformerBehaviorTest.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/transformer/AbstractTransformerBehavior.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/transformer/AbstractTransformerBehavior.java?rev=1179121&r1=1179120&r2=1179121&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/transformer/AbstractTransformerBehavior.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/markup/transformer/AbstractTransformerBehavior.java
Wed Oct 5 09:38:29 2011
@@ -20,12 +20,13 @@ import org.apache.wicket.Component;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.behavior.Behavior;
import org.apache.wicket.protocol.http.BufferedWebResponse;
+import org.apache.wicket.request.Response;
import org.apache.wicket.request.cycle.RequestCycle;
import org.apache.wicket.request.http.WebResponse;
/**
- * A IBehavior which can be added to any component. It allows to post-process
(transform) the markup
- * generated by the component.
+ * A {@link Behavior} which can be added to any component. It allows to
post-process (transform) the
+ * markup generated by the component.
*
* @see org.apache.wicket.markup.transformer.AbstractOutputTransformerContainer
*
@@ -35,20 +36,17 @@ public abstract class AbstractTransforme
{
private static final long serialVersionUID = 1L;
- private WebResponse webResponse;
-
/**
- * Construct.
+ * The request cycle's response before the transformation.
*/
- public AbstractTransformerBehavior()
- {
- }
+ private Response originalResponse;
/**
* Create a new response object which is used to store the markup
generated by the child
* objects.
*
* @param originalResponse
+ * the original web response or {@code null} if it isn't a
{@link WebResponse}
*
* @return Response object. Must not be null
*/
@@ -65,17 +63,14 @@ public abstract class AbstractTransforme
final RequestCycle requestCycle = RequestCycle.get();
// Temporarily replace the web response with a String response
- webResponse = (WebResponse)requestCycle.getResponse();
+ originalResponse = requestCycle.getResponse();
- // Create a new response object
- final BufferedWebResponse response = newResponse(webResponse);
- if (response == null)
- {
- throw new IllegalStateException("newResponse() must not
return null");
- }
+ WebResponse origResponse = (WebResponse)((originalResponse
instanceof WebResponse)
+ ? originalResponse : null);
+ BufferedWebResponse tempResponse = newResponse(origResponse);
- // and make it the current one
- requestCycle.setResponse(response);
+ // temporarily set StringResponse to collect the transformed
output
+ requestCycle.setResponse(tempResponse);
}
@Override
@@ -85,28 +80,28 @@ public abstract class AbstractTransforme
try
{
- BufferedWebResponse response =
(BufferedWebResponse)requestCycle.getResponse();
+ BufferedWebResponse tempResponse =
(BufferedWebResponse)requestCycle.getResponse();
// Transform the data
- CharSequence output = transform(component,
response.getText());
- response.setText(output);
- response.writeTo(webResponse);
+ CharSequence output = transform(component,
tempResponse.getText());
+ originalResponse.write(output);
}
catch (Exception ex)
{
- throw new WicketRuntimeException("Error while
transforming the output: " + this, ex);
+ throw new WicketRuntimeException("Error while
transforming the output of component: " +
+ component, ex);
}
finally
{
// Restore the original response object
- requestCycle.setResponse(webResponse);
+ requestCycle.setResponse(originalResponse);
}
}
@Override
public void detach(Component component)
{
- webResponse = null;
+ originalResponse = null;
super.detach(component);
}
Modified:
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/transformer/AbstractTransformerBehaviorTest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/transformer/AbstractTransformerBehaviorTest.java?rev=1179121&r1=1179120&r2=1179121&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/transformer/AbstractTransformerBehaviorTest.java
(original)
+++
wicket/trunk/wicket-core/src/test/java/org/apache/wicket/markup/transformer/AbstractTransformerBehaviorTest.java
Wed Oct 5 09:38:29 2011
@@ -19,8 +19,11 @@ package org.apache.wicket.markup.transfo
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.WicketTestCase;
+import org.apache.wicket.ajax.AjaxRequestTarget;
+import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.markup.IMarkupResourceStreamProvider;
import org.apache.wicket.markup.html.WebPage;
+import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.util.resource.IResourceStream;
import org.apache.wicket.util.resource.StringResourceStream;
import org.junit.Test;
@@ -51,8 +54,76 @@ public class AbstractTransformerBehavior
assertTrue(tester.getLastResponseAsString().contains("replacement"));
}
- /** */
- public static class TestPage extends WebPage implements
IMarkupResourceStreamProvider
+ /**
+ * https://issues.apache.org/jira/browse/WICKET-4105
+ */
+ @Test
+ public void transformationInAjaxRequest()
+ {
+ tester.startPage(new AjaxTestPage());
+ tester.assertRenderedPage(AjaxTestPage.class);
+
+ tester.assertContains("normal request");
+ tester.assertContainsNot("ajax request");
+
+ tester.clickLink("updateLabel", true);
+ tester.assertContains("ajax request");
+ tester.assertContainsNot("normal request");
+
+ }
+
+ private static class AjaxTestPage extends WebPage implements
IMarkupResourceStreamProvider
+ {
+ /**
+ * Constructor.
+ *
+ * @param parameters
+ */
+ private AjaxTestPage()
+ {
+ final Label label = new Label("label", "a label");
+ label.setOutputMarkupId(true);
+ label.add(new AbstractTransformerBehavior()
+ {
+ @Override
+ public CharSequence transform(Component
component, CharSequence output)
+ throws Exception
+ {
+ CharSequence result;
+ if (AjaxRequestTarget.get() != null)
+ {
+ result = "ajax request";
+ }
+ else
+ {
+ result = "normal request";
+ }
+
+ return result;
+ }
+ });
+
+ add(label);
+
+ add(new AjaxLink<Void>("updateLabel")
+ {
+ @Override
+ public void onClick(AjaxRequestTarget target)
+ {
+ target.add(label);
+ }
+ });
+ }
+
+ public IResourceStream getMarkupResourceStream(MarkupContainer
container,
+ Class<?> containerClass)
+ {
+ return new StringResourceStream(
+ "<html><body><span wicket:id='label'></span><a
wicket:id='updateLabel'>Link</a></body></html>");
+ }
+ }
+
+ private static class TestPage extends WebPage implements
IMarkupResourceStreamProvider
{
private static final long serialVersionUID = 1L;