From a156f3ca15420f8145d6cd94aff3cdfd4d727146 Mon Sep 17 00:00:00 2001 From: J-N-K Date: Fri, 18 Dec 2020 23:17:52 +0100 Subject: [PATCH] fix duplicate serialNumbers (#9422) Signed-off-by: Jan N. Klug --- .../internal/Connection.java | 31 +++++-------------- .../internal/handler/AccountHandler.java | 4 +-- .../internal/jsons/JsonDevices.java | 14 ++++++++- 3 files changed, 23 insertions(+), 26 deletions(-) diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java index 9c5b64d84..958ab6e23 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java @@ -26,20 +26,7 @@ import java.net.URLDecoder; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Base64; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Random; -import java.util.Scanner; -import java.util.Set; +import java.util.*; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Future; import java.util.concurrent.LinkedBlockingQueue; @@ -1052,15 +1039,13 @@ public class Connection { } public List getDeviceList() throws IOException, URISyntaxException, InterruptedException { - String json = getDeviceListJson(); - JsonDevices devices = parseJson(json, JsonDevices.class); - if (devices != null) { - Device[] result = devices.devices; - if (result != null) { - return new ArrayList<>(Arrays.asList(result)); - } - } - return Collections.emptyList(); + JsonDevices devices = Objects.requireNonNull(parseJson(getDeviceListJson(), JsonDevices.class)); + logger.trace("Devices {}", devices.devices); + + // @Nullable because of a limitation of the null-checker, we filter null-serialNumbers before + Set<@Nullable String> serialNumbers = ConcurrentHashMap.newKeySet(); + return devices.devices.stream().filter(d -> d.serialNumber != null && serialNumbers.add(d.serialNumber)) + .collect(Collectors.toList()); } public String getDeviceListJson() throws IOException, URISyntaxException, InterruptedException { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java index fa774b911..aa00a0452 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java @@ -93,7 +93,7 @@ import com.google.gson.JsonSyntaxException; @NonNullByDefault public class AccountHandler extends BaseBridgeHandler implements IWebSocketCommandHandler, IAmazonThingHandler { private final Logger logger = LoggerFactory.getLogger(AccountHandler.class); - private Storage stateStorage; + private final Storage stateStorage; private @Nullable Connection connection; private @Nullable WebSocketConnection webSocketConnection; @@ -651,7 +651,7 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma if (devices != null) { return devices; } - return Collections.emptyList(); + return List.of(); } public void setEnabledFlashBriefingsJson(String flashBriefingJson) { diff --git a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java index 6d6733ff1..278b68592 100644 --- a/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java +++ b/bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java @@ -12,6 +12,9 @@ */ package org.openhab.binding.amazonechocontrol.internal.jsons; +import java.util.Arrays; +import java.util.List; + import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -33,7 +36,16 @@ public class JsonDevices { public @Nullable String softwareVersion; public boolean online; public @Nullable String @Nullable [] capabilities; + + @Override + public String toString() { + return "Device{" + "accountName='" + accountName + '\'' + ", serialNumber='" + serialNumber + '\'' + + ", deviceOwnerCustomerId='" + deviceOwnerCustomerId + '\'' + ", deviceAccountId='" + + deviceAccountId + '\'' + ", deviceFamily='" + deviceFamily + '\'' + ", deviceType='" + deviceType + + '\'' + ", softwareVersion='" + softwareVersion + '\'' + ", online=" + online + ", capabilities=" + + Arrays.toString(capabilities) + '}'; + } } - public @Nullable Device @Nullable [] devices; + public List devices = List.of(); }