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 2014/03/24 17:32:22 UTC

[24/24] git commit: [KARAF-2805] Add a Registry#hasCommand() method to speed-up integration tests

[KARAF-2805] Add a Registry#hasCommand() method to speed-up integration tests


Project: http://git-wip-us.apache.org/repos/asf/karaf/repo
Commit: http://git-wip-us.apache.org/repos/asf/karaf/commit/7b47629b
Tree: http://git-wip-us.apache.org/repos/asf/karaf/tree/7b47629b
Diff: http://git-wip-us.apache.org/repos/asf/karaf/diff/7b47629b

Branch: refs/heads/master
Commit: 7b47629bdef7fa265993b35fd60aa732895c0232
Parents: d80852d
Author: Guillaume Nodet <gn...@gmail.com>
Authored: Mon Mar 24 15:42:35 2014 +0100
Committer: Guillaume Nodet <gn...@gmail.com>
Committed: Mon Mar 24 17:30:14 2014 +0100

----------------------------------------------------------------------
 .../apache/karaf/itests/KarafTestSupport.java   | 20 ++++++++----
 .../karaf/shell/api/console/Registry.java       |  9 ++++++
 .../shell/impl/action/osgi/RegistryImpl.java    | 34 ++++++++++++++++++++
 .../karaf/shell/impl/console/RegistryImpl.java  | 34 ++++++++++++++++++++
 4 files changed, 90 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/karaf/blob/7b47629b/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java
----------------------------------------------------------------------
diff --git a/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java b/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java
index 9a59437..4669b1b 100644
--- a/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java
+++ b/itests/src/test/java/org/apache/karaf/itests/KarafTestSupport.java
@@ -96,6 +96,9 @@ public class KarafTestSupport {
     @Inject
     protected FeaturesService featureService;
 
+    @Inject
+    protected SessionFactory sessionFactory;
+
     /**
      * To make sure the tests run only when the boot features are fully installed
      */
@@ -279,14 +282,17 @@ public class KarafTestSupport {
             command = command.substring(0, spaceIdx);
         }
         int colonIndx = command.indexOf(':');
-
+        String scope = (colonIndx > 0) ? command.substring(0, colonIndx) : "*";
+        String name  = (colonIndx > 0) ? command.substring(colonIndx + 1) : command;
         try {
-            if (colonIndx > 0) {
-                String scope = command.substring(0, colonIndx);
-                String function = command.substring(colonIndx + 1);
-                waitForService("(&(osgi.command.scope=" + scope + ")(osgi.command.function=" + function + "))", SERVICE_TIMEOUT);
-            } else {
-                waitForService("(osgi.command.function=" + command + ")", SERVICE_TIMEOUT);
+            long start = System.currentTimeMillis();
+            long cur   = start;
+            while (cur - start < SERVICE_TIMEOUT) {
+                if (sessionFactory.getRegistry().hasCommand(scope, name)) {
+                    return;
+                }
+                Thread.sleep(100);
+                cur = System.currentTimeMillis();
             }
         } catch (Exception e) {
             throw new RuntimeException(e);

http://git-wip-us.apache.org/repos/asf/karaf/blob/7b47629b/shell/core/src/main/java/org/apache/karaf/shell/api/console/Registry.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/api/console/Registry.java b/shell/core/src/main/java/org/apache/karaf/shell/api/console/Registry.java
index b768d69..35c7c75 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/api/console/Registry.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/api/console/Registry.java
@@ -36,6 +36,15 @@ public interface Registry {
     List<Command> getCommands();
 
     /**
+     *
+     * @param scope
+     * @param name
+     * @return
+     * @throws InterruptedException
+     */
+    boolean hasCommand(String scope, String name);
+
+    /**
      * Register a delayed service (or factory).
      * In cases where instances must be created for each injection,
      * a {@link Callable} can be registered and each injection will

http://git-wip-us.apache.org/repos/asf/karaf/blob/7b47629b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/RegistryImpl.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/RegistryImpl.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/RegistryImpl.java
index 38f750a..e1cdd67 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/RegistryImpl.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/action/osgi/RegistryImpl.java
@@ -19,6 +19,7 @@
 package org.apache.karaf.shell.impl.action.osgi;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +32,7 @@ public class RegistryImpl implements Registry {
 
     private final Registry parent;
     private final Map<Object, Object> services = new LinkedHashMap<Object, Object>();
+    private final Map<String, List<Command>> commands = new HashMap<String, List<Command>>();
 
     public RegistryImpl(Registry parent) {
         this.parent = parent;
@@ -42,6 +44,17 @@ public class RegistryImpl implements Registry {
     }
 
     @Override
+    public boolean hasCommand(String scope, String name) {
+        if (parent != null && parent.hasCommand(scope, name)) {
+            return true;
+        }
+        synchronized (services) {
+            List<Command> cmds = commands.get(scope + ":" + name);
+            return cmds != null && !cmds.isEmpty();
+        }
+    }
+
+    @Override
     public <T> void register(Callable<T> factory, Class<T> clazz) {
         synchronized (services) {
             services.put(clazz, new Factory<T>(clazz, factory));
@@ -52,6 +65,16 @@ public class RegistryImpl implements Registry {
     public void register(Object service) {
         synchronized (services) {
             services.put(service, service);
+            if (service instanceof Command) {
+                Command cmd = (Command) service;
+                String key = cmd.getScope() + ":" + cmd.getName();
+                List<Command> cmds = commands.get(key);
+                if (cmds == null) {
+                    cmds = new ArrayList<Command>();
+                    commands.put(key, cmds);
+                }
+                cmds.add(cmd);
+            }
         }
     }
 
@@ -59,6 +82,17 @@ public class RegistryImpl implements Registry {
     public void unregister(Object service) {
         synchronized (services) {
             services.remove(service);
+            if (service instanceof Command) {
+                Command cmd = (Command) service;
+                String key = cmd.getScope() + ":" + cmd.getName();
+                List<Command> cmds = commands.get(key);
+                if (cmds != null) {
+                    cmds.remove(cmd);
+                    if (cmds.isEmpty()) {
+                        commands.remove(key);
+                    }
+                }
+            }
         }
     }
 

http://git-wip-us.apache.org/repos/asf/karaf/blob/7b47629b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/RegistryImpl.java
----------------------------------------------------------------------
diff --git a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/RegistryImpl.java b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/RegistryImpl.java
index b607c5e..99113b7 100644
--- a/shell/core/src/main/java/org/apache/karaf/shell/impl/console/RegistryImpl.java
+++ b/shell/core/src/main/java/org/apache/karaf/shell/impl/console/RegistryImpl.java
@@ -19,6 +19,7 @@
 package org.apache.karaf.shell.impl.console;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
@@ -31,6 +32,7 @@ public class RegistryImpl implements Registry {
 
     protected final Registry parent;
     protected final Map<Object, Object> services = new LinkedHashMap<Object, Object>();
+    private final Map<String, List<Command>> commands = new HashMap<String, List<Command>>();
 
     public RegistryImpl(Registry parent) {
         this.parent = parent;
@@ -42,6 +44,17 @@ public class RegistryImpl implements Registry {
     }
 
     @Override
+    public boolean hasCommand(String scope, String name) {
+        if (parent != null && parent.hasCommand(scope, name)) {
+            return true;
+        }
+        synchronized (services) {
+            List<Command> cmds = commands.get(scope + ":" + name);
+            return cmds != null && !cmds.isEmpty();
+        }
+    }
+
+    @Override
     public <T> void register(Callable<T> factory, Class<T> clazz) {
         synchronized (services) {
             services.put(factory, new Factory<T>(clazz, factory));
@@ -52,6 +65,16 @@ public class RegistryImpl implements Registry {
     public void register(Object service) {
         synchronized (services) {
             services.put(service, service);
+            if (service instanceof Command) {
+                Command cmd = (Command) service;
+                String key = cmd.getScope() + ":" + cmd.getName();
+                List<Command> cmds = commands.get(key);
+                if (cmds == null) {
+                    cmds = new ArrayList<Command>();
+                    commands.put(key, cmds);
+                }
+                cmds.add(cmd);
+            }
         }
     }
 
@@ -59,6 +82,17 @@ public class RegistryImpl implements Registry {
     public void unregister(Object service) {
         synchronized (services) {
             services.remove(service);
+            if (service instanceof Command) {
+                Command cmd = (Command) service;
+                String key = cmd.getScope() + ":" + cmd.getName();
+                List<Command> cmds = commands.get(key);
+                if (cmds != null) {
+                    cmds.remove(cmd);
+                    if (cmds.isEmpty()) {
+                        commands.remove(key);
+                    }
+                }
+            }
         }
     }