]> git.basschouten.com Git - openhab-addons.git/commitdiff
[mqtt.homeassistant] Stable jsondb discovery result (#13401)
authorSami Salonen <ssalonen@gmail.com>
Sun, 18 Sep 2022 16:20:49 +0000 (19:20 +0300)
committerGitHub <noreply@github.com>
Sun, 18 Sep 2022 16:20:49 +0000 (18:20 +0200)
* [mqtt.homeassistant] Stable jsondb serialization for discovery results

Similar to openhab/openhab-core#2436, we want
to have consistent ordering of data in JSONDB. This is fixing the jsondb
order for mqtt.homeassistant discovery results, specifically, the
"topics" property.

* [mqtt.homeassistant] order using full topic string, not by subcomponent

Signed-off-by: Sami Salonen <ssalonen@gmail.com>
bundles/org.openhab.binding.mqtt.homeassistant/src/main/java/org/openhab/binding/mqtt/homeassistant/internal/discovery/HomeAssistantDiscovery.java

index 7cef2b954286f7bcfd37b1006b73f0e6defcf9cd..b8b9ae5975150fb6d5a7c28c09647c7dfab6ea4e 100644 (file)
@@ -16,9 +16,11 @@ import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeMap;
 import java.util.concurrent.ConcurrentHashMap;
@@ -166,8 +168,21 @@ public class HomeAssistantDiscovery extends AbstractMQTTDiscovery {
             thingIDPerTopic.put(topic, thingUID);
 
             // We need to keep track of already found component topics for a specific thing
-            Set<HaID> components = componentsPerThingID.computeIfAbsent(thingID, key -> ConcurrentHashMap.newKeySet());
-            components.add(haID);
+            final List<HaID> components;
+            {
+                Set<HaID> componentsUnordered = componentsPerThingID.computeIfAbsent(thingID,
+                        key -> ConcurrentHashMap.newKeySet());
+
+                // Invariant. For compiler, computeIfAbsent above returns always
+                // non-null
+                Objects.requireNonNull(componentsUnordered);
+                componentsUnordered.add(haID);
+
+                components = componentsUnordered.stream().collect(Collectors.toList());
+                // We sort the components for consistent jsondb serialization order of 'topics' thing property
+                // Sorting key is HaID::toString, i.e. using the full topic string
+                components.sort(Comparator.comparing(HaID::toString));
+            }
 
             final String componentNames = components.stream().map(id -> id.component)
                     .map(c -> HA_COMP_TO_NAME.getOrDefault(c, c)).collect(Collectors.joining(", "));