1 package org.apache.archiva.event;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import org.slf4j.Logger;
23 import org.slf4j.LoggerFactory;
24
25 import java.util.*;
26 import java.util.concurrent.ConcurrentHashMap;
27
28 public class EventManager implements EventSource
29 {
30
31 private static final Logger log = LoggerFactory.getLogger(EventManager.class);
32
33 private final ConcurrentHashMap<EventType<? extends Event>, Set<EventHandler>> handlerMap = new ConcurrentHashMap<>();
34
35 private final Object source;
36
37 public EventManager(Object source) {
38 if (source==null) {
39 throw new IllegalArgumentException("The source may not be null");
40 }
41 this.source = source;
42 }
43
44 @Override
45 public <T extends Event> void registerEventHandler(EventType<T> type, EventHandler<? super T> eventHandler) {
46 Set<EventHandler> handlers = handlerMap.computeIfAbsent(type, t -> new LinkedHashSet<>());
47 if (!handlers.contains(eventHandler)) {
48 handlers.add(eventHandler);
49 }
50 }
51
52 @Override
53 public <T extends Event> void unregisterEventHandler(EventType<T> type, EventHandler<? super T> eventHandler) {
54 if (handlerMap.containsKey(type)) {
55 handlerMap.get(type).remove(eventHandler);
56 }
57 }
58
59 public void fireEvent(Event fireEvent) {
60 final EventType<? extends Event> type = fireEvent.getType();
61 Event event;
62 if (fireEvent.getSource()!=source) {
63 event = fireEvent.copyFor(source);
64 } else {
65 event = fireEvent;
66 }
67 for (EventType<? extends Event> handlerType : handlerMap.keySet()) {
68 if (EventType.isInstanceOf(type, handlerType)) {
69 for (EventHandler handler : handlerMap.get(handlerType)) {
70 try {
71 handler.handle(event);
72 } catch (Exception e) {
73
74 log.error("An error occured during event handling: {}", e.getMessage(), e);
75 }
76 }
77 }
78 }
79 }
80 }