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.imperihome.internal.processor;
15 import java.util.Collection;
16 import java.util.HashMap;
17 import java.util.HashSet;
18 import java.util.Iterator;
21 import java.util.concurrent.ConcurrentHashMap;
23 import org.openhab.io.imperihome.internal.model.Room;
24 import org.openhab.io.imperihome.internal.model.device.AbstractDevice;
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
29 * The device registry stores created devices by ID.
31 * @author Pepijn de Geus - Initial contribution
33 public class DeviceRegistry implements Iterable<AbstractDevice> {
35 private final Logger logger = LoggerFactory.getLogger(DeviceRegistry.class);
37 private final Map<String, AbstractDevice> devices;
38 private Set<Room> rooms;
40 public DeviceRegistry() {
41 devices = new ConcurrentHashMap<>();
44 public AbstractDevice getDevice(String deviceId) {
45 return devices.get(deviceId);
48 public Map<String, AbstractDevice> getDevices() {
49 return new HashMap<>(devices);
52 public Collection<Room> getRooms() {
53 return new HashSet<>(rooms);
56 public boolean hasDevices() {
57 return !devices.isEmpty();
60 public boolean hasDevice(String deviceId) {
61 return devices.containsKey(deviceId);
64 public void add(AbstractDevice device) {
65 // Workaround for Eclipse SH bug: ignore add-event for same item
66 // https://github.com/eclipse/smarthome/issues/3160
67 if (devices.containsKey(device.getId())) {
68 logger.warn("Ignoring duplicate device #{}, name={}, item={}", device.getId(), device.getName(),
69 device.getItemName());
73 devices.put(device.getId(), device);
76 logger.debug("Device {} added, registry now contains {} total", device.getName(), devices.size());
79 public AbstractDevice remove(String deviceId) {
80 AbstractDevice removed = devices.remove(deviceId);
81 if (removed != null) {
83 logger.debug("Device {} removed, registry now contains {} total", removed.getName(), devices.size());
89 public Iterator<AbstractDevice> iterator() {
90 return devices.values().iterator();
94 for (AbstractDevice device : devices.values()) {
103 logger.debug("Device registry cleared");
106 private void updateRooms() {
107 Set<Room> newRooms = new HashSet<>();
108 for (AbstractDevice device : devices.values()) {
109 Room room = new Room();
110 room.setId(device.getRoom());
111 room.setName(device.getRoomName());