Author: knopp
Date: Tue Jan 8 07:50:23 2008
New Revision: 610030
URL: http://svn.apache.org/viewvc?rev=610030&view=rev
Log:
WICKET-1161
Modified:
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/DiskPageStore.java
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/PageWindowManager.java
Modified:
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/DiskPageStore.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/DiskPageStore.java?rev=610030&r1=610029&r2=610030&view=diff
==============================================================================
---
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/DiskPageStore.java
(original)
+++
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/DiskPageStore.java
Tue Jan 8 07:50:23 2008
@@ -18,7 +18,13 @@
import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.OutputStream;
import java.io.Serializable;
import java.lang.ref.WeakReference;
import java.nio.ByteBuffer;
@@ -28,6 +34,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import org.apache.wicket.Application;
import org.apache.wicket.Page;
@@ -60,8 +67,10 @@
*
* @author Matej Knopp
*/
- protected static class PageMapEntry
+ protected static class PageMapEntry implements Serializable
{
+ private static final long serialVersionUID = 1L;
+
private String pageMapName;
private String fileName;
private PageWindowManager manager;
@@ -96,10 +105,18 @@
*
* @author Matej Knopp
*/
- protected class SessionEntry
+ protected static class SessionEntry implements Serializable
{
+ private static final long serialVersionUID = 1L;
+
private String sessionId;
private final List pageMapEntryList = new ArrayList();
+ private transient DiskPageStore diskPageStore;
+
+ protected SessionEntry(DiskPageStore diskPageStore)
+ {
+ this.diskPageStore = diskPageStore;
+ }
/**
* @return session id
@@ -159,8 +176,8 @@
{
result = new PageMapEntry();
result.pageMapName = pageMapName;
- result.fileName = getPageMapFileName(sessionId,
pageMapName, true);
- result.manager = new
PageWindowManager(getMaxSizePerPageMap());
+ result.fileName =
diskPageStore.getPageMapFileName(sessionId, pageMapName, true);
+ result.manager = new
PageWindowManager(diskPageStore.getMaxSizePerPageMap());
pageMapEntryList.add(result);
}
return result;
@@ -173,7 +190,7 @@
*/
private void removePageMapEntry(PageMapEntry entry)
{
-
fileChannelPool.closeAndDeleteFileChannel(entry.fileName);
+
diskPageStore.fileChannelPool.closeAndDeleteFileChannel(entry.fileName);
pageMapEntryList.remove(entry);
}
@@ -214,13 +231,15 @@
// if we exceeded maximum session size, try to
remove as many
// pagemap as necessary and possible
- while (getTotalSize() > getMaxSizePerSession()
&& pageMapEntryList.size() > 1)
+ while (getTotalSize() >
diskPageStore.getMaxSizePerSession() &&
+ pageMapEntryList.size() > 1)
{
removePageMapEntry((PageMapEntry)pageMapEntryList.get(0));
}
// take the filechannel from the pool
- FileChannel channel =
fileChannelPool.getFileChannel(entry.fileName, true);
+ FileChannel channel =
diskPageStore.fileChannelPool.getFileChannel(entry.fileName,
+ true);
try
{
// write the content
@@ -233,7 +252,7 @@
finally
{
// return the "borrowed" file channel
-
fileChannelPool.returnFileChannel(channel);
+
diskPageStore.fileChannelPool.returnFileChannel(channel);
}
}
}
@@ -263,7 +282,8 @@
public byte[] loadPage(PageWindow window, String
pageMapFileName)
{
byte[] result = null;
- FileChannel channel =
fileChannelPool.getFileChannel(pageMapFileName, false);
+ FileChannel channel =
diskPageStore.fileChannelPool.getFileChannel(pageMapFileName,
+ false);
if (channel != null)
{
ByteBuffer buffer =
ByteBuffer.allocate(window.getFilePartSize());
@@ -281,7 +301,7 @@
}
finally
{
-
fileChannelPool.returnFileChannel(channel);
+
diskPageStore.fileChannelPool.returnFileChannel(channel);
}
}
return result;
@@ -322,7 +342,7 @@
{
removePageMapEntry((PageMapEntry)pageMapEntryList.get(pageMapEntryList.size() -
1));
}
- File sessionFolder = getSessionFolder(sessionId, false);
+ File sessionFolder =
diskPageStore.getSessionFolder(sessionId, false);
if (sessionFolder.exists())
{
sessionFolder.delete();
@@ -345,6 +365,12 @@
}
}
+ private File getStoreFolder()
+ {
+ File storeFolder = new File(fileStoreFolder, appName +
"-filestore");
+ return storeFolder;
+ }
+
/**
* Returns the folder for the specified sessions. If the folder doesn't
exist and the create
* flag is set, the folder will be created.
@@ -355,7 +381,7 @@
*/
private File getSessionFolder(String sessionId, boolean create)
{
- File storeFolder = new File(fileStoreFolder, appName +
"-filestore");
+ File storeFolder = getStoreFolder();
File sessionFolder = new File(storeFolder, sessionId);
if (create && sessionFolder.exists() == false)
{
@@ -480,9 +506,61 @@
this.fileStoreFolder.mkdirs();
appName = Application.get().getApplicationKey();
+ loadIndex();
+
initPageSavingThread();
}
+ private void loadIndex()
+ {
+ File storeFolder = getStoreFolder();
+ File index = new File(storeFolder, "DiskPageStoreIndex");
+ if (index.exists() && index.length() > 0)
+ {
+ try
+ {
+ InputStream stream = new FileInputStream(index);
+ ObjectInputStream ois = new
ObjectInputStream(stream);
+ Map map = (Map)ois.readObject();
+ sessionIdToEntryMap = new
ConcurrentHashMap(map);
+ for (Iterator entries =
sessionIdToEntryMap.entrySet().iterator(); entries.hasNext();)
+ {
+ // initialize the diskPageStore
reference
+ Entry entry = (Entry)entries.next();
+ SessionEntry sessionEntry =
(SessionEntry)entry.getValue();
+ sessionEntry.diskPageStore = this;
+ }
+ stream.close();
+ }
+ catch (Exception e)
+ {
+ log.error("Couldn't load DiskPageStore index
from file " + index + ".", e);
+ }
+ }
+ index.delete();
+ }
+
+ private void saveIndex()
+ {
+ File storeFolder = getStoreFolder();
+ if (storeFolder.exists())
+ {
+ File index = new File(storeFolder,
"DiskPageStoreIndex");
+ index.delete();
+ try
+ {
+ OutputStream stream = new
FileOutputStream(index);
+ ObjectOutputStream oos = new
ObjectOutputStream(stream);
+ oos.writeObject(sessionIdToEntryMap);
+ stream.close();
+ }
+ catch (Exception e)
+ {
+ log.error("Couldn't write DiskPageStore index
to file " + index + ".", e);
+ }
+ }
+ }
+
private static File getDefaultFileStoreFolder()
{
final File dir =
(File)((WebApplication)Application.get()).getServletContext()
@@ -535,6 +613,26 @@
*/
public void destroy()
{
+ if (!isSynchronous())
+ {
+ // make sure that all pages are saved in asynchronous
mode
+ synchronized (pagesToSaveAll)
+ {
+ for (Iterator i =
pagesToSaveAll.entrySet().iterator(); i.hasNext();)
+ {
+ Entry entry = (Entry)i.next();
+ String sessionId =
(String)entry.getKey();
+ List pages = (List)entry.getValue();
+ synchronized (pages)
+ {
+ flushPagesToSaveList(sessionId,
pages);
+ }
+ }
+ }
+ }
+
+ saveIndex();
+
fileChannelPool.destroy();
if (pageSavingThread != null)
{
@@ -542,7 +640,7 @@
}
}
- private final Map /* <String, SessionEntry> */sessionIdToEntryMap = new
ConcurrentHashMap();
+ private Map /* <String, SessionEntry> */sessionIdToEntryMap = new
ConcurrentHashMap();
/**
* Returns the SessionEntry for session with given id. If the entry
does not yet exist and the
@@ -562,7 +660,7 @@
entry =
(SessionEntry)sessionIdToEntryMap.get(sessionId);
if (entry == null)
{
- entry = new SessionEntry();
+ entry = new SessionEntry(this);
entry.sessionId = sessionId;
sessionIdToEntryMap.put(sessionId,
entry);
}
Modified:
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/PageWindowManager.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/PageWindowManager.java?rev=610030&r1=610029&r2=610030&view=diff
==============================================================================
---
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/PageWindowManager.java
(original)
+++
wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/pagestore/PageWindowManager.java
Tue Jan 8 07:50:23 2008
@@ -16,6 +16,7 @@
*/
package org.apache.wicket.protocol.http.pagestore;
+import java.io.Serializable;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -31,15 +32,19 @@
*
* @author Matej Knopp
*/
-public class PageWindowManager
+public class PageWindowManager implements Serializable
{
+ private static final long serialVersionUID = 1L;
+
/**
* Contains information about a page inside the file.
*
* @author Matej Knopp
*/
- private static class PageWindowInternal
+ private static class PageWindowInternal implements Serializable
{
+ private static final long serialVersionUID = 1L;
+
// id of page or -1 if the window is empty
private int pageId;
@@ -104,7 +109,7 @@
}
private int getWindowIndex(List /* Integer */indices, int pageId, int
versionNumber,
- int ajaxVersionNumber)
+ int ajaxVersionNumber)
{
int result = -1;
@@ -117,7 +122,7 @@
PageWindowInternal window =
(PageWindowInternal)windows.get(currentIndex);
if (window.pageId == pageId &&
window.versionNumber == versionNumber &&
- window.ajaxVersionNumber ==
ajaxVersionNumber)
+ window.ajaxVersionNumber ==
ajaxVersionNumber)
{
result = currentIndex;
break;
@@ -157,7 +162,7 @@
PageWindowInternal window =
(PageWindowInternal)windows.get(currentIndex);
if (window.pageId == pageId &&
window.versionNumber == versionNumber &&
- window.ajaxVersionNumber >
lastAjaxVersion)
+ window.ajaxVersionNumber >
lastAjaxVersion)
{
result = currentIndex;
lastAjaxVersion =
window.ajaxVersionNumber;
@@ -443,7 +448,7 @@
* @return
*/
public PageWindow createPageWindow(int pageId, int versionNumber, int
ajaxVersionNumber,
- int size)
+ int size)
{
int index = getWindowIndex(pageId, versionNumber,
ajaxVersionNumber);