[richfaces-svn-commits] JBoss Rich Faces SVN: r2062 - in trunk: framework/test/src/test/java/org/richfaces/model and 5 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Sat Aug 4 16:14:28 EDT 2007


Author: nbelaevski
Date: 2007-08-04 16:14:28 -0400 (Sat, 04 Aug 2007)
New Revision: 2062

Added:
   trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java
   trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java
Modified:
   trunk/framework/api/src/main/java/org/richfaces/model/StackingTreeModel.java
   trunk/framework/test/src/test/java/org/richfaces/model/StackingTreeDataModelTest.java
   trunk/samples/treeModelDemo/src/main/resources/org/richfaces/model/tree-model-data.xml
   trunk/samples/treeModelDemo/src/main/resources/org/richfaces/service/tree-model-rules.xml
   trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp
   trunk/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java
   trunk/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java
Log:
- Unit tests for StackingTreeDataModel extended
- Draft implementation of handling for nested UIRecursiveTreeNodes
- Added nested UIRecursiveTreeNodes to sample

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-04 02:19:57 UTC (rev 2061)
+++ trunk/framework/api/src/main/java/org/richfaces/model/StackingTreeModel.java	2007-08-04 20:14:28 UTC (rev 2062)
@@ -6,7 +6,6 @@
 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;
@@ -19,6 +18,8 @@
 import org.ajax4jsf.model.DataVisitor;
 import org.ajax4jsf.model.ExtendedDataModel;
 import org.ajax4jsf.model.Range;
+import org.apache.commons.collections.Predicate;
+import org.apache.commons.collections.iterators.FilterIterator;
 
 /**
  * @author Nick Belaevski mailto:nbelaevski at exadel.com created 25.07.2007
@@ -103,7 +104,7 @@
 			return this;
 		} else {
 			Key key = (Key) keyIterator.next();
-			StackingTreeModel stackingTreeModel = this.getModelById(key.modelId);
+			StackingTreeModel stackingTreeModel = this.getInternalModelById(key.modelId);
 			if (entriesIterator != null && entriesIterator.hasNext()) {
 				StackEntry entry = (StackEntry) entriesIterator.next();
 				if (entry.model != stackingTreeModel || entry.modelKey != key.modelKey) {
@@ -199,7 +200,7 @@
 		}
 
 		StackEntry lastEntry = (StackEntry) stackEntries.getLast();
-		for (Iterator iterator = lastEntry.model.getModelsIterator(); iterator.hasNext();) {
+		for (Iterator iterator = lastEntry.model.getInternalModelsIterator(); iterator.hasNext();) {
 			StackingTreeModel stackingTreeModel = (StackingTreeModel) iterator.next();
 
 			if (!stackingTreeModel.isEmpty()) {
@@ -237,7 +238,7 @@
 					new Visitor1(dataVisitor));
 			
 			if (treeRange == null || treeRange.processChildren(argumentKey)) {
-				Iterator iterator = this.getModelsIterator();
+				Iterator iterator = this.getInternalModelsIterator();
 				while (iterator.hasNext()) {
 					StackingTreeModel model = (StackingTreeModel) iterator.next();
 
@@ -258,10 +259,23 @@
 		}
 	}
 
+	private StackingTreeModel getInternalModelById(String id) {
+		StackingTreeModel model = getModelById(id);
+		if (model.isActive()) {
+			return model;
+		}
+		
+		throw new IllegalStateException();
+	}
+	
 	public StackingTreeModel getModelById(String id) {
 		return (StackingTreeModel) models.get(id);
 	}
 	
+	private Iterator getInternalModelsIterator() {
+		return new FilterIterator(getModelsIterator(), ACTIVE_MODEL_PREDICATE);
+	}
+	
 	public Iterator getModelsIterator() {
 		return models.values().iterator();
 	}
@@ -350,15 +364,11 @@
 
 		public void end(FacesContext context) throws IOException {
 			if (shifted) {
-				if (dataVisitor instanceof LastElementAware) {
-					try {
-						((LastElementAware) dataVisitor).setLastElement();
-						dataVisitor.process(context, this.rowKey, argument);
-					} finally {
-						((LastElementAware) dataVisitor).resetLastElement();
-					}
-				} else {
+				try {
+					((LastElementAware) dataVisitor).setLastElement();
 					dataVisitor.process(context, this.rowKey, argument);
+				} finally {
+					((LastElementAware) dataVisitor).resetLastElement();
 				}
 			}
 		}
@@ -384,11 +394,7 @@
 	 * @see org.ajax4jsf.model.ExtendedDataModel#getRowKey()
 	 */
 	public Object getRowKey() {
-		if (parent == null) {
-			return rowKey;
-		} else {
-			return this.parent.getRowKey();
-		}
+		return rowKey;
 	}
 
 	public void setRowKey(Object key) {
@@ -499,4 +505,21 @@
 			parent.componentSelected(component);
 		}
 	}
+	
+	protected boolean isActive() {
+		return true;
+	}
+
+	private final static Predicate ACTIVE_MODEL_PREDICATE = new Predicate() {
+
+		public boolean evaluate(Object object) {
+			StackingTreeModel model = (StackingTreeModel) object;
+			if (model == null) {
+				return false;
+			}
+
+			return model.isActive();
+		}
+		
+	};
 }

Modified: trunk/framework/test/src/test/java/org/richfaces/model/StackingTreeDataModelTest.java
===================================================================
--- trunk/framework/test/src/test/java/org/richfaces/model/StackingTreeDataModelTest.java	2007-08-04 02:19:57 UTC (rev 2061)
+++ trunk/framework/test/src/test/java/org/richfaces/model/StackingTreeDataModelTest.java	2007-08-04 20:14:28 UTC (rev 2062)
@@ -7,11 +7,14 @@
 import java.util.LinkedHashMap;
 import java.util.Map;
 
+import javax.faces.component.UIComponent;
+import javax.faces.component.UIOutput;
 import javax.faces.context.FacesContext;
 import javax.faces.el.ValueBinding;
 
 import org.ajax4jsf.model.DataVisitor;
 import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
+import org.richfaces.model.StackingTreeModel.Key;
 import org.richfaces.model.entity.Directory;
 import org.richfaces.model.entity.File;
 import org.richfaces.model.entity.Named;
@@ -31,32 +34,35 @@
 	}
 
 	private StackingTreeModel stackingTreeModel;
-	
+	private StackingTreeModel projectsModel;
+	private StackingTreeModel directoriesModel;
+	private StackingTreeModel filesModel;
+
 	/* (non-Javadoc)
 	 * @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#setUp()
 	 */
 	public void setUp() throws Exception {
 		super.setUp();
 		this.stackingTreeModel = new StackingTreeModel();
-		StackingTreeModel projectsModel = new StackingTreeModel("project", "project", new StackingTreeModelDataProvider() {
+		projectsModel = new StackingTreeModel("project", "project", new StackingTreeModelDataProvider() {
 
 			private Map data = null;
-			
+
 			public Object getData() {
 				if (data == null) {
 					data = new LinkedHashMap();
 					Project projectA = new Project("projectA", 10);
-					
+
 					Directory adir1 = new Directory("ADir1", 50);
-					
+
 					adir1.addFile(new File("AFile1", 60));
 					adir1.addFile(new File("AFile2", 61));
-					
+
 					Directory adir2 = new Directory("ADir2", 101);
 
 					projectA.addDirectory(adir1);
 					projectA.addDirectory(adir2);
-					
+
 					data.put(projectA.getName(), projectA);
 
 					Project projectB = new Project("projectB", 501);
@@ -68,28 +74,24 @@
 					projectB.addDirectory(bdir1);
 					projectB.addDirectory(bdir2);
 					projectB.addDirectory(bdir3);
-					
+
 					data.put(projectB.getName(), projectB);
 				}
 				return data;
 			}
-			
 		});
-		
 		final ValueBinding dirVB = application.createValueBinding("#{project.directories}");
-		StackingTreeModel directoriesModel = new StackingTreeModel("directory", "directory", new StackingTreeModelDataProvider() {
+		directoriesModel = new StackingTreeModel("directory", "directory", new StackingTreeModelDataProvider() {
 			public Object getData() {
 				return dirVB.getValue(facesContext);
 			}
 		});
-		
 		final ValueBinding fileVB = application.createValueBinding("#{directory.files}");
-		StackingTreeModel filesModel = new StackingTreeModel("file", "file", new StackingTreeModelDataProvider() {
+		filesModel = new StackingTreeModel("file", "file", new StackingTreeModelDataProvider() {
 			public Object getData() {
 				return fileVB.getValue(facesContext);
 			}
 		});
-
 		directoriesModel.addStackingModel(filesModel);
 		projectsModel.addStackingModel(directoriesModel);
 		this.stackingTreeModel.addStackingModel(projectsModel);
@@ -101,41 +103,218 @@
 	public void tearDown() throws Exception {
 		super.tearDown();
 		this.stackingTreeModel = null;
+		this.projectsModel = null;
+		this.directoriesModel = null;
+		this.filesModel = null;
 	}
-	
+
 	public void testWalk() throws Exception {
 		StackingTreeDataModelTestVisitor1 visitor1 = new StackingTreeDataModelTestVisitor1();
 		this.stackingTreeModel.walk(facesContext, visitor1, null, null);
 		assertEquals(9, visitor1.getCounter());
+		this.stackingTreeModel.setRowKey(null);
+		assertNull(this.stackingTreeModel.getRowData());
+		assertFalse(this.stackingTreeModel.isLeaf());
 	}
 
+	public void testComponentsListener() throws Exception {
+		UIOutput output = new UIOutput();
+		TreeComponentModelListenerImpl listener = new TreeComponentModelListenerImpl();
+		stackingTreeModel.addTreeComponentModelListener(listener);
+		assertNull(listener.getComponent());
+		filesModel.componentSelected(output);
+		assertSame(output, listener.getComponent());
+
+		listener.reset();
+		assertNull(listener.getComponent());
+		stackingTreeModel.removeTreeComponentModelListener(listener);
+		filesModel.componentSelected(output);
+		assertNull(listener.getComponent());
+	}
+
+	public void testKey() throws Exception {
+		Key key = new Key("aaa", new Integer(10));
+		Key key2 = new Key("aaa", new Integer(11));
+		Key key3 = new Key("aaa", new Integer(10));
+		Key key4 = new Key("bbb", new Integer(10));
+		
+		assertFalse(key.equals(new Key("aaa", new Integer(0)) {} ));
+		
+		assertTrue(key.equals(key3));
+		assertTrue(key3.equals(key));
+		assertTrue(key2.equals(key2));
+		assertTrue(key4.equals(key4));
+
+		assertTrue(key.hashCode() == key3.hashCode());
+		assertTrue(key3.hashCode() == key.hashCode());
+		assertTrue(key2.hashCode() == key2.hashCode());
+		assertTrue(key4.hashCode() == key4.hashCode());
+		
+		assertFalse(key.equals(key2));
+		assertFalse(key3.equals(key2));
+		assertFalse(key2.equals(key));
+		assertFalse(key2.equals(key3));
+
+		assertFalse(key.hashCode() == key2.hashCode());
+		assertFalse(key3.hashCode() == key2.hashCode());
+		assertFalse(key2.hashCode() == key.hashCode());
+		assertFalse(key2.hashCode() == key3.hashCode());
+		
+		assertFalse(key4.equals(key));
+		assertFalse(key4.equals(key2));
+		assertFalse(key4.equals(key3));
+
+		assertFalse(key4.hashCode() == key.hashCode());
+		assertFalse(key4.hashCode() == key2.hashCode());
+		assertFalse(key4.hashCode() == key3.hashCode());
+
+		assertFalse(key.equals(key4));
+		assertFalse(key2.equals(key4));
+		assertFalse(key3.equals(key4));
+		
+		assertFalse(new Key("aaa", new Integer(10)).equals(null));
+		assertFalse(new Key("aaa", null).equals(null));
+		assertFalse(new Key(null, new Integer(10)).equals(null));
+		assertFalse(new Key(null, null).equals(null));
+
+		assertFalse(key.hashCode() == key4.hashCode());
+		assertFalse(key2.hashCode() == key4.hashCode());
+		assertFalse(key3.hashCode() == key4.hashCode());
+
+		assertFalse(key.hashCode() == 0);
+		assertFalse(key2.hashCode() == 0);
+		assertFalse(key3.hashCode() == 0);
+		assertFalse(key4.hashCode() == 0);
+		
+		assertTrue(new Key(null, new Integer(11)).equals(new Key(null, new Integer(11))));
+		assertFalse(new Key(null, new Integer(10)).equals(new Key(null, new Integer(11))));
+		assertFalse(new Key(null, new Integer(10)).equals(new Key("aaa", new Integer(10))));
+
+		assertTrue(new Key(null, new Integer(11)).hashCode()  == new Key(null, new Integer(11)).hashCode());
+		assertFalse(new Key(null, new Integer(10)).hashCode() == new Key(null, new Integer(11)).hashCode());
+		assertFalse(new Key(null, new Integer(10)).hashCode() == new Key("aaa", new Integer(10)).hashCode());
+
+		assertTrue(new Key("aaa", null).equals(new Key("aaa", null)));
+		assertFalse(new Key("aaa", null).equals(new Key("bbb", null)));
+		assertFalse(new Key("aaa", null).equals(new Key("aaa", new Integer(10))));
+
+		assertTrue(new Key("aaa", null).hashCode() == new Key("aaa", null).hashCode());
+		assertFalse(new Key("aaa", null).hashCode() == new Key("bbb", null).hashCode());
+		assertFalse(new Key("aaa", null).hashCode() == new Key("aaa", new Integer(10)).hashCode());
+	}
+	
+	class TreeComponentModelListenerImpl implements TreeComponentModelListener {
+
+		private UIComponent component;
+
+		public void componentSelected(UIComponent component) {
+			this.component = component;
+		}
+
+		public UIComponent getComponent() {
+			return component;
+		}
+
+		public void reset() {
+			this.component = null;
+		}
+	};
+
 	class StackingTreeDataModelTestVisitor1 implements DataVisitor, LastElementAware {
 
 		private boolean last;
 		private int tag = 0;
 		private int counter = 0;
-		
+
 		public void process(FacesContext context, Object rowKey, Object argument)
-				throws IOException {
+		throws IOException {
 
+			StackingTreeDataModelTestVisitor2 visitor2 = new StackingTreeDataModelTestVisitor2();
+			
+			stackingTreeModel.walk(context, visitor2, null, new ListRowKey(new StackingTreeModel.Key("project", "projectA")),
+					argument, false);
+
+			assertEquals(5, visitor2.getCounter());
+
+			StackingTreeDataModelTestVisitor2 visitor20 = new StackingTreeDataModelTestVisitor2();
+			
+			stackingTreeModel.walk(context, visitor20, new TreeRange() {
+
+				public boolean processChildren(TreeRowKey rowKey) {
+					return false;
+				}
+
+				public boolean processNode(TreeRowKey rowKey) {
+					return false;
+				}
+				
+			}, new ListRowKey(new StackingTreeModel.Key("project", "projectA")),
+					argument, false);
+
+			assertEquals(0, visitor20.getCounter());
+
+			StackingTreeDataModelTestVisitor2 visitor21 = new StackingTreeDataModelTestVisitor2();
+			
+			stackingTreeModel.walk(context, visitor21, new TreeRange() {
+
+				public boolean processChildren(TreeRowKey rowKey) {
+					return false;
+				}
+
+				public boolean processNode(TreeRowKey rowKey) {
+					return true;
+				}
+				
+			}, new ListRowKey(new StackingTreeModel.Key("project", "projectA")),
+					argument, false);
+
+			assertEquals(1, visitor21.getCounter());
+
+			StackingTreeDataModelTestVisitor2 visitor22 = new StackingTreeDataModelTestVisitor2();
+			
+			stackingTreeModel.walk(context, visitor22, null, new ListRowKey(new StackingTreeModel.Key("project", "projectB")),
+					argument, false);
+
+			assertEquals(4, visitor22.getCounter());
+			
+			StackingTreeDataModelTestVisitor2 visitor23 = new StackingTreeDataModelTestVisitor2();
+			
+			stackingTreeModel.walk(context, visitor23, new TreeRange() {
+
+				private boolean rootProcessed = false;
+				
+				public boolean processChildren(TreeRowKey rowKey) {
+					boolean result = rootProcessed;
+					rootProcessed = true;
+					return !result;
+				}
+
+				public boolean processNode(TreeRowKey rowKey) {
+					return true;
+				}
+				
+			}, new ListRowKey(new StackingTreeModel.Key("project", "projectB")),
+					argument, false);
+
+			assertEquals(4, visitor23.getCounter());
+
 			stackingTreeModel.setRowKey(rowKey);
+
+			assertSame(rowKey, stackingTreeModel.getRowKey());
+
 			assertNull(stackingTreeModel.getTreeNode());
 			Object rowData = stackingTreeModel.getRowData();
 			assertNotNull(rowData);
 			assertTrue(rowData instanceof Named);
-			
+
 			Named named = (Named) rowData;
-			
-			if (tag == 0) {
-				tag = named.getTag();
-			} else {
-				int currentTag = named.getTag();
-				assertTrue(currentTag > tag);
-				this.tag = currentTag;
-			}
-			
+
+			int currentTag = named.getTag();
+			assertTrue(currentTag > tag);
+			this.tag = currentTag;
+
 			assertFalse(this.tag % 10 == 1 ^ last);
-		
+
 			if (named instanceof Directory) {
 				if ("ADir1".equals(named.getName())) {
 					assertFalse(stackingTreeModel.isLeaf());
@@ -147,7 +326,7 @@
 			} else if (named instanceof File) {
 				assertTrue(stackingTreeModel.isLeaf());
 			}
-			
+
 			counter++;
 		}
 
@@ -158,10 +337,33 @@
 		public void setLastElement() {
 			this.last = true;
 		}
-		
+
 		public int getCounter() {
 			return counter;
 		}
 	}
+
+	class StackingTreeDataModelTestVisitor2 implements DataVisitor {
+		private int counter = 0;
+		private int tag = 0;
+
+		public void process(FacesContext context, Object rowKey, Object argument)
+		throws IOException {
+
+			stackingTreeModel.setRowKey(rowKey);
+			Object rowData = stackingTreeModel.getRowData();
+			assertNotNull(rowData);
+			Named named = (Named) rowData;
+
+			int currentTag = named.getTag();
+			assertTrue(currentTag > tag);
+			tag = currentTag;
+			counter++;
+		}
+
+		public int getCounter() {
+			return counter;
+		}
+	}
 }
 

Added: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java	                        (rev 0)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveEntry.java	2007-08-04 20:14:28 UTC (rev 2062)
@@ -0,0 +1,25 @@
+/**
+ * 
+ */
+package org.richfaces.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski at exadel.com
+ *         created 04.08.2007
+ *
+ */
+public class ArchiveEntry extends Entry {
+	private List archiveEntries = new ArrayList();
+	
+	public void addArchiveEntry(ArchiveEntry entry) {
+		this.archiveEntries.add(entry);
+	}
+	
+	public List getArchiveEntries() {
+		return archiveEntries;
+	}
+}

Added: trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java
===================================================================
--- trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java	                        (rev 0)
+++ trunk/samples/treeModelDemo/src/main/java/org/richfaces/model/ArchiveFile.java	2007-08-04 20:14:28 UTC (rev 2062)
@@ -0,0 +1,25 @@
+/**
+ * 
+ */
+package org.richfaces.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Nick Belaevski
+ *         mailto:nbelaevski at exadel.com
+ *         created 04.08.2007
+ *
+ */
+public class ArchiveFile extends File {
+	private List archiveEntries = new ArrayList();
+	
+	public void addArchiveEntry(ArchiveEntry entry) {
+		this.archiveEntries.add(entry);
+	}
+	
+	public List getArchiveEntries() {
+		return archiveEntries;
+	}
+}

Modified: trunk/samples/treeModelDemo/src/main/resources/org/richfaces/model/tree-model-data.xml
===================================================================
--- trunk/samples/treeModelDemo/src/main/resources/org/richfaces/model/tree-model-data.xml	2007-08-04 02:19:57 UTC (rev 2061)
+++ trunk/samples/treeModelDemo/src/main/resources/org/richfaces/model/tree-model-data.xml	2007-08-04 20:14:28 UTC (rev 2062)
@@ -77,7 +77,18 @@
 				<file name="TEST-ComponentTest.xml" />
 			</directory>
 			<file name="richfaces-3.1.0-snapshot" />
-			<file name="richfaces-3.1.0-sources" />
+			<archive name="richfaces-3.1.0-sources">
+				<archiveEntry name="org">
+					<archiveEntry name="richfaces">
+						<archiveEntry name="component">
+							<archiveEntry name="UITree" />
+							<archiveEntry name="UITreeNode" />
+							<archiveEntry name="UICalendar" />
+							<archiveEntry name="UIRangedNumberInput" />
+						</archiveEntry>
+					</archiveEntry>
+				</archiveEntry>
+			</archive>
 			<file name="richfaces-3.1.0-javadoc" />
 		</directory>
 	</project>

Modified: trunk/samples/treeModelDemo/src/main/resources/org/richfaces/service/tree-model-rules.xml
===================================================================
--- trunk/samples/treeModelDemo/src/main/resources/org/richfaces/service/tree-model-rules.xml	2007-08-04 02:19:57 UTC (rev 2061)
+++ trunk/samples/treeModelDemo/src/main/resources/org/richfaces/service/tree-model-rules.xml	2007-08-04 20:14:28 UTC (rev 2062)
@@ -36,6 +36,22 @@
 		</set-properties-rule>
 	</pattern>
 
+	<pattern value="*/archive">
+		<object-create-rule classname="org.richfaces.model.ArchiveFile" />
+		<set-next-rule methodname="addFile" />
+		<set-properties-rule>
+			<alias attr-name="name" prop-name="name" />
+		</set-properties-rule>
+	</pattern>
+
+	<pattern value="*/archiveEntry">
+		<object-create-rule classname="org.richfaces.model.ArchiveEntry" />
+		<set-next-rule methodname="addArchiveEntry" />
+		<set-properties-rule>
+			<alias attr-name="name" prop-name="name" />
+		</set-properties-rule>
+	</pattern>
+
 	<pattern value="*/package">
 		<object-create-rule classname="org.richfaces.model.Package" />
 		<set-next-rule methodname="addPackage" />

Modified: trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp
===================================================================
--- trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp	2007-08-04 02:19:57 UTC (rev 2061)
+++ trunk/samples/treeModelDemo/src/main/webapp/pages/index.jsp	2007-08-04 20:14:28 UTC (rev 2062)
@@ -64,6 +64,16 @@
 									<h:commandLink action="#{file.click}" value="File1: #{file.name}" />
 								</tree:treeNode>
 							</model:treeNodes>
+
+							<model:recursiveTreeNodes id="archiveEntry" var="archiveEntry"
+								root="#{dir.files}" nodes="#{archiveEntry.archiveEntries}">
+							
+								<tree:treeNode id="archiveEntryNode" rendered="#{archiveEntry.class.simpleName == 'ArchiveFile' or archiveEntry.class.simpleName == 'ArchiveEntry'}">
+									<h:commandLink action="#{archiveEntry.click}" value="Archive entry: #{archiveEntry.name}" />
+								</tree:treeNode>
+
+							</model:recursiveTreeNodes>
+
 						</model:recursiveTreeNodes>
 	
 						<%--model:treeNodes var="file" nodes="#{proj.dir.files}">

Modified: trunk/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java
===================================================================
--- trunk/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java	2007-08-04 02:19:57 UTC (rev 2061)
+++ trunk/ui/treeModel/src/main/java/org/richfaces/component/UIRecursiveTreeNodes.java	2007-08-04 20:14:28 UTC (rev 2062)
@@ -7,6 +7,7 @@
 import java.util.Iterator;
 
 import javax.faces.context.FacesContext;
+import javax.faces.el.PropertyNotFoundException;
 
 import org.apache.commons.collections.iterators.IteratorChain;
 import org.richfaces.model.StackingTreeModel;
@@ -27,8 +28,12 @@
 	public abstract void setRoot(Object root);
 
 	public Object getData() {
-		return getRoot();
-	}
+		try {
+			return getRoot();
+		} catch (PropertyNotFoundException e) {
+			return new Object[0];
+		}
+ 	}
 	
 	public abstract String getVar();
 	public abstract void setVar(String var);
@@ -39,7 +44,11 @@
 		StackingTreeModel recursiveModel = new StackingTreeModel(getId(), getVar(), new StackingTreeModelDataProvider() {
 
 			public Object getData() {
-				return UIRecursiveTreeNodes.this.getNodes();
+				try {
+					return UIRecursiveTreeNodes.this.getNodes();
+				} catch (PropertyNotFoundException e) {
+					return new Object[0];
+				}
 			}
 			
 		}) {
@@ -65,6 +74,10 @@
 
 				return chain;
 			}
+
+			protected boolean isActive() {
+				return UIRecursiveTreeNodes.this.isRendered();
+			}
 		};
 		stackingModel.addStackingModel(recursiveModel);
 		

Modified: trunk/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java
===================================================================
--- trunk/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java	2007-08-04 02:19:57 UTC (rev 2061)
+++ trunk/ui/treeModel/src/main/java/org/richfaces/component/UITreeNodes.java	2007-08-04 20:14:28 UTC (rev 2062)
@@ -36,6 +36,10 @@
 				super.setupModel(object, facesContext);
 				componentSelected(UITreeNodes.this);
 			}
+		
+			protected boolean isActive() {
+				return UITreeNodes.this.isRendered();
+			}
 		};
 		
 		return treeModel;




More information about the richfaces-svn-commits mailing list