You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by wt...@apache.org on 2020/08/17 14:44:01 UTC

[myfaces] branch 3.0.x updated: MYFACES-4353 save HttpSession for ViewScope cleanup

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

wtlucy pushed a commit to branch 3.0.x
in repository https://gitbox.apache.org/repos/asf/myfaces.git


The following commit(s) were added to refs/heads/3.0.x by this push:
     new b9f6297  MYFACES-4353 save HttpSession for ViewScope cleanup
     new 1dcc80b  Merge pull request #117 from wtlucy/4353_viewscope_predestroy_3.0
b9f6297 is described below

commit b9f62971560afef17e8047609e030a0f4bbbd201
Author: Bill Lucy <wt...@gmail.com>
AuthorDate: Wed Jul 15 13:53:03 2020 -0400

    MYFACES-4353 save HttpSession for ViewScope cleanup
---
 .../servlet/StartupServletExternalContextImpl.java | 47 +++++++++++++++++++---
 .../webapp/ManagedBeanDestroyerListener.java       |  1 +
 2 files changed, 43 insertions(+), 5 deletions(-)

diff --git a/impl/src/main/java/org/apache/myfaces/context/servlet/StartupServletExternalContextImpl.java b/impl/src/main/java/org/apache/myfaces/context/servlet/StartupServletExternalContextImpl.java
index 53a4448..70d6173 100644
--- a/impl/src/main/java/org/apache/myfaces/context/servlet/StartupServletExternalContextImpl.java
+++ b/impl/src/main/java/org/apache/myfaces/context/servlet/StartupServletExternalContextImpl.java
@@ -23,6 +23,8 @@ import java.io.OutputStream;
 import java.io.UnsupportedEncodingException;
 import java.io.Writer;
 import java.security.Principal;
+import java.util.Enumeration;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
@@ -30,6 +32,7 @@ import java.util.Map;
 
 import jakarta.faces.context.Flash;
 import jakarta.servlet.ServletContext;
+import jakarta.servlet.http.HttpSession;
 
 /**
  * An ExternalContext implementation for Servlet environments, which is used
@@ -46,7 +49,8 @@ public class StartupServletExternalContextImpl extends ServletExternalContextImp
     
     private boolean _startup;
     private ServletContext _servletContext;
-    
+    private HttpSession _session;
+
     public StartupServletExternalContextImpl(final ServletContext servletContext,
             boolean startup)
     {
@@ -54,7 +58,17 @@ public class StartupServletExternalContextImpl extends ServletExternalContextImp
         _servletContext = servletContext;
         _startup = startup;
     }
-    
+
+    /**
+     * Allow an HttpSession to be saved for later calls to getSession*
+     *
+     * @param session
+     */
+    public void setSession(HttpSession session)
+    {
+        _session = session;
+    }
+
     // ~ Methods which are valid to be called during startup and shutdown------
     
     // Note that all methods, which are valid to be called during startup and
@@ -184,7 +198,11 @@ public class StartupServletExternalContextImpl extends ServletExternalContextImp
     @Override
     public Object getSession(boolean create)
     {
-        if (create)
+        if (_session != null)
+        {
+            return _session;
+        }
+        else if (create)
         {
             throw new UnsupportedOperationException(EXCEPTION_TEXT + _getTime());
         }
@@ -194,7 +212,11 @@ public class StartupServletExternalContextImpl extends ServletExternalContextImp
     @Override
     public String getSessionId(boolean create)
     {
-        if (create)
+        if (_session != null)
+        {
+            return _session.getId();
+        }
+        else if (create)
         {
             throw new UnsupportedOperationException(EXCEPTION_TEXT + _getTime());
         }
@@ -204,7 +226,22 @@ public class StartupServletExternalContextImpl extends ServletExternalContextImp
     @Override
     public Map<String, Object> getSessionMap()
     {
-        throw new UnsupportedOperationException(EXCEPTION_TEXT + _getTime());
+        if (_session != null)
+        {
+            Map<String, Object> sessionMap = new HashMap<String, Object>();
+            Enumeration<String> attributes = _session.getAttributeNames();
+            while (attributes.hasMoreElements())
+            {
+                String name = attributes.nextElement();
+                Object value = _session.getAttribute(name);
+                sessionMap.put(name, value);
+            }
+            return sessionMap;
+        }
+        else
+        {
+            throw new UnsupportedOperationException(EXCEPTION_TEXT + _getTime());
+        }
     }
 
     @Override
diff --git a/impl/src/main/java/org/apache/myfaces/webapp/ManagedBeanDestroyerListener.java b/impl/src/main/java/org/apache/myfaces/webapp/ManagedBeanDestroyerListener.java
index bb562fb..2315427 100644
--- a/impl/src/main/java/org/apache/myfaces/webapp/ManagedBeanDestroyerListener.java
+++ b/impl/src/main/java/org/apache/myfaces/webapp/ManagedBeanDestroyerListener.java
@@ -194,6 +194,7 @@ public class ManagedBeanDestroyerListener implements
                 {
                     ServletContext servletContext = event.getSession().getServletContext();
                     ExternalContext externalContext = new StartupServletExternalContextImpl(servletContext, false);
+                    ((StartupServletExternalContextImpl)externalContext).setSession(event.getSession());
                     ExceptionHandler exceptionHandler = new ExceptionHandlerImpl();
                     facesContext = new StartupFacesContextImpl(externalContext, 
                             (ReleaseableExternalContext) externalContext, exceptionHandler, false);