You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by pa...@apache.org on 2022/10/13 01:36:52 UTC

[myfaces] branch 2.3-next updated: MYFACES-4447: avoid UnsupportedOperationException

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

paulnicolucci pushed a commit to branch 2.3-next
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/2.3-next by this push:
     new 85e7c82a5 MYFACES-4447: avoid UnsupportedOperationException
     new febd4d0c2 Merge pull request #341 from pnicolucci/MYFACES-4447-23Next
85e7c82a5 is described below

commit 85e7c82a521e869b0fdf4d9c076eeab37a049dc1
Author: Paul Nicolucci <pn...@gmail.com>
AuthorDate: Wed Oct 12 19:50:07 2022 -0400

    MYFACES-4447: avoid UnsupportedOperationException
---
 .../apache/myfaces/webapp/AbstractFacesInitializer.java  | 10 ++++++----
 .../myfaces/webapp/MyFacesContainerInitializer.java      | 16 ++++++++++++++++
 2 files changed, 22 insertions(+), 4 deletions(-)

diff --git a/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java b/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
index 0ae48a933..6a8145901 100644
--- a/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
+++ b/impl/src/main/java/org/apache/myfaces/webapp/AbstractFacesInitializer.java
@@ -23,7 +23,6 @@ import org.apache.myfaces.config.FacesConfigurator;
 import org.apache.myfaces.config.RuntimeConfig;
 import org.apache.myfaces.context.servlet.StartupFacesContextImpl;
 import org.apache.myfaces.context.servlet.StartupServletExternalContextImpl;
-import org.apache.myfaces.application.FacesServletMappingUtils;
 import org.apache.myfaces.context.ExceptionHandlerImpl;
 import org.apache.myfaces.application.viewstate.StateUtils;
 import org.apache.myfaces.util.WebConfigParamUtils;
@@ -58,6 +57,7 @@ import java.util.logging.Logger;
 import javax.enterprise.inject.spi.BeanManager;
 import javax.faces.application.ViewVisitOption;
 import javax.faces.push.PushContext;
+import javax.servlet.ServletRegistration;
 import javax.websocket.DeploymentException;
 import javax.websocket.server.ServerContainer;
 import javax.websocket.server.ServerEndpointConfig;
@@ -696,13 +696,15 @@ public abstract class AbstractFacesInitializer implements FacesInitializer
      */
     protected void initAutomaticExtensionlessMapping(FacesContext facesContext, ServletContext servletContext)
     {
-        FacesServletMappingUtils.ServletRegistrationInfo facesServletRegistration =
-                FacesServletMappingUtils.getFacesServletRegistration(facesContext, servletContext);
+        ServletRegistration facesServletRegistration =
+                (ServletRegistration) servletContext.getAttribute(
+                    MyFacesContainerInitializer.FACES_SERVLET_SERVLETREGISTRATION);
+
         if (facesServletRegistration != null)
         {
             facesContext.getApplication().getViewHandler().getViews(facesContext, "/", 
                     ViewVisitOption.RETURN_AS_MINIMAL_IMPLICIT_OUTCOME).forEach(s -> {
-                        facesServletRegistration.getRegistration().addMapping(s);
+                        facesServletRegistration.addMapping(s);
                     });
         }
     }
diff --git a/impl/src/main/java/org/apache/myfaces/webapp/MyFacesContainerInitializer.java b/impl/src/main/java/org/apache/myfaces/webapp/MyFacesContainerInitializer.java
index 2d67ef92b..c6ecfe788 100644
--- a/impl/src/main/java/org/apache/myfaces/webapp/MyFacesContainerInitializer.java
+++ b/impl/src/main/java/org/apache/myfaces/webapp/MyFacesContainerInitializer.java
@@ -104,6 +104,16 @@ public class MyFacesContainerInitializer implements ServletContainerInitializer
      */
     public static final String FACES_SERVLET_FOUND = "org.apache.myfaces.FACES_SERVLET_FOUND";
 
+    /**
+     * Store the FacesServlet ServletRegistration using this key in the ServletContext.
+     * The is necessary for the MyFaces Extensionless Mapping feature. This is used
+     * in AbstractFacesInitializer when configuring the Extensionless Mapping feature since
+     * an UnsupportedOperationException is thrown when calling the ServletContext.getServletRegistrations
+     * method if the StartupServletContextListener was added programmatically.
+     */
+    public static final String FACES_SERVLET_SERVLETREGISTRATION =
+                "org.apache.myfaces.FACES_SERVLET_SERVLETREGISTRATION";
+
     private static final String FACES_CONFIG_RESOURCE = "/WEB-INF/faces-config.xml";
     private static final Logger log = Logger.getLogger(MyFacesContainerInitializer.class.getName());
     private static final String[] FACES_SERVLET_MAPPINGS = { "/faces/*", "*.jsf", "*.faces" };
@@ -181,6 +191,9 @@ public class MyFacesContainerInitializer implements ServletContainerInitializer
                     // added the mapping dynamically.
                     servletContext.setAttribute(FACES_SERVLET_ADDED_ATTRIBUTE, Boolean.TRUE);
 
+                    // Add the FacesServlet ServletRegistration as an attribute for use during initialization.
+                    servletContext.setAttribute(FACES_SERVLET_SERVLETREGISTRATION, servlet);
+
                     // add a log message
                     log.log(Level.INFO, "Added FacesServlet with mappings=" + Arrays.toString(mappings));
                 }
@@ -324,6 +337,9 @@ public class MyFacesContainerInitializer implements ServletContainerInitializer
                 // we found a FacesServlet; set an attribute for use during initialization
                 servletContext.setAttribute(FACES_SERVLET_FOUND, Boolean.TRUE);
                 isFacesServletPresent = true;
+
+                // Add the FacesServlet ServletRegistration as an attribute for use during initialization.
+                servletContext.setAttribute(FACES_SERVLET_SERVLETREGISTRATION, servletEntry.getValue());
             }
         }
         return isFacesServletPresent;