001    package org.kuali.maven.plugins.graph.tree;
002    
003    import java.lang.reflect.Array;
004    import java.util.ArrayList;
005    import java.util.Enumeration;
006    import java.util.List;
007    
008    import javax.swing.tree.DefaultMutableTreeNode;
009    import javax.swing.tree.MutableTreeNode;
010    import javax.swing.tree.TreeNode;
011    
012    public class Node<T> extends DefaultMutableTreeNode {
013    
014        private static final long serialVersionUID = -4552044477560333925L;
015    
016        public Node() {
017            this(null);
018        }
019    
020        public Node(T userObject) {
021            this(userObject, true);
022        }
023    
024        public Node(T userObject, boolean allowsChildren) {
025            super(userObject, allowsChildren);
026        }
027    
028        @Override
029        public Node<T>[] getPath() {
030            TreeNode[] treeNodes = super.getPath();
031            @SuppressWarnings("unchecked")
032            Node<T>[] typedNodes = (Node<T>[]) Array.newInstance(this.getClass(), treeNodes.length);
033            for (int i = 0; i < typedNodes.length; i++) {
034                @SuppressWarnings("unchecked")
035                Node<T> pathNode = (Node<T>) treeNodes[i];
036                typedNodes[i] = pathNode;
037            }
038            return typedNodes;
039        }
040    
041        @SuppressWarnings("unchecked")
042        @Override
043        public Node<T> getRoot() {
044            return (Node<T>) super.getRoot();
045        }
046    
047        @SuppressWarnings("unchecked")
048        @Override
049        public Enumeration<Node<T>> children() {
050            return super.children();
051        }
052    
053        @SuppressWarnings("unchecked")
054        public List<Node<T>> getBreadthFirstList() {
055            return getList(breadthFirstEnumeration());
056        }
057    
058        @SuppressWarnings("unchecked")
059        public List<Node<T>> getDepthFirstList() {
060            return getList(depthFirstEnumeration());
061        }
062    
063        protected <E> List<E> getList(Enumeration<E> e) {
064            List<E> list = new ArrayList<E>();
065            while (e.hasMoreElements()) {
066                list.add(e.nextElement());
067            }
068            return list;
069        }
070    
071        public List<Node<T>> getChildren() {
072            return getList(children());
073        }
074    
075        @SuppressWarnings("unchecked")
076        public T getObject() {
077            return (T) super.getUserObject();
078        }
079    
080        public void setObject(T object) {
081            super.setUserObject(object);
082        }
083    
084        /**
085         * @deprecated Use getObject() instead
086         */
087        @SuppressWarnings("unchecked")
088        @Override
089        @Deprecated
090        public T getUserObject() {
091            return (T) super.getUserObject();
092        }
093    
094        /**
095         * @deprecated Use setObject(T) instead
096         */
097        @SuppressWarnings("unchecked")
098        @Override
099        @Deprecated
100        public void setUserObject(Object userObject) {
101            T object = (T) userObject;
102            super.setUserObject(object);
103        }
104    
105        public void add(Node<T> newChild) {
106            super.add(newChild);
107        }
108    
109        /**
110         * @deprecated Use add(TypedNode<T> newChild) instead
111         */
112        @SuppressWarnings("unchecked")
113        @Override
114        @Deprecated
115        public void add(MutableTreeNode newChild) {
116            Node<T> typedChild = (Node<T>) newChild;
117            add(typedChild);
118        }
119    
120        @SuppressWarnings("unchecked")
121        @Override
122        public Node<T> getParent() {
123            return (Node<T>) super.getParent();
124        }
125    
126    }