1
2
3
4
5
6
7
8
9
10
11 package org.eclipse.jgit.events;
12
13 import java.util.List;
14 import java.util.concurrent.ConcurrentHashMap;
15 import java.util.concurrent.ConcurrentMap;
16 import java.util.concurrent.CopyOnWriteArrayList;
17
18
19
20
21 public class ListenerList {
22 private final ConcurrentMap<Class<? extends RepositoryListener>, CopyOnWriteArrayList<ListenerHandle>> lists = new ConcurrentHashMap<>();
23
24
25
26
27
28
29
30
31
32 public ListenerHandle addWorkingTreeModifiedListener(
33 WorkingTreeModifiedListener listener) {
34 return addListener(WorkingTreeModifiedListener.class, listener);
35 }
36
37
38
39
40
41
42
43
44 public ListenerHandle addIndexChangedListener(IndexChangedListener listener) {
45 return addListener(IndexChangedListener.class, listener);
46 }
47
48
49
50
51
52
53
54
55 public ListenerHandle addRefsChangedListener(RefsChangedListener listener) {
56 return addListener(RefsChangedListener.class, listener);
57 }
58
59
60
61
62
63
64
65
66 public ListenerHandle addConfigChangedListener(
67 ConfigChangedListener listener) {
68 return addListener(ConfigChangedListener.class, listener);
69 }
70
71
72
73
74
75
76
77
78
79
80 public <T extends RepositoryListener> ListenerHandle addListener(
81 Class<T> type, T listener) {
82 ListenerHandle handle = new ListenerHandle(this, type, listener);
83 add(handle);
84 return handle;
85 }
86
87
88
89
90
91
92
93
94
95 @SuppressWarnings("unchecked")
96 public void dispatch(RepositoryEvent event) {
97 List<ListenerHandle> list = lists.get(event.getListenerType());
98 if (list != null) {
99 for (ListenerHandle handle : list)
100 event.dispatch(handle.listener);
101 }
102 }
103
104 private void add(ListenerHandle handle) {
105 List<ListenerHandle> list = lists.get(handle.type);
106 if (list == null) {
107 CopyOnWriteArrayList<ListenerHandle> newList;
108
109 newList = new CopyOnWriteArrayList<>();
110 list = lists.putIfAbsent(handle.type, newList);
111 if (list == null)
112 list = newList;
113 }
114 list.add(handle);
115 }
116
117 void remove(ListenerHandle handle) {
118 List<ListenerHandle> list = lists.get(handle.type);
119 if (list != null)
120 list.remove(handle);
121 }
122 }