You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by cs...@apache.org on 2018/02/01 17:04:31 UTC

[2/5] aries-rsa git commit: [ARIES-1763] Change local discovery to EndpointEventListener

[ARIES-1763] Change local discovery to EndpointEventListener


Project: http://git-wip-us.apache.org/repos/asf/aries-rsa/repo
Commit: http://git-wip-us.apache.org/repos/asf/aries-rsa/commit/60500a6f
Tree: http://git-wip-us.apache.org/repos/asf/aries-rsa/tree/60500a6f
Diff: http://git-wip-us.apache.org/repos/asf/aries-rsa/diff/60500a6f

Branch: refs/heads/master
Commit: 60500a6f99fc32cc962c36c15f41519ca130dde0
Parents: 835b8d7
Author: Christian Schneider <cs...@adobe.com>
Authored: Thu Feb 1 17:49:03 2018 +0100
Committer: Christian Schneider <cs...@adobe.com>
Committed: Thu Feb 1 17:49:03 2018 +0100

----------------------------------------------------------------------
 .../aries/rsa/discovery/local/Activator.java    |  16 +--
 .../rsa/discovery/local/LocalDiscovery.java     |  71 +++++------
 .../rsa/discovery/local/LocalDiscoveryTest.java | 121 +++++++++----------
 3 files changed, 99 insertions(+), 109 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/60500a6f/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/Activator.java
----------------------------------------------------------------------
diff --git a/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/Activator.java b/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/Activator.java
index b1d6cd3..3e9a187 100644
--- a/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/Activator.java
+++ b/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/Activator.java
@@ -21,11 +21,11 @@ package org.apache.aries.rsa.discovery.local;
 import org.osgi.framework.BundleActivator;
 import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceReference;
-import org.osgi.service.remoteserviceadmin.EndpointListener;
+import org.osgi.service.remoteserviceadmin.EndpointEventListener;
 import org.osgi.util.tracker.ServiceTracker;
 
 public class Activator implements BundleActivator {
-    private ServiceTracker<EndpointListener, EndpointListener> listenerTracker;
+    private ServiceTracker<EndpointEventListener, EndpointEventListener> listenerTracker;
     private LocalDiscovery localDiscovery;
 
     public void start(BundleContext context) {
@@ -41,23 +41,23 @@ public class Activator implements BundleActivator {
         context.removeBundleListener(localDiscovery);
     }
 
-    private final class EPListenerTracker extends ServiceTracker<EndpointListener, EndpointListener> {
+    private final class EPListenerTracker extends ServiceTracker<EndpointEventListener, EndpointEventListener> {
         private final LocalDiscovery localDiscovery;
     
         private EPListenerTracker(BundleContext context, LocalDiscovery localDiscovery) {
-            super(context, EndpointListener.class, null);
+            super(context, EndpointEventListener.class, null);
             this.localDiscovery = localDiscovery;
         }
     
         @Override
-        public EndpointListener addingService(ServiceReference<EndpointListener> reference) {
-            EndpointListener service = super.addingService(reference);
+        public EndpointEventListener addingService(ServiceReference<EndpointEventListener> reference) {
+            EndpointEventListener service = super.addingService(reference);
             localDiscovery.addListener(reference, service);
             return service;
         }
     
         @Override
-        public void modifiedService(ServiceReference<EndpointListener> reference, EndpointListener service) {
+        public void modifiedService(ServiceReference<EndpointEventListener> reference, EndpointEventListener service) {
             super.modifiedService(reference, service);
             localDiscovery.removeListener(service);
     
@@ -68,7 +68,7 @@ public class Activator implements BundleActivator {
         }
     
         @Override
-        public void removedService(ServiceReference<EndpointListener> reference, EndpointListener service) {
+        public void removedService(ServiceReference<EndpointEventListener> reference, EndpointEventListener service) {
             super.removedService(reference, service);
             localDiscovery.removeListener(service);
         }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/60500a6f/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/LocalDiscovery.java
----------------------------------------------------------------------
diff --git a/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/LocalDiscovery.java b/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/LocalDiscovery.java
index a1e8575..9f076f8 100644
--- a/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/LocalDiscovery.java
+++ b/discovery/local/src/main/java/org/apache/aries/rsa/discovery/local/LocalDiscovery.java
@@ -37,7 +37,8 @@ import org.osgi.framework.Filter;
 import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
-import org.osgi.service.remoteserviceadmin.EndpointListener;
+import org.osgi.service.remoteserviceadmin.EndpointEvent;
+import org.osgi.service.remoteserviceadmin.EndpointEventListener;
 
 public class LocalDiscovery implements BundleListener {
 
@@ -45,10 +46,10 @@ public class LocalDiscovery implements BundleListener {
     // same interface name but different properties and takes care of itself with respect to concurrency
     Map<EndpointDescription, Bundle> endpointDescriptions =
         new ConcurrentHashMap<EndpointDescription, Bundle>();
-    Map<EndpointListener, Collection<String>> listenerToFilters =
-        new HashMap<EndpointListener, Collection<String>>();
-    Map<String, Collection<EndpointListener>> filterToListeners =
-        new HashMap<String, Collection<EndpointListener>>();
+    Map<EndpointEventListener, Collection<String>> listenerToFilters =
+        new HashMap<EndpointEventListener, Collection<String>>();
+    Map<String, Collection<EndpointEventListener>> filterToListeners =
+        new HashMap<String, Collection<EndpointEventListener>>();
 
     EndpointDescriptionBundleParser bundleParser;
 
@@ -68,8 +69,8 @@ public class LocalDiscovery implements BundleListener {
         }
     }
 
-    void addListener(ServiceReference<EndpointListener> endpointListenerRef, EndpointListener endpointListener) {
-        List<String> filters = StringPlus.normalize(endpointListenerRef.getProperty(EndpointListener.ENDPOINT_LISTENER_SCOPE));
+    void addListener(ServiceReference<EndpointEventListener> endpointListenerRef, EndpointEventListener endpointListener) {
+        List<String> filters = StringPlus.normalize(endpointListenerRef.getProperty(EndpointEventListener.ENDPOINT_LISTENER_SCOPE));
         if (filters.isEmpty()) {
             return;
         }
@@ -77,9 +78,9 @@ public class LocalDiscovery implements BundleListener {
         synchronized (listenerToFilters) {
             listenerToFilters.put(endpointListener, filters);
             for (String filter : filters) {
-                Collection<EndpointListener> listeners = filterToListeners.get(filter);
+                Collection<EndpointEventListener> listeners = filterToListeners.get(filter);
                 if (listeners == null) {
-                    listeners = new ArrayList<EndpointListener>();
+                    listeners = new ArrayList<EndpointEventListener>();
                     filterToListeners.put(filter, listeners);
                 }
                 listeners.add(endpointListener);
@@ -95,7 +96,7 @@ public class LocalDiscovery implements BundleListener {
      * itself to clean up any orphans. See Remote Service Admin spec 122.6.3
      * @param endpointListener
      */
-    void removeListener(EndpointListener endpointListener) {
+    void removeListener(EndpointEventListener endpointListener) {
         synchronized (listenerToFilters) {
             Collection<String> filters = listenerToFilters.remove(endpointListener);
             if (filters == null) {
@@ -103,7 +104,7 @@ public class LocalDiscovery implements BundleListener {
             }
 
             for (String filter : filters) {
-                Collection<EndpointListener> listeners = filterToListeners.get(filter);
+                Collection<EndpointEventListener> listeners = filterToListeners.get(filter);
                 if (listeners != null) {
                     listeners.remove(endpointListener);
                     if (listeners.isEmpty()) {
@@ -114,14 +115,14 @@ public class LocalDiscovery implements BundleListener {
         }
     }
 
-    private Map<String, Collection<EndpointListener>> getMatchingListeners(EndpointDescription endpoint) {
+    private Map<String, Collection<EndpointEventListener>> getMatchingListeners(EndpointDescription endpoint) {
         // return a copy of matched filters/listeners so that caller doesn't need to hold locks while triggering events
-        Map<String, Collection<EndpointListener>> matched = new HashMap<String, Collection<EndpointListener>>();
+        Map<String, Collection<EndpointEventListener>> matched = new HashMap<String, Collection<EndpointEventListener>>();
         synchronized (listenerToFilters) {
-            for (Entry<String, Collection<EndpointListener>> entry : filterToListeners.entrySet()) {
+            for (Entry<String, Collection<EndpointEventListener>> entry : filterToListeners.entrySet()) {
                 String filter = entry.getKey();
                 if (LocalDiscovery.matchFilter(filter, endpoint)) {
-                    matched.put(filter, new ArrayList<EndpointListener>(entry.getValue()));
+                    matched.put(filter, new ArrayList<EndpointEventListener>(entry.getValue()));
                 }
             }
         }
@@ -145,7 +146,8 @@ public class LocalDiscovery implements BundleListener {
         List<EndpointDescription> endpoints = bundleParser.getAllEndpointDescriptions(bundle);
         for (EndpointDescription endpoint : endpoints) {
             endpointDescriptions.put(endpoint, bundle);
-            addedEndpointDescription(endpoint);
+            EndpointEvent event = new EndpointEvent(EndpointEvent.ADDED, endpoint);
+            triggerCallbacks(event);
         }
     }
 
@@ -154,46 +156,35 @@ public class LocalDiscovery implements BundleListener {
             i.hasNext();) {
             Entry<EndpointDescription, Bundle> entry = i.next();
             if (bundle.equals(entry.getValue())) {
-                removedEndpointDescription(entry.getKey());
+                EndpointEvent event = new EndpointEvent(EndpointEvent.REMOVED, entry.getKey());
+                triggerCallbacks(event);
                 i.remove();
             }
         }
     }
 
-    private void addedEndpointDescription(EndpointDescription endpoint) {
-        triggerCallbacks(endpoint, true);
-    }
-
-    private void removedEndpointDescription(EndpointDescription endpoint) {
-        triggerCallbacks(endpoint, false);
-    }
-
-    private void triggerCallbacks(EndpointDescription endpoint, boolean added) {
-        for (Map.Entry<String, Collection<EndpointListener>> entry : getMatchingListeners(endpoint).entrySet()) {
+    private void triggerCallbacks(EndpointEvent event) {
+        EndpointDescription endpoint = event.getEndpoint();
+        for (Map.Entry<String, Collection<EndpointEventListener>> entry : getMatchingListeners(endpoint).entrySet()) {
             String filter = entry.getKey();
-            for (EndpointListener listener : entry.getValue()) {
-                triggerCallbacks(listener, filter, endpoint, added);
+            for (EndpointEventListener listener : entry.getValue()) {
+                triggerCallbacks(listener, filter, event);
             }
         }
     }
 
-    private void triggerCallbacks(EndpointListener endpointListener, String filter,
-            EndpointDescription endpoint, boolean added) {
-        if (!LocalDiscovery.matchFilter(filter, endpoint)) {
+    private void triggerCallbacks(EndpointEventListener endpointListener, String filter, EndpointEvent event) {
+        if (!LocalDiscovery.matchFilter(filter, event.getEndpoint())) {
             return;
         }
-
-        if (added) {
-            endpointListener.endpointAdded(endpoint, filter);
-        } else {
-            endpointListener.endpointRemoved(endpoint, filter);
-        }
+        endpointListener.endpointChanged(event, filter);
     }
 
-    private void triggerCallbacks(Collection<String> filters, EndpointListener endpointListener) {
+    private void triggerCallbacks(Collection<String> filters, EndpointEventListener endpointListener) {
         for (String filter : filters) {
             for (EndpointDescription endpoint : endpointDescriptions.keySet()) {
-                triggerCallbacks(endpointListener, filter, endpoint, true);
+                EndpointEvent event = new EndpointEvent(EndpointEvent.ADDED, endpoint);
+                triggerCallbacks(endpointListener, filter, event);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/60500a6f/discovery/local/src/test/java/org/apache/aries/rsa/discovery/local/LocalDiscoveryTest.java
----------------------------------------------------------------------
diff --git a/discovery/local/src/test/java/org/apache/aries/rsa/discovery/local/LocalDiscoveryTest.java b/discovery/local/src/test/java/org/apache/aries/rsa/discovery/local/LocalDiscoveryTest.java
index f503236..42cd86b 100644
--- a/discovery/local/src/test/java/org/apache/aries/rsa/discovery/local/LocalDiscoveryTest.java
+++ b/discovery/local/src/test/java/org/apache/aries/rsa/discovery/local/LocalDiscoveryTest.java
@@ -39,7 +39,8 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleEvent;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
-import org.osgi.service.remoteserviceadmin.EndpointListener;
+import org.osgi.service.remoteserviceadmin.EndpointEvent;
+import org.osgi.service.remoteserviceadmin.EndpointEventListener;
 
 public class LocalDiscoveryTest {
 
@@ -96,21 +97,10 @@ public class LocalDiscoveryTest {
         ld.bundleChanged(be0);
         assertEquals(0, ld.endpointDescriptions.size());
 
-        // Create an EndpointListener
-        final Map<String, Object> props = new Hashtable<String, Object>();
-        props.put(EndpointListener.ENDPOINT_LISTENER_SCOPE, "(objectClass=*)");
-        @SuppressWarnings("unchecked")
-        ServiceReference<EndpointListener> sr = EasyMock.createMock(ServiceReference.class);
-        EasyMock.expect(sr.getPropertyKeys()).andReturn(props.keySet().toArray(new String[] {})).anyTimes();
-        EasyMock.expect(sr.getProperty((String) EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
-            public Object answer() throws Throwable {
-                return props.get(EasyMock.getCurrentArguments()[0]);
-            }
-        }).anyTimes();
-        EasyMock.replay(sr);
+        ServiceReference<EndpointEventListener> sr = epListenerWithScope("(objectClass=*)");
 
-        EndpointListener endpointListener = EasyMock.createMock(EndpointListener.class);
-        endpointListener.endpointAdded((EndpointDescription) EasyMock.anyObject(), EasyMock.eq("(objectClass=*)"));
+        EndpointEventListener endpointListener = EasyMock.createMock(EndpointEventListener.class);
+        endpointListener.endpointChanged(EasyMock.anyObject(EndpointEvent.class), EasyMock.eq("(objectClass=*)"));
         EasyMock.expectLastCall();
         EasyMock.replay(endpointListener);
         ld.addListener(sr, endpointListener);
@@ -127,7 +117,7 @@ public class LocalDiscoveryTest {
 
         // Stop the bundle
         EasyMock.reset(endpointListener);
-        endpointListener.endpointRemoved((EndpointDescription) EasyMock.anyObject(), EasyMock.eq("(objectClass=*)"));
+        endpointListener.endpointChanged(EasyMock.anyObject(EndpointEvent.class), EasyMock.eq("(objectClass=*)"));
         EasyMock.expectLastCall();
         EasyMock.replay(endpointListener);
 
@@ -147,21 +137,10 @@ public class LocalDiscoveryTest {
         ld.bundleChanged(event);
         assertEquals(2, ld.endpointDescriptions.size());
 
-        final Map<String, Object> props = new Hashtable<String, Object>();
-        props.put(EndpointListener.ENDPOINT_LISTENER_SCOPE, new String[] {"(objectClass=org.example.ClassA)"});
-        @SuppressWarnings("unchecked")
-        ServiceReference<EndpointListener> sr = EasyMock.createMock(ServiceReference.class);
-        EasyMock.expect(sr.getPropertyKeys()).andReturn(props.keySet().toArray(new String[] {})).anyTimes();
-        EasyMock.expect(sr.getProperty((String) EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
-            public Object answer() throws Throwable {
-                return props.get(EasyMock.getCurrentArguments()[0]);
-            }
-        }).anyTimes();
-
-        EasyMock.replay(sr);
+        ServiceReference<EndpointEventListener> sr = epListenerWithScope("(objectClass=org.example.ClassA)");
 
-        EndpointListener el = EasyMock.createMock(EndpointListener.class);
-        el.endpointAdded((EndpointDescription) EasyMock.anyObject(),
+        EndpointEventListener el = EasyMock.createMock(EndpointEventListener.class);
+        el.endpointChanged(EasyMock.anyObject(EndpointEvent.class),
                 EasyMock.eq("(objectClass=org.example.ClassA)"));
         EasyMock.expectLastCall();
         EasyMock.replay(el);
@@ -180,16 +159,16 @@ public class LocalDiscoveryTest {
 
         // Modify the EndpointListener Service
         // no need to reset the mock for this...
-        props.put(EndpointListener.ENDPOINT_LISTENER_SCOPE,
-                  "(|(objectClass=org.example.ClassA)(objectClass=org.example.ClassB))");
+        ServiceReference<EndpointEventListener> sr2 = epListenerWithScope("(|(objectClass=org.example.ClassA)(objectClass=org.example.ClassB))");
 
         EasyMock.reset(el);
         final Set<String> actualEndpoints = new HashSet<String>();
-        el.endpointAdded((EndpointDescription) EasyMock.anyObject(),
+        el.endpointChanged(EasyMock.anyObject(EndpointEvent.class),
                 EasyMock.eq("(|(objectClass=org.example.ClassA)(objectClass=org.example.ClassB))"));
         EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
             public Object answer() throws Throwable {
-                EndpointDescription endpoint = (EndpointDescription) EasyMock.getCurrentArguments()[0];
+                EndpointEvent event = (EndpointEvent) EasyMock.getCurrentArguments()[0];
+                EndpointDescription endpoint = event.getEndpoint();
                 actualEndpoints.addAll(endpoint.getInterfaces());
                 return null;
             }
@@ -197,7 +176,7 @@ public class LocalDiscoveryTest {
         EasyMock.replay(el);
 
         ld.removeListener(el);
-        ld.addListener(sr, el);
+        ld.addListener(sr2, el);
         assertEquals(1, ld.listenerToFilters.size());
         assertEquals(Arrays.asList("(|(objectClass=org.example.ClassA)(objectClass=org.example.ClassB))"),
             ld.listenerToFilters.get(el));
@@ -215,27 +194,14 @@ public class LocalDiscoveryTest {
         assertEquals(0, ld.filterToListeners.size());
     }
 
-    private Bundle createBundle() {
-        Bundle bundle = EasyMock.createMock(Bundle.class);
-        EasyMock.expect(bundle.getState()).andReturn(Bundle.ACTIVE);
-        Dictionary<String, String> headers = new Hashtable<String, String>();
-        headers.put("Remote-Service", "OSGI-INF/rsa/ed4.xml");
-        EasyMock.expect(bundle.getHeaders()).andReturn(headers);
-        EasyMock.expect(bundle.findEntries("OSGI-INF/rsa", "ed4.xml", false))
-            .andReturn(Collections.enumeration(
-                Collections.singleton(getClass().getResource("/ed4.xml"))));
-        EasyMock.replay(bundle);
-        return bundle;
-    }
-
     @Test
     public void testRegisterTracker() throws Exception {
         LocalDiscovery ld = new LocalDiscovery();
 
         final Map<String, Object> props = new Hashtable<String, Object>();
-        props.put(EndpointListener.ENDPOINT_LISTENER_SCOPE, "(objectClass=Aaaa)");
+        props.put(EndpointEventListener.ENDPOINT_LISTENER_SCOPE, "(objectClass=Aaaa)");
         @SuppressWarnings("unchecked")
-        ServiceReference<EndpointListener> sr = EasyMock.createMock(ServiceReference.class);
+        ServiceReference<EndpointEventListener> sr = EasyMock.createMock(ServiceReference.class);
         EasyMock.expect(sr.getPropertyKeys()).andReturn(props.keySet().toArray(new String[] {})).anyTimes();
         EasyMock.expect(sr.getProperty((String) EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
             public Object answer() throws Throwable {
@@ -244,7 +210,7 @@ public class LocalDiscoveryTest {
         }).anyTimes();
         EasyMock.replay(sr);
 
-        EndpointListener endpointListener = EasyMock.createMock(EndpointListener.class);
+        EndpointEventListener endpointListener = EasyMock.createMock(EndpointEventListener.class);
         EasyMock.replay(endpointListener);
 
         assertEquals("Precondition failed", 0, ld.listenerToFilters.size());
@@ -258,7 +224,7 @@ public class LocalDiscoveryTest {
 
         // Add another one with the same scope filter
         @SuppressWarnings("unchecked")
-        ServiceReference<EndpointListener> sr2 = EasyMock.createMock(ServiceReference.class);
+        ServiceReference<EndpointEventListener> sr2 = EasyMock.createMock(ServiceReference.class);
         EasyMock.expect(sr2.getPropertyKeys()).andReturn(props.keySet().toArray(new String[] {})).anyTimes();
         EasyMock.expect(sr2.getProperty((String) EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
             public Object answer() throws Throwable {
@@ -267,7 +233,7 @@ public class LocalDiscoveryTest {
         }).anyTimes();
         EasyMock.replay(sr2);
 
-        EndpointListener endpointListener2 = EasyMock.createMock(EndpointListener.class);
+        EndpointEventListener endpointListener2 = EasyMock.createMock(EndpointEventListener.class);
         EasyMock.replay(endpointListener2);
         ld.addListener(sr2, endpointListener2);
 
@@ -276,14 +242,14 @@ public class LocalDiscoveryTest {
         assertEquals(Collections.singletonList("(objectClass=Aaaa)"), ld.listenerToFilters.get(endpointListener2));
 
         assertEquals(1, ld.filterToListeners.size());
-        List<EndpointListener> endpointListeners12 = Arrays.asList(endpointListener, endpointListener2);
+        List<EndpointEventListener> endpointListeners12 = Arrays.asList(endpointListener, endpointListener2);
         assertEquals(endpointListeners12, ld.filterToListeners.get("(objectClass=Aaaa)"));
 
         // Add another listener with a multi-value scope
         final Map<String, Object> props2 = new Hashtable<String, Object>();
-        props2.put(EndpointListener.ENDPOINT_LISTENER_SCOPE, Arrays.asList("(objectClass=X)", "(objectClass=Y)"));
+        props2.put(EndpointEventListener.ENDPOINT_LISTENER_SCOPE, Arrays.asList("(objectClass=X)", "(objectClass=Y)"));
         @SuppressWarnings("unchecked")
-        ServiceReference<EndpointListener> sr3 = EasyMock.createMock(ServiceReference.class);
+        ServiceReference<EndpointEventListener> sr3 = EasyMock.createMock(ServiceReference.class);
         EasyMock.expect(sr3.getPropertyKeys()).andReturn(props2.keySet().toArray(new String[] {})).anyTimes();
         EasyMock.expect(sr3.getProperty((String) EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
             public Object answer() throws Throwable {
@@ -292,7 +258,7 @@ public class LocalDiscoveryTest {
         }).anyTimes();
         EasyMock.replay(sr3);
 
-        EndpointListener endpointListener3 = EasyMock.createMock(EndpointListener.class);
+        EndpointEventListener endpointListener3 = EasyMock.createMock(EndpointEventListener.class);
         EasyMock.replay(endpointListener3);
         ld.addListener(sr3, endpointListener3);
 
@@ -311,17 +277,17 @@ public class LocalDiscoveryTest {
     public void testClearTracker() throws Exception {
         LocalDiscovery ld = new LocalDiscovery();
 
-        EndpointListener endpointListener = EasyMock.createMock(EndpointListener.class);
+        EndpointEventListener endpointListener = EasyMock.createMock(EndpointEventListener.class);
         ld.listenerToFilters.put(endpointListener,
                 new ArrayList<String>(Arrays.asList("(a=b)", "(objectClass=foo.bar.Bheuaark)")));
-        ld.filterToListeners.put("(a=b)", new ArrayList<EndpointListener>(Arrays.asList(endpointListener)));
+        ld.filterToListeners.put("(a=b)", new ArrayList<EndpointEventListener>(Arrays.asList(endpointListener)));
         ld.filterToListeners.put("(objectClass=foo.bar.Bheuaark)",
-                new ArrayList<EndpointListener>(Arrays.asList(endpointListener)));
+                new ArrayList<EndpointEventListener>(Arrays.asList(endpointListener)));
 
         assertEquals(1, ld.listenerToFilters.size());
         assertEquals(2, ld.filterToListeners.size());
         assertEquals(1, ld.filterToListeners.values().iterator().next().size());
-        ld.removeListener(EasyMock.createMock(EndpointListener.class));
+        ld.removeListener(EasyMock.createMock(EndpointEventListener.class));
         assertEquals(1, ld.listenerToFilters.size());
         assertEquals(2, ld.filterToListeners.size());
         assertEquals(1, ld.filterToListeners.values().iterator().next().size());
@@ -329,4 +295,37 @@ public class LocalDiscoveryTest {
         assertEquals(0, ld.listenerToFilters.size());
         assertEquals(0, ld.filterToListeners.size());
     }
+
+    private ServiceReference<EndpointEventListener> epListenerWithScope(String scope) {
+        final Map<String, Object> props = new Hashtable<String, Object>();
+        props.put(EndpointEventListener.ENDPOINT_LISTENER_SCOPE, new String[] {scope});
+        return mockService(props);
+    }
+    
+    private ServiceReference<EndpointEventListener> mockService(final Map<String, Object> props) {
+        @SuppressWarnings("unchecked")
+        ServiceReference<EndpointEventListener> sr = EasyMock.createMock(ServiceReference.class);
+        EasyMock.expect(sr.getPropertyKeys()).andReturn(props.keySet().toArray(new String[] {})).anyTimes();
+        EasyMock.expect(sr.getProperty((String) EasyMock.anyObject())).andAnswer(new IAnswer<Object>() {
+            public Object answer() throws Throwable {
+                return props.get(EasyMock.getCurrentArguments()[0]);
+            }
+        }).anyTimes();
+    
+        EasyMock.replay(sr);
+        return sr;
+    }
+
+    private Bundle createBundle() {
+        Bundle bundle = EasyMock.createMock(Bundle.class);
+        EasyMock.expect(bundle.getState()).andReturn(Bundle.ACTIVE);
+        Dictionary<String, String> headers = new Hashtable<String, String>();
+        headers.put("Remote-Service", "OSGI-INF/rsa/ed4.xml");
+        EasyMock.expect(bundle.getHeaders()).andReturn(headers);
+        EasyMock.expect(bundle.findEntries("OSGI-INF/rsa", "ed4.xml", false))
+            .andReturn(Collections.enumeration(
+                Collections.singleton(getClass().getResource("/ed4.xml"))));
+        EasyMock.replay(bundle);
+        return bundle;
+    }
 }