2 * Copyright (c) 2010-2023 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
7 * This program and the accompanying materials are made available under the
8 * terms of the Eclipse Public License 2.0 which is available at
9 * http://www.eclipse.org/legal/epl-2.0
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.io.homekit.internal;
15 import java.io.IOException;
16 import java.util.HashMap;
19 import org.eclipse.jdt.annotation.Nullable;
20 import org.slf4j.Logger;
21 import org.slf4j.LoggerFactory;
23 import io.github.hapjava.accessories.HomekitAccessory;
24 import io.github.hapjava.server.impl.HomekitRoot;
27 * Stores the created HomekitAccessories. GroupedAccessories are also held here
28 * in a pre-created pending state until all required characteristics are found.
30 * @author Andy Lintner - Initial contribution
32 class HomekitAccessoryRegistry {
33 private @Nullable HomekitRoot bridge;
34 private final Map<String, HomekitAccessory> createdAccessories = new HashMap<>();
35 private int configurationRevision = 1;
36 private final Logger logger = LoggerFactory.getLogger(HomekitAccessoryRegistry.class);
38 public void setConfigurationRevision(int revision) {
39 configurationRevision = revision;
42 public int getConfigurationRevision() {
43 return configurationRevision;
46 public int makeNewConfigurationRevision() {
47 configurationRevision = (configurationRevision + 1) % 65535;
48 final HomekitRoot bridge = this.bridge;
51 bridge.setConfigurationIndex(configurationRevision);
53 } catch (IOException e) {
54 logger.warn("Could not update configuration revision number", e);
56 return configurationRevision;
59 public synchronized void remove(String itemName) {
60 if (createdAccessories.containsKey(itemName)) {
61 HomekitAccessory accessory = createdAccessories.remove(itemName);
62 logger.trace("Removed accessory {} for taggedItem {}", accessory, itemName);
63 final HomekitRoot bridge = this.bridge;
65 bridge.removeAccessory(accessory);
67 logger.warn("trying to remove {} but bridge is null", accessory);
72 public synchronized void clear() {
73 final HomekitRoot bridge = this.bridge;
75 createdAccessories.values().forEach(bridge::removeAccessory);
77 logger.warn("trying to clear accessories but bridge is null");
81 public synchronized void setBridge(HomekitRoot bridge) {
83 createdAccessories.values().forEach(bridge::addAccessory);
86 public synchronized void unsetBridge() {
90 public synchronized HomekitRoot getBridge() {
94 public synchronized void addRootAccessory(String itemName, HomekitAccessory accessory) {
95 createdAccessories.put(itemName, accessory);
96 final HomekitRoot bridge = this.bridge;
98 bridge.addAccessory(accessory);
102 public Map<String, HomekitAccessory> getAllAccessories() {
103 return this.createdAccessories;