package me.legrange.panstamp.gui.model;
import me.legrange.panstamp.gui.model.tree.NetworkTreeModel;
import java.io.File;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import javax.swing.table.TableModel;
import javax.swing.tree.TreeModel;
import me.legrange.panstamp.DeviceLibrary;
import me.legrange.panstamp.Endpoint;
import me.legrange.panstamp.Network;
import me.legrange.panstamp.NetworkException;
import me.legrange.panstamp.PanStamp;
import me.legrange.panstamp.definition.CompoundDeviceLibrary;
import me.legrange.panstamp.tools.store.DataStoreException;
import me.legrange.panstamp.tools.store.Store;
import me.legrange.panstamp.xml.ClassLoaderLibrary;
import me.legrange.panstamp.xml.FileLibrary;
/**
* A data model that provides the different view models required.
*
* @author gideon
*/
public final class Model {
public Model() throws DataStoreException {
store = Store.openFile(dataFileName());
setDeviceLibary(store.getLibary());
}
public void start() throws DataStoreException, NetworkException {
List<Network> stored = store.loadNetworks();
for (Network gw : stored) {
addGateway(gw);
}
}
public synchronized void addGateway(Network gw) throws NetworkException {
networks.add(gw);
store.addGateway(gw);
gw.setDeviceLibrary(devLib);
SignalCollector sc = new SignalCollector();
gw.getSWAPModem().addListener(sc);
signalCollectors.put(gw, sc);
endpointCollectors.put(gw, new EndpointCollector(gw));
ntm.addGateway(gw);
etm.addGateway(gw);
gw.getSWAPModem().addListener(smm);
}
public void deleteGateway(Network gw) throws NetworkException {
if (gw.isOpen()) {
gw.close();
}
gw.getSWAPModem().removeListener(smm);
etm.removeGateway(gw);
ntm.removeGateway(gw);
EndpointCollector ec = endpointCollectors.remove(gw);
ec.stop();
SignalCollector sc = signalCollectors.get(gw);
gw.getSWAPModem().removeListener(sc);
store.removeGateway(gw);
}
public TreeModel getTreeModel() {
return ntm;
}
public TableModel getEndpointTableModel() {
return etm;
}
public TableModel getSWAPTableModel() {
return smm;
}
public SignalDataSet getSignalDataSet(PanStamp ps) {
SignalCollector sc = signalCollectors.get(ps.getNetwork());
return sc.getDataSet(ps.getAddress());
}
public EndpointDataSet getEndpointDataSet(Endpoint ep) {
EndpointCollector ec = endpointCollectors.get(ep.getRegister().getDevice().getNetwork());
return ec.getDataSet(ep);
}
public void setFileLibrary(String dir) throws DataStoreException {
FileLibrary lib = new FileLibrary(new File(dir));
store.setLibrary(lib);
setDeviceLibary(lib);
}
public void clearFileLibry() throws DataStoreException {
setDeviceLibary(null);
store.setLibrary(null);
}
public String getFileLibary() throws DataStoreException {
FileLibrary lib = store.getLibary();
if (lib != null) {
return lib.getDirectory();
}
else {
return "";
}
}
private void setDeviceLibary(DeviceLibrary lib) {
if (lib != null) {
devLib = new CompoundDeviceLibrary(lib, new ClassLoaderLibrary());
} else {
devLib = new ClassLoaderLibrary();
}
for (Network nw : networks) {
nw.setDeviceLibrary(devLib);
}
}
private static String dataFileName() {
String name = System.getProperty("user.home") + File.separator;
if (System.getProperty("os.name").toLowerCase().startsWith("windows")) {
name = name + DATA_PATH;
} else {
name = name + "." + DATA_PATH;
}
File path = new File(name);
if (!path.exists()) {
path.mkdir();
}
return name + File.separator + "panstamp.json";
}
private final Map<Network, SignalCollector> signalCollectors = new HashMap<>();
private final Map<Network, EndpointCollector> endpointCollectors = new HashMap<>();
private final MessageTableModel smm = new MessageTableModel();
private final NetworkTreeModel ntm = NetworkTreeModel.create();
private final EndpointTableModel etm = EndpointTableModel.create();
private final Map<Endpoint, EndpointDataSet> epds = new HashMap<>();
private final Map<PanStamp, Boolean> hasParams = new HashMap<>();
private final List<Network> networks = new LinkedList<>();
private final Store store;
private DeviceLibrary devLib;
private static final String DATA_PATH = "panstamp";
}