package me.legrange.panstamp.gui.model; import java.util.HashMap; import java.util.Map; import me.legrange.panstamp.Endpoint; import me.legrange.panstamp.Network; import me.legrange.panstamp.NetworkException; import me.legrange.panstamp.NetworkListener; import me.legrange.panstamp.PanStamp; import me.legrange.panstamp.PanStampListener; import me.legrange.panstamp.Register; import me.legrange.panstamp.RegisterListener; import me.legrange.panstamp.event.AbstractNetworkListener; import me.legrange.panstamp.event.AbstractPanStampListener; import me.legrange.panstamp.event.AbstractRegisterListener; /** * * @author gideon */ public class EndpointCollector { public EndpointCollector(Network gw) throws NetworkException { this.gw = gw; add(gw); } public EndpointDataSet getDataSet(Endpoint ep) { EndpointDataSet ds = sets.get(ep); if (ds == null) { ds = addDataSet(ep); } return ds; } public void stop() { remove(gw); } private void remove(PanStamp ps) { ps.removeListener(panStampL); for (Register reg : ps.getRegisters()) { remove(reg); } } private void remove(Register reg) { reg.removeListener(registerL); for (Endpoint ep : reg.getEndpoints()) { remove(ep); } } private void remove(Network gw) { gw.removeListener(gatewayL); } private void remove(Endpoint ep) { removeDataSet(ep); } private void add(Network gw) { gw.addListener(gatewayL); for (PanStamp ps : gw.getDevices()) { add(ps); } } private void add(PanStamp ps) { ps.addListener(panStampL); for (Register reg : ps.getRegisters()) { add(reg); } } private void add(Register reg) { reg.addListener(registerL); for (Endpoint ep : reg.getEndpoints()) { add(ep); } } private void add(Endpoint ep) { addDataSet(ep); } private EndpointDataSet addDataSet(Endpoint ep) { EndpointDataSet ds = new EndpointDataSet(ep); sets.put(ep, ds); ep.addListener(ds); return ds; } private void removeDataSet(Endpoint ep) { sets.remove(ep); } private final Network gw; private final Map<Endpoint, EndpointDataSet> sets = new HashMap<>(); private final NetworkListener gatewayL = new AbstractNetworkListener() { @Override public void deviceRemoved(Network gw, PanStamp dev) { add(dev); } @Override public void deviceDetected(Network gw, PanStamp dev) { remove(dev); } }; private final PanStampListener panStampL = new AbstractPanStampListener() { @Override public void registerDetected(PanStamp dev, Register reg) { add(reg); } @Override public void productCodeChange(PanStamp dev, int manufacturerId, int productId) { remove(dev); add(dev); } }; private final RegisterListener registerL = new AbstractRegisterListener() { @Override public void endpointAdded(Register reg, Endpoint ep) { add(ep); } }; }