diff --git a/src/se/koc/hal/ControllerManager.java b/src/se/koc/hal/ControllerManager.java index 7941c704..a632053a 100755 --- a/src/se/koc/hal/ControllerManager.java +++ b/src/se/koc/hal/ControllerManager.java @@ -1,8 +1,10 @@ package se.koc.hal; -import net.didion.jwnl.data.Exc; +import se.koc.hal.intf.HalEvent; +import se.koc.hal.intf.HalEventController; import se.koc.hal.intf.HalSensor; import se.koc.hal.intf.HalSensorController; +import se.koc.hal.struct.Event; import se.koc.hal.struct.Sensor; import zutil.log.LogUtil; import zutil.plugin.PluginData; @@ -25,16 +27,89 @@ public class ControllerManager { /** All available sensor plugins **/ private ArrayList> availableSensors = new ArrayList<>(); + /** List of all registered sensors **/ + private ArrayList registeredSensors = new ArrayList<>(); /** List of auto detected sensors **/ private ArrayList detectedSensors = new ArrayList<>(); + + + /** All available event plugins **/ + private ArrayList> availableEvents = new ArrayList<>(); + /** List of all registered events **/ + private ArrayList registeredEvents = new ArrayList<>(); + /** List of auto detected events **/ + private ArrayList detectedEvents = new ArrayList<>(); + + /** A map of all instantiated controllers **/ - private HashMap controllerMap = new HashMap<>(); + private HashMap controllerMap = new HashMap<>(); + /////////////////////////////// SENSORS /////////////////////////////////// + public void register(Sensor sensor) throws IllegalAccessException, InstantiationException { Class c = sensor.getController(); - HalSensorController controller = null; + HalSensorController controller = getControllerInstance(c); + + if(controller != null) + controller.register(sensor.getSensorData()); + registeredSensors.add(sensor); + } + + public void deregister(Sensor sensor){ + Class c = sensor.getController(); + HalSensorController controller = (HalSensorController) controllerMap.get(c);; + if (controller != null) { + controller.deregister(sensor.getSensorData()); + registeredSensors.remove(sensor); + removeControllerIfEmpty(controller); + } + } + + public List> getAvailableSensors(){ + return availableSensors; + } + + public List getDetectedSensors(){ + return detectedSensors; + } + + + //////////////////////////////// EVENTS /////////////////////////////////// + + public void register(Event event) throws IllegalAccessException, InstantiationException { + Class c = event.getController(); + HalEventController controller = getControllerInstance(c); + + if(controller != null) + controller.register(event.getEventData()); + registeredEvents.add(event); + } + + public void deregister(Event event){ + Class c = event.getController(); + HalEventController controller = (HalEventController) controllerMap.get(c); + if (controller != null) { + controller.deregister(event.getEventData()); + registeredEvents.remove(event); + removeControllerIfEmpty(controller); + } + } + + public List> getAvailableEvents(){ + return availableEvents; + } + + public List getDetectedEvents(){ + return detectedEvents; + } + + + /////////////////////////////// GENERAL /////////////////////////////////// + + private T getControllerInstance(Class c){ + Object controller = null; if (controllerMap.containsKey(c)) controller = controllerMap.get(c); else { @@ -47,35 +122,29 @@ public class ControllerManager { logger.log(Level.SEVERE, "Unable to instantiate controller: "+c.getName(), e); } } - - if(controller != null) - controller.register(sensor.getSensorData()); + return (T)controller; } - public void deregister(Sensor sensor){ - Class c = sensor.getController(); - HalSensorController controller; - if (controllerMap.containsKey(c)) { - controller = controllerMap.get(c); - controller.deregister(sensor.getSensorData()); - if(controller.size() == 0){ - // Remove controller as it has no more registered sensors - logger.fine("Closing controller as it has no more registered sensors: "+c.getName()); - controller.close(); - controllerMap.remove(c); - } + private void removeControllerIfEmpty(Object controller){ + int size = Integer.MAX_VALUE; + if(controller instanceof HalSensorController) + size = ((HalSensorController) controller).size(); + else if(controller instanceof HalEventController) + size = ((HalEventController) controller).size(); + + if(size < 0){ + // Remove controller as it has no more registered sensors + logger.fine("Closing controller as it has no more registered sensors: "+controller.getClass().getName()); + controllerMap.remove(controller.getClass()); + + if(controller instanceof HalSensorController) + ((HalSensorController) controller).close(); + else if(controller instanceof HalEventController) + ((HalEventController) controller).close(); } } - public List> getAvailableSensors(){ - return availableSensors; - } - - public List getDetectedSensors(){ - return detectedSensors; - } - public static void initialize(){ @@ -84,10 +153,15 @@ public class ControllerManager { Iterator it = pluginManager.iterator(); while (it.hasNext()){ PluginData plugin = it.next(); - Iterator> pluginIt = plugin.getClassIterator(Sensor.class); + Iterator> pluginIt = plugin.getClassIterator(HalSensor.class); while (pluginIt.hasNext()){ manager.availableSensors.add(pluginIt.next()); } + + pluginIt = plugin.getClassIterator(HalEvent.class); + while (pluginIt.hasNext()){ + manager.availableEvents.add(pluginIt.next()); + } } instance = manager; } diff --git a/src/se/koc/hal/PowerChallenge.java b/src/se/koc/hal/PowerChallenge.java index 168de6c7..9baea619 100755 --- a/src/se/koc/hal/PowerChallenge.java +++ b/src/se/koc/hal/PowerChallenge.java @@ -10,6 +10,7 @@ import se.koc.hal.intf.HalHttpPage; import se.koc.hal.page.PCConfigureHttpPage; import se.koc.hal.page.PCHeatMapHttpPage; import se.koc.hal.page.PCOverviewHttpPage; +import se.koc.hal.struct.Event; import se.koc.hal.struct.Sensor; import zutil.db.DBConnection; import zutil.io.file.FileUtil; @@ -49,6 +50,9 @@ public class PowerChallenge { for(Sensor sensor : Sensor.getLocalSensors(db)){ ControllerManager.getInstance().register(sensor); } + for(Event event : Event.getEvents(db)){ + ControllerManager.getInstance().register(event); + } // init daemons daemons = new HalDaemon[]{ diff --git a/src/se/koc/hal/struct/Event.java b/src/se/koc/hal/struct/Event.java index b1260c05..cdb6ede3 100755 --- a/src/se/koc/hal/struct/Event.java +++ b/src/se/koc/hal/struct/Event.java @@ -44,6 +44,7 @@ public class Event extends DBBean{ return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Event.class, db) ); } + public HalEvent getEventData(){ if(eventData == null) { try {