diff --git a/src/se/koc/hal/ControllerManager.java b/src/se/koc/hal/ControllerManager.java new file mode 100755 index 00000000..504ad99f --- /dev/null +++ b/src/se/koc/hal/ControllerManager.java @@ -0,0 +1,84 @@ +package se.koc.hal; + +import se.koc.hal.intf.HalSensorController; +import se.koc.hal.struct.HalEvent; +import se.koc.hal.struct.HalSensor; +import zutil.log.LogUtil; +import zutil.plugin.PluginData; +import zutil.plugin.PluginManager; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.logging.Logger; + +/** + * This class manages all SensorController and EventController objects + */ +public class ControllerManager { + private static final Logger logger = LogUtil.getLogger(); + private static ControllerManager instance; + + + private ArrayList> availableSensors = new ArrayList<>(); + private HashMap controllerMap = new HashMap<>(); + + + + public void register(HalSensor sensor) throws IllegalAccessException, InstantiationException { + Class c = sensor.getController(); + HalSensorController controller; + if (controllerMap.containsKey(c)) + controller = controllerMap.get(c); + else { + // Instantiate controller + logger.fine("Instantiating controller: " + c.getName()); + controller = c.newInstance(); + controllerMap.put(c, controller); + } + + controller.register(sensor); + } + + public void deregister(HalSensor sensor){ + Class c = sensor.getController(); + HalSensorController controller; + if (controllerMap.containsKey(c)) { + controller = controllerMap.get(c); + controller.deregister(sensor); + 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); + } + } + } + + public List> getAvailableSensors(){ + return availableSensors; + } + + + + + + public static void initialize(){ + ControllerManager manager = new ControllerManager(); + PluginManager pluginManager = new PluginManager("./"); + Iterator it = pluginManager.iterator(); + while (it.hasNext()){ + PluginData plugin = it.next(); + Iterator> pluginIt = plugin.getClassIterator(HalSensor.class); + while (pluginIt.hasNext()){ + manager.availableSensors.add(pluginIt.next()); + } + } + instance = manager; + } + + public static ControllerManager getInstance(){ + return instance; + } +} diff --git a/src/se/koc/hal/HALClient.java b/src/se/koc/hal/HALClient.java index 752a296d..5d4424e9 100755 --- a/src/se/koc/hal/HALClient.java +++ b/src/se/koc/hal/HALClient.java @@ -23,7 +23,7 @@ import java.util.regex.Pattern; * Date: 2013-12-17 * Time: 10:59 */ -public class HALClient{ +public class HalClient { private static HashMap switches = new HashMap(); diff --git a/src/se/koc/hal/HalContext.java b/src/se/koc/hal/HalContext.java index 584df40c..1bd59bbe 100755 --- a/src/se/koc/hal/HalContext.java +++ b/src/se/koc/hal/HalContext.java @@ -78,7 +78,7 @@ public class HalContext { FileUtil.copy(dbFile, backupDB); logger.fine(String.format("Upgrading DB (from: v%s, to: v%s)...", dbVersion, defaultDBVersion)); - DBUpgradeHandler handler = new DBUpgradeHandler(referenceDB); + final DBUpgradeHandler handler = new DBUpgradeHandler(referenceDB); handler.setTargetDB(db); //read upgrade path preferences from the reference database @@ -89,14 +89,17 @@ public class HalContext { @Override public Object handleQueryResult(Statement stmt, ResultSet result) throws SQLException { while(result.next()){ - if(result.getBoolean("force_upgrade")){ + if(result.getBoolean("force_upgrade")){ + logger.fine("Forced upgrade enabled"); handler.setForcedDBUpgrade(true); //set to true if any of the intermediate db version requires it. } if(result.getBoolean("clear_external_aggr_data")){ + logger.fine("Clearing external aggregate data"); db.exec("DELETE FROM sensor_data_aggr WHERE sensor_id = " + "(SELECT sensor_id FROM user, sensor WHERE user.external == 1 AND sensor.user_id = user.id)"); } if(result.getBoolean("clear_internal_aggr_data")){ + logger.fine("Clearing local aggregate data"); db.exec("DELETE FROM sensor_data_aggr WHERE sensor_id = " + "(SELECT sensor_id FROM user, sensor WHERE user.external == 0 AND sensor.user_id = user.id)"); } diff --git a/src/se/koc/hal/PowerChallenge.java b/src/se/koc/hal/PowerChallenge.java index 454e3f50..402ea855 100755 --- a/src/se/koc/hal/PowerChallenge.java +++ b/src/se/koc/hal/PowerChallenge.java @@ -10,6 +10,8 @@ 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.HalSensor; +import zutil.db.DBConnection; import zutil.io.file.FileUtil; import zutil.log.CompactLogFormatter; import zutil.log.LogUtil; @@ -40,6 +42,13 @@ public class PowerChallenge { // init DB and other configurations HalContext.initialize(); + DBConnection db = HalContext.getDB(); + + // Init sensors and controllers + ControllerManager.initialize(); + for(HalSensor sensor : HalSensor.getLocalSensors(db)){ + //ControllerManager.getInstance().register(sensor); + } // init daemons daemons = new HalDaemon[]{ diff --git a/src/se/koc/hal/plugin/tellstick/plugin.json b/src/se/koc/hal/plugin/tellstick/plugin.json new file mode 100755 index 00000000..d3a59e5c --- /dev/null +++ b/src/se/koc/hal/plugin/tellstick/plugin.json @@ -0,0 +1,8 @@ +{ + "version": 1.0, + "name": "Tellstick", + "interfaces": [ + {"se.koc.hal.struct.HalSensor": "se.koc.hal.plugin.tellstick.protocols.Oregon0x1A2D"}, + {"se.koc.hal.struct.HalEvent": "se.koc.hal.plugin.tellstick.protocols.NexaSelfLearning"} + ] +} \ No newline at end of file diff --git a/src/se/koc/hal/struct/HalEvent.java b/src/se/koc/hal/struct/HalEvent.java index 3a5cf554..581489f9 100755 --- a/src/se/koc/hal/struct/HalEvent.java +++ b/src/se/koc/hal/struct/HalEvent.java @@ -31,7 +31,7 @@ public class HalEvent extends DBBean{ - public HalEventController getController(){ + public Class getController(){ return null; } } diff --git a/src/se/koc/hal/struct/HalSensor.java b/src/se/koc/hal/struct/HalSensor.java index b5342999..9807416c 100755 --- a/src/se/koc/hal/struct/HalSensor.java +++ b/src/se/koc/hal/struct/HalSensor.java @@ -111,7 +111,7 @@ public class HalSensor extends DBBean{ return AggregationMethod.SUM; } - public HalSensorController getController(){ + public Class getController(){ return null; } }