Author: ehillenius
Date: Fri Mar 9 13:58:46 2007
New Revision: 516577
URL: http://svn.apache.org/viewvc?view=rev&rev=516577
Log:
WICKET-375
Modified:
incubator/wicket/branches/wicket-1.x/wicket/src/main/java/wicket/protocol/http/SecondLevelCacheSessionStore.java
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=516577&r1=516576&r2=516577
==============================================================================
---
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
Fri Mar 9 13:58:46 2007
@@ -37,28 +37,43 @@
public class SecondLevelCacheSessionStore extends HttpSessionStore
{
/**
- * 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.
- *
+ * 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
{
/**
+ *
+ */
+ void destroy();
+
+ /**
* Restores a page version from the persistent layer
*
* @param sessionId
- * @param pagemap
+ * @param pagemap
* @param id
* @param versionNumber
- * @param ajaxVersionNumber
+ * @param ajaxVersionNumber
* @return The page
*/
- Page getPage(String sessionId, String pagemap, int id, int
versionNumber, int ajaxVersionNumber);
+ Page getPage(String sessionId, String pagemap, int id, int
versionNumber,
+ int ajaxVersionNumber);
+
+ /**
+ * 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);
/**
* Removes a page from the persistent layer.
@@ -79,44 +94,103 @@
/**
* 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);
+
+ }
+
+ private static final class SecondLevelCachePageMap extends PageMap
+ {
+ private static final long serialVersionUID = 1L;
+
+ private Page lastPage = null;
/**
+ * Construct.
*
+ * @param name
+ * @param session
*/
- void destroy();
+ private SecondLevelCachePageMap(String name, Session session)
+ {
+ super(name, session);
+ }
+
+ 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;
+ }
+ }
+ if (sessionId != null)
+ {
+ // this is really a page request for a default
page. (so without
+ // an ajax version)
+ return getStore().getPage(sessionId, getName(),
id, versionNumber, 0);
+ }
+ return null;
+ }
+
+ public void put(Page page)
+ {
+ if (!page.isPageStateless())
+ {
+ String sessionId = getSession().getId();
+ if (sessionId != null)
+ {
+ if (lastPage != page &&
page.getCurrentVersionNumber() == 0)
+ {
+ // we have to save a new page
directly to the file store
+ // so that this version is also
recoverable.
+ getStore().storePage(sessionId,
page);
+ }
+ lastPage = page;
+ dirty();
+ }
+ }
+ }
+
+ public void removeEntry(IPageMapEntry entry)
+ {
+ String sessionId = getSession().getId();
+ if (sessionId != null)
+ {
+ getStore().removePage(sessionId,
entry.getPage());
+ }
+ }
+ private IPageStore getStore()
+ {
+ return
((SecondLevelCacheSessionStore)Application.get().getSessionStore()).getStore();
+ }
}
-
+
private static final class SecondLevelCachePageVersionManager
implements IPageVersionManager
{
private static final long serialVersionUID = 1L;
private short currentVersionNumber;
-
+
private short currentAjaxVersionNumber;
-
+
private short lastAjaxVersionNumber;
private Page page;
-
+
private transient boolean versionStarted;
-
+
/**
* Construct.
+ *
* @param page
*/
public SecondLevelCachePageVersionManager(Page page)
@@ -129,11 +203,13 @@
*/
public void beginVersion(boolean mergeVersion)
{
- // this is an hack.. when object is read in. It must
ignore the first version bump.
- if(versionStarted) return;
-
+ // this is an hack.. when object is read in. It must
ignore the
+ // first version bump.
+ if (versionStarted)
+ return;
+
versionStarted = true;
- if(!mergeVersion)
+ if (!mergeVersion)
{
currentVersionNumber++;
lastAjaxVersionNumber =
currentAjaxVersionNumber;
@@ -146,16 +222,6 @@
}
/**
- * @see wicket.version.IPageVersionManager#ignoreVersionMerge()
- */
- public void ignoreVersionMerge()
- {
- currentVersionNumber++;
- lastAjaxVersionNumber = currentAjaxVersionNumber;
- currentAjaxVersionNumber = 0;
- }
-
- /**
* @see
wicket.version.IPageVersionManager#componentAdded(wicket.Component)
*/
public void componentAdded(Component component)
@@ -190,9 +256,10 @@
{
versionStarted = false;
String sessionId = page.getSession().getId();
- if (sessionId != null)
+ if (sessionId != null)
{
- IPageStore store =
((SecondLevelCacheSessionStore)Application.get().getSessionStore()).getStore();
+ IPageStore store =
((SecondLevelCacheSessionStore)Application.get()
+ .getSessionStore()).getStore();
store.storePage(sessionId, page);
}
}
@@ -205,19 +272,19 @@
}
/**
- * @see
wicket.version.IPageVersionManager#getCurrentVersionNumber()
+ * @see
wicket.version.IPageVersionManager#getAjaxVersionNumber()
*/
- public int getCurrentVersionNumber()
+ public int getAjaxVersionNumber()
{
- return currentVersionNumber;
+ return currentAjaxVersionNumber;
}
-
+
/**
- * @see
wicket.version.IPageVersionManager#getAjaxVersionNumber()
+ * @see
wicket.version.IPageVersionManager#getCurrentVersionNumber()
*/
- public int getAjaxVersionNumber()
+ public int getCurrentVersionNumber()
{
- return currentAjaxVersionNumber;
+ return currentVersionNumber;
}
/**
@@ -225,26 +292,38 @@
*/
public Page getVersion(int versionNumber)
{
- if(currentVersionNumber == versionNumber)
+ if (currentVersionNumber == versionNumber)
{
return page;
}
return null;
}
-
- private void readObject(java.io.ObjectInputStream s) throws
IOException, ClassNotFoundException
+
+ /**
+ * @see wicket.version.IPageVersionManager#getVersions()
+ */
+ public int getVersions()
+ {
+ return 0;
+ }
+
+ /**
+ * @see wicket.version.IPageVersionManager#ignoreVersionMerge()
+ */
+ public void ignoreVersionMerge()
{
- s.defaultReadObject();
- // this is an hack.. when object is read in. It must
ignore the first version bump.
- versionStarted = true;
+ currentVersionNumber++;
+ lastAjaxVersionNumber = currentAjaxVersionNumber;
+ currentAjaxVersionNumber = 0;
}
+
/**
* @see wicket.version.IPageVersionManager#rollbackPage(int)
*/
public Page rollbackPage(int numberOfVersions)
{
String sessionId = page.getSession().getId();
- if (sessionId != null)
+ if (sessionId != null)
{
int versionNumber = currentVersionNumber;
int ajaxNumber = currentAjaxVersionNumber;
@@ -253,116 +332,52 @@
versionNumber--;
ajaxNumber--;
}
-
- IPageStore store =
((SecondLevelCacheSessionStore)Application.get().getSessionStore()).getStore();
- // if the number of versions to rollback can be
done inside the current page version.
- if ( ajaxNumber >= numberOfVersions)
+
+ IPageStore store =
((SecondLevelCacheSessionStore)Application.get()
+ .getSessionStore()).getStore();
+ // if the number of versions to rollback can be
done inside the
+ // current page version.
+ if (ajaxNumber >= numberOfVersions)
{
- return store.getPage(sessionId,
page.getPageMap().getName(), page.getNumericId(), versionNumber,
ajaxNumber-numberOfVersions);
+ return store.getPage(sessionId,
page.getPageMap().getName(), page
+ .getNumericId(),
versionNumber, ajaxNumber - numberOfVersions);
}
else
{
// else go one page version down.
versionNumber--;
- // then calculate the previous ajax
version by looking at the last ajax number of the previous version.
- ajaxNumber = lastAjaxVersionNumber -
(numberOfVersions-ajaxNumber);
+ // then calculate the previous ajax
version by looking at
+ // the last ajax number of the previous
version.
+ ajaxNumber = lastAjaxVersionNumber -
(numberOfVersions - ajaxNumber);
if (ajaxNumber < 0)
{
- // currently it is not
supported to jump over 2 pages....
- log.error("trying to rollback
to many versions, jumping over 2 page versions is not supported yet.");
+ // currently it is not
supported to jump over 2
+ // pages....
+ log
+ .error("trying
to rollback to many versions, jumping over 2 page versions is not supported
yet.");
return null;
}
- return store.getPage(sessionId,
page.getPageMap().getName(), page.getNumericId(), versionNumber, ajaxNumber);
+ return store.getPage(sessionId,
page.getPageMap().getName(), page
+ .getNumericId(),
versionNumber, ajaxNumber);
}
}
return null;
}
- /**
- * @see wicket.version.IPageVersionManager#getVersions()
- */
- public int getVersions()
- {
- return 0;
- }
-
- }
-
- private static final class SecondLevelCachePageMap extends PageMap
- {
- private static final long serialVersionUID = 1L;
-
- private Page lastPage = null;
-
- /**
- * Construct.
- *
- * @param name
- * @param session
- */
- private SecondLevelCachePageMap(String name, Session session)
- {
- super(name, session);
- }
-
- 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;
- }
- }
- if (sessionId != null)
- {
- // this is really a page request for a default
page. (so without an ajax version)
- return getStore().getPage(sessionId,getName(),
id, versionNumber,0);
- }
- return null;
- }
-
- public void put(Page page)
- {
- if (!page.isPageStateless())
- {
- String sessionId = getSession().getId();
- if (sessionId != null)
- {
- if(lastPage != page &&
page.getCurrentVersionNumber() == 0)
- {
- // we have to save a new page
directly to the file store
- // so that this version is also
recoverable.
- getStore().storePage(sessionId,
page);
- }
- lastPage = page;
- dirty();
- }
- }
- }
-
- public void removeEntry(IPageMapEntry entry)
+ private void readObject(java.io.ObjectInputStream s) throws
IOException,
+ ClassNotFoundException
{
- String sessionId = getSession().getId();
- if (sessionId != null)
- {
- getStore().removePage(sessionId,
entry.getPage());
- }
+ s.defaultReadObject();
+ // this is an hack.. when object is read in. It must
ignore the
+ // first version bump.
+ versionStarted = true;
}
- private IPageStore getStore()
- {
- return
((SecondLevelCacheSessionStore)Application.get().getSessionStore()).getStore();
- }
}
private IPageStore pageStore;
-
+
/**
* Construct.
*
@@ -371,6 +386,14 @@
public SecondLevelCacheSessionStore(final IPageStore pageStore)
{
this.pageStore = pageStore;
+
+ // turn automatic multiwindow support off by default, as we
don't really
+ // need to be afraid to run out of history with this
implementation.
+ // note that the session store is created before
Application#init is
+ // called, so if users set this setting explicitly, it'll be
overriden
+ // (and that's exactly what we want: provide a better default,
but not
+ // forcing people to do away with this feature).
+
Application.get().getPageSettings().setAutomaticMultiWindowSupport(false);
}
/**
@@ -381,13 +404,14 @@
{
return new SecondLevelCachePageMap(name, session);
}
-
+
/**
- * @see
wicket.protocol.http.HttpSessionStore#newVersionManager(wicket.Page)
+ * @see wicket.protocol.http.AbstractHttpSessionStore#destroy()
*/
- public IPageVersionManager newVersionManager(Page page)
+ public void destroy()
{
- return new SecondLevelCachePageVersionManager(page);
+ super.destroy();
+ getStore().destroy();
}
/**
@@ -399,6 +423,14 @@
}
/**
+ * @see
wicket.protocol.http.HttpSessionStore#newVersionManager(wicket.Page)
+ */
+ public IPageVersionManager newVersionManager(Page page)
+ {
+ return new SecondLevelCachePageVersionManager(page);
+ }
+
+ /**
* @see wicket.session.ISessionStore#setAttribute(wicket.Request,
* java.lang.String, java.lang.Object)
*/
@@ -417,14 +449,5 @@
protected void onUnbind(String sessionId)
{
getStore().unbind(sessionId);
- }
-
- /**
- * @see wicket.protocol.http.AbstractHttpSessionStore#destroy()
- */
- public void destroy()
- {
- super.destroy();
- getStore().destroy();
}
}