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) {