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());
+ }
+ }
+ }
+}