diff --git a/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/CirclePlus.java b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/CirclePlus.java index 1a21358a440..ddc8757abf6 100644 --- a/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/CirclePlus.java +++ b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/CirclePlus.java @@ -106,7 +106,7 @@ public boolean processMessage(Message message) { // devices device = new Circle(((RoleCallResponseMessage) message).getNodeMAC(), stick, ((RoleCallResponseMessage) message).getNodeMAC()); - stick.plugwiseDeviceCache.add(device); + stick.addDevice(device); logger.debug("Added a Circle with MAC {} to the cache", device.getMAC()); } diff --git a/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseBinding.java b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseBinding.java index 69b46761dde..870bfed36c9 100644 --- a/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseBinding.java +++ b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseBinding.java @@ -156,7 +156,7 @@ private void setupNonStickDevices(Dictionary config) { PlugwiseDevice device = createPlugwiseDevice(deviceType, MAC, deviceName); if (device != null) { - stick.plugwiseDeviceCache.add(device); + stick.addDevice(device); } } @@ -479,7 +479,7 @@ private void scheduleJobs(Scheduler scheduler) { if (!cp.getMAC().equals(element.getId())) { // a circleplus has been added/detected and it is not what is in the binding config PlugwiseDevice device = new Circle(element.getId(), stick, element.getId()); - stick.plugwiseDeviceCache.add(device); + stick.addDevice(device); logger.debug("Plugwise added Circle with MAC address: {}", element.getId()); } } else { diff --git a/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseDeviceCache.java b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseDeviceCache.java new file mode 100644 index 00000000000..48f2cac1669 --- /dev/null +++ b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseDeviceCache.java @@ -0,0 +1,58 @@ +package org.openhab.binding.plugwise.internal; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Caches all {@link PlugwiseDevice} instances and allows for querying them by mac, name and device class. + * + * @author Wouter Born + * @since 1.9.0 + */ +public class PlugwiseDeviceCache { + + private Map macDeviceMapping = new ConcurrentHashMap(); + private Map nameDeviceMapping = new ConcurrentHashMap(); + + public void add(PlugwiseDevice device) { + macDeviceMapping.put(device.getMAC(), device); + nameDeviceMapping.put(device.getName(), device); + } + + public void clear() { + macDeviceMapping.clear(); + nameDeviceMapping.clear(); + } + + public PlugwiseDevice get(String id) { + PlugwiseDevice device = getByMAC(id); + if (device == null) { + return getByName(id); + } else { + return device; + } + } + + public PlugwiseDevice getByMAC(String mac) { + return macDeviceMapping.get(mac); + } + + public PlugwiseDevice getByName(String name) { + return nameDeviceMapping.get(name); + } + + @SuppressWarnings("unchecked") + public List getByClass(Class deviceClass) { + + List result = new ArrayList(); + for (PlugwiseDevice device : macDeviceMapping.values()) { + if (deviceClass.isAssignableFrom(device.getClass())) { + result.add((T) device); + } + } + + return result; + } +} diff --git a/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/Stick.java b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/Stick.java index 2d12e111148..dc903e26d4b 100644 --- a/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/Stick.java +++ b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/Stick.java @@ -15,8 +15,6 @@ import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.WritableByteChannel; -import java.util.ArrayList; -import java.util.Collections; import java.util.Enumeration; import java.util.Iterator; import java.util.List; @@ -111,7 +109,7 @@ public class Stick extends PlugwiseDevice implements SerialPortEventListener { // Stick fields private boolean initialised = false; - protected List plugwiseDeviceCache = Collections.synchronizedList(new ArrayList()); + private final PlugwiseDeviceCache plugwiseDeviceCache = new PlugwiseDeviceCache(); private PlugwiseBinding binding; /** default interval for sending messages on the ZigBee network */ private int interval = 50; @@ -135,44 +133,24 @@ public Stick(String port, PlugwiseBinding binding) { } } + protected void addDevice(PlugwiseDevice device) { + plugwiseDeviceCache.add(device); + } + protected PlugwiseDevice getDevice(String id) { - PlugwiseDevice someDevice = getDeviceByMAC(id); - if (someDevice == null) { - return getDeviceByName(id); - } else { - return someDevice; - } + return plugwiseDeviceCache.get(id); } - protected PlugwiseDevice getDeviceByMAC(String MAC) { - for (PlugwiseDevice device : plugwiseDeviceCache) { - if (MAC.equals(device.getMAC())) { - return device; - } - } - return null; + protected PlugwiseDevice getDeviceByMAC(String mac) { + return plugwiseDeviceCache.getByMAC(mac); } protected PlugwiseDevice getDeviceByName(String name) { - for (PlugwiseDevice device : plugwiseDeviceCache) { - if (name.equals(device.getName())) { - return device; - } - } - return null; + return plugwiseDeviceCache.getByName(name); } - @SuppressWarnings("unchecked") protected List getDevicesByClass(Class deviceClass) { - - List result = new ArrayList(); - for (PlugwiseDevice device : plugwiseDeviceCache) { - if (deviceClass.isAssignableFrom(device.getClass())) { - result.add((T) device); - } - } - - return result; + return plugwiseDeviceCache.getByClass(deviceClass); } public String getPort() { @@ -200,9 +178,7 @@ public boolean isInitialised() { private void initialize() throws PlugwiseInitializationException { // Flush the deviceCache - if (this.plugwiseDeviceCache != null) { - plugwiseDeviceCache = Collections.synchronizedList(new ArrayList()); - } + plugwiseDeviceCache.clear(); // parse ports and if the default port is found, initialized the reader Enumeration portList = CommPortIdentifier.getPortIdentifiers();