package me.legrange.panstamp.gui.model.tree;
import java.util.logging.Level;
import java.util.logging.Logger;
import me.legrange.panstamp.Network;
import me.legrange.panstamp.NetworkListener;
import me.legrange.panstamp.PanStamp;
import me.legrange.panstamp.ModemException;
import me.legrange.panstamp.event.AbstractNetworkListener;
import me.legrange.swap.SwapModem;
/**
* A node representing a panStamp gateway to a network.
*
* @author gideon
*/
public class NetworkNode extends NetworkTreeNode<Network, PanStamp> {
public NetworkNode(Network gw) {
super(gw);
}
public Network getNetwork() {
return (Network) getUserObject();
}
@Override
public String toString() {
String txt;
try {
Network gw = getNetwork();
SwapModem sm = gw.getSWAPModem();
switch (sm.getType()) {
case SERIAL:
txt = String.format("Serial Network - %4x", gw.getNetworkId());
break;
case TCP_IP:
txt = String.format("TCP/IP Network - %4x", gw.getNetworkId());
break;
default:
txt = String.format("%4x", gw.getNetworkId());
}
} catch (ModemException ex) {
Logger.getLogger(NetworkNode.class.getName()).log(Level.SEVERE, null, ex);
txt = "Network";
}
return txt;
}
@Override
protected void start() {
getNetwork().addListener(listener);
for (PanStamp ps : getNetwork().getDevices()) {
addPanStamp(ps);
}
}
@Override
protected void stop() {
getNetwork().removeListener(listener);
super.stop();
}
@Override
public Type getType() {
return Type.NETWORK;
}
@Override
public int compareTo(NetworkTreeNode<Network, PanStamp> o) {
return 0;
}
private synchronized void addPanStamp(PanStamp ps) {
addChild(ps);
}
private synchronized void removePanStamp(PanStamp ps) {
for (int i = 0; i < getChildCount(); ++i) {
PanStampNode psn = (PanStampNode) getChildAt(i);
if (psn.getPanStamp() == ps) {
psn.stop();
removeFromTree(psn, this);
return;
}
}
}
@Override
void addChild(PanStamp ps) {
PanStampNode psn = new PanStampNode(ps);
addToTree(psn, this);
psn.start();
}
private final NetworkListener listener = new AbstractNetworkListener() {
@Override
public void deviceDetected(Network gw, PanStamp dev) {
addPanStamp(dev);
}
@Override
public void deviceRemoved(Network gw, PanStamp dev) {
removePanStamp(dev);
}
@Override
public void networkClosed(Network nw) {
reload();
}
@Override
public void networkOpened(Network nw) {
reload();
}
};
}