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);
         }
     }