package com.traxel.lumbermill.filter;
import com.traxel.lumbermill.event.Event;
import com.traxel.lumbermill.event.Severity;
import org.apache.log4j.Logger;
import org.jdom.Element;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.tree.DefaultTreeModel;
public class Tree extends DefaultTreeModel
implements Filter, FilterListener {
private static final transient Logger LOG = Logger.getLogger(Tree.class);
private final Map map;
private final TimerNotifier timerNotifier;
private boolean active;
super(new Node(Collections.EMPTY_LIST));
timerNotifier = new TimerNotifier(this);
map = new HashMap();
active = true;
}
public Tree(
final Element treeFilter) {
this();
final Element rootElement = treeFilter.getChild("filternode");
final Node n = (Node)getRoot();
n.setSeverity(Severity.getSeverityByString(rootElement.getAttributeValue("severity")));
final List children = rootElement.getChildren("filternode");
for (final Object c : children) {
final Element childElement = (Element)c;
final Node childNode = new Node(childElement, map);
childNode.addFilterListener(this);
map.put(childNode.getSourceComponents(), childNode);
((Node)getRoot()).add(childNode);
}
}
@Override
return active;
}
@Override
public void setActive(
final boolean active) {
this.active = active;
}
@Override
public boolean isVisible(
final Event event) {
final Node node = getNode(event);
return node.isVisible(event);
}
@Override
timerNotifier.addFilterListener(listener);
}
@Override
timerNotifier.addFilterListener(listener);
}
@Override
return "Node Tree";
}
@Override
if (LOG.isDebugEnabled()) {
LOG.debug("filterChange event: " + e + " :: source: " + e.getSource());
}
if (e.getSource() instanceof Node) {
timerNotifier.fireFilterChange();
}
}
public synchronized Node
getNode(
final Event event) {
return getNode(event.getSourceComponents());
}
private synchronized Node
getNode(
final List components) {
if (components.size() == 0) {
return (Node)getRoot();
}
final Node node;
final Node parent;
if (map.get(components) != null) {
node = (Node)map.get(components);
return node;
} else {
node = new Node(components);
node.addFilterListener(this);
map.put(components, node);
}
if (components.size() > 1) {
final List parentComponents = components.subList(0, components.size() - 1);
parent = getNode(parentComponents);
} else {
parent = (Node)getRoot();
}
insertNodeInto(node, parent);
return node;
}
private synchronized void insertNodeInto(
final Node child,
final Node parent) {
boolean added = false;
final List children = Collections.list(parent.children());
for (int i = 0; i < children.size(); i++) {
final Node other = (Node)children.get(i);
if (child.compareTo(other) < 0) {
insertNodeInto(child, parent, i);
added = true;
break;
}
}
if (!added) {
parent.add(child);
final int[] newIndexs = new int[1];
newIndexs[0] = parent.getIndex(child);
nodesWereInserted(parent, newIndexs);
}
}
final Element tree = new Element("treefilter");
final Node rootNode = (Node)getRoot();
tree.addContent(rootNode.getXMLElement());
return tree;
}
}