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);
}