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


Reply via email to