Author: knopp
Date: Mon Jul  2 06:55:52 2007
New Revision: 552494

URL: http://svn.apache.org/viewvc?view=rev&rev=552494
Log:
Refactoring for easier extension

Modified:
    
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/FilePageStore.java

Modified: 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/FilePageStore.java
URL: 
http://svn.apache.org/viewvc/incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/FilePageStore.java?view=diff&rev=552494&r1=552493&r2=552494
==============================================================================
--- 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/FilePageStore.java
 (original)
+++ 
incubator/wicket/trunk/jdk-1.4/wicket/src/main/java/org/apache/wicket/protocol/http/FilePageStore.java
 Mon Jul  2 06:55:52 2007
@@ -57,6 +57,11 @@
  */
 public class FilePageStore implements IPageStore
 {
+       
+       protected int getSleepTimeMs() {
+               return 1000;
+       }
+       
        private class PageSavingThread implements Runnable
        {
                private volatile boolean stop = false;
@@ -75,7 +80,7 @@
                                {
                                        while (pagesToBeSaved.size() == 0)
                                        {
-                                               Thread.sleep(2000);
+                                               Thread.sleep(getSleepTimeMs());
                                                if (stop)
                                                        return;
                                        }
@@ -135,45 +140,14 @@
                 */
                private void savePage(SessionPageKey key, byte[] bytes)
                {
-                       File sessionDir = new File(getWorkDir(), key.sessionId);
-                       sessionDir.mkdirs();
-                       File pageFile = getPageFile(key, sessionDir);
-
-                       FileOutputStream fos = null;
                        long t1 = System.currentTimeMillis();
-                       int length = 0;
-                       try
-                       {
-                               fos = new FileOutputStream(pageFile);
-                               ByteBuffer bb = ByteBuffer.wrap(bytes);
-                               fos.getChannel().write(bb);
-                               length = bytes.length;
-                       }
-                       catch (Exception e)
-                       {
-                               log.error("Error saving page " + 
key.pageClassName + " [" + key.id + ","
-                                               + key.versionNumber + "] for 
the sessionid " + key.sessionId);
-                       }
-                       finally
-                       {
-                               try
-                               {
-                                       if (fos != null)
-                                       {
-                                               fos.close();
-                                       }
-                               }
-                               catch (IOException ex)
-                               {
-                                       // ignore
-                               }
-                       }
+                       long length = FilePageStore.this.savePage(key, bytes);
                        long t3 = System.currentTimeMillis();
                        if (log.isDebugEnabled())
                        {
-                               log.debug("storing page " + key.pageClassName + 
"[" + key.id + "," + key.versionNumber
-                                               + "] size: " + length + " for 
session " + key.sessionId + " took "
-                                               + (t3 - t1) + " miliseconds to 
save");
+                               log.debug("storing page " + key.pageClassName + 
"[" + key.id + "," +
+                                               key.versionNumber + "] size: " 
+ length + " for session " + key.sessionId +
+                                               " took " + (t3 - t1) + " 
miliseconds to save");
                        }
                        totalSavingTime += (t3 - t1);
                        saved++;
@@ -182,6 +156,48 @@
 
        }
 
+       protected long savePage(SessionPageKey key, byte[] bytes)
+       {
+               return doSavePage(key, bytes);
+       }
+
+       protected long doSavePage(SessionPageKey key, byte[] bytes)
+       {
+               File sessionDir = new File(getWorkDir(), key.sessionId);
+               sessionDir.mkdirs();
+               File pageFile = getPageFile(key, sessionDir);
+
+               FileOutputStream fos = null;
+               int length = 0;
+               try
+               {
+                       fos = new FileOutputStream(pageFile);
+                       ByteBuffer bb = ByteBuffer.wrap(bytes);
+                       fos.getChannel().write(bb);
+                       length = bytes.length;
+               }
+               catch (Exception e)
+               {
+                       log.error("Error saving page " + key.pageClassName + " 
[" + key.id + "," +
+                                       key.versionNumber + "] for the 
sessionid " + key.sessionId);
+               }
+               finally
+               {
+                       try
+                       {
+                               if (fos != null)
+                               {
+                                       fos.close();
+                               }
+                       }
+                       catch (IOException ex)
+                       {
+                               // ignore
+                       }
+               }
+               return length;
+       }
+
        private class PageSerializingThread implements Runnable
        {
                private volatile boolean stop = false;
@@ -199,7 +215,7 @@
                                {
                                        while (pagesToBeSerialized.size() == 0)
                                        {
-                                               Thread.sleep(2000);
+                                               Thread.sleep(getSleepTimeMs());
                                                if (stop)
                                                        return;
                                        }
@@ -277,10 +293,14 @@
        }
 
        /**
-        * Key based on session id, page id, version numbers, etc
+        * Key based on session id, page id, version numbers, etc.
+        * We don't serialize it anywhere. It's made serializable for 
convenience if a subclass needs
+        * to serialize it
         */
-       private static class SessionPageKey
+       protected static class SessionPageKey implements Serializable
        {
+               private static final long serialVersionUID = 1L;
+       
                private final String sessionId;
                private final int id;
                private final int versionNumber;
@@ -322,11 +342,11 @@
                        if (obj instanceof SessionPageKey)
                        {
                                SessionPageKey key = (SessionPageKey)obj;
-                               return id == key.id
-                                               && versionNumber == 
key.versionNumber
-                                               && ajaxVersionNumber == 
key.ajaxVersionNumber
-                                               && ((pageMap != null && 
pageMap.equals(key.pageMap)) || (pageMap == null && key.pageMap == null))
-                                               && 
sessionId.equals(key.sessionId);
+                               return id == key.id &&
+                                               versionNumber == 
key.versionNumber &&
+                                               ajaxVersionNumber == 
key.ajaxVersionNumber &&
+                                               ((pageMap != null && 
pageMap.equals(key.pageMap)) || (pageMap == null && key.pageMap == null)) &&
+                                               sessionId.equals(key.sessionId);
                        }
                        return false;
                }
@@ -365,8 +385,8 @@
                 */
                public String toString()
                {
-                       return "SessionPageKey[" + sessionId + "," + id + "," + 
versionNumber + ","
-                                       + ajaxVersionNumber + ", " + pageMap + 
", " + data + "]";
+                       return "SessionPageKey[" + sessionId + "," + id + "," + 
versionNumber + "," +
+                                       ajaxVersionNumber + ", " + pageMap + ", 
" + data + "]";
                }
        }
 
@@ -389,7 +409,7 @@
        private volatile int serialized;
 
        private volatile long totalSerializationTime = 0;
-       
+
        /**
         * Construct.
         */
@@ -437,34 +457,20 @@
                saveThread.stop();
                serThread.stop();
        }
-
-
-       /**
-        * @see 
org.apache.wicket.protocol.http.SecondLevelCacheSessionStore.IPageStore#getPage(java.lang.String,
-        *      int, int)
-        */
-       public Page getPage(String sessionId, String pagemapName, int id, int 
versionNumber,
-                       int ajaxVersionNumber)
+       protected byte[] doLoadPage(SessionPageKey key) 
        {
-               SessionPageKey currentKey = new SessionPageKey(sessionId, id, 
versionNumber,
-                               ajaxVersionNumber, pagemapName, null);
-               long t = System.currentTimeMillis();
-               byte[] bytes = testMap(currentKey);
-               if (bytes != null)
-               {
-                       return readPage(versionNumber, bytes);
-               }
-               File sessionDir = new File(getWorkDir(), sessionId);
+               File sessionDir = new File(getWorkDir(), key.sessionId);
+               byte[] pageData = null;
+               
                if (sessionDir.exists())
                {
-                       File pageFile = getPageFile(currentKey, sessionDir);
+                       File pageFile = getPageFile(key, sessionDir);
                        if (pageFile.exists())
                        {
                                long t1 = System.currentTimeMillis();
                                FileInputStream fis = null;
                                try
                                {
-                                       byte[] pageData = null;
                                        fis = new FileInputStream(pageFile);
                                        int length = (int)pageFile.length();
                                        ByteBuffer bb = 
ByteBuffer.allocate(length);
@@ -478,31 +484,11 @@
                                                pageData = new byte[length];
                                                bb.get(pageData);
                                        }
-                                       try
-                                       {
-                                               long t2 = 
System.currentTimeMillis();
-                                               Page page = 
readPage(versionNumber, pageData);
-                                               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;
-                                       } 
-                                       finally
-                                       {
-                                               
-                                       }
-
                                }
                                catch (Exception e)
                                {
-                                       log.debug("Error loading page " + id + 
"," + versionNumber
-                                                       + " for the sessionid " 
+ sessionId + " from disk", e);
+                                       log.debug("Error loading page " + 
key.id + "," + key.versionNumber +
+                                                       " for the sessionid " + 
key.sessionId + " from disk", e);
                                }
                                finally
                                {
@@ -520,7 +506,48 @@
                                }
                        }
                }
-               return null;
+               return pageData;
+       }
+
+       protected byte[] loadPage(SessionPageKey key)
+       {
+               return doLoadPage(key);
+       }
+
+       /**
+        * @see 
org.apache.wicket.protocol.http.SecondLevelCacheSessionStore.IPageStore#getPage(java.lang.String,
+        *      int, int)
+        */
+       public Page getPage(String sessionId, String pagemapName, int id, int 
versionNumber,
+                       int ajaxVersionNumber)
+       {
+               SessionPageKey currentKey = new SessionPageKey(sessionId, id, 
versionNumber,
+                               ajaxVersionNumber, pagemapName, null);
+               long t1 = System.currentTimeMillis();
+               byte[] bytes = testMap(currentKey);
+               if (bytes != null)
+               {
+                       return readPage(versionNumber, bytes);
+               }
+               long t2 = System.currentTimeMillis();
+               byte pageData[] = loadPage(currentKey);
+               if (pageData != null)
+               {
+                       Page page = readPage(versionNumber, pageData);
+                       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;
+               }
+               else
+               {
+                       return null;
+               }
        }
 
        /**
@@ -530,7 +557,7 @@
         */
        private Page readPage(int versionNumber, byte[] bytes)
        {
-               boolean set = Page.serializer.get() == null; 
+               boolean set = Page.serializer.get() == null;
                Page page = null;
                try
                {
@@ -544,7 +571,7 @@
                                page = entry.getPage();
                                page = page.getVersion(versionNumber);
                        }
-               } 
+               }
                finally
                {
                        if (set)
@@ -573,7 +600,7 @@
        public void removePage(String sessionId, String pageMapName, int pageId)
        {
                removePageFromPendingMap(sessionId, pageMapName, pageId);
-               removeFiles(sessionId,pageMapName, pageId);
+               removeFiles(sessionId, pageMapName, pageId);
        }
 
        /**
@@ -610,8 +637,8 @@
         */
        private File getPageFile(SessionPageKey key, File sessionDir)
        {
-               return new File(sessionDir, appName + "-pm-" + key.pageMap + 
"-p-" + key.id + "-v-"
-                               + key.versionNumber + "-a-" + 
key.ajaxVersionNumber);
+               return new File(sessionDir, appName + "-pm-" + key.pageMap + 
"-p-" + key.id + "-v-" +
+                               key.versionNumber + "-a-" + 
key.ajaxVersionNumber);
        }
 
 
@@ -623,11 +650,11 @@
                        final String filepart;
                        if (id != -1)
                        {
-                               filepart = appName + "-pm-"+pageMap +"-p-" + id;
+                               filepart = appName + "-pm-" + pageMap + "-p-" + 
id;
                        }
                        else
                        {
-                               filepart = appName + "-pm-"+pageMap;
+                               filepart = appName + "-pm-" + pageMap;
                        }
                        File[] listFiles = sessionDir.listFiles(new 
FilenameFilter()
                        {
@@ -645,11 +672,14 @@
        }
 
        /**
-        * @param sessionId The session of the page that must be removed
-        * @param pageMap The pagemap of the page that must be removed
-        * @param id The id of the page.
+        * @param sessionId
+        *            The session of the page that must be removed
+        * @param pageMap
+        *            The pagemap of the page that must be removed
+        * @param id
+        *            The id of the page.
         */
-       private void removePageFromPendingMap(String sessionId, String 
pageMap,int id)
+       private void removePageFromPendingMap(String sessionId, String pageMap, 
int id)
        {
                List list = (List)pagesToBeSerialized.get(sessionId);
 
@@ -662,8 +692,8 @@
                        while (iterator.hasNext())
                        {
                                SessionPageKey key = 
(SessionPageKey)iterator.next();
-                               
-                               if ( (id == -1 ||  key.id == id) && 
Objects.equal(key.sessionId, sessionId) && 
+
+                               if ((id == -1 || key.id == id) && 
Objects.equal(key.sessionId, sessionId) &&
                                                Objects.equal(key.pageMap, 
pageMap))
                                {
                                        iterator.remove();
@@ -703,7 +733,7 @@
        private byte[] serializePage(SessionPageKey key, Page page)
        {
                byte[] bytes = null;
-               //System.err.println("SERIALIZING " + key);
+               // System.err.println("SERIALIZING " + key);
                long t1 = System.currentTimeMillis();
                Page.serializer.set(new PageSerializer(key));
                try
@@ -713,22 +743,23 @@
                        serialized++;
                        if (log.isDebugEnabled() && bytes != null)
                        {
-                               log.debug("serializing page " + 
key.pageClassName + "[" + key.id + "," + key.versionNumber
-                                               + "] size: " + bytes.length + " 
for session " + key.sessionId + " took "
-                                               + (System.currentTimeMillis() - 
t1) + " miliseconds to serialize");
+                               log.debug("serializing page " + 
key.pageClassName + "[" + key.id + "," +
+                                               key.versionNumber + "] size: " 
+ bytes.length + " for session " +
+                                               key.sessionId + " took " + 
(System.currentTimeMillis() - t1) +
+                                               " miliseconds to serialize");
                        }
                }
                finally
                {
                        Page.serializer.set(null);
                }
-               //System.err.println("SERIALIZING " + key + " bytes: " + bytes);
+               // System.err.println("SERIALIZING " + key + " bytes: " + 
bytes);
                return bytes;
        }
 
        private byte[] testMap(final SessionPageKey currentKey)
        {
-               //System.err.println("TESTMAP:" + currentKey);
+               // System.err.println("TESTMAP:" + currentKey);
                byte[] bytes = null;
                List list = (List)pagesToBeSerialized.get(currentKey.sessionId);
                if (list == null)
@@ -741,18 +772,18 @@
                }
                else
                {
-                       while(true)
+                       while (true)
                        {
                                SessionPageKey listKey = null;
                                synchronized (list)
                                {
                                        if (list.size() > 0)
                                        {
-                                               listKey = 
(SessionPageKey)list.get(list.size()-1);
+                                               listKey = 
(SessionPageKey)list.get(list.size() - 1);
                                                Object object = listKey.data;
                                                if (object instanceof Page)
                                                {
-                                                       
list.remove(list.size()-1);
+                                                       list.remove(list.size() 
- 1);
                                                }
                                                else if (object == SERIALIZING)
                                                {
@@ -808,26 +839,27 @@
        {
                return defaultWorkDir;
        }
-       
+
        private class PageSerializer implements Page.IPageSerializer
        {
                private SessionPageKey current;
-               
+
                private List previous = new ArrayList();
                private List completed = new ArrayList();
-       
+
 
                /**
                 * Construct.
+                * 
                 * @param key
                 */
                public PageSerializer(SessionPageKey key)
                {
                        this.current = key;
                }
-               
+
                /**
-                * @throws IOException 
+                * @throws IOException
                 * @see 
org.apache.wicket.Page.IPageSerializer#serializePage(org.apache.wicket.Page)
                 */
                public void serializePage(Page page, ObjectOutputStream stream) 
throws IOException
@@ -838,7 +870,7 @@
                                stream.defaultWriteObject();
                                return;
                        }
-                       SessionPageKey spk = new 
SessionPageKey(current.sessionId,page);
+                       SessionPageKey spk = new 
SessionPageKey(current.sessionId, page);
                        if (!completed.contains(spk) && !previous.contains(spk))
                        {
                                previous.add(current);
@@ -847,13 +879,14 @@
                                current.setObject(bytes);
                                pagesToBeSaved.put(spk, spk);
                                completed.add(current);
-                               current = 
(SessionPageKey)previous.remove(previous.size()-1);
+                               current = 
(SessionPageKey)previous.remove(previous.size() - 1);
                        }
                        stream.writeBoolean(true);
                        stream.writeObject(new PageHolder(page));
                }
 
-               public Page deserializePage(int id, String name, Page page, 
ObjectInputStream stream) throws IOException, ClassNotFoundException
+               public Page deserializePage(int id, String name, Page page, 
ObjectInputStream stream)
+                               throws IOException, ClassNotFoundException
                {
                        HashMap pageMaps = 
(HashMap)SecondLevelCacheSessionStore.usedPages.get();
                        if (pageMaps == null)
@@ -869,19 +902,19 @@
                        }
                        pages.put(id, page);
                        boolean b = stream.readBoolean();
-                       if (b == false) 
+                       if (b == false)
                        {
                                stream.defaultReadObject();
                                return page;
-                       } 
-                       else 
+                       }
+                       else
                        {
                                // the object will resolve to a Page (probably 
PageHolder)
-                               return (Page) stream.readObject();
+                               return (Page)stream.readObject();
                        }
                }
        }
-       
+
        /**
         * Class that resolves to page instance
         */
@@ -891,13 +924,13 @@
 
                private final int pageid;
                private final String pagemap;
-               
+
                PageHolder(Page page)
                {
                        this.pageid = page.getNumericId();
                        this.pagemap = page.getPageMapName();
                }
-               
+
                protected Object readResolve() throws ObjectStreamException
                {
                        return Session.get().getPage(pagemap, 
Integer.toString(pageid), -1);


Reply via email to