You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by em...@apache.org on 2018/02/15 16:52:39 UTC

svn commit: r1824327 - /myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/application/FacesServletMappingUtils.java

Author: embreijo
Date: Thu Feb 15 16:52:39 2018
New Revision: 1824327

URL: http://svn.apache.org/viewvc?rev=1824327&view=rev
Log:
MYFACES-4202 FacesServletMappingUtils.isFacesServlet calls ClassUtils.simpleClassForName on every request

Modified:
    myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/application/FacesServletMappingUtils.java

Modified: myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/application/FacesServletMappingUtils.java
URL: http://svn.apache.org/viewvc/myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/application/FacesServletMappingUtils.java?rev=1824327&r1=1824326&r2=1824327&view=diff
==============================================================================
--- myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/application/FacesServletMappingUtils.java (original)
+++ myfaces/core/branches/2.3.x/shared/src/main/java/org/apache/myfaces/shared/application/FacesServletMappingUtils.java Thu Feb 15 16:52:39 2018
@@ -21,6 +21,9 @@ package org.apache.myfaces.shared.applic
 
 import java.util.Collection;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import javax.faces.context.ExternalContext;
 import javax.faces.context.FacesContext;
 import javax.faces.webapp.FacesServlet;
 import javax.servlet.ServletContext;
@@ -34,6 +37,9 @@ import org.apache.myfaces.shared.webapp.
  */
 public class FacesServletMappingUtils
 {
+    // Key used to store a map of servlet class names with boolean values that indicate whether the
+    // the servlet is a FacesServlet.
+    private static final String IS_FACES_SERVLET_CLASS_NAME_MAP = "org.apache.myfaces.IS_FACES_SERVLET_CLASS_NAME_MAP";
 
     public static FacesServletMapping calculateGenericFacesServletMapping(
         FacesContext facesContext, String servletPath, String pathInfo)
@@ -238,15 +244,41 @@ public class FacesServletMappingUtils
     
     public static boolean isFacesServlet(FacesContext facesContext, String servletClassName)
     {
-        Class servletClass = org.apache.myfaces.shared.util.ClassUtils.simpleClassForName(
-                servletClassName, false);
-        boolean isFacesServlet = false;
-        if (servletClass != null) 
-        {
-            isFacesServlet = (FacesServlet.class.isAssignableFrom(servletClass) ||
-                            DelegatedFacesServlet.class.isAssignableFrom(servletClass) ||
-                            servletClass.getName().equals(
-                                    WebXml.getWebXml(facesContext.getExternalContext()).getDelegateFacesServlet()));
+        ExternalContext eContext = facesContext.getExternalContext();
+
+        // Map used for caching purposes
+        Map<String, Boolean> servletClassNameMap = (Map<String, Boolean>) 
+                                eContext.getApplicationMap().get(IS_FACES_SERVLET_CLASS_NAME_MAP);
+
+        if (servletClassNameMap == null)
+        {
+            // Create the map if it has not been created yet
+            servletClassNameMap = new ConcurrentHashMap<String, Boolean>();
+            eContext.getApplicationMap().put(IS_FACES_SERVLET_CLASS_NAME_MAP, servletClassNameMap);
+        }
+
+        Boolean isFacesServlet = servletClassNameMap.get(servletClassName);
+
+        // if isFacesServlet is null, that means that we haven't cached the servletClassName boolean value
+        if (isFacesServlet == null)
+        {
+            Class servletClass = org.apache.myfaces.shared.util.ClassUtils.simpleClassForName(
+                    servletClassName, false);
+
+            if (servletClass != null)
+            {
+                isFacesServlet = (FacesServlet.class.isAssignableFrom(servletClass) ||
+                                DelegatedFacesServlet.class.isAssignableFrom(servletClass) ||
+                                servletClass.getName().equals(
+                                WebXml.getWebXml(eContext).getDelegateFacesServlet())) ? Boolean.TRUE : Boolean.FALSE;
+
+                servletClassNameMap.put(servletClassName, isFacesServlet);
+            }
+            else
+            {
+                isFacesServlet = Boolean.FALSE;
+                servletClassNameMap.put(servletClassName, isFacesServlet);
+            }
         }
 
         return isFacesServlet;