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.binding.plugwise.internal;
15 import java.util.ArrayList;
16 import java.util.List;
17 import java.util.concurrent.CopyOnWriteArrayList;
19 import org.eclipse.jdt.annotation.NonNullByDefault;
20 import org.openhab.binding.plugwise.internal.listener.PlugwiseMessageListener;
21 import org.openhab.binding.plugwise.internal.protocol.Message;
22 import org.openhab.binding.plugwise.internal.protocol.field.MACAddress;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
27 * The {@link PlugwiseFilteredMessageListenerList} keeps track of a list of {@link PlugwiseFilteredMessageListener}s and
28 * facilitates listener operations such as message notification.
30 * @author Wouter Born - Initial contribution
33 public class PlugwiseFilteredMessageListenerList {
35 private final Logger logger = LoggerFactory.getLogger(PlugwiseFilteredMessageListenerList.class);
37 private final List<PlugwiseFilteredMessageListener> filteredListeners = new CopyOnWriteArrayList<>();
39 public void addListener(PlugwiseMessageListener listener) {
40 if (!isExistingListener(listener)) {
41 filteredListeners.add(new PlugwiseFilteredMessageListener(listener));
45 public void addListener(PlugwiseMessageListener listener, MACAddress macAddress) {
46 if (!isExistingListener(listener, macAddress)) {
47 filteredListeners.add(new PlugwiseFilteredMessageListener(listener, macAddress));
51 public boolean isExistingListener(PlugwiseMessageListener listener) {
52 return filteredListeners.stream().anyMatch(filteredListener -> filteredListener.getListener().equals(listener));
55 public boolean isExistingListener(PlugwiseMessageListener listener, MACAddress macAddress) {
56 return filteredListeners.stream().anyMatch(filteredListener -> filteredListener.getListener().equals(listener)
57 && macAddress.equals(filteredListener.getMACAddress()));
60 public void notifyListeners(Message message) {
61 for (PlugwiseFilteredMessageListener filteredListener : filteredListeners) {
62 if (filteredListener.matches(message)) {
64 filteredListener.getListener().handleResponseMessage(message);
65 } catch (Exception e) {
66 logger.warn("Listener failed to handle message: {}", message, e);
72 public void removeListener(PlugwiseMessageListener listener) {
73 List<PlugwiseFilteredMessageListener> removedListeners = new ArrayList<>();
74 for (PlugwiseFilteredMessageListener filteredListener : filteredListeners) {
75 if (filteredListener.getListener().equals(listener)) {
76 removedListeners.add(filteredListener);
80 filteredListeners.removeAll(removedListeners);