Author: pedro
Date: Wed Nov 24 17:41:09 2010
New Revision: 1038716
URL: http://svn.apache.org/viewvc?rev=1038716&view=rev
Log:
Using an stack to make sure that the WicketObjectOutputStream has the correct
ClassStreamHandler on each defaultWriteObject call at the methods invocations
stack. This method is trigger an indirect recursion, so it is important don't
share the ClassStreamHandler as an instance variable.
Issue: WICKET-3136
Modified:
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/WicketObjectOutputStream.java
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/resource/DummyPage.java
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/util/io/WicketOutputStreamTest.java
Modified:
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/WicketObjectOutputStream.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/WicketObjectOutputStream.java?rev=1038716&r1=1038715&r2=1038716&view=diff
==============================================================================
---
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/WicketObjectOutputStream.java
(original)
+++
wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/util/io/WicketObjectOutputStream.java
Wed Nov 24 17:41:09 2010
@@ -28,11 +28,18 @@ import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.Stack;
+import org.apache.wicket.protocol.http.WebApplication;
import org.apache.wicket.util.lang.Generics;
/**
+ * The Wicket ObjectOutputStream to enable back-button support for the
reloading mechanism, be sure
+ * to put <tt>Objects.setObjectStreamFactory(new
WicketObjectStreamFactory());</tt> in your
+ * application's {...@link WebApplication#init()} method.
+ *
+ * @see org.apache.wicket.protocol.http.ReloadingWicketFilter
* @author jcompagner
*/
public final class WicketObjectOutputStream extends ObjectOutputStream
@@ -445,7 +452,7 @@ public final class WicketObjectOutputStr
private final HandleArrayListStack<Object> defaultWrite = new
HandleArrayListStack<Object>();
private final DataOutputStream out;
- private ClassStreamHandler classHandler;
+ private final Stack<ClassStreamHandler> classHandlerStack = new
Stack<ClassStreamHandler>();
private PutField curPut;
@@ -470,7 +477,7 @@ public final class WicketObjectOutputStr
@Override
public void close() throws IOException
{
- classHandler = null;
+ classHandlerStack.clear();
curObject = null;
curPut = null;
handledObjects.clear();
@@ -487,7 +494,7 @@ public final class WicketObjectOutputStr
if (!defaultWrite.contains(curObject))
{
defaultWrite.add(curObject);
- classHandler.writeFields(this, curObject);
+ classHandlerStack.peek().writeFields(this, curObject);
}
}
@@ -790,7 +797,7 @@ public final class WicketObjectOutputStr
else
{
Class<?> realClz = cls;
- classHandler =
ClassStreamHandler.lookup(realClz);
+ ClassStreamHandler classHandler =
ClassStreamHandler.lookup(realClz);
Object object =
classHandler.writeReplace(obj);
if (object != null)
@@ -815,6 +822,7 @@ public final class WicketObjectOutputStr
curObject = obj;
try
{
+
classHandlerStack.push(classHandler);
if
(!classHandler.invokeWriteMethod(this, obj))
{
classHandler.writeFields(this, obj);
@@ -849,6 +857,7 @@ public final class WicketObjectOutputStr
}
finally
{
+ classHandlerStack.pop();
curObject = oldObject;
curPut = old;
}
Modified:
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/resource/DummyPage.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/resource/DummyPage.java?rev=1038716&r1=1038715&r2=1038716&view=diff
==============================================================================
---
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/resource/DummyPage.java
(original)
+++
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/resource/DummyPage.java
Wed Nov 24 17:41:09 2010
@@ -16,6 +16,7 @@
*/
package org.apache.wicket.resource;
+import org.apache.wicket.IPageMap;
import org.apache.wicket.markup.html.WebPage;
/**
@@ -36,4 +37,10 @@ public class DummyPage extends WebPage
super();
}
+
+ public DummyPage(IPageMap pageMap)
+ {
+ super(pageMap);
+ }
+
}
Modified:
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/util/io/WicketOutputStreamTest.java
URL:
http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/util/io/WicketOutputStreamTest.java?rev=1038716&r1=1038715&r2=1038716&view=diff
==============================================================================
---
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/util/io/WicketOutputStreamTest.java
(original)
+++
wicket/branches/wicket-1.4.x/wicket/src/test/java/org/apache/wicket/util/io/WicketOutputStreamTest.java
Wed Nov 24 17:41:09 2010
@@ -17,6 +17,7 @@
package org.apache.wicket.util.io;
import java.io.ByteArrayInputStream;
+import java.io.IOException;
import java.math.BigInteger;
import java.util.GregorianCalendar;
import java.util.Locale;
@@ -24,10 +25,12 @@ import java.util.Locale;
import junit.framework.Assert;
import org.apache.wicket.Page;
+import org.apache.wicket.PageMap;
import org.apache.wicket.RequestCycle;
import org.apache.wicket.WicketTestCase;
import org.apache.wicket.protocol.http.HttpSessionStore;
import org.apache.wicket.protocol.http.WebApplication;
+import org.apache.wicket.resource.DummyPage;
import org.apache.wicket.session.ISessionStore;
/**
@@ -139,6 +142,17 @@ public class WicketOutputStreamTest exte
RequestCycle.get().detach();
}
+ public void testPageWithPageMapSerialization() throws IOException,
ClassNotFoundException
+ {
+ DummyPage dummyPage = new DummyPage(PageMap.forName("test"));
+ woos.writeObject(dummyPage);
+ ByteArrayInputStream bais = new
ByteArrayInputStream(baos.toByteArray());
+
+ WicketObjectInputStream wois = new
WicketObjectInputStream(bais);
+ DummyPage dummyPage2 = (DummyPage)wois.readObject();
+
+ Assert.assertEquals(dummyPage.getClass(),
dummyPage2.getClass());
+ }
// public void testStringsEqualsAfterSerialization() throws Exception
// {