[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 <freiter@gmx.de>
This commit is contained in:
eugen 2022-02-19 09:21:52 +01:00 committed by GitHub
parent bc7e01726f
commit f29034fe87
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -32,6 +32,7 @@ import org.openhab.core.items.ItemNotFoundException;
import org.openhab.core.items.ItemRegistry; import org.openhab.core.items.ItemRegistry;
import org.openhab.core.items.ItemRegistryChangeListener; import org.openhab.core.items.ItemRegistryChangeListener;
import org.openhab.core.items.Metadata; import org.openhab.core.items.Metadata;
import org.openhab.core.items.MetadataKey;
import org.openhab.core.items.MetadataRegistry; import org.openhab.core.items.MetadataRegistry;
import org.openhab.core.storage.Storage; import org.openhab.core.storage.Storage;
import org.openhab.core.storage.StorageService; import org.openhab.core.storage.StorageService;
@ -88,31 +89,40 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
metadataChangeListener = new RegistryChangeListener<Metadata>() { metadataChangeListener = new RegistryChangeListener<Metadata>() {
@Override @Override
public void added(final Metadata metadata) { public void added(final Metadata metadata) {
final MetadataKey uid = metadata.getUID();
if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(uid.getNamespace())) {
try { try {
markDirty(itemRegistry.getItem(metadata.getUID().getItemName())); markDirty(itemRegistry.getItem(uid.getItemName()));
} catch (ItemNotFoundException e) { } catch (ItemNotFoundException e) {
logger.debug("Could not found item for metadata {}", metadata); logger.debug("Could not find item for metadata {}", metadata);
}
} }
} }
@Override @Override
public void removed(final Metadata metadata) { public void removed(final Metadata metadata) {
final MetadataKey uid = metadata.getUID();
if (HomekitAccessoryFactory.METADATA_KEY.equalsIgnoreCase(uid.getNamespace())) {
try { try {
markDirty(itemRegistry.getItem(metadata.getUID().getItemName())); markDirty(itemRegistry.getItem(uid.getItemName()));
} catch (ItemNotFoundException e) { } catch (ItemNotFoundException e) {
logger.debug("Could not found item for metadata {}", metadata); logger.debug("Could not find item for metadata {}", metadata);
}
} }
} }
@Override @Override
public void updated(final Metadata metadata, final Metadata e1) { 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 { try {
markDirty(itemRegistry.getItem(metadata.getUID().getItemName())); // the item name is same in old and new metadata, so we can take any.
if (!metadata.getUID().getItemName().equals(e1.getUID().getItemName())) { markDirty(itemRegistry.getItem(oldUid.getItemName()));
markDirty(itemRegistry.getItem(e1.getUID().getItemName()));
}
} catch (ItemNotFoundException e) { } catch (ItemNotFoundException e) {
logger.debug("Could not found item for metadata {}", metadata); logger.debug("Could not find item for metadata {}", oldMetadata);
}
} }
} }
}; };
@ -148,10 +158,16 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
accessoryRegistry.setConfigurationRevision(revision); accessoryRegistry.setConfigurationRevision(revision);
} }
private boolean hasHomeKitMetadata(Item item) {
return metadataRegistry.get(new MetadataKey(HomekitAccessoryFactory.METADATA_KEY, item.getUID())) != null;
}
@Override @Override
public synchronized void added(Item item) { public synchronized void added(Item item) {
if (hasHomeKitMetadata(item)) {
markDirty(item); markDirty(item);
} }
}
@Override @Override
public void allItemsChanged(Collection<String> oldItemNames) { public void allItemsChanged(Collection<String> oldItemNames) {
@ -179,8 +195,10 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
@Override @Override
public synchronized void removed(Item item) { public synchronized void removed(Item item) {
if (hasHomeKitMetadata(item)) {
markDirty(item); markDirty(item);
} }
}
private Optional<Item> getItemOptional(String name) { private Optional<Item> getItemOptional(String name) {
try { try {
@ -193,17 +211,17 @@ public class HomekitChangeListener implements ItemRegistryChangeListener {
public void makeNewConfigurationRevision() { public void makeNewConfigurationRevision() {
final int newRevision = accessoryRegistry.makeNewConfigurationRevision(); final int newRevision = accessoryRegistry.makeNewConfigurationRevision();
lastAccessoryCount = accessoryRegistry.getAllAccessories().size(); 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); lastAccessoryCount);
storage.put(REVISION_CONFIG, "" + newRevision); storage.put(REVISION_CONFIG, "" + newRevision);
storage.put(ACCESSORY_COUNT, "" + lastAccessoryCount); storage.put(ACCESSORY_COUNT, "" + lastAccessoryCount);
} }
private synchronized void applyUpdates() { private synchronized void applyUpdates() {
logger.trace("apply updates"); logger.trace("Apply updates");
for (final String name : pendingUpdates) { for (final String name : pendingUpdates) {
accessoryRegistry.remove(name); accessoryRegistry.remove(name);
logger.trace(" add items {}", name); logger.trace(" Add items {}", name);
getItemOptional(name).ifPresent(this::createRootAccessories); getItemOptional(name).ifPresent(this::createRootAccessories);
} }
if (!pendingUpdates.isEmpty()) { if (!pendingUpdates.isEmpty()) {