]> git.basschouten.com Git - openhab-addons.git/blob
2260a707f2359a5f122c70efe72c9e6ca9611412
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
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
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.io.imperihome.internal.processor;
14
15 import java.util.Collection;
16 import java.util.HashMap;
17 import java.util.HashSet;
18 import java.util.Iterator;
19 import java.util.Map;
20 import java.util.Set;
21 import java.util.concurrent.ConcurrentHashMap;
22
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;
27
28 /**
29  * The device registry stores created devices by ID.
30  *
31  * @author Pepijn de Geus - Initial contribution
32  */
33 public class DeviceRegistry implements Iterable<AbstractDevice> {
34
35     private final Logger logger = LoggerFactory.getLogger(DeviceRegistry.class);
36
37     private final Map<String, AbstractDevice> devices;
38     private Set<Room> rooms;
39
40     public DeviceRegistry() {
41         devices = new ConcurrentHashMap<>();
42     }
43
44     public AbstractDevice getDevice(String deviceId) {
45         return devices.get(deviceId);
46     }
47
48     public Map<String, AbstractDevice> getDevices() {
49         return new HashMap<>(devices);
50     }
51
52     public Collection<Room> getRooms() {
53         return new HashSet<>(rooms);
54     }
55
56     public boolean hasDevices() {
57         return !devices.isEmpty();
58     }
59
60     public boolean hasDevice(String deviceId) {
61         return devices.containsKey(deviceId);
62     }
63
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());
70             return;
71         }
72
73         devices.put(device.getId(), device);
74         updateRooms();
75
76         logger.debug("Device {} added, registry now contains {} total", device.getName(), devices.size());
77     }
78
79     public AbstractDevice remove(String deviceId) {
80         AbstractDevice removed = devices.remove(deviceId);
81         if (removed != null) {
82             updateRooms();
83             logger.debug("Device {} removed, registry now contains {} total", removed.getName(), devices.size());
84         }
85         return removed;
86     }
87
88     @Override
89     public Iterator<AbstractDevice> iterator() {
90         return devices.values().iterator();
91     }
92
93     public void clear() {
94         for (AbstractDevice device : devices.values()) {
95             device.destroy();
96         }
97         devices.clear();
98
99         if (rooms != null) {
100             rooms.clear();
101         }
102
103         logger.debug("Device registry cleared");
104     }
105
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());
112             newRooms.add(room);
113         }
114         rooms = newRooms;
115     }
116 }