You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by jb...@apache.org on 2019/11/11 15:04:31 UTC

[karaf] branch karaf-4.2.x updated: [KARAF-6340] Add filter support in Karaf command @Reference annotation

This is an automated email from the ASF dual-hosted git repository.

jbonofre pushed a commit to branch karaf-4.2.x
in repository https://gitbox.apache.org/repos/asf/karaf.git


The following commit(s) were added to refs/heads/karaf-4.2.x by this push:
     new 8b6ebe2  [KARAF-6340] Add filter support in Karaf command @Reference annotation
8b6ebe2 is described below

commit 8b6ebe28f395d858989dd64260ec2a1024a1a86f
Author: Jean-Baptiste Onofré <jb...@nanthrax.net>
AuthorDate: Sat Nov 9 18:52:49 2019 +0100

    [KARAF-6340] Add filter support in Karaf command @Reference annotation
    
    (cherry picked from commit 0895873fb528e64f42688157b3ab0750e3abf216)
---
 .../org/apache/karaf/shell/api/action/lifecycle/Reference.java |  2 ++
 .../karaf/shell/impl/action/osgi/AggregateServiceTracker.java  |  8 ++++----
 .../apache/karaf/shell/impl/action/osgi/CommandExtension.java  | 10 +++++-----
 .../karaf/shell/impl/action/osgi/MultiServiceTracker.java      |  7 ++++++-
 .../karaf/shell/impl/action/osgi/SingleServiceTracker.java     |  7 ++++++-
 5 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/shell/core/src/main/java/org/apache/karaf/shell/api/action/lifecycle/Reference.java b/shell/core/src/main/java/org/apache/karaf/shell/api/action/lifecycle/Reference.java
index 5892fb3..c37a9b9 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/api/action/lifecycle/Reference.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/api/action/lifecycle/Reference.java
@@ -37,6 +37,8 @@ import java.lang.annotation.Target;
 @Target({ElementType.FIELD})
 public @interface Reference {
 
+    String filter() default "";
+
     boolean optional() default false;
 
 }
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/AggregateServiceTracker.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/AggregateServiceTracker.java
index 879ecb7..22bf9c3 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/AggregateServiceTracker.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/AggregateServiceTracker.java
@@ -44,9 +44,9 @@ public abstract class AggregateServiceTracker {
         this.bundleContext = bundleContext;
     }
 
-    public <T> void trackList(final Class<T> service) {
+    public <T> void trackList(final Class<T> service, String filter) {
         if (multiTrackers.get(service) == null) {
-            MultiServiceTracker<T> tracker = new MultiServiceTracker<T>(bundleContext, service) {
+            MultiServiceTracker<T> tracker = new MultiServiceTracker<T>(bundleContext, service, filter) {
                 @Override
                 public void updateState(List<T> services) {
                     updateStateMulti(service, services);
@@ -56,10 +56,10 @@ public abstract class AggregateServiceTracker {
         }
     }
 
-    public <T> void trackSingle(final Class<T> service, boolean optional) {
+    public <T> void trackSingle(final Class<T> service, boolean optional, String filter) {
         this.optional.merge(service, optional, Boolean::logicalAnd);
         if (singleTrackers.get(service) == null) {
-            SingleServiceTracker<T> tracker = new SingleServiceTracker<T>(bundleContext, service) {
+            SingleServiceTracker<T> tracker = new SingleServiceTracker<T>(bundleContext, service, filter) {
                 @Override
                 public void updateState(T oldSvc, T newSvc) {
                     updateStateSingle(service, newSvc);
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/CommandExtension.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/CommandExtension.java
index 7c8e77e..a424c26 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/CommandExtension.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/CommandExtension.java
@@ -105,7 +105,7 @@ public class CommandExtension implements Extension {
             }
             AggregateServiceTracker.State state = tracker.open();
             if (!state.isSatisfied()) {
-                LOGGER.info("Command registration delayed for bundle {}/{}. Missing dependencies: {}",
+                LOGGER.info("Command registration delayed for bundle {}/{}. Missing service: {}",
                         bundle.getSymbolicName(),
                         bundle.getVersion(),
                         state.getMissingServices());
@@ -189,7 +189,7 @@ public class CommandExtension implements Extension {
                             && clazzRef != Registry.class
                             && clazzRef != SessionFactory.class
                             && !registry.hasService(clazzRef)) {
-                        track(type, ref.optional());
+                        track(type, ref.optional(), ref.filter());
                     }
                 }
             }
@@ -198,13 +198,13 @@ public class CommandExtension implements Extension {
     }
 
     @SuppressWarnings("unchecked")
-    protected void track(final GenericType type, boolean optional) {
+    protected void track(final GenericType type, boolean optional, String filter) {
         if (type.getRawClass() == List.class) {
             final Class clazzRef = type.getActualTypeArgument(0).getRawClass();
-            tracker.trackList(clazzRef);
+            tracker.trackList(clazzRef, filter);
         } else {
             final Class clazzRef = type.getRawClass();
-            tracker.trackSingle(clazzRef, optional);
+            tracker.trackSingle(clazzRef, optional, filter);
         }
     }
 
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/MultiServiceTracker.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/MultiServiceTracker.java
index b0bcda0..99b740d 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/MultiServiceTracker.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/MultiServiceTracker.java
@@ -42,6 +42,7 @@ public abstract class MultiServiceTracker<T> {
 
     private final BundleContext ctx;
     private final Class<T> clazz;
+    private String filter;
     private final Map<ServiceReference<T>, T> refs = new HashMap<>();
     private final AtomicBoolean open = new AtomicBoolean(false);
 
@@ -56,9 +57,10 @@ public abstract class MultiServiceTracker<T> {
         }
     };
 
-    public MultiServiceTracker(BundleContext context, Class<T> clazz) {
+    public MultiServiceTracker(BundleContext context, Class<T> clazz, String filter) {
         ctx = context;
         this.clazz = clazz;
+        this.filter = filter;
     }
 
     protected abstract void updateState(List<T> services);
@@ -67,6 +69,9 @@ public abstract class MultiServiceTracker<T> {
         if (open.compareAndSet(false, true)) {
             try {
                 String filterString = '(' + Constants.OBJECTCLASS + '=' + clazz.getName() + ')';
+                if (filter != null && !filter.isEmpty()) {
+                    filterString = "(&" + filterString + filter + ')';
+                }
                 ctx.addServiceListener(listener, filterString);
                 Collection<ServiceReference<T>> refs = ctx.getServiceReferences(clazz, null);
                 if (refs != null) {
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/SingleServiceTracker.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/SingleServiceTracker.java
index a6b27f9..a8a2eeb 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/SingleServiceTracker.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/SingleServiceTracker.java
@@ -38,6 +38,7 @@ public abstract class SingleServiceTracker<T> {
 
     private final BundleContext ctx;
     private final Class<T> clazz;
+    private String filter;
     private final AtomicReference<T> service = new AtomicReference<>();
     private final AtomicReference<ServiceReference<T>> ref = new AtomicReference<>();
     private final AtomicBoolean open = new AtomicBoolean(false);
@@ -55,9 +56,10 @@ public abstract class SingleServiceTracker<T> {
         }
     };
 
-    public SingleServiceTracker(BundleContext context, Class<T> clazz) {
+    public SingleServiceTracker(BundleContext context, Class<T> clazz, String filter) {
         ctx = context;
         this.clazz = clazz;
+        this.filter = filter;
     }
 
     protected abstract void updateState(T oldSvc, T newSvc);
@@ -66,6 +68,9 @@ public abstract class SingleServiceTracker<T> {
         if (open.compareAndSet(false, true)) {
             try {
                 String filterString = '(' + Constants.OBJECTCLASS + '=' + clazz.getName() + ')';
+                if (filter != null && !filter.isEmpty()) {
+                    filterString = "(&" + filterString + filter + ')';
+                }
                 ctx.addServiceListener(listener, filterString);
                 findMatchingReference(null);
             } catch (InvalidSyntaxException e) {