1 36 package org.ungoverned.oscar.util; 37 38 import java.util.EventListener ; 39 import java.util.EventObject ; 40 41 import org.osgi.framework.BundleListener; 42 import org.osgi.framework.ServiceListener; 43 import org.osgi.framework.SynchronousBundleListener; 44 import org.ungoverned.oscar.Oscar; 45 46 58 public class OscarDispatchQueue extends DispatchQueue 59 { 60 74 public void dispatch(Dispatcher dispatcher, Class clazz, EventObject eventObj) 75 { 76 Object [] listeners = getListeners(); 77 78 if ((clazz == ServiceListener.class) && (listeners.length > 0)) 81 { 82 for (int i = listeners.length - 2; i >= 0; i -= 2) 84 { 85 ListenerWrapper lw = (ListenerWrapper) listeners[i + 1]; 89 if (lw.getListenerClass() == ServiceListener.class) 90 { 91 try { 92 dispatcher.dispatch( 93 (EventListener ) lw, eventObj); 94 } catch (Throwable th) { 95 Oscar.error("OscarDispatchQueue: Error during dispatch.", th); 96 } 97 } 98 } 99 } 100 else if ((clazz == BundleListener.class) && (listeners.length > 0)) 103 { 104 for (int i = listeners.length - 2; i >= 0; i -= 2) 106 { 107 ListenerWrapper lw = (ListenerWrapper) listeners[i + 1]; 110 if (lw.getListenerClass() == SynchronousBundleListener.class) 111 { 112 try { 113 dispatcher.dispatch( 114 (EventListener ) lw, eventObj); 115 } catch (Throwable th) { 116 Oscar.error("OscarDispatchQueue: Error during dispatch.", th); 117 } 118 } 119 } 120 121 IgnoreSynchronousDispatcher ignoreDispatcher = new IgnoreSynchronousDispatcher(); 124 ignoreDispatcher.setDispatcher(dispatcher); 125 126 dispatch(listeners, ignoreDispatcher, clazz, eventObj); 128 } 129 else 131 { 132 dispatch(listeners, dispatcher, clazz, eventObj); 133 } 134 } 135 136 private static class IgnoreSynchronousDispatcher implements Dispatcher 137 { 138 private Dispatcher m_dispatcher = null; 139 140 public void setDispatcher(Dispatcher dispatcher) 141 { 142 m_dispatcher = dispatcher; 143 } 144 145 public void dispatch(EventListener l, EventObject eventObj) 146 { 147 if (l instanceof ListenerWrapper) 148 { 149 ListenerWrapper lw = (ListenerWrapper) l; 150 if (!(lw.getListenerClass() == SynchronousBundleListener.class)) 153 { 154 m_dispatcher.dispatch(l, eventObj); 155 } 156 } 157 } 158 } 159 } | Popular Tags |