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