]> git.basschouten.com Git - openhab-addons.git/commitdiff
[wundergroundupdatereceiver] Check whether the thing is managed (#12998)
authorDaniel Demus <daniel-github@demus.dk>
Fri, 24 Jun 2022 17:04:29 +0000 (19:04 +0200)
committerGitHub <noreply@github.com>
Fri, 24 Jun 2022 17:04:29 +0000 (19:04 +0200)
Ie. created in the UI or by discovery
Signed-off-by: Daniel Demus <daniel-github@demus.dk>
bundles/org.openhab.binding.wundergroundupdatereceiver/src/main/java/org/openhab/binding/wundergroundupdatereceiver/internal/WundergroundUpdateReceiverHandler.java
bundles/org.openhab.binding.wundergroundupdatereceiver/src/main/java/org/openhab/binding/wundergroundupdatereceiver/internal/WundergroundUpdateReceiverHandlerFactory.java
bundles/org.openhab.binding.wundergroundupdatereceiver/src/test/java/org/openhab/binding/wundergroundupdatereceiver/internal/WundergroundUpdateReceiverDiscoveryServiceTest.java
bundles/org.openhab.binding.wundergroundupdatereceiver/src/test/java/org/openhab/binding/wundergroundupdatereceiver/internal/WundergroundUpdateReceiverServletTest.java

index 82e828fe6b55d67d458c9a265c6590e4fe6d2685..09fe7e0baa78811c0bc838b188898d47a654b449 100644 (file)
@@ -33,6 +33,7 @@ import org.openhab.core.library.types.StringType;
 import org.openhab.core.thing.Channel;
 import org.openhab.core.thing.ChannelGroupUID;
 import org.openhab.core.thing.ChannelUID;
+import org.openhab.core.thing.ManagedThingProvider;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingStatus;
 import org.openhab.core.thing.ThingStatusDetail;
@@ -63,6 +64,7 @@ public class WundergroundUpdateReceiverHandler extends BaseThingHandler {
     private final WundergroundUpdateReceiverDiscoveryService discoveryService;
     private final WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider;
     private final ChannelTypeRegistry channelTypeRegistry;
+    private final ManagedThingProvider managedThingProvider;
 
     private final ChannelUID dateutcDatetimeChannel;
     private final ChannelUID lastReceivedChannel;
@@ -75,11 +77,12 @@ public class WundergroundUpdateReceiverHandler extends BaseThingHandler {
             WundergroundUpdateReceiverServlet wunderGroundUpdateReceiverServlet,
             WundergroundUpdateReceiverDiscoveryService discoveryService,
             WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider,
-            ChannelTypeRegistry channelTypeRegistry) {
+            ChannelTypeRegistry channelTypeRegistry, ManagedThingProvider managedThingProvider) {
         super(thing);
         this.discoveryService = discoveryService;
         this.channelTypeProvider = channelTypeProvider;
         this.channelTypeRegistry = channelTypeRegistry;
+        this.managedThingProvider = managedThingProvider;
 
         final ChannelGroupUID metadatGroupUID = new ChannelGroupUID(getThing().getUID(), METADATA_GROUP);
 
@@ -205,7 +208,8 @@ public class WundergroundUpdateReceiverHandler extends BaseThingHandler {
                 updateState(channelUID, new DecimalType(numberValue));
             }
         } else if (this.discoveryService.isDiscovering()
-                && !WundergroundUpdateReceiverParameterMapping.isExcluded(parameterName)) {
+                && !WundergroundUpdateReceiverParameterMapping.isExcluded(parameterName)
+                && this.managedThingProvider.get(this.thing.getUID()) != null) {
             ThingBuilder thingBuilder = editThing();
             buildChannel(thingBuilder, parameterName, state);
             updateThing(thingBuilder.build());
index 457ea1b5c4f7fb18182a1b553fcce11eebd87e29..57386c0021ba299754bc5fc0950829cb48b72108 100644 (file)
@@ -16,6 +16,7 @@ import static org.openhab.binding.wundergroundupdatereceiver.internal.Wundergrou
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
+import org.openhab.core.thing.ManagedThingProvider;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingTypeUID;
 import org.openhab.core.thing.binding.BaseThingHandlerFactory;
@@ -42,15 +43,17 @@ public class WundergroundUpdateReceiverHandlerFactory extends BaseThingHandlerFa
     private final ChannelTypeRegistry channelTypeRegistry;
     private final WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider;
     private final WundergroundUpdateReceiverServlet wunderGroundUpdateReceiverServlet;
+    private final ManagedThingProvider managedThingProvider;
 
     @Activate
     public WundergroundUpdateReceiverHandlerFactory(@Reference HttpService httpService,
             @Reference WundergroundUpdateReceiverDiscoveryService discoveryService,
             @Reference WundergroundUpdateReceiverUnknownChannelTypeProvider channelTypeProvider,
-            @Reference ChannelTypeRegistry channelTypeRegistry) {
+            @Reference ChannelTypeRegistry channelTypeRegistry, @Reference ManagedThingProvider managedThingProvider) {
         this.discoveryService = discoveryService;
         this.channelTypeRegistry = channelTypeRegistry;
         this.channelTypeProvider = channelTypeProvider;
+        this.managedThingProvider = managedThingProvider;
         this.wunderGroundUpdateReceiverServlet = new WundergroundUpdateReceiverServlet(httpService,
                 this.discoveryService);
         this.discoveryService.servletControls = this.wunderGroundUpdateReceiverServlet;
@@ -70,7 +73,8 @@ public class WundergroundUpdateReceiverHandlerFactory extends BaseThingHandlerFa
 
         if (THING_TYPE_UPDATE_RECEIVER.equals(thingTypeUID)) {
             return new WundergroundUpdateReceiverHandler(thing, this.wunderGroundUpdateReceiverServlet,
-                    this.discoveryService, this.channelTypeProvider, this.channelTypeRegistry);
+                    this.discoveryService, this.channelTypeProvider, this.channelTypeRegistry,
+                    this.managedThingProvider);
         }
 
         return null;
index fd3005926a9059e7768fba7f807d37f919f5ea19..e504fe5df52254cfbddd4a0387e6eff93207dd30 100644 (file)
@@ -41,6 +41,7 @@ import org.mockito.Answers;
 import org.openhab.core.config.core.Configuration;
 import org.openhab.core.thing.Channel;
 import org.openhab.core.thing.DefaultSystemChannelTypeProvider;
+import org.openhab.core.thing.ManagedThingProvider;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingUID;
 import org.openhab.core.thing.binding.ThingHandlerCallback;
@@ -129,8 +130,10 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
         Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
                 .withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
                 .withLabel("test thing").withLocation("location").build();
+        ManagedThingProvider managedThingProvider = mock(ManagedThingProvider.class);
+        when(managedThingProvider.get(TEST_THING_UID)).thenReturn(thing);
         WundergroundUpdateReceiverHandler handler = new WundergroundUpdateReceiverHandler(thing, sut, discoveryService,
-                new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry);
+                new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry, managedThingProvider);
         handler.setCallback(mock(ThingHandlerCallback.class));
         handler.initialize();
         sut.addHandler(handler);
@@ -173,8 +176,10 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
         Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
                 .withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
                 .withLabel("test thing").withLocation("location").build();
+        ManagedThingProvider managedThingProvider = mock(ManagedThingProvider.class);
+        when(managedThingProvider.get(any())).thenReturn(thing);
         WundergroundUpdateReceiverHandler handler = new WundergroundUpdateReceiverHandler(thing, sut, discoveryService,
-                new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry);
+                new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry, managedThingProvider);
         handler.setCallback(mock(ThingHandlerCallback.class));
 
         // When
@@ -216,6 +221,70 @@ class WundergroundUpdateReceiverDiscoveryServiceTest {
         assertThat(actual, hasItems(expectedActual));
     }
 
+    @Test
+    void unregisteredChannelsAreNotAddedOnUnmanagedThings() throws IOException {
+        // Given
+        final String firstDeviceQueryString = "ID=dfggger&" + "PASSWORD=XXXXXX&" + "tempf=26.1&" + "humidity=74&"
+                + "dateutc=2021-02-07%2014:04:03&" + "softwaretype=WH2600%20V2.2.8&" + "action=updateraw&"
+                + "realtime=1&" + "rtfreq=5";
+        MetaData.Request request1 = new MetaData.Request("GET", new HttpURI(
+                "http://localhost" + WundergroundUpdateReceiverServlet.SERVLET_URL + "?" + firstDeviceQueryString),
+                HttpVersion.HTTP_1_1, new HttpFields());
+        HttpChannel httpChannel = mock(HttpChannel.class);
+        Request req1 = new Request(httpChannel, null);
+        req1.setMetaData(request1);
+
+        TestChannelTypeRegistry channelTypeRegistry = new TestChannelTypeRegistry();
+        WundergroundUpdateReceiverDiscoveryService discoveryService = new WundergroundUpdateReceiverDiscoveryService(
+                true);
+        discoveryService.addUnhandledStationId(REQ_STATION_ID, req1.getParameterMap());
+        HttpService httpService = mock(HttpService.class);
+        WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
+        Thing thing = ThingBuilder.create(SUPPORTED_THING_TYPES_UIDS.stream().findFirst().get(), TEST_THING_UID)
+                .withConfiguration(new Configuration(Map.of(REPRESENTATION_PROPERTY, REQ_STATION_ID)))
+                .withLabel("test thing").withLocation("location").build();
+        ManagedThingProvider managedThingProvider = mock(ManagedThingProvider.class);
+        when(managedThingProvider.get(any())).thenReturn(null);
+        WundergroundUpdateReceiverHandler handler = new WundergroundUpdateReceiverHandler(thing, sut, discoveryService,
+                new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry, managedThingProvider);
+        handler.setCallback(mock(ThingHandlerCallback.class));
+
+        // When
+        handler.initialize();
+        sut.addHandler(handler);
+
+        // Then
+        ChannelTypeUID[] expectedBefore = new ChannelTypeUID[] { TEMPERATURE_CHANNELTYPEUID, HUMIDITY_CHANNELTYPEUID,
+                DATEUTC_CHANNELTYPEUID, SOFTWARETYPE_CHANNELTYPEUID, REALTIME_FREQUENCY_CHANNELTYPEUID,
+                LAST_QUERY_STATE_CHANNELTYPEUID, LAST_RECEIVED_DATETIME_CHANNELTYPEUID,
+                LAST_QUERY_TRIGGER_CHANNELTYPEUID };
+        List<ChannelTypeUID> before = handler.getThing().getChannels().stream().map(Channel::getChannelTypeUID)
+                .collect(Collectors.toList());
+        assertThat(before, hasItems(expectedBefore));
+
+        // When
+        final String secondDeviceQueryString = "ID=dfggger&" + "PASSWORD=XXXXXX&" + "lowbatt=1&" + "soilmoisture1=78&"
+                + "soilmoisture2=73&" + "solarradiation=42.24&" + "dateutc=2021-02-07%2014:04:03&"
+                + "softwaretype=WH2600%20V2.2.8&" + "action=updateraw&" + "realtime=1&" + "rtfreq=5";
+        MetaData.Request request = new MetaData.Request("GET", new HttpURI(
+                "http://localhost" + WundergroundUpdateReceiverServlet.SERVLET_URL + "?" + secondDeviceQueryString),
+                HttpVersion.HTTP_1_1, new HttpFields());
+        Request req2 = new Request(httpChannel, null);
+        req2.setMetaData(request);
+        sut.activate();
+
+        // Then
+        assertThat(sut.isActive(), is(true));
+
+        // When
+        sut.doGet(req2, mock(HttpServletResponse.class, Answers.RETURNS_MOCKS));
+
+        // Then
+        List<ChannelTypeUID> actual = handler.getThing().getChannels().stream().map(Channel::getChannelTypeUID)
+                .collect(Collectors.toList());
+        assertThat(actual, equalTo(before));
+    }
+
     class TestChannelTypeRegistry extends ChannelTypeRegistry {
 
         TestChannelTypeRegistry() {
index fa02cee14c4d59c6f0e5cc4e31b18d5338d2020a..46ea3a4a6febb4d26bca4c372e166728a0bfce84 100644 (file)
@@ -65,6 +65,7 @@ import org.openhab.core.library.unit.ImperialUnits;
 import org.openhab.core.library.unit.Units;
 import org.openhab.core.thing.Channel;
 import org.openhab.core.thing.ChannelUID;
+import org.openhab.core.thing.ManagedThingProvider;
 import org.openhab.core.thing.Thing;
 import org.openhab.core.thing.ThingStatus;
 import org.openhab.core.thing.ThingUID;
@@ -92,6 +93,7 @@ class WundergroundUpdateReceiverServletTest {
     private @Mock HttpService httpService;
     private @Mock ChannelTypeRegistry channelTypeRegistry;
     private @Mock WundergroundUpdateReceiverDiscoveryService discoveryService;
+    private @Mock ManagedThingProvider managedThingProvider;
 
     @BeforeEach
     public void setUp() {
@@ -231,7 +233,7 @@ class WundergroundUpdateReceiverServletTest {
                 .thenReturn(ChannelTypeBuilder.trigger(LAST_QUERY_TRIGGER_CHANNELTYPEUID, "Label").build());
         WundergroundUpdateReceiverServlet sut = new WundergroundUpdateReceiverServlet(httpService, discoveryService);
         WundergroundUpdateReceiverHandler handler = new WundergroundUpdateReceiverHandler(thing, sut, discoveryService,
-                new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry);
+                new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry, managedThingProvider);
         ThingHandlerCallback mockCallback = mock(ThingHandlerCallback.class);
         handler.setCallback(mockCallback);
 
@@ -330,7 +332,8 @@ class WundergroundUpdateReceiverServletTest {
                 .withChannels(channels).withConfiguration(config).build();
         ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
         WundergroundUpdateReceiverHandler handler = new WundergroundUpdateReceiverHandler(testThing, sut,
-                discoveryService, new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry);
+                discoveryService, new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry,
+                managedThingProvider);
         handler.setCallback(callback);
         handler.initialize();
 
@@ -443,7 +446,8 @@ class WundergroundUpdateReceiverServletTest {
                 .withChannels(channels).withConfiguration(config).build();
         ThingHandlerCallback callback = mock(ThingHandlerCallback.class);
         WundergroundUpdateReceiverHandler handler = new WundergroundUpdateReceiverHandler(testThing, sut,
-                discoveryService, new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry);
+                discoveryService, new WundergroundUpdateReceiverUnknownChannelTypeProvider(), channelTypeRegistry,
+                managedThingProvider);
         handler.setCallback(callback);
         handler.initialize();