From cb19001af0d7fafced4293e7dd7d6d3e090329ae Mon Sep 17 00:00:00 2001 From: jimtng <2554958+jimtng@users.noreply.github.com> Date: Sun, 28 Jul 2024 02:38:06 +1000 Subject: [PATCH] Clean up removed links in GenericItemChannelLinkProvider (#4326) * Clean up removed links in GenericItemChannelLinkProvider * defer processing until stopConfigurationUpdate is called Signed-off-by: Jimmy Tanagra --- .../internal/GenericItemChannelLinkProvider.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/bundles/org.openhab.core.model.thing/src/org/openhab/core/model/thing/internal/GenericItemChannelLinkProvider.java b/bundles/org.openhab.core.model.thing/src/org/openhab/core/model/thing/internal/GenericItemChannelLinkProvider.java index 0bdc017af26..8d3ff49cf36 100644 --- a/bundles/org.openhab.core.model.thing/src/org/openhab/core/model/thing/internal/GenericItemChannelLinkProvider.java +++ b/bundles/org.openhab.core.model.thing/src/org/openhab/core/model/thing/internal/GenericItemChannelLinkProvider.java @@ -50,6 +50,8 @@ public class GenericItemChannelLinkProvider extends AbstractProvider> itemChannelLinkMap = new ConcurrentHashMap<>(); + private Map> addedItemChannels = new ConcurrentHashMap<>(); + /** * stores information about the context of items. The map has this content * structure: context -> Set of Item names @@ -120,6 +122,7 @@ private void createItemChannelLink(String context, String itemName, String chann } else { notifyListenersAboutUpdatedElement(oldLink, itemChannelLink); } + addedItemChannels.computeIfAbsent(itemName, k -> new HashSet<>(2)).add(channelUIDObject); } @Override @@ -146,6 +149,17 @@ public void stopConfigurationUpdate(String context) { } } Optional.ofNullable(contextMap.get(context)).ifPresent(ctx -> ctx.removeAll(previousItemNames)); + + addedItemChannels.forEach((itemName, addedChannelUIDs) -> { + Map links = itemChannelLinkMap.getOrDefault(itemName, Map.of()); + Set removedChannelUIDs = new HashSet<>(links.keySet()); + removedChannelUIDs.removeAll(addedChannelUIDs); + removedChannelUIDs.forEach(removedChannelUID -> { + ItemChannelLink link = links.remove(removedChannelUID); + notifyListenersAboutRemovedElement(link); + }); + }); + addedItemChannels.clear(); } @Override