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
}
}
}
+
}