You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openwebbeans.apache.org by ta...@apache.org on 2013/05/06 19:18:12 UTC
svn commit: r1479646 - in /openwebbeans/branches/owb_1.1.x:
webbeans-impl/src/main/java/org/apache/webbeans/conversation/
webbeans-web/src/main/java/org/apache/webbeans/servlet/
webbeans-web/src/main/java/org/apache/webbeans/web/context/
Author: tandraschko
Date: Mon May 6 17:18:12 2013
New Revision: 1479646
URL: http://svn.apache.org/r1479646
Log:
OWB-841 - "Could NOT lazily initialize session context because of null RequestContext" always occur on session expire
Modified:
openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java
openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationHttpSessionListener.java
openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java
openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java
openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
Modified: openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java?rev=1479646&r1=1479645&r2=1479646&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-impl/src/main/java/org/apache/webbeans/conversation/ConversationManager.java Mon May 6 17:18:12 2013
@@ -18,7 +18,6 @@
*/
package org.apache.webbeans.conversation;
-import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
@@ -117,7 +116,30 @@ public class ConversationManager
return map;
}
-
+ /**
+ * Return all conversation/context associated with sessionid.
+ *
+ * @param sessionId
+ * @return
+ */
+ public Map<Conversation, ConversationContext> getAndRemoveConversationMapWithSessionId(String sessionId)
+ {
+ Asserts.assertNotNull(sessionId,"sessionId parameter can not be null");
+ Set<Conversation> set = conversations.keySet();
+ Iterator<Conversation> it = set.iterator();
+ ConversationImpl conv = null;
+ Map<Conversation, ConversationContext> map = new HashMap<Conversation, ConversationContext>();
+ while (it.hasNext())
+ {
+ conv = (ConversationImpl) it.next();
+ if (conv.getSessionId().equals(sessionId))
+ {
+ map.put(conv, conversations.remove(conv));
+ }
+ }
+ return map;
+ }
+
/**
* Remove given conversation.
* @param conversation conversation instance
@@ -173,6 +195,7 @@ public class ConversationManager
* Destroy conversations with given session id.
* @param sessionId session id
*/
+ @Deprecated
public void destroyConversationContextWithSessionId(String sessionId)
{
Asserts.assertNotNull(sessionId, "sessionId parameter can not be null");
@@ -243,22 +266,9 @@ public class ConversationManager
}
}
}
-
- /**
- * Destroys all conversations
- */
- public void destroyAllConversations()
+
+ public Map<Conversation, ConversationContext> getAllConversationContexts()
{
- Collection<ConversationContext> collection = conversations.values();
- if(collection != null && collection.size() > 0)
- {
- for (ConversationContext context : collection)
- {
- context.destroy();
- }
- }
-
- //Clear conversations
- conversations.clear();
+ return this.conversations;
}
}
Modified: openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationHttpSessionListener.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationHttpSessionListener.java?rev=1479646&r1=1479645&r2=1479646&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationHttpSessionListener.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationHttpSessionListener.java Mon May 6 17:18:12 2013
@@ -18,14 +18,13 @@
*/
package org.apache.webbeans.servlet;
-
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.conversation.ConversationManager;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
import org.apache.webbeans.spi.ContainerLifecycle;
import org.apache.webbeans.util.WebBeansUtil;
+import javax.enterprise.context.ConversationScoped;
import javax.enterprise.context.SessionScoped;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
@@ -77,8 +76,6 @@ public class WebBeansConfigurationHttpSe
logger.log(Level.FINE, "Destroying a session with session id : [{0}]", event.getSession().getId());
}
this.lifeCycle.getContextService().endContext(SessionScoped.class, event.getSession());
-
- ConversationManager conversationManager = WebBeansContext.getInstance().getConversationManager();
- conversationManager.destroyConversationContextWithSessionId(event.getSession().getId());
+ this.lifeCycle.getContextService().endContext(ConversationScoped.class, event.getSession());
}
}
Modified: openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java?rev=1479646&r1=1479645&r2=1479646&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/servlet/WebBeansConfigurationListener.java Mon May 6 17:18:12 2013
@@ -21,7 +21,6 @@ package org.apache.webbeans.servlet;
import org.apache.webbeans.component.InjectionPointBean;
import org.apache.webbeans.config.OWBLogConst;
import org.apache.webbeans.config.WebBeansContext;
-import org.apache.webbeans.conversation.ConversationManager;
import org.apache.webbeans.el.ELContextStore;
import org.apache.webbeans.logger.WebBeansLoggerFacade;
import org.apache.webbeans.spi.ContainerLifecycle;
@@ -30,6 +29,7 @@ import org.apache.webbeans.util.WebBeans
import org.apache.webbeans.web.context.WebContextsService;
import org.apache.webbeans.web.util.ServletCompatibilityUtil;
+import javax.enterprise.context.ConversationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.context.SessionScoped;
import javax.servlet.ServletContextEvent;
@@ -195,8 +195,6 @@ public class WebBeansConfigurationListen
logger.log(Level.FINE, "Destroying a session with session id : [{0}]", event.getSession().getId());
}
this.lifeCycle.getContextService().endContext(SessionScoped.class, event.getSession());
-
- ConversationManager conversationManager = WebBeansContext.getInstance().getConversationManager();
- conversationManager.destroyConversationContextWithSessionId(event.getSession().getId());
+ this.lifeCycle.getContextService().endContext(ConversationScoped.class, event.getSession());
}
}
Modified: openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java?rev=1479646&r1=1479645&r2=1479646&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/SessionContextManager.java Mon May 6 17:18:12 2013
@@ -18,7 +18,6 @@
*/
package org.apache.webbeans.web.context;
-import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@@ -73,34 +72,17 @@ public class SessionContextManager
}
/**
- * Destroy session context with given id.
+ * Removes the {@link SessionContext} for the given id.
+ *
* @param sessionId session id
*/
- public void destroySessionContextWithSessionId(String sessionId)
+ public void removeSessionContextWithSessionId(String sessionId)
{
- SessionContext sessionContext = this.sessionContexts.remove(sessionId);
- if(sessionContext != null)
- {
- sessionContext.destroy();
- }
+ this.sessionContexts.remove(sessionId);
}
- /**
- * Destroys all sessions.
- */
- public void destroyAllSessions()
+ public Map<String, SessionContext> getAllSessionContexts()
{
- //Destroy all contexts
- Collection<SessionContext> allSessionContexts = this.sessionContexts.values();
- if(allSessionContexts != null && allSessionContexts.size() > 0)
- {
- for(SessionContext sessionContext : allSessionContexts)
- {
- sessionContext.destroy();
- }
-
- //Clear map
- allSessionContexts.clear();
- }
+ return sessionContexts;
}
}
Modified: openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java
URL: http://svn.apache.org/viewvc/openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java?rev=1479646&r1=1479645&r2=1479646&view=diff
==============================================================================
--- openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java (original)
+++ openwebbeans/branches/owb_1.1.x/webbeans-web/src/main/java/org/apache/webbeans/web/context/WebContextsService.java Mon May 6 17:18:12 2013
@@ -48,7 +48,9 @@ import javax.servlet.ServletRequestEvent
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.annotation.Annotation;
+import java.util.Collection;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -221,6 +223,11 @@ public class WebContextsService extends
}
else if(supportsConversation && scopeType.equals(ConversationScoped.class))
{
+ if (endParameters != null && endParameters instanceof HttpSession)
+ {
+ destoryAllConversationsForSession((HttpSession) endParameters);
+ }
+
destroyConversationContext();
}
else if(scopeType.equals(Dependent.class))
@@ -481,6 +488,12 @@ public class WebContextsService extends
//Get current session context
SessionContext context = sessionContexts.get();
+ if (context == null)
+ {
+ initSessionContext(session);
+ context = sessionContexts.get();
+ }
+
//Destroy context
if (context != null)
{
@@ -492,7 +505,7 @@ public class WebContextsService extends
sessionContexts.remove();
//Remove session from manager
- sessionCtxManager.destroySessionContextWithSessionId(session.getId());
+ sessionCtxManager.removeSessionContextWithSessionId(session.getId());
}
}
@@ -564,10 +577,40 @@ public class WebContextsService extends
}
//destroyDependents all sessions
- sessionCtxManager.destroyAllSessions();
+ Collection<SessionContext> allSessionContexts = sessionCtxManager.getAllSessionContexts().values();
+ if (allSessionContexts != null && allSessionContexts.size() > 0)
+ {
+ for (SessionContext sessionContext : allSessionContexts)
+ {
+ sessionContexts.set(sessionContext);
+
+ sessionContext.destroy();
+
+ sessionContexts.set(null);
+ sessionContexts.remove();
+ }
+
+ //Clear map
+ allSessionContexts.clear();
+ }
//destroyDependents all conversations
- conversationManager.destroyAllConversations();
+ Collection<ConversationContext> allConversationContexts = conversationManager.getAllConversationContexts().values();
+ if (allConversationContexts != null && allConversationContexts.size() > 0)
+ {
+ for (ConversationContext conversationContext : allConversationContexts)
+ {
+ conversationContexts.set(conversationContext);
+
+ conversationContext.destroy();
+
+ conversationContexts.set(null);
+ conversationContexts.remove();
+ }
+
+ //Clear conversations
+ allConversationContexts.clear();
+ }
//Also clear application and singleton context
applicationContexts.set(null);
@@ -688,6 +731,27 @@ public class WebContextsService extends
}
/**
+ * Workaround for OWB-841
+ *
+ * @param session The current {@link HttpSession}
+ */
+ private void destoryAllConversationsForSession(HttpSession session)
+ {
+ Map<Conversation, ConversationContext> conversations =
+ conversationManager.getAndRemoveConversationMapWithSessionId(session.getId());
+
+ for (Entry<Conversation, ConversationContext> entry : conversations.entrySet())
+ {
+ conversationContexts.set(entry.getValue());
+
+ entry.getValue().destroy();
+
+ conversationContexts.set(null);
+ conversationContexts.remove();
+ }
+ }
+
+ /**
* Get current request ctx.
* @return request context
*/