Author: nbelaevski
Date: 2009-04-01 13:33:51 -0400 (Wed, 01 Apr 2009)
New Revision: 13350
Modified:
trunk/framework/api/src/main/java/org/ajax4jsf/application/StateHolder.java
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateHolder.java
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateManager.java
trunk/framework/test/src/test/java/org/ajax4jsf/application/AjaxStateHolderTest.java
Log:
https://jira.jboss.org/jira/browse/RF-6647
Modified: trunk/framework/api/src/main/java/org/ajax4jsf/application/StateHolder.java
===================================================================
--- trunk/framework/api/src/main/java/org/ajax4jsf/application/StateHolder.java 2009-04-01
17:22:01 UTC (rev 13349)
+++ trunk/framework/api/src/main/java/org/ajax4jsf/application/StateHolder.java 2009-04-01
17:33:51 UTC (rev 13350)
@@ -20,10 +20,12 @@
*/
package org.ajax4jsf.application;
+import javax.faces.context.FacesContext;
+
public interface StateHolder {
- public Object[] getState(String viewId, String sequence);
+ public Object[] getState(FacesContext context, String viewId, String sequence);
- public void saveState(String viewId, String sequence, Object state[]);
+ public void saveState(FacesContext context, String viewId, String sequence, Object
state[]);
}
\ No newline at end of file
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateHolder.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateHolder.java 2009-04-01
17:22:01 UTC (rev 13349)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateHolder.java 2009-04-01
17:33:51 UTC (rev 13350)
@@ -22,7 +22,6 @@
import java.io.IOException;
import java.io.Serializable;
-import java.lang.ref.WeakReference;
import java.util.Map;
import javax.faces.context.ExternalContext;
@@ -66,38 +65,57 @@
if (_log.isDebugEnabled()) {
_log.debug("Request for a view states holder instance");
}
- StateHolder instance = null;
- synchronized (session) {
- instance = (StateHolder) sessionMap.get(STATE_HOLDER);
- if (null == instance) {
- // Create and store in session new state holder.
- int numbersOfViewsInSession = ContextInitParameters
- .getNumbersOfViewsInSession(context);
- int numbersOfLogicalViews = ContextInitParameters
- .getNumbersOfLogicalViews(context);
- if (_log.isDebugEnabled()) {
- _log
- .debug("No AjaxStateHolder instance in session, create new for hold "
- + numbersOfViewsInSession
- + " viewId and "
- + numbersOfLogicalViews
- + " logical views for each");
+ StateHolder instance = (StateHolder) sessionMap.get(STATE_HOLDER);
+ if (instance == null) {
+ synchronized (session) {
+ instance = (StateHolder) sessionMap.get(STATE_HOLDER);
+ if (null == instance) {
+ // Create and store in session new state holder.
+ int numbersOfViewsInSession = ContextInitParameters
+ .getNumbersOfViewsInSession(context);
+ int numbersOfLogicalViews = ContextInitParameters
+ .getNumbersOfLogicalViews(context);
+ if (_log.isDebugEnabled()) {
+ _log
+ .debug("No AjaxStateHolder instance in session, create new for hold "
+ + numbersOfViewsInSession
+ + " viewId and "
+ + numbersOfLogicalViews
+ + " logical views for each");
+ }
+ instance = new AjaxStateHolder(numbersOfViewsInSession,
+ numbersOfLogicalViews);
+ sessionMap.put(STATE_HOLDER, instance);
}
- instance = new AjaxStateHolder(numbersOfViewsInSession,
- numbersOfLogicalViews);
- sessionMap.put(STATE_HOLDER, instance);
}
}
+
return instance;
}
+ /**
+ * Updates instance of AjaxStateHolder saved in session in order
+ * to force replication in clustered environment
+ *
+ * @param context
+ */
+ protected void updateInstance(FacesContext context) {
+ ExternalContext externalContext = context.getExternalContext();
+ Object session = externalContext.getSession(true);
+ Map<String, Object> sessionMap = externalContext.getSessionMap();
+
+ synchronized (session) {
+ sessionMap.put(STATE_HOLDER, this);
+ }
+ }
+
/*
* (non-Javadoc)
*
* @see org.ajax4jsf.application.StateHolder#getState(java.lang.String,
* java.lang.Object)
*/
- public Object[] getState(String viewId, String sequence) {
+ public Object[] getState(FacesContext context, String viewId, String sequence) {
if (null == viewId) {
throw new NullPointerException(
"viewId parameter for get saved view state is null");
@@ -132,7 +150,7 @@
* @see org.ajax4jsf.application.StateHolder#saveState(java.lang.String,
* java.lang.Object, java.lang.Object)
*/
- public void saveState(String viewId, String sequence, Object[] state) {
+ public void saveState(FacesContext context, String viewId, String sequence, Object[]
state) {
if (null == viewId) {
throw new NullPointerException(
"viewId parameter for save view state is null");
@@ -167,6 +185,8 @@
}
}
+ //serialization is synchronized in writeObject()
+ updateInstance(context);
}
}
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateManager.java
===================================================================
---
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateManager.java 2009-04-01
17:22:01 UTC (rev 13349)
+++
trunk/framework/impl/src/main/java/org/ajax4jsf/application/AjaxStateManager.java 2009-04-01
17:33:51 UTC (rev 13350)
@@ -453,7 +453,7 @@
String viewId, String renderKitId) {
String id = restoreLogicalViewId(context, viewId, renderKitId);
StateHolder stateHolder = getStateHolder(context);
- Object[] restoredState = stateHolder.getState(viewId, id);
+ Object[] restoredState = stateHolder.getState(context, viewId, id);
if (restoredState != null && id != null) {
context.getExternalContext().getRequestMap().put(AJAX_VIEW_SEQUENCE, id);
@@ -495,7 +495,7 @@
UIViewRoot viewRoot = context.getViewRoot();
StateHolder stateHolder = getStateHolder(context);
String id = getLogicalViewId(context);
- stateHolder.saveState(viewRoot.getViewId(), id, new Object[] {
+ stateHolder.saveState(context, viewRoot.getViewId(), id, new Object[] {
treeStructure, state });
serializedView = new Object[]{id, null};
return serializedView;
Modified:
trunk/framework/test/src/test/java/org/ajax4jsf/application/AjaxStateHolderTest.java
===================================================================
---
trunk/framework/test/src/test/java/org/ajax4jsf/application/AjaxStateHolderTest.java 2009-04-01
17:22:01 UTC (rev 13349)
+++
trunk/framework/test/src/test/java/org/ajax4jsf/application/AjaxStateHolderTest.java 2009-04-01
17:33:51 UTC (rev 13350)
@@ -66,19 +66,19 @@
Object state = new Object();
Object state2 = new Object();
StateHolder ajaxStateHolder = AjaxStateHolder.getInstance(facesContext);
- assertNull(ajaxStateHolder.getState("foo", "_id1"));
- ajaxStateHolder.saveState("foo", "_id1", new Object[]{state});
- ajaxStateHolder.saveState("foo", "_id2", new Object[]{state2});
- assertNull(ajaxStateHolder.getState("bar", "_id1"));
- assertSame(state2,ajaxStateHolder.getState("foo",null));
- assertSame(state,ajaxStateHolder.getState("foo","_id1"));
- assertSame(state,ajaxStateHolder.getState("foo","_id3"));
+ assertNull(ajaxStateHolder.getState(facesContext, "foo", "_id1"));
+ ajaxStateHolder.saveState(facesContext, "foo", "_id1", new
Object[]{state});
+ ajaxStateHolder.saveState(facesContext, "foo", "_id2", new
Object[]{state2});
+ assertNull(ajaxStateHolder.getState(facesContext, "bar", "_id1"));
+ assertSame(state2,ajaxStateHolder.getState(facesContext, "foo",null));
+ assertSame(state,ajaxStateHolder.getState(facesContext,
"foo","_id1"));
+ assertSame(state,ajaxStateHolder.getState(facesContext,
"foo","_id3"));
Object state3 = new Object();
Object state4 = new Object();
- ajaxStateHolder.saveState("bar", "_id1", new Object[]{state3});
- ajaxStateHolder.saveState("bar", "_id2", new Object[]{state4});
- assertSame(state3,ajaxStateHolder.getState("bar","_id1"));
- assertSame(state,ajaxStateHolder.getState("foo","_id3"));
+ ajaxStateHolder.saveState(facesContext, "bar", "_id1", new
Object[]{state3});
+ ajaxStateHolder.saveState(facesContext, "bar", "_id2", new
Object[]{state4});
+ assertSame(state3,ajaxStateHolder.getState(facesContext,
"bar","_id1"));
+ assertSame(state,ajaxStateHolder.getState(facesContext,
"foo","_id3"));
}