You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2008/02/23 08:19:28 UTC
svn commit: r630406 - in
/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket: Page.java
protocol/http/SecondLevelCacheSessionStore.java
protocol/http/pagestore/AbstractPageStore.java
Author: knopp
Date: Fri Feb 22 23:19:27 2008
New Revision: 630406
URL: http://svn.apache.org/viewvc?rev=630406&view=rev
Log:
WICKET-1365
Modified:
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/AbstractPageStore.java
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java?rev=630406&r1=630405&r2=630406&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/Page.java Fri Feb 22 23:19:27 2008
@@ -140,12 +140,11 @@
* TODO
* @param page
* @param stream
- * @return New instance to replace page instance being deserialized
* @throws IOException
* @throws ClassNotFoundException
*
*/
- public Page deserializePage(int id, String name, Page page, ObjectInputStream stream)
+ public void deserializePage(int id, String name, Page page, ObjectInputStream stream)
throws IOException, ClassNotFoundException;
/**
@@ -157,7 +156,16 @@
* ObjectOutputStream
* @throws IOException
*/
+
public void serializePage(Page page, ObjectOutputStream stream) throws IOException;
+
+ /**
+ * Returns object to be serialized instead of given page (called from writeReplace).
+ *
+ * @param serializedPage
+ * @return object to be serialized instead of page (or the page instance itself)
+ */
+ public Object getPageReplacementObject(Page serializedPage);
}
/**
@@ -203,9 +211,6 @@
/** Name of PageMap that this page is stored in */
private String pageMapName;
- // temporary variable to pass page instance from readObject to readResolve
- private transient Page pageToResolve = null;
-
/** Set of components that rendered if component use checking is enabled */
private transient Set renderedComponents;
@@ -754,12 +759,12 @@
"but the stateless hint is set to true!");
}
}
-
- if (getStatelessHint() == false)
+
+ if (getStatelessHint() == false)
{
return false;
}
-
+
if (stateless == null)
{
@@ -1156,9 +1161,9 @@
RequestParameters parameters = getRequest().getRequestParameters();
pageMapName = parameters.getPageMapName();
}
-
+
final IPageMap pageMap = PageMap.forName(pageMapName);
- init(pageMap);
+ init(pageMap);
}
/**
@@ -1171,7 +1176,7 @@
{
if (isBookmarkable())
setStatelessHint(true);
-
+
// Set the page map
if (pageMap != null)
{
@@ -1274,7 +1279,7 @@
IPageSerializer ps = (IPageSerializer)serializer.get();
if (ps != null)
{
- pageToResolve = ps.deserializePage(id, name, this, s);
+ ps.deserializePage(id, name, this, s);
}
else
{
@@ -1282,22 +1287,18 @@
}
}
- // called after readObject
- /**
- * @return
- * @throws ObjectStreamException
- */
- public Object readResolve() throws ObjectStreamException
+ protected Object writeReplace() throws ObjectStreamException
{
- if (pageToResolve == null)
+
+ IPageSerializer ps = (IPageSerializer)serializer.get();
+
+ if (ps != null)
{
- return this;
+ return ps.getPageReplacementObject(this);
}
else
{
- Page page = pageToResolve;
- pageToResolve = null;
- return page;
+ return this;
}
}
@@ -1306,7 +1307,6 @@
s.writeShort(numericId);
s.writeObject(pageMapName);
-
IPageSerializer ps = (IPageSerializer)serializer.get();
if (ps != null)
@@ -1318,6 +1318,7 @@
s.defaultWriteObject();
}
}
+
/**
* Set-up response with appropriate content type, locale and encoding. The locale is set equal
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java?rev=630406&r1=630405&r2=630406&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java Fri Feb 22 23:19:27 2008
@@ -635,6 +635,7 @@
*/
public static ThreadLocal getUsedPages()
{
+ // TODO: Move this to RequestCycle metadata!
return usedPages;
}
Modified: wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/AbstractPageStore.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/AbstractPageStore.java?rev=630406&r1=630405&r2=630406&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/AbstractPageStore.java (original)
+++ wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/AbstractPageStore.java Fri Feb 22 23:19:27 2008
@@ -255,9 +255,38 @@
{
private SerializedPage current;
- private final List previous = new ArrayList();
private final List completed = new ArrayList();
+ public Object getPageReplacementObject(Page callingPage)
+ {
+ SerializedPage calling = new SerializedPage(callingPage);
+
+ // if current page writeObject is called we need to really serialize the page instance
+ if (calling.equals(current))
+ {
+ completed.add(calling);
+ return callingPage;
+ }
+ else // serializing page referenced from current page
+ {
+ // if the referenced page has not yet been serialized...
+ if (completed.contains(calling) == false)
+ {
+ // ...get the bytearray representation of it
+ SerializedPage prev = current;
+ current = calling;
+ current.data = Objects.objectToByteArray(callingPage);
+
+ // invoke callback with the data
+ onPageSerialized(current);
+ current = prev;
+ }
+
+ // return page holder instance (object that will readResolve to
+ // actual page instance
+ return new PageHolder(callingPage);
+ }
+ }
protected void onPageSerialized(SerializedPage page)
{
@@ -279,32 +308,16 @@
* @see org.apache.wicket.Page.IPageSerializer#serializePage(org.apache.wicket.Page,
* java.io.ObjectOutputStream)
*/
+
public void serializePage(Page page, ObjectOutputStream stream) throws IOException
{
- if (current.getPageId() == page.getNumericId())
- {
- stream.writeBoolean(false);
- stream.defaultWriteObject();
- return;
- }
- SerializedPage spk = new SerializedPage(page);
- if (!completed.contains(spk) && !previous.contains(spk))
- {
- previous.add(current);
- current = spk;
- byte[] bytes = Objects.objectToByteArray(page.getPageMapEntry());
- current.setData(bytes);
- onPageSerialized(current);
- completed.add(current);
- current = (SerializedPage)previous.remove(previous.size() - 1);
- }
- stream.writeBoolean(true);
- stream.writeObject(new PageHolder(page));
+ stream.defaultWriteObject();
}
- public Page deserializePage(int id, String pageMapName, Page page, ObjectInputStream stream)
+ public void deserializePage(int id, String pageMapName, Page page, ObjectInputStream stream)
throws IOException, ClassNotFoundException
{
+ // get the page instance registry
HashMap pageMaps = (HashMap)SecondLevelCacheSessionStore.getUsedPages().get();
if (pageMaps == null)
{
@@ -317,18 +330,14 @@
pages = new IntHashMap();
pageMaps.put(pageMapName, pages);
}
- boolean b = stream.readBoolean();
- if (b == false)
- {
- stream.defaultReadObject();
- }
- else
- {
- // the object will resolve to a Page (probably PageHolder)
- page = (Page)stream.readObject();
- }
+
+ // register the new page instance so that when the same page is being deserialized
+ // (curricular page references) we can use existing page instance (otherwise deadlock
+ // would happen)
+
pages.put(id, page);
- return page;
+
+ stream.defaultReadObject();
}
}