1
2
3
4
5
6
7
8
9
10
11 package org.mule.context.notification;
12
13 import org.mule.api.context.notification.ServerNotification;
14 import org.mule.api.context.notification.ServerNotificationListener;
15
16 import java.util.ArrayList;
17 import java.util.Collection;
18 import java.util.HashMap;
19 import java.util.Iterator;
20 import java.util.Map;
21 import java.util.Set;
22 import java.util.concurrent.ConcurrentHashMap;
23 import java.util.concurrent.ConcurrentMap;
24
25
26
27
28
29
30 class Policy
31 {
32
33
34 private Map<Class<? extends ServerNotification>, Collection<Sender>> eventToSenders = new HashMap<Class<? extends ServerNotification>, Collection<Sender>>();
35
36
37
38 private ConcurrentMap knownEventsExact = new ConcurrentHashMap();
39 private ConcurrentMap knownEventsSuper = new ConcurrentHashMap();
40
41
42
43
44 Policy(Map<Class<? extends ServerNotificationListener>, Set<Class<? extends ServerNotification>>> interfaceToEvents,
45 Set<ListenerSubscriptionPair> listenerSubscriptionPairs,
46 Set<Class<? extends ServerNotificationListener>> disabledInterfaces,
47 Set<Class<? extends ServerNotification>> disabledEvents)
48 {
49 for (ListenerSubscriptionPair pair : listenerSubscriptionPairs)
50 {
51 ServerNotificationListener listener = pair.getListener();
52 for (Class<? extends ServerNotificationListener> iface : interfaceToEvents.keySet())
53 {
54 if (notASubclassOfAnyClassInSet(disabledInterfaces, iface))
55 {
56 if (iface.isAssignableFrom(listener.getClass()))
57 {
58 Set<Class<? extends ServerNotification>> events = interfaceToEvents.get(iface);
59 for (Class<? extends ServerNotification> event : events)
60 {
61 if (notASubclassOfAnyClassInSet(disabledEvents, event))
62 {
63 knownEventsExact.put(event, Boolean.TRUE);
64 knownEventsSuper.put(event, Boolean.TRUE);
65 if (!eventToSenders.containsKey(event))
66 {
67
68 eventToSenders.put(event, new ArrayList<Sender>());
69 }
70 eventToSenders.get(event).add(new Sender(pair));
71 }
72 }
73 }
74 }
75 }
76 }
77 }
78
79 protected static boolean notASubclassOfAnyClassInSet(Set set, Class clazz)
80 {
81 for (Iterator iterator = set.iterator(); iterator.hasNext();)
82 {
83 Class disabled = (Class) iterator.next();
84 if (disabled.isAssignableFrom(clazz))
85 {
86 return false;
87 }
88 }
89 return true;
90 }
91
92 protected static boolean notASuperclassOfAnyClassInSet(Set set, Class clazz)
93 {
94 for (Iterator iterator = set.iterator(); iterator.hasNext();)
95 {
96 Class disabled = (Class) iterator.next();
97 if (clazz.isAssignableFrom(disabled))
98 {
99 return false;
100 }
101 }
102 return true;
103 }
104
105 void dispatch(ServerNotification notification)
106 {
107 if (null != notification)
108 {
109 Class notfnClass = notification.getClass();
110
111 if ((!knownEventsExact.containsKey(notfnClass))
112 || ((Boolean) knownEventsExact.get(notfnClass)).booleanValue())
113 {
114 boolean found = false;
115 for (Class<? extends ServerNotification> event : eventToSenders.keySet())
116 {
117 if (event.isAssignableFrom(notfnClass))
118 {
119 found = true;
120 for (Iterator senders = ((Collection) eventToSenders.get(event)).iterator(); senders.hasNext();)
121 {
122 ((Sender) senders.next()).dispatch(notification);
123 }
124 }
125 }
126 knownEventsExact.put(notfnClass, Boolean.valueOf(found));
127 }
128 }
129 }
130
131
132
133
134
135
136
137
138
139
140 boolean isNotificationEnabled(Class notfnClass)
141 {
142 if (!knownEventsSuper.containsKey(notfnClass))
143 {
144 boolean found = false;
145
146 for (Iterator events = knownEventsSuper.keySet().iterator(); events.hasNext() && !found;)
147 {
148 Class event = (Class) events.next();
149 found = ((Boolean) knownEventsSuper.get(event)).booleanValue() && notfnClass.isAssignableFrom(event);
150 }
151 knownEventsSuper.put(notfnClass, Boolean.valueOf(found));
152 }
153 if (!knownEventsExact.containsKey(notfnClass))
154 {
155 boolean found = false;
156 for (Iterator events = eventToSenders.keySet().iterator(); events.hasNext() && !found;)
157 {
158 Class event = (Class) events.next();
159 found = event.isAssignableFrom(notfnClass);
160 }
161 knownEventsExact.put(notfnClass, Boolean.valueOf(found));
162
163 }
164 return ((Boolean) knownEventsSuper.get(notfnClass)).booleanValue()
165 || ((Boolean) knownEventsExact.get(notfnClass)).booleanValue();
166 }
167
168 }