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