Introduced AbstractController
This commit is contained in:
parent
267eda7afd
commit
d759ebcd77
8 changed files with 103 additions and 68 deletions
|
|
@ -34,6 +34,25 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="panel panel-default drop-shadow">
|
||||||
|
<div class="panel-heading">Active Controllers</div>
|
||||||
|
<div class="panel-body">
|
||||||
|
|
||||||
|
<table class="table table-hover table-condensed">
|
||||||
|
<thead>
|
||||||
|
<th class="col-md-3">Name</th>
|
||||||
|
</thead>
|
||||||
|
{{#controllers}}
|
||||||
|
<tr>
|
||||||
|
<td>{{.getClass().getName()}}</td>
|
||||||
|
</tr>
|
||||||
|
{{/controllers}}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
$(function (){
|
$(function (){
|
||||||
$(".toggle-switch").on("switchChange.bootstrapSwitch", function (event, state) {
|
$(".toggle-switch").on("switchChange.bootstrapSwitch", function (event, state) {
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package se.hal;
|
package se.hal;
|
||||||
|
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import se.hal.intf.*;
|
import se.hal.intf.*;
|
||||||
import se.hal.struct.Event;
|
import se.hal.struct.Event;
|
||||||
import se.hal.struct.Sensor;
|
import se.hal.struct.Sensor;
|
||||||
|
|
@ -49,8 +50,7 @@ public class ControllerManager implements HalSensorReportListener,
|
||||||
|
|
||||||
|
|
||||||
/** A map of all instantiated controllers **/
|
/** A map of all instantiated controllers **/
|
||||||
private HashMap<Class,Object> controllerMap = new HashMap<>();
|
private HashMap<Class,HalAbstractController> controllerMap = new HashMap<>();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////// SENSORS ///////////////////////////////////
|
/////////////////////////////// SENSORS ///////////////////////////////////
|
||||||
|
|
@ -332,6 +332,13 @@ public class ControllerManager implements HalSensorReportListener,
|
||||||
|
|
||||||
/////////////////////////////// GENERAL ///////////////////////////////////
|
/////////////////////////////// GENERAL ///////////////////////////////////
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return all instantiated controllers.
|
||||||
|
*/
|
||||||
|
public List<HalAbstractController> getControllers() {
|
||||||
|
return new ArrayList(controllerMap.values());
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void preConfigurationAction(Configurator configurator, Object obj) {
|
public void preConfigurationAction(Configurator configurator, Object obj) {
|
||||||
if(obj instanceof HalSensorConfig) {
|
if(obj instanceof HalSensorConfig) {
|
||||||
|
|
@ -368,38 +375,40 @@ public class ControllerManager implements HalSensorReportListener,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private <T> T getControllerInstance(Class<T> c){
|
private <T extends HalAbstractController> T getControllerInstance(Class<T> c){
|
||||||
Object controller;
|
HalAbstractController controller;
|
||||||
if (controllerMap.containsKey(c))
|
|
||||||
|
if (controllerMap.containsKey(c)) {
|
||||||
controller = controllerMap.get(c);
|
controller = controllerMap.get(c);
|
||||||
else {
|
} else {
|
||||||
// Instantiate controller
|
|
||||||
try {
|
try {
|
||||||
|
// Instantiate controller
|
||||||
controller = c.newInstance();
|
controller = c.newInstance();
|
||||||
|
|
||||||
if (controller instanceof HalAutoScannableController &&
|
if (controller instanceof HalAutoScannableController &&
|
||||||
! ((HalAutoScannableController)controller).isAvailable()) {
|
! ((HalAutoScannableController) controller).isAvailable()) {
|
||||||
logger.warning("Controller is not ready: "+c.getName());
|
logger.warning("Controller is not ready: " + c.getName());
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
logger.info("Instantiating new controller: " + c.getName());
|
logger.info("Instantiating new controller: " + c.getName());
|
||||||
|
controller.initialize();
|
||||||
|
|
||||||
if(controller instanceof HalSensorController) {
|
if(controller instanceof HalSensorController) {
|
||||||
((HalSensorController) controller).setListener(this);
|
((HalSensorController) controller).setListener(this);
|
||||||
((HalSensorController) controller).initialize();
|
|
||||||
}
|
}
|
||||||
if(controller instanceof HalEventController) {
|
if(controller instanceof HalEventController) {
|
||||||
((HalEventController) controller).setListener(this);
|
((HalEventController) controller).setListener(this);
|
||||||
if( ! (controller instanceof HalSensorController))
|
|
||||||
((HalEventController) controller).initialize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
controllerMap.put(c, controller);
|
controllerMap.put(c, controller);
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
logger.log(Level.SEVERE, "Unable to instantiate controller: "+c.getName(), e);
|
logger.log(Level.SEVERE, "Unable to instantiate controller: " + c.getName(), e);
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (T)controller;
|
|
||||||
|
return (T) controller;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeControllerIfEmpty(Object controller){
|
private void removeControllerIfEmpty(Object controller){
|
||||||
|
|
@ -414,7 +423,7 @@ public class ControllerManager implements HalSensorReportListener,
|
||||||
|
|
||||||
if(size < 0){
|
if(size < 0){
|
||||||
// Remove controller as it has no more registered sensors
|
// Remove controller as it has no more registered sensors
|
||||||
logger.info("Closing controller as it has no more registered devices: "+controller.getClass().getName());
|
logger.info("Closing controller as it has no more registered devices: " + controller.getClass().getName());
|
||||||
controllerMap.remove(controller.getClass());
|
controllerMap.remove(controller.getClass());
|
||||||
|
|
||||||
if(controller instanceof HalSensorController)
|
if(controller instanceof HalSensorController)
|
||||||
|
|
@ -425,8 +434,6 @@ public class ControllerManager implements HalSensorReportListener,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static void initialize(PluginManager pluginManager){
|
public static void initialize(PluginManager pluginManager){
|
||||||
ControllerManager manager = new ControllerManager();
|
ControllerManager manager = new ControllerManager();
|
||||||
|
|
||||||
|
|
@ -440,10 +447,12 @@ public class ControllerManager implements HalSensorReportListener,
|
||||||
manager.addAvailableEvent(it.next());
|
manager.addAvailableEvent(it.next());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Iterator<Class<? extends HalAutoScannableController>> it=
|
for (Iterator<Class<? extends HalAutoScannableController>> it = pluginManager.getClassIterator(HalAutoScannableController.class);
|
||||||
pluginManager.getClassIterator(HalAutoScannableController.class);
|
|
||||||
it.hasNext(); ){
|
it.hasNext(); ){
|
||||||
manager.getControllerInstance(it.next()); // Instantiate controller
|
Class controller = it.next();
|
||||||
|
|
||||||
|
if (controller.isAssignableFrom(HalAbstractController.class))
|
||||||
|
manager.getControllerInstance(controller); // Instantiate controller
|
||||||
}
|
}
|
||||||
|
|
||||||
instance = manager;
|
instance = manager;
|
||||||
|
|
@ -453,5 +462,4 @@ public class ControllerManager implements HalSensorReportListener,
|
||||||
public static ControllerManager getInstance(){
|
public static ControllerManager getInstance(){
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -172,7 +172,7 @@ public class HalContext {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public static HashMap<String,String> getProperties() {
|
public static Map<String,String> getProperties() {
|
||||||
HashMap map = new HashMap();
|
HashMap map = new HashMap();
|
||||||
map.putAll(fileConf);
|
map.putAll(fileConf);
|
||||||
map.putAll(dbConf);
|
map.putAll(dbConf);
|
||||||
|
|
|
||||||
49
src/se/hal/intf/HalAbstractController.java
Normal file
49
src/se/hal/intf/HalAbstractController.java
Normal file
|
|
@ -0,0 +1,49 @@
|
||||||
|
/*
|
||||||
|
* The MIT License (MIT)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 Ziver Koc
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package se.hal.intf;
|
||||||
|
|
||||||
|
public interface HalAbstractController {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The framework might create dummy objects so any type of
|
||||||
|
* resource initialization should be handled in this method
|
||||||
|
* and not in the constructor.
|
||||||
|
*/
|
||||||
|
void initialize() throws Exception;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the number of registered devices.
|
||||||
|
*/
|
||||||
|
int size();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close any resources associated with this controller.
|
||||||
|
* This method could be called multiple times, first time
|
||||||
|
* should be handled as normal any subsequent calls should be ignored.
|
||||||
|
*/
|
||||||
|
void close();
|
||||||
|
}
|
||||||
|
|
@ -1,13 +1,6 @@
|
||||||
package se.hal.intf;
|
package se.hal.intf;
|
||||||
|
|
||||||
public interface HalEventController {
|
public interface HalEventController extends HalAbstractController {
|
||||||
|
|
||||||
/**
|
|
||||||
* The framework might create dummy objects so any type of
|
|
||||||
* resource initialization should be handled in this method
|
|
||||||
* and not in the constructor.
|
|
||||||
*/
|
|
||||||
void initialize() throws Exception;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will register an event type to be handled by this controller
|
* Will register an event type to be handled by this controller
|
||||||
|
|
@ -26,21 +19,8 @@ public interface HalEventController {
|
||||||
*/
|
*/
|
||||||
void send(HalEventConfig eventConfig, HalEventData eventData);
|
void send(HalEventConfig eventConfig, HalEventData eventData);
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the number of registered objects
|
|
||||||
*/
|
|
||||||
int size();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a listener that will receive all reports from the the registered Events
|
* Set a listener that will receive all reports from the the registered Events
|
||||||
*/
|
*/
|
||||||
void setListener(HalEventReportListener listener);
|
void setListener(HalEventReportListener listener);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close any resources associated with this controller.
|
|
||||||
* This method could be called multiple times, first time
|
|
||||||
* should be handled as normal any subsequent calls should be ignored.
|
|
||||||
*/
|
|
||||||
void close();
|
|
||||||
}
|
}
|
||||||
|
|
@ -1,13 +1,6 @@
|
||||||
package se.hal.intf;
|
package se.hal.intf;
|
||||||
|
|
||||||
public interface HalSensorController {
|
public interface HalSensorController extends HalAbstractController {
|
||||||
|
|
||||||
/**
|
|
||||||
* The framework might create dummy objects so any type of
|
|
||||||
* resource initialization should be handled in this method
|
|
||||||
* and not in the constructor.
|
|
||||||
*/
|
|
||||||
void initialize() throws Exception;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Will register a sensor type to be handled by this controller
|
* Will register a sensor type to be handled by this controller
|
||||||
|
|
@ -20,21 +13,8 @@ public interface HalSensorController {
|
||||||
*/
|
*/
|
||||||
void deregister(HalSensorConfig sensorConfig);
|
void deregister(HalSensorConfig sensorConfig);
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the number of registered objects
|
|
||||||
*/
|
|
||||||
int size();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set a listener that will receive all reports from the the registered Sensors
|
* Set a listener that will receive all reports from the the registered Sensors
|
||||||
*/
|
*/
|
||||||
void setListener(HalSensorReportListener listener);
|
void setListener(HalSensorReportListener listener);
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Close any resources associated with this controller.
|
|
||||||
* This method could be called multiple times, first time
|
|
||||||
* should be handled as normal any subsequent calls should be ignored.
|
|
||||||
*/
|
|
||||||
void close();
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
package se.hal.page;
|
package se.hal.page;
|
||||||
|
|
||||||
|
import se.hal.ControllerManager;
|
||||||
import se.hal.HalContext;
|
import se.hal.HalContext;
|
||||||
import se.hal.HalServer;
|
import se.hal.HalServer;
|
||||||
import se.hal.intf.HalWebPage;
|
import se.hal.intf.HalWebPage;
|
||||||
|
|
@ -43,7 +44,7 @@ public class PluginConfigWebPage extends HalWebPage {
|
||||||
|
|
||||||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
||||||
tmpl.set("plugins", HalServer.getPlugins());
|
tmpl.set("plugins", HalServer.getPlugins());
|
||||||
|
tmpl.set("controllers", ControllerManager.getInstance().getControllers());
|
||||||
return tmpl;
|
return tmpl;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,7 @@ public class PropertyConfigWebPage extends HalWebPage {
|
||||||
Map<String, String> request)
|
Map<String, String> request)
|
||||||
throws Exception{
|
throws Exception{
|
||||||
|
|
||||||
DBConnection db = HalContext.getDB();
|
Map<String,String> properties = HalContext.getProperties();
|
||||||
|
|
||||||
HashMap properties = HalContext.getProperties();
|
|
||||||
|
|
||||||
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
Templator tmpl = new Templator(FileUtil.find(TEMPLATE));
|
||||||
tmpl.set("properties", properties.entrySet());
|
tmpl.set("properties", properties.entrySet());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue