]> git.basschouten.com Git - openhab-addons.git/commitdiff
[powermax] Use ThingHandlerService for discovery (#9083)
authorlolodomo <lg.hc@free.fr>
Sat, 21 Nov 2020 03:18:16 +0000 (04:18 +0100)
committerGitHub <noreply@github.com>
Sat, 21 Nov 2020 03:18:16 +0000 (19:18 -0800)
Signed-off-by: Laurent Garnier <lg.hc@free.fr>
bundles/org.openhab.binding.powermax/src/main/java/org/openhab/binding/powermax/internal/PowermaxHandlerFactory.java
bundles/org.openhab.binding.powermax/src/main/java/org/openhab/binding/powermax/internal/discovery/PowermaxDiscoveryService.java
bundles/org.openhab.binding.powermax/src/main/java/org/openhab/binding/powermax/internal/handler/PowermaxBridgeHandler.java
bundles/org.openhab.binding.powermax/src/main/java/org/openhab/binding/powermax/internal/handler/PowermaxThingHandler.java
bundles/org.openhab.binding.powermax/src/main/java/org/openhab/binding/powermax/internal/state/PowermaxPanelSettingsListener.java

index e8be599134e875ca83ca93704fd93462de3bad5a..ffa618f5383cda687447b9f13a5c963f24d04b0e 100644 (file)
@@ -14,17 +14,11 @@ package org.openhab.binding.powermax.internal;
 
 import static org.openhab.binding.powermax.internal.PowermaxBindingConstants.*;
 
-import java.util.HashMap;
-import java.util.Hashtable;
-import java.util.Map;
-
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
-import org.openhab.binding.powermax.internal.discovery.PowermaxDiscoveryService;
 import org.openhab.binding.powermax.internal.handler.PowermaxBridgeHandler;
 import org.openhab.binding.powermax.internal.handler.PowermaxThingHandler;
 import org.openhab.core.config.core.Configuration;
-import org.openhab.core.config.discovery.DiscoveryService;
 import org.openhab.core.i18n.TimeZoneProvider;
 import org.openhab.core.io.transport.serial.SerialPortManager;
 import org.openhab.core.thing.Bridge;
@@ -34,7 +28,6 @@ import org.openhab.core.thing.ThingUID;
 import org.openhab.core.thing.binding.BaseThingHandlerFactory;
 import org.openhab.core.thing.binding.ThingHandler;
 import org.openhab.core.thing.binding.ThingHandlerFactory;
-import org.osgi.framework.ServiceRegistration;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
 import org.osgi.service.component.annotations.Reference;
@@ -49,8 +42,6 @@ import org.osgi.service.component.annotations.Reference;
 @Component(service = ThingHandlerFactory.class, configurationPid = "binding.powermax")
 public class PowermaxHandlerFactory extends BaseThingHandlerFactory {
 
-    private final Map<ThingUID, ServiceRegistration<?>> discoveryServiceRegs = new HashMap<>();
-
     private final SerialPortManager serialPortManager;
     private final TimeZoneProvider timeZoneProvider;
 
@@ -89,40 +80,11 @@ public class PowermaxHandlerFactory extends BaseThingHandlerFactory {
         ThingTypeUID thingTypeUID = thing.getThingTypeUID();
 
         if (SUPPORTED_BRIDGE_TYPES_UIDS.contains(thingTypeUID)) {
-            PowermaxBridgeHandler handler = new PowermaxBridgeHandler((Bridge) thing, serialPortManager);
-            registerDiscoveryService(handler);
-            return handler;
+            return new PowermaxBridgeHandler((Bridge) thing, serialPortManager);
         } else if (SUPPORTED_THING_TYPES_UIDS.contains(thingTypeUID)) {
             return new PowermaxThingHandler(thing, timeZoneProvider);
         }
 
         return null;
     }
-
-    @Override
-    protected void removeHandler(ThingHandler thingHandler) {
-        if (thingHandler instanceof PowermaxBridgeHandler) {
-            // remove discovery service, if bridge handler is removed
-            unregisterDiscoveryService((PowermaxBridgeHandler) thingHandler);
-        }
-    }
-
-    private synchronized void registerDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
-        PowermaxDiscoveryService discoveryService = new PowermaxDiscoveryService(bridgeHandler);
-        discoveryService.activate();
-        discoveryServiceRegs.put(bridgeHandler.getThing().getUID(),
-                bundleContext.registerService(DiscoveryService.class.getName(), discoveryService, new Hashtable<>()));
-    }
-
-    private synchronized void unregisterDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
-        ServiceRegistration<?> serviceReg = discoveryServiceRegs.remove(bridgeHandler.getThing().getUID());
-        if (serviceReg != null) {
-            PowermaxDiscoveryService service = (PowermaxDiscoveryService) bundleContext
-                    .getService(serviceReg.getReference());
-            serviceReg.unregister();
-            if (service != null) {
-                service.deactivate();
-            }
-        }
-    }
 }
index d762ece969d60054b3cd023b184a756669467246..da953e8f00bc5a73b28f6df82de3903f25615c77 100644 (file)
@@ -16,6 +16,8 @@ import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.powermax.internal.PowermaxBindingConstants;
 import org.openhab.binding.powermax.internal.config.PowermaxX10Configuration;
 import org.openhab.binding.powermax.internal.config.PowermaxZoneConfiguration;
@@ -31,6 +33,7 @@ import org.openhab.core.config.discovery.DiscoveryResultBuilder;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingUID;
 import org.openhab.core.thing.binding.ThingHandler;
+import org.openhab.core.thing.binding.ThingHandlerService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,28 +42,47 @@ import org.slf4j.LoggerFactory;
  * all enrolled zones and X10 devices
  *
  * @author Laurent Garnier - Initial contribution
+ * @author Laurent Garnier - Use ThingHandlerService
  */
-public class PowermaxDiscoveryService extends AbstractDiscoveryService implements PowermaxPanelSettingsListener {
+@NonNullByDefault
+public class PowermaxDiscoveryService extends AbstractDiscoveryService
+        implements PowermaxPanelSettingsListener, ThingHandlerService {
 
     private final Logger logger = LoggerFactory.getLogger(PowermaxDiscoveryService.class);
 
     private static final int SEARCH_TIME = 5;
 
-    private PowermaxBridgeHandler bridgeHandler;
+    private @Nullable PowermaxBridgeHandler bridgeHandler;
 
     /**
      * Creates a PowermaxDiscoveryService with background discovery disabled.
      */
-    public PowermaxDiscoveryService(PowermaxBridgeHandler bridgeHandler) {
+    public PowermaxDiscoveryService() {
         super(PowermaxBindingConstants.SUPPORTED_THING_TYPES_UIDS, SEARCH_TIME, true);
-        this.bridgeHandler = bridgeHandler;
+    }
+
+    @Override
+    public void setThingHandler(ThingHandler handler) {
+        if (handler instanceof PowermaxBridgeHandler) {
+            bridgeHandler = (PowermaxBridgeHandler) handler;
+        }
+    }
+
+    @Override
+    public @Nullable ThingHandler getThingHandler() {
+        return bridgeHandler;
     }
 
     /**
      * Activates the Discovery Service.
      */
+    @Override
     public void activate() {
-        bridgeHandler.registerPanelSettingsListener(this);
+        super.activate(null);
+        PowermaxBridgeHandler handler = bridgeHandler;
+        if (handler != null) {
+            handler.registerPanelSettingsListener(this);
+        }
     }
 
     /**
@@ -68,30 +90,38 @@ public class PowermaxDiscoveryService extends AbstractDiscoveryService implement
      */
     @Override
     public void deactivate() {
-        bridgeHandler.unregisterPanelSettingsListener(this);
+        PowermaxBridgeHandler handler = bridgeHandler;
+        if (handler != null) {
+            handler.unregisterPanelSettingsListener(this);
+        }
+        super.deactivate();
     }
 
     @Override
     protected void startScan() {
         logger.debug("Updating discovered things (new scan)");
-        updateFromSettings(bridgeHandler.getPanelSettings());
+        PowermaxBridgeHandler handler = bridgeHandler;
+        if (handler != null) {
+            updateFromSettings(handler.getPanelSettings());
+        }
     }
 
     @Override
-    public void onPanelSettingsUpdated(PowermaxPanelSettings settings) {
+    public void onPanelSettingsUpdated(@Nullable PowermaxPanelSettings settings) {
         logger.debug("Updating discovered things (global settings updated)");
         updateFromSettings(settings);
     }
 
     @Override
-    public void onZoneSettingsUpdated(int zoneNumber, PowermaxPanelSettings settings) {
+    public void onZoneSettingsUpdated(int zoneNumber, @Nullable PowermaxPanelSettings settings) {
         logger.debug("Updating discovered things (zone {} updated)", zoneNumber);
         PowermaxZoneSettings zoneSettings = (settings == null) ? null : settings.getZoneSettings(zoneNumber);
         updateFromZoneSettings(zoneNumber, zoneSettings);
     }
 
-    private void updateFromSettings(PowermaxPanelSettings settings) {
-        if (settings != null) {
+    private void updateFromSettings(@Nullable PowermaxPanelSettings settings) {
+        PowermaxBridgeHandler handler = bridgeHandler;
+        if (handler != null && settings != null) {
             long beforeUpdate = new Date().getTime();
 
             for (int i = 1; i <= settings.getNbZones(); i++) {
@@ -105,14 +135,15 @@ public class PowermaxDiscoveryService extends AbstractDiscoveryService implement
             }
 
             // Remove not updated discovered things
-            removeOlderResults(beforeUpdate, bridgeHandler.getThing().getUID());
+            removeOlderResults(beforeUpdate, handler.getThing().getUID());
         }
     }
 
-    private void updateFromZoneSettings(int zoneNumber, PowermaxZoneSettings zoneSettings) {
-        if (zoneSettings != null) {
+    private void updateFromZoneSettings(int zoneNumber, @Nullable PowermaxZoneSettings zoneSettings) {
+        PowermaxBridgeHandler handler = bridgeHandler;
+        if (handler != null && zoneSettings != null) {
             // Prevent for adding already known zone
-            for (Thing thing : bridgeHandler.getThing().getThings()) {
+            for (Thing thing : handler.getThing().getThings()) {
                 ThingHandler thingHandler = thing.getHandler();
                 if (thing.getThingTypeUID().equals(PowermaxBindingConstants.THING_TYPE_ZONE)
                         && thingHandler instanceof PowermaxThingHandler) {
@@ -123,7 +154,7 @@ public class PowermaxDiscoveryService extends AbstractDiscoveryService implement
                 }
             }
 
-            ThingUID bridgeUID = bridgeHandler.getThing().getUID();
+            ThingUID bridgeUID = handler.getThing().getUID();
             ThingUID thingUID = new ThingUID(PowermaxBindingConstants.THING_TYPE_ZONE, bridgeUID,
                     String.valueOf(zoneNumber));
             String sensorType = zoneSettings.getSensorType();
@@ -144,10 +175,11 @@ public class PowermaxDiscoveryService extends AbstractDiscoveryService implement
         }
     }
 
-    private void updateFromDeviceSettings(int deviceNumber, PowermaxX10Settings deviceSettings) {
-        if (deviceSettings != null && deviceSettings.isEnabled()) {
+    private void updateFromDeviceSettings(int deviceNumber, @Nullable PowermaxX10Settings deviceSettings) {
+        PowermaxBridgeHandler handler = bridgeHandler;
+        if (handler != null && deviceSettings != null && deviceSettings.isEnabled()) {
             // Prevent for adding already known X10 device
-            for (Thing thing : bridgeHandler.getThing().getThings()) {
+            for (Thing thing : handler.getThing().getThings()) {
                 ThingHandler thingHandler = thing.getHandler();
                 if (thing.getThingTypeUID().equals(PowermaxBindingConstants.THING_TYPE_X10)
                         && thingHandler instanceof PowermaxThingHandler) {
@@ -158,7 +190,7 @@ public class PowermaxDiscoveryService extends AbstractDiscoveryService implement
                 }
             }
 
-            ThingUID bridgeUID = bridgeHandler.getThing().getUID();
+            ThingUID bridgeUID = handler.getThing().getUID();
             ThingUID thingUID = new ThingUID(PowermaxBindingConstants.THING_TYPE_X10, bridgeUID,
                     String.valueOf(deviceNumber));
             String name = (deviceSettings.getName() != null) ? deviceSettings.getName()
index b05823453834065e47b817fd9a888b43a8679fde..2095cc8ddfeb6bc6d866ed751b5abee4fb6307af 100644 (file)
@@ -14,6 +14,8 @@ package org.openhab.binding.powermax.internal.handler;
 
 import static org.openhab.binding.powermax.internal.PowermaxBindingConstants.*;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.EventObject;
 import java.util.List;
 import java.util.Map;
@@ -23,6 +25,7 @@ import java.util.concurrent.TimeUnit;
 
 import org.openhab.binding.powermax.internal.config.PowermaxIpConfiguration;
 import org.openhab.binding.powermax.internal.config.PowermaxSerialConfiguration;
+import org.openhab.binding.powermax.internal.discovery.PowermaxDiscoveryService;
 import org.openhab.binding.powermax.internal.message.PowermaxCommManager;
 import org.openhab.binding.powermax.internal.state.PowermaxArmMode;
 import org.openhab.binding.powermax.internal.state.PowermaxPanelSettings;
@@ -40,6 +43,7 @@ import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingStatus;
 import org.openhab.core.thing.ThingStatusDetail;
 import org.openhab.core.thing.binding.BaseBridgeHandler;
+import org.openhab.core.thing.binding.ThingHandlerService;
 import org.openhab.core.types.Command;
 import org.openhab.core.types.RefreshType;
 import org.slf4j.Logger;
@@ -95,6 +99,11 @@ public class PowermaxBridgeHandler extends BaseBridgeHandler implements Powermax
         this.serialPortManager = serialPortManager;
     }
 
+    @Override
+    public Collection<Class<? extends ThingHandlerService>> getServices() {
+        return Collections.singleton(PowermaxDiscoveryService.class);
+    }
+
     public PowermaxState getCurrentState() {
         return currentState;
     }
index 8bf9dc1bb1e036b35c583f7949a9e8a2fdeb2827..3c4e32dfedcddbb15cfc10dff03377834af90218 100644 (file)
@@ -17,6 +17,7 @@ import static org.openhab.binding.powermax.internal.PowermaxBindingConstants.*;
 import java.time.Instant;
 import java.time.ZonedDateTime;
 
+import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.powermax.internal.config.PowermaxX10Configuration;
 import org.openhab.binding.powermax.internal.config.PowermaxZoneConfiguration;
 import org.openhab.binding.powermax.internal.state.PowermaxPanelSettings;
@@ -202,7 +203,7 @@ public class PowermaxThingHandler extends BaseThingHandler implements PowermaxPa
     }
 
     @Override
-    public void onPanelSettingsUpdated(PowermaxPanelSettings settings) {
+    public void onPanelSettingsUpdated(@Nullable PowermaxPanelSettings settings) {
         if (getThing().getThingTypeUID().equals(THING_TYPE_ZONE)) {
             PowermaxZoneConfiguration config = getConfigAs(PowermaxZoneConfiguration.class);
             onZoneSettingsUpdated(config.zoneNumber, settings);
@@ -234,7 +235,7 @@ public class PowermaxThingHandler extends BaseThingHandler implements PowermaxPa
     }
 
     @Override
-    public void onZoneSettingsUpdated(int zoneNumber, PowermaxPanelSettings settings) {
+    public void onZoneSettingsUpdated(int zoneNumber, @Nullable PowermaxPanelSettings settings) {
         if (getThing().getThingTypeUID().equals(THING_TYPE_ZONE)) {
             PowermaxZoneConfiguration config = getConfigAs(PowermaxZoneConfiguration.class);
             if (zoneNumber == config.zoneNumber) {
index b2d930b3b452cb73137cfa0913ec2cc7aa1b50fc..30d6e25660cbbaa35c572a6ab45e27787dd88194 100644 (file)
  */
 package org.openhab.binding.powermax.internal.state;
 
+import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.eclipse.jdt.annotation.Nullable;
+
 /**
  * The {@link PowermaxPanelSettingsListener} is a listener for updated
  * alarm panel settings
  *
  * @author Laurent Garnier - Initial contribution
  */
+@NonNullByDefault
 public interface PowermaxPanelSettingsListener {
 
     /**
@@ -26,7 +30,7 @@ public interface PowermaxPanelSettingsListener {
      *
      * @param settings the updated alarm panel settings or null if the panel settings are unknown
      */
-    public void onPanelSettingsUpdated(PowermaxPanelSettings settings);
+    public void onPanelSettingsUpdated(@Nullable PowermaxPanelSettings settings);
 
     /**
      * This method is called when the bridge thing handler identifies
@@ -35,5 +39,5 @@ public interface PowermaxPanelSettingsListener {
      * @param zoneNumber the zone number
      * @param settings the updated alarm panel settings or null if the panel settings are unknown
      */
-    public void onZoneSettingsUpdated(int zoneNumber, PowermaxPanelSettings settings);
+    public void onZoneSettingsUpdated(int zoneNumber, @Nullable PowermaxPanelSettings settings);
 }