]> git.basschouten.com Git - openhab-addons.git/commitdiff
Fixes #11054: NoSuchElementException when no functional groups set (#11434)
authorRouven Schürch <803221+ardanedh@users.noreply.github.com>
Mon, 25 Oct 2021 10:01:10 +0000 (12:01 +0200)
committerGitHub <noreply@github.com>
Mon, 25 Oct 2021 10:01:10 +0000 (12:01 +0200)
Signed-off-by: Rouven Schürch <r.schuerch@gmx.ch>
bundles/org.openhab.binding.digitalstrom/src/main/java/org/openhab/binding/digitalstrom/internal/handler/DeviceHandler.java
bundles/org.openhab.binding.digitalstrom/src/main/java/org/openhab/binding/digitalstrom/internal/lib/structure/devices/impl/DeviceImpl.java
bundles/org.openhab.binding.digitalstrom/src/test/java/org/openhab/binding/digitalstrom/internal/lib/structure/devices/impl/DeviceImplTest.java

index 6228b2c98cd5b05eef8aa6e82e1dcff794bdae7b..962657c798944dc7f220b6c6e587675c35f317ef 100644 (file)
@@ -32,6 +32,7 @@ import org.openhab.binding.digitalstrom.internal.lib.structure.devices.Device;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.GeneralDeviceInformation;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.DeviceSceneSpec;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.DeviceStateUpdate;
+import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.ApplicationGroup;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.ChangeableDeviceConfigEnum;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.DeviceBinarayInputEnum;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.OutputModeEnum;
@@ -457,9 +458,11 @@ public class DeviceHandler extends BaseThingHandler implements DeviceStatusListe
                     checkOutputChannel();
                 } else if (this.device.isBlind()) {
                     // load channel for set the angle of jalousie devices
-                    String channelTypeID = DsChannelTypeProvider.getOutputChannelTypeID(
-                            ((Device) device).getFunctionalColorGroup().getColor(), ((Device) device).getOutputMode(),
-                            ((Device) device).getOutputChannels());
+                    ApplicationGroup.Color color = ((Device) device).getFunctionalColorGroup() != null
+                            ? ((Device) device).getFunctionalColorGroup().getColor()
+                            : null;
+                    String channelTypeID = DsChannelTypeProvider.getOutputChannelTypeID(color,
+                            ((Device) device).getOutputMode(), ((Device) device).getOutputChannels());
                     loadOutputChannel(new ChannelTypeUID(BINDING_ID, channelTypeID),
                             DsChannelTypeProvider.getItemType(channelTypeID));
                 }
@@ -713,8 +716,11 @@ public class DeviceHandler extends BaseThingHandler implements DeviceStatusListe
         if (!device.isDeviceWithOutput()) {
             loadOutputChannel(null, null);
         }
-        String channelTypeID = DsChannelTypeProvider.getOutputChannelTypeID(device.getFunctionalColorGroup().getColor(),
-                device.getOutputMode(), device.getOutputChannels());
+        ApplicationGroup.Color color = device.getFunctionalColorGroup() != null
+                ? device.getFunctionalColorGroup().getColor()
+                : null;
+        String channelTypeID = DsChannelTypeProvider.getOutputChannelTypeID(color, device.getOutputMode(),
+                device.getOutputChannels());
         logger.debug("load channel: typeID={}, itemType={}",
                 DsChannelTypeProvider.getOutputChannelTypeID(device.getFunctionalColorGroup().getColor(),
                         device.getOutputMode(), device.getOutputChannels()),
index ccec7c0a566b937b2b4cbd6521f01cad0272eabd..eaf303364875352c213d400701d8d9f84b47bead 100644 (file)
@@ -20,6 +20,7 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Optional;
 import java.util.Set;
 
 import org.openhab.binding.digitalstrom.internal.DigitalSTROMBindingConstants;
@@ -405,7 +406,8 @@ public class DeviceImpl extends AbstractGeneralDeviceInformations implements Dev
 
     @Override
     public synchronized ApplicationGroup getFunctionalColorGroup() {
-        return groupList.stream().findFirst().get();
+        Optional<ApplicationGroup> applicationGroup = groupList.stream().findFirst();
+        return applicationGroup.isPresent() ? applicationGroup.get() : null;
     }
 
     @Override
index b3ea80a65fb1711db7e57f154272507418766333..269f8c87962702770662263f747c0e5cb04d8587 100644 (file)
@@ -14,15 +14,18 @@ package org.openhab.binding.digitalstrom.internal.lib.structure.devices.impl;
 
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.core.Is.*;
+import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
+import org.junit.jupiter.api.DisplayName;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.junit.jupiter.MockitoExtension;
+import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.ApplicationGroup;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.OutputChannelEnum;
 import org.openhab.binding.digitalstrom.internal.lib.structure.devices.deviceparameters.constants.OutputModeEnum;
 import org.openhab.binding.digitalstrom.internal.lib.util.JsonModel;
@@ -150,6 +153,24 @@ class DeviceImplTest {
         assertThat(deviceImpl.isBlind(), is(true));
     }
 
+    @Test
+    @DisplayName("No functional color group set, expect a null value returned")
+    void noFunctionalColorGroupSet() {
+        DeviceImpl deviceImpl = new DeviceImpl(new JsonObject());
+        ApplicationGroup functionalColorGroup = deviceImpl.getFunctionalColorGroup();
+        assertNull(functionalColorGroup);
+    }
+
+    @Test
+    @DisplayName("Multiple functional color groups set, expect the first group returned which had previously been added")
+    void multipleFunctionalColorGroupSet() {
+        DeviceImpl deviceImpl = new DeviceImpl(new JsonObject());
+        deviceImpl.addGroup(ApplicationGroup.JOKER.getId());
+        deviceImpl.addGroup(ApplicationGroup.ACCESS.getId());
+
+        assertThat(deviceImpl.getFunctionalColorGroup(), is(ApplicationGroup.JOKER));
+    }
+
     private static JsonObject createJsonObject(OutputModeEnum outputMode, List<OutputChannel> channels) {
         JsonModel model = new JsonModel(outputMode.getMode(), channels);