From 5b4969df6dc13905380034786045b7805e2d569a Mon Sep 17 00:00:00 2001 From: Wouter Born Date: Wed, 30 Nov 2016 00:15:19 +0100 Subject: [PATCH 1/2] [Plugwise] Fix exceptions at binding startup, improve device cache Signed-off-by: Wouter Born --- .../binding/plugwise/internal/CirclePlus.java | 2 +- .../plugwise/internal/PlugwiseBinding.java | 4 +- .../internal/PlugwiseDeviceCache.java | 57 +++++++++++++++++++ .../binding/plugwise/internal/Stick.java | 46 ++++----------- 4 files changed, 71 insertions(+), 38 deletions(-) create mode 100644 bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseDeviceCache.java 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..8a735bcd629 --- /dev/null +++ b/bundles/binding/org.openhab.binding.plugwise/src/main/java/org/openhab/binding/plugwise/internal/PlugwiseDeviceCache.java @@ -0,0 +1,57 @@ +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 + */ +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(); From cc380480e32ba5bf19fada5906d0d57fdbcaeffb Mon Sep 17 00:00:00 2001 From: Wouter Born Date: Wed, 30 Nov 2016 00:47:12 +0100 Subject: [PATCH 2/2] Add @since 1.9.0 to PlugwiseDeviceCache Signed-off-by: Wouter Born --- .../openhab/binding/plugwise/internal/PlugwiseDeviceCache.java | 1 + 1 file changed, 1 insertion(+) 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 index 8a735bcd629..48f2cac1669 100644 --- 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 @@ -9,6 +9,7 @@ * 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 {