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 2009/11/04 19:20:44 UTC

svn commit: r832834 - in /myfaces/core/trunk/impl/src/main/java/org/apache/myfaces: application/jsp/JspStateManagerImpl.java view/facelets/DefaultFaceletsStateManagementStrategy.java

Author: lu4242
Date: Wed Nov  4 18:20:43 2009
New Revision: 832834

URL: http://svn.apache.org/viewvc?rev=832834&view=rev
Log:
MYFACES-2323 Implement <f:ajax> tag handler (fix server state saving + ajax)

Modified:
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/jsp/JspStateManagerImpl.java
    myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/view/facelets/DefaultFaceletsStateManagementStrategy.java

Modified: myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/jsp/JspStateManagerImpl.java
URL: http://svn.apache.org/viewvc/myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/jsp/JspStateManagerImpl.java?rev=832834&r1=832833&r2=832834&view=diff
==============================================================================
--- myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/jsp/JspStateManagerImpl.java (original)
+++ myfaces/core/trunk/impl/src/main/java/org/apache/myfaces/application/jsp/JspStateManagerImpl.java Wed Nov  4 18:20:43 2009
@@ -595,6 +595,37 @@
 
     }
 
+    @Override
+    public String getViewState(FacesContext facesContext)
+    {
+        UIViewRoot uiViewRoot = facesContext.getViewRoot();
+        String viewId = uiViewRoot.getViewId();
+        ViewDeclarationLanguage vdl = facesContext.getApplication().getViewHandler().getViewDeclarationLanguage(facesContext,viewId);
+        if (vdl != null)
+        {
+            StateManagementStrategy sms = vdl.getStateManagementStrategy(facesContext, viewId);
+            
+            if (sms != null)
+            {
+                if (log.isLoggable(Level.FINEST)) log.finest("Calling saveView of StateManagementStrategy from getViewState: "+sms.getClass().getName());
+                
+                return facesContext.getRenderKit().getResponseStateManager().getViewState(facesContext, saveView(facesContext));
+            }
+        }
+        Object[] savedState = (Object[]) saveView(facesContext);
+        
+        if (!isSavingStateInClient(facesContext))
+        {
+            Object[] state = new Object[2];
+            state[JSF_SEQUENCE_INDEX] = Integer.toString(getNextViewSequence(facesContext), Character.MAX_RADIX);
+            return facesContext.getRenderKit().getResponseStateManager().getViewState(facesContext, state);
+        }
+        else
+        {
+            return facesContext.getRenderKit().getResponseStateManager().getViewState(facesContext, savedState);
+        }
+    }
+
     /**
      * MyFaces extension
      * @param facesContext

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=832834&r1=832833&r2=832834&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 Wed Nov  4 18:20:43 2009
@@ -313,30 +313,44 @@
             return null;
         }
         
-        // Make sure the client IDs are unique per the spec.
-        
-        checkIds (context, view, new HashSet<String>());
-        
-        // Create save state objects for every component.
-        
-        states = new HashMap<String, Object>();
-        
-        //view.visitTree (VisitContext.createVisitContext (context), new SaveStateVisitor (states));
-        saveStateOnMap(context, states, view);
-        
-        // TODO: not sure the best way to handle dynamic adds/removes as mandated by the spec.
-        
-        // As required by ResponseStateManager, the return value is an Object array.  First
-        // element is the structure object, second is the state map.
-        
         ExternalContext externalContext = context.getExternalContext();
         
         Object serializedView = externalContext.getRequestMap()
             .get(DefaultFaceletsStateManagementHelper.SERIALIZED_VIEW_REQUEST_ATTR);
         
+        //Note on ajax case the method saveState could be called twice: once before start
+        //document rendering and the other one when it is called StateManager.getViewState method.
         if (serializedView == null)
         {
-            serializedView = new Object[] { null, states };
+                    
+            // Make sure the client IDs are unique per the spec.
+            
+            checkIds (context, view, new HashSet<String>());
+            
+            // Create save state objects for every component.
+            
+            states = new HashMap<String, Object>();
+            
+            //view.visitTree (VisitContext.createVisitContext (context), new SaveStateVisitor (states));
+            saveStateOnMap(context, states, view);
+            
+            // TODO: not sure the best way to handle dynamic adds/removes as mandated by the spec.
+            
+            // As required by ResponseStateManager, the return value is an Object array.  First
+            // element is the structure object, second is the state map.
+        
+            if (context.getApplication().getStateManager().isSavingStateInClient(context))
+            {
+                serializedView = new Object[] { null, states };
+            }
+            else
+            {
+                // On server side state saving, the structure field is used to save the view sequence.
+                // Originally, on JspStateManagerImpl this is done in writeState method, not in saveView,
+                // but note that on ajax case the state is both saved and written using StateManager.getViewState,
+                // so we must save it early
+                serializedView = new Object[] {Integer.toString(helper.getNextViewSequence(context), Character.MAX_RADIX), states};
+            }
             externalContext.getRequestMap().put(DefaultFaceletsStateManagementHelper.SERIALIZED_VIEW_REQUEST_ATTR,
                     serializedView);
         }