karaf-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Christian Schneider <ch...@die-schneider.net>
Subject Re: svn commit: r1364640 - in /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline: BundleWatcher.java LocalConsoleManager.java
Date Mon, 23 Jul 2012 14:40:35 GMT
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, <cschneider@apache.org> 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


Mime
View raw message