]> git.basschouten.com Git - openhab-addons.git/commitdiff
[netatmo] Prevent `IndexOutOfBoundsException` (#17448)
authorGaël L'hopital <gael@lhopital.org>
Fri, 20 Sep 2024 13:34:43 +0000 (15:34 +0200)
committerGitHub <noreply@github.com>
Fri, 20 Sep 2024 13:34:43 +0000 (15:34 +0200)
* Preventing IndexOutOfBoundsException

Signed-off-by: Gaël L'hopital <gael@lhopital.org>
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/api/SecurityApi.java
bundles/org.openhab.binding.netatmo/src/main/java/org/openhab/binding/netatmo/internal/handler/capability/SecurityCapability.java

index e7c08e8157affd2237798aac414f76c9ce7289f5..28825bf3ef66c4a3fa4b320467cd0103a2e34497 100644 (file)
@@ -80,19 +80,20 @@ public class SecurityApi extends RestManager {
         throw new NetatmoException("home should not be null");
     }
 
-    public List<HomeEvent> getHomeEvents(String homeId, @Nullable ZonedDateTime freshestEventTime)
-            throws NetatmoException {
+    public List<HomeEvent> getHomeEvents(String homeId, ZonedDateTime freshestEventTime) throws NetatmoException {
         List<HomeEvent> events = getEvents(PARAM_HOME_ID, homeId);
 
-        // we have to rewind to the latest event just after oldestKnown
-        HomeEvent oldestRetrieved = events.get(events.size() - 1);
-        while (freshestEventTime != null && oldestRetrieved.getTime().isAfter(freshestEventTime)) {
-            events.addAll(getEvents(PARAM_HOME_ID, homeId, PARAM_EVENT_ID, oldestRetrieved.getId()));
-            oldestRetrieved = events.get(events.size() - 1);
+        // we have to rewind to the latest event just after freshestEventTime
+        if (events.size() > 0) {
+            HomeEvent oldestRetrieved = events.get(events.size() - 1);
+            while (oldestRetrieved.getTime().isAfter(freshestEventTime)) {
+                events.addAll(getEvents(PARAM_HOME_ID, homeId, PARAM_EVENT_ID, oldestRetrieved.getId()));
+                oldestRetrieved = events.get(events.size() - 1);
+            }
         }
 
-        // Remove unneeded events being before oldestKnown
-        return events.stream().filter(event -> freshestEventTime == null || event.getTime().isAfter(freshestEventTime))
+        // Remove unneeded events being before freshestEventTime
+        return events.stream().filter(event -> event.getTime().isAfter(freshestEventTime))
                 .sorted(Comparator.comparing(HomeEvent::getTime).reversed()).toList();
     }
 
index f583dfeabf9458e8792d48fd1144f280da084015..f3dca854c85d0fe68544b25ad66b9d439f64b7dc 100644 (file)
@@ -12,6 +12,8 @@
  */
 package org.openhab.binding.netatmo.internal.handler.capability;
 
+import java.time.Instant;
+import java.time.ZoneId;
 import java.time.ZonedDateTime;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -48,11 +50,13 @@ import org.slf4j.LoggerFactory;
  */
 @NonNullByDefault
 class SecurityCapability extends RestCapability<SecurityApi> {
-    private final Logger logger = LoggerFactory.getLogger(SecurityCapability.class);
+    private final static ZonedDateTime ZDT_REFERENCE = ZonedDateTime.ofInstant(Instant.ofEpochMilli(0),
+            ZoneId.systemDefault());
 
+    private final Logger logger = LoggerFactory.getLogger(SecurityCapability.class);
     private final Map<String, HomeEvent> eventBuffer = new HashMap<>();
-    private @Nullable ZonedDateTime freshestEventTime;
 
+    private ZonedDateTime freshestEventTime = ZDT_REFERENCE;
     private NAObjectMap<HomeDataPerson> persons = new NAObjectMap<>();
     private NAObjectMap<HomeDataModule> modules = new NAObjectMap<>();
     private String securityId = "";
@@ -64,7 +68,7 @@ class SecurityCapability extends RestCapability<SecurityApi> {
     @Override
     public void initialize() {
         super.initialize();
-        freshestEventTime = null;
+        freshestEventTime = ZDT_REFERENCE;
         securityId = handler.getThingConfigAs(HomeConfiguration.class).getIdForArea(FeatureArea.SECURITY);
     }
 
@@ -132,7 +136,7 @@ class SecurityCapability extends RestCapability<SecurityApi> {
                         eventBuffer.put(personId, event);
                     }
                 }
-                if (freshestEventTime == null || event.getTime().isAfter(freshestEventTime)) {
+                if (event.getTime().isAfter(freshestEventTime)) {
                     freshestEventTime = event.getTime();
                 }
             }