Author: dmorozov
Date: 2008-06-26 09:33:39 -0400 (Thu, 26 Jun 2008)
New Revision: 9238
Modified:
trunk/framework/api/src/main/java/org/richfaces/model/CacheableTreeDataModel.java
trunk/framework/api/src/main/java/org/richfaces/model/ClassicCacheableTreeDataModel.java
trunk/framework/api/src/main/java/org/richfaces/model/TreeDataModel.java
trunk/samples/tree-demo/src/main/java/org/richfaces/TreeDndBean.java
trunk/samples/tree-demo/src/main/webapp/pages/dnd.jsp
trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java
trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java
Log:
Add tests for add & remove nodes methods in tree.
By the way were fixed 2 old bugs in tree component:
1. locateTreeNode was return root node if no one node located by rowKey
2. CacheableTreeDataModel didn't update cached nodes from source data model
Modified:
trunk/framework/api/src/main/java/org/richfaces/model/CacheableTreeDataModel.java
===================================================================
---
trunk/framework/api/src/main/java/org/richfaces/model/CacheableTreeDataModel.java 2008-06-26
13:28:48 UTC (rev 9237)
+++
trunk/framework/api/src/main/java/org/richfaces/model/CacheableTreeDataModel.java 2008-06-26
13:33:39 UTC (rev 9238)
@@ -172,4 +172,9 @@
return convertedKey;
}
+
+ @Override
+ public T locateTreeNode(TreeRowKey rowKey) {
+ return locateTreeNode(rowKey, true);
+ }
}
Modified:
trunk/framework/api/src/main/java/org/richfaces/model/ClassicCacheableTreeDataModel.java
===================================================================
---
trunk/framework/api/src/main/java/org/richfaces/model/ClassicCacheableTreeDataModel.java 2008-06-26
13:28:48 UTC (rev 9237)
+++
trunk/framework/api/src/main/java/org/richfaces/model/ClassicCacheableTreeDataModel.java 2008-06-26
13:33:39 UTC (rev 9238)
@@ -54,7 +54,9 @@
@Override
protected void setDefaultNodeData(TreeNode node, Object data) {
- ((TreeNodeImpl) node).setData(data);
+ if (node != null) {
+ ((TreeNodeImpl) node).setData(data);
+ }
}
}
Modified: trunk/framework/api/src/main/java/org/richfaces/model/TreeDataModel.java
===================================================================
--- trunk/framework/api/src/main/java/org/richfaces/model/TreeDataModel.java 2008-06-26
13:28:48 UTC (rev 9237)
+++ trunk/framework/api/src/main/java/org/richfaces/model/TreeDataModel.java 2008-06-26
13:33:39 UTC (rev 9238)
@@ -188,39 +188,42 @@
}
public T locateTreeNode(TreeRowKey rowKey, boolean allowCreate) {
- boolean useCached = (rowTreeData != null && rowKey != null &&
rowKey.equals(this.oldRowKey));
+ T tmpRowTreeData = this.rowTreeData;
+ TreeRowKey tmpOldRowKey = this.oldRowKey;
+
+ boolean useCached = (rowTreeData != null && rowKey != null &&
rowKey.equals(tmpOldRowKey));
if (!useCached) {
T rootNode = getData();
if (rootNode != null) {
if (rowKey != null) {
- int commonPathLength = rowKey.getCommonPathLength(oldRowKey);
- if (oldRowKey == null) {
- rowTreeData = rootNode;
+ int commonPathLength = rowKey.getCommonPathLength(tmpOldRowKey);
+ if (tmpOldRowKey == null) {
+ tmpRowTreeData = rootNode;
} else {
int rootOpsCount = rowKey.depth();
- int currentUpOpsCount = oldRowKey.depth() - commonPathLength;
+ int currentUpOpsCount = tmpOldRowKey.depth() - commonPathLength;
int currentOpsCount = currentUpOpsCount + rootOpsCount - commonPathLength;
if (rootOpsCount > currentOpsCount) {
- for (int i = 0; i < oldRowKey.depth()
+ for (int i = 0; i < tmpOldRowKey.depth()
- commonPathLength; i++) {
- rowTreeData = nodeAdaptor.getParent(rowTreeData);
+ tmpRowTreeData = nodeAdaptor.getParent(tmpRowTreeData);
}
} else {
commonPathLength = 0;
- rowTreeData = rootNode;
- oldRowKey = null;
+ tmpRowTreeData = rootNode;
+ tmpOldRowKey = null;
}
}
- oldRowKey = rowKey;
+ tmpOldRowKey = rowKey;
Iterator<?> iterator = rowKey.getSubPathIterator(commonPathLength);
while (iterator.hasNext()) {
//TODO nick - check rowTreeData for null
Object pathSegment = iterator.next();
- T childRowTreeData = nodeAdaptor.getChild(rowTreeData, pathSegment);
+ T childRowTreeData = nodeAdaptor.getChild(tmpRowTreeData, pathSegment);
if (childRowTreeData == null) {
if (!allowCreate) {
@@ -229,7 +232,7 @@
} else {
if (missingNodeHandler != null) {
childRowTreeData = missingNodeHandler.
- handleMissingNode(rowTreeData, pathSegment);
+ handleMissingNode(tmpRowTreeData, pathSegment);
if (childRowTreeData == null) {
return null;
@@ -240,7 +243,7 @@
}
}
- rowTreeData = childRowTreeData;
+ tmpRowTreeData = childRowTreeData;
}
} else {
return rootNode;
@@ -249,6 +252,12 @@
return null;
}
}
+
+ // check whether we were found something and store it
+ if (tmpRowTreeData != null) {
+ rowTreeData = tmpRowTreeData;
+ oldRowKey = tmpOldRowKey;
+ }
return rowTreeData;
}
Modified: trunk/samples/tree-demo/src/main/java/org/richfaces/TreeDndBean.java
===================================================================
--- trunk/samples/tree-demo/src/main/java/org/richfaces/TreeDndBean.java 2008-06-26
13:28:48 UTC (rev 9237)
+++ trunk/samples/tree-demo/src/main/java/org/richfaces/TreeDndBean.java 2008-06-26
13:33:39 UTC (rev 9238)
@@ -11,6 +11,7 @@
import java.util.Properties;
import javax.faces.FacesException;
+import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
@@ -323,16 +324,39 @@
AjaxContext ac = AjaxContext.getCurrentInstance();
// Add destination tree to reRender
try {
- ac.addComponentToAjaxRender(destTree);
+ ac.addComponentToAjaxRender(destTree);
} catch (Exception e) {
- System.err.print(e.getMessage());
+ System.err.print(e.getMessage());
}
+ if (leftTree.getRowKey() != null) {
+ leftSelectedNodeTitle = (String) leftTree.getRowData();
+ UIComponent selectL =
context.getViewRoot().findComponent("DnDTreeForm:selectedNodeL");
+ if (selectL != null) {
+ try {
+ ac.addComponentToAjaxRender(selectL);
+ } catch (Exception e) {
+ System.err.print(e.getMessage());
+ }
+ }
+ }
+ if (rightTree.getRowKey() != null) {
+ rightSelectedNodeTitle = (String) rightTree.getRowData();
+ UIComponent selectR =
context.getViewRoot().findComponent("DnDTreeForm:selectedNodeR");
+ if (selectR != null) {
+ try {
+ ac.addComponentToAjaxRender(selectR);
+ } catch (Exception e) {
+ System.err.print(e.getMessage());
+ }
+ }
+ }
+
// Add source tree to reRender
try {
- ac.addComponentToAjaxRender(srcTree);
+ ac.addComponentToAjaxRender(srcTree);
} catch (Exception e) {
- System.err.print(e.getMessage());
+ System.err.print(e.getMessage());
}
System.out.println("+++++");
Modified: trunk/samples/tree-demo/src/main/webapp/pages/dnd.jsp
===================================================================
--- trunk/samples/tree-demo/src/main/webapp/pages/dnd.jsp 2008-06-26 13:28:48 UTC (rev
9237)
+++ trunk/samples/tree-demo/src/main/webapp/pages/dnd.jsp 2008-06-26 13:33:39 UTC (rev
9238)
@@ -35,7 +35,7 @@
</head>
<body>
<f:view>
- <h:form>
+ <h:form id="DnDTreeForm">
<dnd:dragIndicator id="treeIndicator">
<f:facet name="single">
<f:verbatim>{marker} {nodeParam}({treeParam})</f:verbatim>
Modified: trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java
===================================================================
--- trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java 2008-06-26 13:28:48
UTC (rev 9237)
+++ trunk/ui/tree/src/main/java/org/richfaces/component/UITree.java 2008-06-26 13:33:39
UTC (rev 9238)
@@ -1139,6 +1139,7 @@
// 2. clean up node state
nodeState = getTreeNodeState(true);
clearTreeNodeState();
+ setRowKey(null);
} finally {
try {
setRowKey(context, storedKey);
Modified: trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java
===================================================================
--- trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java 2008-06-26
13:28:48 UTC (rev 9237)
+++ trunk/ui/tree/src/test/java/org/richfaces/component/TreeComponentTest.java 2008-06-26
13:33:39 UTC (rev 9238)
@@ -52,6 +52,8 @@
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.event.NodeSelectedListener;
import org.richfaces.model.ListRowKey;
+import org.richfaces.model.TreeNode;
+import org.richfaces.model.TreeNodeImpl;
import org.xml.sax.InputSource;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
@@ -914,7 +916,43 @@
tree.removeDragListener(dragListener);
treeNode.removeDragListener(dragListener);
}
-
+
+ public final void testAddNode() {
+ TreeNode rootNode = new TreeNodeImpl<String>();
+ rootNode.setData("root");
+ tree.setValue(rootNode);
+ tree.setPreserveModel("");
+
+ TreeNode<String> newNode = new TreeNodeImpl<String>();
+ newNode.setData("Sample node");
+
+ tree.addNode(facesContext, null, newNode, new Integer(111), null);
+ Object rowKey = tree.getTreeNodeRowKey(newNode);
+ assertNotNull(rowKey);
+ TreeNode<String> node = tree.getTreeNode(rowKey);
+ assertSame(node, newNode);
+ }
+
+ public final void testRemoveNode() {
+ TreeNode rootNode = new TreeNodeImpl<String>();
+ rootNode.setData("root");
+ tree.setValue(rootNode);
+ tree.setPreserveModel("");
+
+ TreeNode<String> newNode = new TreeNodeImpl<String>();
+ newNode.setData("Sample node");
+
+ tree.addNode(facesContext, null, newNode, new Integer(111), null);
+ Object rowKey = tree.getTreeNodeRowKey(newNode);
+ assertNotNull(rowKey);
+ TreeNode<String> node = tree.getTreeNode(rowKey);
+ assertSame(node, newNode);
+
+ tree.removeNode(rowKey);
+
+ tree.setRowKey(rowKey);
+ assertFalse(tree.isRowAvailable());
+ }
}
Show replies by date