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();
