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/11/30 21:19:12 UTC

svn commit: r1040754 - in /myfaces/extensions/cdi/trunk/jee-modules: jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/ jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/ jsf-module/impl/src/mai...

Author: gpetracek
Date: Tue Nov 30 20:19:11 2010
New Revision: 1040754

URL: http://svn.apache.org/viewvc?rev=1040754&view=rev
Log:
EXTCDI-36 optional support for getNavigationCases

Added:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/RequestParameter.java
Modified:
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/JsfModuleConfig.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/DefaultWindowContextConfig.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java
    myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/JsfModuleConfig.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/JsfModuleConfig.java?rev=1040754&r1=1040753&r2=1040754&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/JsfModuleConfig.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/api/src/main/java/org/apache/myfaces/extensions/cdi/jsf/api/config/JsfModuleConfig.java Tue Nov 30 20:19:11 2010
@@ -33,4 +33,11 @@ public interface JsfModuleConfig extends
      * @return true for activating it, false otherwise
      */
     boolean isInitialRedirectEnabled();
+
+    /**
+     * esp useful for JSF 2.0
+     * @return true for creating additional navigation-cases based on view configs for
+     * ConfigurableNavigationHandler#getNavigationCases
+     */
+    boolean isUseViewConfigsAsNavigationCasesEnabled();
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/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/jsf/impl/config/DefaultWindowContextConfig.java?rev=1040754&r1=1040753&r2=1040754&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/DefaultWindowContextConfig.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/config/DefaultWindowContextConfig.java Tue Nov 30 20:19:11 2010
@@ -115,4 +115,9 @@ public class DefaultWindowContextConfig 
     {
         return true;
     }
+
+    public boolean isUseViewConfigsAsNavigationCasesEnabled()
+    {
+        return false;
+    }
 }

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java?rev=1040754&r1=1040753&r2=1040754&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/JsfUtils.java Tue Nov 30 20:19:11 2010
@@ -33,6 +33,8 @@ import java.util.Iterator;
 import java.util.ResourceBundle;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Set;
+import java.util.HashSet;
 
 /**
  * keep in sync with extval!
@@ -131,32 +133,48 @@ public class JsfUtils
         StringBuilder finalUrl = new StringBuilder(url);
         boolean existingParameters = url.contains("?");
 
-        Map<String, String> requestParms = externalContext.getRequestParameterMap();
-        for(Map.Entry<String, String> requestParam : requestParms.entrySet())
+        for(RequestParameter requestParam : getRequestParameters(externalContext, true))
         {
             String key = requestParam.getKey();
 
-            if("javax.faces.ViewState".equals(key))
+            for(String parameterValue : requestParam.getValues())
             {
-                continue;
-            }
-            
-            if(!url.contains(key + "="))
-            {
-                if(!existingParameters)
-                {
-                    finalUrl.append("?");
-                    existingParameters = true;
-                }
-                else
+                if(!url.contains(key + "=" + parameterValue))
                 {
-                    finalUrl.append("&");
+                    if(!existingParameters)
+                    {
+                        finalUrl.append("?");
+                        existingParameters = true;
+                    }
+                    else
+                    {
+                        finalUrl.append("&");
+                    }
+                    finalUrl.append(key);
+                    finalUrl.append("=");
+                    finalUrl.append(JsfUtils.encodeURLParameterValue(parameterValue, externalContext));
                 }
-                finalUrl.append(key);
-                finalUrl.append("=");
-                finalUrl.append(JsfUtils.encodeURLParameterValue(requestParam.getValue(), externalContext));
             }
         }
         return finalUrl.toString();
     }
+
+    public static Set<RequestParameter> getRequestParameters(ExternalContext externalContext, boolean filterViewState)
+    {
+        Set<RequestParameter> result = new HashSet<RequestParameter>();
+
+        String key;
+        for(Map.Entry<String, String[]> entry : externalContext.getRequestParameterValuesMap().entrySet())
+        {
+            key = entry.getKey();
+            if(filterViewState && "javax.faces.ViewState".equals(key))
+            {
+                continue;
+            }
+
+            result.add(new RequestParameter(key, entry.getValue()));
+        }
+
+        return result;
+    }
 }

Added: myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/RequestParameter.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/RequestParameter.java?rev=1040754&view=auto
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/RequestParameter.java (added)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf/impl/util/RequestParameter.java Tue Nov 30 20:19:11 2010
@@ -0,0 +1,52 @@
+/*
+ * 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.jsf.impl.util;
+
+import java.util.List;
+import java.util.Arrays;
+
+/**
+ * @author Gerhard Petracek
+ */
+public class RequestParameter
+{
+    private final String key;
+    private final String[] values;
+
+    public RequestParameter(String key, String[] values)
+    {
+        this.key = key;
+        this.values = values;
+    }
+
+    public String getKey()
+    {
+        return key;
+    }
+
+    public List<String> getValueList()
+    {
+        return Arrays.asList(this.values);
+    }
+
+    public String[] getValues()
+    {
+        return values;
+    }
+}

Modified: myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java
URL: http://svn.apache.org/viewvc/myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java?rev=1040754&r1=1040753&r2=1040754&view=diff
==============================================================================
--- myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java (original)
+++ myfaces/extensions/cdi/trunk/jee-modules/jsf20-module/impl/src/main/java/org/apache/myfaces/extensions/cdi/jsf2/impl/navigation/CodiNavigationHandler.java Tue Nov 30 20:19:11 2010
@@ -21,9 +21,13 @@ package org.apache.myfaces.extensions.cd
 import org.apache.myfaces.extensions.cdi.jsf.impl.navigation.ViewConfigAwareNavigationHandler;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigCache;
 import org.apache.myfaces.extensions.cdi.jsf.impl.config.view.ViewConfigEntry;
+import org.apache.myfaces.extensions.cdi.jsf.impl.util.JsfUtils;
+import org.apache.myfaces.extensions.cdi.jsf.impl.util.RequestParameter;
 import org.apache.myfaces.extensions.cdi.jsf.api.config.view.Page;
+import org.apache.myfaces.extensions.cdi.jsf.api.config.JsfModuleConfig;
 import org.apache.myfaces.extensions.cdi.core.api.Deactivatable;
 import org.apache.myfaces.extensions.cdi.core.impl.util.ClassDeactivation;
+import org.apache.myfaces.extensions.cdi.core.impl.util.CodiUtils;
 
 import javax.faces.application.ConfigurableNavigationHandler;
 import javax.faces.application.NavigationHandler;
@@ -31,9 +35,11 @@ import javax.faces.application.Navigatio
 import javax.faces.context.FacesContext;
 import java.util.Set;
 import java.util.Map;
+import java.util.List;
 import java.util.HashMap;
 import java.util.Collection;
 import java.util.HashSet;
+import javax.faces.context.ExternalContext;
 
 /**
  * We have to ensure the invocation order for the type-safe navigation feature/s.
@@ -44,15 +50,23 @@ public class CodiNavigationHandler exten
 {
     private final NavigationHandler wrapped;
     private final boolean deactivated;
-    private final boolean addViewConfigsAsNavigationCase = false; //TODO add config
+    private final boolean addViewConfigsAsNavigationCase;
 
     public CodiNavigationHandler(NavigationHandler navigationHandler)
     {
         this.wrapped = navigationHandler;
         this.deactivated = !isActivated();
+
+        if(!this.deactivated)
+        {
+            this.addViewConfigsAsNavigationCase = isAddViewConfigsAsNavigationCaseActivated();
+        }
+        else
+        {
+            this.addViewConfigsAsNavigationCase = false;
+        }
     }
 
-    //TODO
     public void handleNavigation(FacesContext context, String fromAction, String outcome)
     {
         if(this.deactivated)
@@ -102,6 +116,9 @@ public class CodiNavigationHandler exten
         if(!viewConfigEntries.isEmpty())
         {
             Set<NavigationCase> navigationCase = new HashSet<NavigationCase>();
+
+            Map<String, List<String>> parameters = resolveParameters();
+
             for(ViewConfigEntry entry : viewConfigEntries)
             {
                 navigationCase.add(new NavigationCase("*",
@@ -109,7 +126,7 @@ public class CodiNavigationHandler exten
                                                       null,
                                                       null,
                                                       entry.getViewId(),
-                                                      null,
+                                                      parameters,
                                                       Page.NavigationMode.REDIRECT.equals(entry.getNavigationMode()),
                                                       Page.ViewParameter.INCLUDE.equals(entry.getViewParameter())));
 
@@ -119,8 +136,29 @@ public class CodiNavigationHandler exten
         return result;
     }
 
+    private Map<String, List<String>> resolveParameters()
+    {
+        Map<String, List<String>> parameters = new HashMap<String, List<String>>();
+
+        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
+
+        for(RequestParameter parameter : JsfUtils.getRequestParameters(externalContext, true))
+        {
+            parameters.put(parameter.getKey(), parameter.getValueList());
+        }
+
+        return parameters;
+    }
+
     public boolean isActivated()
     {
         return ClassDeactivation.isClassActivated(getClass());
     }
+
+    private boolean isAddViewConfigsAsNavigationCaseActivated()
+    {
+        JsfModuleConfig config = CodiUtils.getContextualReferenceByClass(JsfModuleConfig.class);
+
+        return config.isUseViewConfigsAsNavigationCasesEnabled();
+    }
 }