Author: rmannibucau
Date: Sun Dec 23 19:45:24 2012
New Revision: 1425516
URL: http://svn.apache.org/viewvc?rev=1425516&view=rev
Log:
TOMEE-676 using http session for session scoped beans - better impl as fallback
+ config of the wrapper
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
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=1425516&r1=1425515&r2=1425516&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 19:45:24 2012
@@ -2,6 +2,7 @@ package org.apache.tomee.catalina.cdi;
import org.apache.catalina.session.StandardSession;
import org.apache.catalina.session.StandardSessionFacade;
+import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.reflection.Reflections;
import org.apache.webbeans.context.SessionContext;
import org.apache.webbeans.context.creational.BeanInstanceBag;
@@ -18,6 +19,8 @@ import java.util.concurrent.ConcurrentHa
import java.util.concurrent.ConcurrentMap;
public class SessionContextBackedByHttpSession extends SessionContext {
+ private static final String WRAPPER =
SystemInstance.get().getProperty("tomee.session-context.wrapper", "direct");
+
private HttpSession session;
public SessionContextBackedByHttpSession(final HttpSession session) {
@@ -42,7 +45,11 @@ public class SessionContextBackedByHttpS
if (session instanceof StandardSession) {
try {
final ConcurrentHashMap<String, Object> map =
(ConcurrentHashMap<String, Object>) Reflections.get(session, "attributes");
- componentInstanceMap = new DirectSessionMap(map);
+ if (WRAPPER.equals("direct")) {
+ componentInstanceMap = new DirectSessionMap(map);
+ } else {
+ componentInstanceMap = new HttpSessionMap(session);
+ }
} catch (Exception e) {
componentInstanceMap = new HttpSessionMap(session);
}
@@ -102,22 +109,22 @@ public class SessionContextBackedByHttpS
}
@Override
- public BeanInstanceBag<?> get(Object key) {
+ public BeanInstanceBag<?> get(final Object key) {
return (BeanInstanceBag<?>) delegate.get(key(key));
}
@Override
- public BeanInstanceBag<?> put(Contextual<?> key, BeanInstanceBag<?>
value) {
+ public BeanInstanceBag<?> put(final Contextual<?> key, final
BeanInstanceBag<?> value) {
return (BeanInstanceBag<?>) delegate.put(key(key), value);
}
@Override
- public BeanInstanceBag<?> remove(Object key) {
+ public BeanInstanceBag<?> remove(final Object key) {
return (BeanInstanceBag<?>) delegate.remove(key(key));
}
@Override
- public void putAll(Map<? extends Contextual<?>, ? extends
BeanInstanceBag<?>> m) {
+ public void putAll(final Map<? extends Contextual<?>, ? extends
BeanInstanceBag<?>> m) {
for (Map.Entry<? extends Contextual<?>, ? extends
BeanInstanceBag<?>> e : m.entrySet()) {
put(e.getKey(), e.getValue());
}
@@ -134,12 +141,12 @@ public class SessionContextBackedByHttpS
}
@Override
- public BeanInstanceBag<?> putIfAbsent(Contextual<?> key,
BeanInstanceBag<?> value) {
+ public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final
BeanInstanceBag<?> value) {
return (BeanInstanceBag<?>) delegate.putIfAbsent(key(key), value);
}
@Override
- public boolean remove(Object key, Object value) {
+ public boolean remove(final Object key, final Object value) {
return delegate.remove(key(key), value);
}
@@ -149,11 +156,12 @@ public class SessionContextBackedByHttpS
}
@Override
- public BeanInstanceBag<?> replace(Contextual<?> key,
BeanInstanceBag<?> value) {
+ public BeanInstanceBag<?> replace(final Contextual<?> key, final
BeanInstanceBag<?> value) {
return (BeanInstanceBag<?>) delegate.replace(key(key), value);
}
}
- private static class HttpSessionMap implements
Map<Contextual<?>,BeanInstanceBag<?>> { // not sure it can really work
+
+ private static class HttpSessionMap implements
ConcurrentMap<Contextual<?>,BeanInstanceBag<?>> { // not sure it can really work
private final HttpSession session;
public HttpSessionMap(final HttpSession session) {
@@ -191,6 +199,16 @@ public class SessionContextBackedByHttpS
}
@Override
+ public boolean replace(Contextual<?> key, BeanInstanceBag<?> oldValue,
BeanInstanceBag<?> newValue) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public BeanInstanceBag<?> replace(Contextual<?> key,
BeanInstanceBag<?> value) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void clear() {
// no-op
}
@@ -201,7 +219,7 @@ public class SessionContextBackedByHttpS
}
@Override
- public BeanInstanceBag<?> get(Object key) {
+ public BeanInstanceBag<?> get(final Object key) {
return (BeanInstanceBag<?>) session.getAttribute(key(key));
}
@@ -212,18 +230,34 @@ public class SessionContextBackedByHttpS
}
@Override
- public BeanInstanceBag<?> remove(Object key) {
+ public BeanInstanceBag<?> remove(final Object key) {
final BeanInstanceBag<?> bag = get(key);
session.removeAttribute(key(key));
return bag;
}
@Override
- public void putAll(Map<? extends Contextual<?>, ? extends
BeanInstanceBag<?>> m) {
+ public void putAll(final Map<? extends Contextual<?>, ? extends
BeanInstanceBag<?>> m) {
for (Map.Entry<? extends Contextual<?>, ? extends
BeanInstanceBag<?>> e : m.entrySet()) {
put(e.getKey(), e.getValue());
}
}
+
+ @Override
+ public BeanInstanceBag<?> putIfAbsent(final Contextual<?> key, final
BeanInstanceBag<?> value) {
+ final String k = key(key);
+ final BeanInstanceBag<?> beanInstanceBag = get(k);
+ if (beanInstanceBag == null) {
+ return put(key, value);
+ }
+ return beanInstanceBag;
+ }
+
+ @Override
+ public boolean remove(final Object key, final Object value) {
+ remove(key(key));
+ return true;
+ }
}
}