ControllerManager has now a limbo state for Events and Sensors where they are put during their reconfiguration. Fixing issue 3

Former-commit-id: 39762fb39cd2bb68e903392ffdefd4b8f356e54f
This commit is contained in:
Ziver Koc 2016-01-20 13:25:20 +01:00
parent 7cf45ff232
commit a45482b92e
2 changed files with 85 additions and 31 deletions

View file

@ -7,38 +7,44 @@ import zutil.db.DBConnection;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import zutil.plugin.PluginData; import zutil.plugin.PluginData;
import zutil.plugin.PluginManager; import zutil.plugin.PluginManager;
import zutil.ui.Configurator;
import zutil.ui.Configurator.*;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level; import java.util.logging.Level;
import java.util.logging.Logger; import java.util.logging.Logger;
/** /**
* This class manages all SensorController and EventController objects * This class manages all SensorController and EventController objects
*/ */
public class ControllerManager implements HalSensorReportListener, HalEventReportListener { public class ControllerManager implements HalSensorReportListener,
HalEventReportListener,
PreConfigurationActionListener,
PostConfigurationActionListener {
private static final Logger logger = LogUtil.getLogger(); private static final Logger logger = LogUtil.getLogger();
private static ControllerManager instance; private static ControllerManager instance;
/** All available sensor plugins **/ /** All available sensor plugins **/
private ArrayList<Class<?>> availableSensors = new ArrayList<>(); private List<Class<?>> availableSensors = new ArrayList<>();
/** List of all registered sensors **/ /** List of all registered sensors **/
private ArrayList<Sensor> registeredSensors = new ArrayList<>(); private List<Sensor> registeredSensors = new ArrayList<>();
/** List of auto detected sensors **/ /** List of auto detected sensors **/
private ArrayList<HalSensorData> detectedSensors = new ArrayList<>(); private List<HalSensorData> detectedSensors = new ArrayList<>();
/** List of sensors that are currently being reconfigured **/
private List<Sensor> limboSensors = new LinkedList<>();
/** All available event plugins **/ /** All available event plugins **/
private ArrayList<Class<?>> availableEvents = new ArrayList<>(); private List<Class<?>> availableEvents = new ArrayList<>();
/** List of all registered events **/ /** List of all registered events **/
private ArrayList<Event> registeredEvents = new ArrayList<>(); private List<Event> registeredEvents = new ArrayList<>();
/** List of auto detected events **/ /** List of auto detected events **/
private ArrayList<HalEventData> detectedEvents = new ArrayList<>(); private List<HalEventData> detectedEvents = new ArrayList<>();
/** List of all registered events **/
private List<Event> limboEvents = new LinkedList<>();
/** A map of all instantiated controllers **/ /** A map of all instantiated controllers **/
@ -48,7 +54,7 @@ public class ControllerManager implements HalSensorReportListener, HalEventRepor
/////////////////////////////// SENSORS /////////////////////////////////// /////////////////////////////// SENSORS ///////////////////////////////////
public void register(Sensor sensor) throws IllegalAccessException, InstantiationException { public void register(Sensor sensor) {
if(sensor.getDeviceData() == null) { if(sensor.getDeviceData() == null) {
logger.warning("Sensor data is null: "+ sensor); logger.warning("Sensor data is null: "+ sensor);
return; return;
@ -95,16 +101,11 @@ public class ControllerManager implements HalSensorReportListener, HalEventRepor
public void reportReceived(HalSensorData sensorData) { public void reportReceived(HalSensorData sensorData) {
try{ try{
DBConnection db = HalContext.getDB(); DBConnection db = HalContext.getDB();
Sensor sensor = null; Sensor sensor = findSensor(sensorData, registeredSensors);
for (Sensor s : registeredSensors) {
if (sensorData.equals(s.getDeviceData())) {
sensor = s;
sensor.setDeviceData(sensorData); // Set the latest data
break;
}
}
if (sensor != null) { if (sensor != null) {
sensor.setDeviceData(sensorData); // Set the latest data
PreparedStatement stmt = PreparedStatement stmt =
db.getPreparedStatement("INSERT INTO sensor_data_raw (timestamp, sensor_id, data) VALUES(?, ?, ?)"); db.getPreparedStatement("INSERT INTO sensor_data_raw (timestamp, sensor_id, data) VALUES(?, ?, ?)");
stmt.setLong(1, sensorData.getTimestamp()); stmt.setLong(1, sensorData.getTimestamp());
@ -124,9 +125,18 @@ public class ControllerManager implements HalSensorReportListener, HalEventRepor
} }
} }
private static Sensor findSensor(HalSensorData sensorData, List<Sensor> list){
for (Sensor s : list) {
if (sensorData.equals(s.getDeviceData())) {
return s;
}
}
return null;
}
//////////////////////////////// EVENTS /////////////////////////////////// //////////////////////////////// EVENTS ///////////////////////////////////
public void register(Event event) throws IllegalAccessException, InstantiationException { public void register(Event event) {
if(event.getDeviceData() == null) { if(event.getDeviceData() == null) {
logger.warning("Sensor data is null: "+ event); logger.warning("Sensor data is null: "+ event);
return; return;
@ -173,16 +183,11 @@ public class ControllerManager implements HalSensorReportListener, HalEventRepor
public void reportReceived(HalEventData eventData) { public void reportReceived(HalEventData eventData) {
try { try {
DBConnection db = HalContext.getDB(); DBConnection db = HalContext.getDB();
Event event = null; Event event = findRegisteredEvent(eventData, registeredEvents);
for (Event e : registeredEvents) {
if (eventData.equals(e.getDeviceData())) {
event = e;
event.setDeviceData(eventData); // Set the latest data
break;
}
}
if (event != null) { if (event != null) {
event.setDeviceData(eventData); // Set the latest data
PreparedStatement stmt = PreparedStatement stmt =
db.getPreparedStatement("INSERT INTO event_data_raw (timestamp, event_id, data) VALUES(?, ?, ?)"); db.getPreparedStatement("INSERT INTO event_data_raw (timestamp, event_id, data) VALUES(?, ?, ?)");
stmt.setLong(1, eventData.getTimestamp()); stmt.setLong(1, eventData.getTimestamp());
@ -202,7 +207,51 @@ public class ControllerManager implements HalSensorReportListener, HalEventRepor
} }
} }
private static Event findRegisteredEvent(HalEventData eventData, List<Event> list){
for (Event e : list) {
if (eventData.equals(e.getDeviceData())) {
return e;
}
}
return null;
}
/////////////////////////////// GENERAL /////////////////////////////////// /////////////////////////////// GENERAL ///////////////////////////////////
@Override
public void postConfigurationAction(Configurator configurator, Object obj) {
if(obj instanceof HalSensorData) {
Sensor sensor = findSensor((HalSensorData) obj, registeredSensors);
if(sensor != null){
deregister(sensor);
limboSensors.add(sensor);
}
}
else if(obj instanceof HalEventController) {
Event event = findRegisteredEvent((HalEventData) obj, registeredEvents);
if(event != null){
deregister(event);
limboEvents.add(event);
}
}
}
@Override
public void preConfigurationAction(Configurator configurator, Object obj) {
if(obj instanceof HalSensorController) {
Sensor sensor = findSensor((HalSensorData) obj, limboSensors);
if(sensor != null){
register(sensor);
limboSensors.remove(sensor);
}
}
else if(obj instanceof HalEventController) {
Event event = findRegisteredEvent((HalEventData) obj, limboEvents);
if(event != null){
register(event);
limboEvents.remove(event);
}
}
}
private <T> T getControllerInstance(Class<T> c){ private <T> T getControllerInstance(Class<T> c){
Object controller = null; Object controller = null;

View file

@ -1,5 +1,6 @@
package se.hal.struct; package se.hal.struct;
import se.hal.ControllerManager;
import zutil.db.DBConnection; import zutil.db.DBConnection;
import zutil.db.bean.DBBean; import zutil.db.bean.DBBean;
import zutil.log.LogUtil; import zutil.log.LogUtil;
@ -32,8 +33,12 @@ public abstract class AbstractDevice<T> extends DBBean {
public Configurator<T> getDeviceConfig() { public Configurator<T> getDeviceConfig() {
T obj = getDeviceData(); T obj = getDeviceData();
if (obj != null) if (obj != null) {
return new Configurator<>(obj); Configurator<T> configurator = new Configurator<>(obj);
configurator.setPreConfigurationListener(ControllerManager.getInstance());
configurator.setPostConfigurationListener(ControllerManager.getInstance());
return configurator;
}
return null; return null;
} }
public T getDeviceData() { public T getDeviceData() {