]> git.basschouten.com Git - openhab-addons.git/commitdiff
[avmfritz] Avoid a hidden NPE when getIdentifier() of an uninitialized ThingHandler...
authorChristoph Weitkamp <github@christophweitkamp.de>
Mon, 16 Nov 2020 17:09:30 +0000 (18:09 +0100)
committerGitHub <noreply@github.com>
Mon, 16 Nov 2020 17:09:30 +0000 (18:09 +0100)
* Avoid a hidden NPE when getIdentifier() of an uninitialized ThingHandler is called
* Fixed Powerline546EHandler

Signed-off-by: Christoph Weitkamp <github@christophweitkamp.de>
bundles/org.openhab.binding.avmfritz/src/main/java/org/openhab/binding/avmfritz/internal/handler/AVMFritzBaseBridgeHandler.java
bundles/org.openhab.binding.avmfritz/src/main/java/org/openhab/binding/avmfritz/internal/handler/AVMFritzBaseThingHandler.java
bundles/org.openhab.binding.avmfritz/src/main/java/org/openhab/binding/avmfritz/internal/handler/Powerline546EHandler.java

index 9a4ac1d734274e0d50312f09b2741735f0683073..1639a24d54f83d7de32db639aa8c3030a02edf8e 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
@@ -126,7 +125,7 @@ public abstract class AVMFritzBaseBridgeHandler extends BaseBridgeHandler {
         AVMFritzBoxConfiguration config = getConfigAs(AVMFritzBoxConfiguration.class);
 
         String localIpAddress = config.ipAddress;
-        if (localIpAddress == null || localIpAddress.trim().isEmpty()) {
+        if (localIpAddress == null || localIpAddress.isBlank()) {
             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
                     "The 'ipAddress' parameter must be configured.");
             configValid = false;
@@ -271,10 +270,8 @@ public abstract class AVMFritzBaseBridgeHandler extends BaseBridgeHandler {
         getThing().getThings().forEach(childThing -> {
             final AVMFritzBaseThingHandler childHandler = (AVMFritzBaseThingHandler) childThing.getHandler();
             if (childHandler != null) {
-                final Optional<AVMFritzBaseModel> optionalDevice = Optional
-                        .ofNullable(deviceIdentifierMap.get(childHandler.getIdentifier()));
-                if (optionalDevice.isPresent()) {
-                    final AVMFritzBaseModel device = optionalDevice.get();
+                final AVMFritzBaseModel device = deviceIdentifierMap.get(childHandler.getIdentifier());
+                if (device != null) {
                     deviceList.remove(device);
                     listeners.forEach(listener -> listener.onDeviceUpdated(childThing.getUID(), device));
                 } else {
index e8c6bcdf24e4aa12f54e7123bb75abba43530ecd..74731db0065901434438d19c9b361b48dc3f190e 100644 (file)
@@ -82,7 +82,7 @@ public abstract class AVMFritzBaseThingHandler extends BaseThingHandler implemen
      * keeps track of the current state for handling of increase/decrease
      */
     private @Nullable AVMFritzBaseModel state;
-    private @NonNullByDefault({}) AVMFritzDeviceConfiguration config;
+    private @Nullable String identifier;
 
     /**
      * Constructor
@@ -95,13 +95,13 @@ public abstract class AVMFritzBaseThingHandler extends BaseThingHandler implemen
 
     @Override
     public void initialize() {
-        config = getConfigAs(AVMFritzDeviceConfiguration.class);
-
-        String newIdentifier = config.ain;
-        if (newIdentifier == null || newIdentifier.trim().isEmpty()) {
+        final AVMFritzDeviceConfiguration config = getConfigAs(AVMFritzDeviceConfiguration.class);
+        final String newIdentifier = config.ain;
+        if (newIdentifier == null || newIdentifier.isBlank()) {
             updateStatus(ThingStatus.OFFLINE, ThingStatusDetail.CONFIGURATION_ERROR,
                     "The 'ain' parameter must be configured.");
         } else {
+            this.identifier = newIdentifier;
             updateStatus(ThingStatus.UNKNOWN);
         }
     }
@@ -472,6 +472,6 @@ public abstract class AVMFritzBaseThingHandler extends BaseThingHandler implemen
      * @return the AIN
      */
     public @Nullable String getIdentifier() {
-        return config.ain;
+        return identifier;
     }
 }
index 6d4a305e8958522726af39f8568d625d51ff9850..089ee9b8123fa59a56d5510e984ff0c4b02d8a86 100644 (file)
@@ -17,7 +17,6 @@ import static org.openhab.binding.avmfritz.internal.AVMFritzBindingConstants.*;
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
-import java.util.Optional;
 import java.util.function.Predicate;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -32,7 +31,6 @@ import org.openhab.binding.avmfritz.internal.dto.PowerMeterModel;
 import org.openhab.binding.avmfritz.internal.dto.SwitchModel;
 import org.openhab.binding.avmfritz.internal.hardware.FritzAhaStatusListener;
 import org.openhab.binding.avmfritz.internal.hardware.FritzAhaWebInterface;
-import org.openhab.core.config.core.Configuration;
 import org.openhab.core.library.types.OnOffType;
 import org.openhab.core.library.types.OpenClosedType;
 import org.openhab.core.library.types.QuantityType;
@@ -72,7 +70,7 @@ public class Powerline546EHandler extends AVMFritzBaseBridgeHandler implements F
      * keeps track of the current state for handling of increase/decrease
      */
     private @Nullable AVMFritzBaseModel state;
-    private @Nullable AVMFritzDeviceConfiguration config;
+    private @Nullable String identifier;
 
     /**
      * Constructor
@@ -86,32 +84,27 @@ public class Powerline546EHandler extends AVMFritzBaseBridgeHandler implements F
 
     @Override
     public void initialize() {
-        config = getConfigAs(AVMFritzDeviceConfiguration.class);
-
-        registerStatusListener(this);
+        final AVMFritzDeviceConfiguration config = getConfigAs(AVMFritzDeviceConfiguration.class);
+        final String newIdentifier = config.ain;
+        if (newIdentifier != null && !newIdentifier.isBlank()) {
+            this.identifier = newIdentifier;
+        }
 
         super.initialize();
     }
 
-    @Override
-    public void dispose() {
-        unregisterStatusListener(this);
-
-        super.dispose();
-    }
-
+    @SuppressWarnings({ "null", "unused" })
     @Override
     public void onDeviceListAdded(List<AVMFritzBaseModel> devicelist) {
-        final String identifier = getIdentifier();
-        final Predicate<AVMFritzBaseModel> predicate = identifier == null ? it -> thing.getUID().equals(getThingUID(it))
-                : it -> identifier.equals(it.getIdentifier());
-        final Optional<AVMFritzBaseModel> optionalDevice = devicelist.stream().filter(predicate).findFirst();
-        if (optionalDevice.isPresent()) {
-            final AVMFritzBaseModel device = optionalDevice.get();
+        final String ain = getIdentifier();
+        final Predicate<AVMFritzBaseModel> predicate = ain == null ? it -> thing.getUID().equals(getThingUID(it))
+                : it -> ain.equals(it.getIdentifier());
+        final AVMFritzBaseModel device = devicelist.stream().filter(predicate).findFirst().orElse(null);
+        if (device != null) {
             devicelist.remove(device);
-            listeners.stream().forEach(listener -> listener.onDeviceUpdated(thing.getUID(), device));
+            onDeviceUpdated(thing.getUID(), device);
         } else {
-            listeners.stream().forEach(listener -> listener.onDeviceGone(thing.getUID()));
+            onDeviceGone(thing.getUID());
         }
         super.onDeviceListAdded(devicelist);
     }
@@ -125,8 +118,8 @@ public class Powerline546EHandler extends AVMFritzBaseBridgeHandler implements F
     public void onDeviceUpdated(ThingUID thingUID, AVMFritzBaseModel device) {
         if (thing.getUID().equals(thingUID)) {
             // save AIN to config for FRITZ!Powerline 546E stand-alone
-            if (config == null) {
-                updateConfiguration(device);
+            if (this.identifier == null) {
+                this.identifier = device.getIdentifier();
             }
 
             logger.debug("Update self '{}' with device model: {}", thingUID, device);
@@ -185,17 +178,6 @@ public class Powerline546EHandler extends AVMFritzBaseBridgeHandler implements F
         updateProperties(editProperties);
     }
 
-    /**
-     * Updates thing configuration.
-     *
-     * @param device the {@link AVMFritzBaseModel}
-     */
-    private void updateConfiguration(AVMFritzBaseModel device) {
-        Configuration editConfig = editConfiguration();
-        editConfig.put(CONFIG_AIN, device.getIdentifier());
-        updateConfiguration(editConfig);
-    }
-
     /**
      * Updates thing channels and creates dynamic channels if missing.
      *
@@ -311,7 +293,6 @@ public class Powerline546EHandler extends AVMFritzBaseBridgeHandler implements F
      * @return the AIN
      */
     public @Nullable String getIdentifier() {
-        AVMFritzDeviceConfiguration localConfig = config;
-        return localConfig != null ? localConfig.ain : null;
+        return identifier;
     }
 }