📄 secondlevelcachesessionstore.java
字号:
} private void writeObject(java.io.ObjectOutputStream s) throws IOException { s.defaultWriteObject(); IPageStore store = getPageStore(); // for IClusteredPageStore we just skip serializing the page, pagestore takes care of it if (sessionId != null && store instanceof IClusteredPageStore == false) { Object page = lastPage; if (store instanceof ISerializationAwarePageStore) { page = ((ISerializationAwarePageStore)store).prepareForSerialization(sessionId, page); } try { s.writeObject(page); } catch (Exception e) { throw new WicketRuntimeException("Failed to serialize " + page.toString(), e); } } } private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); IPageStore store = getPageStore(); if (sessionId != null && store instanceof IClusteredPageStore == false) { Object lastPage = s.readObject(); if (store instanceof ISerializationAwarePageStore) { lastPage = ((ISerializationAwarePageStore)store).restoreAfterSerialization((Serializable)lastPage); } this.lastPage = lastPage; } } } /** * version manager for this session store. */ private static final class SecondLevelCachePageVersionManager implements IPageVersionManager { private static final long serialVersionUID = 1L; private short currentVersionNumber; private short currentAjaxVersionNumber; private short lastAjaxVersionNumber; private final Page page; private transient boolean versionStarted; /** * Construct. * * @param page */ public SecondLevelCachePageVersionManager(Page page) { this.page = page; } /** * @see org.apache.wicket.version.IPageVersionManager#beginVersion(boolean) */ public void beginVersion(boolean mergeVersion) { // this is an hack.. when object is read in. It must ignore the // first version bump. if (versionStarted) { return; } versionStarted = true; if (!mergeVersion) { // TODO: Skip existing versions! (Ask pagestore for last // version) currentVersionNumber++; lastAjaxVersionNumber = currentAjaxVersionNumber; currentAjaxVersionNumber = 0; } else { if (RequestCycle.get().getRequest() instanceof WebRequest && ((WebRequest)RequestCycle.get().getRequest()).isAjax()) { currentAjaxVersionNumber++; } } } /** * @see org.apache.wicket.version.IPageVersionManager#componentAdded(org.apache.wicket.Component) */ public void componentAdded(Component component) { } /** * @see org.apache.wicket.version.IPageVersionManager#componentModelChanging(org.apache.wicket.Component) */ public void componentModelChanging(Component component) { } /** * @see org.apache.wicket.version.IPageVersionManager#componentRemoved(org.apache.wicket.Component) */ public void componentRemoved(Component component) { } /** * @see org.apache.wicket.version.IPageVersionManager#componentStateChanging(org.apache.wicket.version.undo.Change) */ public void componentStateChanging(Change change) { } /** * @see org.apache.wicket.version.IPageVersionManager#endVersion(boolean) */ public void endVersion(boolean mergeVersion) { versionStarted = false; String sessionId = page.getSession().getId(); if (sessionId != null) { page.getSession().touch(page); } } /** * @see org.apache.wicket.version.IPageVersionManager#expireOldestVersion() */ public void expireOldestVersion() { } /** * @see org.apache.wicket.version.IPageVersionManager#getAjaxVersionNumber() */ public int getAjaxVersionNumber() { return currentAjaxVersionNumber; } /** * @see org.apache.wicket.version.IPageVersionManager#getCurrentVersionNumber() */ public int getCurrentVersionNumber() { return currentVersionNumber; } /** * @see org.apache.wicket.version.IPageVersionManager#getVersion(int) */ public Page getVersion(int versionNumber) { if (currentVersionNumber == versionNumber) { return page; } return null; } /** * @see org.apache.wicket.version.IPageVersionManager#getVersions() */ public int getVersions() { return 0; } /** * @see org.apache.wicket.version.IPageVersionManager#ignoreVersionMerge() */ public void ignoreVersionMerge() { currentVersionNumber++; lastAjaxVersionNumber = currentAjaxVersionNumber; currentAjaxVersionNumber = 0; } /** * @see org.apache.wicket.version.IPageVersionManager#rollbackPage(int) */ public Page rollbackPage(int numberOfVersions) { String sessionId = page.getSession().getId(); if (sessionId != null) { int versionNumber = currentVersionNumber; int ajaxNumber = currentAjaxVersionNumber; if (versionStarted) { 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) { return store.getPage(sessionId, page.getPageMapName(), 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); 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."); return null; } return store.getPage(sessionId, page.getPageMapName(), page.getNumericId(), versionNumber, ajaxNumber); } } return null; } private void readObject(java.io.ObjectInputStream s) throws IOException, ClassNotFoundException { s.defaultReadObject(); // this is an hack.. when object is read in. It must ignore the // first version bump. // (matej_k) for now, I'm commenting it out. It causes serious // trouble with back // button, where new versions are not created as they should be // johan promised to look at it soon // versionStarted = true; } } static final ThreadLocal usedPages = new ThreadLocal(); /** * @return */ public static ThreadLocal getUsedPages() { return usedPages; } private final IPageStore pageStore; /** * Construct. * * @param application * The application for this store * * @param pageStore * Page store for keeping page versions */ public SecondLevelCacheSessionStore(Application application, final IPageStore pageStore) { super(application); this.pageStore = pageStore; // turn automatic multi window 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 overridden // (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); } /** * @see org.apache.wicket.protocol.http.HttpSessionStore#createPageMap(java.lang.String, * org.apache.wicket.Session) */ public IPageMap createPageMap(String name) { return new SecondLevelCachePageMap(Session.get().getId(), Application.get(), name); } /** * @see org.apache.wicket.protocol.http.AbstractHttpSessionStore#onEndRequest(org.apache.wicket.Request) */ public void onEndRequest(Request request) { super.onEndRequest(request); usedPages.set(null); } /** * @see org.apache.wicket.protocol.http.AbstractHttpSessionStore#destroy() */ public void destroy() { super.destroy(); getStore().destroy(); } /** * @return The store to use */ public IPageStore getStore() { return pageStore; } /** * @see org.apache.wicket.protocol.http.HttpSessionStore#newVersionManager(org.apache.wicket.Page) */ public IPageVersionManager newVersionManager(Page page) { return new SecondLevelCachePageVersionManager(page); } /** * @see org.apache.wicket.session.ISessionStore#setAttribute(org.apache.wicket.Request, * java.lang.String, java.lang.Object) */ public void setAttribute(Request request, String name, Object value) { // ignore all pages, they are stored through the pagemap if (!(value instanceof Page)) { super.setAttribute(request, name, value); } } /** * @see org.apache.wicket.protocol.http.AbstractHttpSessionStore#onUnbind(java.lang.String) */ protected void onUnbind(String sessionId) { getStore().unbind(sessionId); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -