1
2
3
4
5
6
7
8
9
10
11 package org.mule.config.spring;
12
13 import org.mule.api.MuleContext;
14 import org.mule.api.context.MuleContextAware;
15 import org.mule.api.context.notification.ServerNotificationListener;
16 import org.mule.context.notification.ListenerSubscriptionPair;
17 import org.mule.context.notification.ServerNotificationManager;
18
19 import java.util.Collection;
20 import java.util.HashSet;
21 import java.util.Map;
22 import java.util.Set;
23
24 import org.springframework.beans.BeansException;
25 import org.springframework.beans.factory.SmartFactoryBean;
26 import org.springframework.context.ApplicationContext;
27 import org.springframework.context.ApplicationContextAware;
28
29 public class ServerNotificationManagerConfigurator
30 implements MuleContextAware, SmartFactoryBean, ApplicationContextAware
31 {
32
33 private MuleContext muleContext;
34 private ApplicationContext applicationContext;
35
36 private Boolean dynamic;
37 private Map interfaceToEvents;
38 private Collection interfaces;
39 private Collection<ListenerSubscriptionPair> pairs;
40
41 public void setMuleContext(MuleContext context)
42 {
43 this.muleContext = context;
44 }
45
46 public Object getObject() throws Exception
47 {
48 ServerNotificationManager notificationManager = muleContext.getNotificationManager();
49 if (dynamic != null)
50 {
51 notificationManager.setNotificationDynamic(dynamic.booleanValue());
52 }
53 if (interfaceToEvents != null)
54 {
55 notificationManager.setInterfaceToTypes(interfaceToEvents);
56 }
57 if (interfaces != null)
58 {
59 notificationManager.setDisabledInterfaces(interfaces);
60 }
61
62
63
64
65 Set<ListenerSubscriptionPair> subs = getMergedListeners(notificationManager);
66 for (ListenerSubscriptionPair sub : subs)
67 {
68
69 if(!notificationManager.isListenerRegistered(sub.getListener()))
70 {
71 notificationManager.addListenerSubscriptionPair(sub);
72 }
73 }
74 return notificationManager;
75 }
76
77 protected Set<ListenerSubscriptionPair> getMergedListeners(ServerNotificationManager notificationManager)
78 {
79 Set<ListenerSubscriptionPair> mergedListeners = new HashSet<ListenerSubscriptionPair>();
80
81
82
83 String[] listenerBeans = applicationContext.getBeanNamesForType(ServerNotificationListener.class,
84 false, true);
85 Set<ListenerSubscriptionPair> adhocListeners = new HashSet<ListenerSubscriptionPair>();
86 for (String name : listenerBeans)
87 {
88 adhocListeners.add(new ListenerSubscriptionPair(
89 (ServerNotificationListener<?>) applicationContext.getBean(name), null));
90 }
91
92 if (pairs != null)
93 {
94 mergedListeners.addAll(pairs);
95
96 for (ListenerSubscriptionPair candidate : adhocListeners)
97 {
98 boolean explicityDefined = false;
99 for (ListenerSubscriptionPair explicitListener : pairs)
100 {
101 if (candidate.getListener().equals(explicitListener.getListener()))
102 {
103 explicityDefined = true;
104 break;
105 }
106 }
107 if (!explicityDefined)
108 {
109 mergedListeners.add(candidate);
110 }
111 }
112 }
113 else
114 {
115 mergedListeners.addAll(adhocListeners);
116 }
117
118 return mergedListeners;
119 }
120
121 public Class getObjectType()
122 {
123 return ServerNotificationManager.class;
124 }
125
126 public boolean isSingleton()
127 {
128 return true;
129 }
130
131 public void setNotificationDynamic(boolean dynamic)
132 {
133 this.dynamic = new Boolean(dynamic);
134 }
135
136 public void setInterfaceToTypes(Map interfaceToEvents) throws ClassNotFoundException
137 {
138 this.interfaceToEvents = interfaceToEvents;
139 }
140
141 public void setAllListenerSubscriptionPairs(Collection pairs)
142 {
143 this.pairs = pairs;
144 }
145
146 public void setDisabledInterfaces(Collection interfaces) throws ClassNotFoundException
147 {
148 this.interfaces = interfaces;
149 }
150
151 public boolean isEagerInit()
152 {
153 return true;
154 }
155
156 public boolean isPrototype()
157 {
158 return false;
159 }
160
161 public void setApplicationContext(ApplicationContext applicationContext) throws BeansException
162 {
163 this.applicationContext = applicationContext;
164
165 }
166
167 }