001 package org.sonar.squid.api;
002
003 import java.util.Observable;
004 import java.util.Set;
005 import java.util.SortedSet;
006 import java.util.TreeSet;
007
008 public abstract class TreeNode<E extends TreeNode> extends Observable {
009
010 private TreeNode parent;
011 private SortedSet<E> children = new TreeSet<E>();
012
013 public E addChild(E resource) {
014 resource.setParent(this);
015 if (!children.contains(resource)) {
016 children.add(resource);
017 setChanged();
018 notifyObservers(resource);
019 }
020 return (E) this;
021 }
022
023 public E getParent(Class<? extends TreeNode> squidUnit) {
024 if (parent == null) {
025 return null;
026 } else if (parent.getClass().equals(squidUnit)) {
027 return (E) parent;
028 } else {
029 return (E) parent.getParent(squidUnit);
030 }
031 }
032
033 public E getFirstChild() {
034 return !children.isEmpty() ? children.first() : null;
035 }
036
037 public E getLastChild() {
038 return !children.isEmpty() ? children.last() : null;
039 }
040
041 private void setParent(TreeNode parent) {
042 this.parent = parent;
043 }
044
045 public E getParent() {
046 return (E) parent;
047 }
048
049 public Set<E> getChildren() {
050 return children;
051 }
052
053 public boolean hasChild(TreeNode squidUnit) {
054 if (children.contains(squidUnit)) {
055 return true;
056 }
057 for (TreeNode child : children) {
058 if (child.hasChild(squidUnit)) {
059 return true;
060 }
061 }
062 return false;
063 }
064
065 public boolean hasAmongParents(TreeNode expectedParent) {
066 if (parent == null) {
067 return false;
068 } else if (parent.equals(expectedParent)) {
069 return true;
070 } else {
071 return parent.hasAmongParents(expectedParent);
072 }
073 }
074
075 }