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