You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/12/22 20:03:11 UTC

svn commit: r1425335 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/cdi/ tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/ tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/

Author: rmannibucau
Date: Sat Dec 22 19:03:11 2012
New Revision: 1425335

URL: http://svn.apache.org/viewvc?rev=1425335&view=rev
Log:
TOMEE-676 initial work to save session scoped beans in http session

Added:
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
Modified:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
    openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBValve.java

Modified: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java?rev=1425335&r1=1425334&r2=1425335&view=diff
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java (original)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java Sat Dec 22 19:03:11 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.cdi;
 
+import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.webbeans.config.OWBLogConst;
@@ -53,6 +54,9 @@ import java.lang.annotation.Annotation;
 public class CdiAppContextsService extends AbstractContextsService implements ContextsService {
 
     private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), CdiAppContextsService.class);
+
+    private static final String SESSION_CONTEXT_CLAZZ = SystemInstance.get().getProperty("openejb.session-context", null);
+
     private final ThreadLocal<RequestContext> requestContext = new ThreadLocal<RequestContext>();
 
     private final ThreadLocal<SessionContext> sessionContext = new ThreadLocal<SessionContext>();
@@ -314,7 +318,7 @@ public class CdiAppContextsService exten
 
         //No current context
         if (currentSessionContext == null) {
-            currentSessionContext = new SessionContext();
+            currentSessionContext = newSessionContext();
             sessionCtxManager.addNewSessionContext(sessionId, currentSessionContext);
         }
         //Activate
@@ -324,6 +328,18 @@ public class CdiAppContextsService exten
         sessionContext.set(currentSessionContext);
     }
 
+    private SessionContext newSessionContext() {
+        if (SESSION_CONTEXT_CLAZZ != null) {
+            try {
+                return (SessionContext) Thread.currentThread().getContextClassLoader()
+                            .loadClass(SESSION_CONTEXT_CLAZZ).newInstance();
+            } catch (Exception e) {
+                logger.error("Can't instantiate " + SESSION_CONTEXT_CLAZZ + ", using default session context", e);
+            }
+        }
+        return new SessionContext();
+    }
+
     /**
      * Destroys the session context and all of its components at the end of the
      * session.

Modified: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBValve.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBValve.java?rev=1425335&r1=1425334&r2=1425335&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBValve.java (original)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBValve.java Sat Dec 22 19:03:11 2012
@@ -25,26 +25,35 @@ import org.apache.openejb.spi.SecuritySe
 import org.apache.openejb.util.OpenEjbVersion;
 
 import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
 import java.io.IOException;
 
 public class OpenEJBValve extends ValveBase {
     protected TomcatSecurityService securityService;
     protected static final String info = OpenEJBValve.class.getName() + "/" + OpenEjbVersion.get().getVersion();
 
+    protected static final ThreadLocal<HttpServletRequest> REQUEST = new ThreadLocal<HttpServletRequest>();
+
     public OpenEJBValve() {
         super(true);
         securityService = getSecurityService();
     }
 
+    public static HttpServletRequest request() {
+        return REQUEST.get();
+    }
+
     public void invoke(Request request, Response response) throws IOException, ServletException {
         OpenEJBSecurityListener listener = new OpenEJBSecurityListener(securityService, request);
 
         if (!request.isAsync()) {
+            REQUEST.set(request);
             listener.enter();
             try {
                 getNext().invoke(request, response);
             } finally {
                 listener.exit();
+                REQUEST.remove();
             }
         } else {
             request.getAsyncContext().addListener(new OpenEJBSecurityListener(securityService, request));

Added: openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java?rev=1425335&view=auto
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java (added)
+++ openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java Sat Dec 22 19:03:11 2012
@@ -0,0 +1,90 @@
+package org.apache.tomee.catalina.cdi;
+
+import org.apache.tomee.catalina.OpenEJBValve;
+import org.apache.webbeans.context.SessionContext;
+import org.apache.webbeans.context.creational.BeanInstanceBag;
+
+import javax.enterprise.context.spi.Contextual;
+import javax.servlet.http.HttpSession;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+public class SessionContextBackedByHttpSession extends SessionContext {
+    @Override
+    public void setComponentInstanceMap() {
+        componentInstanceMap = new HttpSessionMap();
+    }
+
+    protected static HttpSession session() {
+        return OpenEJBValve.request().getSession(true);
+    }
+
+    private static class HttpSessionMap implements Map<Contextual<?>,BeanInstanceBag<?>> {
+        @Override
+        public int size() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isEmpty() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean containsKey(Object key) {
+            return session().getAttribute(key.toString()) != null;
+        }
+
+        @Override
+        public boolean containsValue(Object value) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Set<Contextual<?>> keySet() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Collection<BeanInstanceBag<?>> values() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void clear() {
+            // no-op
+        }
+
+        @Override
+        public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public BeanInstanceBag<?> get(Object key) {
+            return (BeanInstanceBag<?>) session().getAttribute(key.toString());
+        }
+
+        @Override
+        public BeanInstanceBag<?> put(Contextual<?> key, BeanInstanceBag<?> value) {
+            session().setAttribute(key.toString(), value);
+            return value;
+        }
+
+        @Override
+        public BeanInstanceBag<?> remove(Object key) {
+            final BeanInstanceBag<?> bag = get(key);
+            session().removeAttribute(key.toString());
+            return bag;
+        }
+
+        @Override
+        public void putAll(Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) {
+            for (Map.Entry<? extends Contextual<?>, ? extends BeanInstanceBag<?>> e : m.entrySet()) {
+                put(e.getKey(), e.getValue());
+            }
+        }
+    }
+}