You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by gp...@apache.org on 2010/07/28 21:12:17 UTC
svn commit: r980166 - in /myfaces/extensions/cdi/trunk:
core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/
core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/scope/conversation/spi/
jee-modules/jsf-mo...
Author: gpetracek
Date: Wed Jul 28 19:12:16 2010
New Revision: 980166
URL: http://svn.apache.org/viewvc?rev=980166&view=rev
Log:
EXTCDI-1, EXTCDI-2 and EXTCDI-3 refactored window id and WindowHandler
Added:
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowHandler.java
- copied, changed from r978925, myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/DefaultRedirectHandler.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/WindowHandler.java
- copied, changed from r978925, myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/RedirectHandler.java
myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/request/ServerSideWindowHandler.java
Removed:
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/DefaultRedirectHandler.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/RedirectHandler.java
myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/request/DefaultRedirectHandler.java
Modified:
myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContext.java
myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContextConfig.java
myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/scope/conversation/spi/WindowContextManager.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/api/ConfigParameter.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/config/DefaultWindowContextConfig.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/CodiFacesContextFactory.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/AccessScopeAwareNavigationHandler.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowContextManager.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/JsfWindowContext.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/RedirectedConversationAwareExternalContext.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/WindowContextIdHolderComponent.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/JsfAwareWindowContextConfig.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/ConversationUtils.java
myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/RequestCache.java
myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/AccessScopeAwareNavigationHandler.java
myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/DefaultWindowContextConfig.java
myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/InterceptedRenderKit.java
myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/RedirectedConversationAwareExternalContext.java
Modified: myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContext.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContext.java (original)
+++ myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContext.java Wed Jul 28 19:12:16 2010
@@ -34,7 +34,7 @@ public interface WindowContext extends A
/**
* @return the id of the conversation (unique for each window/tab)
*/
- Long getId();
+ String getId();
/**
* @param conversationGroup group of the conversation in question
Modified: myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContextConfig.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContextConfig.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContextConfig.java (original)
+++ myfaces/extensions/cdi/trunk/core/api/src/main/java/org/apache/myfaces/extensions/cdi/core/api/scope/conversation/WindowContextConfig.java Wed Jul 28 19:12:16 2010
@@ -29,7 +29,7 @@ public abstract class WindowContextConfi
//deactivate it for higher security
- public abstract boolean isGetRequestParameterSupported();
+ public abstract boolean isUrlParameterSupported();
public abstract int getWindowContextTimeoutInMinutes();
Modified: myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/scope/conversation/spi/WindowContextManager.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/scope/conversation/spi/WindowContextManager.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/scope/conversation/spi/WindowContextManager.java (original)
+++ myfaces/extensions/cdi/trunk/core/impl/src/main/java/org/apache/myfaces/extensions/cdi/core/impl/scope/conversation/spi/WindowContextManager.java Wed Jul 28 19:12:16 2010
@@ -29,34 +29,32 @@ public interface WindowContextManager ex
{
String WINDOW_CONTEXT_MANAGER_BEAN_NAME = "windowContextManager";
- String WINDOW_CONTEXT_ID_PARAMETER_KEY = "windowContextId";
+ String WINDOW_CONTEXT_ID_PARAMETER_KEY = "windowId";
WindowContext getCurrentWindowContext();
- WindowContext getWindowContext(long windowContextId);
+ WindowContext getWindowContext(String windowContextId);
- @Deprecated
- void activateWindowContext(long windowContextId);
+ boolean activateWindowContext(String windowContextId);
- @Deprecated
- void activateWindowContext(WindowContext windowContext);
+ boolean activateWindowContext(WindowContext windowContext);
void resetCurrentWindowContext();
- void resetWindowContext(long id);
+ void resetWindowContext(String windowContextId);
void resetWindowContext(WindowContext windowContext);
//TODO
void resetConversations();
- void resetConversations(long windowContextId);
+ void resetConversations(String windowContextId);
void resetConversations(WindowContext windowContext);
void removeCurrentWindowContext();
- void removeWindowContext(long id);
+ void removeWindowContext(String windowContextId);
void removeWindowContext(WindowContext windowContext);
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/api/ConfigParameter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/api/ConfigParameter.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/api/ConfigParameter.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/api/ConfigParameter.java Wed Jul 28 19:12:16 2010
@@ -30,10 +30,10 @@ public interface ConfigParameter
static final Boolean TRANSACTION_TOKEN_ENABLED_DEFAULT = Boolean.FALSE;
- static final String GET_REQUEST_PARAMETER_ENABLED =
- CoreCodiConfigParameter.BASE_NAME + "GET_REQUEST_PARAMETER_ENABLED";
+ static final String URL_PARAMETER_ENABLED =
+ CoreCodiConfigParameter.BASE_NAME + "URL_PARAMETER_ENABLED";
- static final boolean GET_REQUEST_PARAMETER_ENABLED_DEFAULT = true;
+ static final boolean URL_PARAMETER_ENABLED_DEFAULT = true;
static final String GROUPED_CONVERSATION_TIMEOUT =
CoreCodiConfigParameter.BASE_NAME + "GROUPED_CONVERSATION_TIMEOUT";
@@ -43,5 +43,7 @@ public interface ConfigParameter
static final String WINDOW_CONTEXT_TIMEOUT =
CoreCodiConfigParameter.BASE_NAME + "WINDOW_CONTEXT_TIMEOUT";
+ //TODO
static final int WINDOW_CONTEXT_TIMEOUT_DEFAULT = 60;
+ static final int MAX_WINDOW_CONTEXT_COUNT_DEFAULT = 50;
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/config/DefaultWindowContextConfig.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/config/DefaultWindowContextConfig.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/config/DefaultWindowContextConfig.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/config/DefaultWindowContextConfig.java Wed Jul 28 19:12:16 2010
@@ -21,11 +21,11 @@ package org.apache.myfaces.extensions.cd
import org.apache.myfaces.extensions.cdi.core.api.config.Config;
import org.apache.myfaces.extensions.cdi.core.api.scope.conversation.WindowContextConfig;
import static org.apache.myfaces.extensions.cdi.javaee.jsf.api.ConfigParameter.*;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.DefaultWindowHandler;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.JsfAwareWindowContextConfig;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.RedirectHandler;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.WindowHandler;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.ConversationFactory;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.JsfAwareConversationFactory;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.request.DefaultRedirectHandler;
import javax.enterprise.context.Dependent;
import javax.enterprise.context.ApplicationScoped;
@@ -47,9 +47,9 @@ public class DefaultWindowContextConfig
@Named
@Dependent
@Config(WindowContextConfig.class)
- public boolean getRequestParameterSupported()
+ public boolean getUrlParameterSupported()
{
- return isGetRequestParameterSupported();
+ return isUrlParameterSupported();
}
@Produces
@@ -70,10 +70,12 @@ public class DefaultWindowContextConfig
return getConversationTimeoutInMinutes();
}
- public boolean isGetRequestParameterSupported()
+ //TODO <- add methods for all config parameters ->
+
+ public boolean isUrlParameterSupported()
{
lazyInit();
- return getAttribute(GET_REQUEST_PARAMETER_ENABLED, Boolean.class);
+ return getAttribute(URL_PARAMETER_ENABLED, Boolean.class);
}
public int getWindowContextTimeoutInMinutes()
@@ -105,21 +107,21 @@ public class DefaultWindowContextConfig
configInitialized = true;
- initGetRequestParameterEnabled(facesContext);
+ initUrlParameterEnabled(facesContext);
initWindowContextConversationTimeout(facesContext);
initGroupedConversationTimeout(facesContext);
}
- private void initGetRequestParameterEnabled(FacesContext facesContext)
+ private void initUrlParameterEnabled(FacesContext facesContext)
{
- boolean requestParameterEnabled = GET_REQUEST_PARAMETER_ENABLED_DEFAULT;
+ boolean requestParameterEnabled = URL_PARAMETER_ENABLED_DEFAULT;
String requestParameterEnabledString =
- facesContext.getExternalContext().getInitParameter(GET_REQUEST_PARAMETER_ENABLED);
+ facesContext.getExternalContext().getInitParameter(URL_PARAMETER_ENABLED);
if (requestParameterEnabledString == null)
{
- setAttribute(GET_REQUEST_PARAMETER_ENABLED, requestParameterEnabled);
+ setAttribute(URL_PARAMETER_ENABLED, requestParameterEnabled);
return;
}
@@ -127,11 +129,11 @@ public class DefaultWindowContextConfig
if ("".equals(requestParameterEnabledString))
{
- setAttribute(GET_REQUEST_PARAMETER_ENABLED, requestParameterEnabled);
+ setAttribute(URL_PARAMETER_ENABLED, requestParameterEnabled);
return;
}
- setAttribute(GET_REQUEST_PARAMETER_ENABLED, Boolean.parseBoolean(requestParameterEnabledString));
+ setAttribute(URL_PARAMETER_ENABLED, Boolean.parseBoolean(requestParameterEnabledString));
}
private void initWindowContextConversationTimeout(FacesContext facesContext)
@@ -180,9 +182,9 @@ public class DefaultWindowContextConfig
setAttribute(GROUPED_CONVERSATION_TIMEOUT, Integer.parseInt(timeoutString));
}
- public RedirectHandler getRedirectHandler()
+ public WindowHandler getWindowHandler()
{
- return new DefaultRedirectHandler();
+ return new DefaultWindowHandler(isUrlParameterSupported());
}
public ConversationFactory getConversationFactory()
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/CodiFacesContextFactory.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/CodiFacesContextFactory.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/CodiFacesContextFactory.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/CodiFacesContextFactory.java Wed Jul 28 19:12:16 2010
@@ -40,6 +40,8 @@ public class CodiFacesContextFactory ext
Object response,
Lifecycle lifecycle) throws FacesException
{
+ //TODO wrap response if it's an instance of HttpServletResponse (to use #encodeURL)
+
FacesContext facesContext =
this.wrappedFacesContextFactory.getFacesContext(context, request, response, lifecycle);
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/AccessScopeAwareNavigationHandler.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/AccessScopeAwareNavigationHandler.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/AccessScopeAwareNavigationHandler.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/AccessScopeAwareNavigationHandler.java Wed Jul 28 19:12:16 2010
@@ -40,6 +40,7 @@ public class AccessScopeAwareNavigationH
public void handleNavigation(FacesContext facesContext, String s, String s1)
{
+ //we have to reset it due to possible redirects
JsfUtils.resetCaches();
//TODO check myfaces core - issue? facesContext is not wrapped here
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowContextManager.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowContextManager.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowContextManager.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowContextManager.java Wed Jul 28 19:12:16 2010
@@ -30,12 +30,12 @@ import org.apache.myfaces.extensions.cdi
import org.apache.myfaces.extensions.cdi.javaee.jsf.api.listener.phase.PhaseId;
import org.apache.myfaces.extensions.cdi.javaee.jsf.api.request.RequestTypeResolver;
import org.apache.myfaces.extensions.cdi.javaee.jsf.api.request.BeforeFacesRequest;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.WindowHandler;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.ConversationUtils;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.JsfUtils;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.RequestCache;
import static org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.ConversationUtils.*;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.EditableWindowContext;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.RedirectHandler;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.JsfAwareWindowContextConfig;
import javax.annotation.PostConstruct;
@@ -48,6 +48,7 @@ import javax.enterprise.inject.Produces;
import javax.enterprise.inject.spi.InjectionPoint;
import javax.enterprise.inject.spi.Bean;
import javax.faces.component.UIComponent;
+import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.inject.Inject;
@@ -56,7 +57,6 @@ import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.atomic.AtomicLong;
import java.lang.annotation.Annotation;
/**
@@ -64,16 +64,14 @@ import java.lang.annotation.Annotation;
*
* @author Gerhard Petracek
*/
+@SuppressWarnings({"UnusedDeclaration"})
@Named(WINDOW_CONTEXT_MANAGER_BEAN_NAME)
@SessionScoped
public class DefaultWindowContextManager implements WindowContextManager
{
private static final long serialVersionUID = 2872151847183166424L;
- private Map<Long, WindowContext> windowContextMap = new ConcurrentHashMap<Long, WindowContext>();
-
- //TODO refactor to UUID?
- private AtomicLong lastWindowContextId = new AtomicLong(0);
+ private Map<String, WindowContext> windowContextMap = new ConcurrentHashMap<String, WindowContext>();
@Inject
@SuppressWarnings({"UnusedDeclaration"})
@@ -81,13 +79,13 @@ public class DefaultWindowContextManager
private WindowContextConfig windowContextConfig;
- private RedirectHandler redirectHandler;
+ private WindowHandler windowHandler;
@PostConstruct
protected void init()
{
this.windowContextConfig = this.configResolver.resolve(WindowContextConfig.class);
- this.redirectHandler = configResolver.resolve(JsfAwareWindowContextConfig.class).getRedirectHandler();
+ this.windowHandler = configResolver.resolve(JsfAwareWindowContextConfig.class).getWindowHandler();
}
@PreDestroy
@@ -214,16 +212,16 @@ public class DefaultWindowContextManager
//TODO improve performance
public WindowContext getCurrentWindowContext()
{
- Long windowContextId = RequestCache.getCurrentWindowId();
+ String windowContextId = RequestCache.getCurrentWindowId();
if(windowContextId == null)
{
- windowContextId = resolveWindowContextId(this.windowContextConfig.isGetRequestParameterSupported(),
- this.redirectHandler);
+ windowContextId = resolveWindowContextId(this.windowContextConfig.isUrlParameterSupported(),
+ this.windowHandler);
if (windowContextId == null)
{
- windowContextId = this.lastWindowContextId.incrementAndGet();
+ windowContextId = this.windowHandler.createWindowId();
cacheWindowId(windowContextId);
}
@@ -233,7 +231,7 @@ public class DefaultWindowContextManager
return getWindowContext(windowContextId);
}
- public synchronized WindowContext getWindowContext(long windowContextId)
+ public synchronized WindowContext getWindowContext(String windowContextId)
{
WindowContext result = this.windowContextMap.get(windowContextId);
@@ -246,12 +244,12 @@ public class DefaultWindowContextManager
return result;
}
- public void activateWindowContext(long id)
+ public boolean activateWindowContext(String windowContextId)
{
- activateWindowContext(getWindowContext(id));
+ return activateWindowContext(getWindowContext(windowContextId));
}
- public void activateWindowContext(WindowContext windowContext)
+ public boolean activateWindowContext(WindowContext windowContext)
{
JsfUtils.resetCaches();
FacesContext facesContext = FacesContext.getCurrentInstance();
@@ -263,7 +261,7 @@ public class DefaultWindowContextManager
windowContextIdHolder.changeWindowContextId(windowContext.getId());
}
- setWindowContextIdOfRequest(facesContext, windowContext.getId());
+ return cacheWindowId(facesContext.getExternalContext(), windowContext.getId());
}
//TODO
@@ -273,9 +271,9 @@ public class DefaultWindowContextManager
}
//TODO
- public void resetWindowContext(long id)
+ public void resetWindowContext(String windowContextId)
{
- resetWindowContext(getWindowContext(id));
+ resetWindowContext(getWindowContext(windowContextId));
}
public void resetWindowContext(WindowContext windowContext)
@@ -292,7 +290,7 @@ public class DefaultWindowContextManager
resetConversations(getCurrentWindowContext());
}
- public void resetConversations(long windowContextId)
+ public void resetConversations(String windowContextId)
{
resetConversations(getWindowContext(windowContextId));
}
@@ -317,9 +315,9 @@ public class DefaultWindowContextManager
removeWindowContext(getCurrentWindowContext());
}
- public void removeWindowContext(long id)
+ public void removeWindowContext(String windowContextId)
{
- removeWindowContext(getWindowContext(id));
+ removeWindowContext(getWindowContext(windowContextId));
}
public void removeWindowContext(WindowContext windowContext)
@@ -328,23 +326,14 @@ public class DefaultWindowContextManager
this.windowContextMap.remove(windowContext.getId());
FacesContext facesContext = FacesContext.getCurrentInstance();
+ ExternalContext externalContext = facesContext.getExternalContext();
removeWindowContextIdHolderComponent(facesContext);
- setWindowContextIdOfRequest(facesContext, null);
- windowContext.endConversations();
- }
+ //reset existing information
+ getExistingWindowIdSet(externalContext).remove(windowContext.getId());
+ externalContext.getRequestMap().remove(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY);
-
- private void setWindowContextIdOfRequest(FacesContext facesContext, Long newId)
- {
- Map requestMap = facesContext.getExternalContext().getRequestMap();
-
- if (newId != null)
- {
- //noinspection unchecked
- requestMap.put(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY, newId);
- }
- requestMap.remove(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY);
+ windowContext.endConversations();
}
private void removeWindowContextIdHolderComponent(FacesContext facesContext)
Copied: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowHandler.java (from r978925, myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/DefaultRedirectHandler.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowHandler.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowHandler.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/DefaultRedirectHandler.java&r1=978925&r2=980166&rev=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/request/DefaultRedirectHandler.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/DefaultWindowHandler.java Wed Jul 28 19:12:16 2010
@@ -16,37 +16,123 @@
* specific language governing permissions and limitations
* under the License.
*/
-package org.apache.myfaces.extensions.cdi.javaee.jsf.impl.request;
+package org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation;
import static org.apache.myfaces.extensions.cdi.core.impl.scope.conversation.spi.WindowContextManager
.WINDOW_CONTEXT_ID_PARAMETER_KEY;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.RedirectHandler;
-import static org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.ConversationUtils.parseWindowId;
+
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.WindowHandler;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.ConversationUtils;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.RequestCache;
import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
import java.io.IOException;
+import java.util.Set;
+import java.util.UUID;
/**
* @author Gerhard Petracek
*/
-public class DefaultRedirectHandler implements RedirectHandler
+public class DefaultWindowHandler implements WindowHandler
{
private static final long serialVersionUID = -103516988654873089L;
+ private static final int DEFAULT_WINDOW_KEY_LENGTH = 3;
+
+ private final String windowIdParameter = WINDOW_CONTEXT_ID_PARAMETER_KEY + "=";
+
+ protected final boolean useWindowAwareUrlEncoding;
- public void sendRedirect(ExternalContext externalContext, String url, Long windowId) throws IOException
+ public DefaultWindowHandler(boolean useWindowAwareUrlEncoding)
{
- if (windowId != null)
- {
- url = url + "?" + WINDOW_CONTEXT_ID_PARAMETER_KEY + "=" + windowId;
+ this.useWindowAwareUrlEncoding = useWindowAwareUrlEncoding;
+ }
- url = externalContext.encodeActionURL(url);
+ public String encodeURL(ExternalContext externalContext, String url)
+ {
+ if(this.useWindowAwareUrlEncoding)
+ {
+ return encodeActionURL(url, getCurrentWindowId());
}
+ return url;
+ }
+
+ public void sendRedirect(ExternalContext externalContext, String url) throws IOException
+ {
+ url = externalContext.encodeActionURL(encodeURL(externalContext, url));
externalContext.redirect(url);
}
- public Long restoreWindowId(ExternalContext externalContext)
+ //TODO add a counter in case of project stage dev
+ public String createWindowId()
+ {
+ String uuid = UUID.randomUUID().toString().replace("-", "");
+
+ ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
+
+ synchronized (externalContext.getSessionMap())
+ {
+ Set<String> existingWindowIdSet = ConversationUtils.getExistingWindowIdSet(externalContext);
+
+ String shortUuid;
+ int startIndex = 0;
+
+ while(startIndex + DEFAULT_WINDOW_KEY_LENGTH < uuid.length())
+ {
+ shortUuid = uuid.substring(startIndex, startIndex + DEFAULT_WINDOW_KEY_LENGTH);
+
+ if(!existingWindowIdSet.contains(shortUuid))
+ {
+ uuid = shortUuid;
+ break;
+ }
+ startIndex++;
+ }
+ existingWindowIdSet.add(uuid);
+ }
+
+ return uuid;
+ }
+
+ public String restoreWindowId(ExternalContext externalContext)
+ {
+ if(!this.useWindowAwareUrlEncoding)
+ {
+ return null;
+ }
+
+ return externalContext.getRequestParameterMap().get(WINDOW_CONTEXT_ID_PARAMETER_KEY);
+ }
+
+
+ //don't use {@link RequestCache} here directly - due to the redirect it was cleared
+ protected String getCurrentWindowId()
{
- return parseWindowId(externalContext.getRequestParameterMap().get(WINDOW_CONTEXT_ID_PARAMETER_KEY));
+ return RequestCache.getWindowContextManager().getCurrentWindowContext().getId();
+ }
+
+ private String encodeActionURL(String url, String windowId)
+ {
+ if(url.contains(this.windowIdParameter))
+ {
+ return url;
+ }
+
+ StringBuilder newUrl = new StringBuilder(url);
+
+ if(url.contains("?"))
+ {
+ newUrl.append("&");
+ }
+ else
+ {
+ newUrl.append("?");
+ }
+
+ newUrl.append(WINDOW_CONTEXT_ID_PARAMETER_KEY);
+ newUrl.append("=");
+ newUrl.append(windowId);
+ return newUrl.toString();
}
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/JsfWindowContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/JsfWindowContext.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/JsfWindowContext.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/JsfWindowContext.java Wed Jul 28 19:12:16 2010
@@ -48,7 +48,7 @@ public class JsfWindowContext implements
{
private static final long serialVersionUID = 5272798129165017829L;
- private final Long id;
+ private final String id;
private final WindowContextConfig config;
@@ -57,13 +57,13 @@ public class JsfWindowContext implements
private Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();
- public JsfWindowContext(Long windowContextId, WindowContextConfig config)
+ public JsfWindowContext(String windowContextId, WindowContextConfig config)
{
this.id = windowContextId;
this.config = config;
}
- public Long getId()
+ public String getId()
{
return this.id;
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/RedirectedConversationAwareExternalContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/RedirectedConversationAwareExternalContext.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/RedirectedConversationAwareExternalContext.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/RedirectedConversationAwareExternalContext.java Wed Jul 28 19:12:16 2010
@@ -19,7 +19,8 @@
package org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation;
import static org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.ConversationUtils.*;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.RedirectHandler;
+
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.WindowHandler;
import javax.faces.context.ExternalContext;
import java.io.IOException;
@@ -40,22 +41,47 @@ public class RedirectedConversationAware
{
private ExternalContext wrapped;
- private static RedirectHandler redirectHandler;
+ private WindowHandler windowHandler;
public RedirectedConversationAwareExternalContext(ExternalContext wrapped)
{
this.wrapped = wrapped;
}
- public void dispatch(String s)
+ public String encodeActionURL(String s)
+ {
+ lazyInit();
+ String url = addWindowIdToUrl(s);
+ return wrapped.encodeActionURL(url);
+ }
+
+ public void redirect(String url)
throws IOException
{
- wrapped.dispatch(s);
+ lazyInit();
+ sendRedirect(this.wrapped, url, windowHandler);
}
- public String encodeActionURL(String s)
+ private synchronized void lazyInit()
{
- return wrapped.encodeActionURL(s);
+ if(windowHandler == null)
+ {
+ windowHandler = getWindowHandler();
+ }
+ }
+
+ private String addWindowIdToUrl(String url)
+ {
+ return this.windowHandler.encodeURL(this.wrapped, url);
+ }
+
+ /*
+ * generated
+ */
+ public void dispatch(String s)
+ throws IOException
+ {
+ wrapped.dispatch(s);
}
public String encodeNamespace(String s)
@@ -254,19 +280,4 @@ public class RedirectedConversationAware
{
wrapped.log(s, throwable);
}
-
- public void redirect(String url)
- throws IOException
- {
- lazyInit();
- sendRedirect(this.wrapped, url, redirectHandler);
- }
-
- private synchronized void lazyInit()
- {
- if(redirectHandler == null)
- {
- redirectHandler = getRedirectHandler();
- }
- }
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/WindowContextIdHolderComponent.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/WindowContextIdHolderComponent.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/WindowContextIdHolderComponent.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/WindowContextIdHolderComponent.java Wed Jul 28 19:12:16 2010
@@ -28,13 +28,14 @@ import javax.faces.context.FacesContext;
*/
public class WindowContextIdHolderComponent extends UIOutput
{
- private long windowContextId;
+ private String windowContextId;
+ @SuppressWarnings({"UnusedDeclaration"})
public WindowContextIdHolderComponent()
{
}
- public WindowContextIdHolderComponent(long windowContextId)
+ public WindowContextIdHolderComponent(String windowContextId)
{
this.windowContextId = windowContextId;
}
@@ -58,18 +59,18 @@ public class WindowContextIdHolderCompon
Object[] values = (Object[]) state;
super.restoreState(facesContext, values[0]);
- this.windowContextId = (Long) values[1];
+ this.windowContextId = (String) values[1];
facesContext.getExternalContext().getRequestMap()
.put(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY, this.windowContextId);
}
- public long getWindowContextId()
+ public String getWindowContextId()
{
return windowContextId;
}
- void changeWindowContextId(long windowContextId)
+ void changeWindowContextId(String windowContextId)
{
this.windowContextId = windowContextId;
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/JsfAwareWindowContextConfig.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/JsfAwareWindowContextConfig.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/JsfAwareWindowContextConfig.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/JsfAwareWindowContextConfig.java Wed Jul 28 19:12:16 2010
@@ -25,7 +25,7 @@ import org.apache.myfaces.extensions.cdi
*/
public abstract class JsfAwareWindowContextConfig extends WindowContextConfig
{
- public abstract RedirectHandler getRedirectHandler();
+ public abstract WindowHandler getWindowHandler();
public abstract ConversationFactory getConversationFactory();
}
Copied: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/WindowHandler.java (from r978925, myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/RedirectHandler.java)
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/WindowHandler.java?p2=myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/WindowHandler.java&p1=myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/RedirectHandler.java&r1=978925&r2=980166&rev=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/RedirectHandler.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/scope/conversation/spi/WindowHandler.java Wed Jul 28 19:12:16 2010
@@ -25,9 +25,13 @@ import java.io.Serializable;
/**
* @author Gerhard Petracek
*/
-public interface RedirectHandler extends Serializable
+public interface WindowHandler extends Serializable
{
- void sendRedirect(ExternalContext externalContext, String url, Long windowId) throws IOException;
+ String encodeURL(ExternalContext externalContext, String url);
- Long restoreWindowId(ExternalContext externalContext);
+ void sendRedirect(ExternalContext externalContext, String url) throws IOException;
+
+ String createWindowId();
+
+ String restoreWindowId(ExternalContext externalContext);
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/ConversationUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/ConversationUtils.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/ConversationUtils.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/ConversationUtils.java Wed Jul 28 19:12:16 2010
@@ -31,7 +31,7 @@ import org.apache.myfaces.extensions.cdi
import org.apache.myfaces.extensions.cdi.javaee.jsf.api.qualifier.Jsf;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.WindowContextIdHolderComponent;
import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.JsfAwareWindowContextConfig;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.RedirectHandler;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.WindowHandler;
import javax.enterprise.inject.spi.Bean;
import javax.enterprise.inject.spi.BeanManager;
@@ -40,6 +40,7 @@ import javax.faces.context.ExternalConte
import javax.faces.context.FacesContext;
import java.io.IOException;
import java.lang.annotation.Annotation;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -50,6 +51,9 @@ import java.util.Set;
*/
public class ConversationUtils
{
+ public static final String EXISTING_WINDOW_ID_SET_KEY =
+ WindowContext.class.getName() + ":EXISTING_WINDOW_ID_LIST";
+
private static final ViewAccessScoped VIEW_ACCESS_SCOPED = DefaultAnnotation.of(ViewAccessScoped.class);
private static final Jsf JSF_QUALIFIER = DefaultAnnotation.of(Jsf.class);
@@ -155,19 +159,20 @@ public class ConversationUtils
}
//TODO
- public static Long resolveWindowContextId(boolean requestParameterSupported, RedirectHandler redirectHandler)
+ public static String resolveWindowContextId(boolean requestParameterSupported, WindowHandler windowHandler)
{
FacesContext facesContext = FacesContext.getCurrentInstance();
- Map<String, String> requestParameterMap = facesContext.getExternalContext().getRequestParameterMap();
- Map<String, Object> requestMap = facesContext.getExternalContext().getRequestMap();
+ ExternalContext externalContext = facesContext.getExternalContext();
+ Map<String, String> requestParameterMap = externalContext.getRequestParameterMap();
+ Map<String, Object> requestMap = externalContext.getRequestMap();
//try to find id in request map
- Long id = tryToFindWindowIdInRequestMap(requestMap);
+ String id = tryToFindWindowIdInRequestMap(requestMap);
- if(id == null && redirectHandler != null)
+ if(id == null && windowHandler != null)
{
- id = redirectHandler.restoreWindowId(facesContext.getExternalContext());
+ id = windowHandler.restoreWindowId(facesContext.getExternalContext());
}
if(id == null)
@@ -175,9 +180,9 @@ public class ConversationUtils
id = tryToRestoreWindowIdFromRequestParameterMap(requestParameterSupported, requestParameterMap);
}
- if(id != null)
+ if(id != null && !cacheWindowId(externalContext, id))
{
- cacheWindowId(requestMap, id);
+ id = null;
}
if (id != null)
@@ -200,7 +205,7 @@ public class ConversationUtils
return null;
}
- private static Long tryToRestoreWindowIdFromRequestParameterMap(
+ private static String tryToRestoreWindowIdFromRequestParameterMap(
boolean requestParameterSupported, Map<String, String> requestParameterMap)
{
//try to restore get-request parameter
@@ -211,38 +216,45 @@ public class ConversationUtils
idViaGetRequest = requestParameterMap.get(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY);
}
- return parseWindowId(idViaGetRequest);
+ return idViaGetRequest;
}
- public static Long parseWindowId(String windowIdAsString)
+ public static void cacheWindowId(String id)
{
- if (windowIdAsString != null)
- {
- try
- {
- return Long.parseLong(windowIdAsString);
- }
- catch (NumberFormatException e)
- {
- return null;
- }
- }
- return null;
+ cacheWindowId(FacesContext.getCurrentInstance().getExternalContext(), id);
}
- public static void cacheWindowId(Long id)
- {
- cacheWindowId(FacesContext.getCurrentInstance().getExternalContext().getRequestMap(), id);
- }
-
- private static void cacheWindowId(Map<String, Object> requestMap, Long id)
+ /**
+ * @param externalContext externalContext
+ * @param id windowId
+ * @return false if the id doesn't exist in the storage (e.g. in case of bookmarks)
+ */
+ public static boolean cacheWindowId(ExternalContext externalContext, String id)
{
+ Map<String, Object> sessionMap = externalContext.getSessionMap();
+ Set<String> existingWindowIdSet = (Set)sessionMap.get(EXISTING_WINDOW_ID_SET_KEY);
+
+ if(existingWindowIdSet == null)
+ {
+ existingWindowIdSet = new HashSet<String>();
+ sessionMap.put(EXISTING_WINDOW_ID_SET_KEY, existingWindowIdSet);
+ }
+
+ if(!existingWindowIdSet.contains(id))
+ {
+ return false;
+ }
+
+ //TODO check if it should be replace with the RequestCache
+ Map<String, Object> requestMap = externalContext.getRequestMap();
requestMap.put(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY, id);
+
+ return true;
}
- private static Long tryToFindWindowIdInRequestMap(Map<String, Object> requestMap)
+ private static String tryToFindWindowIdInRequestMap(Map<String, Object> requestMap)
{
- return (Long) requestMap.get(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY);
+ return (String) requestMap.get(WindowContextManager.WINDOW_CONTEXT_ID_PARAMETER_KEY);
}
public static void restoreInformationOfRequest(FacesContext facesContext,
@@ -327,16 +339,15 @@ public class ConversationUtils
public static void sendRedirect(ExternalContext externalContext,
String url,
- RedirectHandler redirectHandler) throws IOException
+ WindowHandler windowHandler) throws IOException
{
storeCurrentViewIdAsOldViewId(FacesContext.getCurrentInstance());
RequestCache.resetCache();
- if(redirectHandler != null)
+ if(windowHandler != null)
{
- redirectHandler.sendRedirect(
- externalContext, url, getWindowContextManager().getCurrentWindowContext().getId());
+ windowHandler.sendRedirect(externalContext, url);
}
else
{
@@ -345,7 +356,7 @@ public class ConversationUtils
}
}
- public static RedirectHandler getRedirectHandler()
+ public static WindowHandler getWindowHandler()
{
Set<Bean<?>> configResolvers = getInstance().getBeanManager().getBeans(ConfigResolver.class);
@@ -353,11 +364,26 @@ public class ConversationUtils
ConfigResolver configResolver = (ConfigResolver) CodiUtils
.getOrCreateScopedInstanceOfBean(configResolvers.iterator().next());
- return configResolver.resolve(JsfAwareWindowContextConfig.class).getRedirectHandler();
+ return configResolver.resolve(JsfAwareWindowContextConfig.class).getWindowHandler();
}
public static WindowContextManager getWindowContextManager()
{
return RequestCache.getWindowContextManager();
}
+
+ public static Set<String> getExistingWindowIdSet(ExternalContext externalContext)
+ {
+ Map<String, Object> sessionMap = externalContext.getSessionMap();
+
+ @SuppressWarnings({"unchecked"})
+ Set<String> existingWindowIdSet = (Set)sessionMap.get(EXISTING_WINDOW_ID_SET_KEY);
+
+ if(existingWindowIdSet == null)
+ {
+ existingWindowIdSet = new HashSet<String>();
+ sessionMap.put(EXISTING_WINDOW_ID_SET_KEY, existingWindowIdSet);
+ }
+ return existingWindowIdSet;
+ }
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/RequestCache.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/RequestCache.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/RequestCache.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf/impl/util/RequestCache.java Wed Jul 28 19:12:16 2010
@@ -32,7 +32,7 @@ import java.util.HashMap;
*/
public class RequestCache
{
- private static ThreadLocal<Long> windowIdCache = new ThreadLocal<Long>();
+ private static ThreadLocal<String> windowIdCache = new ThreadLocal<String>();
private static ThreadLocal<WindowContextManager> windowContextManagerCache
= new ThreadLocal<WindowContextManager>();
@@ -111,12 +111,12 @@ public class RequestCache
return windowContextManagerBean;
}
- public static Long getCurrentWindowId()
+ public static String getCurrentWindowId()
{
return windowIdCache.get();
}
- public static void setCurrentWindowId(Long windowId)
+ public static void setCurrentWindowId(String windowId)
{
windowIdCache.set(windowId);
}
Added: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/request/ServerSideWindowHandler.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/request/ServerSideWindowHandler.java?rev=980166&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/request/ServerSideWindowHandler.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/request/ServerSideWindowHandler.java Wed Jul 28 19:12:16 2010
@@ -0,0 +1,82 @@
+/*
+ * 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.myfaces.extensions.cdi.javaee.jsf2.impl.request;
+
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.DefaultWindowHandler;
+
+import static org.apache.myfaces.extensions.cdi.core.api.util.ClassUtils.tryToLoadClassForName;
+import static org.apache.myfaces.extensions.cdi.core.impl.scope.conversation.spi.WindowContextManager
+ .WINDOW_CONTEXT_ID_PARAMETER_KEY;
+
+import javax.faces.context.ExternalContext;
+import javax.faces.context.FacesContext;
+import java.io.IOException;
+
+/**
+ * use this implementation to avoid tokens in the url.
+ * attention: e.g. manual window refreshes aren't supported due to browser restrictions
+ *
+ * @author Gerhard Petracek
+ */
+@SuppressWarnings({"UnusedDeclaration"})
+public class ServerSideWindowHandler extends DefaultWindowHandler
+{
+ private static final long serialVersionUID = 4040116087475343221L;
+
+ //workaround for mojarra
+ private final boolean useFallback;
+
+ public ServerSideWindowHandler(boolean useWindowAwareUrlEncoding)
+ {
+ super(useWindowAwareUrlEncoding);
+ this.useFallback = tryToLoadClassForName("org.apache.myfaces.context.FacesContextFactoryImpl") == null;
+ }
+
+ @Override
+ public void sendRedirect(ExternalContext externalContext, String url) throws IOException
+ {
+ String windowId = getCurrentWindowId();
+ if(this.useWindowAwareUrlEncoding || this.useFallback ||
+ //here we have an ajax nav. - currently it doesn't work in combination with the flash scope
+ FacesContext.getCurrentInstance().getPartialViewContext().isPartialRequest())
+ {
+ super.sendRedirect(externalContext, url);
+ return;
+ }
+
+ if (windowId != null)
+ {
+ externalContext.getRequestMap().put(WINDOW_CONTEXT_ID_PARAMETER_KEY, windowId);
+ externalContext.getFlash().keep(WINDOW_CONTEXT_ID_PARAMETER_KEY);
+ }
+
+ externalContext.redirect(url);
+ }
+
+ @Override
+ public String restoreWindowId(ExternalContext externalContext)
+ {
+ if(this.useWindowAwareUrlEncoding || this.useFallback)
+ {
+ return super.restoreWindowId(externalContext);
+ }
+
+ return (String)externalContext.getFlash().remove(WINDOW_CONTEXT_ID_PARAMETER_KEY);
+ }
+}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/AccessScopeAwareNavigationHandler.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/AccessScopeAwareNavigationHandler.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/AccessScopeAwareNavigationHandler.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/AccessScopeAwareNavigationHandler.java Wed Jul 28 19:12:16 2010
@@ -40,6 +40,7 @@ public class AccessScopeAwareNavigationH
public void handleNavigation(FacesContext facesContext, String s, String s1)
{
+ //we have to reset it due to possible redirects
JsfUtils.resetCaches();
//TODO check myfaces core - issue? facesContext is not wrapped here
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/DefaultWindowContextConfig.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/DefaultWindowContextConfig.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/DefaultWindowContextConfig.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/DefaultWindowContextConfig.java Wed Jul 28 19:12:16 2010
@@ -18,20 +18,24 @@
*/
package org.apache.myfaces.extensions.cdi.javaee.jsf2.impl.scope.conversation;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.RedirectHandler;
-import org.apache.myfaces.extensions.cdi.javaee.jsf2.impl.request.DefaultRedirectHandler;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.WindowHandler;
+import org.apache.myfaces.extensions.cdi.javaee.jsf2.impl.request.ServerSideWindowHandler;
+
+import javax.enterprise.context.ApplicationScoped;
/**
* @author Gerhard Petracek
*/
+@ApplicationScoped
+@SuppressWarnings({"UnusedDeclaration"})
public class DefaultWindowContextConfig extends
org.apache.myfaces.extensions.cdi.javaee.jsf.impl.config.DefaultWindowContextConfig
{
private static final long serialVersionUID = 5184658265260290647L;
@Override
- public RedirectHandler getRedirectHandler()
+ public WindowHandler getWindowHandler()
{
- return new DefaultRedirectHandler();
+ return new ServerSideWindowHandler(isUrlParameterSupported());
}
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/InterceptedRenderKit.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/InterceptedRenderKit.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/InterceptedRenderKit.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/InterceptedRenderKit.java Wed Jul 28 19:12:16 2010
@@ -38,7 +38,7 @@ class InterceptedRenderKit extends Rende
{
private final RenderKit wrapped;
- public InterceptedRenderKit(RenderKit wrapped)
+ InterceptedRenderKit(RenderKit wrapped)
{
this.wrapped = wrapped;
}
Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/RedirectedConversationAwareExternalContext.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/RedirectedConversationAwareExternalContext.java?rev=980166&r1=980165&r2=980166&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/RedirectedConversationAwareExternalContext.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/javaee/jsf2/impl/scope/conversation/RedirectedConversationAwareExternalContext.java Wed Jul 28 19:12:16 2010
@@ -19,7 +19,7 @@
package org.apache.myfaces.extensions.cdi.javaee.jsf2.impl.scope.conversation;
import static org.apache.myfaces.extensions.cdi.javaee.jsf.impl.util.ConversationUtils.*;
-import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.RedirectHandler;
+import org.apache.myfaces.extensions.cdi.javaee.jsf.impl.scope.conversation.spi.WindowHandler;
import javax.faces.context.ExternalContext;
import javax.faces.context.ExternalContextWrapper;
@@ -32,7 +32,7 @@ public class RedirectedConversationAware
{
private final ExternalContext wrapped;
- private RedirectHandler redirectHandler;
+ private WindowHandler windowHandler;
public RedirectedConversationAwareExternalContext(ExternalContext wrapped)
{
@@ -49,14 +49,26 @@ public class RedirectedConversationAware
throws IOException
{
lazyInit();
- sendRedirect(this.wrapped, url, this.redirectHandler);
+ sendRedirect(this.wrapped, url, this.windowHandler);
+ }
+
+ public String encodeActionURL(String s)
+ {
+ lazyInit();
+ String url = addWindowIdToUrl(s);
+ return wrapped.encodeActionURL(url);
}
private synchronized void lazyInit()
{
- if(this.redirectHandler == null)
+ if(this.windowHandler == null)
{
- this.redirectHandler = getRedirectHandler();
+ this.windowHandler = getWindowHandler();
}
}
+
+ private String addWindowIdToUrl(String url)
+ {
+ return this.windowHandler.encodeURL(this.wrapped, url);
+ }
}