You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by im...@apache.org on 2006/05/03 22:30:20 UTC

svn commit: r399408 - in /myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation: ConversationExternalContext.java ConversationManager.java ConversationServletFilter.java FakeMap.java

Author: imario
Date: Wed May  3 13:29:59 2006
New Revision: 399408

URL: http://svn.apache.org/viewcvs?rev=399408&view=rev
Log:
provide a very limited external context if faces context is not there - eg. if called by methods from the conversationServletFilter

Added:
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java   (with props)
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java   (with props)
Modified:
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationManager.java
    myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationServletFilter.java

Added: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java?rev=399408&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java (added)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java Wed May  3 13:29:59 2006
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.myfaces.custom.conversation;
+
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * we need some information we normally get from the FacesContext.getExternalContext BEFORE the FacesContext is active.
+ * So we require our own ExternalContext.
+ */
+public class ConversationExternalContext
+{
+	private final Map requestMap;
+	private final Map requestParameterMap;
+	
+	protected ConversationExternalContext(Map requestMap, Map requestParameterMap)
+	{
+		this.requestMap = requestMap;
+		this.requestParameterMap = requestParameterMap;
+	}
+	
+	public static ConversationExternalContext create(final HttpServletRequest httpRequest)
+	{
+		Map requestParameterMap = new FakeMap()
+		{
+			public boolean containsKey(Object key)
+			{
+				return httpRequest.getParameter((String) key) != null;
+			}
+
+			public Object get(Object key)
+			{
+				return httpRequest.getParameter((String) key);
+			}
+		};
+ 
+		Map requestMap = new FakeMap()
+		{
+			public boolean containsKey(Object key)
+			{
+				return httpRequest.getAttribute((String) key) != null;
+			}
+
+			public Object get(Object key)
+			{
+				return httpRequest.getAttribute((String) key);
+			}
+
+			public Object put(Object key, Object value)
+			{
+				Object prev = httpRequest.getAttribute((String) key);
+				httpRequest.setAttribute((String) key, value);
+				return prev;
+			}
+		};
+		
+		return new ConversationExternalContext(requestMap, requestParameterMap);
+	}
+
+	public Map getRequestMap()
+	{
+		return requestMap;
+	}
+
+	public Map getRequestParameterMap()
+	{
+		return requestParameterMap;
+	}
+}

Propchange: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationExternalContext.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationManager.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationManager.java?rev=399408&r1=399407&r2=399408&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationManager.java (original)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationManager.java Wed May  3 13:29:59 2006
@@ -45,7 +45,6 @@
 	private PersistenceManagerFactory persistenceManagerFactory;
 	
 	private final Map conversationContexts = new HashMap();
-	
 	private final List registeredEndConversations = new ArrayList(10);
 	
 	protected ConversationManager()
@@ -103,14 +102,35 @@
 	 */
 	protected Long getConversationContextId()
 	{
+		Map requestMap;
+		Map requestParameterMap;
+		
 		FacesContext context = FacesContext.getCurrentInstance();
+		if (context != null)
+		{
+			requestMap = context.getExternalContext().getRequestMap();
+			requestParameterMap = context.getExternalContext().getRequestParameterMap();
+		}
+		else
+		{
+			ConversationExternalContext ccontext = ConversationServletFilter.getConversationExternalContext();
+			if (ccontext != null)
+			{
+				requestMap = ccontext.getRequestMap();
+				requestParameterMap = ccontext.getRequestParameterMap();
+			}
+			else
+			{
+				throw new IllegalStateException("cant find a requestMap or requestParameterMap");
+			}
+		}
 		
-		Long conversationContextId = (Long) context.getExternalContext().getRequestMap().get(CONVERSATION_CONTEXT_REQ);
+		Long conversationContextId = (Long) requestMap.get(CONVERSATION_CONTEXT_REQ);
 		if (conversationContextId == null)
 		{
-			if (context.getExternalContext().getRequestParameterMap().containsKey(CONVERSATION_CONTEXT_PARAM))
+			if (requestParameterMap.containsKey(CONVERSATION_CONTEXT_PARAM))
 			{
-				String urlConversationContextId = context.getExternalContext().getRequestParameterMap().get(CONVERSATION_CONTEXT_PARAM).toString();
+				String urlConversationContextId = requestParameterMap.get(CONVERSATION_CONTEXT_PARAM).toString();
 				conversationContextId = new Long(Long.parseLong(urlConversationContextId, Character.MAX_RADIX));
 			}
 			else
@@ -122,7 +142,7 @@
 				}
 			}
 			
-			context.getExternalContext().getRequestMap().put(CONVERSATION_CONTEXT_REQ, conversationContextId);
+			requestMap.put(CONVERSATION_CONTEXT_REQ, conversationContextId);
 		}
 		
 		return conversationContextId;
@@ -234,21 +254,6 @@
 	{
 		return registeredEndConversations;
 	}
-
-	/**
-	 * Inject all beans of the current conversation
-	 * @see ConversationContext#injectConversationBeans(FacesContext) 
-	protected void injectConversationBeans(FacesContext context)
-	{
-		ConversationContext conversationContext = getConversationContext();
-		if (conversationContext == null)
-		{
-			return;
-		}
-		
-		conversationContext.injectConversationBeans(context);
-	}
-	 */
 
 	/**
 	 * check if we have a conversation context

Modified: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationServletFilter.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationServletFilter.java?rev=399408&r1=399407&r2=399408&view=diff
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationServletFilter.java (original)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/ConversationServletFilter.java Wed May  3 13:29:59 2006
@@ -9,11 +9,14 @@
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
 
 public class ConversationServletFilter implements Filter
 {
 	public final static String CONVERSATION_FILTER_CALLED = "org.apache.myfaces.conversation.ConversationServletFilter.CALLED";
-	
+
+	private final static ThreadLocal externalContext = new ThreadLocal();  
+
 	public void init(FilterConfig arg0) throws ServletException
 	{
 	}
@@ -26,10 +29,17 @@
 		{
 			if (request instanceof HttpServletRequest)
 			{
-				conversationManager = ConversationManager.getInstance(((HttpServletRequest) request).getSession(false));
-				if (conversationManager != null)
+				HttpServletRequest httpRequest = (HttpServletRequest) request;
+				HttpSession httpSession = httpRequest.getSession(false);
+				if (request != null)
 				{
-					conversationManager.attachPersistence();
+					conversationManager = ConversationManager.getInstance(httpSession);
+					if (conversationManager != null)
+					{
+						externalContext.set(ConversationExternalContext.create(httpRequest));
+						
+						conversationManager.attachPersistence();
+					}
 				}
 			}
 			
@@ -42,14 +52,26 @@
 		}
 		finally
 		{
-			if (conversationManager != null)
+			try
+			{
+				if (conversationManager != null)
+				{
+					conversationManager.detachPersistence();
+				}
+			}
+			finally
 			{
-				conversationManager.detachPersistence();
+				externalContext.set(null);
 			}
 		}
 	}
 
 	public void destroy()
 	{
+	}
+	
+	protected static ConversationExternalContext getConversationExternalContext()
+	{
+		return (ConversationExternalContext) externalContext.get();
 	}
 }

Added: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java
URL: http://svn.apache.org/viewcvs/myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java?rev=399408&view=auto
==============================================================================
--- myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java (added)
+++ myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java Wed May  3 13:29:59 2006
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ *
+ * Licensed 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.myfaces.custom.conversation;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * a fake map which implements all methods but throw an UnsupportedOperationException
+ * 
+ * @author imario@apache.org
+ */
+public class FakeMap implements Map
+{
+	public void clear()
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public boolean containsKey(Object key)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public boolean containsValue(Object value)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Set entrySet()
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Object get(Object key)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public boolean isEmpty()
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Set keySet()
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Object put(Object arg0, Object arg1)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public void putAll(Map arg0)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Object remove(Object key)
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public int size()
+	{
+		throw new UnsupportedOperationException();
+	}
+
+	public Collection values()
+	{
+		throw new UnsupportedOperationException();
+	}
+}

Propchange: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: myfaces/tomahawk/trunk/sandbox/core/src/main/java/org/apache/myfaces/custom/conversation/FakeMap.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain