Author: jcompagner
Date: Wed Feb 7 15:27:00 2007
New Revision: 504734
URL: http://svn.apache.org/viewvc?view=rev&rev=504734
Log:
First cut of storing pages to disk in a thread.
touching pages are pushed to the pagemap in the session.update/detach phase
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/Session.java
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/AbstractHttpSessionStore.java
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/FilePageStore.java
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/HttpSessionStore.java
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/SecondLevelCacheSessionStore.java
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/WebApplication.java
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletSessionStore.java
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/session/ISessionStore.java
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/Session.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/Session.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/Session.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/Session.java
Wed Feb 7 15:27:00 2007
@@ -165,6 +165,9 @@
/** A store for dirty objects for one request */
private static final ThreadLocal dirtyObjects = new ThreadLocal();
+ /** A store for touched pages for one request */
+ private static final ThreadLocal touchedPages = new ThreadLocal();
+
/** Logging object */
private static final Log log = LogFactory.getLog(Session.class);
@@ -821,8 +824,16 @@
*/
public final void touch(Page page)
{
- // Touch the page in its pagemap.
- page.getPageMap().put(page);
+ // store it in a list, so that the pages are really pushed
+ // to the pagemap when the session does it update/detaches.
+ // all the pages are then detached
+ List lst = (List)touchedPages.get();
+ if(lst == null)
+ {
+ lst = new ArrayList();
+ touchedPages.set(lst);
+ }
+ lst.add(page);
}
/**
@@ -1042,6 +1053,17 @@
*/
protected void update()
{
+ List lst = (List)touchedPages.get();
+ if(lst != null)
+ {
+ for (int i = 0; i < lst.size(); i++)
+ {
+ Page page = (Page)lst.get(i);
+ page.getPageMap().put(page);
+ }
+ touchedPages.set(null);
+ }
+
// If state is dirty
if (dirty)
{
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/AbstractHttpSessionStore.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/AbstractHttpSessionStore.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/AbstractHttpSessionStore.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/AbstractHttpSessionStore.java
Wed Feb 7 15:27:00 2007
@@ -295,5 +295,13 @@
{
final IPageSettings settings =
page.getSession().getApplication().getPageSettings();
return new UndoPageVersionManager(page,
settings.getMaxPageVersions());
+ }
+
+ /**
+ * @see wicket.session.ISessionStore#destroy()
+ */
+ public void destroy()
+ {
+ // nop
}
}
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/FilePageStore.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/FilePageStore.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/FilePageStore.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/FilePageStore.java
Wed Feb 7 15:27:00 2007
@@ -23,6 +23,7 @@
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.nio.ByteBuffer;
+import java.util.Iterator;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -30,6 +31,7 @@
import wicket.Application;
import wicket.Page;
import wicket.protocol.http.SecondLevelCacheSessionStore.IPageStore;
+import wicket.util.concurrent.ConcurrentHashMap;
import wicket.util.lang.Objects;
/**
@@ -46,15 +48,37 @@
/** log. */
protected static Log log = LogFactory.getLog(FilePageStore.class);
- private File defaultWorkDir;
+ private final File defaultWorkDir;
+
+ private final ConcurrentHashMap storePageMap;
+
+ private final PageSavingThread thread;
+
+ private final String appName;
/**
* Construct.
*/
public FilePageStore()
{
- defaultWorkDir =
(File)((WebApplication)Application.get()).getServletContext()
- .getAttribute("javax.servlet.context.tempdir");
+
this((File)((WebApplication)Application.get()).getServletContext()
+ .getAttribute("javax.servlet.context.tempdir"));
+ }
+
+ /**
+ * Construct.
+ * @param dir The directory to save to.
+ */
+ public FilePageStore(File dir)
+ {
+ defaultWorkDir = dir;
+ storePageMap = new ConcurrentHashMap();
+ thread = new PageSavingThread();
+ appName = Application.get().getApplicationKey();
+ Thread t = new Thread(thread,"FilePageStoreThread-" +appName);
+ t.setDaemon(true);
+ t.start();
+
}
/**
@@ -63,12 +87,14 @@
*/
public Page getPage(String sessionId, int id, int versionNumber)
{
+ testMap(sessionId, id, versionNumber);
File sessionDir = new File(getWorkDir(), sessionId);
if (sessionDir.exists())
{
File pageFile = getPageFile(id, versionNumber,
sessionDir);
if (pageFile.exists())
{
+ long t1 = System.currentTimeMillis();
FileInputStream fis = null;
try
{
@@ -86,9 +112,18 @@
pageData = new byte[length];
bb.get(pageData);
}
-
+ long t2 = System.currentTimeMillis();
Page page =
(Page)Objects.byteArrayToObject(pageData);
- return page.getVersion(versionNumber);
+ page = page.getVersion(versionNumber);
+ if (page != null &&
log.isDebugEnabled())
+ {
+ long t3 =
System.currentTimeMillis();
+ log.debug("restoring page " +
page.getClass() + "[" + page.getNumericId() + ","
+ +
page.getCurrentVersionNumber() + "] size: " + pageData.length + " for session
" + sessionId + " took "
+ + (t2 - t1) + "
miliseconds to read in and " + (t3-t2) + " miliseconds to deserialize");
+ }
+
+ return page;
}
catch (Exception e)
{
@@ -120,15 +155,10 @@
*/
public void removePage(String sessionId, Page page)
{
- File sessionDir = new File(getWorkDir(), sessionId);
- if (sessionDir.exists())
+ synchronized (storePageMap)
{
- File pageFile = getPageFile(page.getNumericId(),
page.getCurrentVersionNumber(),
- sessionDir);
- if (pageFile.exists())
- {
- pageFile.delete();
- }
+ storePageMap.put(new
SessionPageKey(sessionId,page.getNumericId(),page.getCurrentVersionNumber(),true),
page);
+ storePageMap.notifyAll();
}
}
@@ -138,75 +168,70 @@
*/
public void storePage(String sessionId, Page page)
{
- File sessionDir = new File(getWorkDir(), sessionId);
- sessionDir.mkdirs();
- File pageFile = getPageFile(page.getNumericId(),
page.getCurrentVersionNumber(), sessionDir);
+ synchronized (storePageMap)
+ {
+ storePageMap.put(new
SessionPageKey(sessionId,page.getNumericId(),page.getCurrentVersionNumber()),
page);
+ storePageMap.notifyAll();
+ }
+ }
+
+ /**
+ * @see
wicket.protocol.http.SecondLevelCacheSessionStore.IPageStore#pageAccessed(java.lang.String,
wicket.Page)
+ */
+ public void pageAccessed(String sessionId, Page page)
+ {
+ testMap(sessionId, page.getNumericId(),
page.getCurrentVersionNumber());
+ }
+
- FileOutputStream fos = null;
- long t1 = System.currentTimeMillis();
- long t2 = 0;
- try
+ /**
+ * @see
wicket.protocol.http.SecondLevelCacheSessionStore.IPageStore#destroy()
+ */
+ public void destroy()
+ {
+ thread.stop();
+ }
+
+ private void testMap(String sessionId, int id , int versionNumber)
+ {
+ SessionPageKey curentKey = new
SessionPageKey(sessionId,id,versionNumber);
+ Object key = storePageMap.get(curentKey);
+ while (key != null)
{
- final ByteArrayOutputStream out = new
ByteArrayOutputStream();
- try
+ if( log.isDebugEnabled())
{
- new ObjectOutputStream(out).writeObject(page);
+ log.debug("The page " + id + ":" +
versionNumber+" for session " + sessionId +
+ " wasn't saved yet. blocking
for 200ms");
}
- finally
- {
- out.close();
- }
- byte[] bytes = out.toByteArray();
- t2 = System.currentTimeMillis();
- fos = new FileOutputStream(pageFile);
- ByteBuffer bb = ByteBuffer.wrap(bytes);
- fos.getChannel().write(bb);
- }
- catch (Exception e)
- {
- log.error("Error saving page " + page.getId() + "," +
page.getCurrentVersionNumber()
- + " for the sessionid " + sessionId, e);
- }
- finally
- {
- try
+ synchronized (key)
{
- if (fos != null)
+ try
{
- fos.close();
+ // for now i just wait 200ms and then
try again.
+ // i could use synchronized() and then
notifyAll in the saving thread.
+ // But maybe it is really busy and we
should just block for 200ms
+ key.wait(200);
+ }
+ catch (InterruptedException ex)
+ {
+ log.error(ex);
}
}
- catch (IOException ex)
- {
- // ignore
- }
- }
- if (log.isDebugEnabled())
- {
- long t3 = System.currentTimeMillis();
- log.debug("storing page " + page.getNumericId() + ","
- + page.getCurrentVersionNumber() + "
for session " + sessionId + " took "
- + (t2 - t1) + " miliseconds to
serialize and " + (t3-t2) + "miliseconds to save");
+ key = storePageMap.get(curentKey);
}
}
+
/**
* @see
wicket.protocol.http.SecondLevelCacheSessionStore.IPageStore#unbind(java.lang.String)
*/
public void unbind(String sessionId)
{
- File sessionDir = new File(getWorkDir(), sessionId);
- if (sessionDir.exists())
+ synchronized (storePageMap)
{
- File[] files = sessionDir.listFiles();
- if (files != null)
- {
- for (int i = 0; i < files.length; i++)
- {
- files[i].delete();
- }
- }
- sessionDir.delete();
+ SessionPageKey key = new
SessionPageKey(sessionId,-1,-1,true);
+ storePageMap.put(key, key);
+ storePageMap.notifyAll();
}
}
@@ -230,7 +255,249 @@
*/
private File getPageFile(int id, int versionNumber, File sessionDir)
{
- return new File(sessionDir,
Application.get().getApplicationKey() + "-page-" + id
+ return new File(sessionDir, appName + "-page-" + id
+ "-version-" + versionNumber);
+ }
+
+ private class SessionPageKey
+ {
+ private final String sessionId;
+ private final int id;
+ private final int versionNumber;
+ private final boolean remove;
+
+ SessionPageKey(String sessionId, int id, int versionNumber)
+ {
+ this(sessionId, id, versionNumber, false);
+ }
+
+ SessionPageKey(String sessionId, int id, int versionNumber,
boolean remove)
+ {
+ this.sessionId = sessionId;
+ this.id = id;
+ this.versionNumber = versionNumber;
+ this.remove = remove;
+ }
+
+ /**
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode()
+ {
+ return sessionId.hashCode() + id + versionNumber;
+ }
+
+ /**
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object obj)
+ {
+ if (obj instanceof SessionPageKey)
+ {
+ SessionPageKey key = (SessionPageKey)obj;
+ return id == key.id && versionNumber ==
key.versionNumber &&
+ sessionId.equals(key.sessionId) &&
remove == key.remove;
+ }
+ return false;
+ }
+ }
+
+ private class PageSavingThread implements Runnable
+ {
+ private volatile boolean stop = false;
+
+ /**
+ * Stops this thread.
+ */
+ public void stop()
+ {
+ synchronized (storePageMap)
+ {
+ stop = true;
+ storePageMap.notifyAll();
+ }
+ }
+ /**
+ * @see java.lang.Runnable#run()
+ */
+ public void run()
+ {
+ while(!stop)
+ {
+ Iterator iterator = null;
+ try
+ {
+ iterator =
storePageMap.keySet().iterator();
+ if (!iterator.hasNext())
+ {
+ synchronized (storePageMap)
+ {
+ if(stop) return;
+ storePageMap.wait();
+ }
+ continue;
+ }
+ while(iterator.hasNext())
+ {
+ SessionPageKey key =
(SessionPageKey)iterator.next();
+ Object value =
storePageMap.get(key);
+ if (value == null) continue;
+ if(key.remove)
+ {
+ if (key.id == -1)
+ {
+
removeSession(key.sessionId);
+ // now remove
any other pending save for that page.
+
removeSessionFromPendingMap(key.sessionId);
+ }
+ else
+ {
+
removePage(key.sessionId, key.id, key.versionNumber);
+ // now remove
any other pending save for that page.
+
removePageFromPendingMap(key.sessionId,key.id);
+ }
+ }
+ else
+ {
+ savePage(key.sessionId,
(Page)value);
+ }
+ iterator.remove();
+ }
+ }
+ catch (Exception e)
+ {
+ log.error("Error in page save thread",
e);
+ // removing the one that did fail...
+ if(iterator != null) iterator.remove();
+ }
+ }
+ }
+
+ /**
+ * @param sessionId
+ * @param id
+ */
+ private void removePageFromPendingMap(String sessionId, int id)
+ {
+ Iterator iterator = storePageMap.keySet().iterator();
+ while(iterator.hasNext())
+ {
+ SessionPageKey key =
(SessionPageKey)iterator.next();
+ if(key.sessionId == sessionId && key.id == id)
+ {
+ iterator.remove();
+ }
+ }
+ }
+
+ private void removeSessionFromPendingMap(String sessionId)
+ {
+ Iterator iterator = storePageMap.keySet().iterator();
+ while(iterator.hasNext())
+ {
+ SessionPageKey key =
(SessionPageKey)iterator.next();
+ if(key.sessionId == sessionId)
+ {
+ iterator.remove();
+ }
+ }
+ }
+ private void removePage(String sessionId, int id, int
currentVersionNumber)
+ {
+ File sessionDir = new File(getWorkDir(), sessionId);
+ if (sessionDir.exists())
+ {
+ while(currentVersionNumber >= 0)
+ {
+ File pageFile =
getPageFile(id,currentVersionNumber,sessionDir);
+ if (pageFile.exists())
+ {
+ pageFile.delete();
+ }
+ currentVersionNumber--;
+ }
+ }
+
+ }
+
+ private void removeSession(String sessionId)
+ {
+ File sessionDir = new File(getWorkDir(), sessionId);
+ if (sessionDir.exists())
+ {
+ File[] files = sessionDir.listFiles();
+ if (files != null)
+ {
+ for (int i = 0; i < files.length; i++)
+ {
+ files[i].delete();
+ }
+ }
+ if (!sessionDir.delete())
+ {
+ sessionDir.deleteOnExit();
+ }
+ }
+ }
+
+ /**
+ * @param sessionId
+ * @param page
+ */
+ private void savePage(String sessionId, Page page)
+ {
+ File sessionDir = new File(getWorkDir(), sessionId);
+ sessionDir.mkdirs();
+ File pageFile = getPageFile(page.getNumericId(),
page.getCurrentVersionNumber(), sessionDir);
+
+ FileOutputStream fos = null;
+ long t1 = System.currentTimeMillis();
+ long t2 = 0;
+ int length = 0;
+ try
+ {
+ final ByteArrayOutputStream out = new
ByteArrayOutputStream();
+ try
+ {
+ new
ObjectOutputStream(out).writeObject(page);
+ }
+ finally
+ {
+ out.close();
+ }
+ byte[] bytes = out.toByteArray();
+ t2 = System.currentTimeMillis();
+ fos = new FileOutputStream(pageFile);
+ ByteBuffer bb = ByteBuffer.wrap(bytes);
+ fos.getChannel().write(bb);
+ length = bytes.length;
+ }
+ catch (Exception e)
+ {
+ log.error("Error saving page " +
page.getClass() + "["+ page.getId() + "," + page.getCurrentVersionNumber()
+ + "] for the sessionid " +
sessionId, e);
+ }
+ finally
+ {
+ try
+ {
+ if (fos != null)
+ {
+ fos.close();
+ }
+ }
+ catch (IOException ex)
+ {
+ // ignore
+ }
+ }
+ if (log.isDebugEnabled())
+ {
+ long t3 = System.currentTimeMillis();
+ log.debug("storing page " + page.getClass() +
"["+ page.getNumericId() + ","
+ +
page.getCurrentVersionNumber() + "] size: " + length + " for session " +
sessionId + " took "
+ + (t2 - t1) + " miliseconds to
serialize and " + (t3-t2) + " miliseconds to save");
+ }
+ }
}
}
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/HttpSessionStore.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/HttpSessionStore.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/HttpSessionStore.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/HttpSessionStore.java
Wed Feb 7 15:27:00 2007
@@ -27,7 +27,6 @@
import wicket.AccessStackPageMap;
import wicket.Application;
import wicket.IPageMap;
-import wicket.Page;
import wicket.Request;
import wicket.Session;
import wicket.WicketRuntimeException;
@@ -52,10 +51,12 @@
// session replication
if
(Application.get().getDebugSettings().getSerializeSessionAttributes())
{
- if (value instanceof Page)
- {
- ((Page)value).internalDetach();
- }
+ // TODO this shouldn't be needed anymore, because this
method
+ // should only be called with already detached pages
(See session.touch)
+// if (value instanceof Page)
+// {
+// ((Page)value).internalDetach();
+// }
String valueTypeName = (value != null ?
value.getClass().getName() : "null");
try
{
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/SecondLevelCacheSessionStore.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/SecondLevelCacheSessionStore.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/SecondLevelCacheSessionStore.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/SecondLevelCacheSessionStore.java
Wed Feb 7 15:27:00 2007
@@ -39,12 +39,20 @@
public class SecondLevelCacheSessionStore extends HttpSessionStore
{
/**
- * FIXME document me!
+ * This interface is used by the SecondLevelCacheSessionStore
+ * so that pages can be stored to a persistent layer.
+ * Implemenation should store the page that it gets under the
+ * id and versionnumber. So that every page version can be
+ * reconstructed when asked for.
+ *
+ * @see FilePageStore as default implementation.
*/
public static interface IPageStore
{
/**
+ * Restores a page version from the persistent layer
+ *
* @param sessionId
* @param id
* @param versionNumber
@@ -53,21 +61,43 @@
Page getPage(String sessionId, int id, int versionNumber);
/**
+ * Removes a page from the persistent layer.
+ *
* @param sessionId
* @param page
*/
void removePage(String sessionId, Page page);
/**
+ * Stores the page to a persistent layer. The page should be
stored
+ * under the id and the version number.
+ *
* @param sessionId
* @param page
*/
void storePage(String sessionId, Page page);
/**
+ * The pagestore should cleanup all the pages for that
sessionid.
+ *
* @param sessionId
*/
void unbind(String sessionId);
+
+ /**
+ * This method is called when the page is accessed. A
IPageStore
+ * implemenation can block until a save of that page version is
+ * done. So that a specifiek page version is always restoreable.
+ *
+ * @param sessionId
+ * @param page
+ */
+ void pageAccessed(String sessionId, Page page);
+
+ /**
+ *
+ */
+ void destroy();
}
@@ -199,15 +229,17 @@
public Page get(int id, int versionNumber)
{
+ String sessionId = getSession().getId();
if (lastPage != null && lastPage.getNumericId() == id)
{
Page page = lastPage.getVersion(versionNumber);
if (page != null)
{
+ // ask the page store if it is ready
saving the page.
+ getStore().pageAccessed(sessionId,
page);
return page;
}
}
- String sessionId = getSession().getId();
if (sessionId != null)
{
return getStore().getPage(sessionId, id,
versionNumber);
@@ -226,8 +258,6 @@
{
// we have to save a new page
directly to the file store
// so that this version is also
recoverable.
- // first call detach because
put can be called withing a request.
- page.internalDetach();
getStore().storePage(sessionId,
page);
}
lastPage = page;
@@ -322,6 +352,16 @@
sessionMap.remove(sessionId);
pageStore.unbind(sessionId);
}
+
+ public void pageAccessed(String sessionId, Page page)
+ {
+ pageStore.pageAccessed(sessionId, page);
+ }
+
+ public void destroy()
+ {
+ pageStore.destroy();
+ }
};
}
@@ -369,5 +409,14 @@
protected void onUnbind(String sessionId)
{
getStore().unbind(sessionId);
+ }
+
+ /**
+ * @see wicket.protocol.http.AbstractHttpSessionStore#destroy()
+ */
+ public void destroy()
+ {
+ super.destroy();
+ getStore().destroy();
}
}
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/WebApplication.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/WebApplication.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/WebApplication.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/WebApplication.java
Wed Feb 7 15:27:00 2007
@@ -455,6 +455,7 @@
*/
protected void internalDestroy()
{
+ // destroy the resource watcher
ModificationWatcher resourceWatcher =
getResourceSettings().getResourceWatcher(false);
if (resourceWatcher != null)
{
@@ -462,7 +463,7 @@
}
super.internalDestroy();
bufferedResponses.clear();
- // destroy the resource watcher
+ getSessionStore().destroy();
}
/**
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletSessionStore.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletSessionStore.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletSessionStore.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/portlet/PortletSessionStore.java
Wed Feb 7 15:27:00 2007
@@ -366,4 +366,11 @@
public void onEndRequest(Request request)
{
}
+
+ /**
+ * @see wicket.session.ISessionStore#destroy()
+ */
+ public void destroy()
+ {
+ }
}
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/session/ISessionStore.java
URL:
http://svn.apache.org/viewvc/incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/session/ISessionStore.java?view=diff&rev=504734&r1=504733&r2=504734
==============================================================================
---
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/session/ISessionStore.java
(original)
+++
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/session/ISessionStore.java
Wed Feb 7 15:27:00 2007
@@ -163,4 +163,9 @@
* @return A instance of a IPageVersionManager that the page will use.
*/
IPageVersionManager newVersionManager(Page page);
+
+ /**
+ * Called when the WebApplication is destroyed.
+ */
+ void destroy();
}