From f29034fe878ef65404c4a6c1521b1492813daf4b Mon Sep 17 00:00:00 2001 From: eugen Date: Sat, 19 Feb 2022 09:21:52 +0100 Subject: [PATCH] [homekit] mark item dirty only if it has homekit metadata (#12293) * mark item dirty only if it has homekit metadata Signed-off-by: Eugen Freiter --- .../internal/HomekitChangeListener.java | 58 ++++++++++++------- 1 file changed, 38 insertions(+), 20 deletions(-) diff --git a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java index f0fcbcf86..e3148fd19 100644 --- a/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java +++ b/bundles/org.openhab.io.homekit/src/main/java/org/openhab/io/homekit/internal/HomekitChangeListener.java @@ -32,6 +32,7 @@ import org.openhab.core.items.ItemNotFoundException; import org.openhab.core.items.ItemRegistry; import org.openhab.core.items.ItemRegistryChangeListener; import org.openhab.core.items.Metadata; +import org.openhab.core.items.MetadataKey; import org.openhab.core.items.MetadataRegistry; import org.openhab.core.storage.Storage; import org.openhab.core.storage.StorageService; @@ -88,31 +89,40 @@ public class HomekitChangeListener implements ItemRegistryChangeListener { metadataChangeListener = new RegistryChangeListener() { @Override public void added(final Metadata metadata) { - try { - markDirty(itemRegistry.getItem(metadata.getUID().getItemName())); - } catch (ItemNotFoundException e) { - logger.debug("Could not found item for metadata {}", metadata); + final MetadataKey uid = metadata.getUID(); + if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(uid.getNamespace())) { + try { + markDirty(itemRegistry.getItem(uid.getItemName())); + } catch (ItemNotFoundException e) { + logger.debug("Could not find item for metadata {}", metadata); + } } } @Override public void removed(final Metadata metadata) { - try { - markDirty(itemRegistry.getItem(metadata.getUID().getItemName())); - } catch (ItemNotFoundException e) { - logger.debug("Could not found item for metadata {}", metadata); + final MetadataKey uid = metadata.getUID(); + if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(uid.getNamespace())) { + try { + markDirty(itemRegistry.getItem(uid.getItemName())); + } catch (ItemNotFoundException e) { + logger.debug("Could not find item for metadata {}", metadata); + } } } @Override - public void updated(final Metadata metadata, final Metadata e1) { - try { - markDirty(itemRegistry.getItem(metadata.getUID().getItemName())); - if (!metadata.getUID().getItemName().equals(e1.getUID().getItemName())) { - markDirty(itemRegistry.getItem(e1.getUID().getItemName())); + public void updated(final Metadata oldMetadata, final Metadata newMetadata) { + final MetadataKey oldUid = oldMetadata.getUID(); + final MetadataKey newUid = newMetadata.getUID(); + if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(oldUid.getNamespace()) + || HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(newUid.getNamespace())) { + try { + // the item name is same in old and new metadata, so we can take any. + markDirty(itemRegistry.getItem(oldUid.getItemName())); + } catch (ItemNotFoundException e) { + logger.debug("Could not find item for metadata {}", oldMetadata); } - } catch (ItemNotFoundException e) { - logger.debug("Could not found item for metadata {}", metadata); } } }; @@ -148,9 +158,15 @@ public class HomekitChangeListener implements ItemRegistryChangeListener { accessoryRegistry.setConfigurationRevision(revision); } + private boolean hasHomeKitMetadata(Item item) { + return metadataRegistry.get(new MetadataKey(HomekitAccessoryFactory.METADATA_KEY, item.getUID())) != null; + } + @Override public synchronized void added(Item item) { - markDirty(item); + if (hasHomeKitMetadata(item)) { + markDirty(item); + } } @Override @@ -179,7 +195,9 @@ public class HomekitChangeListener implements ItemRegistryChangeListener { @Override public synchronized void removed(Item item) { - markDirty(item); + if (hasHomeKitMetadata(item)) { + markDirty(item); + } } private Optional getItemOptional(String name) { @@ -193,17 +211,17 @@ public class HomekitChangeListener implements ItemRegistryChangeListener { public void makeNewConfigurationRevision() { final int newRevision = accessoryRegistry.makeNewConfigurationRevision(); lastAccessoryCount = accessoryRegistry.getAllAccessories().size(); - logger.trace("make new configuration revision. new revision number {}, number of accessories {}", newRevision, + logger.trace("Make new configuration revision. new revision number {}, number of accessories {}", newRevision, lastAccessoryCount); storage.put(REVISION_CONFIG, "" + newRevision); storage.put(ACCESSORY_COUNT, "" + lastAccessoryCount); } private synchronized void applyUpdates() { - logger.trace("apply updates"); + logger.trace("Apply updates"); for (final String name : pendingUpdates) { accessoryRegistry.remove(name); - logger.trace(" add items {}", name); + logger.trace(" Add items {}", name); getItemOptional(name).ifPresent(this::createRootAccessories); } if (!pendingUpdates.isEmpty()) {