From 267054e4ba926bf4764e27048a6e3c2d1a6cc893 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Wed, 9 Jun 2021 23:27:42 +0200 Subject: [PATCH] Changed controllers to be singleton in the manager and moved isAvailable to AbstractController --- .../se/hal/intf/HalAbstractController.java | 14 ++++++-- .../intf/HalAbstractControllerManager.java | 32 ++++++++++--------- .../se/hal/intf/HalAutostartController.java | 5 --- .../hal/plugin/netscan/NetScanController.java | 3 +- .../se/hal/plugin/netscan/NetworkDevice.java | 4 +-- 5 files changed, 31 insertions(+), 27 deletions(-) diff --git a/hal-core/src/se/hal/intf/HalAbstractController.java b/hal-core/src/se/hal/intf/HalAbstractController.java index 7f2c05a7..aea8acaf 100644 --- a/hal-core/src/se/hal/intf/HalAbstractController.java +++ b/hal-core/src/se/hal/intf/HalAbstractController.java @@ -27,6 +27,14 @@ package se.hal.intf; public interface HalAbstractController { + /** + * Indicates if the controller has all the configuration + * data and resources needed to be able to initialize correctly. + */ + default boolean isAvailable() { + return true; + } + /** * The framework might create dummy objects so any type of * resource initialization should be handled in this method @@ -35,13 +43,13 @@ public interface HalAbstractController { void initialize() throws Exception; /** - * Will register an device type to be handled by this controller + * Will register an device type to be handled by this controller. */ void register(HalDeviceConfig deviceConfig); /** * Deregisters an device from this controller, the controller - * will no longer handle that type of event + * will no longer handle that type of event. */ void deregister(HalDeviceConfig deviceConfig); @@ -51,7 +59,7 @@ public interface HalAbstractController { int size(); /** - * Set a listener that will receive all reports from the the registered devices + * Set a listener that will receive all reports from the the registered devices. */ void setListener(HalDeviceReportListener listener); diff --git a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java index 072de6f7..f6f44467 100644 --- a/hal-core/src/se/hal/intf/HalAbstractControllerManager.java +++ b/hal-core/src/se/hal/intf/HalAbstractControllerManager.java @@ -19,7 +19,7 @@ public abstract class HalAbstractControllerManager controllerMap = new ConcurrentHashMap<>(); + protected static Map controllerMap; /** All available sensor plugins **/ protected List> availableDeviceConfigs = new ArrayList<>(); @@ -39,16 +39,16 @@ public abstract class HalAbstractControllerManager deviceConfig : getAvailableDeviceConfigs()){ - try { - @SuppressWarnings("unchecked") - Class controllerClass = (Class) deviceConfig.getDeclaredConstructor().newInstance().getDeviceControllerClass(); + // Instantiate autostart controllers, but only the first time - if (controllerClass.isAssignableFrom(HalAutostartController.class)) { - getControllerInstance(controllerClass); // Instantiate controller + synchronized (this) { + if (controllerMap == null) { + controllerMap = new ConcurrentHashMap<>(); + + for (Iterator> it = pluginManager.getClassIterator(HalAutostartController.class); it.hasNext(); ) { + Class controller = it.next(); + getControllerInstance(controller); // Instantiate controller } - } catch (Exception e) { - logger.log(Level.WARNING, "Unable to instantiate Device Config for controller check: " + deviceConfig.getClass()); } } } @@ -118,7 +118,7 @@ public abstract class HalAbstractControllerManager getDeviceDataClass() { - return OnOffEventData.class; + return AvailabilityEventData.class; }