Repository: aries-rsa
Updated Branches:
  refs/heads/master 2693bb8ff -> d6b354daf


[ARIES-1763] Support both EndpointListener and EndpointEventListener in 
TopologyManager export


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

Branch: refs/heads/master
Commit: 3f77941e114ed174ed9dd0775a46924a063e7375
Parents: 2693bb8
Author: Christian Schneider <[email protected]>
Authored: Tue Jan 30 18:12:26 2018 +0100
Committer: Christian Schneider <[email protected]>
Committed: Tue Jan 30 18:12:26 2018 +0100

----------------------------------------------------------------------
 .../aries/rsa/topologymanager/Activator.java    | 37 +++++++-
 .../exporter/EndpointListenerAdapter.java       | 70 +++++++++++++++
 .../exporter/EndpointListenerNotifier.java      | 84 +++++++++---------
 .../exporter/EndpointRepository.java            | 13 +--
 .../importer/TopologyManagerImport.java         | 14 +--
 .../exporter/EndpointListenerNotifierTest.java  | 25 +++---
 .../exporter/EndpointRepositoryTest.java        | 24 ++---
 .../RecordingEndpointEventListener.java         | 48 ++++++++++
 .../exporter/TopologyManagerExportTest.java     | 92 ++++++++------------
 .../importer/TopologyManagerImportTest.java     |  1 +
 10 files changed, 274 insertions(+), 134 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/Activator.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/Activator.java
 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/Activator.java
index 97378a8..e67b5a1 100644
--- 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/Activator.java
+++ 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/Activator.java
@@ -38,6 +38,7 @@ import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceEvent;
 import org.osgi.framework.ServiceReference;
+import org.osgi.service.remoteserviceadmin.EndpointEventListener;
 import org.osgi.service.remoteserviceadmin.EndpointListener;
 import org.osgi.service.remoteserviceadmin.RemoteConstants;
 import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin;
@@ -46,6 +47,7 @@ import org.osgi.util.tracker.ServiceTrackerCustomizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+@SuppressWarnings("deprecation")
 public class Activator implements BundleActivator {
     public static final String RSA_EXPORT_POLICY_FILTER = 
"rsa.export.policy.filter";
     static final String DOSGI_SERVICES = "(" + 
RemoteConstants.SERVICE_EXPORTED_INTERFACES + "=*)";
@@ -56,9 +58,11 @@ public class Activator implements BundleActivator {
     private EndpointListenerNotifier notifier;
     private ServiceTracker<RemoteServiceAdmin, RemoteServiceAdmin> rsaTracker;
     private ThreadPoolExecutor exportExecutor;
+    
     private ServiceTracker<EndpointListener, EndpointListener> 
epListenerTracker;
     private ServiceTracker<ExportPolicy, ExportPolicy> policyTracker;
     private EndpointListenerManager endpointListenerManager;
+    private EndpointEventListenerTracker epeListenerTracker;
 
     public void start(final BundleContext bc) throws Exception {
         Dictionary<String, String> props = new Hashtable<String, String>();
@@ -101,6 +105,7 @@ public class Activator implements BundleActivator {
         EndpointRepository endpointRepo = new EndpointRepository();
         notifier = new EndpointListenerNotifier(endpointRepo);
         epListenerTracker = new EndpointListenerTracker(bc);
+        epeListenerTracker = new EndpointEventListenerTracker(bc);
         endpointRepo.setNotifier(notifier);
         exportExecutor = new ThreadPoolExecutor(5, 10, 50, TimeUnit.SECONDS, 
new LinkedBlockingQueue<Runnable>());
         exportManager = new TopologyManagerExport(endpointRepo, 
exportExecutor, policy);
@@ -111,6 +116,7 @@ public class Activator implements BundleActivator {
         bc.addServiceListener(exportManager);
         rsaTracker.open();
         epListenerTracker.open();
+        epeListenerTracker.open();
         exportExistingServices(bc);
         importManager.start();
     }
@@ -152,7 +158,7 @@ public class Activator implements BundleActivator {
         @Override
         public EndpointListener 
addingService(ServiceReference<EndpointListener> reference) {
             EndpointListener listener = super.addingService(reference);
-            notifier.add(listener, 
EndpointListenerNotifier.getFiltersFromEndpointListenerScope(reference));
+            notifier.add(listener, 
EndpointListenerNotifier.filtersFromEL(reference));
             return listener;
         }
 
@@ -160,7 +166,7 @@ public class Activator implements BundleActivator {
         public void modifiedService(ServiceReference<EndpointListener> 
reference,
                                     EndpointListener listener) {
             super.modifiedService(reference, listener);
-            notifier.add(listener, 
EndpointListenerNotifier.getFiltersFromEndpointListenerScope(reference));
+            notifier.add(listener, 
EndpointListenerNotifier.filtersFromEL(reference));
         }
 
         @Override
@@ -170,6 +176,33 @@ public class Activator implements BundleActivator {
             super.removedService(reference, listener);
         }
     }
+    
+    private final class EndpointEventListenerTracker extends 
ServiceTracker<EndpointEventListener, EndpointEventListener> {
+        private EndpointEventListenerTracker(BundleContext context) {
+            super(context, EndpointEventListener.class, null);
+        }
+
+        @Override
+        public EndpointEventListener 
addingService(ServiceReference<EndpointEventListener> reference) {
+            EndpointEventListener listener = super.addingService(reference);
+            notifier.add(listener, 
EndpointListenerNotifier.filtersFromEEL(reference));
+            return listener;
+        }
+
+        @Override
+        public void modifiedService(ServiceReference<EndpointEventListener> 
reference,
+                EndpointEventListener listener) {
+            super.modifiedService(reference, listener);
+            notifier.add(listener, 
EndpointListenerNotifier.filtersFromEEL(reference));
+        }
+
+        @Override
+        public void removedService(ServiceReference<EndpointEventListener> 
reference,
+                EndpointEventListener listener) {
+            notifier.remove(listener);
+            super.removedService(reference, listener);
+        }
+    }
 
     private final class RSATracker extends ServiceTracker<RemoteServiceAdmin, 
RemoteServiceAdmin> {
         private RSATracker(BundleContext context, Class<RemoteServiceAdmin> 
clazz,

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerAdapter.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerAdapter.java
 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerAdapter.java
new file mode 100644
index 0000000..0e0e1cc
--- /dev/null
+++ 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerAdapter.java
@@ -0,0 +1,70 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.rsa.topologymanager.exporter;
+
+import org.osgi.service.remoteserviceadmin.EndpointDescription;
+import org.osgi.service.remoteserviceadmin.EndpointEvent;
+import org.osgi.service.remoteserviceadmin.EndpointEventListener;
+import org.osgi.service.remoteserviceadmin.EndpointListener;
+
+/**
+ * Wraps on old style EndpointListener into the new
+ * EndpointEventListener interface
+ */
+@SuppressWarnings("deprecation")
+class EndpointListenerAdapter implements EndpointEventListener {
+    private EndpointListener epl;
+
+    public EndpointListenerAdapter(EndpointListener epl) {
+        this.epl = epl;
+    }
+
+    @Override
+    public void endpointChanged(EndpointEvent event, String filter) {
+        EndpointDescription endpoint = event.getEndpoint();
+        switch (event.getType()) {
+        case EndpointEvent.ADDED:
+            epl.endpointAdded(endpoint, filter);
+            break;
+        case EndpointEvent.REMOVED:
+            epl.endpointRemoved(endpoint, filter);
+            break;
+        case EndpointEvent.MODIFIED:
+            epl.endpointRemoved(endpoint, filter);
+            epl.endpointAdded(endpoint, filter);
+            break;
+        case EndpointEvent.MODIFIED_ENDMATCH:
+            epl.endpointRemoved(endpoint, filter);
+            break;
+        }
+    }
+    
+    /**
+     * Checks for equality of the adapted EndpointListener
+     */
+    @Override
+    public boolean equals(Object obj) {
+        if (obj instanceof EndpointListenerAdapter) {
+            EndpointListenerAdapter ela = (EndpointListenerAdapter)obj;
+            return epl.equals(ela.epl);
+        } else {
+            return super.equals(obj);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifier.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifier.java
 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifier.java
index 18a8ea2..7864bb4 100644
--- 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifier.java
+++ 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifier.java
@@ -32,6 +32,8 @@ import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
+import org.osgi.service.remoteserviceadmin.EndpointEvent;
+import org.osgi.service.remoteserviceadmin.EndpointEventListener;
 import org.osgi.service.remoteserviceadmin.EndpointListener;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,20 +41,29 @@ import org.slf4j.LoggerFactory;
 /**
  * Tracks EndpointListeners and allows to notify them of endpoints.
  */
-public class EndpointListenerNotifier implements EndpointListener {
+@SuppressWarnings("deprecation")
+public class EndpointListenerNotifier implements EndpointEventListener {
     private static final Logger LOG = 
LoggerFactory.getLogger(EndpointListenerNotifier.class);
-    private enum NotifyType { ADDED, REMOVED };
-    private Map<EndpointListener, Set<Filter>> listeners;
+    private Map<EndpointEventListener, Set<Filter>> listeners;
     private EndpointRepository endpointRepo;
 
     public EndpointListenerNotifier(final EndpointRepository endpointRepo) {
         this.endpointRepo = endpointRepo;
-        this.listeners = new ConcurrentHashMap<EndpointListener, 
Set<Filter>>();
+        this.listeners = new ConcurrentHashMap<EndpointEventListener, 
Set<Filter>>();
+    }
+   
+    public static Set<Filter> filtersFromEL(ServiceReference<EndpointListener> 
sref) {
+        List<String> scopes = 
StringPlus.normalize(sref.getProperty(EndpointListener.ENDPOINT_LISTENER_SCOPE));
+        return getFilterSet(scopes);
     }
     
-    public static Set<Filter> 
getFiltersFromEndpointListenerScope(ServiceReference<EndpointListener> sref) {
+    public static Set<Filter> 
filtersFromEEL(ServiceReference<EndpointEventListener> sref) {
+        List<String> scopes = 
StringPlus.normalize(sref.getProperty(EndpointEventListener.ENDPOINT_LISTENER_SCOPE));
+        return getFilterSet(scopes);
+    }
+
+    private static Set<Filter> getFilterSet(List<String> scopes) {
         Set<Filter> filters = new HashSet<Filter>();
-        List<String> scopes = 
StringPlus.normalize(sref.getProperty(EndpointListener.ENDPOINT_LISTENER_SCOPE));
         for (String scope : scopes) {
             try {
                 filters.add(FrameworkUtil.createFilter(scope));
@@ -65,37 +76,42 @@ public class EndpointListenerNotifier implements 
EndpointListener {
 
     public void add(EndpointListener ep, Set<Filter> filters) {
         LOG.debug("new EndpointListener detected");
-        listeners.put(ep, filters);
+        EndpointListenerAdapter adapter = new EndpointListenerAdapter(ep);
+        listeners.put(adapter, filters);
         for (EndpointDescription endpoint : endpointRepo.getAllEndpoints()) {
-            notifyListener(NotifyType.ADDED, ep, filters, endpoint);
+            EndpointEvent event = new EndpointEvent(EndpointEvent.ADDED, 
endpoint);
+            notifyListener(event, adapter, filters);
         }
     }
     
     public void remove(EndpointListener ep) {
         LOG.debug("EndpointListener modified");
-        listeners.remove(ep);
+        EndpointListenerAdapter adapter = new EndpointListenerAdapter(ep);
+        listeners.remove(adapter);
     }
     
-    @Override
-    public void endpointAdded(EndpointDescription endpoint, String 
matchedFilter) {
-        notifyListeners(NotifyType.ADDED, endpoint);
+    public void add(EndpointEventListener ep, Set<Filter> filters) {
+        LOG.debug("new EndpointListener detected");
+        listeners.put(ep, filters);
+        for (EndpointDescription endpoint : endpointRepo.getAllEndpoints()) {
+            EndpointEvent event = new EndpointEvent(EndpointEvent.ADDED, 
endpoint);
+            notifyListener(event, ep, filters);
+        }
     }
-
-    @Override
-    public void endpointRemoved(EndpointDescription endpoint, String 
matchedFilter) {
-        LOG.info("endpoint " + endpoint);
-        notifyListeners(NotifyType.REMOVED, endpoint);
+    
+    public void remove(EndpointEventListener ep) {
+        LOG.debug("EndpointListener modified");
+        listeners.remove(ep);
     }
-
+    
     /**
-     * Notifies all endpoint listeners about endpoints being added or removed.
-     *
-     * @param added specifies whether endpoints were added (true) or removed 
(false)
-     * @param endpoints the endpoints the listeners should be notified about
+     * NOTICE: filter will be ignored
      */
-    private void notifyListeners(NotifyType type, EndpointDescription 
endpoint) {
-        for (EndpointListener listener : listeners.keySet()) {
-            notifyListener(type, listener, listeners.get(listener), endpoint);
+    @Override
+    public void endpointChanged(EndpointEvent event, String filter) {
+        for (EndpointEventListener listener : listeners.keySet()) {
+            Set<Filter> filters = listeners.get(listener);
+            notifyListener(event, listener, filters);
         }
     }
 
@@ -106,21 +122,10 @@ public class EndpointListenerNotifier implements 
EndpointListener {
      * @param endpointListenerRef the ServiceReference of an EndpointListener 
to notify
      * @param endpoints the endpoints the listener should be notified about
      */
-    private void notifyListener(NotifyType type, EndpointListener listener, 
Set<Filter> filters, 
-                        EndpointDescription endpoint) {
-        if (endpoint == null) {
-            throw new NullPointerException("Endpoint should not be null");
-            //LOG.warn("Endpoint should not be null");
-            //return;
-        }
-        LOG.debug("Endpoint {}", type);
-        Set<Filter> matchingFilters = getMatchingFilters(filters, endpoint);
+    private void notifyListener(EndpointEvent event, EndpointEventListener 
listener, Set<Filter> filters) {
+        Set<Filter> matchingFilters = getMatchingFilters(filters, 
event.getEndpoint());
         for (Filter filter : matchingFilters) {
-            if (type == NotifyType.ADDED) {
-                listener.endpointAdded(endpoint, filter.toString());
-            } else {
-                listener.endpointRemoved(endpoint, filter.toString());
-            }
+            listener.endpointChanged(event, filter.toString());
         }
     }
     
@@ -140,5 +145,4 @@ public class EndpointListenerNotifier implements 
EndpointListener {
         }
         return matchingFilters;
     }
-
 }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepository.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepository.java
 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepository.java
index 5bebe4e..b02cbba 100644
--- 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepository.java
+++ 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepository.java
@@ -29,7 +29,8 @@ import java.util.Set;
 import org.osgi.framework.Bundle;
 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;
 import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,9 +48,9 @@ public class EndpointRepository {
     private final Map<ServiceReference, Map<RemoteServiceAdmin, 
Collection<EndpointDescription>>> exportedServices
         = new LinkedHashMap<ServiceReference, Map<RemoteServiceAdmin, 
Collection<EndpointDescription>>>();
 
-    private EndpointListener notifier;
+    private EndpointEventListener notifier;
     
-    public void setNotifier(EndpointListener notifier) {
+    public void setNotifier(EndpointEventListener notifier) {
         this.notifier = notifier;
     }
     
@@ -132,13 +133,15 @@ public class EndpointRepository {
 
     private void endpointsAdded(List<EndpointDescription> endpoints) {
         for (EndpointDescription epd : endpoints) {
-            notifier.endpointAdded(epd, null);
+            EndpointEvent event = new EndpointEvent(EndpointEvent.ADDED, epd);
+            notifier.endpointChanged(event, null);
         }
     }
     
     private void endpointsRemoved(List<EndpointDescription> endpoints) {
         for (EndpointDescription epd : endpoints) {
-            notifier.endpointRemoved(epd, null);
+            EndpointEvent event = new EndpointEvent(EndpointEvent.REMOVED, 
epd);
+            notifier.endpointChanged(event, null);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java
 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java
index 5129223..44746c8 100644
--- 
a/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java
+++ 
b/topology-manager/src/main/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImport.java
@@ -79,6 +79,10 @@ public class TopologyManagerImport implements 
EndpointEventListener, RemoteServi
     public void stop() {
         stopped = true;
         execService.shutdown();
+        try {
+            execService.awaitTermination(10, TimeUnit.SECONDS);
+        } catch (InterruptedException e) {
+        }
         closeAllImports();
     }
 
@@ -92,7 +96,7 @@ public class TopologyManagerImport implements 
EndpointEventListener, RemoteServi
     public void add(RemoteServiceAdmin rsa) {
         rsaSet.add(rsa);
         for (String filter : importPossibilities.keySet()) {
-            triggerSyncImports(filter);
+            triggerSyncronizeImports(filter);
         }
     }
     
@@ -107,18 +111,18 @@ public class TopologyManagerImport implements 
EndpointEventListener, RemoteServi
         }
     }
 
-    private void triggerSyncImports(final String filter) {
+    private void triggerSyncronizeImports(final String filter) {
         LOG.debug("Import of a service for filter {} was queued", filter);
         if (!rsaSet.isEmpty()) {
             execService.execute(new Runnable() {
                 public void run() {
-                    syncImports(filter);
+                    syncronizeImports(filter);
                 }
             });
         }
     }
     
-    private void syncImports(final String filter) {
+    private void syncronizeImports(final String filter) {
         try {
             unImportForGoneEndpoints(filter);
             importServices(filter);
@@ -226,7 +230,7 @@ public class TopologyManagerImport implements 
EndpointEventListener, RemoteServi
                 importPossibilities.remove(filter, endpoint);
                 break;
         }
-        triggerSyncImports(filter);
+        triggerSyncronizeImports(filter);
     }
     
 }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifierTest.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifierTest.java
 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifierTest.java
index 6d7959a..ccbeecf 100644
--- 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifierTest.java
+++ 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointListenerNotifierTest.java
@@ -39,11 +39,12 @@ import org.osgi.framework.FrameworkUtil;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.framework.ServiceReference;
 import org.osgi.service.remoteserviceadmin.EndpointDescription;
+import org.osgi.service.remoteserviceadmin.EndpointEvent;
 import org.osgi.service.remoteserviceadmin.EndpointListener;
 import org.osgi.service.remoteserviceadmin.RemoteConstants;
 
 @SuppressWarnings({
-    "rawtypes", "unchecked"
+    "rawtypes", "unchecked", "deprecation"
    })
 public class EndpointListenerNotifierTest {
 
@@ -56,16 +57,16 @@ public class EndpointListenerNotifierTest {
         EndpointListener epl = listenerExpects(endpoint1, 
"(objectClass=myClass)");
 
         EndpointRepository exportRepository = new EndpointRepository();
-        EndpointListenerNotifier tm = new 
EndpointListenerNotifier(exportRepository);
+        EndpointListenerNotifier notifier = new 
EndpointListenerNotifier(exportRepository);
 
         EasyMock.replay(epl);
         Set<Filter> filters = new HashSet<Filter>();
         filters.add(FrameworkUtil.createFilter("(objectClass=myClass)"));
-        tm.add(epl, filters);
-        tm.endpointAdded(endpoint1, null);
-        tm.endpointAdded(endpoint2, null);
-        tm.endpointRemoved(endpoint1, null);
-        tm.endpointRemoved(endpoint2, null);
+        notifier.add(epl, filters);
+        notifier.endpointChanged(new EndpointEvent(EndpointEvent.ADDED, 
endpoint1), null);
+        notifier.endpointChanged(new EndpointEvent(EndpointEvent.ADDED, 
endpoint2), null);
+        notifier.endpointChanged(new EndpointEvent(EndpointEvent.REMOVED, 
endpoint1), null);
+        notifier.endpointChanged(new EndpointEvent(EndpointEvent.REMOVED, 
endpoint2), null);
         EasyMock.verify(epl);
     }
 
@@ -95,8 +96,8 @@ public class EndpointListenerNotifierTest {
         Set<Filter> filters = new HashSet<Filter>();
         filters.add(FrameworkUtil.createFilter("(objectClass=myClass)"));
         tm.add(epl, filters);
-        tm.endpointAdded(endpoint1, null);
-        tm.endpointRemoved(endpoint1, null);
+        tm.endpointChanged(new EndpointEvent(EndpointEvent.ADDED, endpoint1), 
null);
+        tm.endpointChanged(new EndpointEvent(EndpointEvent.REMOVED, 
endpoint1), null);
         tm.remove(epl);
         EasyMock.verify(epl);
     }
@@ -112,7 +113,7 @@ public class EndpointListenerNotifierTest {
     @Test
     public void testNormalizeScopeForSingleString() {
         ServiceReference sr = createListenerServiceWithFilter("(myProp=A)");
-        Set<Filter> res = 
EndpointListenerNotifier.getFiltersFromEndpointListenerScope(sr);
+        Set<Filter> res = EndpointListenerNotifier.filtersFromEL(sr);
         assertEquals(1, res.size());
         Filter filter = res.iterator().next();
         filterMatches(filter);
@@ -122,7 +123,7 @@ public class EndpointListenerNotifierTest {
     public void testNormalizeScopeForStringArray() {
         String[] filters = {"(myProp=A)", "(otherProp=B)"};
         ServiceReference sr = createListenerServiceWithFilter(filters); 
-        Set<Filter> res = 
EndpointListenerNotifier.getFiltersFromEndpointListenerScope(sr);
+        Set<Filter> res = EndpointListenerNotifier.filtersFromEL(sr);
         assertEquals(filters.length, res.size());
         Iterator<Filter> it = res.iterator();
         Filter filter1 = it.next();
@@ -136,7 +137,7 @@ public class EndpointListenerNotifierTest {
     public void testNormalizeScopeForCollection() {
         Collection<String> collection = Arrays.asList("(myProp=A)", 
"(otherProp=B)");
         ServiceReference sr = createListenerServiceWithFilter(collection);
-        Set<Filter> res = 
EndpointListenerNotifier.getFiltersFromEndpointListenerScope(sr);
+        Set<Filter> res = EndpointListenerNotifier.filtersFromEL(sr);
         Iterator<Filter> it = res.iterator();
         Filter filter1 = it.next();
         Filter filter2 = it.next();

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepositoryTest.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepositoryTest.java
 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepositoryTest.java
index 59f1859..1b4941c 100644
--- 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepositoryTest.java
+++ 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/EndpointRepositoryTest.java
@@ -20,7 +20,6 @@ package org.apache.aries.rsa.topologymanager.exporter;
 
 import java.util.Arrays;
 import java.util.Hashtable;
-import java.util.List;
 import java.util.Map;
 
 import org.easymock.EasyMock;
@@ -30,7 +29,7 @@ import org.osgi.framework.Bundle;
 import org.osgi.framework.InvalidSyntaxException;
 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.RemoteConstants;
 import org.osgi.service.remoteserviceadmin.RemoteServiceAdmin;
 
@@ -43,27 +42,18 @@ public class EndpointRepositoryTest {
         IMocksControl c = EasyMock.createControl();
         ServiceReference<?> sref = createService(c);
         RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class);
-        EndpointListener notifier = c.createMock(EndpointListener.class);
-        
-        notifier.endpointAdded(ep1, null);
-        EasyMock.expectLastCall();
+        RecordingEndpointEventListener notifier = new 
RecordingEndpointEventListener();
         
         c.replay();
         EndpointRepository repo = new EndpointRepository();
         repo.setNotifier(notifier);
-        List<EndpointDescription> endpoints = Arrays.asList(ep1);
-        repo.addEndpoints(sref, rsa, endpoints);
-        c.verify();
-
-        c.reset();
-        notifier.endpointRemoved(ep1, null);
-        EasyMock.expectLastCall();
-
-        c.replay();
+        repo.addEndpoints(sref, rsa, Arrays.asList(ep1));
         repo.removeRemoteServiceAdmin(rsa);
         c.verify();
-    }
 
+        notifier.matches(new EndpointEvent(EndpointEvent.ADDED, ep1), new 
EndpointEvent(EndpointEvent.REMOVED, ep1));
+    }
+    
     private ServiceReference<?> createService(IMocksControl c) {
         ServiceReference<?> sref = c.createMock(ServiceReference.class);
         Bundle bundle = c.createMock(Bundle.class);
@@ -79,4 +69,6 @@ public class EndpointRepositoryTest {
         props.put(RemoteConstants.SERVICE_IMPORTED_CONFIGS, "any");
         return new EndpointDescription(props);
     }
+    
+    
 }

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/RecordingEndpointEventListener.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/RecordingEndpointEventListener.java
 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/RecordingEndpointEventListener.java
new file mode 100644
index 0000000..f17cbd0
--- /dev/null
+++ 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/RecordingEndpointEventListener.java
@@ -0,0 +1,48 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.aries.rsa.topologymanager.exporter;
+
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.samePropertyValuesAs;
+import static org.junit.Assert.assertThat;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.osgi.service.remoteserviceadmin.EndpointEvent;
+import org.osgi.service.remoteserviceadmin.EndpointEventListener;
+
+class RecordingEndpointEventListener implements EndpointEventListener {
+    List<EndpointEvent> events = new ArrayList<>();
+
+    @Override
+    public void endpointChanged(EndpointEvent event, String filter) {
+        events.add(event);
+    }
+    
+    public void matches(EndpointEvent ... endpointEvents) {
+        assertThat("Incorrect number of events received", events.size(), 
equalTo(endpointEvents.length));
+        Iterator<EndpointEvent> it = events.iterator();
+        for (EndpointEvent event : endpointEvents) {
+            assertThat(it.next(), samePropertyValuesAs(event));
+        }
+    }
+     
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExportTest.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExportTest.java
 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExportTest.java
index 2307566..af070d6 100644
--- 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExportTest.java
+++ 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/exporter/TopologyManagerExportTest.java
@@ -18,8 +18,6 @@
  */
 package org.apache.aries.rsa.topologymanager.exporter;
 
-import static org.easymock.EasyMock.expectLastCall;
-
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
@@ -30,13 +28,14 @@ import java.util.concurrent.Executor;
 import org.apache.aries.rsa.spi.ExportPolicy;
 import org.easymock.EasyMock;
 import org.easymock.IMocksControl;
+import org.junit.Before;
 import org.junit.Test;
 import org.osgi.framework.Bundle;
 import org.osgi.framework.Constants;
 import org.osgi.framework.ServiceEvent;
 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.ExportReference;
 import org.osgi.service.remoteserviceadmin.ExportRegistration;
 import org.osgi.service.remoteserviceadmin.RemoteConstants;
@@ -44,6 +43,26 @@ import 
org.osgi.service.remoteserviceadmin.RemoteServiceAdmin;
 
 @SuppressWarnings({"rawtypes", "unchecked"})
 public class TopologyManagerExportTest {
+    
+    private IMocksControl c;
+    private RemoteServiceAdmin rsa;
+    private RecordingEndpointEventListener notifier;
+    private EndpointDescription epd;
+    private EndpointRepository endpointRepo;
+    private TopologyManagerExport exportManager;
+
+    @Before
+    public void start() {
+        c = EasyMock.createControl();
+        rsa = c.createMock(RemoteServiceAdmin.class);
+        notifier = new RecordingEndpointEventListener();
+        epd = createEndpoint();
+        endpointRepo = new EndpointRepository();
+        endpointRepo.setNotifier(notifier);
+        Executor executor = syncExecutor();
+        ExportPolicy policy = new DefaultExportPolicy();
+        exportManager = new TopologyManagerExport(endpointRepo, executor, 
policy);
+    }
 
     /**
      * This tests if the topology manager handles a service marked to be 
exported correctly by exporting it to
@@ -53,52 +72,31 @@ public class TopologyManagerExportTest {
      */
     @Test
     public void testServiceExportUnexport() throws Exception {
-        IMocksControl c = EasyMock.createControl();
-        RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class);
-        final EndpointListener notifier = c.createMock(EndpointListener.class);
-        final ServiceReference sref = createUserService(c);
-        EndpointDescription epd = createEndpoint();
-        expectServiceExported(c, rsa, notifier, sref, epd);
+        ServiceReference sref = createUserService(c);
+        expectServiceExported(sref, epd);
 
         c.replay();
-        EndpointRepository endpointRepo = new EndpointRepository();
-        endpointRepo.setNotifier(notifier);
-        Executor executor = syncExecutor();
-        ExportPolicy policy = new DefaultExportPolicy();
-        TopologyManagerExport exportManager = new 
TopologyManagerExport(endpointRepo, executor, policy);
         exportManager.add(rsa);
         exportManager.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, 
sref));
-        c.verify();
-
-        c.reset();
-        notifier.endpointRemoved(epd, null);
-        expectLastCall().once();
-        c.replay();
         exportManager.serviceChanged(new 
ServiceEvent(ServiceEvent.UNREGISTERING, sref));
-        c.verify();
-
-        c.reset();
-        c.replay();
         exportManager.serviceChanged(new ServiceEvent(ServiceEvent.MODIFIED, 
sref));
-        c.verify();
-
-        c.reset();
-        c.replay();
         exportManager.remove(rsa);
         c.verify();
+        notifier.matches(
+                new EndpointEvent(EndpointEvent.ADDED, epd),
+                new EndpointEvent(EndpointEvent.REMOVED, epd)
+                );
+
     }
 
     @Test
     public void testExportExisting() throws Exception {
-        IMocksControl c = EasyMock.createControl();
-        RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class);
-        final EndpointListenerNotifier mockEpListenerNotifier = 
c.createMock(EndpointListenerNotifier.class);
-        final ServiceReference sref = createUserService(c);
-        expectServiceExported(c, rsa, mockEpListenerNotifier, sref, 
createEndpoint());
+        ServiceReference sref = createUserService(c);
+        expectServiceExported(sref, epd);
+        
         c.replay();
-
         EndpointRepository endpointRepo = new EndpointRepository();
-        endpointRepo.setNotifier(mockEpListenerNotifier);
+        endpointRepo.setNotifier(notifier);
         ExportPolicy policy = new DefaultExportPolicy();
         TopologyManagerExport exportManager = new 
TopologyManagerExport(endpointRepo, syncExecutor(), policy);
         exportManager.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, 
sref));
@@ -108,18 +106,11 @@ public class TopologyManagerExportTest {
 
     @Test
     public void testExportExistingMultipleInterfaces() throws Exception {
-        IMocksControl c = EasyMock.createControl();
-        RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class);
-        final EndpointListenerNotifier mockEpListenerNotifier = 
c.createMock(EndpointListenerNotifier.class);
         List<String> exportedInterfaces = Arrays.asList("a.b.C","foo.Bar");
         final ServiceReference sref = createUserService(c, exportedInterfaces);
-        expectServiceExported(c, rsa, mockEpListenerNotifier, sref, 
createEndpoint());
-        c.replay();
+        expectServiceExported(sref, createEndpoint());
 
-        EndpointRepository endpointRepo = new EndpointRepository();
-        endpointRepo.setNotifier(mockEpListenerNotifier);
-        ExportPolicy policy = new DefaultExportPolicy();
-        TopologyManagerExport exportManager = new 
TopologyManagerExport(endpointRepo, syncExecutor(), policy);
+        c.replay();
         exportManager.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, 
sref));
         exportManager.add(rsa);
         c.verify();
@@ -127,15 +118,10 @@ public class TopologyManagerExportTest {
 
     @Test
     public void testExportExistingNoExportedInterfaces() throws Exception {
-        IMocksControl c = EasyMock.createControl();
-        RemoteServiceAdmin rsa = c.createMock(RemoteServiceAdmin.class);
-        final EndpointListenerNotifier mockEpListenerNotifier = 
c.createMock(EndpointListenerNotifier.class);
         String exportedInterfaces = "";
         final ServiceReference sref = createUserService(c, exportedInterfaces);
         c.replay();
 
-        EndpointRepository endpointRepo = new EndpointRepository();
-        endpointRepo.setNotifier(mockEpListenerNotifier);
         ExportPolicy policy = new DefaultExportPolicy();
         TopologyManagerExport exportManager = new 
TopologyManagerExport(endpointRepo, syncExecutor(), policy);
         exportManager.serviceChanged(new ServiceEvent(ServiceEvent.REGISTERED, 
sref));
@@ -143,14 +129,12 @@ public class TopologyManagerExportTest {
         c.verify();
     }
 
-    private void expectServiceExported(IMocksControl c, RemoteServiceAdmin rsa,
-                                       final EndpointListener listener,
-                                       final ServiceReference sref, 
EndpointDescription epd) {
+    private void expectServiceExported(
+            final ServiceReference sref,
+            EndpointDescription epd) {
         ExportRegistration exportRegistration = createExportRegistration(c, 
epd);
         EasyMock.expect(rsa.exportService(EasyMock.same(sref), (Map<String, 
Object>)EasyMock.anyObject()))
             .andReturn(Collections.singletonList(exportRegistration)).once();
-        listener.endpointAdded(epd, null);
-        EasyMock.expectLastCall().once();
     }
 
     private Executor syncExecutor() {

http://git-wip-us.apache.org/repos/asf/aries-rsa/blob/3f77941e/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImportTest.java
----------------------------------------------------------------------
diff --git 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImportTest.java
 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImportTest.java
index b5b8759..e93be3b 100644
--- 
a/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImportTest.java
+++ 
b/topology-manager/src/test/java/org/apache/aries/rsa/topologymanager/importer/TopologyManagerImportTest.java
@@ -54,6 +54,7 @@ public class TopologyManagerImportTest {
                 return ir;
             }
         }).once();
+        
         ir.close();
         EasyMock.expectLastCall();
         c.replay();

Reply via email to