Hallo,
 
I had the same problem, and the attached mail (from this mailing-list) contains a treemodel and extended treenode, which fixed the problem for me...
They were also developing a new kind of treemodel @ apache. But I'm no longer really following this list, so I don't know the status of that one.
 
Enjoy,
 
Steven


From: Manoharan, Sunil [mailto:[EMAIL PROTECTED]
Sent: maandag 3 april 2006 21:41
To: [EMAIL PROTECTED]
Subject: Tree2: IllegalStateException -> Node is expanded but also considered a leaf

Hi,

 

I want to move a Node in Tree under One parent to a different Node. But I am

getting the error, java.lang.IllegalStateException: Encountered a node [0:0:].

+ with an illogical state. Node is expanded but its also considered a leaf.

 

This happens only if I perform the action with Parent Node EXPANDED.

If I do the MOVE action with Parent folder collapsed, it works perfectly fine.

 

I guess the expanded or collapsed state information is not rightly being handled.

I have seen in this forum that many people facing the same problem.

http://article.gmane.org/gmane.comp.jakarta.myfaces.user/9797/

 

Has anyone found a fix for this ? Any light in this matter is greatly appreciated.

 

Thanks,

Sunil

--- Begin Message ---
Title: Re: Tree2 reset

Hi.

>> What is the correct way to reset a servet side Tree2 component? I am
>> running into the dreaded
>> "Encountered a node [0] + with an illogical state". It is
>> understandable becase I have reset the
>> bean containing the tree but what keys (somewhere in app scope?)
>> should I clear so that the
>> application thinks it has never seen the tree before?
>
>
> I have exactly the same problem! the app remember the old tree so if i
> remove some node that was expanded i get that error! i searched
> throughout the internet and i found many people with this problem but
> never a solution. I thought that if i could collapse the tree (before i
> delete the nodes) i would not get the error but I am not able to
> collapse the tree working in clientSideToggle mode. So i solved using
> serverSide Toggle mode (clientSideToggle="false") and collapsing the
> node I want to delete before deleting it.
> Anyway it would be very useful to know a way to reset all the
> information about any previous version of the tree.

TreeModel from the Tree2 is quite weird. Try the attached tree model
(compatible with the Tree2 tree model).

Bye.
/lexi

package de.disy.preludio2.faces.treemodel;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.apache.myfaces.custom.tree2.TreeNode;

public class ExtendedTreeNode implements TreeNode {

  private static final long serialVersionUID = 1L;
  private final ExtendedTreeNode parent;
  private final List children = new ArrayList();
  private String type;
  private String description;
  private String identifier;
  private boolean expanded;

  public ExtendedTreeNode(ExtendedTreeNode parent, String type, String 
description) {
    this.parent = parent;
    this.type = type;
    this.description = description;
  }

  public ExtendedTreeNode getParent() {
    return parent;
  }

  public String getType() {
    return type;
  }

  public void setType(String type) {
    this.type = type;
  }

  public String getIdentifier() {
    return identifier;
  }

  public void setIdentifier(String identifier) {
    this.identifier = identifier;
  }

  public String getDescription() {
    return description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public boolean isLeaf() {
    return children.size() == 0;
  }

  public void setLeaf(boolean leaf) {
  }

  public int getChildCount() {
    return children.size();
  }

  public List getChildren() {
    return children;
  }

  public int getIndex() {
    if (getParent() == null) {
      return 0;

    }
    else {
      return getParent().getIndex(this);
    }
  }

  public int getIndex(ExtendedTreeNode node) {
    return children.indexOf(node);
  }

  public boolean isExpanded() {
    return !isLeaf() && expanded;
  }

  public void expand() {
    if (isLeaf())
      expanded = false;
    else
      expanded = true;
  }

  public void collapse() {
    expanded = false;
  }

  public void toggle() {
    if (isLeaf() || isExpanded())
      collapse();
    else
      expand();
  }

  public void clear() {
    clearChildren();
  }

  public void clearChildren() {
    for (Iterator iterator = children.iterator(); iterator.hasNext();) {
      final ExtendedTreeNode node = (ExtendedTreeNode) iterator.next();
      node.clear();
    }
    children.clear();
  }
}
package de.disy.preludio2.faces.treemodel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.myfaces.custom.tree2.TreeModel;
import org.apache.myfaces.custom.tree2.TreeNode;
import org.apache.myfaces.custom.tree2.TreeState;

public class ExtendedTreeModel implements TreeModel {

  private static final long serialVersionUID = 1L;

  private final Map nodeMap = new HashMap();
  private final ExtendedTreeNode root;
  private ExtendedTreeNode currentNode;

  private final TreeState treeState = new HijackTreeState();

  public ExtendedTreeModel(ExtendedTreeNode root) {
    this.root = root;
    refresh();
  }

  public void refresh() {
    nodeMap.clear();
    processNode("0", null, root);
    if (!nodeMap.values().contains(currentNode)) {
      currentNode = root;
    }
  }

  private void processNode(String id, ExtendedTreeNode parentNode, 
ExtendedTreeNode treeNode) {
    treeNode.setIdentifier(id);
    nodeMap.put(id, treeNode);
    int index = 0;
    for (Iterator iterator = treeNode.getChildren().iterator(); 
iterator.hasNext();) {
      final String childId = id + SEPARATOR + index++;
      final ExtendedTreeNode childTreeNode = (ExtendedTreeNode) iterator.next();
      processNode(childId, treeNode, childTreeNode);
    }
  }

  public TreeState getTreeState() {
    return treeState;
  }

  public void setTreeState(TreeState treeState) {
  }

  public TreeNode getNode() {
    return currentNode;
  }

  public ExtendedTreeNode getHijackTreeNode() {
    return currentNode;
  }

  public void setNodeId(String nodeId) {
    if (nodeId == null) {
      currentNode = null;
    }
    else {
      currentNode = getNodeById(nodeId);
    }
  }

  public String[] getPathInformation(String nodeId) {
    if (nodeId == null) {
      throw new IllegalArgumentException("Cannot determine parents for a null 
node.");
    }

    final ArrayList pathList = new ArrayList();

    for (ExtendedTreeNode node = getNodeById(nodeId); node != null; node = 
node.getParent()) {
      pathList.add(0, node.getIdentifier());
    }

    return (String[]) pathList.toArray(new String[pathList.size()]);
  }

  public boolean isLastChild(String nodeId) {
    final ExtendedTreeNode treeNode = getNodeById(nodeId);
    final ExtendedTreeNode parentNode = treeNode.getParent();
    if (parentNode == null) {
      return true;
    }
    else {
      final List children = parentNode.getChildren();
      final int childCount = children.size();
      return children.get(childCount - 1) == treeNode;
    }
  }

  public ExtendedTreeNode getNodeById(String nodeId) {
    return (ExtendedTreeNode) nodeMap.get(nodeId);
  }

  private class HijackTreeState implements TreeState {

    boolean _transient = false;

    public boolean isNodeExpanded(String nodeId) {
      final ExtendedTreeNode node = getNodeById(nodeId);
      if (node == null) {
        return false;
      }
      else {
        return node.isExpanded();
      }
    }

    public void toggleExpanded(String nodeId) {
      final ExtendedTreeNode node = getNodeById(nodeId);
      if (node == null) {
        // do nothing
      }
      else {
        node.toggle();
      }
    }

    public boolean isTransient() {
      return _transient;
    }

    public void setTransient(boolean trans) {
      _transient = trans;
    }

    public void expandPath(String[] nodePath) {
      for (int i = 0; i < nodePath.length; i++) {
        final String nodeId = nodePath[i];
        final ExtendedTreeNode node = getNodeById(nodeId);
        if (node != null) {
          node.expand();
        }
      }
    }

    public void collapsePath(String[] nodePath) {
      for (int i = 0; i < nodePath.length; i++) {
        final String nodeId = nodePath[i];
        final ExtendedTreeNode node = getNodeById(nodeId);
        if (node != null) {
          node.collapse();
        }
      }
    }
  }
}

--- End Message ---

Reply via email to