Java Reference
In-Depth Information
Listing 4.10 Correct listener example—keeping track of active Log Services
class LogListener implements ServiceListener {
SortedSet<ServiceReference> m_logServiceRefs =
new TreeSet<ServiceReference>();
public synchronized void serviceChanged(ServiceEvent event) {
switch (event.getType()) {
case ServiceEvent.REGISTERED:
m_logServiceRefs.add(event.getServiceReference());
break;
case ServiceEvent.MODIFIED:
break;
case ServiceEvent.UNREGISTERING:
m_logServiceRefs.remove(event.getServiceReference());
break;
default:
break;
}
}
Locks
listener before
changing state
Locks listener
before querying
state
public synchronized LogService getLogService() {
if (m_logServiceRefs.size() > 0) {
return (LogService) m_context.getService(
m_logServiceRefs.last());
}
return null;
}
}
Now the last service reference has the highest ranking.
Yo u c a n f i x t h e s e c o n d p r o b l e m i n t h e b u n d l e a c t i v a t o r b y i s s u i n g p s e u d o - r e g i s t r a t i o n
events for each existing service, to make it look like the service has only just appeared,
as shown in the following listing.
Listing 4.11 Correct listener example—sending pseudo-registration events
public class Activator implements BundleActivator {
BundleContext m_context;
LogListener m_logListener;
public void start(BundleContext context) throws Exception {
m_context = context;
Locks listener
before adding it
m_logListener = new LogListener();
synchronized (m_logListener) {
String filter = "(" + Constants.OBJECTCLASS + "=" +
LogService.class.getName() + ")";
context.addServiceListener(m_logListener, filter);
Checks for
existing services
ServiceReference[] refs =
context.getServiceReferences(null, filter);
if (refs != null) {
 
Search WWH ::




Custom Search