1 11 12 package org.eclipse.osgi.framework.internal.core; 13 14 import org.eclipse.osgi.framework.debug.Debug; 15 import org.osgi.framework.*; 16 17 public class FilteredServiceListener implements ServiceListener { 18 19 private final FilterImpl filter; 20 21 private final ServiceListener listener; 22 private final BundleContextImpl context; 24 private final boolean allservices; 26 private final String objectClass; 28 29 36 protected FilteredServiceListener(String filterstring, ServiceListener listener, BundleContextImpl context) throws InvalidSyntaxException { 37 if (filterstring == null) { 38 this.filter = null; 39 this.objectClass = null; 40 } 41 else { 42 FilterImpl filterImpl = new FilterImpl(filterstring); 43 String clazz = filterImpl.getRequiredObjectClass(); 44 if (clazz == null) { 45 this.objectClass = null; 46 this.filter = filterImpl; 47 } 48 else { 49 this.objectClass = clazz.intern(); 50 String objectClassFilter = FilterImpl.getObjectClassFilterString(this.objectClass); 51 this.filter = (objectClassFilter.equals(filterstring)) ? null : filterImpl; 52 } 53 } 54 this.listener = listener; 55 this.context = context; 56 this.allservices = (listener instanceof AllServiceListener); 57 } 58 59 65 public void serviceChanged(ServiceEvent event) { 66 ServiceReferenceImpl reference = (ServiceReferenceImpl) event.getServiceReference(); 67 68 objectClassCheck: 70 if (objectClass != null) { 71 String [] classes = reference.getClasses(); 72 int size = classes.length; 73 for (int i = 0; i < size; i++) { 74 if (classes[i] == objectClass) break objectClassCheck; 76 } 77 return; } 79 80 if (!context.hasListenServicePermission(event)) 81 return; 82 83 if (Debug.DEBUG && Debug.DEBUG_EVENTS) { 84 String listenerName = this.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(this)); Debug.println("filterServiceEvent(" + listenerName + ", \"" + filter + "\", " + reference.registration.properties + ")"); } 87 88 if ((filter == null || filter.match(reference)) && (allservices || context.isAssignableTo(reference))) { 89 if (Debug.DEBUG && Debug.DEBUG_EVENTS) { 90 String listenerName = listener.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(listener)); Debug.println("dispatchFilteredServiceEvent(" + listenerName + ")"); } 93 94 listener.serviceChanged(event); 95 } 96 } 97 98 103 public String toString() { 104 return filter == null ? listener.toString() : filter.toString(); 105 } 106 107 } 108 | Popular Tags |