The code waits for input in parallel. So if the user types enter he can get a console at any time. I did not change the start level of console to allow for that early access.

Christian

Am 23.07.2012 16:14, schrieb Guillaume Nodet:
Won't that change forbid to start the console if any bundle is in error
somehow ?
So if a user installs a bundle which can not start, he can't debug anymore ?

On Mon, Jul 23, 2012 at 4:10 PM, <[email protected]> wrote:

Author: cschneider
Date: Mon Jul 23 14:10:45 2012
New Revision: 1364640

URL: http://svn.apache.org/viewvc?rev=1364640&view=rev
Log:
KARAF-1640 Start shell when all bundles are resolved or active

Added:

karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/BundleWatcher.java
Modified:

karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java

Added:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/BundleWatcher.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/BundleWatcher.java?rev=1364640&view=auto

==============================================================================
---
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/BundleWatcher.java
(added)
+++
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/BundleWatcher.java
Mon Jul 23 14:10:45 2012
@@ -0,0 +1,77 @@
+package org.apache.karaf.shell.console.impl.jline;
+
+import java.io.IOException;
+import java.io.PrintStream;
+
+import org.fusesource.jansi.Ansi;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+public class BundleWatcher implements Runnable {
+
+    private final BundleContext context;
+    private final Runnable consoleStartCallBack;
+    private final PrintStream out;
+
+    public BundleWatcher(BundleContext context, PrintStream out, Runnable
consoleStartCallBack) {
+        this.context = context;
+        this.out = out;
+        this.consoleStartCallBack = consoleStartCallBack;
+    }
+
+    @Override
+    public void run() {
+        boolean startConsole = false;
+        out.println("Apache Karaf starting up. Press Enter to start the
shell now ...");
+        out.println();
+        while (!startConsole) {
+            BundleStats stats = getBundleStats();
+            //out.print(Ansi.ansi().cursorUp(1).toString());
+            out.println(String.format("Bundles - total: %d, active: %d,
resolved: %d, installed: %d         ",
+                    stats.numTotal, stats.numActive, stats.numResolved,
stats.numInstalled));
+            try {
+                Thread.sleep(500);
+            } catch (InterruptedException e) {
+            }
+            try {
+                if (System.in.available() > 0) {
+                    char ch = (char) System.in.read();
+                    if (ch == '\r') {
+                        startConsole = true;
+                    }
+                }
+            } catch (IOException e) {
+            }
+            if (stats.numActive + stats.numResolved == stats.numTotal) {
+                startConsole = true;
+            }
+        }
+        consoleStartCallBack.run();
+    }
+
+    private BundleStats getBundleStats() {
+        Bundle[] bundles = context.getBundles();
+        BundleStats stats = new BundleStats();
+        stats.numTotal = bundles.length;
+        for (Bundle bundle : bundles) {
+            if (bundle.getState() == Bundle.ACTIVE) {
+                stats.numActive ++;
+            }
+            if (bundle.getState() == Bundle.RESOLVED) {
+                stats.numResolved ++;
+            }
+            if (bundle.getState() == Bundle.INSTALLED) {
+                stats.numInstalled ++;
+            }
+        }
+        return stats;
+    }
+
+    class BundleStats {
+        int numResolved = 0;
+        int numActive = 0;
+        int numInstalled = 0;
+        int numTotal = 0;
+    }
+
+}

Modified:
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
URL:
http://svn.apache.org/viewvc/karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java?rev=1364640&r1=1364639&r2=1364640&view=diff

==============================================================================
---
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
(original)
+++
karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline/LocalConsoleManager.java
Mon Jul 23 14:10:45 2012
@@ -33,6 +33,7 @@ import org.apache.karaf.shell.console.Co
  import org.apache.karaf.shell.console.ConsoleFactory;
  import org.apache.sshd.agent.SshAgent;
  import org.apache.sshd.agent.local.AgentImpl;
+import org.fusesource.jansi.Ansi;
  import org.osgi.framework.BundleContext;
  import org.osgi.framework.ServiceRegistration;
  import org.slf4j.Logger;
@@ -84,7 +85,14 @@ public class LocalConsoleManager {
          String agentId = startAgent("karaf");
          this.console = consoleFactory.createLocal(this.commandProcessor,
terminal, callback);
          this.console.getSession().put(SshAgent.SSH_AUTHSOCKET_ENV_NAME,
agentId);
-        consoleFactory.startConsoleAs(console, subject);
+        BundleWatcher watcher = new BundleWatcher(bundleContext,
System.out, new Runnable() {
+
+            @Override
+            public void run() {
+                consoleFactory.startConsoleAs(console, subject);
+            }
+        });
+        new Thread(watcher).start();
      }

      protected String startAgent(String user) {






--
Christian Schneider
http://www.liquid-reality.de

Open Source Architect
Talend Application Integration Division http://www.talend.com

Reply via email to