]> git.basschouten.com Git - openhab-addons.git/commitdiff
[wemo] Optimize port detection (#12651)
authorJacob Laursen <jacob-github@vindvejr.dk>
Mon, 25 Apr 2022 15:47:23 +0000 (17:47 +0200)
committerGitHub <noreply@github.com>
Mon, 25 Apr 2022 15:47:23 +0000 (17:47 +0200)
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
bundles/org.openhab.binding.wemo/src/main/java/org/openhab/binding/wemo/internal/handler/WemoBaseThingHandler.java

index 1ce737d04996190dc703bb057cebd3cfed5780be..d1a45e76291bd64026b4f50081362bf3b4389ce4 100644 (file)
@@ -14,11 +14,16 @@ package org.openhab.binding.wemo.internal.handler;
 
 import java.net.URL;
 import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -48,6 +53,8 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U
 
     private static final int SUBSCRIPTION_RENEWAL_INITIAL_DELAY_SECONDS = 15;
     private static final int SUBSCRIPTION_RENEWAL_INTERVAL_SECONDS = 60;
+    private static final int PORT_RANGE_START = 49151;
+    private static final int PORT_RANGE_END = 49157;
 
     private final Logger logger = LoggerFactory.getLogger(WemoBaseThingHandler.class);
     private final UpnpIOService service;
@@ -76,9 +83,9 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U
 
     @Override
     public void dispose() {
+        cancelSubscriptionRenewalJob();
         removeSubscriptions();
         logger.debug("Unregistering UPnP participant for {}", getThing().getUID());
-        cancelSubscriptionRenewalJob();
         service.unregisterParticipant(this);
     }
 
@@ -223,10 +230,16 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U
     }
 
     private int scanForPort(String host) {
-        int portCheckStart = 49151;
-        int portCheckStop = 49157;
+        Integer portFromService = getPortFromService();
+        List<Integer> portsToCheck = new ArrayList<Integer>(PORT_RANGE_END - PORT_RANGE_START + 1);
+        Stream<Integer> portRange = IntStream.rangeClosed(PORT_RANGE_START, PORT_RANGE_END).boxed();
+        if (portFromService != null) {
+            portsToCheck.add(portFromService);
+            portRange = portRange.filter(p -> p.intValue() != portFromService);
+        }
+        portsToCheck.addAll(portRange.collect(Collectors.toList()));
         int port = 0;
-        for (int portCheck = portCheckStart; portCheck < portCheckStop; portCheck++) {
+        for (Integer portCheck : portsToCheck) {
             String urlProbe = "http://" + host + ":" + portCheck;
             logger.trace("Probing {} to find port", urlProbe);
             if (!wemoHttpCaller.probeURL(urlProbe)) {
@@ -246,4 +259,15 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U
         }
         return null;
     }
+
+    private @Nullable Integer getPortFromService() {
+        URL descriptorURL = service.getDescriptorURL(this);
+        if (descriptorURL != null) {
+            int port = descriptorURL.getPort();
+            if (port != -1) {
+                return port;
+            }
+        }
+        return null;
+    }
 }