View Javadoc

1   /*
2    * $Id: ServerNotificationManagerConfigurator.java 19191 2010-08-25 21:05:23Z tcarlson $
3    * --------------------------------------------------------------------------------------
4    * Copyright (c) MuleSoft, Inc.  All rights reserved.  http://www.mulesoft.com
5    *
6    * The software in this package is published under the terms of the CPAL v1.0
7    * license, a copy of which has been included with this distribution in the
8    * LICENSE.txt file.
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          // Merge:
63          // i) explicitly configured notification listeners,
64          // ii) any singleton beans defined in spring that implement ServerNotificationListener.
65          Set<ListenerSubscriptionPair> subs = getMergedListeners(notificationManager);
66          for (ListenerSubscriptionPair sub : subs)
67          {
68              // Do this to avoid warnings when the Spring context is refreshed
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          // Any singleton bean defined in spring that implements
82          // ServerNotificationListener or a subclass.
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 }