Author: rmannibucau
Date: Sun Dec 23 16:49:59 2012
New Revision: 1425485

URL: http://svn.apache.org/viewvc?rev=1425485&view=rev
Log:
TOMEE-676 using http session for session scoped beans + minor fix in tomee 
maven plugin (creating apps folder)

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
    
openejb/trunk/openejb/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
    
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBValve.java
    
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
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java?rev=1425485&r1=1425484&r2=1425485&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
 Sun Dec 23 16:49:59 2012
@@ -50,6 +50,7 @@ import javax.servlet.ServletRequestEvent
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
 
 public class CdiAppContextsService extends AbstractContextsService implements 
ContextsService {
 
@@ -318,7 +319,7 @@ public class CdiAppContextsService exten
 
         //No current context
         if (currentSessionContext == null) {
-            currentSessionContext = newSessionContext();
+            currentSessionContext = newSessionContext(session);
             sessionCtxManager.addNewSessionContext(sessionId, 
currentSessionContext);
         }
         //Activate
@@ -328,11 +329,22 @@ public class CdiAppContextsService exten
         sessionContext.set(currentSessionContext);
     }
 
-    private SessionContext newSessionContext() {
+    private SessionContext newSessionContext(final HttpSession session) {
         if (SESSION_CONTEXT_CLAZZ != null) {
+            String classname = SESSION_CONTEXT_CLAZZ;
+            if ("http".equals(classname)) { // easier in the config
+                classname = 
"org.apache.tomee.catalina.cdi.SessionContextBackedByHttpSession";
+            }
+
             try {
-                return (SessionContext) 
Thread.currentThread().getContextClassLoader()
-                            .loadClass(SESSION_CONTEXT_CLAZZ).newInstance();
+                final Class<?> clazz = 
Thread.currentThread().getContextClassLoader().loadClass(classname);
+                try {
+                    final Constructor<?> constr = 
clazz.getConstructor(HttpSession.class);
+                    return (SessionContext)constr.newInstance(session);
+                } catch (Exception e) {
+                    return (SessionContext) clazz.newInstance();
+                }
+
             } catch (Exception e) {
                 logger.error("Can't instantiate " + SESSION_CONTEXT_CLAZZ + ", 
using default session context", e);
             }

Modified: 
openejb/trunk/openejb/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java?rev=1425485&r1=1425484&r2=1425485&view=diff
==============================================================================
--- 
openejb/trunk/openejb/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
 (original)
+++ 
openejb/trunk/openejb/maven/tomee-maven-plugin/src/main/java/org/apache/openejb/maven/plugin/AbstractTomEEMojo.java
 Sun Dec 23 16:49:59 2012
@@ -693,6 +693,8 @@ public abstract class AbstractTomEEMojo 
                     "</tomee>\n");
             writer.close();
 
+            new File(catalinaBase, "apps").mkdirs();
+
             getLog().info("TomEE was unzipped in '" + 
catalinaBase.getAbsolutePath() + "'");
         } catch (Exception e) {
             throw new TomEEException(e.getMessage(), e);

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=1425485&r1=1425484&r2=1425485&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
 Sun Dec 23 16:49:59 2012
@@ -25,35 +25,26 @@ 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));

Modified: 
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=1425485&r1=1425484&r2=1425485&view=diff
==============================================================================
--- 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
 (original)
+++ 
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
 Sun Dec 23 16:49:59 2012
@@ -1,27 +1,165 @@
 package org.apache.tomee.catalina.cdi;
 
-import org.apache.tomee.catalina.OpenEJBValve;
+import org.apache.catalina.session.StandardSession;
+import org.apache.catalina.session.StandardSessionFacade;
+import org.apache.openejb.util.reflection.Reflections;
 import org.apache.webbeans.context.SessionContext;
 import org.apache.webbeans.context.creational.BeanInstanceBag;
+import org.apache.webbeans.util.WebBeansUtil;
 
 import javax.enterprise.context.spi.Contextual;
 import javax.servlet.http.HttpSession;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 public class SessionContextBackedByHttpSession extends SessionContext {
-    @Override
-    public void setComponentInstanceMap() {
-        componentInstanceMap = new HttpSessionMap();
+    private HttpSession session;
+
+    public SessionContextBackedByHttpSession(final HttpSession session) {
+        this.session = session;
+        setComponentSessionInstanceMap(); // override default map (set in 
super())
+    }
+
+    public void setComponentSessionInstanceMap() {
+        if (session == null) {
+            super.setComponentInstanceMap();
+            return;
+        }
+
+        if (session instanceof StandardSessionFacade) {
+            try {
+                session = (HttpSession) Reflections.get(session, "session");
+            } catch (Exception e) {
+                // no-op
+            }
+        }
+
+        if (session instanceof StandardSession) {
+            try {
+                final ConcurrentHashMap<String, Object> map = 
(ConcurrentHashMap<String, Object>) Reflections.get(session, "attributes");
+                componentInstanceMap = new DirectSessionMap(map);
+            } catch (Exception e) {
+                componentInstanceMap = new HttpSessionMap(session);
+            }
+        } else {
+            componentInstanceMap = new HttpSessionMap(session);
+        }
+    }
+
+    private static String key(final Object key) {
+        final String id = WebBeansUtil.isPassivationCapable((Contextual<?>) 
key);
+        if (id != null) {
+            return id;
+        }
+        return key.toString(); // shouldn't occur
     }
 
-    protected static HttpSession session() {
-        return OpenEJBValve.request().getSession(true);
+    private static class DirectSessionMap implements 
ConcurrentMap<Contextual<?>, BeanInstanceBag<?>> {
+        private final ConcurrentHashMap<String, Object> delegate;
+
+        public DirectSessionMap(final ConcurrentHashMap<String, Object> map) {
+            delegate = map;
+        }
+
+        @Override
+        public int size() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isEmpty() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean containsValue(final Object value) {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Set<Contextual<?>> keySet() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Collection<BeanInstanceBag<?>> values() {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() {
+            return Collections.emptySet();
+        }
+
+        @Override
+        public boolean containsKey(final Object key) {
+            return delegate.containsKey(key(key));
+        }
+
+        @Override
+        public BeanInstanceBag<?> get(Object key) {
+            return (BeanInstanceBag<?>) delegate.get(key(key));
+        }
+
+        @Override
+        public BeanInstanceBag<?> put(Contextual<?> key, BeanInstanceBag<?> 
value) {
+            return (BeanInstanceBag<?>) delegate.put(key(key), value);
+        }
+
+        @Override
+        public BeanInstanceBag<?> remove(Object key) {
+            return (BeanInstanceBag<?>) delegate.remove(key(key));
+        }
+
+        @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());
+            }
+        }
+
+        @Override
+        public void clear() {
+            final Iterator<String> it = delegate.keySet().iterator();
+            while (it.hasNext()) {
+                if (delegate.get(it.next()) instanceof BeanInstanceBag) {
+                    it.remove();
+                }
+            }
+        }
+
+        @Override
+        public BeanInstanceBag<?> putIfAbsent(Contextual<?> key, 
BeanInstanceBag<?> value) {
+            return (BeanInstanceBag<?>) delegate.putIfAbsent(key(key), value);
+        }
+
+        @Override
+        public boolean remove(Object key, Object value) {
+            return delegate.remove(key(key), value);
+        }
+
+        @Override
+        public boolean replace(Contextual<?> key, BeanInstanceBag<?> oldValue, 
BeanInstanceBag<?> newValue) {
+            return delegate.replace(key(key), oldValue, newValue);
+        }
+
+        @Override
+        public BeanInstanceBag<?> replace(Contextual<?> key, 
BeanInstanceBag<?> value) {
+            return (BeanInstanceBag<?>) delegate.replace(key(key), value);
+        }
     }
+    private static class HttpSessionMap implements 
Map<Contextual<?>,BeanInstanceBag<?>> { // not sure it can really work
+        private final HttpSession session;
+
+        public HttpSessionMap(final HttpSession session) {
+            this.session = session;
+        }
 
-    private static class HttpSessionMap implements 
Map<Contextual<?>,BeanInstanceBag<?>> {
         @Override
         public int size() {
             throw new UnsupportedOperationException();
@@ -34,7 +172,7 @@ public class SessionContextBackedByHttpS
 
         @Override
         public boolean containsKey(Object key) {
-            return session().getAttribute(key.toString()) != null;
+            return session.getAttribute(key(key)) != null;
         }
 
         @Override
@@ -64,19 +202,19 @@ public class SessionContextBackedByHttpS
 
         @Override
         public BeanInstanceBag<?> get(Object key) {
-            return (BeanInstanceBag<?>) session().getAttribute(key.toString());
+            return (BeanInstanceBag<?>) session.getAttribute(key(key));
         }
 
         @Override
         public BeanInstanceBag<?> put(Contextual<?> key, BeanInstanceBag<?> 
value) {
-            session().setAttribute(key.toString(), value);
+            session.setAttribute(key(key), value);
             return value;
         }
 
         @Override
         public BeanInstanceBag<?> remove(Object key) {
             final BeanInstanceBag<?> bag = get(key);
-            session().removeAttribute(key.toString());
+            session.removeAttribute(key(key));
             return bag;
         }
 
@@ -87,4 +225,5 @@ public class SessionContextBackedByHttpS
             }
         }
     }
+
 }


Reply via email to