You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by st...@apache.org on 2015/05/05 07:50:22 UTC
[02/16] tomee git commit: TOMEE-1572 adopt OWB-1.5 changes
TOMEE-1572 adopt OWB-1.5 changes
* improved ConversationHandling
* improved SessionHandling
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/e41c460f
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/e41c460f
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/e41c460f
Branch: refs/heads/fb_tomee2_owb16
Commit: e41c460fb6410f54f153f54272c8bce7dfea39f2
Parents: d376ef5
Author: Mark Struberg <st...@apache.org>
Authored: Sat May 2 11:44:53 2015 +0200
Committer: Mark Struberg <st...@apache.org>
Committed: Sat May 2 11:44:53 2015 +0200
----------------------------------------------------------------------
.../openejb/cdi/CdiAppContextsService.java | 760 +------------------
.../java/org/apache/openejb/cdi/CdiPlugin.java | 14 +-
.../apache/openejb/cdi/OpenEJBLifecycle.java | 68 +-
.../openejb/cdi/ThreadSingletonServiceImpl.java | 4 -
.../cdi/UpdatableSessionContextManager.java | 66 --
.../openejb/testing/ApplicationComposers.java | 2 +-
.../openejb/cdi/CdiAppContextsServiceTest.java | 4 +-
...StatefulConversationScopedTOMEE1138Test.java | 4 +-
.../server/httpd/BeginWebBeansListener.java | 35 -
.../server/httpd/EndWebBeansListener.java | 10 -
.../server/httpd/HttpListenerRegistry.java | 8 +-
.../openejb/server/httpd/HttpRequestImpl.java | 3 +
.../server/httpd/WebBeansListenerHelper.java | 3 +
.../tomee/catalina/OpenEJBContextConfig.java | 45 --
.../tomee/catalina/TomEEContainerListener.java | 13 +-
.../tomee/catalina/TomcatWebAppBuilder.java | 8 +-
.../cdi/SessionContextBackedByHttpSession.java | 289 -------
.../cdi/SessionNormalScopeBeanHandler.java | 117 ---
18 files changed, 74 insertions(+), 1379 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
index 655af39..780728e 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
@@ -18,82 +18,26 @@
package org.apache.openejb.cdi;
-import org.apache.openejb.core.Operation;
-import org.apache.openejb.core.ThreadContext;
-import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import org.apache.webbeans.annotation.DestroyedLiteral;
-import org.apache.webbeans.annotation.InitializedLiteral;
-import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.AbstractContextsService;
-import org.apache.webbeans.context.ApplicationContext;
-import org.apache.webbeans.context.ConversationContext;
-import org.apache.webbeans.context.DependentContext;
+import org.apache.webbeans.context.RequestContext;
import org.apache.webbeans.context.SessionContext;
-import org.apache.webbeans.context.SingletonContext;
-import org.apache.webbeans.conversation.ConversationImpl;
-import org.apache.webbeans.conversation.ConversationManager;
-import org.apache.webbeans.el.ELContextStore;
-import org.apache.webbeans.event.EventMetadataImpl;
import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.spi.ConversationService;
-import org.apache.webbeans.web.context.ServletRequestContext;
-import org.apache.webbeans.web.intercept.RequestScopedBeanInterceptorHandler;
+import org.apache.webbeans.web.context.WebContextsService;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Map;
import javax.enterprise.context.ApplicationScoped;
-import javax.enterprise.context.BusyConversationException;
-import javax.enterprise.context.ContextException;
-import javax.enterprise.context.Conversation;
-import javax.enterprise.context.ConversationScoped;
-import javax.enterprise.context.Dependent;
-import javax.enterprise.context.RequestScoped;
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.context.spi.Context;
import javax.inject.Singleton;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletRequestEvent;
-import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
-public class CdiAppContextsService extends AbstractContextsService implements ContextsService, ConversationService {
+
+public class CdiAppContextsService extends WebContextsService implements ContextsService {
public static final Object EJB_REQUEST_EVENT = new Object();
private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), CdiAppContextsService.class);
- private static final String CID = "cid";
-
- private final ThreadLocal<ServletRequestContext> requestContext = new ThreadLocal<>();
-
- private final ThreadLocal<SessionContext> sessionContext = new ThreadLocal<>();
- private final UpdatableSessionContextManager sessionCtxManager = new UpdatableSessionContextManager();
-
- /**
- * Conversation context manager
- */
- private final ThreadLocal<ConversationContext> conversationContext;
-
- private final DependentContext dependentContext = new DependentContext();
-
- private final ApplicationContext applicationContext = new ApplicationContext();
-
- private final SingletonContext singletonContext = new SingletonContext();
-
- private final WebBeansContext webBeansContext;
-
- private final ConversationService conversationService;
-
- private volatile Object appEvent;
-
- private final boolean useGetParameter;
-
private static final ThreadLocal<Collection<Runnable>> endRequestRunnables = new ThreadLocal<Collection<Runnable>>() {
@Override
protected Collection<Runnable> initialValue() {
@@ -101,37 +45,13 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
}
};
- private volatile boolean autoConversationCheck = true;
public CdiAppContextsService(final WebBeansContext wbc) {
- this(wbc, wbc.getOpenWebBeansConfiguration().supportsConversation());
+ super(wbc);
}
- public CdiAppContextsService(final WebBeansContext wbc, final boolean supportsConversation) {
- if (wbc != null) {
- webBeansContext = wbc;
- } else {
- webBeansContext = WebBeansContext.currentInstance();
- }
-
- dependentContext.setActive(true);
- if (supportsConversation) {
- conversationService = webBeansContext.getService(ConversationService.class);
- if (conversationService == null) {
- conversationContext = null;
- } else {
- conversationContext = new ThreadLocal<>();
- }
- } else {
- conversationService = null;
- conversationContext = null;
- }
- applicationContext.setActive(true);
- singletonContext.setActive(true);
- useGetParameter = "true".equalsIgnoreCase(SystemInstance.get().getProperty("openejb.cdi.conversation.http.use-get-parameter", "false"));
- }
- private void endRequest() {
+ private void runEndRequestTasks() {
for (final Runnable r : endRequestRunnables.get()) {
try {
r.run();
@@ -146,30 +66,6 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
endRequestRunnables.get().add(runnable);
}
- @Override
- public String getConversationId() {
- return getHttpParameter(CID);
- }
-
- @Override
- public String getConversationSessionId() {
- return currentSessionId(false);
- }
-
- public String currentSessionId(final boolean force) {
- final ServletRequestContext rc = requestContext.get();
- if (rc != null) {
- final HttpServletRequest req = rc.getServletRequest();
- if (req != null) {
- final HttpSession session = req.getSession(force);
- if (session != null) {
- return session.getId();
- }
- }
- }
- return null;
- }
-
@Override // this method is called after the deployment (BeansDeployer) but need beans to be here to get events
public void init(final Object initializeObject) {
//Start application context
@@ -179,651 +75,17 @@ public class CdiAppContextsService extends AbstractContextsService implements Co
startContext(Singleton.class, initializeObject);
}
- public void beforeStop(final Object ignored) {
- { // trigger @PreDestroy mainly but keep it active until destroy(xxx)
- applicationContext.destroy();
- webBeansContext.getBeanManagerImpl().fireEvent(
- appEvent,
- new EventMetadataImpl(null, ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class,null, new Annotation[] { DestroyedLiteral.INSTANCE_APPLICATION_SCOPED }, webBeansContext),
- false);
- applicationContext.setActive(true);
-
- singletonContext.destroy();
- singletonContext.setActive(true);
- }
-
- for (final Map.Entry<Conversation, ConversationContext> conversation : webBeansContext.getConversationManager().getAllConversationContexts().entrySet()) {
- conversation.getValue().destroy();
- final String id = conversation.getKey().getId();
- if (id != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(id, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
- }
- for (final SessionContext sc : sessionCtxManager.getContextById().values()) {
- final Object event = HttpSessionContextSessionAware.class.isInstance(sc) ? HttpSessionContextSessionAware.class.cast(sc).getSession() : sc;
- if (HttpSession.class.isInstance(event)) {
- final HttpSession httpSession = HttpSession.class.cast(event);
- if (httpSession.getId() == null) {
- continue;
- }
- initSessionContext(httpSession);
- try {
- httpSession.invalidate();
- } catch (final IllegalStateException ise) {
- // no-op
- } finally {
- destroySessionContext(httpSession);
- }
- } else {
- sc.destroy();
- }
- webBeansContext.getBeanManagerImpl().fireEvent(event, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
- }
- sessionCtxManager.getContextById().clear();
- }
-
public void destroy(final Object destroyObject) {
- //Destroy application context
- endContext(ApplicationScoped.class, destroyObject);
-
- //Destroy singleton context
- endContext(Singleton.class, destroyObject);
-
+ super.destroy(destroyObject);
removeThreadLocals();
}
- public void removeThreadLocals() {
- //Remove thread locals
- //for preventing memory leaks
- requestContext.set(null);
- requestContext.remove();
- sessionContext.set(null);
- sessionContext.remove();
-
- if (null != conversationContext) {
- conversationContext.set(null);
- conversationContext.remove();
- }
- }
-
- @Override
- public void endContext(final Class<? extends Annotation> scopeType, final Object endParameters) {
- if (supportsContext(scopeType)) {
- if (scopeType.equals(RequestScoped.class)) {
- destroyRequestContext(endParameters);
- } else if (scopeType.equals(SessionScoped.class)) {
- destroySessionContext((HttpSession) endParameters);
- } else if (scopeType.equals(ApplicationScoped.class)) {
- destroyApplicationContext();
- } else if (scopeType.equals(Dependent.class)) { //NOPMD
- // Do nothing
- } else if (scopeType.equals(Singleton.class)) {
- destroySingletonContext();
- } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) {
- destroyConversationContext(endParameters);
- } else {
- if (logger.isWarningEnabled()) {
- logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
- + scopeType.getSimpleName()
- + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
- }
- }
- }
-
- }
-
- @Override
- public Context getCurrentContext(final Class<? extends Annotation> scopeType) {
- if (scopeType.equals(RequestScoped.class)) {
- return getRequestContext(true);
- } else if (scopeType.equals(SessionScoped.class)) {
- return getSessionContext(true);
- } else if (scopeType.equals(ApplicationScoped.class)) {
- return getApplicationContext();
- } else if (supportsConversation() && scopeType.equals(ConversationScoped.class)) {
- return getConversationContext();
- } else if (scopeType.equals(Dependent.class)) {
- return dependentContext;
- } else if (scopeType.equals(Singleton.class)) {
- return getSingletonContext();
- }
-
- return null;
- }
@Override
- public void startContext(final Class<? extends Annotation> scopeType, final Object startParameter) throws ContextException {
- if (supportsContext(scopeType)) {
- if (scopeType.equals(RequestScoped.class)) {
- initRequestContext(startParameter);
- } else if (scopeType.equals(SessionScoped.class)) {
- initSessionContext((HttpSession) startParameter);
- } else if (scopeType.equals(ApplicationScoped.class)) {
- initApplicationContext(startParameter);
- } else if (scopeType.equals(Dependent.class)) {
- initSingletonContext();
- } else if (scopeType.equals(Singleton.class)) { //NOPMD
- // Do nothing
- } else if (supportsConversation() && scopeType.equals(ConversationScoped.class) && !isTimeout()) {
- initConversationContext(startParameter);
- } else {
- if (logger.isWarningEnabled()) {
- logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
- + scopeType.getSimpleName()
- + ". Scopes @Dependent, @RequestScoped, @ApplicationScoped and @Singleton are supported scope types");
- }
- }
- }
- }
-
- private void initSingletonContext() {
- singletonContext.setActive(true);
- }
-
- private void initApplicationContext(final Object init) { // in case contexts are stop/start
- if (appEvent == null) { // no need of sync cause of the lifecycle
- Object event = init;
- if (StartupObject.class.isInstance(init)) {
- final StartupObject so = StartupObject.class.cast(init);
- if (so.isFromWebApp()) { // ear webapps
- event = so.getWebContext().getServletContext();
- } else if (so.getAppInfo().webAppAlone) {
- event = SystemInstance.get().getComponent(ServletContext.class);
- }
- } else if (ServletContextEvent.class.isInstance(init)) {
- event = ServletContextEvent.class.cast(init).getServletContext();
- }
- appEvent = event != null ? event : applicationContext;
- webBeansContext.getBeanManagerImpl().fireEvent(
- appEvent,
- new EventMetadataImpl(null,
- ServletContext.class.isInstance(appEvent) ? ServletContext.class : Object.class, null, new Annotation[] { InitializedLiteral.INSTANCE_APPLICATION_SCOPED },
- webBeansContext),
- false);
- }
- }
-
- @Override
- public boolean supportsContext(final Class<? extends Annotation> scopeType) {
- return scopeType.equals(RequestScoped.class)
- || scopeType.equals(SessionScoped.class)
- || scopeType.equals(ApplicationScoped.class)
- || scopeType.equals(Dependent.class)
- || scopeType.equals(Singleton.class)
- || scopeType.equals(ConversationScoped.class) && supportsConversation();
-
- }
-
- private void initRequestContext(final Object event) {
- final ServletRequestContext rq = new ServletRequestContext();
- rq.setActive(true);
-
- requestContext.set(rq);// set thread local
- if (event != null && ServletRequestEvent.class.isInstance(event)) {
- final HttpServletRequest request = (HttpServletRequest) ServletRequestEvent.class.cast(event).getServletRequest();
- rq.setServletRequest(request);
-
- if (request != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(request, InitializedLiteral.INSTANCE_REQUEST_SCOPED);
- }
-
- if (request != null) {
- //Re-initialize thread local for session
- final HttpSession session = request.getSession(false);
-
- final String cid = conversationService != null ? (!useGetParameter ? getCid(request) : request.getParameter(CID)) : null;
- if (session != null) {
- initSessionContext(session);
- if (autoConversationCheck && conversationService != null && !isConversationSkipped(request)) {
- if (cid != null) {
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId());
- if (c != null) {
- final ConversationContext context = conversationManager.getConversationContext(c);
- context.setActive(true);
- conversationContext.set(context);
- return;
- }
- }
- }
- }
-
- if (cid == null && !isTimeout() && autoConversationCheck) {
- // transient but active
- initConversationContext(request);
- }
- }
- } else if (event == EJB_REQUEST_EVENT) {
- webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_REQUEST_SCOPED);
- }
- }
-
- public static String getCid(final HttpServletRequest req) {
- return getFromQuery(CID, req.getQueryString());
- }
-
- public static String getFromQuery(final String name, final String q) {
- final int cid = q == null ? -1 : q.indexOf(name + "=");
- if (cid < 0) {
- return null;
- }
- int end = q.indexOf("&", cid);
- final int end2 = q.indexOf("#", cid);
- if (end2 > 0 && end2 < end) {
- end = end2;
- }
- if (end < 0) {
- end = q.length();
- }
- return q.substring(cid + name.length() + 1, end);
- }
-
- public boolean isAutoConversationCheck() {
- return autoConversationCheck;
- }
-
- public void checkConversationState() {
- final ServletRequestContext rc = getRequestContext(false);
- if (rc != null && rc.getServletRequest() != null && conversationService != null) {
- final HttpSession session = rc.getServletRequest().getSession(false);
- if (session != null) {
- final String cid = useGetParameter ? rc.getServletRequest().getParameter(CID) : getFromQuery(CID, rc.getServletRequest().getQueryString());
- if (cid != null) {
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final ConversationImpl c = conversationManager.getPropogatedConversation(cid, session.getId());
- if (!autoConversationCheck) { // lazy association
- initConversationContext(rc.getServletRequest());
- }
- if (c != null) {
- if (c.isTransient()) {
- throw new IllegalStateException("Conversation " + cid + " missing");
- }
- if (c.iUseIt() > 1) {
- throw new BusyConversationException("busy conversation " + c.getId() + '(' + c.getSessionId() + ')');
- }
- }
- }
- }
- }
- }
-
- private void destroyRequestContext(final Object end) {
- // execute request tasks
- endRequest();
-
- //Get context
- final ServletRequestContext context = getRequestContext(false);
-
- //Destroy context
- if (context != null) {
- if (supportsConversation()) { // OWB-595
- cleanupConversation();
- }
-
- final HttpServletRequest servletRequest = context.getServletRequest();
- if (servletRequest != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(servletRequest, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
- } else if (end == EJB_REQUEST_EVENT) {
- webBeansContext.getBeanManagerImpl().fireEvent(end, DestroyedLiteral.INSTANCE_REQUEST_SCOPED);
- }
- context.destroy();
- }
-
- // clean up the EL caches after each request
- final ELContextStore elStore = ELContextStore.getInstance(false);
- if (elStore != null) {
- elStore.destroyELContextStore();
- }
-
- //Clear thread locals - only for request to let user do with deltaspike start(session, request)restart(request)...stop()
- requestContext.remove();
-
- RequestScopedBeanInterceptorHandler.removeThreadLocals();
- }
-
- private void cleanupConversation() {
- if (conversationService == null) {
- return;
- }
-
- final ConversationContext cc = getConversationContext();
- if (cc == null) {
- return;
- }
- cc.setActive(false);
-
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final Conversation conversation = conversationManager.getConversationBeanReference();
- if (conversation == null) {
- return;
- }
-
- final ConversationImpl conversationImpl = ConversationImpl.class.cast(conversation);
- conversationImpl.iDontUseItAnymore(); // do it before next call to avoid busy exception if possible
- try {
- if (conversation.isTransient()) {
- endContext(ConversationScoped.class, null);
- conversationManager.removeConversation(conversation); // in case end() was called
- } else {
- conversationImpl.updateTimeOut();
- }
- } catch (final BusyConversationException bce) {
- // no-op, TODO: do something, maybe add internalIsTransient() to avoid to fail here
- }
- }
-
- /**
- * Creates the session context at the session start.
- *
- * @param session http session object
- */
- private void initSessionContext(final HttpSession session) {
- if (session == null) {
- // no session -> no SessionContext
- return;
- }
-
- final String sessionId = session.getId();
- //Current context
- SessionContext currentSessionContext = sessionId == null ? null : sessionCtxManager.getSessionContextWithSessionId(sessionId);
-
- //No current context
- boolean fire = false;
- if (currentSessionContext == null) {
- currentSessionContext = newSessionContext(session);
- sessionCtxManager.addNewSessionContext(sessionId, currentSessionContext);
- fire = true;
- }
- //Activate
- currentSessionContext.setActive(true);
-
- //Set thread local
- sessionContext.set(currentSessionContext);
-
- if (fire) {
- webBeansContext.getBeanManagerImpl().fireEvent(session, InitializedLiteral.INSTANCE_SESSION_SCOPED);
- }
- }
-
- private SessionContext newSessionContext(final HttpSession session) {
- final String classname = SystemInstance.get().getComponent(ThreadSingletonService.class).sessionContextClass();
- if (classname != null) {
- try {
- final Class<?> clazz = Thread.currentThread().getContextClassLoader().loadClass(classname);
- try {
- final Constructor<?> constr = clazz.getConstructor(HttpSession.class);
- return (SessionContext) constr.newInstance(session);
- } catch (final Exception e) {
- return (SessionContext) clazz.newInstance();
- }
-
- } catch (final Exception e) {
- logger.error("Can't instantiate " + classname + ", using default session context", e);
- }
- }
- return new HttpSessionContextSessionAware(session);
- }
-
- /**
- * Destroys the session context and all of its components at the end of the
- * session.
- *
- * @param session http session object
- */
- private void destroySessionContext(final HttpSession session) {
- if (session != null) {
- final SessionContext context = sessionContext.get();
-
- if (context != null && context.isActive()) {
- final ServletRequestContext servletRequestContext = getRequestContext(false);
- if (servletRequestContext == null || servletRequestContext.getServletRequest() == null) {
- doDestroySession(context, session);
- } else {
- pushRequestReleasable(new Runnable() { // call it at the end of the request
- @Override
- public void run() {
- doDestroySession(context, session);
- }
- });
- }
- }
-
- //Clear thread locals
- sessionContext.set(null);
- sessionContext.remove();
-
- //Remove session from manager
- sessionCtxManager.removeSessionContextWithSessionId(session.getId());
- }
- }
-
- private void doDestroySession(SessionContext context, HttpSession session) {
- context.destroy();
- webBeansContext.getBeanManagerImpl().fireEvent(session, DestroyedLiteral.INSTANCE_SESSION_SCOPED);
- }
-
- //we don't have initApplicationContext
-
- private void destroyApplicationContext() {
- applicationContext.destroy();
- }
-
- private void destroySingletonContext() {
- singletonContext.destroy();
- }
-
- private ConversationContext initConversationContext(final Object request) {
- if (conversationService == null) {
- return null;
- }
-
- final HttpServletRequest req = HttpServletRequest.class.isInstance(request) ? HttpServletRequest.class.cast(request) : null;
- ConversationContext context = ConversationContext.class.isInstance(request) ? ConversationContext.class.cast(request) : null;
- Object event = null;
- if (context == null) {
- final ConversationContext existingContext = conversationContext.get();
- if (existingContext == null) {
- context = new ConversationContext();
- context.setActive(true);
-
- if (req != null) {
- event = req;
- } else {
- final ServletRequestContext servletRequestContext = getRequestContext(true);
- event = servletRequestContext != null && servletRequestContext.getServletRequest() != null ? servletRequestContext.getServletRequest() : context;
- }
- } else {
- context = existingContext;
- }
- }
- conversationContext.set(context);
- context.setActive(true);
- if (event != null) {
- webBeansContext.getBeanManagerImpl().fireEvent(event, InitializedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
- return context;
- }
-
- /**
- * Destroy conversation context.
- */
- private void destroyConversationContext(final Object destroy) {
- if (conversationService == null) {
- return;
- }
-
- final ConversationContext context = getConversationContext();
- if (context != null) {
- context.destroy();
- final ServletRequestContext servletRequestContext = getRequestContext(false);
- final Object destroyObject = servletRequestContext != null && servletRequestContext.getServletRequest() != null ?
- servletRequestContext.getServletRequest() : destroy;
- webBeansContext.getBeanManagerImpl().fireEvent(
- destroyObject == null ? context : destroyObject, DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
-
- if (null != context) {
- conversationContext.remove();
- }
- }
+ protected void destroyRequestContext(Object requestEvent) {
+ // execute endrequest tasks
+ runEndRequestTasks();
-
- public ServletRequestContext getRequestContext(final boolean create) {
- ServletRequestContext context = requestContext.get();
- if (context == null && create) {
- initRequestContext(null);
- return requestContext.get();
- }
- return context;
- }
-
- private Context getSessionContext(final boolean create) {
- SessionContext context = sessionContext.get();
- if ((context == null || !context.isActive()) && create) {
- lazyStartSessionContext();
- context = sessionContext.get();
- if (context == null) {
- context = new SessionContext();
- context.setActive(true);
- sessionContext.set(context);
- }
- }
- return context;
- }
-
- /**
- * Gets application context.
- *
- * @return application context
- */
- private ApplicationContext getApplicationContext() {
- return applicationContext;
- }
-
- /**
- * Gets singleton context.
- *
- * @return singleton context
- */
- private SingletonContext getSingletonContext() {
- return singletonContext;
- }
-
- /**
- * Get current conversation ctx.
- *
- * @return conversation context
- */
- private ConversationContext getConversationContext() {
- return conversationContext.get();
- }
-
- private boolean isConversationSkipped(final HttpServletRequest servletRequest) {
- final String queryString = servletRequest.getQueryString();
- return "none".equals(getFromQuery("conversationPropagation", queryString)) || "true".equals(getFromQuery("nocid", queryString));
- }
-
- private boolean isTimeout() {
- final ThreadContext tc = ThreadContext.getThreadContext();
- return tc != null && tc.getCurrentOperation() == Operation.TIMEOUT;
- }
-
- private Context lazyStartSessionContext() {
-
- if (logger.isDebugEnabled()) {
- logger.debug(">lazyStartSessionContext");
- }
-
- final Context webContext = null;
- final Context context = getCurrentContext(RequestScoped.class);
- if (context instanceof ServletRequestContext) {
- final ServletRequestContext requestContext = (ServletRequestContext) context;
- final HttpServletRequest servletRequest = requestContext.getServletRequest();
- if (null != servletRequest) { // this could be null if there is no active request context
- try {
- final HttpSession currentSession = servletRequest.getSession();
- initSessionContext(currentSession);
-
- /*
- final FailOverService failoverService = webBeansContext.getService(FailOverService.class);
- if (failoverService != null && failoverService.isSupportFailOver()) {
- failoverService.sessionIsInUse(currentSession);
- }
- */
-
- if (logger.isDebugEnabled()) {
- logger.debug("Lazy SESSION context initialization SUCCESS");
- }
- } catch (final Exception e) {
- logger.error(OWBLogConst.ERROR_0013, e);
- }
-
- } else {
- logger.warning("Could NOT lazily initialize session context because NO active request context");
- }
- } else {
- logger.warning("Could NOT lazily initialize session context because of " + context + " RequestContext");
- }
-
- if (logger.isDebugEnabled()) {
- logger.debug("<lazyStartSessionContext " + webContext);
- }
- return webContext;
- }
-
- public void setAutoConversationCheck(final boolean autoConversationCheck) {
- this.autoConversationCheck = autoConversationCheck;
- }
-
- private boolean supportsConversation() {
- return conversationContext != null;
- }
-
- public void updateSessionIdMapping(final String oldId, final String newId) {
- sessionCtxManager.updateSessionIdMapping(oldId, newId);
- }
-
- public State saveState() {
- return new State(requestContext.get(), sessionContext.get(), conversationContext.get());
- }
-
- public State restoreState(final State state) {
- final State old = saveState();
- requestContext.set(state.request);
- sessionContext.set(state.session);
- conversationContext.set(state.conversation);
- return old;
- }
-
- public String getHttpParameter(final String name) {
- final ServletRequestContext req = getRequestContext(false);
- if (req != null && req.getServletRequest() != null) {
- return useGetParameter ? req.getServletRequest().getParameter(name) : getFromQuery(name, req.getServletRequest().getQueryString());
- }
- return null;
- }
-
- public static class State {
- private final ServletRequestContext request;
- private final SessionContext session;
- private final ConversationContext conversation;
-
- public State(final ServletRequestContext request, final SessionContext session, final ConversationContext conversation) {
- this.request = request;
- this.session = session;
- this.conversation = conversation;
- }
- }
-
- public static class HttpSessionContextSessionAware extends SessionContext {
- private final HttpSession session;
-
- public HttpSessionContextSessionAware(final HttpSession session) {
- this.session = session;
- }
-
- public HttpSession getSession() {
- return session;
- }
+ super.destroyRequestContext(requestEvent);
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
index 8dab787..429f7ac 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiPlugin.java
@@ -41,14 +41,12 @@ import org.apache.webbeans.exception.WebBeansConfigurationException;
import org.apache.webbeans.portable.events.discovery.BeforeShutdownImpl;
import org.apache.webbeans.portable.events.generics.GProcessSessionBean;
import org.apache.webbeans.proxy.NormalScopeProxyFactory;
-import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.spi.ResourceInjectionService;
import org.apache.webbeans.spi.SecurityService;
import org.apache.webbeans.spi.TransactionService;
import org.apache.webbeans.spi.plugins.AbstractOwbPlugin;
import org.apache.webbeans.spi.plugins.OpenWebBeansEjbPlugin;
import org.apache.webbeans.spi.plugins.OpenWebBeansJavaEEPlugin;
-import org.apache.webbeans.spi.plugins.OpenWebBeansWebPlugin;
import org.apache.webbeans.util.GenericsUtil;
import org.apache.webbeans.util.WebBeansUtil;
@@ -94,12 +92,11 @@ import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
-public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin, OpenWebBeansWebPlugin {
+public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPlugin, OpenWebBeansEjbPlugin {
private Map<Class<?>, BeanContext> beans;
private WebBeansContext webBeansContext;
- private CdiAppContextsService contexsServices;
private ClassLoader classLoader;
private Map<Contextual<?>, Object> cacheProxies;
@@ -113,10 +110,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
}
}
- @Override
- public String currentSessionId() {
- return CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class)).currentSessionId(true);
- }
@Override
public boolean isEEComponent(final Class<?> impl) {
@@ -157,9 +150,6 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
}
}
- public CdiAppContextsService getContexsServices() {
- return contexsServices;
- }
public void stop() throws OpenEJBException {
final ClassLoader oldCl = Thread.currentThread().getContextClassLoader();
@@ -171,7 +161,7 @@ public class CdiPlugin extends AbstractOwbPlugin implements OpenWebBeansJavaEEPl
webBeansContext.getBeanManagerImpl().fireEvent(new BeforeShutdownImpl());
// Destroys context
- this.contexsServices.destroy(null);
+ webBeansContext.getContextsService().destroy(null);
// Free all plugin resources
webBeansContext.getPluginLoader().shutDown();
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
index 5747c50..4a05de7 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/OpenEJBLifecycle.java
@@ -29,10 +29,10 @@ import org.apache.webbeans.component.BuiltInOwbBean;
import org.apache.webbeans.component.SimpleProducerFactory;
import org.apache.webbeans.component.WebBeansType;
import org.apache.webbeans.config.BeansDeployer;
-import org.apache.webbeans.config.OpenWebBeansConfiguration;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.config.WebBeansFinder;
import org.apache.webbeans.container.BeanManagerImpl;
+import org.apache.webbeans.el.ELContextStore;
import org.apache.webbeans.intercept.InterceptorResolutionService;
import org.apache.webbeans.portable.AbstractProducer;
import org.apache.webbeans.portable.InjectionTargetImpl;
@@ -48,10 +48,15 @@ import org.apache.webbeans.util.WebBeansConstants;
import org.apache.webbeans.util.WebBeansUtil;
import javax.el.ELResolver;
+import javax.enterprise.context.ApplicationScoped;
+import javax.enterprise.context.ConversationScoped;
+import javax.enterprise.context.RequestScoped;
+import javax.enterprise.context.SessionScoped;
import javax.enterprise.context.spi.CreationalContext;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
import javax.inject.Provider;
+import javax.inject.Singleton;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletRequest;
@@ -71,7 +76,6 @@ import java.util.Set;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
/**
* @version $Rev:$ $Date:$
@@ -288,12 +292,22 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
WebappBeanManager.class.cast(beanManager).beforeStop();
}
- if (CdiAppContextsService.class.isInstance(contextsService)) {
- CdiAppContextsService.class.cast(contextsService).beforeStop(endObject);
+ webBeansContext.getContextsService().endContext(RequestScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(ConversationScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(SessionScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(ApplicationScoped.class, endObject);
+ webBeansContext.getContextsService().endContext(Singleton.class, endObject);
+
+ // clean up the EL caches after each request
+ ELContextStore elStore = ELContextStore.getInstance(false);
+ if (elStore != null)
+ {
+ elStore.destroyELContextStore();
}
+
this.beanManager.fireEvent(new BeforeShutdownImpl(), true);
- // Destroys context before BeforeShutdown event
+ // this will now even destroy the ExtensionBeans and other internal stuff
this.contextsService.destroy(endObject);
//Unbind BeanManager
@@ -374,8 +388,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
}
public static ScheduledExecutorService initializeServletContext(final ServletContext servletContext, final WebBeansContext context) {
- final String strDelay = context.getOpenWebBeansConfiguration().getProperty(OpenWebBeansConfiguration.CONVERSATION_PERIODIC_DELAY, "150000");
- final long delay = Long.parseLong(strDelay);
final ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1, new ThreadFactory() {
@Override
@@ -385,7 +397,6 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
return t;
}
});
- executorService.scheduleWithFixedDelay(new ConversationCleaner(context), delay, delay, TimeUnit.MILLISECONDS);
final ELAdaptor elAdaptor = context.getService(ELAdaptor.class);
final ELResolver resolver = elAdaptor.getOwbELResolver();
@@ -393,13 +404,7 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
if (context.getOpenWebBeansConfiguration().isJspApplication()) {
logger.debug("Application is configured as JSP. Adding EL Resolver.");
- final JspFactory factory = JspFactory.getDefaultFactory();
- if (factory != null) {
- final JspApplicationContext applicationCtx = factory.getJspApplicationContext(servletContext);
- applicationCtx.addELResolver(resolver);
- } else {
- logger.debug("Default JspFactory instance was not found");
- }
+ setJspELFactory(servletContext, resolver);
}
// Add BeanManager to the 'javax.enterprise.inject.spi.BeanManager' servlet context attribute
@@ -409,22 +414,37 @@ public class OpenEJBLifecycle implements ContainerLifecycle {
}
/**
- * Conversation cleaner thread, that
- * clears unused conversations.
+ * On Tomcat we need to sometimes force a class load to get our hands on the JspFactory
*/
- private static final class ConversationCleaner implements Runnable {
- private final WebBeansContext webBeansContext;
+ private static void setJspELFactory(ServletContext startupObject, ELResolver resolver)
+ {
+ JspFactory factory = JspFactory.getDefaultFactory();
+ if (factory == null)
+ {
+ try
+ {
+ Class.forName("org.apache.jasper.compiler.JspRuntimeContext");
+ factory = JspFactory.getDefaultFactory();
+ }
+ catch (Exception e)
+ {
+ // ignore
+ }
- private ConversationCleaner(final WebBeansContext webBeansContext) {
- this.webBeansContext = webBeansContext;
}
- public void run() {
- webBeansContext.getConversationManager().destroyWithRespectToTimout();
-
+ if (factory != null)
+ {
+ JspApplicationContext applicationCtx = factory.getJspApplicationContext(startupObject);
+ applicationCtx.addELResolver(resolver);
+ }
+ else
+ {
+ logger.warning("Default JSPFactroy instance has not found. Skipping OWB JSP handling");
}
}
+
/**
* Returns servlet context otherwise throws exception.
*
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
index ed48b9e..fef83b3 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/cdi/ThreadSingletonServiceImpl.java
@@ -121,10 +121,6 @@ public class ThreadSingletonServiceImpl implements ThreadSingletonService {
properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.RequestScoped", defaultNormalScopeHandlerClass);
}
- if (sessionContextClass() != null && tomee) {
- properties.setProperty("org.apache.webbeans.proxy.mapping.javax.enterprise.context.SessionScoped", "org.apache.tomee.catalina.cdi.SessionNormalScopeBeanHandler");
- }
-
if (SystemInstance.get().getOptions().get(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, false)) {
properties.setProperty(WEBBEANS_FAILOVER_ISSUPPORTFAILOVER, "true");
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java b/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
deleted file mode 100644
index fe97ef1..0000000
--- a/container/openejb-core/src/main/java/org/apache/openejb/cdi/UpdatableSessionContextManager.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.openejb.cdi;
-
-import org.apache.openejb.OpenEJBRuntimeException;
-import org.apache.webbeans.context.SessionContext;
-import org.apache.webbeans.web.context.SessionContextManager;
-
-import java.lang.reflect.Field;
-import java.util.Map;
-
-public class UpdatableSessionContextManager extends SessionContextManager {
- private static final Field scField;
-
- static {
- try {
- scField = SessionContextManager.class.getDeclaredField("sessionContexts");
- scField.setAccessible(true);
- } catch (final NoSuchFieldException e) {
- throw new OpenEJBRuntimeException("sessionContexts attribute of SessionContextManager not found, you probably use a not compatible version of OWB");
- }
- }
-
- private final Map<String, SessionContext> contextById;
-
- public UpdatableSessionContextManager() {
- try {
- contextById = (Map<String, SessionContext>) scField.get(this);
- } catch (final IllegalAccessException e) {
- throw new OpenEJBRuntimeException("can't get session contexts", e);
- }
- }
-
- public Map<String, SessionContext> getContextById() {
- return contextById;
- }
-
- public void updateSessionIdMapping(final String oldId, final String newId) {
- if (oldId == null) {
- return;
- }
-
- final SessionContext sc = getSessionContextWithSessionId(oldId);
- if (sc == null) {
- return;
- }
-
- addNewSessionContext(newId, sc);
- contextById.remove(oldId);
- }
-}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
index 9616622..49d4468 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/testing/ApplicationComposers.java
@@ -1027,9 +1027,9 @@ public class ApplicationComposers {
public void stopApplication() throws NamingException {
if (appContext != null) {
final ContextsService contextsService = appContext.getWebBeansContext().getContextsService();
+ // No need to stop the ConversationContext manually as it gets stored inside the SessionContext as Bean
contextsService.endContext(SessionScoped.class, session);
contextsService.endContext(RequestScoped.class, null);
- contextsService.endContext(ConversationScoped.class, null);
}
if (appInfo != null) {
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
index 41ba092..08f6b05 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/CdiAppContextsServiceTest.java
@@ -18,12 +18,11 @@ package org.apache.openejb.cdi;
import org.junit.Test;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
public class CdiAppContextsServiceTest {
@Test
public void cid() {
+/*X TODO refactor this over to any cId test in OWB
assertNull(CdiAppContextsService.getFromQuery("cid", null));
assertNull(CdiAppContextsService.getFromQuery("cid", ""));
assertNull(CdiAppContextsService.getFromQuery("cid", "superparam=cejdzl&cfdlcjlzdbc=czlbcjb&cdlzcs&cdlcjkd"));
@@ -32,5 +31,6 @@ public class CdiAppContextsServiceTest {
assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10"));
assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cecfzd=cefczerf&cfdzcd=&é&cdzc&cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln"));
assertEquals("10", CdiAppContextsService.getFromQuery("cid", "cid=10&cdsjlcbdjc=djlbcsjlb=ldjbs=cdsln"));
+*/
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
index c9a4476..c005681 100644
--- a/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
+++ b/container/openejb-core/src/test/java/org/apache/openejb/cdi/StatefulConversationScopedTOMEE1138Test.java
@@ -75,8 +75,8 @@ public class StatefulConversationScopedTOMEE1138Test {
}
@Override
- public String getConversationSessionId() {
- return "session-test";
+ public String generateConversationId() {
+ return "cid_1";
}
});
webBeansContext.getService(ContextsService.class).startContext(ConversationScoped.class, null);
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
index 36e83aa..acd4208 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/BeginWebBeansListener.java
@@ -22,18 +22,13 @@ import org.apache.openejb.cdi.ThreadSingletonServiceImpl;
import org.apache.openejb.cdi.WebappWebBeansContext;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import org.apache.webbeans.annotation.DestroyedLiteral;
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.context.ConversationContext;
-import org.apache.webbeans.conversation.ConversationManager;
import org.apache.webbeans.el.ELContextStore;
import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.spi.FailOverService;
import org.apache.webbeans.util.WebBeansUtil;
-import java.util.Map;
-import javax.enterprise.context.Conversation;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.servlet.ServletContextEvent;
@@ -188,26 +183,6 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
logger.debug("Destroying a session with session id : [{0}]", event.getSession().getId());
}
- // ensure session ThreadLocal is set
- webBeansContext.getContextsService().startContext(SessionScoped.class, event.getSession());
-
- if (WebappWebBeansContext.class.isInstance(webBeansContext)) { // end after child
- WebappWebBeansContext.class.cast(webBeansContext).getParent().getContextsService().endContext(SessionScoped.class, event.getSession());
- }
-
- final CdiAppContextsService appContextsService = CdiAppContextsService.class.cast(webBeansContext.getContextsService());
- if (appContextsService.getRequestContext(false) != null) {
- final String id = event.getSession().getId(); // capture it eagerly!
- appContextsService.pushRequestReleasable(new Runnable() {
- @Override
- public void run() {
- doDestroyConversations(id);
- }
- });
- } else {
- doDestroyConversations(event.getSession().getId());
- }
-
webBeansContext.getContextsService().endContext(SessionScoped.class, event.getSession());
WebBeansListenerHelper.destroyFakedRequest(this);
@@ -240,14 +215,4 @@ public class BeginWebBeansListener implements ServletContextListener, ServletReq
WebBeansListenerHelper.destroyFakedRequest(this);
}
- private void doDestroyConversations(final String id) {
- final ConversationManager conversationManager = webBeansContext.getConversationManager();
- final Map<Conversation, ConversationContext> cc = conversationManager.getAndRemoveConversationMapWithSessionId(id);
- for (final Map.Entry<Conversation, ConversationContext> c : cc.entrySet()) {
- if (c != null) {
- c.getValue().destroy();
- webBeansContext.getBeanManagerImpl().fireEvent(c.getKey().getId(), DestroyedLiteral.INSTANCE_CONVERSATION_SCOPED);
- }
- }
- }
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
index 65d15e1..de5841f 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/EndWebBeansListener.java
@@ -19,7 +19,6 @@ package org.apache.openejb.server.httpd;
import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.webbeans.config.WebBeansContext;
import org.apache.webbeans.spi.ContextsService;
-import org.apache.webbeans.spi.FailOverService;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
@@ -36,8 +35,6 @@ import javax.servlet.http.HttpSessionListener;
*/
public class EndWebBeansListener implements ServletContextListener, ServletRequestListener, HttpSessionListener, HttpSessionActivationListener {
- protected FailOverService failoverService;
-
/**
* Manages the container lifecycle
*/
@@ -52,7 +49,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
public EndWebBeansListener(WebBeansContext webBeansContext) {
this.webBeansContext = webBeansContext;
if (webBeansContext != null) {
- this.failoverService = this.webBeansContext.getService(FailOverService.class);
this.contextsService = CdiAppContextsService.class.cast(webBeansContext.getService(ContextsService.class));
} else {
this.contextsService = null;
@@ -72,9 +68,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
*/
@Override
public void requestInitialized(ServletRequestEvent event) {
- if (contextsService != null && contextsService.isAutoConversationCheck()) {
- contextsService.checkConversationState();
- }
}
/**
@@ -99,9 +92,6 @@ public class EndWebBeansListener implements ServletContextListener, ServletReque
return;
}
- if (failoverService != null && failoverService.isSupportPassivation()) {
- failoverService.sessionWillPassivate(event.getSession());
- }
WebBeansListenerHelper.destroyFakedRequest(this);
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
index 7cbaa0b..ae80d63 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpListenerRegistry.java
@@ -35,7 +35,6 @@ import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
import org.apache.openejb.AppContext;
import org.apache.openejb.assembler.classic.WebAppBuilder;
-import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.openejb.cdi.Proxys;
import org.apache.openejb.core.ParentClassLoaderFinder;
import org.apache.openejb.core.WebContext;
@@ -43,8 +42,7 @@ import org.apache.openejb.loader.IO;
import org.apache.openejb.loader.SystemInstance;
import org.apache.openejb.util.AppFinder;
import org.apache.openejb.web.LightweightWebAppBuilder;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.spi.ContextsService;
+
/**
* @version $Revision$ $Date$
@@ -184,10 +182,6 @@ public class HttpListenerRegistry implements HttpListener {
for (final Map.Entry<String, HttpListener> entry : listeners.entrySet()) {
final String pattern = entry.getKey();
if (path.matches(pattern) || path.equals(pattern)) {
- final WebBeansContext wbc = WebBeansContext.class.cast(request.getAttribute("openejb_owb_context"));
- if (wbc != null) {
- CdiAppContextsService.class.cast(wbc.getService(ContextsService.class)).checkConversationState();
- }
if (pattern.contains("/.*\\.") && HttpRequestImpl.class.isInstance(request)) { // TODO: enhance it, basically servlet *.xxx
HttpRequestImpl.class.cast(request).noPathInfo();
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
index 3751ef0..6006178 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/HttpRequestImpl.java
@@ -104,6 +104,9 @@ public class HttpRequestImpl implements HttpRequest {
return;
}
es.shutdownNow();
+ for (RequestSession requestSession : SESSIONS.values()) {
+ requestSession.session.invalidate();
+ }
SESSIONS.clear();
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
----------------------------------------------------------------------
diff --git a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
index db0578c..979e676 100644
--- a/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
+++ b/server/openejb-http/src/main/java/org/apache/openejb/server/httpd/WebBeansListenerHelper.java
@@ -22,6 +22,9 @@ import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.spi.Context;
import javax.servlet.ServletRequestListener;
+/**
+ * @deprecated this features is imo highly questionable. We should rather fix the root of the issue
+ */
public final class WebBeansListenerHelper {
private static final ThreadLocal<Boolean> FAKE_REQUEST = new ThreadLocal<Boolean>();
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
index d7bdbe6..753b021 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/OpenEJBContextConfig.java
@@ -35,7 +35,6 @@ import org.apache.openejb.assembler.classic.ResourceInfo;
import org.apache.openejb.assembler.classic.ServletInfo;
import org.apache.openejb.assembler.classic.WebAppBuilder;
import org.apache.openejb.assembler.classic.WebAppInfo;
-import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.openejb.config.ConfigurationFactory;
import org.apache.openejb.config.NewLoaderLogic;
import org.apache.openejb.config.ServiceUtils;
@@ -60,16 +59,9 @@ import org.apache.tomee.common.NamingUtil;
import org.apache.tomee.common.ResourceFactory;
import org.apache.tomee.jasper.TomEEJasperInitializer;
import org.apache.tomee.loader.TomcatHelper;
-import org.apache.webbeans.config.WebBeansContext;
import org.apache.xbean.finder.IAnnotationFinder;
-import javax.servlet.Filter;
-import javax.servlet.FilterChain;
-import javax.servlet.FilterConfig;
import javax.servlet.ServletContainerInitializer;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.ws.rs.core.Application;
import java.io.ByteArrayInputStream;
@@ -373,16 +365,6 @@ public class OpenEJBContextConfig extends ContextConfig {
webXml.addFilterMapping(mapping);
}
- {
- final FilterDef filter = new FilterDef();
- filter.setAsyncSupported("true");
- filter.setDescription("CDI Conversation Filter");
- filter.setDisplayName("CDI Conversation Filter");
- filter.setFilterName("CDI Conversation Filter");
- filter.setFilterClass(ConversationFilter.class.getName());
- webXml.addFilter(filter);
- }
-
return webXml;
}
@@ -717,31 +699,4 @@ public class OpenEJBContextConfig extends ContextConfig {
return false;
}
- public static class ConversationFilter implements Filter {
- private WebBeansContext wbc;
- private CdiAppContextsService contextsService;
-
- @Override
- public void init(final FilterConfig filterConfig) throws ServletException {
- try {
- wbc = WebBeansContext.currentInstance();
- contextsService = CdiAppContextsService.class.cast(wbc.getContextsService());
- } catch (final Exception e) {
- // no-op
- }
- }
-
- @Override
- public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain) throws IOException, ServletException {
- if (contextsService != null) {
- contextsService.checkConversationState();
- }
- chain.doFilter(request, response);
- }
-
- @Override
- public void destroy() {
- // no-op
- }
- }
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
index 048efa1..f842923 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomEEContainerListener.java
@@ -18,11 +18,8 @@ package org.apache.tomee.catalina;
import org.apache.catalina.ContainerEvent;
import org.apache.catalina.ContainerListener;
-import org.apache.catalina.Context;
import org.apache.catalina.core.StandardContext;
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.spi.ContextsService;
+
public class TomEEContainerListener implements ContainerListener {
private static final ThreadLocal<StandardContext> context = new ThreadLocal<StandardContext>();
@@ -33,14 +30,6 @@ public class TomEEContainerListener implements ContainerListener {
context.set((StandardContext) event.getContainer());
} else if ("afterContextInitialized".equals(event.getType())) {
context.remove();
- } else if (Context.CHANGE_SESSION_ID_EVENT.endsWith(event.getType())) {
- final String[] ids = (String[]) event.getData();
-
- final WebBeansContext wbc = WebBeansContext.currentInstance();
- final ContextsService cs = wbc.getContextsService();
- if (CdiAppContextsService.class.isInstance(cs) && ids.length > 0) {
- ((CdiAppContextsService) cs).updateSessionIdMapping(ids[0], ids[1]);
- }
}
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
index 1f9c81a..24a31e0 100644
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
+++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
@@ -78,7 +78,6 @@ import org.apache.openejb.assembler.classic.ServletInfo;
import org.apache.openejb.assembler.classic.WebAppBuilder;
import org.apache.openejb.assembler.classic.WebAppInfo;
import org.apache.openejb.assembler.classic.event.NewEjbAvailableAfterApplicationCreated;
-import org.apache.openejb.cdi.CdiAppContextsService;
import org.apache.openejb.cdi.CdiBuilder;
import org.apache.openejb.cdi.OpenEJBLifecycle;
import org.apache.openejb.cdi.Proxys;
@@ -128,6 +127,7 @@ import org.apache.tomee.common.NamingUtil;
import org.apache.tomee.common.UserTransactionFactory;
import org.apache.tomee.loader.TomcatHelper;
import org.apache.webbeans.config.WebBeansContext;
+import org.apache.webbeans.spi.ContextsService;
import org.apache.webbeans.spi.adaptor.ELAdaptor;
import org.omg.CORBA.ORB;
@@ -1071,9 +1071,9 @@ public class TomcatWebAppBuilder implements WebAppBuilder, ContextListener, Pare
}
for (final FilterMap map : standardContext.findFilterMaps()) {
if ("CDI Conversation Filter".equals(map.getFilterName()) && webContext.getWebBeansContext() != null) {
- final CdiAppContextsService cdiAppContextsService = CdiAppContextsService.class.cast(webContext.getWebBeansContext().getContextsService());
- if (cdiAppContextsService != null) {
- cdiAppContextsService.setAutoConversationCheck(false);
+ ContextsService contextsService = webContext.getWebBeansContext().getContextsService();
+ if (contextsService != null) {
+ contextsService.setSupportConversations(false);
}
break;
}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
deleted file mode 100644
index 585a011..0000000
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionContextBackedByHttpSession.java
+++ /dev/null
@@ -1,289 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.catalina.cdi;
-
-import org.apache.catalina.session.StandardSession;
-import org.apache.catalina.session.StandardSessionFacade;
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.util.reflection.Reflections;
-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 CdiAppContextsService.HttpSessionContextSessionAware {
- private static final String WRAPPER = SystemInstance.get().getProperty("tomee.session-context.wrapper", "direct");
-
- public SessionContextBackedByHttpSession(final HttpSession session) {
- super(session);
- setComponentSessionInstanceMap(); // override default map (set in super())
- }
-
- @SuppressWarnings("unchecked")
- public void setComponentSessionInstanceMap() {
- HttpSession session = getSession();
- if (session == null) {
- super.setComponentInstanceMap();
- return;
- }
-
- if (session instanceof StandardSessionFacade) {
- try {
- session = (HttpSession) Reflections.get(session, "session");
- } catch (final Exception e) {
- // no-op
- }
- }
-
- if (StandardSession.class.equals(session.getClass())) { // local session, use fastest wrapper
- try {
- final ConcurrentHashMap<String, Object> map = (ConcurrentHashMap<String, Object>) Reflections.get(session, "attributes");
- if (WRAPPER.equals("direct")) {
- componentInstanceMap = new DirectSessionMap(map);
- } else {
- componentInstanceMap = new HttpSessionMap(session);
- }
- } catch (final Exception e) {
- componentInstanceMap = new HttpSessionMap(session);
- }
- } else {
- componentInstanceMap = new HttpSessionMap(session);
- }
- }
-
- public static String key(final Object key) {
- if (key instanceof String) { // avoid nested calls
- return (String) key;
- }
-
- final String id = WebBeansUtil.getPassivationId((Contextual<?>) key);
- if (id != null) {
- return id;
- }
- return key.toString(); // shouldn't occur
- }
-
- 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(final Object key) {
- return (BeanInstanceBag<?>) delegate.get(key(key));
- }
-
- @Override
- public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) {
- return (BeanInstanceBag<?>) delegate.put(key(key), value);
- }
-
- @Override
- public BeanInstanceBag<?> remove(final Object key) {
- return (BeanInstanceBag<?>) delegate.remove(key(key));
- }
-
- @Override
- public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) {
- for (final 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(final Contextual<?> key, final BeanInstanceBag<?> value) {
- return (BeanInstanceBag<?>) delegate.putIfAbsent(key(key), value);
- }
-
- @Override
- public boolean remove(final Object key, final Object value) {
- return delegate.remove(key(key), value);
- }
-
- @Override
- public boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) {
- return delegate.replace(key(key), oldValue, newValue);
- }
-
- @Override
- public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) {
- return (BeanInstanceBag<?>) delegate.replace(key(key), value);
- }
- }
-
- private static class HttpSessionMap implements ConcurrentMap<Contextual<?>,BeanInstanceBag<?>> { // not sure it can really work
- private final HttpSession session;
-
- public HttpSessionMap(final HttpSession session) {
- this.session = session;
- }
-
- @Override
- public int size() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean isEmpty() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public boolean containsKey(final Object key) {
- return session.getAttribute(key(key)) != null;
- }
-
- @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 boolean replace(final Contextual<?> key, final BeanInstanceBag<?> oldValue, final BeanInstanceBag<?> newValue) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public BeanInstanceBag<?> replace(final Contextual<?> key, final BeanInstanceBag<?> value) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void clear() {
- // no-op
- }
-
- @Override
- public Set<Entry<Contextual<?>, BeanInstanceBag<?>>> entrySet() {
- return Collections.emptySet();
- }
-
- @Override
- public BeanInstanceBag<?> get(final Object key) {
- return (BeanInstanceBag<?>) session.getAttribute(key(key));
- }
-
- @Override
- public BeanInstanceBag<?> put(final Contextual<?> key, final BeanInstanceBag<?> value) {
- final BeanInstanceBag<?> bag = get(key);
- session.setAttribute(key(key), value);
- return bag;
- }
-
- @Override
- public BeanInstanceBag<?> remove(final Object key) {
- final BeanInstanceBag<?> bag = get(key);
- session.removeAttribute(key(key));
- return bag;
- }
-
- @Override
- public void putAll(final Map<? extends Contextual<?>, ? extends BeanInstanceBag<?>> m) {
- for (final 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;
- }
-
- @Override
- public String toString() {
- return "HttpSessionMap{session=" + session + '}';
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/tomee/blob/e41c460f/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
----------------------------------------------------------------------
diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
deleted file mode 100644
index 71b2c2a..0000000
--- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/cdi/SessionNormalScopeBeanHandler.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.tomee.catalina.cdi;
-
-import org.apache.openejb.cdi.CdiAppContextsService;
-import org.apache.tomee.catalina.TomEERuntimeException;
-import org.apache.webbeans.context.creational.BeanInstanceBag;
-import org.apache.webbeans.intercept.NormalScopedBeanInterceptorHandler;
-
-import javax.enterprise.context.SessionScoped;
-import javax.enterprise.context.spi.Context;
-import javax.enterprise.inject.spi.Bean;
-import javax.enterprise.inject.spi.BeanManager;
-import javax.servlet.http.HttpSession;
-import java.lang.reflect.Field;
-import java.util.HashMap;
-import java.util.Map;
-
-public class SessionNormalScopeBeanHandler extends NormalScopedBeanInterceptorHandler {
- private static final Field BAG_INSTANCE;
- static {
- try {
- BAG_INSTANCE = BeanInstanceBag.class.getDeclaredField("beanInstance");
- BAG_INSTANCE.setAccessible(true);
- } catch (final NoSuchFieldException e) {
- throw new TomEERuntimeException(e);
- }
- }
-
- private static final ThreadLocal<Map<Bean<?>, UpdateInfo>> OBJECTS = new ThreadLocal<Map<Bean<?>, UpdateInfo>>() {
- @Override
- protected Map<Bean<?>, UpdateInfo> initialValue() {
- CdiAppContextsService.pushRequestReleasable(new Runnable() { // update in batch
- @Override
- public void run() {
- final Map<Bean<?>, UpdateInfo> values = OBJECTS.get();
- for (final UpdateInfo o : values.values()) {
- o.updateBean();
- }
- values.clear();
- OBJECTS.remove();
- }
- });
- return new HashMap<Bean<?>, UpdateInfo>();
- }
- };
-
- public SessionNormalScopeBeanHandler(final BeanManager beanManager, final Bean<?> bean) {
- super(beanManager, bean);
- }
-
- @Override
- public Object get() {
- final Object webbeansInstance = getContextualInstance();
- final Map<Bean<?>, UpdateInfo> beanUpdateInfoMap = OBJECTS.get();
-
- if (!beanUpdateInfoMap.containsKey(bean)) {
- beanUpdateInfoMap.put(bean, new UpdateInfo(bean, getBeanManager(), webbeansInstance));
- }
-
- return webbeansInstance;
- }
-
- protected static class UpdateInfo {
- private Bean<?> bean;
- private BeanManager bm;
- private Object value;
-
- protected UpdateInfo(final Bean<?> bean, final BeanManager bm, final Object value) {
- this.bean = bean;
- this.bm = bm;
- this.value = value;
- }
-
- @SuppressWarnings("unchecked")
- protected void updateBean() {
- final HttpSession session = session();
- if (session == null) {
- return;
- }
-
- // go through all listeners to be able to be replicated or do any processing which can be done
- final String key = SessionContextBackedByHttpSession.key(bean);
- final BeanInstanceBag<Object> bag = BeanInstanceBag.class.cast(session.getAttribute(key));
- if (bag != null) {
- try {
- BAG_INSTANCE.set(bag, value);
- } catch (final IllegalAccessException e) {
- throw new TomEERuntimeException(e);
- }
- session.setAttribute(key, bag);
- }
- }
-
- private HttpSession session() {
- final Context context = bm.getContext(SessionScoped.class);
- if (!SessionContextBackedByHttpSession.class.isInstance(context)) {
- return null;
- }
- return SessionContextBackedByHttpSession.class.cast(context).getSession();
- }
- }
-}