]> git.basschouten.com Git - openhab-addons.git/blob
913f7e05f42e35ddf3771aff1791ebf72b88807e
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2022 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.binding.satel.internal.event;
14
15 import java.lang.reflect.Method;
16 import java.util.Map;
17 import java.util.Set;
18 import java.util.concurrent.CopyOnWriteArraySet;
19 import java.util.stream.Collectors;
20 import java.util.stream.Stream;
21
22 import org.eclipse.jdt.annotation.NonNullByDefault;
23 import org.slf4j.Logger;
24 import org.slf4j.LoggerFactory;
25
26 /**
27  * Allows distributing incoming event to all registered listeners. Listeners
28  * must implement {@link SatelEventListener} interface.
29  *
30  * @author Krzysztof Goworek - Initial contribution
31  */
32 @NonNullByDefault
33 public class EventDispatcher {
34
35     private final Logger logger = LoggerFactory.getLogger(EventDispatcher.class);
36
37     private final Set<SatelEventListener> eventListeners = new CopyOnWriteArraySet<>();
38
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));
44
45     /**
46      * Add a listener for Satel events.
47      *
48      * @param eventListener the event listener to add.
49      */
50     public void addEventListener(SatelEventListener eventListener) {
51         this.eventListeners.add(eventListener);
52     }
53
54     /**
55      * Remove a listener for Satel events.
56      *
57      * @param eventListener the event listener to remove.
58      */
59     public void removeEventListener(SatelEventListener eventListener) {
60         this.eventListeners.remove(eventListener);
61     }
62
63     /**
64      * Dispatch incoming event to all listeners.
65      *
66      * @param event the event to distribute.
67      */
68     public void dispatchEvent(SatelEvent event) {
69         final Method m = eventHandlers.get(event.getClass());
70         if (m == null) {
71             logger.warn("Missing event handler for event {}. Event discarded.", event.getClass().getName());
72         } else {
73             logger.debug("Distributing event: {}", event);
74             eventListeners.forEach(listener -> {
75                 logger.trace("Distributing to {}", listener);
76                 try {
77                     m.invoke(listener, event);
78                 } catch (ReflectiveOperationException e) {
79                     logger.warn("Unable to distribute {} to {}", event.getClass().getName(), listener, e);
80                 }
81             });
82         }
83     }
84 }