1 package org
.argeo
.cms
.internal
.runtime
;
3 import java
.util
.ArrayList
;
4 import java
.util
.Collections
;
5 import java
.util
.HashMap
;
6 import java
.util
.Iterator
;
10 import org
.argeo
.api
.cms
.CmsEventBus
;
11 import org
.argeo
.api
.cms
.CmsEventSubscriber
;
12 import org
.argeo
.api
.cms
.CmsLog
;
14 /** A simple synchronous {@link CmsEventBus} implementation. */
15 public class CmsSynchronousEventBusImpl
implements CmsEventBus
{
16 private final static CmsLog log
= CmsLog
.getLog(CmsSynchronousEventBusImpl
.class);
18 private final Map
<String
, List
<CmsEventSubscriber
>> subscribers
;
20 public CmsSynchronousEventBusImpl() {
21 subscribers
= Collections
.synchronizedMap(new HashMap
<>());
25 public void sendEvent(String topic
, Map
<String
, Object
> event
) {
26 List
<CmsEventSubscriber
> subscribersOfTopic
= subscribers
.get(topic
);
27 if (subscribersOfTopic
== null) // no one cares
29 synchronized (subscribersOfTopic
) {
30 for (Iterator
<CmsEventSubscriber
> it
= subscribersOfTopic
.iterator(); it
.hasNext();) {
31 CmsEventSubscriber subscriber
= it
.next();
33 subscriber
.onEvent(topic
, event
);
34 } catch (Throwable e
) {
35 log
.error("Cannot process in topic " + topic
+ " the event " + event
+ " for subscriber "
40 log
.trace(() -> "Dispatched event in topic " + topic
+ ": " + event
);
44 public synchronized void addEventSubscriber(String topic
, CmsEventSubscriber eventSubscriber
) {
45 if (!subscribers
.containsKey(topic
)) {
46 subscribers
.put(topic
, new ArrayList
<>());
48 subscribers
.get(topic
).add(eventSubscriber
);
49 log
.debug(() -> "Added subscriber " + eventSubscriber
+ " to topic " + topic
);
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
61 CmsEventSubscriber subscriber
= it
.next();
62 if (subscriber
== eventSubscriber
) {
64 removedSubscriber
= subscriber
;
65 log
.debug(() -> "Removed subscriber " + eventSubscriber
+ " from topic " + topic
);
66 break subscribersOfTopic
;
70 if (removedSubscriber
== null)
71 log
.warn(() -> "Subscriber " + eventSubscriber
+ " not found (and therefore not removed) in topic "