]> git.argeo.org Git - lgpl/argeo-commons.git/blob - org.argeo.cms/src/org/argeo/cms/internal/runtime/CmsSynchronousEventBusImpl.java
Merge remote-tracking branch 'origin/unstable' into testing
[lgpl/argeo-commons.git] / org.argeo.cms / src / org / argeo / cms / internal / runtime / CmsSynchronousEventBusImpl.java
1 package org.argeo.cms.internal.runtime;
2
3 import java.util.ArrayList;
4 import java.util.Collections;
5 import java.util.HashMap;
6 import java.util.Iterator;
7 import java.util.List;
8 import java.util.Map;
9
10 import org.argeo.api.cms.CmsEventBus;
11 import org.argeo.api.cms.CmsEventSubscriber;
12 import org.argeo.api.cms.CmsLog;
13
14 /** A simple synchronous {@link CmsEventBus} implementation. */
15 public class CmsSynchronousEventBusImpl implements CmsEventBus {
16 private final static CmsLog log = CmsLog.getLog(CmsSynchronousEventBusImpl.class);
17
18 private final Map<String, List<CmsEventSubscriber>> subscribers;
19
20 public CmsSynchronousEventBusImpl() {
21 subscribers = Collections.synchronizedMap(new HashMap<>());
22 }
23
24 @Override
25 public void sendEvent(String topic, Map<String, Object> event) {
26 List<CmsEventSubscriber> subscribersOfTopic = subscribers.get(topic);
27 if (subscribersOfTopic == null) // no one cares
28 return;
29 synchronized (subscribersOfTopic) {
30 for (Iterator<CmsEventSubscriber> it = subscribersOfTopic.iterator(); it.hasNext();) {
31 CmsEventSubscriber subscriber = it.next();
32 try {
33 subscriber.onEvent(topic, event);
34 } catch (Throwable e) {
35 log.error("Cannot process in topic " + topic + " the event " + event + " for subscriber "
36 + subscriber, e);
37 }
38 }
39 }
40 log.trace(() -> "Dispatched event in topic " + topic + ": " + event);
41 }
42
43 @Override
44 public synchronized void addEventSubscriber(String topic, CmsEventSubscriber eventSubscriber) {
45 if (!subscribers.containsKey(topic)) {
46 subscribers.put(topic, new ArrayList<>());
47 }
48 subscribers.get(topic).add(eventSubscriber);
49 log.debug(() -> "Added subscriber " + eventSubscriber + " to topic " + topic);
50 }
51
52 @Override
53 public synchronized void removeEventSubscriber(String topic, CmsEventSubscriber eventSubscriber) {
54 List<CmsEventSubscriber> subscribersOfTopic = subscribers.get(topic);
55 assert subscribersOfTopic != null;
56 if (subscribersOfTopic != null) {
57 CmsEventSubscriber removedSubscriber = null;
58 synchronized (subscribersOfTopic) {
59 subscribersOfTopic: for (Iterator<CmsEventSubscriber> it = subscribersOfTopic.iterator(); it
60 .hasNext();) {
61 CmsEventSubscriber subscriber = it.next();
62 if (subscriber == eventSubscriber) {
63 it.remove();
64 removedSubscriber = subscriber;
65 log.debug(() -> "Removed subscriber " + eventSubscriber + " from topic " + topic);
66 break subscribersOfTopic;
67 }
68 }
69 }
70 if (removedSubscriber == null)
71 log.warn(() -> "Subscriber " + eventSubscriber + " not found (and therefore not removed) in topic "
72 + topic);
73 }
74 }
75
76 }