package art.servers.rtzserver; import art.library.interop.serialization.Serialization; import art.library.model.devices.Device; import art.library.model.devices.DeviceInformation; import art.library.model.devices.DevicePersistenceTimeless; import art.library.model.devices.colors.controller.RTZ32.RTZ32_Controller; import art.library.model.devices.colors.controller.RTZ32.RTZ32_ControllerInformation; import art.servers.configuration.Configuration; import java.io.File; import java.io.FileOutputStream; import java.lang.reflect.Array; import java.util.Collections; import java.util.Comparator; import java.util.List; public class Model extends art.servers.Model { public Model(Configuration configuration) throws Exception { super(configuration, "controllers", RTZ32_Controller.class.getName(), RTZ32_ControllerInformation.class.getName()); } // TODO: Para poder debugar desde nuestros ordenadores public void readDevices() { if (filename == null) return; mutexListDevices.lockWrite(); try { ldevice.clear(); mdevice.clear(); // Read data from database file (--restore) if (art.servers.Shared.restoreDevices == true) { Class clazzDevice = Class.forName(deviceClassName); Class clazzArray = (Class)Array.newInstance(clazzDevice, 0).getClass(); List ldevice = (List)Serialization.deserialize(clazzArray, new File(art.servers.Shared.getApplicationName() + "." + filename + ".database.json")); for (Device device : ldevice) { if (device instanceof Device) // && (device.information.serverPort == art.servers.Shared.configuration.listener.port) && (device.information.serverAddress.equalsIgnoreCase(art.servers.Shared.configuration.listener.address))) { device.information.serverAddress = art.servers.Shared.configuration.listener.address; device.information.serverPort = art.servers.Shared.configuration.listener.port; device.information.serverAddressExternal = art.servers.Shared.configuration.listener.addressExternal; device.information.serverPortExternal = art.servers.Shared.configuration.listener.portExternal; this.ldevice.add(device); this.mdevice.put(device.getIdentifier(), device); } } } // Read data from database else if ((art.servers.Shared.controllerDatabase != null) && (art.servers.Shared.reloadDevices == false)) { Class clazzDevice = Class.forName(deviceClassName); List ldevice = (List)DevicePersistenceTimeless.getDevices((List)(List)art.servers.Shared.controllerDatabase.timeless_getObject(DevicePersistenceTimeless.class.getName(), "type = '" + clazzDevice.getName() + "'")); for (Device device : ldevice) { try { if (device instanceof Device) // && (device.information.serverPort == art.servers.Shared.configuration.listener.port) && (device.information.serverAddress.equalsIgnoreCase(art.servers.Shared.configuration.listener.address))) { device.information.serverAddress = art.servers.Shared.configuration.listener.address; device.information.serverPort = art.servers.Shared.configuration.listener.port; device.information.serverAddressExternal = art.servers.Shared.configuration.listener.addressExternal; device.information.serverPortExternal = art.servers.Shared.configuration.listener.portExternal; this.ldevice.add(device); this.mdevice.put(device.getIdentifier(), device); } } catch (Exception exception) { art.servers.Shared.println(device.getIdentifier(), exception.getMessage()); } } } } catch (Exception exception) { art.servers.Shared.println(art.servers.Shared.getMessage("Model"), exception); } try { Class clazzDevice = Class.forName(deviceClassName); Class clazzInformation = Class.forName(deviceInformationClassName); DeviceInformation[] ldeviceInformation = null; if (new File(art.servers.Shared.getApplicationName() + "." + filename + ".json").exists()) { Class clazzArray = (Class)Array.newInstance(clazzInformation, 0).getClass(); ldeviceInformation = Serialization.deserialize(clazzArray, new File(art.servers.Shared.getApplicationName() + "." + filename + ".json")); } for (DeviceInformation deviceInformation : ldeviceInformation) { if (mdevice.containsKey(deviceInformation.getIdentifier()) == false) { addDevice(clazzDevice, deviceInformation); } } } catch (Exception exception) { art.servers.Shared.println(art.servers.Shared.getMessage("Model"), exception); } for (Device device : ldevice) { device.information.serverServiceName = art.servers.Shared.controllerStatus.getApplication().getDeviceInformation().serverServiceName; } // Sort Collections.sort(ldevice, new Comparator() { public int compare(Device device1, Device device2) { return Integer.valueOf(device1.information.number).compareTo(device2.information.number); } }); // Database file if (art.servers.Shared.restoreDevices == false) { try { FileOutputStream fos = new FileOutputStream(new File(art.servers.Shared.getApplicationName() + "." + filename + ".database.json")); fos.write("[\n".getBytes()); for (Device device : ldevice) { fos.write(Serialization.toPrettyString(device).getBytes()); if (device != ldevice.get(ldevice.size() - 1)) fos.write(",".getBytes()); } fos.write("]\n".getBytes()); fos.close(); } catch (Exception e) { } } mutexListDevices.releaseWrite(); } public RTZ32_Controller getDevice(int number) { for (Device device : Shared.model.getDevices()) { if (device.getDeviceInformation().number == number) { return (RTZ32_Controller)device; } } return null; } }