Added events to ControllerManager

Former-commit-id: 0982aed3728ac12c562b63fad5d74b7a548e50c0
This commit is contained in:
Ziver Koc 2016-01-04 19:02:10 +01:00
parent 6522b817dc
commit 1f781f0c8d
3 changed files with 106 additions and 27 deletions

View file

@ -1,8 +1,10 @@
package se.koc.hal; 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.HalSensor;
import se.koc.hal.intf.HalSensorController; import se.koc.hal.intf.HalSensorController;
import se.koc.hal.struct.Event;
import se.koc.hal.struct.Sensor; import se.koc.hal.struct.Sensor;
import zutil.log.LogUtil; import zutil.log.LogUtil;
import zutil.plugin.PluginData; import zutil.plugin.PluginData;
@ -25,16 +27,89 @@ public class ControllerManager {
/** All available sensor plugins **/ /** All available sensor plugins **/
private ArrayList<Class<?>> availableSensors = new ArrayList<>(); private ArrayList<Class<?>> availableSensors = new ArrayList<>();
/** List of all registered sensors **/
private ArrayList<Sensor> registeredSensors = new ArrayList<>();
/** List of auto detected sensors **/ /** List of auto detected sensors **/
private ArrayList<HalSensor> detectedSensors = new ArrayList<>(); private ArrayList<HalSensor> detectedSensors = new ArrayList<>();
/** All available event plugins **/
private ArrayList<Class<?>> availableEvents = new ArrayList<>();
/** List of all registered events **/
private ArrayList<Event> registeredEvents = new ArrayList<>();
/** List of auto detected events **/
private ArrayList<HalEvent> detectedEvents = new ArrayList<>();
/** A map of all instantiated controllers **/ /** A map of all instantiated controllers **/
private HashMap<Class,HalSensorController> controllerMap = new HashMap<>(); private HashMap<Class,Object> controllerMap = new HashMap<>();
/////////////////////////////// SENSORS ///////////////////////////////////
public void register(Sensor sensor) throws IllegalAccessException, InstantiationException { public void register(Sensor sensor) throws IllegalAccessException, InstantiationException {
Class<? extends HalSensorController> c = sensor.getController(); Class<? extends HalSensorController> 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<? extends HalSensorController> c = sensor.getController();
HalSensorController controller = (HalSensorController) controllerMap.get(c);;
if (controller != null) {
controller.deregister(sensor.getSensorData());
registeredSensors.remove(sensor);
removeControllerIfEmpty(controller);
}
}
public List<Class<?>> getAvailableSensors(){
return availableSensors;
}
public List<HalSensor> getDetectedSensors(){
return detectedSensors;
}
//////////////////////////////// EVENTS ///////////////////////////////////
public void register(Event event) throws IllegalAccessException, InstantiationException {
Class<? extends HalEventController> c = event.getController();
HalEventController controller = getControllerInstance(c);
if(controller != null)
controller.register(event.getEventData());
registeredEvents.add(event);
}
public void deregister(Event event){
Class<? extends HalEventController> c = event.getController();
HalEventController controller = (HalEventController) controllerMap.get(c);
if (controller != null) {
controller.deregister(event.getEventData());
registeredEvents.remove(event);
removeControllerIfEmpty(controller);
}
}
public List<Class<?>> getAvailableEvents(){
return availableEvents;
}
public List<HalEvent> getDetectedEvents(){
return detectedEvents;
}
/////////////////////////////// GENERAL ///////////////////////////////////
private <T> T getControllerInstance(Class<T> c){
Object controller = null;
if (controllerMap.containsKey(c)) if (controllerMap.containsKey(c))
controller = controllerMap.get(c); controller = controllerMap.get(c);
else { else {
@ -47,35 +122,29 @@ public class ControllerManager {
logger.log(Level.SEVERE, "Unable to instantiate controller: "+c.getName(), e); logger.log(Level.SEVERE, "Unable to instantiate controller: "+c.getName(), e);
} }
} }
return (T)controller;
if(controller != null)
controller.register(sensor.getSensorData());
} }
public void deregister(Sensor sensor){ private void removeControllerIfEmpty(Object controller){
Class<? extends HalSensorController> c = sensor.getController(); int size = Integer.MAX_VALUE;
HalSensorController controller; if(controller instanceof HalSensorController)
if (controllerMap.containsKey(c)) { size = ((HalSensorController) controller).size();
controller = controllerMap.get(c); else if(controller instanceof HalEventController)
controller.deregister(sensor.getSensorData()); size = ((HalEventController) controller).size();
if(controller.size() == 0){
if(size < 0){
// Remove controller as it has no more registered sensors // Remove controller as it has no more registered sensors
logger.fine("Closing controller as it has no more registered sensors: "+c.getName()); logger.fine("Closing controller as it has no more registered sensors: "+controller.getClass().getName());
controller.close(); controllerMap.remove(controller.getClass());
controllerMap.remove(c);
} if(controller instanceof HalSensorController)
((HalSensorController) controller).close();
else if(controller instanceof HalEventController)
((HalEventController) controller).close();
} }
} }
public List<Class<?>> getAvailableSensors(){
return availableSensors;
}
public List<HalSensor> getDetectedSensors(){
return detectedSensors;
}
public static void initialize(){ public static void initialize(){
@ -84,10 +153,15 @@ public class ControllerManager {
Iterator<PluginData> it = pluginManager.iterator(); Iterator<PluginData> it = pluginManager.iterator();
while (it.hasNext()){ while (it.hasNext()){
PluginData plugin = it.next(); PluginData plugin = it.next();
Iterator<Class<?>> pluginIt = plugin.getClassIterator(Sensor.class); Iterator<Class<?>> pluginIt = plugin.getClassIterator(HalSensor.class);
while (pluginIt.hasNext()){ while (pluginIt.hasNext()){
manager.availableSensors.add(pluginIt.next()); manager.availableSensors.add(pluginIt.next());
} }
pluginIt = plugin.getClassIterator(HalEvent.class);
while (pluginIt.hasNext()){
manager.availableEvents.add(pluginIt.next());
}
} }
instance = manager; instance = manager;
} }

View file

@ -10,6 +10,7 @@ import se.koc.hal.intf.HalHttpPage;
import se.koc.hal.page.PCConfigureHttpPage; import se.koc.hal.page.PCConfigureHttpPage;
import se.koc.hal.page.PCHeatMapHttpPage; import se.koc.hal.page.PCHeatMapHttpPage;
import se.koc.hal.page.PCOverviewHttpPage; import se.koc.hal.page.PCOverviewHttpPage;
import se.koc.hal.struct.Event;
import se.koc.hal.struct.Sensor; import se.koc.hal.struct.Sensor;
import zutil.db.DBConnection; import zutil.db.DBConnection;
import zutil.io.file.FileUtil; import zutil.io.file.FileUtil;
@ -49,6 +50,9 @@ public class PowerChallenge {
for(Sensor sensor : Sensor.getLocalSensors(db)){ for(Sensor sensor : Sensor.getLocalSensors(db)){
ControllerManager.getInstance().register(sensor); ControllerManager.getInstance().register(sensor);
} }
for(Event event : Event.getEvents(db)){
ControllerManager.getInstance().register(event);
}
// init daemons // init daemons
daemons = new HalDaemon[]{ daemons = new HalDaemon[]{

View file

@ -44,6 +44,7 @@ public class Event extends DBBean{
return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Event.class, db) ); return DBConnection.exec(stmt, DBBeanSQLResultHandler.createList(Event.class, db) );
} }
public HalEvent getEventData(){ public HalEvent getEventData(){
if(eventData == null) { if(eventData == null) {
try { try {