Friday 29 July 2011

Enter every DOM node into a Swing JTree tree. The forward and backward mappings between Nodes to TreeNodes are kept.

  
/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 
 *      http://www.apache.org/licenses/LICENSE-2.0
 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import java.io.Serializable;
import java.util.Hashtable;

import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;

import org.w3c.dom.Attr;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Notation;

/**
 * DOMTree class to enter every DOM node into a Swing JTree tree. The forward
 * and backward mappings between Nodes to TreeNodes are kept.
 
 @version $Id: DOMTreeFull.java 447689 2006-09-19 02:40:36Z mrglavas $
 */
public class DOMTreeFull extends JTree {

  private static final long serialVersionUID = 3978144335541975344L;

  //
  // Constructors
  //

  /** Default constructor. */
  public DOMTreeFull() {
    this(null);
  }

  /** Constructs a tree with the specified document. */
  public DOMTreeFull(Node root) {
    super(new Model());

    // set tree properties
    setRootVisible(false);

    // set properties
    setRootNode(root);

  // <init>()

  //
  // Public methods
  //

  /** Sets the root. */
  public void setRootNode(Node root) {
    ((ModelgetModel()).setRootNode(root);
    expandRow(0);
  }

  /** Returns the root. */
  public Node getRootNode() {
    return ((ModelgetModel()).getRootNode();
  }

  /** get the org.w3c.Node for a MutableTreeNode. */
  public Node getNode(Object treeNode) {
    return ((ModelgetModel()).getNode(treeNode);
  }

  /** get the TreeNode for the org.w3c.Node */
  public TreeNode getTreeNode(Object node) {
    return ((ModelgetModel()).getTreeNode(node);
  }

  //
  // Classes
  //

  /**
   * DOM tree model.
   
   */
  public static class Model extends DefaultTreeModel implements Serializable {

    private static final long serialVersionUID = 3258131375181018673L;

    //
    // Data
    //

    /** Root. */
    private Node root;

    /** Node Map. */
    private Hashtable nodeMap = new Hashtable();

    /** Tree Node Map. */
    private Hashtable treeNodeMap = new Hashtable();

    //
    // Constructors
    //

    /** Default constructor. */
    public Model() {
      this(null);
    }

    /** Constructs a model from the specified root. */
    public Model(Node node) {
      super(new DefaultMutableTreeNode());
      if (node != null)
        setRootNode(node);
    }

    //
    // Public methods
    //

    /** Sets the root. */
    public synchronized void setRootNode(Node root) {

      // save root
      this.root = root;

      // clear tree and re-populate
      DefaultMutableTreeNode where (DefaultMutableTreeNodegetRoot();
      where.removeAllChildren();
      nodeMap.clear();
      treeNodeMap.clear();

      buildTree(root, where);

      fireTreeStructureChanged(this, new Object[] { getRoot() }new int[0]new Object[0]);

    // setRootNode(Node)

    /** Returns the root. */
    public Node getRootNode() {
      return root;
    }

    /** get the org.w3c.Node for a MutableTreeNode. */
    public Node getNode(Object treeNode) {
      return (NodenodeMap.get(treeNode);
    }

    public Hashtable getAllNodes() {
      return nodeMap;
    }

    /** get the org.w3c.Node for a MutableTreeNode. */
    public TreeNode getTreeNode(Object node) {
      Object object = treeNodeMap.get(node);
      return (TreeNodeobject;
    }

    //
    // Private methods
    //

    /** Builds the tree. */
    private void buildTree(Node node, MutableTreeNode where) {

      // is there anything to do?
      if (node == null) {
        return;
      }

      MutableTreeNode treeNode = insertNode(node, where);

      // iterate over children of this node
      NodeList nodes = node.getChildNodes();
      int len = (nodes != null? nodes.getLength() 0;
      for (int i = 0; i < len; i++) {
        Node child = nodes.item(i);
        buildTree(child, treeNode);

      }

    // buildTree()

    /** Inserts a node and returns a reference to the new node. */
    private MutableTreeNode insertNode(String what, MutableTreeNode where) {

      MutableTreeNode node = new DefaultMutableTreeNode(what);
      insertNodeInto(node, where, where.getChildCount());
      return node;

    // insertNode(Node,MutableTreeNode):MutableTreeNode

    /** Inserts a text node. */
    public MutableTreeNode insertNode(Node what, MutableTreeNode where) {
      MutableTreeNode treeNode = insertNode(DOMTreeFull.toString(what)where);
      nodeMap.put(treeNode, what);
      treeNodeMap.put(what, treeNode);
      return treeNode;
    }
  // class Model

  public static String whatArray[] new String[] { "ALL""ELEMENT""ATTRIBUTE""TEXT",
      "CDATA_SECTION""ENTITY_REFERENCE""ENTITY""PROCESSING_INSTRUCTION""COMMENT",
      "DOCUMENT""DOCUMENT_TYPE""DOCUMENT_FRAGMENT""NOTATION" };

  //
  // Public methods
  //

  public static String toString(Node node) {
    StringBuffer sb = new StringBuffer();

    // is there anything to do?
    if (node == null) {
      return "";
    }

    int type = node.getNodeType();
    sb.append(whatArray[type]);
    sb.append(" : ");
    sb.append(node.getNodeName());
    String value = node.getNodeValue();
    if (value != null) {
      sb.append(" Value: \"");
      sb.append(value);
      sb.append("\"");
    }

    switch (type) {

    // document
    case Node.DOCUMENT_NODE: {
      break;
    }

    // element with attributes
    case Node.ELEMENT_NODE: {
      Attr attrs[] = sortAttributes(node.getAttributes());
      if (attrs.length > 0)
        sb.append(" ATTRS:");
      for (int i = 0; i < attrs.length; i++) {
        Attr attr = attrs[i];

        sb.append(' ');
        sb.append(attr.getNodeName());
        sb.append("=\"");
        sb.append(normalize(attr.getNodeValue()));
        sb.append('"');
      }
      sb.append('>');
      break;
    }

    // handle entity reference nodes
    case Node.ENTITY_REFERENCE_NODE: {
      break;
    }

    // cdata sections
    case Node.CDATA_SECTION_NODE: {
      break;
    }

    // text
    case Node.TEXT_NODE: {
      break;
    }

    // processing instruction
    case Node.PROCESSING_INSTRUCTION_NODE: {
      break;
    }

    // comment node
    case Node.COMMENT_NODE: {
      break;
    }
    // DOCTYPE node
    case Node.DOCUMENT_TYPE_NODE: {
      break;
    }
    // Notation node
    case Node.NOTATION_NODE: {
      sb.append("public:");
      String id = ((Notationnode).getPublicId();
      if (id == null) {
        sb.append("PUBLIC ");
        sb.append(id);
        sb.append(" ");
      }
      id = ((Notationnode).getSystemId();
      if (id == null) {
        sb.append("system: ");
        sb.append(id);
        sb.append(" ");
      }
      break;
    }
    }
    return sb.toString();
  }

  /** Normalizes the given string. */
  static protected String normalize(String s) {
    StringBuffer str = new StringBuffer();

    int len = (s != null? s.length() 0;
    for (int i = 0; i < len; i++) {
      char ch = s.charAt(i);
      switch (ch) {
      case '<'{
        str.append("&lt;");
        break;
      }
      case '>'{
        str.append("&gt;");
        break;
      }
      case '&'{
        str.append("&amp;");
        break;
      }
      case '"'{
        str.append("&quot;");
        break;
      }
      case '\r':
      case '\n':
      default{
        str.append(ch);
      }
      }
    }

    return str.toString();

  // normalize(String):String

  /** Returns a sorted list of attributes. */
  static protected Attr[] sortAttributes(NamedNodeMap attrs) {

    int len = (attrs != null? attrs.getLength() 0;
    Attr array[] new Attr[len];
    for (int i = 0; i < len; i++) {
      array[i(Attrattrs.item(i);
    }
    for (int i = 0; i < len - 1; i++) {
      String name = array[i].getNodeName();
      int index = i;
      for (int j = i + 1; j < len; j++) {
        String curName = array[j].getNodeName();
        if (curName.compareTo(name0) {
          name = curName;
          index = j;
        }
      }
      if (index != i) {
        Attr temp = array[i];
        array[i= array[index];
        array[index= temp;
      }
    }

    return array;

  // sortAttributes(NamedNodeMap):Attr[]

// class DOMTreeFull

   
    
  

No comments:

Post a Comment