You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by gn...@apache.org on 2017/03/30 07:29:55 UTC
[2/2] karaf git commit: [KARAF-4324] Shell commands and optional
@Reference
[KARAF-4324] Shell commands and optional @Reference
Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/37827b5f
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/37827b5f
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/37827b5f
Branch: refs/heads/master
Commit: 37827b5f51baf93f66c3e2896380ad9b8ef1228b
Parents: 8050bdc
Author: Guillaume Nodet <gn...@apache.org>
Authored: Thu Mar 30 09:29:34 2017 +0200
Committer: Guillaume Nodet <gn...@apache.org>
Committed: Thu Mar 30 09:29:34 2017 +0200
----------------------------------------------------------------------
.../action/osgi/AggregateServiceTracker.java | 51 +++++++++++---------
.../impl/action/osgi/CommandExtension.java | 18 +++----
2 files changed, 34 insertions(+), 35 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/karaf/blob/37827b5f/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/AggregateServiceTracker.java
----------------------------------------------------------------------
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 fe17e31..aaad93c 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
@@ -34,8 +34,9 @@ import org.osgi.framework.BundleContext;
public abstract class AggregateServiceTracker {
private final BundleContext bundleContext;
- private final ConcurrentMap<Class, SingleServiceTracker> singleTrackers = new ConcurrentHashMap<Class, SingleServiceTracker>();
- private final ConcurrentMap<Class, MultiServiceTracker> multiTrackers = new ConcurrentHashMap<Class, MultiServiceTracker>();
+ private final ConcurrentMap<Class, SingleServiceTracker> singleTrackers = new ConcurrentHashMap<>();
+ private final ConcurrentMap<Class, MultiServiceTracker> multiTrackers = new ConcurrentHashMap<>();
+ private final ConcurrentMap<Class, Boolean> optional = new ConcurrentHashMap<>();
private volatile State state = new State();
private volatile boolean opening = true;
@@ -43,27 +44,28 @@ public abstract class AggregateServiceTracker {
this.bundleContext = bundleContext;
}
- public <T> void track(final Class<T> service, final boolean multiple) {
- if (multiple) {
- if (multiTrackers.get(service) == null) {
- MultiServiceTracker<T> tracker = new MultiServiceTracker<T>(bundleContext, service) {
- @Override
- public void updateState(List<T> services) {
- updateStateMulti(service, services);
- }
- };
- multiTrackers.put(service, tracker);
- }
- } else {
- if (singleTrackers.get(service) == null) {
- SingleServiceTracker<T> tracker = new SingleServiceTracker<T>(bundleContext, service) {
- @Override
- public void updateState(T oldSvc, T newSvc) {
- updateStateSingle(service, newSvc);
- }
- };
- singleTrackers.putIfAbsent(service, tracker);
- }
+ public <T> void trackList(final Class<T> service) {
+ if (multiTrackers.get(service) == null) {
+ MultiServiceTracker<T> tracker = new MultiServiceTracker<T>(bundleContext, service) {
+ @Override
+ public void updateState(List<T> services) {
+ updateStateMulti(service, services);
+ }
+ };
+ multiTrackers.put(service, tracker);
+ }
+ }
+
+ public <T> void trackSingle(final Class<T> service, boolean optional) {
+ this.optional.merge(service, optional, Boolean::logicalAnd);
+ if (singleTrackers.get(service) == null) {
+ SingleServiceTracker<T> tracker = new SingleServiceTracker<T>(bundleContext, service) {
+ @Override
+ public void updateState(T oldSvc, T newSvc) {
+ updateStateSingle(service, newSvc);
+ }
+ };
+ singleTrackers.putIfAbsent(service, tracker);
}
}
@@ -131,7 +133,8 @@ public abstract class AggregateServiceTracker {
private final Map<Class, Object> single = new HashMap<Class, Object>();
public boolean isSatisfied() {
- return single.size() == singleTrackers.size();
+ return singleTrackers.keySet().stream()
+ .noneMatch(c -> !optional.get(c) && !single.containsKey(c));
}
public Map<Class, Object> getSingleServices() {
http://git-wip-us.apache.org/repos/asf/karaf/blob/37827b5f/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/CommandExtension.java
----------------------------------------------------------------------
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 0889384..33d17ca 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
@@ -159,12 +159,7 @@ public class CommandExtension implements Extension {
reg.register(entry.getValue());
}
for (final Map.Entry<Class, List> entry : state.getMultiServices().entrySet()) {
- reg.register(new Callable() {
- @Override
- public Object call() throws Exception {
- return entry.getValue();
- }
- }, entry.getKey());
+ reg.register((Callable) entry::getValue, entry.getKey());
}
for (Class clazz : classes) {
manager.register(clazz);
@@ -180,7 +175,8 @@ public class CommandExtension implements Extension {
// Create trackers
for (Class<?> cl = clazz; cl != Object.class; cl = cl.getSuperclass()) {
for (Field field : cl.getDeclaredFields()) {
- if (field.getAnnotation(Reference.class) != null) {
+ Reference ref = field.getAnnotation(Reference.class);
+ if (ref != null) {
GenericType type = new GenericType(field.getGenericType());
Class clazzRef = type.getRawClass() == List.class ? type.getActualTypeArgument(0).getRawClass() : type.getRawClass();
if (clazzRef != BundleContext.class
@@ -190,7 +186,7 @@ public class CommandExtension implements Extension {
&& clazzRef != Registry.class
&& clazzRef != SessionFactory.class
&& !registry.hasService(clazzRef)) {
- track(type);
+ track(type, ref.optional());
}
}
}
@@ -199,13 +195,13 @@ public class CommandExtension implements Extension {
}
@SuppressWarnings("unchecked")
- protected void track(final GenericType type) {
+ protected void track(final GenericType type, boolean optional) {
if (type.getRawClass() == List.class) {
final Class clazzRef = type.getActualTypeArgument(0).getRawClass();
- tracker.track(clazzRef, true);
+ tracker.trackList(clazzRef);
} else {
final Class clazzRef = type.getRawClass();
- tracker.track(clazzRef, false);
+ tracker.trackSingle(clazzRef, optional);
}
}