You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@karaf.apache.org by Guillaume Nodet <gn...@gmail.com> on 2012/07/23 16:14:13 UTC

Re: svn commit: r1364640 - in /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline: BundleWatcher.java LocalConsoleManager.java

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, <cs...@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) {
>
>
>


-- 
------------------------
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
FuseSource, Integration everywhere
http://fusesource.com

Re: svn commit: r1364640 - in /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline: BundleWatcher.java LocalConsoleManager.java

Posted by Scott England-Sullivan <su...@gmail.com>.
I ran into this today.  Several times while trying to run the code-base
while working on the SCR module.  Just kept looping waiting for a bundle to
resolve.

On Mon, Jul 23, 2012 at 11:14 AM, Guillaume Nodet <gn...@gmail.com> wrote:

> Yeah, I understand that the user can break the wait loop by typing enter,
> but my point is that there are cases where bundles may not be resolved or
> started and I don't think we should consider those as errors.
> If a bundle has been marked as being stopped (using bundle:stop xxx), the
> console will never show up after a restart.
>
> So a better way would be to check for the start level and wait until the
> start level is up to the final state (which can be found in
> etc/config.properties iirc).
> That would ensure that any problems (or any stopped bundle) would still end
> up showing the console.
>
>
>
> On Mon, Jul 23, 2012 at 4:40 PM, Christian Schneider <
> chris@die-schneider.net> wrote:
>
> > 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, <cs...@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<
> 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<
> 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<
> 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<
> http://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
> >
> >
>
>
> --
> ------------------------
> Guillaume Nodet
> ------------------------
> Blog: http://gnodet.blogspot.com/
> ------------------------
> FuseSource, Integration everywhere
> http://fusesource.com
>



-- 
-- 
Scott England-Sullivan
----------------------------------
FuseSource
Web:     http://www.fusesource.com
Blog:     http://sully6768.blogspot.com
Twitter: sully6768

Re: svn commit: r1364640 - in /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline: BundleWatcher.java LocalConsoleManager.java

Posted by Guillaume Nodet <gn...@gmail.com>.
Yeah, I understand that the user can break the wait loop by typing enter,
but my point is that there are cases where bundles may not be resolved or
started and I don't think we should consider those as errors.
If a bundle has been marked as being stopped (using bundle:stop xxx), the
console will never show up after a restart.

So a better way would be to check for the start level and wait until the
start level is up to the final state (which can be found in
etc/config.properties iirc).
That would ensure that any problems (or any stopped bundle) would still end
up showing the console.



On Mon, Jul 23, 2012 at 4:40 PM, Christian Schneider <
chris@die-schneider.net> wrote:

> 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, <cs...@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<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<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<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<http://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
>
>


-- 
------------------------
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
FuseSource, Integration everywhere
http://fusesource.com

Re: svn commit: r1364640 - in /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline: BundleWatcher.java LocalConsoleManager.java

Posted by Christian Schneider <ch...@die-schneider.net>.
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, <cs...@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


Re: svn commit: r1364640 - in /karaf/trunk/shell/console/src/main/java/org/apache/karaf/shell/console/impl/jline: BundleWatcher.java LocalConsoleManager.java

Posted by Guillaume Nodet <gn...@gmail.com>.
What I did for the fuse version was to just raise the start level for the
console to 99 so that it will get started last, without actually actively
waiting ...

On Mon, Jul 23, 2012 at 4:14 PM, Guillaume Nodet <gn...@gmail.com> wrote:

> 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, <cs...@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) {
>>
>>
>>
>
>
> --
> ------------------------
> Guillaume Nodet
> ------------------------
> Blog: http://gnodet.blogspot.com/
> ------------------------
> FuseSource, Integration everywhere
> http://fusesource.com
>



-- 
------------------------
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
FuseSource, Integration everywhere
http://fusesource.com