[mqtt.homeassistant] Stable jsondb discovery result (#13401)
* [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>
This commit is contained in:
parent
6ebf20f183
commit
2fd2e5175f
|
@ -16,9 +16,11 @@ import java.nio.charset.StandardCharsets;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
@ -166,8 +168,21 @@ public class HomeAssistantDiscovery extends AbstractMQTTDiscovery {
|
||||||
thingIDPerTopic.put(topic, thingUID);
|
thingIDPerTopic.put(topic, thingUID);
|
||||||
|
|
||||||
// We need to keep track of already found component topics for a specific thing
|
// We need to keep track of already found component topics for a specific thing
|
||||||
Set<HaID> components = componentsPerThingID.computeIfAbsent(thingID, key -> ConcurrentHashMap.newKeySet());
|
final List<HaID> components;
|
||||||
components.add(haID);
|
{
|
||||||
|
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)
|
final String componentNames = components.stream().map(id -> id.component)
|
||||||
.map(c -> HA_COMP_TO_NAME.getOrDefault(c, c)).collect(Collectors.joining(", "));
|
.map(c -> HA_COMP_TO_NAME.getOrDefault(c, c)).collect(Collectors.joining(", "));
|
||||||
|
|
Loading…
Reference in New Issue