You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@myfaces.apache.org by lu...@apache.org on 2013/04/25 18:19:03 UTC

svn commit: r1475840 - in /myfaces/core/trunk: api/src/main/java/javax/faces/render/ impl/src/main/java/org/apache/myfaces/view/facelets/ impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/

Author: lu4242
Date: Thu Apr 25 16:19:02 2013
New Revision: 1475840

URL: http://svn.apache.org/r1475840
Log:
MYFACES-3714 - Implement stateless mode using f:view "transient" attribute

Modified:
    myfaces/core/trunk/api/src/main/java/javax/faces/render/ResponseStateManager.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewHandler.java

Modified: myfaces/core/trunk/api/src/main/java/javax/faces/render/ResponseStateManager.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/api/src/main/java/javax/faces/render/ResponseStateManager.java?rev=1475840&r1=1475839&r2=1475840&view=diff
==============================================================================
--- myfaces/core/trunk/api/src/main/java/javax/faces/render/ResponseStateManager.java (original)
+++ myfaces/core/trunk/api/src/main/java/javax/faces/render/ResponseStateManager.java Thu Apr 25 16:19:02 2013
@@ -141,4 +141,15 @@ public abstract class ResponseStateManag
     {
         return null;
     }
+    
+    /**
+     * @since 2.2
+     * @param context
+     * @param viewId
+     * @return 
+     */
+    public boolean isStateless(FacesContext context, String viewId)
+    {
+        return false;
+    }
 }

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java?rev=1475840&r1=1475839&r2=1475840&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java Thu Apr 25 16:19:02 2013
@@ -321,6 +321,18 @@ public class DefaultFaceletsStateManagem
                 throw new FacesException ("unable to create view \"" + viewId + "\"", e);
             }
 
+            // Stateless mode only for transient views and non stateless mode for
+            // stateful views.
+            boolean statelessMode = manager.isStateless(context, viewId);
+            if (statelessMode && !view.isTransient())
+            {
+                throw new IllegalStateException("View is not transient");
+            }
+            if (!statelessMode && view.isTransient())
+            {
+                throw new IllegalStateException("Cannot apply state over stateless view");
+            }
+            
             if (state != null && state[1] != null)
             {
                 states = (Map<String, Object>) state[1];
@@ -545,12 +557,12 @@ public class DefaultFaceletsStateManagem
             return null;
         }
         
-        if (view.isTransient())
-        {
+        //if (view.isTransient())
+        //{
             // Must return null immediately per spec.
             
-            return null;
-        }
+            //return null;
+        //}
         
         ExternalContext externalContext = context.getExternalContext();
         
@@ -930,13 +942,15 @@ public class DefaultFaceletsStateManagem
         {
             facesContext.getAttributes().remove(SKIP_ITERATION_HINT);
         }
-        
-        Object state = uiViewRoot.saveState (facesContext);
-        if (state != null)
+        if (!uiViewRoot.isTransient())
         {
-            // Save by client ID into our map.
-            
-            states.put (uiViewRoot.getClientId (facesContext), state);
+            Object state = uiViewRoot.saveState (facesContext);
+            if (state != null)
+            {
+                // Save by client ID into our map.
+
+                states.put (uiViewRoot.getClientId (facesContext), state);
+            }
         }
     }
 

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewHandler.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewHandler.java?rev=1475840&r1=1475839&r2=1475840&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewHandler.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/tag/jsf/core/ViewHandler.java Thu Apr 25 16:19:02 2013
@@ -69,6 +69,9 @@ public final class ViewHandler extends T
 
     @JSFFaceletAttribute
     private final TagAttribute afterPhase;
+    
+    @JSFFaceletAttribute(name="transient")
+    private final TagAttribute transientAttribute;
 
     /**
      * @param config
@@ -82,6 +85,7 @@ public final class ViewHandler extends T
         this.encoding = this.getAttribute("encoding");
         this.beforePhase = this.getAttribute("beforePhase");
         this.afterPhase = this.getAttribute("afterPhase");
+        this.transientAttribute = this.getAttribute("transient");
     }
 
     /**
@@ -152,6 +156,10 @@ public final class ViewHandler extends T
                 MethodExpression m = this.afterPhase.getMethodExpression(ctx, null, LISTENER_SIG);
                 root.setAfterPhaseListener(m);
             }
+            if (this.transientAttribute != null)
+            {
+                root.setTransient(this.transientAttribute.getBoolean(ctx));
+            }
         }
         this.nextHandler.apply(ctx, parent);
     }