Return-Path: X-Original-To: apmail-cxf-commits-archive@www.apache.org Delivered-To: apmail-cxf-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 41D8310E12 for ; Tue, 18 Mar 2014 14:05:18 +0000 (UTC) Received: (qmail 36668 invoked by uid 500); 18 Mar 2014 14:05:13 -0000 Delivered-To: apmail-cxf-commits-archive@cxf.apache.org Received: (qmail 36514 invoked by uid 500); 18 Mar 2014 14:05:11 -0000 Mailing-List: contact commits-help@cxf.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cxf.apache.org Delivered-To: mailing list commits@cxf.apache.org Received: (qmail 36488 invoked by uid 99); 18 Mar 2014 14:05:07 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 18 Mar 2014 14:05:07 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id 3F2DF947328; Tue, 18 Mar 2014 14:05:06 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: amichai@apache.org To: commits@cxf.apache.org Date: Tue, 18 Mar 2014 14:05:06 -0000 Message-Id: <6062913ac39149ffa8e0f8862eb5a4b9@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [1/2] git commit: Enhanced SimpleServiceTracker with modified handler and access to service references Repository: cxf-dosgi Updated Branches: refs/heads/master 7b8225d57 -> 4c86a73f5 Enhanced SimpleServiceTracker with modified handler and access to service references Project: http://git-wip-us.apache.org/repos/asf/cxf-dosgi/repo Commit: http://git-wip-us.apache.org/repos/asf/cxf-dosgi/commit/231f2eea Tree: http://git-wip-us.apache.org/repos/asf/cxf-dosgi/tree/231f2eea Diff: http://git-wip-us.apache.org/repos/asf/cxf-dosgi/diff/231f2eea Branch: refs/heads/master Commit: 231f2eeaf477eb8eca861532420d6113c069ad3a Parents: 7b8225d Author: Amichai Rothman Authored: Tue Mar 18 14:58:38 2014 +0200 Committer: Amichai Rothman Committed: Tue Mar 18 15:01:55 2014 +0200 ---------------------------------------------------------------------- .../exporter/TopologyManagerExport.java | 7 ++- .../importer/TopologyManagerImport.java | 8 ++- .../util/SimpleServiceTracker.java | 52 ++++++++++++++++---- .../util/SimpleServiceTrackerListener.java | 16 +++++- .../util/SimpleServiceTrackerTest.java | 12 +++-- 5 files changed, 75 insertions(+), 20 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/231f2eea/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java index 767376e..4199d51 100644 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java +++ b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/exporter/TopologyManagerExport.java @@ -81,7 +81,7 @@ public class TopologyManagerExport { // track RemoteServiceAdmins through which we can export services remoteServiceAdminTracker.addListener(new SimpleServiceTrackerListener() { - public void added(RemoteServiceAdmin rsa) { + public void added(ServiceReference reference, RemoteServiceAdmin rsa) { LOG.debug("RemoteServiceAdmin added: {}, total {}", rsa, remoteServiceAdminTracker.getAllServices().size()); for (ServiceReference serviceRef : endpointRepo.getServicesToBeExportedFor(rsa)) { @@ -89,7 +89,10 @@ public class TopologyManagerExport { } } - public void removed(RemoteServiceAdmin rsa) { + public void modified(ServiceReference reference, RemoteServiceAdmin rsa) { + } + + public void removed(ServiceReference reference, RemoteServiceAdmin rsa) { LOG.debug("RemoteServiceAdmin removed: {}, total {}", rsa, remoteServiceAdminTracker.getAllServices().size()); List endpoints = endpointRepo.removeRemoteServiceAdmin(rsa); http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/231f2eea/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java index 47f7840..0ab7ab6 100644 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java +++ b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/importer/TopologyManagerImport.java @@ -34,6 +34,7 @@ import org.apache.cxf.dosgi.topologymanager.util.ReferenceCounter; import org.apache.cxf.dosgi.topologymanager.util.SimpleServiceTracker; import org.apache.cxf.dosgi.topologymanager.util.SimpleServiceTrackerListener; import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; import org.osgi.framework.hooks.service.ListenerHook; import org.osgi.service.remoteserviceadmin.EndpointDescription; import org.osgi.service.remoteserviceadmin.EndpointListener; @@ -94,11 +95,14 @@ public class TopologyManagerImport implements EndpointListener, RemoteServiceAdm remoteServiceAdminTracker = rsaTracker; remoteServiceAdminTracker.addListener(new SimpleServiceTrackerListener() { - public void added(RemoteServiceAdmin rsa) { + public void added(ServiceReference reference, RemoteServiceAdmin rsa) { triggerImportsForRemoteServiceAdmin(rsa); } - public void removed(RemoteServiceAdmin rsa) { + public void modified(ServiceReference reference, RemoteServiceAdmin rsa) { + } + + public void removed(ServiceReference reference, RemoteServiceAdmin rsa) { // the RSA's imports will be closed by its shutdown, so nothing to do here } }); http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/231f2eea/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTracker.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTracker.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTracker.java index a5339f8..29238aa 100644 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTracker.java +++ b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTracker.java @@ -25,6 +25,7 @@ import java.util.concurrent.ConcurrentMap; import java.util.concurrent.CopyOnWriteArrayList; import org.osgi.framework.BundleContext; +import org.osgi.framework.Filter; import org.osgi.framework.ServiceReference; import org.osgi.util.tracker.ServiceTracker; @@ -50,22 +51,34 @@ import org.osgi.util.tracker.ServiceTracker; public class SimpleServiceTracker extends ServiceTracker { // we must use a map with references as keys, so as not to invoke equals remotely on service objects - private ConcurrentMap, T> services; - private List> listeners; + private final ConcurrentMap, T> services = new ConcurrentHashMap, T>(); + private final List> listeners = + new CopyOnWriteArrayList>(); /** - * Create a SimpleServiceTracker on the specified class' name. + * Create a {@code SimpleServiceTracker} on the specified class name. *

- * Services registered under the specified class' name will be tracked by - * this SimpleServiceTracker. + * Services registered under the specified class name will be tracked by + * this {@code SimpleServiceTracker}. * * @param context the {@code BundleContext} against which the tracking is done * @param clazz the class of the services to be tracked */ public SimpleServiceTracker(BundleContext context, Class clazz) { super(context, clazz.getName(), null); - this.listeners = new CopyOnWriteArrayList>(); - this.services = new ConcurrentHashMap, T>(); + } + + /** + * Create a {@code SimpleServiceTracker} on the specified {@code Filter} object. + *

+ * Services which match the specified {@code Filter} object will be tracked by + * this {@code SimpleServiceTracker}. + * + * @param context the {@code BundleContext} against which the tracking is done + * @param filter The {@code Filter} to select the services to be tracked + */ + public SimpleServiceTracker(BundleContext context, Filter filter) { + super(context, filter, null); } /** @@ -82,16 +95,24 @@ public class SimpleServiceTracker extends ServiceTracker { T service = (T) super.addingService(reference); services.put(reference, service); for (SimpleServiceTrackerListener listener : listeners) { - listener.added(service); + listener.added(reference, service); } return service; } @Override + public void modifiedService(ServiceReference reference, T service) { + for (SimpleServiceTrackerListener listener : listeners) { + listener.modified(reference, service); + } + super.modifiedService(reference, service); + } + + @Override public void removedService(ServiceReference reference, T service) { services.remove(reference, service); for (SimpleServiceTrackerListener listener : listeners) { - listener.removed(service); + listener.removed(reference, service); } super.removedService(reference, service); } @@ -114,4 +135,17 @@ public class SimpleServiceTracker extends ServiceTracker { public List getAllServices() { return new ArrayList(services.values()); } + + /** + * Returns all currently tracked service references. + *

+ * Unlike {@link ServiceTracker#getServiceReferences()}, if it is called from within a service + * {@link SimpleServiceTrackerListener#added added} event handler, the returned list + * will include the newly added service reference. + * + * @return all currently tracked service references + */ + public List> getAllServiceReferences() { + return new ArrayList>(services.keySet()); + } } http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/231f2eea/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerListener.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerListener.java b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerListener.java index 22375c4..ef67b61 100644 --- a/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerListener.java +++ b/dsw/cxf-topology-manager/src/main/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerListener.java @@ -18,6 +18,8 @@ */ package org.apache.cxf.dosgi.topologymanager.util; +import org.osgi.framework.ServiceReference; + /** * Callback interface for notifications of services that are * added to or removed from tracking by a {@link SimpleServiceTracker}. @@ -29,14 +31,24 @@ public interface SimpleServiceTrackerListener { /** * Called when a new service is added to the tracked services. * + * @param reference the newly added service reference * @param service the newly added service */ - void added(T service); + void added(ServiceReference reference, T service); + + /** + * Called when a tracked service is modified. + * + * @param reference the modified service reference + * @param service the modified service + */ + void modified(ServiceReference reference, T service); /** * Called when a service is removed from the tracked services. * + * @param reference the removed service reference * @param service the removed service */ - void removed(T service); + void removed(ServiceReference reference, T service); } http://git-wip-us.apache.org/repos/asf/cxf-dosgi/blob/231f2eea/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerTest.java ---------------------------------------------------------------------- diff --git a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerTest.java b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerTest.java index f73cdf0..0785e28 100644 --- a/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerTest.java +++ b/dsw/cxf-topology-manager/src/test/java/org/apache/cxf/dosgi/topologymanager/util/SimpleServiceTrackerTest.java @@ -108,11 +108,9 @@ public class SimpleServiceTrackerTest { // add our listener SimpleServiceTrackerListener listener = new SimpleServiceTrackerListener() { - @SuppressWarnings({ - "unchecked", "rawtypes" - }) + @SuppressWarnings({ "unchecked", "rawtypes" }) @Override - public void added(RemoteServiceAdmin service) { + public void added(ServiceReference reference, RemoteServiceAdmin service) { // prove that original ServiceTracker fails here Object[] trackerServices = (Object[]) (tracker.getServices() != null ? tracker.getServices() : new Object[0]); @@ -123,7 +121,11 @@ public class SimpleServiceTrackerTest { } @Override - public void removed(RemoteServiceAdmin service) { + public void modified(ServiceReference reference, RemoteServiceAdmin service) { + } + + @Override + public void removed(ServiceReference reference, RemoteServiceAdmin service) { assertEqualsUnordered(services, tracker.getAllServices()); } };