2 * Copyright (c) 2010-2022 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.satel.internal.event;
15 import java.lang.reflect.Method;
18 import java.util.concurrent.CopyOnWriteArraySet;
19 import java.util.stream.Collectors;
20 import java.util.stream.Stream;
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
27 * Allows distributing incoming event to all registered listeners. Listeners
28 * must implement {@link SatelEventListener} interface.
30 * @author Krzysztof Goworek - Initial contribution
33 public class EventDispatcher {
35 private final Logger logger = LoggerFactory.getLogger(EventDispatcher.class);
37 private final Set<SatelEventListener> eventListeners = new CopyOnWriteArraySet<>();
39 @SuppressWarnings("unchecked")
40 private final Map<Class<? extends SatelEvent>, Method> eventHandlers = Stream
41 .of(SatelEventListener.class.getDeclaredMethods())
42 .filter(m -> m.getParameterCount() == 1 && SatelEvent.class.isAssignableFrom(m.getParameterTypes()[0]))
43 .collect(Collectors.toMap(m -> (Class<SatelEvent>) m.getParameterTypes()[0], m -> m));
46 * Add a listener for Satel events.
48 * @param eventListener the event listener to add.
50 public void addEventListener(SatelEventListener eventListener) {
51 this.eventListeners.add(eventListener);
55 * Remove a listener for Satel events.
57 * @param eventListener the event listener to remove.
59 public void removeEventListener(SatelEventListener eventListener) {
60 this.eventListeners.remove(eventListener);
64 * Dispatch incoming event to all listeners.
66 * @param event the event to distribute.
68 public void dispatchEvent(SatelEvent event) {
69 final Method m = eventHandlers.get(event.getClass());
71 logger.warn("Missing event handler for event {}. Event discarded.", event.getClass().getName());
73 logger.debug("Distributing event: {}", event);
74 eventListeners.forEach(listener -> {
75 logger.trace("Distributing to {}", listener);
77 m.invoke(listener, event);
78 } catch (ReflectiveOperationException e) {
79 logger.warn("Unable to distribute {} to {}", event.getClass().getName(), listener, e);