[richfaces-svn-commits] JBoss Rich Faces SVN: r1986 - in trunk: sandbox/ui/treeModel/src/main/java/org/richfaces/component and 1 other directory.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Wed Aug 1 12:52:51 EDT 2007


Author: nbelaevski
Date: 2007-08-01 12:52:51 -0400 (Wed, 01 Aug 2007)
New Revision: 1986

Modified:
   trunk/framework/api/src/main/java/org/richfaces/model/StackingTreeModel.java
   trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java
   trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java
Log:
Latest changes for StackingTreeModel.java

Modified: trunk/framework/api/src/main/java/org/richfaces/model/StackingTreeModel.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/StackingTreeModel.java	2007-08-01 16:23:15 UTC (rev 1985)
+++ trunk/framework/api/src/main/java/org/richfaces/model/StackingTreeModel.java	2007-08-01 16:52:51 UTC (rev 1986)
@@ -4,10 +4,12 @@
 package org.richfaces.model;
 
 import java.io.IOException;
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 
@@ -24,24 +26,36 @@
  */
 public class StackingTreeModel extends AbstractTreeDataModel implements TreeComponentModel {
 
+	//ctor arguments
 	private String id;
 	private String var;
-	
-	private String modelId;
-	private Object modelKey;
-
-	private Object rowData;
-	
 	private StackingTreeModelDataProvider dataProvider;
-	protected StackingTreeModel stackingTreeModel;
 
-	// private ExtendedDataModel dataModel;
-	protected StackingTreeModel parent;
+	//structural elements
+	private StackingTreeModel parent;
 	private Map models = new LinkedHashMap();
 
+	//listeners
 	private List treeComponentModelListeners = new ArrayList();
-	private Object varObject;
 
+	private Object rowKey;
+
+	private class StackEntry {
+		private Object modelKey;
+		private Object varObject;
+		private StackingTreeModel model;
+		public StackEntry(Object varObject, Object modelKey, StackingTreeModel model) {
+			super();
+			this.varObject = varObject;
+			this.modelKey = modelKey;
+			this.model = model;
+		}
+	}
+
+	private Object rowData;
+//	private StackingTreeModel stackingTreeModel;
+	private LinkedList stackEntries = new LinkedList();
+
 	public ExtendedDataModel getDataModel() {
 		Object data = dataProvider.getData();
 		ExtendedDataModel dataModel;
@@ -59,8 +73,76 @@
 		//TODO optimize that
 		return getDataModel().getRowCount() == 0;
 	}
+
+	private void leaveModel(Iterator iterator, StackEntry currentEntry, FacesContext context) {
+		if (iterator == null) {
+			return ;
+		}
+
+		LinkedList stack = new LinkedList();
+
+		if (currentEntry != null) {
+			iterator.remove();
+			stack.addFirst(currentEntry);
+		}
+
+		while (iterator.hasNext()) {
+			stack.addFirst(iterator.next());
+			iterator.remove();
+		}
+
+		for (Iterator iterator2 = stack.iterator(); iterator2.hasNext();) {
+			StackEntry stackEntry = (StackEntry) iterator2.next();
+			stackEntry.model.setupVariable(stackEntry.varObject, context);
+		}
+	}
+
+	protected StackingTreeModel doSetupKey(Iterator keyIterator, Iterator entriesIterator, FacesContext context) {
+		if (keyIterator == null || !keyIterator.hasNext()) {
+			leaveModel(entriesIterator, null, context);
+			return this;
+		} else {
+			Key key = (Key) keyIterator.next();
+			StackingTreeModel stackingTreeModel = (StackingTreeModel) this.getModels().get(key.modelId);
+			if (entriesIterator != null && entriesIterator.hasNext()) {
+				StackEntry entry = (StackEntry) entriesIterator.next();
+				if (entry.model != stackingTreeModel || entry.modelKey != key.modelKey) {
+					//entry.model.restoreVariable(entry.varObject);
+					leaveModel(entriesIterator, entry, context);
+
+					stackingTreeModel.setupModel(key.modelKey, context);
+					entriesIterator = null;
+				}
+			} else {
+				stackingTreeModel.setupModel(key.modelKey, context);
+				entriesIterator = null;
+			}
+
+			return stackingTreeModel.doSetupKey(keyIterator, entriesIterator, context);
+		}
+	}
 	
+	
+	protected StackingTreeModel setupKey(Object key, FacesContext context) {
+		if (key == this.rowKey) {
+			if (stackEntries.isEmpty()) {
+				return this;
+			} else {
+				return ((StackEntry) stackEntries.getLast()).model;
+			}
+		} else {
+			Iterator keyIterator = null;
+			if (key != null) {
+				keyIterator = ((ListRowKey) key).iterator();
+			}
+			
+			StackingTreeModel model = doSetupKey(keyIterator, stackEntries.iterator(), context);
+			this.rowKey = key;
 
+			return model;
+		}
+	}
+
 	public StackingTreeModel(String id, String var, StackingTreeModelDataProvider dataProvider) {
 		super();
 		this.id = id;
@@ -72,39 +154,26 @@
 		this(null, null, null);
 	}
 
-	public void leaveModel(FacesContext facesContext) {
-		if (stackingTreeModel != null && stackingTreeModel != this) {
-			stackingTreeModel.leaveModel();
+	private Object setupVariable(Object variable, FacesContext context) {
+		if (var != null) {
+			Map map = context.getExternalContext().getRequestMap();
+			return map.put(var, variable);
 		}
-		stackingTreeModel = null;
-		modelId = null;
-		modelKey = null;
 
-		if (var != null) {
-			Map map = facesContext.getExternalContext().getRequestMap();
-			map.put(var, varObject);
-		}
-		
-		rowData = null;
+		return null;
 	}
-	
-	public void leaveModel() {
-		leaveModel(FacesContext.getCurrentInstance());
-	}
 
-	public void setupModel(Object object, FacesContext facesContext) {
-		if (var != null) {
-			Map map = facesContext.getExternalContext().getRequestMap();
-			varObject = map.get(var);
-			map.put(var, object);
-		}
-		
-		rowData = object;
+	public void setupModel(Object key, FacesContext facesContext) {
+		ExtendedDataModel dataModel = getDataModel();
+		dataModel.setRowKey(key);
+
+		Object rowData = dataModel.getRowData();
+		//System.out.println("StackingTreeModel.setupModel() " + rowData);
+		Object varObject = setupVariable(rowData, facesContext);
+
+		this.rowData = rowData;
+		getRoot().stackEntries.add(new StackEntry(varObject, key, this));
 	}
-	
-	public void setupModel(Object object) {
-		setupModel(object, FacesContext.getCurrentInstance());
-	}
 
 	public void setParent(StackingTreeModel parent) {
 		this.parent = parent;
@@ -125,11 +194,12 @@
 	 * @see org.richfaces.model.AbstractTreeDataModel#isLeaf()
 	 */
 	public boolean isLeaf() {
-		if (stackingTreeModel != null && stackingTreeModel != this) {
-			return stackingTreeModel.isLeaf();
+		if (stackEntries.isEmpty()) {
+			return false;
 		}
-		
-		Collection values = this.getModels().values();
+
+		StackEntry lastEntry = (StackEntry) stackEntries.getLast();
+		Collection values = lastEntry.model.getModels().values();
 		for (Iterator iterator = values.iterator(); iterator.hasNext();) {
 			StackingTreeModel stackingTreeModel = (StackingTreeModel) iterator.next();
 
@@ -141,24 +211,24 @@
 		return true;
 	}
 
+	protected StackingTreeModel getRoot() {
+		if (parent != null) {
+			return parent.getRoot();
+		}
+
+		return this;
+	}
+
 	protected void doWalk(FacesContext context, DataVisitor dataVisitor,
-			Range range, Object rowKey, Object argument,
+			Range range, ListRowKey argumentKey, Object argument,
 			boolean last) throws IOException {
-		final ListRowKey argumentKey = (ListRowKey) rowKey;
 
-		if (argument != null) {
-			Argument2 a = (Argument2) argument;
-
-			Object localRowKey = a.localKey;
-			ExtendedDataModel dataModel = a.dataModel;
-			if (dataModel == null) {
-				dataModel = getDataModel();
-			}
-			dataModel.setRowKey(localRowKey);
-			setupModel(dataModel.getRowData(), context);
-			//System.out.println(dataModel.getRowData() + (last ? " * " : "") + " - " + argumentKey);
-
+		if (argumentKey != null) {
+			getRoot().setRowKey(argumentKey);
 			processElement(context, dataVisitor, argument, argumentKey, last);
+			getRoot().setRowKey(argumentKey);
+		} else {
+			getRoot().setRowKey(argumentKey);
 		}
 
 		ShiftingDataVisitor shiftingDataVisitor = new ShiftingDataVisitor(
@@ -167,76 +237,49 @@
 		while (iterator.hasNext()) {
 			Map.Entry entry = (Map.Entry) iterator.next();
 			StackingTreeModel model = (StackingTreeModel) entry.getValue();
-			doSpecialWalk(context, shiftingDataVisitor, range, argumentKey, last, model);
+
+			Argument argument2 = new Argument();
+			argument2.listRowKey = argumentKey;
+			argument2.argument = argument;
+			// setup current model
+			argument2.model = model;
+			argument2.range = range;
+			model.getDataModel().walk(context, shiftingDataVisitor, null,
+					argument2);
+
 		}
-		
+
 		shiftingDataVisitor.end(context);
 	}
-	
+
 	public Map getModels() {
 		return models;
 	}
-	
+
 	public void walk(FacesContext context, DataVisitor dataVisitor,
 			Range range, Object rowKey, Object argument,
 			boolean last) throws IOException {
 
 		if (rowKey != null) {
 			ListRowKey listRowKey = (ListRowKey) rowKey;
-			if (listRowKey != null) {
-				int depth = listRowKey.depth();
-				StackingTreeModel stackingTreeModel = this;
-				for (int i = 0; i < depth; i++) {
-					Key key = (Key) listRowKey.get(i);
-					if (key.modelId != null) {
-						stackingTreeModel = (StackingTreeModel) stackingTreeModel.getModels().get(key.modelId);
 
-						this.stackingTreeModel = stackingTreeModel;
-						this.modelId = key.modelId;
-							
-						if (i == depth - 1) {
-							Argument2 argument2 = new Argument2();
-							argument2.localKey = key.modelKey;
-							//argument2.dataModel = stackingTreeModel;
-							stackingTreeModel.doWalk(context, dataVisitor, range, listRowKey, argument2,
-									last);
-						} else {
-							stackingTreeModel.setLocalRowKey(key.modelKey);
-						}
-					}
-				}
-			}
+			StackingTreeModel treeModel = getRoot().setupKey(listRowKey, context);
+
+			treeModel.doWalk(context, dataVisitor, range, listRowKey, null,
+					last);
+
 		} else {
-			doWalk(context, dataVisitor, range, rowKey, argument, last);
+			doWalk(context, dataVisitor, range, (ListRowKey) rowKey, argument, last);
 		}
 	}
 
-	private void doSpecialWalk(FacesContext context,
-			ShiftingDataVisitor dataVisitor, Range range,
-			ListRowKey rowKey, boolean last, StackingTreeModel stackingTreeModel) throws IOException {
-
-		Argument argument2 = new Argument();
-		argument2.listRowKey = rowKey;
-		// setup current model
-		argument2.model = stackingTreeModel;
-		argument2.dataModel = stackingTreeModel.getDataModel();
-		argument2.range = range;
-		argument2.dataModel.walk(context, dataVisitor, range,
-				argument2);
-	}
-
 	private class Argument {
-		private ExtendedDataModel dataModel;
 		private ListRowKey listRowKey;
 		private StackingTreeModel model;
 		private Range range;
+		private Object argument;
 	}
 
-	private class Argument2 {
-		private Object localKey;
-		private ExtendedDataModel dataModel;
-	}
-
 	private class Visitor1 implements DataVisitor, LastElementAware {
 		private DataVisitor dataVisitor;
 		private boolean theLast;
@@ -253,10 +296,8 @@
 			ListRowKey listRowKey = new ListRowKey(a.listRowKey, new Key(
 					a.model.id, rowKey));
 			//System.out.println(".walk() " + (theLast ? " * " : "") + listRowKey);
-			Argument2 argument2 = new Argument2();
-			argument2.localKey = rowKey;
-			argument2.dataModel = a.dataModel;
-			a.model.doWalk(context, dataVisitor, a.range, listRowKey, argument2,
+
+			a.model.doWalk(context, dataVisitor, a.range, listRowKey, a.argument,
 					theLast);
 		}
 
@@ -334,51 +375,16 @@
 	 */
 	public Object getRowKey() {
 		if (parent == null) {
-			ListRowKey listRowKey = new ListRowKey();
-			return listRowKey;
+			return rowKey;
 		} else {
-			return new ListRowKey((ListRowKey) parent.getRowKey(), new Key(this.modelId, modelKey));
+			return this.parent.getRowKey();
 		}
 	}
 
-	protected void setLocalRowKey(Object rowKey) {
-		ExtendedDataModel dataModel = getDataModel();
-		this.modelKey = rowKey;
-		dataModel.setRowKey(rowKey);
-		setupModel(dataModel.getRowData());
+	public void setRowKey(Object key) {
+		setupKey(key, FacesContext.getCurrentInstance());
 	}
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.ajax4jsf.model.ExtendedDataModel#setRowKey(java.lang.Object)
-	 */
-	protected void doSetRowKey(Object key) {
-		ListRowKey listRowKey = (ListRowKey) key;
-		if (listRowKey != null) {
-			Key rowKey = (Key) listRowKey.get(0);
-			if (rowKey.modelId != null) {
-				StackingTreeModel stackingTreeModel = (StackingTreeModel) this.getModels().get(rowKey.modelId);
 
-				this.stackingTreeModel = stackingTreeModel;
-				this.modelId = rowKey.modelId;
-
-				if (listRowKey.depth() == 1) {
-					stackingTreeModel.setLocalRowKey(rowKey.modelKey);
-				} else {
-					stackingTreeModel.setLocalRowKey(rowKey.modelKey);
-					stackingTreeModel.doSetRowKey(listRowKey.getSubKey(1));
-				}
-			}
-		}
-	}
-
-	public void setRowKey(Object key) {
-		leaveModel();
-		
-		doSetRowKey(key);
-	}
-	
 	public void addStackingModel(StackingTreeModel model) {
 		this.models.put(model.id, model);
 		model.setParent(this);
@@ -390,11 +396,11 @@
 	 * @see javax.faces.model.DataModel#getRowData()
 	 */
 	public Object getRowData() {
-		if (stackingTreeModel != null && stackingTreeModel != this) {
-			return stackingTreeModel.getRowData();
-		}
+//		if (stackingTreeModel != null && stackingTreeModel != this) {
+//		return stackingTreeModel.getRowData();
+//		}
 
-		return rowData;
+		return this.rowData;
 	}
 
 	/*
@@ -407,7 +413,15 @@
 		return true;
 	}
 
-	protected static class Key {
+	public StackingTreeModel getParent() {
+		return parent;
+	}
+
+	protected static class Key implements Serializable {
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = -6821854350257816571L;
 		protected Object modelKey;
 		protected String modelId;
 
@@ -431,14 +445,14 @@
 			TreeComponentModelListener listener) {
 		this.treeComponentModelListeners.remove(listener);
 	}
-	
+
 	protected void componentSelected(UIComponent component) {
 		for (Iterator iterator = this.treeComponentModelListeners.iterator(); iterator.hasNext();) {
 			TreeComponentModelListener listener = (TreeComponentModelListener) iterator.next();
-			
+
 			listener.componentSelected(component);
 		}
-		
+
 		if (parent != null) {
 			parent.componentSelected(component);
 		}

Modified: trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java
===================================================================
--- trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java	2007-08-01 16:23:15 UTC (rev 1985)
+++ trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java	2007-08-01 16:52:51 UTC (rev 1986)
@@ -6,6 +6,8 @@
 
 import java.util.Map;
 
+import javax.faces.context.FacesContext;
+
 import org.richfaces.model.StackingTreeModel;
 import org.richfaces.model.StackingTreeModelDataProvider;
 
@@ -41,13 +43,13 @@
 			
 		}) {
 
-			public void setupModel(Object object) {
-				super.setupModel(object);
+			public void setupModel(Object object, FacesContext facesContext) {
+				super.setupModel(object, facesContext);
 				componentSelected(UIRecursiveTreeNodes.this);
 			}
 
 			public Map getModels() {
-				return this.parent.getModels();
+				return this.getParent().getModels();
 			}
 		};
 		stackingModel.addStackingModel(recursiveModel);

Modified: trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java
===================================================================
--- trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java	2007-08-01 16:23:15 UTC (rev 1985)
+++ trunk/sandbox/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java	2007-08-01 16:52:51 UTC (rev 1986)
@@ -4,6 +4,8 @@
 
 package org.richfaces.component;
 
+import javax.faces.context.FacesContext;
+
 import org.richfaces.model.StackingTreeModel;
 import org.richfaces.model.StackingTreeModelDataProvider;
 import org.richfaces.model.StackingTreeModelProvider;
@@ -30,8 +32,8 @@
 			}
 			
 		}) {
-			public void setupModel(Object object) {
-				super.setupModel(object);
+			public void setupModel(Object object, FacesContext facesContext) {
+				super.setupModel(object, facesContext);
 				componentSelected(UITreeNodes.this);
 			}
 		};




More information about the richfaces-svn-commits mailing list