]> git.basschouten.com Git - openhab-addons.git/commitdiff
[amazonechocontrol] refactor arrays to modern types (#9476)
authorJ-N-K <J-N-K@users.noreply.github.com>
Wed, 13 Jan 2021 22:31:26 +0000 (23:31 +0100)
committerGitHub <noreply@github.com>
Wed, 13 Jan 2021 22:31:26 +0000 (14:31 -0800)
* refactor arrays to modern types
* address review comments

Signed-off-by: Jan N. Klug <jan.n.klug@rub.de>
41 files changed:
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AccountServlet.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/AmazonEchoDynamicStateDescriptionProvider.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/Connection.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/WebSocketConnection.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/discovery/SmartHomeDevicesDiscovery.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/AccountHandler.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/EchoHandler.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/handler/SmartHomeDeviceHandler.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonActivities.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAscendingAlarm.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonAutomation.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonBluetoothStates.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDeviceNotificationState.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonDevices.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEnabledFeeds.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonEqualizer.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonFeed.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMediaState.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonMusicProvider.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationSounds.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonNotificationsResponse.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonRegisterAppRequest.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeCapabilities.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeDevices.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroupIdentity.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonSmartHomeGroups.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonUsersMeResponse.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/jsons/JsonWakeWords.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/Constants.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerAcousticEventSensor.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBase.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerBrightnessController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerColorTemperatureController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPercentageController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerPowerLevelController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerSecurityPanelController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerTemperatureSensor.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/HandlerThermostatController.java
bundles/org.openhab.binding.amazonechocontrol/src/main/java/org/openhab/binding/amazonechocontrol/internal/smarthome/SmartHomeDeviceStateGroupUpdateCalculator.java

index c0a3d59e7b6b167aa89b8ebe199dd5eb4bbdbb8f..7d75f244545fc2b25dad2eb6df6296a8a89ba2a8 100644 (file)
@@ -20,9 +20,7 @@ import java.net.URISyntaxException;
 import java.net.URLDecoder;
 import java.net.URLEncoder;
 import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import javax.net.ssl.HttpsURLConnection;
@@ -499,19 +497,14 @@ public class AccountServlet extends HttpServlet {
     private void renderCapabilities(Connection connection, Device device, StringBuilder html) {
         html.append("<h2>Capabilities</h2>");
         html.append("<table><tr><th align='left'>Name</th></tr>");
-        String[] capabilities = device.capabilities;
-        if (capabilities != null) {
-            for (String capability : capabilities) {
-                html.append("<tr><td>");
-                html.append(StringEscapeUtils.escapeHtml(capability));
-                html.append("</td></tr>");
-            }
-        }
+        device.getCapabilities().forEach(capability -> html.append("<tr><td>")
+                .append(StringEscapeUtils.escapeHtml(capability)).append("</td></tr>"));
         html.append("</table>");
     }
 
     private void renderMusicProviderIdChannel(Connection connection, StringBuilder html) {
-        html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_MUSIC_PROVIDER_ID) + "</h2>");
+        html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_MUSIC_PROVIDER_ID))
+                .append("</h2>");
         html.append("<table><tr><th align='left'>Name</th><th align='left'>Value</th></tr>");
         List<JsonMusicProvider> musicProviders = connection.getMusicProviders();
         for (JsonMusicProvider musicProvider : musicProviders) {
@@ -532,8 +525,8 @@ public class AccountServlet extends HttpServlet {
     }
 
     private void renderPlayAlarmSoundChannel(Connection connection, Device device, StringBuilder html) {
-        html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_PLAY_ALARM_SOUND) + "</h2>");
-        JsonNotificationSound[] notificationSounds = null;
+        html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_PLAY_ALARM_SOUND)).append("</h2>");
+        List<JsonNotificationSound> notificationSounds = List.of();
         String errorMessage = "No notifications sounds found";
         try {
             notificationSounds = connection.getNotificationSounds(device);
@@ -541,7 +534,7 @@ public class AccountServlet extends HttpServlet {
                 | InterruptedException e) {
             errorMessage = e.getLocalizedMessage();
         }
-        if (notificationSounds != null) {
+        if (!notificationSounds.isEmpty()) {
             html.append("<table><tr><th align='left'>Name</th><th align='left'>Value</th></tr>");
             for (JsonNotificationSound notificationSound : notificationSounds) {
                 if (notificationSound.folder == null && notificationSound.providerId != null
@@ -562,7 +555,8 @@ public class AccountServlet extends HttpServlet {
     }
 
     private void renderAmazonMusicPlaylistIdChannel(Connection connection, Device device, StringBuilder html) {
-        html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_AMAZON_MUSIC_PLAY_LIST_ID) + "</h2>");
+        html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_AMAZON_MUSIC_PLAY_LIST_ID))
+                .append("</h2>");
 
         JsonPlaylists playLists = null;
         String errorMessage = "No playlists found";
@@ -600,7 +594,7 @@ public class AccountServlet extends HttpServlet {
     }
 
     private void renderBluetoothMacChannel(Connection connection, Device device, StringBuilder html) {
-        html.append("<h2>" + StringEscapeUtils.escapeHtml("Channel " + CHANNEL_BLUETOOTH_MAC) + "</h2>");
+        html.append("<h2>").append(StringEscapeUtils.escapeHtml("Channel " + CHANNEL_BLUETOOTH_MAC)).append("</h2>");
         JsonBluetoothStates bluetoothStates = connection.getBluetoothConnectionStates();
         if (bluetoothStates == null) {
             return;
@@ -616,8 +610,8 @@ public class AccountServlet extends HttpServlet {
             String stateDeviceSerialNumber = state.deviceSerialNumber;
             if ((stateDeviceSerialNumber == null && device.serialNumber == null)
                     || (stateDeviceSerialNumber != null && stateDeviceSerialNumber.equals(device.serialNumber))) {
-                PairedDevice[] pairedDeviceList = state.pairedDeviceList;
-                if (pairedDeviceList != null && pairedDeviceList.length > 0) {
+                List<PairedDevice> pairedDeviceList = state.getPairedDeviceList();
+                if (pairedDeviceList.size() > 0) {
                     html.append("<table><tr><th align='left'>Name</th><th align='left'>Value</th></tr>");
                     for (PairedDevice pairedDevice : pairedDeviceList) {
                         html.append("<tr><td>");
index e99141f131c395eb5d4ddcebc410949dde634d78..f753873dd8aa359e21dea50469bc2ecc24dce6cf 100644 (file)
@@ -14,11 +14,7 @@ package org.openhab.binding.amazonechocontrol.internal;
 
 import static org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants.*;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -106,17 +102,13 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
             if (bluetoothState == null) {
                 return null;
             }
-            PairedDevice[] pairedDeviceList = bluetoothState.pairedDeviceList;
-            if (pairedDeviceList == null) {
+            List<PairedDevice> pairedDeviceList = bluetoothState.getPairedDeviceList();
+            if (pairedDeviceList.isEmpty()) {
                 return null;
             }
-
             List<StateOption> options = new ArrayList<>();
             options.add(new StateOption("", ""));
             for (PairedDevice device : pairedDeviceList) {
-                if (device == null) {
-                    continue;
-                }
                 final String value = device.address;
                 if (value != null && device.friendlyName != null) {
                     options.add(new StateOption(value, device.friendlyName));
@@ -160,8 +152,8 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
                 return null;
             }
 
-            JsonNotificationSound[] notificationSounds = handler.findAlarmSounds();
-            if (notificationSounds == null) {
+            List<JsonNotificationSound> notificationSounds = handler.findAlarmSounds();
+            if (notificationSounds.isEmpty()) {
                 return null;
             }
 
@@ -169,9 +161,8 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
             options.add(new StateOption("", ""));
 
             for (JsonNotificationSound notificationSound : notificationSounds) {
-                if (notificationSound != null && notificationSound.folder == null
-                        && notificationSound.providerId != null && notificationSound.id != null
-                        && notificationSound.displayName != null) {
+                if (notificationSound.folder == null && notificationSound.providerId != null
+                        && notificationSound.id != null && notificationSound.displayName != null) {
                     String providerSoundId = notificationSound.providerId + ":" + notificationSound.id;
                     options.add(new StateOption(providerSoundId, notificationSound.displayName));
                 }
@@ -197,8 +188,7 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
             options.add(new StateOption("", ""));
             for (Device device : devices) {
                 final String value = device.serialNumber;
-                if (value != null && device.capabilities != null
-                        && Arrays.asList(device.capabilities).contains("FLASH_BRIEFING")) {
+                if (value != null && device.getCapabilities().contains("FLASH_BRIEFING")) {
                     options.add(new StateOption(value, device.accountName));
                 }
             }
@@ -210,7 +200,7 @@ public class AmazonEchoDynamicStateDescriptionProvider implements DynamicStateDe
                 return null;
             }
             List<JsonMusicProvider> musicProviders = handler.findMusicProviders();
-            if (musicProviders == null) {
+            if (musicProviders.isEmpty()) {
                 return null;
             }
 
index a1197d17c9d800a6890fcbbae2c234a8bcf161dd..b3fb362f373fdd14ff59b4610b2bee67df696812 100644 (file)
@@ -53,7 +53,6 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm.AscendingAlarmModel;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation.Payload;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAutomation.Trigger;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBootstrapResult;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBootstrapResult.Authentication;
@@ -483,15 +482,13 @@ public class Connection {
             try {
                 String bootstrapResultJson = convertStream(connection);
                 JsonBootstrapResult result = parseJson(bootstrapResultJson, JsonBootstrapResult.class);
-                if (result != null) {
-                    Authentication authentication = result.authentication;
-                    if (authentication != null && authentication.authenticated) {
-                        this.customerName = authentication.customerName;
-                        if (this.accountCustomerId == null) {
-                            this.accountCustomerId = authentication.customerId;
-                        }
-                        return authentication;
+                Authentication authentication = result.authentication;
+                if (authentication != null && authentication.authenticated) {
+                    this.customerName = authentication.customerName;
+                    if (this.accountCustomerId == null) {
+                        this.accountCustomerId = authentication.customerId;
                     }
+                    return authentication;
                 }
             } catch (JsonSyntaxException | IllegalStateException e) {
                 logger.info("No valid json received", e);
@@ -726,11 +723,8 @@ public class Connection {
             webSiteCookies.add(new JsonWebSiteCookie(cookie.getName(), cookie.getValue()));
         }
 
-        JsonWebSiteCookie[] webSiteCookiesArray = new JsonWebSiteCookie[webSiteCookies.size()];
-        webSiteCookiesArray = webSiteCookies.toArray(webSiteCookiesArray);
-
         JsonRegisterAppRequest registerAppRequest = new JsonRegisterAppRequest(serial, accessToken, frc,
-                webSiteCookiesArray);
+                webSiteCookies);
         String registerAppRequestJson = gson.toJson(registerAppRequest);
 
         HashMap<String, String> registerHeaders = new HashMap<>();
@@ -740,9 +734,6 @@ public class Connection {
                 registerAppRequestJson, true, registerHeaders);
         JsonRegisterAppResponse registerAppResponse = parseJson(registerAppResultJson, JsonRegisterAppResponse.class);
 
-        if (registerAppResponse == null) {
-            throw new ConnectionException("Error: No response received from register application");
-        }
         Response response = registerAppResponse.response;
         if (response == null) {
             throw new ConnectionException("Error: No response received from register application");
@@ -770,9 +761,6 @@ public class Connection {
             String usersMeResponseJson = makeRequestAndReturnString("GET",
                     "https://alexa.amazon.com/api/users/me?platform=ios&version=2.2.223830.0", null, false, null);
             JsonUsersMeResponse usersMeResponse = parseJson(usersMeResponseJson, JsonUsersMeResponse.class);
-            if (usersMeResponse == null) {
-                throw new IllegalArgumentException("Received no response on me-request");
-            }
             URI uri = new URI(usersMeResponse.marketPlaceDomainName);
             String host = uri.getHost();
 
@@ -928,6 +916,7 @@ public class Connection {
         }
     }
 
+    @SuppressWarnings("null") // current value in compute can be null
     private void replaceTimer(TimerType type, @Nullable ScheduledFuture<?> newTimer) {
         timers.compute(type, (timerType, oldTimer) -> {
             if (oldTimer != null) {
@@ -967,9 +956,10 @@ public class Connection {
     }
 
     // parser
-    private <T> @Nullable T parseJson(String json, Class<T> type) throws JsonSyntaxException, IllegalStateException {
+    private <T> T parseJson(String json, Class<T> type) throws JsonSyntaxException, IllegalStateException {
         try {
-            return gson.fromJson(json, type);
+            // gson.fromJson is always non-null if json is non-null
+            return Objects.requireNonNull(gson.fromJson(json, type));
         } catch (JsonParseException | IllegalStateException e) {
             logger.warn("Parsing json failed: {}", json, e);
             throw e;
@@ -977,21 +967,16 @@ public class Connection {
     }
 
     // commands and states
-    public WakeWord[] getWakeWords() {
+    public List<WakeWord> getWakeWords() {
         String json;
         try {
             json = makeRequestAndReturnString(alexaServer + "/api/wake-word?cached=true");
             JsonWakeWords wakeWords = parseJson(json, JsonWakeWords.class);
-            if (wakeWords != null) {
-                WakeWord[] result = wakeWords.wakeWords;
-                if (result != null) {
-                    return result;
-                }
-            }
+            return Objects.requireNonNullElse(wakeWords.wakeWords, List.of());
         } catch (IOException | URISyntaxException | InterruptedException e) {
             logger.info("getting wakewords failed", e);
         }
-        return new WakeWord[0];
+        return List.of();
     }
 
     public List<SmartHomeBaseDevice> getSmarthomeDeviceList()
@@ -1001,9 +986,6 @@ public class Connection {
             logger.debug("getSmartHomeDevices result: {}", json);
 
             JsonNetworkDetails networkDetails = parseJson(json, JsonNetworkDetails.class);
-            if (networkDetails == null) {
-                throw new IllegalArgumentException("received no response on network detail request");
-            }
             Object jsonObject = gson.fromJson(networkDetails.networkDetail, Object.class);
             List<SmartHomeBaseDevice> result = new ArrayList<>();
             searchSmartHomeDevicesRecursive(jsonObject, result);
@@ -1023,15 +1005,11 @@ public class Connection {
                 // device node found, create type element and add it to the results
                 JsonElement element = gson.toJsonTree(jsonNode);
                 SmartHomeDevice shd = parseJson(element.toString(), SmartHomeDevice.class);
-                if (shd != null) {
-                    devices.add(shd);
-                }
+                devices.add(shd);
             } else if (map.containsKey("applianceGroupName")) {
                 JsonElement element = gson.toJsonTree(jsonNode);
                 SmartHomeGroup shg = parseJson(element.toString(), SmartHomeGroup.class);
-                if (shg != null) {
-                    devices.add(shg);
-                }
+                devices.add(shg);
             } else {
                 map.values().forEach(value -> searchSmartHomeDevicesRecursive(value, devices));
             }
@@ -1062,8 +1040,10 @@ public class Connection {
             String applianceId = device.findId();
             if (applianceId != null) {
                 JsonObject stateRequest;
-                if (device instanceof SmartHomeDevice && !((SmartHomeDevice) device).mergedApplianceIds.isEmpty()) {
-                    for (String idToMerge : ((SmartHomeDevice) device).mergedApplianceIds) {
+                if (device instanceof SmartHomeDevice && ((SmartHomeDevice) device).mergedApplianceIds != null) {
+                    List<String> mergedApplianceIds = Objects
+                            .requireNonNullElse(((SmartHomeDevice) device).mergedApplianceIds, List.of());
+                    for (String idToMerge : mergedApplianceIds) {
                         mergedApplianceMap.put(idToMerge, applianceId);
                         stateRequest = new JsonObject();
                         stateRequest.addProperty("entityId", idToMerge);
@@ -1125,22 +1105,16 @@ public class Connection {
         return mediaState;
     }
 
-    public Activity[] getActivities(int number, @Nullable Long startTime) {
-        String json;
+    public List<Activity> getActivities(int number, @Nullable Long startTime) {
         try {
-            json = makeRequestAndReturnString(alexaServer + "/api/activities?startTime="
+            String json = makeRequestAndReturnString(alexaServer + "/api/activities?startTime="
                     + (startTime != null ? startTime : "") + "&size=" + number + "&offset=1");
             JsonActivities activities = parseJson(json, JsonActivities.class);
-            if (activities != null) {
-                Activity[] activiesArray = activities.activities;
-                if (activiesArray != null) {
-                    return activiesArray;
-                }
-            }
+            return Objects.requireNonNullElse(activities.activities, List.of());
         } catch (IOException | URISyntaxException | InterruptedException e) {
             logger.info("getting activities failed", e);
         }
-        return new Activity[0];
+        return List.of();
     }
 
     public @Nullable JsonBluetoothStates getBluetoothConnectionStates() {
@@ -1211,17 +1185,16 @@ public class Connection {
             String resultBody = makeRequestAndReturnString("PUT", url, requestBody, true, null);
             logger.trace("Request '{}' resulted in '{}", requestBody, resultBody);
             JsonObject result = parseJson(resultBody, JsonObject.class);
-            if (result != null) {
-                JsonElement errors = result.get("errors");
-                if (errors != null && errors.isJsonArray()) {
-                    JsonArray errorList = errors.getAsJsonArray();
-                    if (errorList.size() > 0) {
-                        logger.warn("Smart home device command failed. The request '{}' resulted in error(s): {}",
-                                requestBody, StreamSupport.stream(errorList.spliterator(), false)
-                                        .map(JsonElement::toString).collect(Collectors.joining(" / ")));
-                    }
+            JsonElement errors = result.get("errors");
+            if (errors != null && errors.isJsonArray()) {
+                JsonArray errorList = errors.getAsJsonArray();
+                if (errorList.size() > 0) {
+                    logger.warn("Smart home device command failed. The request '{}' resulted in error(s): {}",
+                            requestBody, StreamSupport.stream(errorList.spliterator(), false).map(JsonElement::toString)
+                                    .collect(Collectors.joining(" / ")));
                 }
             }
+
         } catch (URISyntaxException e) {
             logger.warn("URL '{}' has invalid format for request '{}': {}", url, requestBody, e.getMessage());
         }
@@ -1245,38 +1218,28 @@ public class Connection {
         makeRequest("PUT", url, command, true, true, null, 0);
     }
 
-    public DeviceNotificationState[] getDeviceNotificationStates() {
-        String json;
+    public List<DeviceNotificationState> getDeviceNotificationStates() {
         try {
-            json = makeRequestAndReturnString(alexaServer + "/api/device-notification-state");
+            String json = makeRequestAndReturnString(alexaServer + "/api/device-notification-state");
             JsonDeviceNotificationState result = parseJson(json, JsonDeviceNotificationState.class);
-            if (result != null) {
-                DeviceNotificationState[] deviceNotificationStates = result.deviceNotificationStates;
-                if (deviceNotificationStates != null) {
-                    return deviceNotificationStates;
-                }
-            }
+            return Objects.requireNonNullElse(result.deviceNotificationStates, List.of());
+
         } catch (IOException | URISyntaxException | InterruptedException e) {
             logger.info("Error getting device notification states", e);
         }
-        return new DeviceNotificationState[0];
+        return List.of();
     }
 
-    public AscendingAlarmModel[] getAscendingAlarm() {
+    public List<AscendingAlarmModel> getAscendingAlarm() {
         String json;
         try {
             json = makeRequestAndReturnString(alexaServer + "/api/ascending-alarm");
             JsonAscendingAlarm result = parseJson(json, JsonAscendingAlarm.class);
-            if (result != null) {
-                AscendingAlarmModel[] ascendingAlarmModelList = result.ascendingAlarmModelList;
-                if (ascendingAlarmModelList != null) {
-                    return ascendingAlarmModelList;
-                }
-            }
+            return Objects.requireNonNullElse(result.ascendingAlarmModelList, List.of());
         } catch (IOException | URISyntaxException | InterruptedException e) {
             logger.info("Error getting device notification states", e);
         }
-        return new AscendingAlarmModel[0];
+        return List.of();
     }
 
     public void bluetooth(Device device, @Nullable String address)
@@ -1630,6 +1593,7 @@ public class Connection {
         logger.debug("added {} device {}", queueObject.hashCode(), serialNumbers);
     }
 
+    @SuppressWarnings("null") // peek can return null
     private void handleExecuteSequenceNode() {
         Lock lock = Objects.requireNonNull(locks.computeIfAbsent(TimerType.DEVICES, k -> new ReentrantLock()));
         if (lock.tryLock()) {
@@ -1853,12 +1817,9 @@ public class Connection {
         }
         for (JsonAutomation routine : routines) {
             if (routine != null) {
-                Trigger[] triggers = routine.triggers;
-                if (triggers != null && routine.sequence != null) {
+                if (routine.sequence != null) {
+                    List<JsonAutomation.Trigger> triggers = Objects.requireNonNullElse(routine.triggers, List.of());
                     for (JsonAutomation.Trigger trigger : triggers) {
-                        if (trigger == null) {
-                            continue;
-                        }
                         Payload payload = trigger.payload;
                         if (payload == null) {
                             continue;
@@ -1921,20 +1882,13 @@ public class Connection {
         return result;
     }
 
-    public JsonFeed[] getEnabledFlashBriefings() throws IOException, URISyntaxException, InterruptedException {
+    public List<JsonFeed> getEnabledFlashBriefings() throws IOException, URISyntaxException, InterruptedException {
         String json = makeRequestAndReturnString(alexaServer + "/api/content-skills/enabled-feeds");
         JsonEnabledFeeds result = parseJson(json, JsonEnabledFeeds.class);
-        if (result == null) {
-            return new JsonFeed[0];
-        }
-        JsonFeed[] enabledFeeds = result.enabledFeeds;
-        if (enabledFeeds != null) {
-            return enabledFeeds;
-        }
-        return new JsonFeed[0];
+        return Objects.requireNonNullElse(result.enabledFeeds, List.of());
     }
 
-    public void setEnabledFlashBriefings(JsonFeed[] enabledFlashBriefing)
+    public void setEnabledFlashBriefings(List<JsonFeed> enabledFlashBriefing)
             throws IOException, URISyntaxException, InterruptedException {
         JsonEnabledFeeds enabled = new JsonEnabledFeeds();
         enabled.enabledFeeds = enabledFlashBriefing;
@@ -1942,33 +1896,19 @@ public class Connection {
         makeRequest("POST", alexaServer + "/api/content-skills/enabled-feeds", json, true, true, null, 0);
     }
 
-    public JsonNotificationSound[] getNotificationSounds(Device device)
+    public List<JsonNotificationSound> getNotificationSounds(Device device)
             throws IOException, URISyntaxException, InterruptedException {
         String json = makeRequestAndReturnString(
                 alexaServer + "/api/notification/sounds?deviceSerialNumber=" + device.serialNumber + "&deviceType="
                         + device.deviceType + "&softwareVersion=" + device.softwareVersion);
         JsonNotificationSounds result = parseJson(json, JsonNotificationSounds.class);
-        if (result == null) {
-            return new JsonNotificationSound[0];
-        }
-        JsonNotificationSound[] notificationSounds = result.notificationSounds;
-        if (notificationSounds != null) {
-            return notificationSounds;
-        }
-        return new JsonNotificationSound[0];
+        return Objects.requireNonNullElse(result.notificationSounds, List.of());
     }
 
-    public JsonNotificationResponse[] notifications() throws IOException, URISyntaxException, InterruptedException {
+    public List<JsonNotificationResponse> notifications() throws IOException, URISyntaxException, InterruptedException {
         String response = makeRequestAndReturnString(alexaServer + "/api/notifications");
         JsonNotificationsResponse result = parseJson(response, JsonNotificationsResponse.class);
-        if (result == null) {
-            return new JsonNotificationResponse[0];
-        }
-        JsonNotificationResponse[] notifications = result.notifications;
-        if (notifications == null) {
-            return new JsonNotificationResponse[0];
-        }
-        return notifications;
+        return Objects.requireNonNullElse(result.notifications, List.of());
     }
 
     public @Nullable JsonNotificationResponse notification(Device device, String type, @Nullable String label,
@@ -2019,8 +1959,8 @@ public class Connection {
             String response = makeRequestAndReturnString("GET",
                     alexaServer + "/api/behaviors/entities?skillId=amzn1.ask.1p.music", null, true, headers);
             if (!response.isEmpty()) {
-                JsonMusicProvider[] result = parseJson(response, JsonMusicProvider[].class);
-                return Arrays.asList(result);
+                JsonMusicProvider[] musicProviders = parseJson(response, JsonMusicProvider[].class);
+                return Arrays.asList(musicProviders);
             }
         } catch (IOException | URISyntaxException | InterruptedException e) {
             logger.warn("getMusicProviders fails: {}", e.getMessage());
@@ -2050,12 +1990,10 @@ public class Connection {
 
         if (!validateResultJson.isEmpty()) {
             JsonPlayValidationResult validationResult = parseJson(validateResultJson, JsonPlayValidationResult.class);
-            if (validationResult != null) {
-                JsonPlaySearchPhraseOperationPayload validatedOperationPayload = validationResult.operationPayload;
-                if (validatedOperationPayload != null) {
-                    payload.sanitizedSearchPhrase = validatedOperationPayload.sanitizedSearchPhrase;
-                    payload.searchPhrase = validatedOperationPayload.searchPhrase;
-                }
+            JsonPlaySearchPhraseOperationPayload validatedOperationPayload = validationResult.operationPayload;
+            if (validatedOperationPayload != null) {
+                payload.sanitizedSearchPhrase = validatedOperationPayload.sanitizedSearchPhrase;
+                payload.searchPhrase = validatedOperationPayload.searchPhrase;
             }
         }
 
index 2a0ec2e35f629b29c121383920e44c77f1c80fd6..410f0312ae4f0dbb941b52ca6f31aad6f2818927 100644 (file)
@@ -73,9 +73,7 @@ public class WebSocketConnection {
             IWebSocketCommandHandler webSocketCommandHandler) throws IOException {
         this.webSocketCommandHandler = webSocketCommandHandler;
         amazonEchoControlWebSocket = new AmazonEchoControlWebSocket();
-
-        SslContextFactory sslContextFactory = new SslContextFactory();
-        webSocketClient = new WebSocketClient(sslContextFactory);
+        webSocketClient = new WebSocketClient(new SslContextFactory.Client());
         try {
             String host;
             if (amazonSite.equalsIgnoreCase("amazon.com")) {
index 8e4c07652edbe2c739622eb53a9433f323aeeb39..d69a041a56bae63422768242eb70549c82cf7c59 100644 (file)
@@ -22,14 +22,12 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Stream;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
 import org.openhab.binding.amazonechocontrol.internal.handler.AccountHandler;
 import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDeviceAlias;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.DriverIdentity;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
@@ -171,25 +169,23 @@ public class SmartHomeDevicesDiscovery extends AbstractDiscoveryService {
                     continue;
                 }
 
-                JsonSmartHomeCapabilities.SmartHomeCapability[] capabilities = shd.capabilities;
-                if (capabilities == null || Stream.of(capabilities).noneMatch(capability -> capability != null
-                        && Constants.SUPPORTED_INTERFACES.contains(capability.interfaceName))) {
+                if (shd.getCapabilities().stream()
+                        .noneMatch(capability -> Constants.SUPPORTED_INTERFACES.contains(capability.interfaceName))) {
                     // No supported interface found
                     continue;
                 }
 
                 thingUID = new ThingUID(THING_TYPE_SMART_HOME_DEVICE, bridgeThingUID, entityId.replace(".", "-"));
 
-                JsonSmartHomeDeviceAlias[] aliases = shd.aliases;
+                List<JsonSmartHomeDeviceAlias> aliases = shd.aliases;
                 if ("Amazon".equals(shd.manufacturerName) && driverIdentity != null
                         && "SonarCloudService".equals(driverIdentity.identifier)) {
                     deviceName = "Alexa Guard on " + shd.friendlyName;
                 } else if ("Amazon".equals(shd.manufacturerName) && driverIdentity != null
                         && "OnGuardSmartHomeBridgeService".equals(driverIdentity.identifier)) {
                     deviceName = "Alexa Guard";
-                } else if (aliases != null && aliases.length > 0 && aliases[0] != null
-                        && aliases[0].friendlyName != null) {
-                    deviceName = aliases[0].friendlyName;
+                } else if (aliases != null && !aliases.isEmpty() && aliases.get(0).friendlyName != null) {
+                    deviceName = aliases.get(0).friendlyName;
                 } else {
                     deviceName = shd.friendlyName;
                 }
index 277b6708376794d8e73f51278d88a22feea18d20..19077a583d24e7f81c3c6d1e12c2eb9244db5893 100644 (file)
@@ -17,15 +17,7 @@ import java.net.URISyntaxException;
 import java.net.URLEncoder;
 import java.net.UnknownHostException;
 import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ScheduledFuture;
@@ -44,7 +36,6 @@ import org.openhab.binding.amazonechocontrol.internal.WebSocketConnection;
 import org.openhab.binding.amazonechocontrol.internal.channelhandler.ChannelHandler;
 import org.openhab.binding.amazonechocontrol.internal.channelhandler.ChannelHandlerSendMessage;
 import org.openhab.binding.amazonechocontrol.internal.channelhandler.IAmazonThingHandler;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonActivities.Activity.SourceDeviceId;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonAscendingAlarm.AscendingAlarmModel;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonBluetoothStates.BluetoothState;
@@ -473,18 +464,17 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
         if (!currentConnection.getIsLoggedIn()) {
             return;
         }
-        JsonNotificationResponse[] notifications;
+
         ZonedDateTime timeStamp = ZonedDateTime.now();
         try {
-            notifications = currentConnection.notifications();
+            List<JsonNotificationResponse> notifications = currentConnection.notifications();
+            ZonedDateTime timeStampNow = ZonedDateTime.now();
+            echoHandlers.forEach(echoHandler -> echoHandler.updateNotifications(timeStamp, timeStampNow, pushPayload,
+                    notifications));
         } catch (IOException | URISyntaxException | InterruptedException e) {
             logger.debug("refreshNotifications failed", e);
             return;
         }
-        ZonedDateTime timeStampNow = ZonedDateTime.now();
-
-        echoHandlers.forEach(
-                echoHandler -> echoHandler.updateNotifications(timeStamp, timeStampNow, pushPayload, notifications));
     }
 
     private void refreshData() {
@@ -509,8 +499,8 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
                 updateSmartHomeDeviceList(false);
                 updateFlashBriefingHandlers();
 
-                DeviceNotificationState[] deviceNotificationStates = null;
-                AscendingAlarmModel[] ascendingAlarmModels = null;
+                List<DeviceNotificationState> deviceNotificationStates = List.of();
+                List<AscendingAlarmModel> ascendingAlarmModels = List.of();
                 JsonBluetoothStates states = null;
                 List<JsonMusicProvider> musicProviders = null;
                 if (currentConnection.getIsLoggedIn()) {
@@ -536,7 +526,7 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
                 for (EchoHandler child : echoHandlers) {
                     Device device = findDeviceJson(child.findSerialNumber());
 
-                    JsonNotificationSound[] notificationSounds = null;
+                    List<JsonNotificationSound> notificationSounds = List.of();
                     JsonPlaylists playlists = null;
                     if (device != null && currentConnection.getIsLoggedIn()) {
                         // update notification sounds
@@ -562,17 +552,12 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
                     if (device != null) {
                         final String serialNumber = device.serialNumber;
                         if (serialNumber != null) {
-                            if (ascendingAlarmModels != null) {
-                                ascendingAlarmModel = Arrays.stream(ascendingAlarmModels).filter(Objects::nonNull)
-                                        .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
-                                        .orElse(null);
-                            }
-                            if (deviceNotificationStates != null) {
-                                deviceNotificationState = Arrays.stream(deviceNotificationStates)
-                                        .filter(Objects::nonNull)
-                                        .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
-                                        .orElse(null);
-                            }
+                            ascendingAlarmModel = ascendingAlarmModels.stream()
+                                    .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
+                                    .orElse(null);
+                            deviceNotificationState = deviceNotificationStates.stream()
+                                    .filter(current -> serialNumber.equals(current.deviceSerialNumber)).findFirst()
+                                    .orElse(null);
                         }
                     }
                     child.updateState(this, device, state, deviceNotificationState, ascendingAlarmModel, playlists,
@@ -631,19 +616,13 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
                     .collect(Collectors.toMap(d -> Objects.requireNonNull(d.serialNumber), d -> d));
         }
 
-        WakeWord[] wakeWords = currentConnection.getWakeWords();
+        List<WakeWord> wakeWords = currentConnection.getWakeWords();
         // update handlers
         for (EchoHandler echoHandler : echoHandlers) {
             String serialNumber = echoHandler.findSerialNumber();
-            String deviceWakeWord = null;
-            for (WakeWord wakeWord : wakeWords) {
-                if (wakeWord != null) {
-                    if (serialNumber.equals(wakeWord.deviceSerialNumber)) {
-                        deviceWakeWord = wakeWord.wakeWord;
-                        break;
-                    }
-                }
-            }
+            String deviceWakeWord = wakeWords.stream()
+                    .filter(wakeWord -> serialNumber.equals(wakeWord.deviceSerialNumber)).findFirst()
+                    .map(wakeWord -> wakeWord.wakeWord).orElse(null);
             echoHandler.setDeviceAndUpdateThingState(this, findDeviceJson(serialNumber), deviceWakeWord);
         }
 
@@ -658,7 +637,7 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
         JsonFeed[] feeds = gson.fromJson(flashBriefingJson, JsonFeed[].class);
         if (currentConnection != null && feeds != null) {
             try {
-                currentConnection.setEnabledFlashBriefings(feeds);
+                currentConnection.setEnabledFlashBriefings(Arrays.asList(feeds));
             } catch (IOException | URISyntaxException | InterruptedException e) {
                 logger.warn("Set flashbriefing profile failed", e);
             }
@@ -707,17 +686,9 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
 
     private void updateFlashBriefingProfiles(Connection currentConnection) {
         try {
-            JsonFeed[] feeds = currentConnection.getEnabledFlashBriefings();
             // Make a copy and remove changeable parts
-            JsonFeed[] forSerializer = new JsonFeed[feeds.length];
-            for (int i = 0; i < feeds.length; i++) {
-                JsonFeed source = feeds[i];
-                JsonFeed copy = new JsonFeed();
-                copy.feedId = source.feedId;
-                copy.skillId = source.skillId;
-                // Do not copy imageUrl here, because it will change
-                forSerializer[i] = copy;
-            }
+            JsonFeed[] forSerializer = currentConnection.getEnabledFlashBriefings().stream()
+                    .map(source -> new JsonFeed(source.feedId, source.skillId)).toArray(JsonFeed[]::new);
             this.currentFlashBriefingJson = gson.toJson(forSerializer);
         } catch (HttpException | JsonSyntaxException | IOException | URISyntaxException | ConnectionException
                 | InterruptedException e) {
@@ -796,17 +767,12 @@ public class AccountHandler extends BaseBridgeHandler implements IWebSocketComma
         }
 
         String search = key.registeredUserId + "#" + key.entryId;
-        Arrays.stream(connection.getActivities(10, pushActivity.timestamp))
-                .filter(activity -> activity != null && search.equals(activity.id)).findFirst()
-                .ifPresent(currentActivity -> {
-                    SourceDeviceId[] sourceDeviceIds = currentActivity.sourceDeviceIds;
-                    if (sourceDeviceIds != null) {
-                        Arrays.stream(sourceDeviceIds).filter(Objects::nonNull)
-                                .map(sourceDeviceId -> findEchoHandlerBySerialNumber(sourceDeviceId.serialNumber))
-                                .filter(Objects::nonNull).forEach(echoHandler -> Objects.requireNonNull(echoHandler)
-                                        .handlePushActivity(currentActivity));
-                    }
-                });
+        connection.getActivities(10, pushActivity.timestamp).stream().filter(activity -> search.equals(activity.id))
+                .findFirst()
+                .ifPresent(currentActivity -> currentActivity.getSourceDeviceIds().stream()
+                        .map(sourceDeviceId -> findEchoHandlerBySerialNumber(sourceDeviceId.serialNumber))
+                        .filter(Objects::nonNull).forEach(echoHandler -> Objects.requireNonNull(echoHandler)
+                                .handlePushActivity(currentActivity)));
     }
 
     void refreshAfterCommand() {
index 40db311849113963b5401da0dc1d6fd285d88674..342ecb323a2b28c5b25e37db72d6e864acd6c605 100644 (file)
@@ -24,8 +24,6 @@ import java.time.temporal.ChronoUnit;
 import java.util.*;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -122,8 +120,8 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
     private @Nullable Integer notificationVolumeLevel;
     private @Nullable Boolean ascendingAlarm;
     private @Nullable JsonPlaylists playLists;
-    private @Nullable JsonNotificationSound @Nullable [] alarmSounds;
-    private @Nullable List<JsonMusicProvider> musicProviders;
+    private List<JsonNotificationSound> alarmSounds = List.of();
+    private List<JsonMusicProvider> musicProviders = List.of();
     private List<ChannelHandler> channelHandlers = new ArrayList<>();
 
     private @Nullable JsonNotificationResponse currentNotification;
@@ -163,10 +161,7 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
             return false;
         }
         this.device = device;
-        String[] capabilities = device.capabilities;
-        if (capabilities != null) {
-            this.capabilities = Stream.of(capabilities).filter(Objects::nonNull).collect(Collectors.toSet());
-        }
+        this.capabilities = device.getCapabilities();
         if (!device.online) {
             updateStatus(ThingStatus.OFFLINE);
             return false;
@@ -204,11 +199,11 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
         return this.playLists;
     }
 
-    public @Nullable JsonNotificationSound @Nullable [] findAlarmSounds() {
+    public List<JsonNotificationSound> findAlarmSounds() {
         return this.alarmSounds;
     }
 
-    public @Nullable List<JsonMusicProvider> findMusicProviders() {
+    public List<JsonMusicProvider> findMusicProviders() {
         return this.musicProviders;
     }
 
@@ -444,17 +439,11 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
                     String bluetoothId = lastKnownBluetoothMAC;
                     BluetoothState state = bluetoothState;
                     if (state != null && (bluetoothId == null || bluetoothId.isEmpty())) {
-                        PairedDevice[] pairedDeviceList = state.pairedDeviceList;
-                        if (pairedDeviceList != null) {
-                            for (PairedDevice paired : pairedDeviceList) {
-                                if (paired == null) {
-                                    continue;
-                                }
-                                String pairedAddress = paired.address;
-                                if (pairedAddress != null && !pairedAddress.isEmpty()) {
-                                    lastKnownBluetoothMAC = pairedAddress;
-                                    break;
-                                }
+                        for (PairedDevice paired : state.getPairedDeviceList()) {
+                            String pairedAddress = paired.address;
+                            if (pairedAddress != null && !pairedAddress.isEmpty()) {
+                                lastKnownBluetoothMAC = pairedAddress;
+                                break;
                             }
                         }
                     }
@@ -806,8 +795,7 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
     public void updateState(AccountHandler accountHandler, @Nullable Device device,
             @Nullable BluetoothState bluetoothState, @Nullable DeviceNotificationState deviceNotificationState,
             @Nullable AscendingAlarmModel ascendingAlarmModel, @Nullable JsonPlaylists playlists,
-            @Nullable JsonNotificationSound @Nullable [] alarmSounds,
-            @Nullable List<JsonMusicProvider> musicProviders) {
+            @Nullable List<JsonNotificationSound> alarmSounds, @Nullable List<JsonMusicProvider> musicProviders) {
         try {
             this.logger.debug("Handle updateState {}", this.getThing().getUID());
 
@@ -974,24 +962,19 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
             boolean bluetoothIsConnected = false;
             if (bluetoothState != null) {
                 this.bluetoothState = bluetoothState;
-                PairedDevice[] pairedDeviceList = bluetoothState.pairedDeviceList;
-                if (pairedDeviceList != null) {
-                    for (PairedDevice paired : pairedDeviceList) {
-                        if (paired == null) {
-                            continue;
-                        }
-                        String pairedAddress = paired.address;
-                        if (paired.connected && pairedAddress != null) {
-                            bluetoothIsConnected = true;
-                            bluetoothMAC = pairedAddress;
-                            bluetoothDeviceName = paired.friendlyName;
-                            if (bluetoothDeviceName == null || bluetoothDeviceName.isEmpty()) {
-                                bluetoothDeviceName = pairedAddress;
-                            }
-                            break;
+                for (PairedDevice paired : bluetoothState.getPairedDeviceList()) {
+                    String pairedAddress = paired.address;
+                    if (paired.connected && pairedAddress != null) {
+                        bluetoothIsConnected = true;
+                        bluetoothMAC = pairedAddress;
+                        bluetoothDeviceName = paired.friendlyName;
+                        if (bluetoothDeviceName == null || bluetoothDeviceName.isEmpty()) {
+                            bluetoothDeviceName = pairedAddress;
                         }
+                        break;
                     }
                 }
+
             }
             if (!bluetoothMAC.isEmpty()) {
                 lastKnownBluetoothMAC = bluetoothMAC;
@@ -1036,22 +1019,21 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
                 }
             }
             if (mediaState != null) {
-                QueueEntry[] queueEntries = mediaState.queue;
-                if (queueEntries != null && queueEntries.length > 0) {
-                    QueueEntry entry = queueEntries[0];
-                    if (entry != null) {
-                        if (isRadio) {
-                            if ((imageUrl == null || imageUrl.isEmpty()) && entry.imageURL != null) {
-                                imageUrl = entry.imageURL;
-                            }
-                            if ((subTitle1 == null || subTitle1.isEmpty()) && entry.radioStationSlogan != null) {
-                                subTitle1 = entry.radioStationSlogan;
-                            }
-                            if ((subTitle2 == null || subTitle2.isEmpty()) && entry.radioStationLocation != null) {
-                                subTitle2 = entry.radioStationLocation;
-                            }
+                List<QueueEntry> queueEntries = Objects.requireNonNullElse(mediaState.queue, List.of());
+                if (!queueEntries.isEmpty()) {
+                    QueueEntry entry = queueEntries.get(0);
+                    if (isRadio) {
+                        if ((imageUrl == null || imageUrl.isEmpty()) && entry.imageURL != null) {
+                            imageUrl = entry.imageURL;
+                        }
+                        if ((subTitle1 == null || subTitle1.isEmpty()) && entry.radioStationSlogan != null) {
+                            subTitle1 = entry.radioStationSlogan;
+                        }
+                        if ((subTitle2 == null || subTitle2.isEmpty()) && entry.radioStationLocation != null) {
+                            subTitle2 = entry.radioStationLocation;
                         }
                     }
+
                 }
             }
 
@@ -1287,7 +1269,8 @@ public class EchoHandler extends BaseThingHandler implements IEchoThingHandler {
     }
 
     public void updateNotifications(ZonedDateTime currentTime, ZonedDateTime now,
-            @Nullable JsonCommandPayloadPushNotificationChange pushPayload, JsonNotificationResponse[] notifications) {
+            @Nullable JsonCommandPayloadPushNotificationChange pushPayload,
+            List<JsonNotificationResponse> notifications) {
         Device device = this.device;
         if (device == null) {
             return;
index 594215abfe1263e3be413d4cfc481fc5ac240b61..c2bba5ad79a73fd2857e7e6ded77cb6eeb465e1f 100644 (file)
@@ -16,7 +16,7 @@ import static org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBi
 import static org.openhab.binding.amazonechocontrol.internal.smarthome.Constants.SUPPORTED_INTERFACES;
 
 import java.util.*;
-import java.util.function.Supplier;
+import java.util.function.Function;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -93,15 +93,15 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
             if (handler != null) {
                 unusedHandlers.remove(interfaceName);
             } else {
-                Supplier<HandlerBase> creator = Constants.HANDLER_FACTORY.get(interfaceName);
+                Function<SmartHomeDeviceHandler, HandlerBase> creator = Constants.HANDLER_FACTORY.get(interfaceName);
                 if (creator != null) {
-                    handler = creator.get();
+                    handler = creator.apply(this);
                     handlers.put(interfaceName, handler);
                 }
             }
             if (handler != null) {
-                Collection<ChannelInfo> required = handler.initialize(this,
-                        capabilities.getOrDefault(interfaceName, Collections.emptyList()));
+                Collection<ChannelInfo> required = handler
+                        .initialize(capabilities.getOrDefault(interfaceName, List.of()));
                 for (ChannelInfo channelInfo : required) {
                     unusedChannels.remove(channelInfo.channelId);
                     if (addChannelToDevice(thingBuilder, channelInfo.channelId, channelInfo.itemType,
@@ -289,13 +289,8 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
                     if (entityId == null) {
                         continue;
                     }
-                    SmartHomeCapability[] capabilities = shd.capabilities;
-                    if (capabilities == null) {
-                        logger.debug("capabilities is null in {}", thing.getUID());
-                        return;
-                    }
                     accountHandler.forceDelayedSmartHomeStateUpdate(getId()); // block updates
-                    if (handlerBase.handleCommand(connection, shd, entityId, capabilities, channelUID.getId(),
+                    if (handlerBase.handleCommand(connection, shd, entityId, shd.getCapabilities(), channelUID.getId(),
                             command)) {
                         accountHandler.forceDelayedSmartHomeStateUpdate(getId()); // force update again to restart
                         // update timer
@@ -312,11 +307,7 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
             SmartHomeBaseDevice device) {
         if (device instanceof SmartHomeDevice) {
             SmartHomeDevice shd = (SmartHomeDevice) device;
-            SmartHomeCapability[] capabilities = shd.capabilities;
-            if (capabilities == null) {
-                return;
-            }
-            for (SmartHomeCapability capability : capabilities) {
+            for (SmartHomeCapability capability : shd.getCapabilities()) {
                 String interfaceName = capability.interfaceName;
                 if (interfaceName != null) {
                     Objects.requireNonNull(result.computeIfAbsent(interfaceName, name -> new ArrayList<>()))
@@ -340,12 +331,10 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
         Set<SmartHomeDevice> result = new HashSet<>();
         if (baseDevice instanceof SmartHomeDevice) {
             SmartHomeDevice shd = (SmartHomeDevice) baseDevice;
-            SmartHomeCapability[] capabilities = shd.capabilities;
-            if (capabilities != null) {
-                if (Arrays.stream(capabilities).map(capability -> capability.interfaceName)
-                        .anyMatch(SUPPORTED_INTERFACES::contains)) {
-                    result.add(shd);
-                }
+            if (shd.getCapabilities().stream().map(capability -> capability.interfaceName)
+                    .anyMatch(SUPPORTED_INTERFACES::contains)) {
+                result.add(shd);
+
             }
         } else {
             SmartHomeGroup shg = (SmartHomeGroup) baseDevice;
@@ -356,13 +345,12 @@ public class SmartHomeDeviceHandler extends BaseThingHandler {
                     if (tags != null) {
                         JsonSmartHomeGroupIdentity.SmartHomeGroupIdentity tagNameToValueSetMap = tags.tagNameToValueSetMap;
                         JsonSmartHomeGroupIdentifiers.SmartHomeGroupIdentifier applianceGroupIdentifier = shg.applianceGroupIdentifier;
-                        if (tagNameToValueSetMap != null && tagNameToValueSetMap.groupIdentity != null
-                                && applianceGroupIdentifier != null && applianceGroupIdentifier.value != null
-                                && Arrays.asList(tagNameToValueSetMap.groupIdentity)
-                                        .contains(applianceGroupIdentifier.value)) {
-                            SmartHomeCapability[] capabilities = shd.capabilities;
-                            if (capabilities != null) {
-                                if (Arrays.stream(capabilities).map(capability -> capability.interfaceName)
+                        if (tagNameToValueSetMap != null) {
+                            List<String> groupIdentity = Objects.requireNonNullElse(tagNameToValueSetMap.groupIdentity,
+                                    List.of());
+                            if (applianceGroupIdentifier != null && applianceGroupIdentifier.value != null
+                                    && groupIdentity.contains(applianceGroupIdentifier.value)) {
+                                if (shd.getCapabilities().stream().map(capability -> capability.interfaceName)
                                         .anyMatch(SUPPORTED_INTERFACES::contains)) {
                                     result.add(shd);
                                 }
index 0ad4f23631086156fb28339f6a22843a8c106b32..c4cb88d9046e8bb5f34eb15781090cbf90a16925 100644 (file)
@@ -12,6 +12,9 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+import java.util.Objects;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -26,7 +29,7 @@ import com.google.gson.JsonSyntaxException;
 @NonNullByDefault
 public class JsonActivities {
 
-    public @Nullable Activity @Nullable [] activities;
+    public @Nullable List<Activity> activities;
 
     public static class Activity {
         public @Nullable String activityStatus;
@@ -40,10 +43,14 @@ public class JsonActivities {
         public @Nullable String providerInfoDescription;
         public @Nullable String registeredCustomerId;
         public @Nullable Object sourceActiveUsers;
-        public @Nullable SourceDeviceId @Nullable [] sourceDeviceIds;
+        public @Nullable List<SourceDeviceId> sourceDeviceIds;
         public @Nullable String utteranceId;
         public @Nullable Long version;
 
+        public List<SourceDeviceId> getSourceDeviceIds() {
+            return Objects.requireNonNullElse(sourceDeviceIds, List.of());
+        }
+
         public static class SourceDeviceId {
             public @Nullable String deviceAccountId;
             public @Nullable String deviceType;
@@ -51,7 +58,6 @@ public class JsonActivities {
         }
 
         public static class Description {
-
             public @Nullable String summary;
             public @Nullable String firstUtteranceId;
             public @Nullable String firstStreamId;
index 0ff74be87ff3e69fd25f8ccdae5044b07d2e4b5e..265678b9340aa5f3279407731200d8fc1a9450d0 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -23,7 +25,7 @@ import org.eclipse.jdt.annotation.Nullable;
 @NonNullByDefault
 public class JsonAscendingAlarm {
 
-    public @Nullable AscendingAlarmModel @Nullable [] ascendingAlarmModelList;
+    public @Nullable List<AscendingAlarmModel> ascendingAlarmModelList;
 
     public static class AscendingAlarmModel {
         public @Nullable Boolean ascendingAlarmEnabled;
index cb8f29167d80aacae5e6f46ab32e4df3b53cea30..02c3b92db412e756102a86a3928580e048c203f1 100644 (file)
@@ -12,6 +12,7 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
 import java.util.TreeMap;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -26,7 +27,7 @@ import org.eclipse.jdt.annotation.Nullable;
 public class JsonAutomation {
     public @Nullable String automationId;
     public @Nullable String name;
-    public @Nullable Trigger @Nullable [] triggers;
+    public @Nullable List<Trigger> triggers;
     public @Nullable TreeMap<String, Object> sequence;
     public @Nullable String status;
     public long creationTimeEpochMillis;
index 9d41e6032d94d9ae19934a3dad20a431b6e75366..d6007d27d00a939ec93341c9d8f67de7c58ad0c0 100644 (file)
@@ -12,6 +12,7 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
 import java.util.Objects;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
@@ -50,7 +51,7 @@ public class JsonBluetoothStates {
         public boolean connected;
         public @Nullable String deviceClass;
         public @Nullable String friendlyName;
-        public @Nullable String @Nullable [] profiles;
+        public @Nullable List<String> profiles;
     }
 
     public static class BluetoothState {
@@ -59,6 +60,10 @@ public class JsonBluetoothStates {
         public @Nullable String friendlyName;
         public boolean gadgetPaired;
         public boolean online;
-        public @Nullable PairedDevice @Nullable [] pairedDeviceList;
+        public @Nullable List<PairedDevice> pairedDeviceList;
+
+        public List<PairedDevice> getPairedDeviceList() {
+            return Objects.requireNonNullElse(pairedDeviceList, List.of());
+        }
     }
 }
index 07c15a27dddccdc67779bd964dbe263fe9358286..87ff2649f2c3133a288b6cb32ffad50132d3f566 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -23,7 +25,7 @@ import org.eclipse.jdt.annotation.Nullable;
 @NonNullByDefault
 public class JsonDeviceNotificationState {
 
-    public @Nullable DeviceNotificationState @Nullable [] deviceNotificationStates;
+    public @Nullable List<DeviceNotificationState> deviceNotificationStates;
 
     public static class DeviceNotificationState {
         public @Nullable String deviceSerialNumber;
index 332854a3224a794f187f66dd49b20c4b1304b59d..96353c06c2b127d5e6577910754e9027e014627e 100644 (file)
@@ -12,8 +12,9 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
-import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
+import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -35,7 +36,11 @@ public class JsonDevices {
         public @Nullable String deviceType;
         public @Nullable String softwareVersion;
         public boolean online;
-        public @Nullable String @Nullable [] capabilities;
+        public @Nullable Set<String> capabilities;
+
+        public Set<String> getCapabilities() {
+            return Objects.requireNonNullElse(capabilities, Set.of());
+        }
 
         @Override
         public String toString() {
@@ -43,7 +48,7 @@ public class JsonDevices {
                     + ", deviceOwnerCustomerId='" + deviceOwnerCustomerId + '\'' + ", deviceAccountId='"
                     + deviceAccountId + '\'' + ", deviceFamily='" + deviceFamily + '\'' + ", deviceType='" + deviceType
                     + '\'' + ", softwareVersion='" + softwareVersion + '\'' + ", online=" + online + ", capabilities="
-                    + Arrays.toString(capabilities) + '}';
+                    + capabilities + '}';
         }
     }
 
index 0807f15aef75b803d80c21e4ac09e669e22f99dc..5f21bb03e5978bb67dc8b5e386864b3275f1af03 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable;
  */
 @NonNullByDefault
 public class JsonEnabledFeeds {
-    public @Nullable JsonFeed @Nullable [] enabledFeeds;
+    public @Nullable List<JsonFeed> enabledFeeds;
 }
index 405a2c585af5f74243cc5f04adb4822afef0598e..f69e6a2e58648a388470e499319e4f15bd924b96 100644 (file)
@@ -16,7 +16,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
 /**
- * The {@link JsonActivity} encapsulate the GSON data of the get equalizer command
+ * The {@link JsonEqualizer} encapsulate the GSON data of the get equalizer command
  *
  * @author Michael Geramb - Initial contribution
  */
index 55b273662dfead67d04e90d1f1674d20c9728fde..d99abfbdf45b5c5e22f696cc9b902c084da4e360 100644 (file)
@@ -26,4 +26,9 @@ public class JsonFeed {
     public @Nullable String name;
     public @Nullable String skillId;
     public @Nullable String imageUrl;
+
+    public JsonFeed(@Nullable Object feedId, @Nullable String skillId) {
+        this.feedId = feedId;
+        this.skillId = skillId;
+    }
 }
index 4bbe4a38e06079a1ca5b1280e4a6f42409e6b055..bd6aaca5416f85fa82c1bf7cfba8202a9e6c373e 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -36,7 +38,7 @@ public class JsonMediaState {
     public @Nullable String programId;
     public int progressSeconds;
     public @Nullable String providerId;
-    public @Nullable QueueEntry @Nullable [] queue;
+    public @Nullable List<QueueEntry> queue;
     public @Nullable String queueId;
     public @Nullable Integer queueSize;
     public @Nullable String radioStationId;
@@ -48,7 +50,6 @@ public class JsonMediaState {
     public int volume;
 
     public static class QueueEntry {
-
         public @Nullable String album;
         public @Nullable String albumAsin;
         public @Nullable String artist;
index 99ee115c6425c2ed07387745d784cfee2754b78e..08ce275b16e0c58faf54e54d33753e80114141dc 100644 (file)
@@ -25,7 +25,7 @@ import org.eclipse.jdt.annotation.Nullable;
 @NonNullByDefault
 public class JsonMusicProvider {
     public @Nullable String displayName;
-    public @Nullable List<Object> @Nullable [] supportedTriggers;
+    public List<Object> @Nullable [] supportedTriggers;
     public @Nullable String icon;
     public @Nullable List<String> supportedProperties;
     public @Nullable String id;
index e872c53bce37a1409b5807a6bf823cbab62a469b..2cdeb84e544163291da510e3d20eb65ca494d3f0 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable;
  */
 @NonNullByDefault
 public class JsonNotificationSounds {
-    public @Nullable JsonNotificationSound @Nullable [] notificationSounds;
+    public @Nullable List<JsonNotificationSound> notificationSounds;
 }
index 5038c417d58c7a8cb50c7e2d11fce7f5932afef6..60c7405e26e60f6ea86dbff448c71eda23477b54 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -22,5 +24,5 @@ import org.eclipse.jdt.annotation.Nullable;
  */
 @NonNullByDefault
 public class JsonNotificationsResponse {
-    public JsonNotificationResponse @Nullable [] notifications;
+    public @Nullable List<JsonNotificationResponse> notifications;
 }
index 6d516fa51ebe7b0b445b087c92235d0ebdbb01e0..6573841a55c098dfe3d109d73435344f2bdd357e 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -26,7 +28,7 @@ import com.google.gson.annotations.SerializedName;
 public class JsonRegisterAppRequest {
 
     public JsonRegisterAppRequest(String serial, @Nullable String accessToken, String frc,
-            JsonWebSiteCookie[] webSiteCookies) {
+            List<JsonWebSiteCookie> webSiteCookies) {
         registrationData.deviceSerial = serial;
         authData.accessToken = accessToken;
         userContextMap.frc = frc;
@@ -48,7 +50,7 @@ public class JsonRegisterAppRequest {
 
     public static class Cookies {
         @SerializedName("website_cookies")
-        public @Nullable JsonWebSiteCookie @Nullable [] webSiteCookies;
+        public List<JsonWebSiteCookie> webSiteCookies = List.of();
         public @Nullable String domain = ".amazon.com";
     }
 
index 2349796a3a2e29f2145ec42f463b912f4d6ac2c7..baaafeb26db6db5b8cd2a080e46b9aa045d12b1b 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -30,12 +32,12 @@ public class JsonSmartHomeCapabilities {
     }
 
     public static class Properties {
-        public @Nullable Property @Nullable [] supported;
+        public @Nullable List<Property> supported;
     }
 
     public static class Property {
         public @Nullable String name;
     }
 
-    public @Nullable SmartHomeCapability @Nullable [] capabilites;
+    public @Nullable List<SmartHomeCapability> capabilites;
 }
index 9e6bea857c6e6fbd8f34bbe5174416f452ac8a7b..b9167701aa4ac40f571a8d3a175708bf476d2ccc 100644 (file)
@@ -12,8 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
-import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
@@ -28,17 +28,6 @@ import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeTags.Js
 public class JsonSmartHomeDevices {
     public static class SmartHomeDevice implements SmartHomeBaseDevice {
         public @Nullable Integer updateIntervalInSeconds;
-
-        @Override
-        public @Nullable String findId() {
-            return applianceId;
-        }
-
-        @Override
-        public boolean isGroup() {
-            return false;
-        }
-
         public @Nullable String applianceId;
         public @Nullable String manufacturerName;
         public @Nullable String friendlyDescription;
@@ -47,14 +36,29 @@ public class JsonSmartHomeDevices {
         public @Nullable String reachability;
         public @Nullable String entityId;
         public @Nullable SmartHomeDeviceNetworkState applianceNetworkState;
-        public @Nullable SmartHomeCapability @Nullable [] capabilities;
+        public @Nullable List<SmartHomeCapability> capabilities;
         public @Nullable JsonSmartHomeTag tags;
-        public @Nullable String @Nullable [] applianceTypes;
-        public @Nullable JsonSmartHomeDeviceAlias @Nullable [] aliases;
-        public @Nullable SmartHomeDevice @Nullable [] groupDevices;
+        public @Nullable List<String> applianceTypes;
+        public @Nullable List<JsonSmartHomeDeviceAlias> aliases;
+        public @Nullable List<SmartHomeDevice> groupDevices;
         public @Nullable String connectedVia;
         public @Nullable DriverIdentity driverIdentity;
-        public List<String> mergedApplianceIds = List.of();
+        public @Nullable List<String> mergedApplianceIds;
+        public @Nullable List<SmartHomeDevice> smarthomeDevices;
+
+        public List<SmartHomeCapability> getCapabilities() {
+            return Objects.requireNonNullElse(capabilities, List.of());
+        }
+
+        @Override
+        public @Nullable String findId() {
+            return applianceId;
+        }
+
+        @Override
+        public boolean isGroup() {
+            return false;
+        }
 
         @Override
         public String toString() {
@@ -62,11 +66,10 @@ public class JsonSmartHomeDevices {
                     + applianceId + '\'' + ", manufacturerName='" + manufacturerName + '\'' + ", friendlyDescription='"
                     + friendlyDescription + '\'' + ", modelName='" + modelName + '\'' + ", friendlyName='"
                     + friendlyName + '\'' + ", reachability='" + reachability + '\'' + ", entityId='" + entityId + '\''
-                    + ", applianceNetworkState=" + applianceNetworkState + ", capabilities="
-                    + Arrays.toString(capabilities) + ", tags=" + tags + ", applianceTypes="
-                    + Arrays.toString(applianceTypes) + ", aliases=" + Arrays.toString(aliases) + ", groupDevices="
-                    + Arrays.toString(groupDevices) + ", connectedVia='" + connectedVia + '\'' + ", driverIdentity="
-                    + driverIdentity + ", mergedApplianceIds=" + mergedApplianceIds + '}';
+                    + ", applianceNetworkState=" + applianceNetworkState + ", capabilities=" + capabilities + ", tags="
+                    + tags + ", applianceTypes=" + applianceTypes + ", aliases=" + aliases + ", groupDevices="
+                    + groupDevices + ", connectedVia='" + connectedVia + '\'' + ", driverIdentity=" + driverIdentity
+                    + ", mergedApplianceIds=" + mergedApplianceIds + ", smarthomeDevices=" + smarthomeDevices + '}';
         }
     }
 
@@ -79,6 +82,4 @@ public class JsonSmartHomeDevices {
             return "DriverIdentity{" + "namespace='" + namespace + '\'' + ", identifier='" + identifier + '\'' + '}';
         }
     }
-
-    public @Nullable SmartHomeDevice @Nullable [] smarthomeDevices;
 }
index 84ccf167d09d49abf0bf6001eedaec07b98da928..dda715574235f49e0a1c8561f3d48fcd64b1d765 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -23,8 +25,8 @@ import org.eclipse.jdt.annotation.Nullable;
 @NonNullByDefault
 public class JsonSmartHomeGroupIdentity {
     public static class SmartHomeGroupIdentity {
-        public @Nullable String @Nullable [] groupIdentity;
+        public @Nullable List<String> groupIdentity;
     }
 
-    public @Nullable SmartHomeGroupIdentity @Nullable [] groupIdentity;
+    public @Nullable List<SmartHomeGroupIdentity> groupIdentity;
 }
index 2a016f3eeccc9a9506593d5b81fd6c10f2c990ce..87fb838718505ffa173baf550f545bb892e84464 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeGroupIdentifiers.SmartHomeGroupIdentifier;
@@ -54,5 +56,5 @@ public class JsonSmartHomeGroups {
         }
     }
 
-    public @Nullable SmartHomeGroup @Nullable [] groups;
+    public @Nullable List<SmartHomeGroup> groups;
 }
index ac8e7e60865e164f9e4facf24938eed516b2bdf5..003e0de351c11e1d6921c019e906cc369e771747 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -26,7 +28,7 @@ public class JsonUsersMeResponse {
     public @Nullable String effectiveMarketPlaceId;
     public @Nullable String email;
     public @Nullable Boolean eulaAcceptance;
-    public @Nullable String @Nullable [] features;
+    public @Nullable List<String> features;
     public @Nullable String fullName;
     public @Nullable Boolean hasActiveDopplers;
     public @Nullable String id;
index a8fec6ed54d9743dc5ef6f706d2db86ea1fec3ef..e3c57b363ec12e96985cfb2539c7324243886c3f 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.amazonechocontrol.internal.jsons;
 
+import java.util.List;
+
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 
@@ -22,7 +24,7 @@ import org.eclipse.jdt.annotation.Nullable;
  */
 @NonNullByDefault
 public class JsonWakeWords {
-    public @Nullable WakeWord @Nullable [] wakeWords;
+    public @Nullable List<WakeWord> wakeWords;
 
     public static class WakeWord {
         public @Nullable Boolean active;
index e6bc6b6b49a8b9089f397e854a551e746283427f..a5a3503689347381728000f42b13819c6d51870a 100644 (file)
  */
 package org.openhab.binding.amazonechocontrol.internal.smarthome;
 
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.Supplier;
+import java.util.function.Function;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.core.thing.type.ChannelTypeUID;
 
 /**
@@ -26,20 +26,15 @@ import org.openhab.core.thing.type.ChannelTypeUID;
  */
 @NonNullByDefault
 public class Constants {
-    public static final Map<String, Supplier<HandlerBase>> HANDLER_FACTORY = new HashMap<>();
-
-    static {
-        HANDLER_FACTORY.put(HandlerPowerController.INTERFACE, HandlerPowerController::new);
-        HANDLER_FACTORY.put(HandlerBrightnessController.INTERFACE, HandlerBrightnessController::new);
-        HANDLER_FACTORY.put(HandlerColorController.INTERFACE, HandlerColorController::new);
-        HANDLER_FACTORY.put(HandlerColorTemperatureController.INTERFACE, HandlerColorTemperatureController::new);
-        HANDLER_FACTORY.put(HandlerSecurityPanelController.INTERFACE, HandlerSecurityPanelController::new);
-        HANDLER_FACTORY.put(HandlerAcousticEventSensor.INTERFACE, HandlerAcousticEventSensor::new);
-        HANDLER_FACTORY.put(HandlerTemperatureSensor.INTERFACE, HandlerTemperatureSensor::new);
-        HANDLER_FACTORY.put(HandlerThermostatController.INTERFACE, HandlerThermostatController::new);
-        HANDLER_FACTORY.put(HandlerPercentageController.INTERFACE, HandlerPercentageController::new);
-        HANDLER_FACTORY.put(HandlerPowerLevelController.INTERFACE, HandlerPowerLevelController::new);
-    }
+    public static final Map<String, Function<SmartHomeDeviceHandler, HandlerBase>> HANDLER_FACTORY = Map.of(
+            HandlerPowerController.INTERFACE, HandlerPowerController::new, HandlerBrightnessController.INTERFACE,
+            HandlerBrightnessController::new, HandlerColorController.INTERFACE, HandlerColorController::new,
+            HandlerColorTemperatureController.INTERFACE, HandlerColorTemperatureController::new,
+            HandlerSecurityPanelController.INTERFACE, HandlerSecurityPanelController::new,
+            HandlerAcousticEventSensor.INTERFACE, HandlerAcousticEventSensor::new, HandlerTemperatureSensor.INTERFACE,
+            HandlerTemperatureSensor::new, HandlerThermostatController.INTERFACE, HandlerThermostatController::new,
+            HandlerPercentageController.INTERFACE, HandlerPercentageController::new,
+            HandlerPowerLevelController.INTERFACE, HandlerPowerLevelController::new);
 
     public static final Set<String> SUPPORTED_INTERFACES = HANDLER_FACTORY.keySet();
 
index e66f52767552b1892ab1086818f63d9ca521f8f1..76a6b3f147eeff244a2f4f590837859296cb8f47 100644 (file)
@@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.OpenClosedType;
@@ -57,6 +58,10 @@ public class HandlerAcousticEventSensor extends HandlerBase {
             "smokeAlarmDetectionState" /* propertyName */ , "smokeAlarmDetectionState" /* ChannelId */,
             CHANNEL_TYPE_SMOKE_ALARM_DETECTION_STATE /* Channel Type */ , ITEM_TYPE_CONTACT /* Item Type */);
 
+    public HandlerAcousticEventSensor(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     private ChannelInfo[] getAlarmChannels() {
         return new ChannelInfo[] { GLASS_BREAK_DETECTION_STATE, SMOKE_ALARM_DETECTION_STATE };
     }
@@ -101,7 +106,7 @@ public class HandlerAcousticEventSensor extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command) throws IOException {
+            List<SmartHomeCapability> capabilities, String channelId, Command command) throws IOException {
         return false;
     }
 
index a2648e048a6ca8494b4a7ff65dbf8498b7aae2ee..7bd685fa556afc487ad316a1a269355bb723d399 100644 (file)
 package org.openhab.binding.amazonechocontrol.internal.smarthome;
 
 import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
+import java.util.*;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
 import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
+import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.Properties;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.Property;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
@@ -39,15 +36,19 @@ import com.google.gson.JsonObject;
  */
 @NonNullByDefault
 public abstract class HandlerBase {
-    protected @Nullable SmartHomeDeviceHandler smartHomeDeviceHandler;
+    protected SmartHomeDeviceHandler smartHomeDeviceHandler;
     protected Map<String, ChannelInfo> channels = new HashMap<>();
 
+    public HandlerBase(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        this.smartHomeDeviceHandler = smartHomeDeviceHandler;
+    }
+
     protected abstract ChannelInfo @Nullable [] findChannelInfos(SmartHomeCapability capability, String property);
 
     public abstract void updateChannels(String interfaceName, List<JsonObject> stateList, UpdateChannelResult result);
 
     public abstract boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException;
 
     public abstract @Nullable StateDescription findStateDescription(String channelId,
@@ -59,38 +60,30 @@ public abstract class HandlerBase {
 
     public abstract String[] getSupportedInterface();
 
-    SmartHomeDeviceHandler getSmartHomeDeviceHandler() throws IllegalStateException {
-        SmartHomeDeviceHandler smartHomeDeviceHandler = this.smartHomeDeviceHandler;
-        if (smartHomeDeviceHandler == null) {
-            throw new IllegalStateException("Handler not initialized");
-        }
+    SmartHomeDeviceHandler getSmartHomeDeviceHandler() {
         return smartHomeDeviceHandler;
     }
 
-    public Collection<ChannelInfo> initialize(SmartHomeDeviceHandler smartHomeDeviceHandler,
-            List<SmartHomeCapability> capabilities) {
-        this.smartHomeDeviceHandler = smartHomeDeviceHandler;
+    public Collection<ChannelInfo> initialize(List<SmartHomeCapability> capabilities) {
         Map<String, ChannelInfo> channels = new HashMap<>();
         for (SmartHomeCapability capability : capabilities) {
             Properties properties = capability.properties;
             if (properties != null) {
-                Property @Nullable [] supported = properties.supported;
-                if (supported != null) {
-                    for (Property property : supported) {
-                        if (property != null) {
-                            String name = property.name;
-                            if (name != null) {
-                                ChannelInfo[] channelInfos = findChannelInfos(capability, name);
-                                if (channelInfos != null) {
-                                    for (ChannelInfo channelInfo : channelInfos) {
-                                        if (channelInfo != null) {
-                                            channels.put(channelInfo.channelId, channelInfo);
-                                        }
-                                    }
+                List<JsonSmartHomeCapabilities.Property> supported = Objects.requireNonNullElse(properties.supported,
+                        List.of());
+                for (Property property : supported) {
+                    String name = property.name;
+                    if (name != null) {
+                        ChannelInfo[] channelInfos = findChannelInfos(capability, name);
+                        if (channelInfos != null) {
+                            for (ChannelInfo channelInfo : channelInfos) {
+                                if (channelInfo != null) {
+                                    channels.put(channelInfo.channelId, channelInfo);
                                 }
                             }
                         }
                     }
+
                 }
             }
         }
@@ -98,19 +91,14 @@ public abstract class HandlerBase {
         return channels.values();
     }
 
-    protected boolean containsCapabilityProperty(SmartHomeCapability[] capabilties, String propertyName) {
-        for (SmartHomeCapability capability : capabilties) {
+    protected boolean containsCapabilityProperty(List<SmartHomeCapability> capabilities, String propertyName) {
+        for (SmartHomeCapability capability : capabilities) {
             Properties properties = capability.properties;
             if (properties != null) {
-                Property @Nullable [] supportedProperties = properties.supported;
-                if (supportedProperties != null) {
-                    for (Property property : supportedProperties) {
-                        if (property != null) {
-                            if (propertyName != null && propertyName.equals(property.name)) {
-                                return true;
-                            }
-                        }
-                    }
+                List<JsonSmartHomeCapabilities.Property> supported = Objects.requireNonNullElse(properties.supported,
+                        List.of());
+                if (supported.stream().anyMatch(p -> propertyName.equals(p.name))) {
+                    return true;
                 }
             }
         }
index 8e16bb8e55c1b926726869260d3d8af2337f0f19..096fb1ec48415df77558b7d447c3dc16c1522805 100644 (file)
@@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.IncreaseDecreaseType;
@@ -56,6 +57,10 @@ public class HandlerBrightnessController extends HandlerBase {
 
     private @Nullable Integer lastBrightness;
 
+    public HandlerBrightnessController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE };
@@ -91,10 +96,10 @@ public class HandlerBrightnessController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(BRIGHTNESS.channelId)) {
-            if (containsCapabilityProperty(capabilties, BRIGHTNESS.propertyName)) {
+            if (containsCapabilityProperty(capabilities, BRIGHTNESS.propertyName)) {
                 if (command.equals(IncreaseDecreaseType.INCREASE)) {
                     Integer lastBrightness = this.lastBrightness;
                     if (lastBrightness != null) {
index 8e462fd24fb803b86cf22ee27e68d39211c2b241..d4ff785440a92cd48924af11312d7d1990a4460a 100644 (file)
@@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.DecimalType;
@@ -65,6 +66,10 @@ public class HandlerColorController extends HandlerBase {
     private @Nullable HSBType lastColor;
     private @Nullable String lastColorName;
 
+    public HandlerColorController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE, INTERFACE_COLOR_PROPERTIES };
@@ -123,10 +128,10 @@ public class HandlerColorController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(COLOR.channelId)) {
-            if (containsCapabilityProperty(capabilties, COLOR.propertyName)) {
+            if (containsCapabilityProperty(capabilities, COLOR.propertyName)) {
                 if (command instanceof HSBType) {
                     HSBType color = ((HSBType) command);
                     JsonObject colorObject = new JsonObject();
@@ -138,7 +143,7 @@ public class HandlerColorController extends HandlerBase {
             }
         }
         if (channelId.equals(COLOR_PROPERTIES.channelId)) {
-            if (containsCapabilityProperty(capabilties, COLOR.propertyName)) {
+            if (containsCapabilityProperty(capabilities, COLOR.propertyName)) {
                 if (command instanceof StringType) {
                     String colorName = command.toFullString();
                     if (!colorName.isEmpty()) {
index 0de442d3deafb4d0c6dd6f8e46f7f47a85a55426..bf763d1d9b2c5d41c480dccb4316a888a93581d3 100644 (file)
@@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.DecimalType;
@@ -65,6 +66,10 @@ public class HandlerColorTemperatureController extends HandlerBase {
     private @Nullable Integer lastColorTemperature;
     private @Nullable String lastColorName;
 
+    public HandlerColorTemperatureController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE, INTERFACE_COLOR_PROPERTIES };
@@ -120,11 +125,11 @@ public class HandlerColorTemperatureController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(COLOR_TEMPERATURE_IN_KELVIN.channelId)) {
             // WRITING TO THIS CHANNEL DOES CURRENTLY NOT WORK, BUT WE LEAVE THE CODE FOR FUTURE USE!
-            if (containsCapabilityProperty(capabilties, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
+            if (containsCapabilityProperty(capabilities, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
                 if (command instanceof DecimalType) {
                     int intValue = ((DecimalType) command).intValue();
                     if (intValue < 1000) {
@@ -139,7 +144,7 @@ public class HandlerColorTemperatureController extends HandlerBase {
             }
         }
         if (channelId.equals(COLOR_TEMPERATURE_NAME.channelId)) {
-            if (containsCapabilityProperty(capabilties, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
+            if (containsCapabilityProperty(capabilities, COLOR_TEMPERATURE_IN_KELVIN.propertyName)) {
                 if (command instanceof StringType) {
                     String colorTemperatureName = command.toFullString();
                     if (!colorTemperatureName.isEmpty()) {
index fee62032ba195296a29fc99add768e69490ff45e..6d2943472f743dd2936b7f621cb289da16caf181 100644 (file)
@@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.IncreaseDecreaseType;
@@ -56,6 +57,10 @@ public class HandlerPercentageController extends HandlerBase {
 
     private @Nullable Integer lastPercentage;
 
+    public HandlerPercentageController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE };
@@ -91,10 +96,10 @@ public class HandlerPercentageController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(PERCENTAGE.channelId)) {
-            if (containsCapabilityProperty(capabilties, PERCENTAGE.propertyName)) {
+            if (containsCapabilityProperty(capabilities, PERCENTAGE.propertyName)) {
                 if (command.equals(IncreaseDecreaseType.INCREASE)) {
                     Integer lastPercentage = this.lastPercentage;
                     if (lastPercentage != null) {
index 1c63fcea0106ccde320dea963dcd3e57bd6caab9..255625a828f7eb3b7b69e308f06fa2b89fbe9174 100644 (file)
@@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.OnOffType;
@@ -56,6 +57,10 @@ public class HandlerPowerController extends HandlerBase {
             "powerState" /* ChannelId */, CHANNEL_TYPE_POWER_STATE /* Channel Type */ ,
             ITEM_TYPE_SWITCH /* Item Type */);
 
+    public HandlerPowerController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE };
@@ -77,12 +82,7 @@ public class HandlerPowerController extends HandlerBase {
             if (POWER_STATE.propertyName.equals(state.get("name").getAsString())) {
                 String value = state.get("value").getAsString();
                 // For groups take true if all true
-                if ("ON".equals(value)) {
-                    powerStateValue = true;
-                } else {
-                    powerStateValue = false;
-                }
-
+                powerStateValue = "ON".equals(value);
             }
         }
         logger.trace("{} final state {}", this.smartHomeDeviceHandler.getId(), powerStateValue);
@@ -91,7 +91,7 @@ public class HandlerPowerController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilities, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(POWER_STATE.channelId)) {
             if (containsCapabilityProperty(capabilities, POWER_STATE.propertyName)) {
index 2fb7be06efd1ce9ba0077ed3f4e85cb6d2dbae29..141e039e16e01fe392c59bb2be6ad85753c46beb 100644 (file)
@@ -22,6 +22,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.IncreaseDecreaseType;
@@ -56,6 +57,10 @@ public class HandlerPowerLevelController extends HandlerBase {
 
     private @Nullable Integer lastPowerLevel;
 
+    public HandlerPowerLevelController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE };
@@ -92,10 +97,10 @@ public class HandlerPowerLevelController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(POWER_LEVEL.channelId)) {
-            if (containsCapabilityProperty(capabilties, POWER_LEVEL.propertyName)) {
+            if (containsCapabilityProperty(capabilities, POWER_LEVEL.propertyName)) {
                 if (command.equals(IncreaseDecreaseType.INCREASE)) {
                     Integer lastPowerLevel = this.lastPowerLevel;
                     if (lastPowerLevel != null) {
index c9354762de667a48194fddde7210e37f0920eecc..a2e743d8d5a4131b3437158e417190b1bd3b5df8 100644 (file)
@@ -23,6 +23,7 @@ import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.AmazonEchoControlBindingConstants;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.OpenClosedType;
@@ -81,6 +82,10 @@ public class HandlerSecurityPanelController extends HandlerBase {
             "waterAlarm" /* ChannelId */, CHANNEL_TYPE_WATER_ALARM /* Channel Type */ ,
             ITEM_TYPE_CONTACT /* Item Type */);
 
+    public HandlerSecurityPanelController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     private ChannelInfo[] getAlarmChannels() {
         return new ChannelInfo[] { BURGLARY_ALARM, CARBON_MONOXIDE_ALARM, FIRE_ALARM, WATER_ALARM };
     }
@@ -146,7 +151,7 @@ public class HandlerSecurityPanelController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilities, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(ARM_STATE.channelId)) {
             if (containsCapabilityProperty(capabilities, ARM_STATE.propertyName)) {
index b7722c7de42166e85ce2d863f428c0aa14e6e131..622a8dc8a12e0b6dba18a514528e305672cbe4c6 100644 (file)
@@ -23,6 +23,7 @@ import javax.measure.quantity.Temperature;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.QuantityType;
@@ -49,6 +50,10 @@ public class HandlerTemperatureSensor extends HandlerBase {
             "temperature" /* ChannelId */, CHANNEL_TYPE_TEMPERATURE /* Channel Type */ ,
             ITEM_TYPE_NUMBER_TEMPERATURE /* Item Type */);
 
+    public HandlerTemperatureSensor(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE };
@@ -85,7 +90,7 @@ public class HandlerTemperatureSensor extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command) throws IOException {
+            List<SmartHomeCapability> capabilities, String channelId, Command command) throws IOException {
         return false;
     }
 
index 466818817ec0358bbf96b2d3ec086a5d719d69ac..99a1924d36664d2efb7a618893f3aeca2696906c 100644 (file)
@@ -23,6 +23,7 @@ import javax.measure.quantity.Temperature;
 import org.eclipse.jdt.annotation.NonNullByDefault;
 import org.eclipse.jdt.annotation.Nullable;
 import org.openhab.binding.amazonechocontrol.internal.Connection;
+import org.openhab.binding.amazonechocontrol.internal.handler.SmartHomeDeviceHandler;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.openhab.core.library.types.QuantityType;
@@ -48,6 +49,10 @@ public class HandlerThermostatController extends HandlerBase {
             "targetSetpoint" /* ChannelId */, CHANNEL_TYPE_TEMPERATURE /* Channel Type */ ,
             ITEM_TYPE_NUMBER_TEMPERATURE /* Item Type */);
 
+    public HandlerThermostatController(SmartHomeDeviceHandler smartHomeDeviceHandler) {
+        super(smartHomeDeviceHandler);
+    }
+
     @Override
     public String[] getSupportedInterface() {
         return new String[] { INTERFACE };
@@ -84,10 +89,10 @@ public class HandlerThermostatController extends HandlerBase {
 
     @Override
     public boolean handleCommand(Connection connection, SmartHomeDevice shd, String entityId,
-            SmartHomeCapability[] capabilties, String channelId, Command command)
+            List<SmartHomeCapability> capabilities, String channelId, Command command)
             throws IOException, InterruptedException {
         if (channelId.equals(TARGET_SETPOINT.channelId)) {
-            if (containsCapabilityProperty(capabilties, TARGET_SETPOINT.propertyName)) {
+            if (containsCapabilityProperty(capabilities, TARGET_SETPOINT.propertyName)) {
                 if (command instanceof QuantityType) {
                     connection.smartHomeCommand(entityId, "setTargetTemperature", "targetTemperature", command);
                     return true;
index 8cdebfe584814a2c3f3a41dd862b52a0c5021d45..3c989fbb690fa57017358f64b54b7023bda36142 100644 (file)
@@ -20,7 +20,6 @@ import java.util.Map;
 import java.util.Set;
 
 import org.eclipse.jdt.annotation.NonNullByDefault;
-import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeCapabilities.SmartHomeCapability;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.DriverIdentity;
 import org.openhab.binding.amazonechocontrol.internal.jsons.JsonSmartHomeDevices.SmartHomeDevice;
 import org.slf4j.Logger;
@@ -64,15 +63,11 @@ public class SmartHomeDeviceStateGroupUpdateCalculator {
         if (updateIntervalInSeconds != null) {
             return updateIntervalInSeconds;
         }
-        SmartHomeCapability[] capabilities = shd.capabilities;
-        if (capabilities != null) {
-            for (SmartHomeCapability capability : capabilities) {
-                if (capability != null && HandlerAcousticEventSensor.INTERFACE.equals(capability.interfaceName)) {
-                    updateIntervalInSeconds = UPDATE_INTERVAL_ACOUSTIC_EVENTS_IN_SECONDS;
-                    break;
-                }
-            }
+        if (shd.getCapabilities().stream()
+                .anyMatch(capability -> HandlerAcousticEventSensor.INTERFACE.equals(capability.interfaceName))) {
+            updateIntervalInSeconds = UPDATE_INTERVAL_ACOUSTIC_EVENTS_IN_SECONDS;
         }
+
         if (updateIntervalInSeconds == null) {
             String manufacturerName = shd.manufacturerName;
             if (manufacturerName != null && ("openHAB".equalsIgnoreCase(manufacturerName)