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;
 


Reply via email to