This is an automated email from the ASF dual-hosted git repository.

tandraschko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/deltaspike.git


The following commit(s) were added to refs/heads/master by this push:
     new 2b57ef0b2 fixed clientwindow handling
2b57ef0b2 is described below

commit 2b57ef0b2bb738620714d75927f99ad72f23ab25
Author: Thomas Andraschko <[email protected]>
AuthorDate: Tue Nov 14 11:46:14 2023 +0100

    fixed clientwindow handling
---
 .../impl/clientwindow/ClientSideClientWindow.java  |  29 +--
 .../impl/clientwindow/DeltaSpikeClientWindow.java  |  39 ++-
 .../jsf/impl/clientwindow/LazyClientWindow.java    |  39 +--
 .../request/DeltaSpikeLifecycleFactoryWrapper.java |   1 -
 .../request/DeltaSpikeLifecycleWrapper.java        |   1 +
 .../jsf/impl/util/ClientWindowHelper.java          |  11 +-
 .../apache/deltaspike/jsf/impl/util/JsfUtils.java  |  37 ++-
 .../test/jsf/impl/util/JsfUtilsTest.java           | 288 +++++++++++----------
 8 files changed, 226 insertions(+), 219 deletions(-)

diff --git 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/ClientSideClientWindow.java
 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/ClientSideClientWindow.java
index e240141ce..f69a3388d 100644
--- 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/ClientSideClientWindow.java
+++ 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/ClientSideClientWindow.java
@@ -23,9 +23,9 @@ import java.io.OutputStream;
 import jakarta.faces.FacesException;
 import jakarta.faces.context.ExternalContext;
 import jakarta.faces.context.FacesContext;
-import jakarta.faces.render.ResponseStateManager;
 import jakarta.servlet.http.Cookie;
 import jakarta.servlet.http.HttpServletResponse;
+import java.util.Collections;
 import java.util.Map;
 import org.apache.deltaspike.jsf.impl.util.ClientWindowHelper;
 import org.apache.deltaspike.jsf.impl.util.JsfUtils;
@@ -51,44 +51,42 @@ public class ClientSideClientWindow extends 
DeltaSpikeClientWindow
 
 
     @Override
-    protected String getOrCreateWindowId(FacesContext facesContext)
+    public void decode(FacesContext facesContext)
     {
-        String windowId = null;
-
         boolean post = isPost(facesContext);
 
         if (post)
         {
-            windowId = getWindowIdPostParameter(facesContext);
+            id = getWindowIdPostParameter(facesContext);
         }
         else if (isNoscriptRequest(facesContext.getExternalContext()))
         {
             // the client has JavaScript disabled
             getClientWindowConfig().setJavaScriptEnabled(false);
 
-            windowId = DEFAULT_WINDOW_ID;
+            id = DEFAULT_WINDOW_ID;
         }
         else
         {
-            windowId = 
getVerifiedWindowIdFromCookie(facesContext.getExternalContext());
+            id = 
getVerifiedWindowIdFromCookie(facesContext.getExternalContext());
 
             boolean newWindowIdRequested = false;
-            if (AUTOMATED_ENTRY_POINT_PARAMETER_KEY.equals(windowId))
+            if (AUTOMATED_ENTRY_POINT_PARAMETER_KEY.equals(id))
             {
                 // this is a marker for generating a new windowId
-                windowId = generateNewWindowId();
+                id = generateNewWindowId();
                 newWindowIdRequested = true;
             }
 
-            if (windowId == null || newWindowIdRequested)
+            if (id == null || newWindowIdRequested)
             {
                 // GET request without windowId - send 
windowhandlerfilter.html to get the windowId
-                sendWindowHandlerHtml(facesContext.getExternalContext(), 
windowId);
+                sendWindowHandlerHtml(facesContext.getExternalContext(), id);
                 facesContext.responseComplete();
             }
         }
 
-        return windowId;
+        id = sanitiseWindowId(id);
     }
 
     protected boolean isNoscriptRequest(ExternalContext externalContext)
@@ -234,11 +232,6 @@ public class ClientSideClientWindow extends 
DeltaSpikeClientWindow
                     requestToken,
                     windowId);
 
-            url = JsfUtils.addParameter(facesContext.getExternalContext(),
-                    url,
-                    true,
-                    ResponseStateManager.CLIENT_WINDOW_URL_PARAM,
-                    windowId);
             url = JsfUtils.addParameter(facesContext.getExternalContext(),
                     url,
                     true,
@@ -260,7 +253,7 @@ public class ClientSideClientWindow extends 
DeltaSpikeClientWindow
     @Override
     public Map<String, String> getQueryURLParameters(FacesContext facesContext)
     {
-        return null;
+        return Collections.emptyMap();
     }
 
     @Override
diff --git 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/DeltaSpikeClientWindow.java
 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/DeltaSpikeClientWindow.java
index 75552a02d..aca4715c8 100644
--- 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/DeltaSpikeClientWindow.java
+++ 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/DeltaSpikeClientWindow.java
@@ -36,28 +36,13 @@ public abstract class DeltaSpikeClientWindow extends 
ClientWindow
      */
     public static final String DEFAULT_WINDOW_ID = "default";
     
-    private String id;
-    private int maxWindowIdCount = 10;
+    protected String id;
+    protected int maxWindowIdCount = 10;
 
     public DeltaSpikeClientWindow()
     {
         this.maxWindowIdCount = ClientWindowHelper.getMaxWindowIdLength();
     }
-    
-    @Override
-    public void decode(FacesContext facesContext)
-    {
-        id = getOrCreateWindowId(facesContext);
-
-        if (id != null)
-        {
-            id = sanitiseWindowId(id);
-            if (id.length() > this.maxWindowIdCount)
-            {
-                id = id.substring(0, this.maxWindowIdCount);
-            }
-        }
-    }
 
     @Override
     public String getId()
@@ -65,16 +50,26 @@ public abstract class DeltaSpikeClientWindow extends 
ClientWindow
         return id;
     }
 
-        /**
+    /**
      * We have to escape some characters to make sure we do not open
      * any XSS vectors. E.g. replace (,<, & etc to
      * prevent attackers from injecting JavaScript function calls or html.
      */
     protected String sanitiseWindowId(String windowId)
     {
-        return StringUtils.removeSpecialChars(windowId);
+        if (windowId == null)
+        {
+            return null;
+        }
+
+        windowId = StringUtils.removeSpecialChars(windowId);
+        if (windowId.length() > this.maxWindowIdCount)
+        {
+            windowId = windowId.substring(0, this.maxWindowIdCount);
+        }
+        return windowId;
     }
-    
+
     protected String generateNewWindowId()
     {
         //X TODO proper mechanism
@@ -121,9 +116,7 @@ public abstract class DeltaSpikeClientWindow extends 
ClientWindow
     {
         return BeanProvider.getContextualReference(ClientWindowConfig.class);
     }
-    
-    protected abstract String getOrCreateWindowId(FacesContext facesContext);
-    
+
     /**
      * @return true if the implementation possible sends an initial redirect.
      */
diff --git 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/LazyClientWindow.java
 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/LazyClientWindow.java
index 6b0368134..dbbc04ef1 100644
--- 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/LazyClientWindow.java
+++ 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/clientwindow/LazyClientWindow.java
@@ -21,8 +21,7 @@ package org.apache.deltaspike.jsf.impl.clientwindow;
 import org.apache.deltaspike.jsf.impl.util.ClientWindowHelper;
 
 import jakarta.faces.context.FacesContext;
-import jakarta.faces.render.ResponseStateManager;
-import java.util.HashMap;
+import java.util.Collections;
 import java.util.Map;
 import org.apache.deltaspike.core.api.provider.BeanProvider;
 import org.apache.deltaspike.core.util.StringUtils;
@@ -31,52 +30,42 @@ import org.apache.deltaspike.jsf.api.config.JsfModuleConfig;
 public class LazyClientWindow extends DeltaSpikeClientWindow
 {
     @Override
-    protected String getOrCreateWindowId(FacesContext facesContext)
+    public void decode(FacesContext facesContext)
     {
-        String windowId = 
ClientWindowHelper.getInitialRedirectWindowId(facesContext);
+        id = ClientWindowHelper.getInitialRedirectWindowId(facesContext);
 
-        if (StringUtils.isEmpty(windowId))
+        if (StringUtils.isEmpty(id))
         {
-            windowId = getWindowIdParameter(facesContext);
+            id = getWindowIdParameter(facesContext);
         }
 
         boolean post = isPost(facesContext);
 
-        if (StringUtils.isEmpty(windowId) && post)
+        if (StringUtils.isEmpty(id) && post)
         {
-            windowId = getWindowIdPostParameter(facesContext);
+            id = getWindowIdPostParameter(facesContext);
         }
 
-        if (StringUtils.isEmpty(windowId))
+        if (StringUtils.isEmpty(id))
         {
+            id = generateNewWindowId();
+
             JsfModuleConfig jsfModuleConfig = 
BeanProvider.getContextualReference(JsfModuleConfig.class);
             if (jsfModuleConfig.isInitialRedirectEnabled() && !post)
             {
-                ClientWindowHelper.handleInitialRedirect(facesContext, 
generateNewWindowId());
+                id = sanitiseWindowId(id); // handleInitialRedirect already 
takes the id, just be sure and sanitise now
+                ClientWindowHelper.handleInitialRedirect(facesContext, id);
                 facesContext.responseComplete();
-                windowId = null;
-            }
-            else
-            {
-                windowId = generateNewWindowId();
             }
         }
 
-        return windowId;
+        id = sanitiseWindowId(id);
     }
 
     @Override
     public Map<String, String> getQueryURLParameters(FacesContext facesContext)
     {
-        String windowId = getId();
-        if (windowId == null)
-        {
-            return null;
-        }
-
-        Map<String, String> parameters = new HashMap<>();
-        parameters.put(ResponseStateManager.CLIENT_WINDOW_URL_PARAM, windowId);
-        return parameters;
+        return Collections.emptyMap();
     }
 
     @Override
diff --git 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java
 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java
index 80d65371b..137ed88d7 100644
--- 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java
+++ 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleFactoryWrapper.java
@@ -18,7 +18,6 @@
  */
 package org.apache.deltaspike.jsf.impl.listener.request;
 
-
 import org.apache.deltaspike.core.spi.activation.Deactivatable;
 import org.apache.deltaspike.core.util.ClassDeactivationUtils;
 
diff --git 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java
 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java
index e644df3b8..8fd721100 100644
--- 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java
+++ 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/listener/request/DeltaSpikeLifecycleWrapper.java
@@ -159,6 +159,7 @@ class DeltaSpikeLifecycleWrapper extends Lifecycle
                 {
                     facesContext.getExternalContext().setClientWindow(new 
ClientSideClientWindow());
                 }
+                
facesContext.getExternalContext().getClientWindow().decode(facesContext);
             }
         }
     }
diff --git 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/ClientWindowHelper.java
 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/ClientWindowHelper.java
index 61c650ff0..91799da12 100644
--- 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/ClientWindowHelper.java
+++ 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/ClientWindowHelper.java
@@ -26,6 +26,7 @@ import jakarta.enterprise.inject.Typed;
 import jakarta.faces.FacesException;
 import jakarta.faces.context.ExternalContext;
 import jakarta.faces.context.FacesContext;
+import jakarta.faces.render.ResponseStateManager;
 
 import org.apache.deltaspike.jsf.api.config.base.JsfBaseConfig;
 
@@ -56,12 +57,12 @@ public abstract class ClientWindowHelper
         {
             url += externalContext.getRequestPathInfo();
         }
-        
+
         url = JsfUtils.addRequestParameters(externalContext, url, true);
-        //TODO check if it isn't better to fix addRequestParameters itself
-        //only #encodeResourceURL is portable currently
-        url = externalContext.encodeResourceURL(url);
-        
+        // always remove jfwid to force adding new jfwid as JSF impl otherwise 
just ignores it
+        url = JsfUtils.removeUrlParameter(url, 
ResponseStateManager.CLIENT_WINDOW_URL_PARAM);
+        url = externalContext.encodeRedirectURL(url, null);
+
         return url;
     }
     
diff --git 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/JsfUtils.java
 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/JsfUtils.java
index fe99ca45f..3a1fdcfc8 100644
--- 
a/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/JsfUtils.java
+++ 
b/deltaspike/modules/jsf/impl/src/main/java/org/apache/deltaspike/jsf/impl/util/JsfUtils.java
@@ -35,6 +35,7 @@ import java.io.UnsupportedEncodingException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.URLEncoder;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -42,6 +43,7 @@ import java.util.Set;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.logging.Level;
 import java.util.logging.Logger;
+import java.util.stream.Collectors;
 import org.apache.deltaspike.core.util.StringUtils;
 
 public abstract class JsfUtils
@@ -65,7 +67,7 @@ public abstract class JsfUtils
     {
         ExternalContext externalContext = 
FacesContext.getCurrentInstance().getExternalContext();
 
-        Set<RequestParameter> result = new HashSet<RequestParameter>();
+        Set<RequestParameter> result = new HashSet<>();
 
         if (externalContext == null || //detection of early config for 
different mojarra versions
                 externalContext.getRequestParameterValuesMap() == null || 
externalContext.getRequest() == null)
@@ -105,7 +107,7 @@ public abstract class JsfUtils
             for (String parameterValue : requestParam.getValues())
             {
                 if (!url.contains(key + "=" + parameterValue) &&
-                        !url.contains(key + "=" + 
encodeURLParameterValue(parameterValue, externalContext)))
+                        !url.contains(key + "=" + 
encodeUrlParameterValue(parameterValue, externalContext)))
                 {
                     if (!existingParameters)
                     {
@@ -139,7 +141,7 @@ public abstract class JsfUtils
     {
         // don't append if already available
         if (url.contains(name + "=" + value)
-                || url.contains(name + "=" + encodeURLParameterValue(value, 
externalContext)))
+                || url.contains(name + "=" + encodeUrlParameterValue(value, 
externalContext)))
         {
             return url;
         }
@@ -184,7 +186,7 @@ public abstract class JsfUtils
             for (String value : entry.getValue())
             {
                 if (!url.contains(entry.getKey() + "=" + value) &&
-                        !url.contains(entry.getKey() + "=" + 
encodeURLParameterValue(value, externalContext)))
+                        !url.contains(entry.getKey() + "=" + 
encodeUrlParameterValue(value, externalContext)))
                 {
                     if (StringUtils.isEmpty(entry.getKey()) && 
StringUtils.isEmpty(value))
                     {
@@ -214,7 +216,7 @@ public abstract class JsfUtils
     {
         if (encode)
         {
-            url.append(encodeURLParameterValue(name, externalContext));
+            url.append(encodeUrlParameterValue(name, externalContext));
         }
         else
         {
@@ -225,7 +227,7 @@ public abstract class JsfUtils
 
         if (encode)
         {
-            url.append(encodeURLParameterValue(value, externalContext));
+            url.append(encodeUrlParameterValue(value, externalContext));
         }
         else
         {
@@ -233,6 +235,25 @@ public abstract class JsfUtils
         }
     }
 
+    public static String removeUrlParameter(String url, String name)
+    {
+        if (url == null || !url.contains(name) || (!url.contains("?") && 
!url.contains("&")))
+        {
+            return url;
+        }
+
+        String[] array = url.split("\\?");
+        String params = Arrays.asList(array[1].split("&"))
+                .stream()
+                .filter(item -> !item.split("=")[0].equalsIgnoreCase(name) && 
!"".equals(item.split("=")[1]))
+                .collect(Collectors.joining("&"));
+        if (params == null || params.isBlank())
+        {
+            return array[0];
+        }
+        return String.join("?", array[0], params);
+    }
+
     /**
      * Encodes the given value using URLEncoder.encode() with the charset 
returned
      * from ExternalContext.getResponseCharacterEncoding().
@@ -242,7 +263,7 @@ public abstract class JsfUtils
      * @param externalContext current external-context
      * @return encoded value
      */
-    public static String encodeURLParameterValue(String value, ExternalContext 
externalContext)
+    public static String encodeUrlParameterValue(String value, ExternalContext 
externalContext)
     {
         // copied from MyFaces ServletExternalContextImpl.encodeURL()
         try
@@ -309,7 +330,7 @@ public abstract class JsfUtils
 
             @SuppressWarnings({ "unchecked" })
             List<FacesMessageEntry> facesMessageEntryList = 
windowMetaData.getFacesMessageEntryList();
-            List<FacesMessage> originalMessageList = new 
ArrayList<FacesMessage>(facesContext.getMessageList());
+            List<FacesMessage> originalMessageList = new 
ArrayList<>(facesContext.getMessageList());
 
             if (facesMessageEntryList != null)
             {
diff --git 
a/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/util/JsfUtilsTest.java
 
b/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/util/JsfUtilsTest.java
index 0175d9427..ec9fa9e02 100644
--- 
a/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/util/JsfUtilsTest.java
+++ 
b/deltaspike/modules/jsf/impl/src/test/java/org/apache/deltaspike/test/jsf/impl/util/JsfUtilsTest.java
@@ -1,139 +1,149 @@
-/*
- * 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.deltaspike.test.jsf.impl.util;
-
-import org.apache.deltaspike.jsf.impl.util.JsfUtils;
-import org.junit.Assert;
-import org.junit.Test;
-
-import jakarta.faces.application.FacesMessage;
-import java.util.ArrayList;
-import java.util.List;
-
-//several tests are only needed to check that there won't be a 
NullPointerException
-public class JsfUtilsTest
-{
-    @Test
-    public void testNewMessageWithoutExistingMessages()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        Assert.assertEquals(Boolean.TRUE,
-            JsfUtils.isNewMessage(existingFacesMessage, new 
FacesMessage("test")));
-    }
-
-    @Test
-    public void testExistingSimpleMessage()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage("test"));
-        FacesMessage messageToCheck = new FacesMessage("test");
-        Assert.assertEquals(Boolean.FALSE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testExistingMessageWithoutSummary()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage(null, "test"));
-        FacesMessage messageToCheck = new FacesMessage(null, "test");
-        Assert.assertEquals(Boolean.FALSE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testExistingMessageWithoutDetails()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage("test", null));
-        FacesMessage messageToCheck = new FacesMessage("test", null);
-        Assert.assertEquals(Boolean.FALSE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testNewMessageWithExistingMessageWithoutText()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage(null, null));
-        FacesMessage messageToCheck = new FacesMessage("test");
-        Assert.assertEquals(Boolean.TRUE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testNewMessageWithoutText()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage("existing", "message"));
-        FacesMessage messageToCheck = new FacesMessage(null, null);
-        Assert.assertEquals(Boolean.TRUE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testNewMessageWithoutSummary()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage("existing", "message"));
-        FacesMessage messageToCheck = new FacesMessage(null, "test");
-        Assert.assertEquals(Boolean.TRUE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testNewMessageWithoutDetails()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage("existing", "message"));
-        FacesMessage messageToCheck = new FacesMessage("test", null);
-        Assert.assertEquals(Boolean.TRUE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testMessagesWithoutText()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage(null, null));
-        FacesMessage messageToCheck = new FacesMessage(null, null);
-        Assert.assertEquals(Boolean.FALSE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testNewMessageWithExistingMessageWithoutSummary()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage(null, "message"));
-        FacesMessage messageToCheck = new FacesMessage("new", "message");
-        Assert.assertEquals(Boolean.TRUE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-
-    @Test
-    public void testNewMessageWithExistingMessageWithoutDetails()
-    {
-        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
-        existingFacesMessage.add(new FacesMessage("existing", null));
-        FacesMessage messageToCheck = new FacesMessage("new", "message");
-        Assert.assertEquals(Boolean.TRUE,
-            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
-    }
-}
+/*
+ * 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.deltaspike.test.jsf.impl.util;
+
+import org.apache.deltaspike.jsf.impl.util.JsfUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import jakarta.faces.application.FacesMessage;
+import java.util.ArrayList;
+import java.util.List;
+
+//several tests are only needed to check that there won't be a 
NullPointerException
+public class JsfUtilsTest
+{
+    @Test
+    public void testNewMessageWithoutExistingMessages()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        Assert.assertEquals(Boolean.TRUE,
+            JsfUtils.isNewMessage(existingFacesMessage, new 
FacesMessage("test")));
+    }
+
+    @Test
+    public void testExistingSimpleMessage()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage("test"));
+        FacesMessage messageToCheck = new FacesMessage("test");
+        Assert.assertEquals(Boolean.FALSE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testExistingMessageWithoutSummary()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage(null, "test"));
+        FacesMessage messageToCheck = new FacesMessage(null, "test");
+        Assert.assertEquals(Boolean.FALSE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testExistingMessageWithoutDetails()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage("test", null));
+        FacesMessage messageToCheck = new FacesMessage("test", null);
+        Assert.assertEquals(Boolean.FALSE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testNewMessageWithExistingMessageWithoutText()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage(null, null));
+        FacesMessage messageToCheck = new FacesMessage("test");
+        Assert.assertEquals(Boolean.TRUE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testNewMessageWithoutText()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage("existing", "message"));
+        FacesMessage messageToCheck = new FacesMessage(null, null);
+        Assert.assertEquals(Boolean.TRUE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testNewMessageWithoutSummary()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage("existing", "message"));
+        FacesMessage messageToCheck = new FacesMessage(null, "test");
+        Assert.assertEquals(Boolean.TRUE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testNewMessageWithoutDetails()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage("existing", "message"));
+        FacesMessage messageToCheck = new FacesMessage("test", null);
+        Assert.assertEquals(Boolean.TRUE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testMessagesWithoutText()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage(null, null));
+        FacesMessage messageToCheck = new FacesMessage(null, null);
+        Assert.assertEquals(Boolean.FALSE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testNewMessageWithExistingMessageWithoutSummary()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage(null, "message"));
+        FacesMessage messageToCheck = new FacesMessage("new", "message");
+        Assert.assertEquals(Boolean.TRUE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testNewMessageWithExistingMessageWithoutDetails()
+    {
+        List<FacesMessage> existingFacesMessage = new 
ArrayList<FacesMessage>();
+        existingFacesMessage.add(new FacesMessage("existing", null));
+        FacesMessage messageToCheck = new FacesMessage("new", "message");
+        Assert.assertEquals(Boolean.TRUE,
+            JsfUtils.isNewMessage(existingFacesMessage, messageToCheck));
+    }
+
+    @Test
+    public void testRemoveUrlParameter()
+    {
+        
Assert.assertEquals("http://localhost:58481/windowScopedContextTest/page.xhtml";,
+                
JsfUtils.removeUrlParameter("http://localhost:58481/windowScopedContextTest/page.xhtml?jfwid=-1281";,
 "jfwid"));
+
+        
Assert.assertEquals("http://localhost:58481/windowScopedContextTest/page.xhtml";,
+                
JsfUtils.removeUrlParameter("http://localhost:58481/windowScopedContextTest/page.xhtml?jfwid=";,
 "jfwid"));
+    }
+}

Reply via email to