You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@aries.apache.org by no...@apache.org on 2011/07/26 22:35:43 UTC
svn commit: r1151229 -
/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/SingleServiceTracker.java
Author: not
Date: Tue Jul 26 20:35:42 2011
New Revision: 1151229
URL: http://svn.apache.org/viewvc?rev=1151229&view=rev
Log:
ARIES-713 Add the ability to set a filter to a single service tracker.
Modified:
aries/trunk/util/src/main/java/org/apache/aries/util/tracker/SingleServiceTracker.java
Modified: aries/trunk/util/src/main/java/org/apache/aries/util/tracker/SingleServiceTracker.java
URL: http://svn.apache.org/viewvc/aries/trunk/util/src/main/java/org/apache/aries/util/tracker/SingleServiceTracker.java?rev=1151229&r1=1151228&r2=1151229&view=diff
==============================================================================
--- aries/trunk/util/src/main/java/org/apache/aries/util/tracker/SingleServiceTracker.java (original)
+++ aries/trunk/util/src/main/java/org/apache/aries/util/tracker/SingleServiceTracker.java Tue Jul 26 20:35:42 2011
@@ -23,6 +23,7 @@ import java.util.concurrent.atomic.Atomi
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceListener;
@@ -43,7 +44,9 @@ public final class SingleServiceTracker<
private final AtomicReference<ServiceReference> ref = new AtomicReference<ServiceReference>();
private final AtomicBoolean open = new AtomicBoolean(false);
private final SingleServiceListener serviceListener;
-
+ private String filterString;
+ private Filter filter;
+
private final ServiceListener listener = new ServiceListener()
{
public void serviceChanged(ServiceEvent event)
@@ -68,6 +71,13 @@ public final class SingleServiceTracker<
serviceListener = sl;
}
+ public SingleServiceTracker(BundleContext context, Class<T> clazz, String filterString, SingleServiceListener sl) throws InvalidSyntaxException
+ {
+ this(context, clazz, sl);
+ this.filterString = filterString;
+ if (filterString != null) filter = context.createFilter(filterString);
+ }
+
public T getService()
{
return service.get();
@@ -82,7 +92,9 @@ public final class SingleServiceTracker<
{
if (open.compareAndSet(false, true)) {
try {
- ctx.addServiceListener(listener, '(' + Constants.OBJECTCLASS + '=' + className + ')');
+ String filterString = '(' + Constants.OBJECTCLASS + '=' + className + ')';
+ if (filter != null) filterString = "(&" + filterString + filter + ')';
+ ctx.addServiceListener(listener, filterString);
findMatchingReference(null);
} catch (InvalidSyntaxException e) {
// this can never happen. (famous last words :)
@@ -93,7 +105,7 @@ public final class SingleServiceTracker<
private void findMatchingReference(ServiceReference original) {
boolean clear = true;
ServiceReference ref = ctx.getServiceReference(className);
- if (ref != null) {
+ if (ref != null && (filter == null || filter.match(ref))) {
@SuppressWarnings("unchecked")
T service = (T) ctx.getService(ref);
if (service != null) {