[richfaces-svn-commits] JBoss Rich Faces SVN: r13350 - in trunk/framework: impl/src/main/java/org/ajax4jsf/application and 1 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Wed Apr 1 13:33:51 EDT 2009


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




More information about the richfaces-svn-commits mailing list