You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by dj...@apache.org on 2011/07/07 22:44:12 UTC
svn commit: r1144027 -
/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
Author: djencks
Date: Thu Jul 7 20:44:12 2011
New Revision: 1144027
URL: http://svn.apache.org/viewvc?rev=1144027&view=rev
Log:
GERONIMO-6043 make the CdiAppContextsService able to support conversation scope
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
Modified: openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java?rev=1144027&r1=1144026&r2=1144027&view=diff
==============================================================================
--- openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java (original)
+++ openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/cdi/CdiAppContextsService.java Thu Jul 7 20:44:12 2011
@@ -16,11 +16,12 @@
*/
package org.apache.openejb.cdi;
-import org.apache.openejb.core.ThreadContext;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
+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;
@@ -29,31 +30,41 @@ import org.apache.webbeans.spi.ContextsS
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.ContextException;
+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 java.lang.annotation.Annotation;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
public class CdiAppContextsService extends AbstractContextsService implements ContextsService {
private static final Logger logger = Logger.getInstance(LogCategory.OPENEJB.createChild("cdi"), CdiAppContextsService.class);
- private ThreadLocal<RequestContext> requestContext = new ThreadLocal<RequestContext>();
- private ThreadLocal<SessionContext> sessionContext = new ThreadLocal<SessionContext>();
- private DependentContext dependentContext = new DependentContext();
+ private final ThreadLocal<RequestContext> requestContext = new ThreadLocal<RequestContext>();
+ private final ThreadLocal<SessionContext> sessionContext = new ThreadLocal<SessionContext>();
+ private final ThreadLocal<ConversationContext> conversationContext;
+ private final DependentContext dependentContext = new DependentContext();
private final ApplicationContext currentApplicationContext = new ApplicationContext();
private final SingletonContext currentSingletonContext = new SingletonContext();
public CdiAppContextsService() {
+ this(false);
+ }
+
+ public CdiAppContextsService(WebBeansContext webBeansContext) {
+ this(webBeansContext.getOpenWebBeansConfiguration().supportsConversation());
+ }
+
+ public CdiAppContextsService(boolean supportsConversation) {
dependentContext.setActive(true);
+ if (supportsConversation) {
+ conversationContext = new ThreadLocal<ConversationContext>();
+ } else {
+ conversationContext = null;
+ }
}
@Override
@@ -74,6 +85,8 @@ public class CdiAppContextsService exten
// Do nothing
} else if (scopeType.equals(Singleton.class)) {
initSingletonContext();
+ } else if (conversationContext != null && scopeType.equals(ConversationScoped.class)) {
+ initConversationContext((ConversationContext)startParameter);
} else {
if (logger.isWarningEnabled()) {
logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
@@ -98,6 +111,8 @@ public class CdiAppContextsService exten
// Do nothing
} else if (scopeType.equals(Singleton.class)) {
destroySingletonContext();
+ } else if (conversationContext != null && scopeType.equals(ConversationScoped.class)) {
+ destroyConversationContext();
} else {
if (logger.isWarningEnabled()) {
logger.warning("CDI-OpenWebBeans container in OpenEJB does not support context scope "
@@ -120,6 +135,8 @@ public class CdiAppContextsService exten
return currentApplicationContext;
} else if (scopeType.equals(Dependent.class)) {
return dependentContext;
+ } else if (conversationContext != null && scopeType.equals(ConversationScoped.class)) {
+ return getConversationContext();
} else {
return currentSingletonContext;
}
@@ -138,7 +155,6 @@ public class CdiAppContextsService exten
requestContext.set(context);
}
return context;
-// return ThreadContext.getThreadContext().get(RequestContext.class);
}
private Context getSessionContext() {
@@ -172,13 +188,59 @@ public class CdiAppContextsService exten
|| scopeType.equals(SessionScoped.class)
|| scopeType.equals(ApplicationScoped.class)
|| scopeType.equals(Dependent.class)
- || scopeType.equals(Singleton.class)) {
+ || scopeType.equals(Singleton.class)
+ || (scopeType.equals(ConversationScoped.class) && conversationContext != null)) {
return true;
}
return false;
}
+ /**
+ * Get current conversation ctx.
+ *
+ * @return conversation context
+ */
+ private ConversationContext getConversationContext() {
+ return conversationContext.get();
+ }
+
+ /**
+ * Initialize conversation context.
+ *
+ * @param context context
+ */
+ private void initConversationContext(ConversationContext context) {
+ if (context == null) {
+ if (conversationContext.get() == null) {
+ ConversationContext newContext = new ConversationContext();
+ newContext.setActive(true);
+
+ conversationContext.set(newContext);
+ } else {
+ conversationContext.get().setActive(true);
+ }
+
+ } else {
+ context.setActive(true);
+ conversationContext.set(context);
+ }
+ }
+
+ /**
+ * Destroy conversation context.
+ */
+ private void destroyConversationContext() {
+ ConversationContext context = getConversationContext();
+
+ if (context != null) {
+ context.destroy();
+ }
+
+ conversationContext.set(null);
+ conversationContext.remove();
+ }
+
private void initRequestContext() {
RequestContext rq = new RequestContext();