You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by ss...@apache.org on 2006/11/10 23:10:59 UTC

svn commit: r473527 - in /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces: context/servlet/ServletFacesContextImpl.java portlet/MyFacesGenericPortlet.java

Author: ssilvert
Date: Fri Nov 10 14:10:58 2006
New Revision: 473527

URL: http://svn.apache.org/viewvc?view=rev&rev=473527
Log:
https://issues.apache.org/jira/browse/MYFACES-1481

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletFacesContextImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/MyFacesGenericPortlet.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletFacesContextImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletFacesContextImpl.java?view=diff&rev=473527&r1=473526&r2=473527
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletFacesContextImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/context/servlet/ServletFacesContextImpl.java Fri Nov 10 14:10:58 2006
@@ -293,6 +293,11 @@
         }
     }
 
+    public boolean isReleased()
+    {
+       return _released;
+    }
+    
     public void release()
     {
         if (_released) {

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/MyFacesGenericPortlet.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/MyFacesGenericPortlet.java?view=diff&rev=473527&r1=473526&r2=473527
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/MyFacesGenericPortlet.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/portlet/MyFacesGenericPortlet.java Fri Nov 10 14:10:58 2006
@@ -314,15 +314,22 @@
     {
         if (log.isTraceEnabled()) log.trace("Non-faces request: contextPath = " + request.getContextPath());
         setContentType(request, response); // do this in case nonFacesRequest is called by a subclass
+        
+        FacesContext facesContext = facesContext(request, response);
+        setViewRootOnFacesContext(facesContext, view);
+        lifecycle.render(facesContext);
+    }
+    
+    // Set the view root on a FacesContext to prepare for rendering
+    private void setViewRootOnFacesContext(FacesContext facesContext, String view)
+    {
         ApplicationFactory appFactory =
             (ApplicationFactory)FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
         Application application = appFactory.getApplication();
         ViewHandler viewHandler = application.getViewHandler();
-        FacesContext facesContext = facesContext(request, response);
         UIViewRoot viewRoot = viewHandler.createView(facesContext, view);
         viewRoot.setViewId(view);
         facesContext.setViewRoot(viewRoot);
-        lifecycle.render(facesContext);
     }
 
     protected String selectDefaultView(RenderRequest request, RenderResponse response) throws PortletException
@@ -385,11 +392,12 @@
 
         setPortletRequestFlag(request);
 
+        ServletFacesContextImpl facesContext = null;
         try
         {
-            ServletFacesContextImpl facesContext = (ServletFacesContextImpl)request.
-                                                   getPortletSession().
-                                                   getAttribute(CURRENT_FACES_CONTEXT);
+            facesContext = (ServletFacesContextImpl)request.
+                                                    getPortletSession().
+                                                    getAttribute(CURRENT_FACES_CONTEXT);
 
             // depending on the Portal implementation, facesContext could be
             // null after a redeploy
@@ -399,6 +407,12 @@
                return;
             }
             
+            if (facesContext.isReleased()) // processAction was not called
+            {
+               facesContext = (ServletFacesContextImpl)facesContext(request, response);
+               setViewRootOnFacesContext(facesContext, viewId);
+            }
+            
             // TODO: not sure if this can happen.  Also double check this against spec section 2.1.3
             if (facesContext.getResponseComplete()) return;
 
@@ -408,6 +422,12 @@
         catch (Throwable e)
         {
             handleExceptionFromLifecycle(e);
+        }
+        finally
+        {
+           // must release the FacesContext here because it is in the 
+           // session and it might get replicated in a clustered envirnoment
+           if (facesContext != null) facesContext.release();
         }
     }