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);
+    }
 }