package com.traxel.lumbermill.filter;
import com.traxel.lumbermill.event.Event;
import com.traxel.lumbermill.event.Severity;
import org.jdom.Element;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.MutableTreeNode;
import de.cismet.beanmill.BeanMillPane;
public class Node extends DefaultMutableTreeNode
implements Comparable, FilterListener, Filter {
static final Comparator LIST_COMPARATOR = new Comparator() {
@Override
public int compare(
final Object a,
final Object b) {
if (a == b) {
return 0;
}
if (a == null) {
return -1;
}
if (b == null) {
return 1;
}
final List listA;
final List listB;
int minSize;
int comparison;
String aVal;
String bVal;
listA = (List)a;
listB = (List)b;
minSize = listA.size();
if (listB.size() < minSize) {
minSize = listB.size();
}
for (int i = 0; i < minSize; i++) {
aVal = (String)listA.get(i);
bVal = (String)listB.get(i);
comparison = aVal.compareTo(bVal);
if (comparison != 0) {
return comparison;
}
}
return listA.size() - listB.size();
}
};
private final Set LISTENERS = Collections.synchronizedSet(new HashSet());
private final List COMPONENTS;
private final FilterNotifier NOTIFIER;
private Severity _severity;
private boolean active = true;
{
NOTIFIER = new FilterNotifier(this);
}
public Node(
final List components) {
COMPONENTS = Collections.unmodifiableList(new ArrayList(components));
if (components.size() == 0) {
_severity = Severity.ALL;
} else {
_severity = Severity.INHERIT;
}
setUserObject(this);
}
public Node(
final Element nodeElement,
final Map map) {
_severity = Severity.INHERIT;
setActive(true);
setUserObject(this);
final String[] path = nodeElement.getAttributeValue("path").split("\\.");
final List components = Arrays.asList(path);
COMPONENTS = new ArrayList(components);
setSeverity(Severity.getSeverityByString(nodeElement.getAttributeValue("severity")));
final List childrenList = nodeElement.getChildren("filternode");
for (final Object c : childrenList) {
final Element childElement = (Element)c;
final Node childNode = new Node(childElement, map);
add(childNode);
}
map.put(getSourceComponents(), this);
}
return COMPONENTS;
}
return _severity;
}
@Override
public void setParent(
final MutableTreeNode parent) {
final Node oldParent;
oldParent = (Node)getParent();
if (oldParent != null) {
oldParent.removeFilterListener(this);
}
if (parent != null) {
((Node)parent).addFilterListener(this);
}
super.setParent(parent);
}
@Override
if (Severity.INHERIT.equals(getSeverity())) {
fireFilterChange();
}
}
@Override
if (o == null) {
return 1;
}
if (this == o) {
return 0;
}
final Node other = (Node)o;
final List components;
final List otherComponents;
components = getSourceComponents();
otherComponents = other.getSourceComponents();
if (components.toString().equals(otherComponents.toString())) {
return 0;
} else {
return LIST_COMPARATOR.compare(components, otherComponents);
}
}
@Override
return active;
}
@Override
public void setActive(
final boolean active) {
this.active = active;
}
@Override
public boolean isVisible(
final Event event) {
if (Severity.INHERIT.equals(getSeverity())) {
return ((Node)getParent()).isVisible(event);
}
final Severity eventSeverity;
eventSeverity = event.getSeverity();
if (getSeverity() == Severity.DISABLED_THROW_AWAY) {
BeanMillPane.getInstance().getLog().remove(event);
return false;
} else {
if (eventSeverity.compareTo(getSeverity()) >= 0) {
return true;
} else {
if (BeanMillPane.getInstance().isDeleteFilteredEvents()) {
BeanMillPane.getInstance().getLog().remove(event);
}
return false;
}
}
}
@Override
NOTIFIER.addFilterListener(listener);
}
@Override
NOTIFIER.removeFilterListener(listener);
}
@Override
return "Node";
}
@Override
return getSourceComponents().toString();
}
public synchronized void setSeverity(
final Severity severity) {
if (severity == null) {
throw new IllegalArgumentException("attempt to set null severity");
}
if (Severity.INHERIT.equals(severity) && (getSourceComponents().size() == 0)) {
return;
}
if (getSeverity().equals(severity)) {
return;
}
_severity = severity;
fireFilterChange();
}
if (!Severity.INHERIT.equals(getSeverity())) {
return getSeverity();
}
return ((Node)getParent()).getEffectiveSeverity();
}
final List components;
String text;
components = getSourceComponents();
if (components.size() == 0) {
text = "root";
} else {
text = (String)components.get(components.size() - 1);
}
return text;
}
NOTIFIER.fireFilterChange();
}
final Element e = new Element("filternode");
e.setAttribute("severity", this.getSeverity().toString());
String path = "";
for (final Object o : COMPONENTS) {
if (!path.equals("")) {
path += ".";
}
path += o.toString();
}
e.setAttribute("path", path);
for (int i = 0; i < getChildCount(); ++i) {
final Node child = (Node)getChildAt(i);
e.addContent(child.getXMLElement());
}
return e;
}
@Override
public boolean equals(
final Object o) {
if (o instanceof Node) {
final Node tester = (Node)o;
return COMPONENTS.toString().equals(tester.COMPONENTS.toString());
} else {
return false;
}
}
}