Author: ivaynberg
Date: Tue Oct 13 05:37:27 2009
New Revision: 824594

URL: http://svn.apache.org/viewvc?rev=824594&view=rev
Log:
more migration wip

Removed:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Application.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/Session.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/session/
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/ThreadContext.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockSessionStore.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/AbstractHttpSessionStore.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/HttpSessionStore.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/session/ISessionStore.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Application.java Tue 
Oct 13 05:37:27 2009
@@ -18,6 +18,7 @@
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.Serializable;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -47,11 +48,39 @@
 import org.apache.wicket.markup.resolver.ParentResolver;
 import org.apache.wicket.markup.resolver.WicketContainerResolver;
 import org.apache.wicket.markup.resolver.WicketMessageResolver;
+import org.apache.wicket.ng.DefaultExceptionMapper;
+import org.apache.wicket.ng.MetaDataKey;
+import org.apache.wicket.ng.Page2;
+import org.apache.wicket.ng.ThreadContext;
+import org.apache.wicket.ng.WicketRuntimeException;
+import org.apache.wicket.ng.page.PageManager;
+import org.apache.wicket.ng.page.PageManagerContext;
+import org.apache.wicket.ng.page.persistent.DataStore;
+import org.apache.wicket.ng.page.persistent.DefaultPageStore;
+import org.apache.wicket.ng.page.persistent.PageStore;
+import org.apache.wicket.ng.page.persistent.PersistentPageManager;
+import org.apache.wicket.ng.page.persistent.disk.DiskDataStore;
+import org.apache.wicket.ng.request.CompoundRequestMapper;
+import org.apache.wicket.ng.request.Request;
+import org.apache.wicket.ng.request.RequestMapper;
+import org.apache.wicket.ng.request.component.PageParameters;
+import org.apache.wicket.ng.request.component.RequestablePage;
+import org.apache.wicket.ng.request.cycle.RequestCycle;
+import org.apache.wicket.ng.request.cycle.RequestCycleContext;
+import org.apache.wicket.ng.request.handler.impl.RenderPageRequestHandler;
+import 
org.apache.wicket.ng.request.handler.impl.render.RenderPageRequestHandlerDelegate;
+import org.apache.wicket.ng.request.listener.RequestListenerInterface;
+import org.apache.wicket.ng.request.mapper.MapperContext;
+import org.apache.wicket.ng.request.mapper.ThreadsafeCompoundRequestMapper;
+import org.apache.wicket.ng.request.response.Response;
+import org.apache.wicket.ng.resource.ResourceReferenceRegistry;
 import org.apache.wicket.protocol.http.IRequestLogger;
 import org.apache.wicket.protocol.http.RequestLogger;
 import org.apache.wicket.protocol.http.WebApplication;
 import org.apache.wicket.protocol.http.WebSession;
+import org.apache.wicket.session.DefaultPageFactory;
 import org.apache.wicket.session.ISessionStore;
+import org.apache.wicket.session.ISessionStore.UnboundListener;
 import org.apache.wicket.settings.IApplicationSettings;
 import org.apache.wicket.settings.IDebugSettings;
 import org.apache.wicket.settings.IExceptionSettings;
@@ -65,6 +94,7 @@
 import org.apache.wicket.settings.ISessionSettings;
 import org.apache.wicket.settings.Settings;
 import org.apache.wicket.util.convert.ConverterLocator;
+import org.apache.wicket.util.lang.Checks;
 import org.apache.wicket.util.lang.Classes;
 import org.apache.wicket.util.lang.Objects;
 import org.apache.wicket.util.lang.PropertyResolver;
@@ -111,7 +141,7 @@
  * @see org.apache.wicket.protocol.http.WebApplication
  * @author Jonathan Locke
  */
-public abstract class Application
+public abstract class Application implements UnboundListener
 {
        /** Configuration constant for the 2 types */
        public static final String CONFIGURATION = "configuration";
@@ -133,9 +163,6 @@
        private static final Map<String, Application> 
applicationKeyToApplication = new HashMap<String, Application>(
                1);
 
-       /** Thread local holder of the application object. */
-       private static final ThreadLocal<Application> current = new 
ThreadLocal<Application>();
-
        /** Log. */
        private static final Logger log = 
LoggerFactory.getLogger(Application.class);
 
@@ -159,7 +186,7 @@
         */
        public static boolean exists()
        {
-               return current.get() != null;
+               return ThreadContext.getApplication() != null;
        }
 
        /**
@@ -169,7 +196,7 @@
         */
        public static Application get()
        {
-               final Application application = current.get();
+               Application application = ThreadContext.getApplication();
                if (application == null)
                {
                        throw new WicketRuntimeException("There is no 
application attached to current thread " +
@@ -217,7 +244,7 @@
                {
                        throw new IllegalArgumentException("Argument 
application can not be null");
                }
-               current.set(application);
+               ThreadContext.setApplication(this);
        }
 
        /**
@@ -920,8 +947,16 @@
                String applicationKey = getApplicationKey();
                applicationKeyToApplication.put(applicationKey, this);
 
-               sessionStore = newSessionStore();
                converterLocator = newConverterLocator();
+
+               sessionStore = newSessionStore();
+               sessionStore.registerUnboundListener(this);
+               pageManager = newPageManager();
+               pageManager.setContext(getPageManagerContext());
+               rootRequestMapper = newRequestHandlerEncoderRegistry();
+               resourceReferenceRegistry = newResourceReferenceRegistry();
+               pageFactory = newPageFactory();
+               registerDefaultEncoders();
        }
 
        /**
@@ -1191,4 +1226,335 @@
        {
                return true;
        }
+
+       /**
+        * TODO javadoc
+        * 
+        * TODO WICKET NG REVIEW
+        * 
+        * */
+       public void sessionUnbound(String sessionId)
+       {
+               getPageManager().sessionExpired(sessionId);
+       }
+
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+       //
+       // Page Manager
+       //
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+       protected PageManager newPageManager()
+       {
+               int cacheSize = 40;
+               int fileChannelPoolCapacity = 50;
+               DataStore dataStore = new DiskDataStore(getName(), 1000000, 
fileChannelPoolCapacity);
+               PageStore pageStore = new DefaultPageStore(getName(), 
dataStore, cacheSize);
+               return new PersistentPageManager(getName(), pageStore);
+       }
+
+       private PageManager pageManager;
+
+       /**
+        * Context for PageManager to interact with rest of Wicket
+        */
+       private final PageManagerContext pageManagerContext = new 
PageManagerContext()
+       {
+               public void bind()
+               {
+                       Session.get().bind();
+               }
+
+               private final MetaDataKey<Object> requestCycleMetaDataKey = new 
MetaDataKey<Object>()
+               {
+                       private static final long serialVersionUID = 1L;
+               };
+
+               public Object getRequestData()
+               {
+                       RequestCycle requestCycle = RequestCycle.get();
+                       if (requestCycle == null)
+                       {
+                               throw new IllegalStateException("Not a request 
thread.");
+                       }
+                       return 
requestCycle.getMetaData(requestCycleMetaDataKey);
+               }
+
+               public Serializable getSessionAttribute(String key)
+               {
+                       return ThreadContext.getSession().getAttribute(key);
+               }
+
+               public String getSessionId()
+               {
+                       return Session.get().getId();
+               }
+
+               public void setRequestData(Object data)
+               {
+                       RequestCycle requestCycle = RequestCycle.get();
+                       if (requestCycle == null)
+                       {
+                               throw new IllegalStateException("Not a request 
thread.");
+                       }
+                       requestCycle.setMetaData(requestCycleMetaDataKey, data);
+               }
+
+               public void setSessionAttribute(String key, Serializable value)
+               {
+                       Session.get().setAttribute(key, value);
+               }
+       };
+
+       /**
+        * Returns the {...@link PageManager} instance.
+        * 
+        * @return {...@link PageManager} instance.
+        */
+       public PageManager getPageManager()
+       {
+               return pageManager;
+       }
+
+       protected PageManagerContext getPageManagerContext()
+       {
+               return pageManagerContext;
+       }
+
+       /**
+        * TODO WICKET NG MIGRATION - REVIEW
+        * 
+        * Register the default encoders - necessary for the application to 
work.
+        */
+       protected void registerDefaultEncoders()
+       {
+
+       }
+
+       /**
+        * TODO WICKET NG MIGRATION - REVIEW
+        */
+       public final MapperContext getEncoderContext()
+       {
+               return encoderContext;
+       }
+
+       /**
+        * TODO WICKET NG MIGRATION - REVIEW
+        */
+       public void registerEncoder(RequestMapper encoder)
+       {
+               getRootRequestMapper().register(encoder);
+       }
+
+       private final MapperContext encoderContext = new MapperContext()
+       {
+               public String getBookmarkableIdentifier()
+               {
+                       return "bookmarkable";
+               }
+
+               public String getNamespace()
+               {
+                       return "wicket";
+               }
+
+               public String getPageIdentifier()
+               {
+                       return "page";
+               }
+
+               public String getResourceIdentifier()
+               {
+                       return "resource";
+               }
+
+               public ResourceReferenceRegistry getResourceReferenceRegistry()
+               {
+                       return Application.this.getResourceReferenceRegistry();
+               }
+
+               public RequestListenerInterface 
requestListenerInterfaceFromString(String interfaceName)
+               {
+                       return RequestListenerInterface.forName(interfaceName);
+               }
+
+               public String 
requestListenerInterfaceToString(RequestListenerInterface listenerInterface)
+               {
+                       return listenerInterface.getName();
+               }
+
+               public RequestablePage newPageInstance(Class<? extends 
RequestablePage> pageClass,
+                       PageParameters pageParameters)
+               {
+                       if (pageParameters == null)
+                       {
+                               return getPageFactory().newPage(pageClass);
+                       }
+                       else
+                       {
+                               return getPageFactory().newPage(pageClass, 
pageParameters);
+                       }
+               }
+
+               public RequestablePage getPageInstance(int pageId)
+               {
+                       return Page2.get(pageId);
+               }
+
+               public Class<? extends RequestablePage> getHomePageClass()
+               {
+                       return Application.this.getHomePage();
+               }
+       };
+       private CompoundRequestMapper rootRequestMapper;
+
+       /**
+        * Override to create custom {...@link ThreadsafeCompoundRequestMapper}.
+        * 
+        * @return new {...@link ThreadsafeCompoundRequestMapper} instance
+        */
+       protected CompoundRequestMapper newRequestHandlerEncoderRegistry()
+       {
+               return new ThreadsafeCompoundRequestMapper();
+       };
+
+       /**
+        * returns the {...@link ThreadsafeCompoundRequestMapper} for this 
application.
+        * 
+        * @return
+        */
+       public final CompoundRequestMapper getRootRequestMapper()
+       {
+               return rootRequestMapper;
+       }
+
+       /**
+        * Returns {...@link PageFactory} for this application.
+        * 
+        * @return
+        */
+       public final IPageFactory getPageFactory()
+       {
+               return pageFactory;
+       }
+
+       private IPageFactory pageFactory;
+
+       /**
+        * Override to create custom {...@link PageFactory}
+        * 
+        * @return new {...@link PageFactory} instance.
+        */
+       protected IPageFactory newPageFactory()
+       {
+               return new DefaultPageFactory();
+       }
+
+       private ResourceReferenceRegistry resourceReferenceRegistry;
+
+       /**
+        * Override to create custom {...@link ResourceReferenceRegistry}.
+        * 
+        * @return new {...@link ResourceReferenceRegistry} instance.
+        */
+       protected ResourceReferenceRegistry newResourceReferenceRegistry()
+       {
+               return new ResourceReferenceRegistry();
+       }
+
+       /**
+        * Returns {...@link ResourceReferenceRegistry} for this application.
+        * 
+        * @return
+        */
+       public final ResourceReferenceRegistry getResourceReferenceRegistry()
+       {
+               return resourceReferenceRegistry;
+       }
+
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+       //
+       // Page Rendering
+       //
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+       // 
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+       /**
+        * Returns the {...@link RenderPageRequestHandlerDelegate} responsible 
for rendering the page.
+        */
+       public abstract RenderPageRequestHandlerDelegate 
getRenderPageRequestHandlerDelegate(
+               RenderPageRequestHandler renderPageRequestHandler);
+
+       protected abstract Session newSession(RequestCycle requestCycle);
+
+
+       Session fetchCreateAndSetSession(RequestCycle requestCycle)
+       {
+               Checks.argumentNotNull(requestCycle, "requestCycle");
+
+               Session session = 
getSessionStore().lookup(requestCycle.getRequest());
+               if (session == null)
+               {
+                       session = newSession(requestCycle);
+                       ThreadContext.setSession(session);
+                       getPageManager().newSessionCreated();
+               }
+               else
+               {
+                       ThreadContext.setSession(session);
+               }
+               return session;
+       }
+
+       public final RequestCycle createRequestCycle(Request request, Response 
response)
+       {
+               // FIXME exception mapper should come from elsewhere
+               RequestCycleContext context = new RequestCycleContext(request, 
response,
+                       getRootRequestMapper(), new DefaultExceptionMapper());
+
+               RequestCycle requestCycle = newRequestCycle(context);
+               requestCycle.register(new RequestCycle.DetachCallback()
+               {
+                       public void onDetach(RequestCycle requestCycle)
+                       {
+                               getPageManager().commitRequest();
+                       }
+               });
+               return requestCycle;
+       }
+
+       /**
+        * Override this method to create custom Request Cycle instance.
+        * 
+        * @param context
+        *            holds context necessary to instantiate a request cycle, 
such as the current
+        *            request, response, and request mappers
+        * @return
+        */
+       protected RequestCycle newRequestCycle(RequestCycleContext context)
+       {
+
+               return new RequestCycle(context);
+       }
+
+       /**
+        * Destroys the application.
+        */
+       public void destroy()
+       {
+               try
+               {
+                       pageManager.destroy();
+                       sessionStore.destroy();
+               }
+               finally
+               {
+                       applications.remove(name);
+               }
+       }
+
 }

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/Session.java Tue Oct 13 
05:37:27 2009
@@ -33,6 +33,7 @@
 import org.apache.wicket.authorization.IAuthorizationStrategy;
 import org.apache.wicket.feedback.FeedbackMessage;
 import org.apache.wicket.feedback.FeedbackMessages;
+import org.apache.wicket.ng.ThreadContext;
 import org.apache.wicket.protocol.http.IgnoreAjaxRequestException;
 import org.apache.wicket.request.ClientInfo;
 import org.apache.wicket.session.ISessionStore;
@@ -161,9 +162,6 @@
        /** Name of session attribute under which this session is stored */
        public static final String SESSION_ATTRIBUTE_NAME = "session";
 
-       /** Thread-local current session. */
-       private static final ThreadLocal<Session> current = new 
ThreadLocal<Session>();
-
        /** A store for dirty objects for one request */
        private static final ThreadLocal<List<IClusterable>> dirtyObjects = new 
ThreadLocal<List<IClusterable>>();
 
@@ -189,7 +187,7 @@
         */
        public static boolean exists()
        {
-               return current.get() != null;
+               return ThreadContext.getSession() != null;
        }
 
        /**
@@ -246,7 +244,7 @@
         */
        public static Session get()
        {
-               Session session = current.get();
+               Session session = ThreadContext.getSession();
                if (session == null)
                {
                        session = findOrCreate();
@@ -269,7 +267,7 @@
                        throw new IllegalArgumentException("Argument session 
can not be null");
                }
 
-               current.set(session);
+               ThreadContext.setSession(session);
 
                // execute any attach logic now
                session.attach();
@@ -283,7 +281,7 @@
         */
        public static void unset()
        {
-               current.set(null);
+               ThreadContext.setSession(null);
        }
 
        /** A number to generate names for auto create pagemaps */
@@ -342,7 +340,7 @@
         * instance).
         * </p>
         */
-       private transient Map<String, Object> temporarySessionAttributes;
+       private transient Map<String, Serializable> temporarySessionAttributes;
 
        /** A linked list for last used pagemap queue */
        private final LinkedList/* <IPageMap> */<IPageMap> usedPageMaps = new 
LinkedList<IPageMap>();
@@ -400,7 +398,7 @@
 
                        if (temporarySessionAttributes != null)
                        {
-                               for (Entry<String, Object> entry : 
temporarySessionAttributes.entrySet())
+                               for (Entry<String, Serializable> entry : 
temporarySessionAttributes.entrySet())
                                {
                                        store.setAttribute(request, 
String.valueOf(entry.getKey()), entry.getValue());
                                }
@@ -1260,7 +1258,7 @@
         * @param value
         *            The value of the attribute
         */
-       protected final void setAttribute(String name, Object value)
+       protected final void setAttribute(String name, Serializable value)
        {
                if (!isTemporary())
                {
@@ -1299,7 +1297,7 @@
                        // session instance gets shared across threads
                        if (temporarySessionAttributes == null)
                        {
-                               temporarySessionAttributes = new 
HashMap<String, Object>(3);
+                               temporarySessionAttributes = new 
HashMap<String, Serializable>(3);
                        }
                        temporarySessionAttributes.put(name, value);
                }
@@ -1396,7 +1394,7 @@
                List<IClusterable> dirtyObjects = Session.dirtyObjects.get();
                Session.dirtyObjects.set(null);
 
-               Map<String, Object> tempMap = new HashMap<String, Object>();
+               Map<String, Serializable> tempMap = new HashMap<String, 
Serializable>();
 
                // Go through all dirty entries, replicating any dirty objects
                if (dirtyObjects != null)
@@ -1404,7 +1402,7 @@
                        for (final Iterator<IClusterable> iterator = 
dirtyObjects.iterator(); iterator.hasNext();)
                        {
                                String attribute = null;
-                               Object object = iterator.next();
+                               IClusterable object = iterator.next();
                                if (object instanceof Page)
                                {
                                        final Page page = (Page)object;
@@ -1437,7 +1435,7 @@
                // in case we have dirty attributes, set them to session
                if (tempMap.isEmpty() == false)
                {
-                       for (Entry<String, Object> entry : tempMap.entrySet())
+                       for (Entry<String, Serializable> entry : 
tempMap.entrySet())
                        {
                                setAttribute(entry.getKey(), entry.getValue());
                        }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/ThreadContext.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/ThreadContext.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/ThreadContext.java 
(original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/ThreadContext.java 
Tue Oct 13 05:37:27 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.ng;
 
+import org.apache.wicket.Session;
 import org.apache.wicket.ng.request.cycle.RequestCycle;
 
 public class ThreadContext

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockApplication.java
 Tue Oct 13 05:37:27 2009
@@ -25,7 +25,7 @@
 import org.apache.wicket.ng.request.mapper.BookmarkableMapper;
 import org.apache.wicket.ng.request.mapper.PageInstanceMapper;
 import org.apache.wicket.ng.request.mapper.ResourceReferenceMapper;
-import org.apache.wicket.ng.session.SessionStore;
+import org.apache.wicket.session.ISessionStore;
 
 public class MockApplication extends Application
 {
@@ -68,7 +68,7 @@
        }
 
        @Override
-       protected SessionStore newSessionStore()
+       public ISessionStore newSessionStore()
        {
                return new MockSessionStore();
        }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockSessionStore.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockSessionStore.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockSessionStore.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/mock/MockSessionStore.java
 Tue Oct 13 05:37:27 2009
@@ -17,23 +17,28 @@
 package org.apache.wicket.ng.mock;
 
 import java.io.Serializable;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArraySet;
 
-import org.apache.wicket.ng.Session;
+import org.apache.wicket.IPageMap;
+import org.apache.wicket.Page;
+import org.apache.wicket.Session;
 import org.apache.wicket.ng.request.Request;
-import org.apache.wicket.ng.session.SessionStore;
+import org.apache.wicket.session.ISessionStore;
+import org.apache.wicket.version.IPageVersionManager;
 
 /**
  * Session store that holds one session.
  * 
  * @author Matej Knopp
  */
-public class MockSessionStore implements SessionStore
+public class MockSessionStore implements ISessionStore
 {
 
        public MockSessionStore()
@@ -118,4 +123,70 @@
                unboundListeners.remove(listener);
        }
 
+       // EVERYTHING BELOW WAS AUTOMATICALLY STUBBED 
OUT////////////////////////////////
+
+       public void bind(org.apache.wicket.Request request, Session newSession)
+       {
+       }
+
+       public IPageMap createPageMap(String name)
+       {
+               return null;
+       }
+
+       public Serializable getAttribute(org.apache.wicket.Request request, 
String name)
+       {
+               return null;
+       }
+
+       public List<String> getAttributeNames(org.apache.wicket.Request request)
+       {
+               return null;
+       }
+
+       public String getSessionId(org.apache.wicket.Request request, boolean 
create)
+       {
+               return null;
+       }
+
+       public Collection<UnboundListener> getUnboundListeners()
+       {
+               return null;
+       }
+
+       public void invalidate(org.apache.wicket.Request request)
+       {
+       }
+
+       public Session lookup(org.apache.wicket.Request request)
+       {
+               return null;
+       }
+
+       public IPageVersionManager newVersionManager(Page page)
+       {
+               return null;
+       }
+
+       public void onBeginRequest(org.apache.wicket.Request request)
+       {
+       }
+
+       public void onEndRequest(org.apache.wicket.Request request)
+       {
+       }
+
+       public void removeAttribute(org.apache.wicket.Request request, String 
name)
+       {
+       }
+
+       public void setAttribute(org.apache.wicket.Request request, String 
name, Serializable value)
+       {
+       }
+
+       public void unbind(String sessionId)
+       {
+       }
+
+
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/protocol/http/WebApplication.java
 Tue Oct 13 05:37:27 2009
@@ -29,8 +29,8 @@
 import 
org.apache.wicket.ng.request.handler.impl.render.WebRenderPageRequestHandlerDelegate;
 import org.apache.wicket.ng.request.mapper.SystemMapper;
 import org.apache.wicket.ng.request.response.BufferedWebResponse;
-import org.apache.wicket.ng.session.HttpSessionStore;
-import org.apache.wicket.ng.session.SessionStore;
+import org.apache.wicket.protocol.http.HttpSessionStore;
+import org.apache.wicket.session.ISessionStore;
 
 /**
  * 
@@ -40,82 +40,82 @@
 public abstract class WebApplication extends Application
 {
 
-    public WebApplication()
-    {
-        super();
-    }
-
-    @Override
-    protected void registerDefaultEncoders()
-    {
-        registerEncoder(new SystemMapper());
-    }
-
-    public void mount(RequestMapper encoder)
-    {
-        registerEncoder(encoder);
-    }
-
-    // TODO: Do this properly
-    private Map<String, BufferedWebResponse> storedResponses = new 
ConcurrentHashMap<String, BufferedWebResponse>();
-
-    public boolean hasBufferedResponse(String sessionId, Url url)
-    {
-        String key = sessionId + url.toString();
-        return storedResponses.containsKey(key);
-    }
-
-    public BufferedWebResponse getAndRemoveBufferedResponse(String sessionId, 
Url url)
-    {
-        String key = sessionId + url.toString();
-        return storedResponses.remove(key);
-    }
-
-    public void storeBufferedResponse(String sessionId, Url url, 
BufferedWebResponse response)
-    {
-        String key = sessionId + url.toString();
-        storedResponses.put(key, response);
-    }
-
-    @Override
-    protected SessionStore newSessionStore()
-    {
-        return new HttpSessionStore(this);
-    }
-
-    /**
-     * Gets the servlet context for this application. Use this to get 
references to absolute paths,
-     * global web.xml parameters (&lt;context-param&gt;), etc.
-     * 
-     * @return The servlet context for this application
-     */
-    public ServletContext getServletContext()
-    {
-        if (wicketFilter != null)
-        {
-            return wicketFilter.getFilterConfig().getServletContext();
-        }
-        throw new IllegalStateException("servletContext is not set yet. Any 
code in your"
-                + " Application object that uses the wicket filter instance 
should be put"
-                + " in the init() method instead of your constructor");
-    }
-
-    public void setWicketFilter(WicketFilter wicketFilter)
-    {
-        this.wicketFilter = wicketFilter;
-    }
-
-    private WicketFilter wicketFilter;
-
-    @Override
-    public RenderPageRequestHandlerDelegate 
getRenderPageRequestHandlerDelegate(
-            RenderPageRequestHandler renderPageRequestHandler)
-    {
-        return new 
WebRenderPageRequestHandlerDelegate(renderPageRequestHandler);
-    }
-
-    public static WebApplication get()
-    {
-        return (WebApplication)Application.get();
-    }
+       public WebApplication()
+       {
+               super();
+       }
+
+       @Override
+       protected void registerDefaultEncoders()
+       {
+               registerEncoder(new SystemMapper());
+       }
+
+       public void mount(RequestMapper encoder)
+       {
+               registerEncoder(encoder);
+       }
+
+       // TODO: Do this properly
+       private final Map<String, BufferedWebResponse> storedResponses = new 
ConcurrentHashMap<String, BufferedWebResponse>();
+
+       public boolean hasBufferedResponse(String sessionId, Url url)
+       {
+               String key = sessionId + url.toString();
+               return storedResponses.containsKey(key);
+       }
+
+       public BufferedWebResponse getAndRemoveBufferedResponse(String 
sessionId, Url url)
+       {
+               String key = sessionId + url.toString();
+               return storedResponses.remove(key);
+       }
+
+       public void storeBufferedResponse(String sessionId, Url url, 
BufferedWebResponse response)
+       {
+               String key = sessionId + url.toString();
+               storedResponses.put(key, response);
+       }
+
+       @Override
+       protected ISessionStore newSessionStore()
+       {
+               return new HttpSessionStore(this);
+       }
+
+       /**
+        * Gets the servlet context for this application. Use this to get 
references to absolute paths,
+        * global web.xml parameters (&lt;context-param&gt;), etc.
+        * 
+        * @return The servlet context for this application
+        */
+       public ServletContext getServletContext()
+       {
+               if (wicketFilter != null)
+               {
+                       return 
wicketFilter.getFilterConfig().getServletContext();
+               }
+               throw new IllegalStateException("servletContext is not set yet. 
Any code in your"
+                       + " Application object that uses the wicket filter 
instance should be put"
+                       + " in the init() method instead of your constructor");
+       }
+
+       public void setWicketFilter(WicketFilter wicketFilter)
+       {
+               this.wicketFilter = wicketFilter;
+       }
+
+       private WicketFilter wicketFilter;
+
+       @Override
+       public RenderPageRequestHandlerDelegate 
getRenderPageRequestHandlerDelegate(
+               RenderPageRequestHandler renderPageRequestHandler)
+       {
+               return new 
WebRenderPageRequestHandlerDelegate(renderPageRequestHandler);
+       }
+
+       public static WebApplication get()
+       {
+               return (WebApplication)Application.get();
+       }
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/handler/impl/render/WebRenderPageRequestHandlerDelegate.java
 Tue Oct 13 05:37:27 2009
@@ -17,7 +17,7 @@
 package org.apache.wicket.ng.request.handler.impl.render;
 
 import org.apache.wicket.ng.Application;
-import org.apache.wicket.ng.Session;
+import org.apache.wicket.ng.ThreadContext;
 import org.apache.wicket.ng.protocol.http.WebApplication;
 import org.apache.wicket.ng.request.Url;
 import org.apache.wicket.ng.request.component.RequestablePage;
@@ -66,12 +66,12 @@
 
        protected String getSessionId()
        {
-               return Session.get().getId();
+               return ThreadContext.getSession().getId();
        }
 
        protected boolean isSessionTemporary()
        {
-               return Session.get().isTemporary();
+               return ThreadContext.getSession().isTemporary();
        }
 
        protected BufferedWebResponse getAndRemoveBufferedResponse(Url url)

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/ng/request/mapper/BufferedResponseMapper.java
 Tue Oct 13 05:37:27 2009
@@ -16,7 +16,7 @@
  */
 package org.apache.wicket.ng.request.mapper;
 
-import org.apache.wicket.ng.Session;
+import org.apache.wicket.ng.ThreadContext;
 import org.apache.wicket.ng.protocol.http.WebApplication;
 import org.apache.wicket.ng.request.Request;
 import org.apache.wicket.ng.request.RequestHandler;
@@ -40,7 +40,7 @@
 
        protected String getSessionId()
        {
-               return Session.get().getId();
+               return ThreadContext.getSession().getId();
        }
 
        protected boolean hasBufferedResponse(Url url)

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/AbstractHttpSessionStore.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/AbstractHttpSessionStore.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/AbstractHttpSessionStore.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/AbstractHttpSessionStore.java
 Tue Oct 13 05:37:27 2009
@@ -17,6 +17,10 @@
 package org.apache.wicket.protocol.http;
 
 import java.io.Serializable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 import javax.servlet.http.HttpSession;
 import javax.servlet.http.HttpSessionBindingEvent;
@@ -94,7 +98,13 @@
                                Application application = 
Application.get(applicationKey);
                                if (application != null)
                                {
-                                       
application.getSessionStore().unbind(sessionId);
+                                       ISessionStore sessionStore = 
application.getSessionStore();
+                                       sessionStore.unbind(sessionId);
+
+                                       for (UnboundListener listener : 
sessionStore.getUnboundListeners())
+                                       {
+                                               
listener.sessionUnbound(sessionId);
+                                       }
                                }
                        }
                }
@@ -329,4 +339,25 @@
                }
                return (WebRequest)request;
        }
+
+       /** TODO javadoc */
+       private final Set<UnboundListener> unboundListeners = new 
CopyOnWriteArraySet<UnboundListener>();
+
+       /** TODO javadoc */
+       public void registerUnboundListener(UnboundListener listener)
+       {
+               unboundListeners.add(listener);
+       }
+
+       /** TODO javadoc */
+       public void unregisterUnboundListener(UnboundListener listener)
+       {
+               unboundListeners.remove(listener);
+       }
+
+       /** TODO javadoc */
+       public 
Collection<org.apache.wicket.session.ISessionStore.UnboundListener> 
getUnboundListeners()
+       {
+               return Collections.unmodifiableCollection(unboundListeners);
+       }
 }

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/HttpSessionStore.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/HttpSessionStore.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/HttpSessionStore.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/HttpSessionStore.java
 Tue Oct 13 05:37:27 2009
@@ -16,6 +16,7 @@
  */
 package org.apache.wicket.protocol.http;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.List;
@@ -27,6 +28,8 @@
 import org.apache.wicket.IPageMap;
 import org.apache.wicket.Request;
 import org.apache.wicket.Session;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 
 /**
@@ -34,9 +37,15 @@
  * {...@link javax.servlet.http.HttpSession} to store its attributes.
  * 
  * @author Eelco Hillenius
+ * @author Matej Knopp
+ * @author Igor Vaynberg
  */
 public class HttpSessionStore extends AbstractHttpSessionStore
 {
+
+       /** log. */
+       private static Logger logger = 
LoggerFactory.getLogger(HttpSessionStore.class);
+
        /**
         * Construct.
         * 
@@ -57,16 +66,16 @@
        }
 
        /**
-        * @see 
org.apache.wicket.session.ISessionStore#getAttribute(org.apache.wicket.Request,
-        *      java.lang.String)
+        * @{inheritDoc
         */
-       public Object getAttribute(Request request, String name)
+       public Serializable getAttribute(Request request, String name)
        {
                WebRequest webRequest = toWebRequest(request);
                HttpSession httpSession = getHttpSession(webRequest);
                if (httpSession != null)
                {
-                       return 
httpSession.getAttribute(getSessionAttributePrefix(webRequest) + name);
+                       return 
(Serializable)httpSession.getAttribute(getSessionAttributePrefix(webRequest) +
+                               name);
                }
                return null;
        }
@@ -129,7 +138,7 @@
         * @see 
org.apache.wicket.session.ISessionStore#setAttribute(Request,java.lang.String,
         *      java.lang.Object)
         */
-       public void setAttribute(Request request, String name, Object value)
+       public void setAttribute(Request request, String name, Serializable 
value)
        {
                // ignore call if the session was marked invalid
                if (!isSessionValid())
@@ -190,4 +199,6 @@
                return true; // we simply don't know, so play safe and rely on
                // servlet container's code to check availability
        }
+
+
 }
\ No newline at end of file

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/protocol/http/SecondLevelCacheSessionStore.java
 Tue Oct 13 05:37:27 2009
@@ -747,7 +747,7 @@
         *      java.lang.String, java.lang.Object)
         */
        @Override
-       public void setAttribute(Request request, String name, Object value)
+       public void setAttribute(Request request, String name, Serializable 
value)
        {
                // ignore all pages, they are stored through the pagemap
                if (!(value instanceof Page))

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/session/ISessionStore.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/session/ISessionStore.java?rev=824594&r1=824593&r2=824594&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/session/ISessionStore.java 
(original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/session/ISessionStore.java 
Tue Oct 13 05:37:27 2009
@@ -16,6 +16,8 @@
  */
 package org.apache.wicket.session;
 
+import java.io.Serializable;
+import java.util.Collection;
 import java.util.List;
 
 import javax.servlet.http.HttpSession;
@@ -32,6 +34,7 @@
  * 
  * @author Eelco Hillenius
  * @author Johan Compagner
+ * @author Matej Knopp
  */
 public interface ISessionStore
 {
@@ -44,7 +47,7 @@
         *            The name of the attribute to store
         * @return The value of the attribute
         */
-       Object getAttribute(Request request, final String name);
+       Serializable getAttribute(Request request, final String name);
 
        /**
         * @param request
@@ -83,7 +86,7 @@
         * @param value
         *            the value of the attribute
         */
-       void setAttribute(Request request, String name, Object value);
+       void setAttribute(Request request, String name, Serializable value);
 
        /**
         * Get the session id for the provided request. If create is false and 
the creation of the
@@ -165,4 +168,33 @@
         * Called when the WebApplication is destroyed.
         */
        void destroy();
+
+       /**
+        * Listener invoked when session is unbound.
+        * 
+        * @author Matej Knopp
+        */
+       public interface UnboundListener
+       {
+               public void sessionUnbound(String sessionId);
+       };
+
+       /**
+        * Registers listener invoked when session is unbound.
+        * 
+        * @param listener
+        */
+       public void registerUnboundListener(UnboundListener listener);
+
+       /**
+        * Unregisters listener invoked when session is unbound.
+        * 
+        * @param listener
+        */
+       public void unregisterUnboundListener(UnboundListener listener);
+
+       /**
+        * @return immutable collection of unbound listeners
+        */
+       public Collection<UnboundListener> getUnboundListeners();
 }


Reply via email to