From 907e8ee498b51f6c23dde9436363b5ec96f935f0 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Wed, 9 Dec 2020 00:20:47 +0100 Subject: [PATCH] Fixed synchronization issues --- hal-core/src/se/hal/HalServer.java | 22 ++++++---- .../se/hal/plugin/dummy/DummyController.java | 43 ++++++++++--------- 2 files changed, 37 insertions(+), 28 deletions(-) diff --git a/hal-core/src/se/hal/HalServer.java b/hal-core/src/se/hal/HalServer.java index df468abd..ba927cef 100644 --- a/hal-core/src/se/hal/HalServer.java +++ b/hal-core/src/se/hal/HalServer.java @@ -43,21 +43,30 @@ public class HalServer { public static void main(String[] args) { try { + // ------------------------------------ + // Initialize Hal + // ------------------------------------ + // init logging LogUtil.readConfiguration("logging.properties"); // init DB and other configurations HalContext.initialize(); - DBConnection db = HalContext.getDB(); logger.info("Working directory: " + FileUtil.find(".").getAbsolutePath()); + // init variables + pluginManager = new PluginManager(); + daemonExecutor = Executors.newScheduledThreadPool(1); // We set only one thread for easier troubleshooting + http = new HttpServer(HalContext.getIntegerProperty(HalContext.PROPERTY_HTTP_PORT)); + + DBConnection db = HalContext.getDB(); + // ------------------------------------ - // Init Plugins + // Initialize Plugins // ------------------------------------ logger.info("Looking for plugins."); - pluginManager = new PluginManager(); // Disable plugins based on settings for (PluginData plugin : getAllPlugins()) { @@ -70,7 +79,7 @@ public class HalServer { } // ------------------------------------ - // Init Managers + // Initialize Managers // ------------------------------------ logger.info("Initializing managers."); @@ -102,11 +111,8 @@ public class HalServer { logger.info("Initializing daemons."); - // We set only one thread for easier troubleshooting - daemonExecutor = Executors.newScheduledThreadPool(1); for (Iterator it = pluginManager.getSingletonIterator(HalDaemon.class); it.hasNext(); ) { HalDaemon daemon = it.next(); - logger.info("Registering daemon: " + daemon.getClass()); registerDaemon(daemon); } @@ -120,7 +126,6 @@ public class HalServer { HalWebPage.getRootNav().createSubNav("Events").setWeight(100); HalWebPage.getRootNav().createSubNav("Settings").setWeight(200); - http = new HttpServer(HalContext.getIntegerProperty(HalContext.PROPERTY_HTTP_PORT)); http.setDefaultPage(new HttpFilePage(FileUtil.find(HalContext.RESOURCE_WEB_ROOT))); http.setPage("/", new HttpRedirectPage("/map")); http.setPage(HalAlertManager.getInstance().getUrl(), HalAlertManager.getInstance()); @@ -164,6 +169,7 @@ public class HalServer { public static void registerDaemon(HalDaemon daemon){ + logger.info("Registering daemon: " + daemon.getClass()); daemons.add(daemon); daemon.initiate(daemonExecutor); } diff --git a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyController.java b/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyController.java index 47e49f70..5edbc0ba 100644 --- a/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyController.java +++ b/plugins/hal-dummy/src/se/hal/plugin/dummy/DummyController.java @@ -1,5 +1,6 @@ package se.hal.plugin.dummy; +import se.hal.HalServer; import se.hal.intf.*; import java.util.ArrayList; @@ -7,9 +8,8 @@ import java.util.List; import java.util.concurrent.*; -public class DummyController implements HalSensorController, HalEventController, Runnable { +public class DummyController implements HalSensorController, HalEventController, Runnable, HalDaemon { private List registeredDevices = new ArrayList(); - private ScheduledExecutorService executor; private HalSensorReportListener sensorListener; private HalEventReportListener eventListener; @@ -19,54 +19,57 @@ public class DummyController implements HalSensorController, HalEventController, @Override public void initialize() { - executor = Executors.newScheduledThreadPool(1); + HalServer.registerDaemon(this); + } + + @Override + public void initiate(ScheduledExecutorService executor) { executor.scheduleAtFixedRate(this, 0, 60, TimeUnit.SECONDS); } - @Override - public void run() { - if (registeredDevices != null) { + public synchronized void run() { + try { for (DummyDevice device : registeredDevices) { - if (sensorListener != null) { - HalDeviceData data = device.generateData(); + HalDeviceData data = device.generateData(); - if (data instanceof HalSensorData) { - sensorListener.reportReceived((HalSensorConfig) device, (HalSensorData) data); - } else if (data instanceof HalEventData) { - eventListener.reportReceived((HalEventConfig) device, (HalEventData) data); - } + if (sensorListener != null && data instanceof HalSensorData) { + sensorListener.reportReceived((HalSensorConfig) device, (HalSensorData) data); + } else if (eventListener != null && data instanceof HalEventData) { + eventListener.reportReceived((HalEventConfig) device, (HalEventData) data); } } + } catch (Exception e) { + e.printStackTrace(); } } @Override - public void register(HalSensorConfig sensorConfig) { + public synchronized void register(HalSensorConfig sensorConfig) { if (sensorConfig instanceof DummyDevice) { registeredDevices.add((DummyDevice) sensorConfig); } } @Override - public void register(HalEventConfig eventConfig) { + public synchronized void register(HalEventConfig eventConfig) { if (eventConfig instanceof DummyDevice) { registeredDevices.add((DummyDevice) eventConfig); } } @Override - public void deregister(HalSensorConfig sensorConfig) { + public synchronized void deregister(HalSensorConfig sensorConfig) { registeredDevices.remove(sensorConfig); } @Override - public void deregister(HalEventConfig eventConfig) { + public synchronized void deregister(HalEventConfig eventConfig) { registeredDevices.remove(eventConfig); } @Override - public void send(HalEventConfig eventConfig, HalEventData eventData) { + public synchronized void send(HalEventConfig eventConfig, HalEventData eventData) { // Nothing to do as this is a dummy } @@ -82,7 +85,7 @@ public class DummyController implements HalSensorController, HalEventController, public void setListener(HalEventReportListener listener) { eventListener = listener; } @Override - public void close() { - executor.shutdown(); + public synchronized void close() { + registeredDevices = new ArrayList(); } }