You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@karaf.apache.org by Max Spring <m2...@springdot.org> on 2016/12/07 18:16:15 UTC

how to get Karaf's terminal width?

Is there a way to get the actual jline terminal object in a Karaf command?
I want to format the command output depending on the terminal width.
I'm on Ubuntu 16.04, Java 1.8.0_60-x64, and Karaf 3.0.5.

This one

   package org.example;

   import jline.TerminalFactory;
   import org.apache.karaf.shell.commands.Command;
   import org.apache.karaf.shell.console.OsgiCommandSupport;

   @Command(scope = "example", name = "term-wdith", description = "get the terminal width")
   public class TermWidthCmd extends OsgiCommandSupport{

       protected Object doExecute() throws Exception {
           int w = TerminalFactory.get().getTerminalWidth();

           return null;
       }
   }

gives:

| 2016-12-07 10:10:17,443 | ERROR | l for user karaf | ShellUtil                        | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception caught while executing command
| java.lang.IncompatibleClassChangeError: Found interface jline.Terminal, but class was expected
| 	at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:11)
| 	at org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
| 	at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
| 	at org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
| 	at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
| 	at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
| 	at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
| 	at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
| 	at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
| 	at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
| 	at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
| 	at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
| 	at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
| 	at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
| 	at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
| 	at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_60]
| 	at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
| 	at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]

The 2nd approach

   package org.example;

   import jline.NoInterruptUnixTerminal;
   import jline.Terminal;
   import org.apache.karaf.shell.commands.Command;
   import org.apache.karaf.shell.console.OsgiCommandSupport;

   @Command(scope = "example", name = "term-wdith", description = "get the terminal width")
   public class TermWidthCmd extends OsgiCommandSupport{

       protected Object doExecute() throws Exception {
           Terminal term = session != null ? (Terminal) session.get(".jline.terminal") : null;
           NoInterruptUnixTerminal uterm = (NoInterruptUnixTerminal)term;
           int w = term.getTerminalWidth();

           return null;
       }
   }

basically gives the same exception:

| 2016-12-07 10:09:11,964 | ERROR | l for user karaf | ShellUtil                        | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception caught while executing command
| java.lang.IncompatibleClassChangeError: Found interface jline.Terminal, but class was expected
| 	at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:14)
| 	at org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
| 	at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
| 	at org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
| 	at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
| 	at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
| 	at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
| 	at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
| 	at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
| 	at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
| 	at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
| 	at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
| 	at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
| 	at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
| 	at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
| 	at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_60]
| 	at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
| 	at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]

What am I missing?

Thanks!
-Max


Re: how to get Karaf's terminal width?

Posted by Jean-Baptiste Onofré <jb...@nanthrax.net>.
Hi Max,

AFAIR, the Session should contain the width. Let me check.

Regards
JB

On 12/07/2016 07:16 PM, Max Spring wrote:
> Is there a way to get the actual jline terminal object in a Karaf command?
> I want to format the command output depending on the terminal width.
> I'm on Ubuntu 16.04, Java 1.8.0_60-x64, and Karaf 3.0.5.
>
> This one
>
>   package org.example;
>
>   import jline.TerminalFactory;
>   import org.apache.karaf.shell.commands.Command;
>   import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>   @Command(scope = "example", name = "term-wdith", description = "get
> the terminal width")
>   public class TermWidthCmd extends OsgiCommandSupport{
>
>       protected Object doExecute() throws Exception {
>           int w = TerminalFactory.get().getTerminalWidth();
>
>           return null;
>       }
>   }
>
> gives:
>
> | 2016-12-07 10:10:17,443 | ERROR | l for user karaf |
> ShellUtil                        | 27 - org.apache.karaf.shell.console -
> 3.0.5 | Exception caught while executing command
> | java.lang.IncompatibleClassChangeError: Found interface
> jline.Terminal, but class was expected
> |     at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:11)
> |     at
> org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
>
> |     at
> org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
>
> |     at
> org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
>
> |     at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
> |     at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
> |     at
> org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
> |     at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
> |     at
> org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
> |     at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
> |     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
> |     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
> |     at
> org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
>
> |     at
> org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
>
> |     at
> org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>
> |     at java.security.AccessController.doPrivileged(Native
> Method)[:1.8.0_60]
> |     at
> org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
>
> |     at
> org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]
>
>
> The 2nd approach
>
>   package org.example;
>
>   import jline.NoInterruptUnixTerminal;
>   import jline.Terminal;
>   import org.apache.karaf.shell.commands.Command;
>   import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>   @Command(scope = "example", name = "term-wdith", description = "get
> the terminal width")
>   public class TermWidthCmd extends OsgiCommandSupport{
>
>       protected Object doExecute() throws Exception {
>           Terminal term = session != null ? (Terminal)
> session.get(".jline.terminal") : null;
>           NoInterruptUnixTerminal uterm = (NoInterruptUnixTerminal)term;
>           int w = term.getTerminalWidth();
>
>           return null;
>       }
>   }
>
> basically gives the same exception:
>
> | 2016-12-07 10:09:11,964 | ERROR | l for user karaf |
> ShellUtil                        | 27 - org.apache.karaf.shell.console -
> 3.0.5 | Exception caught while executing command
> | java.lang.IncompatibleClassChangeError: Found interface
> jline.Terminal, but class was expected
> |     at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:14)
> |     at
> org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
>
> |     at
> org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
>
> |     at
> org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
>
> |     at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
> |     at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
> |     at
> org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
> |     at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
> |     at
> org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
> |     at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
> |     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
> |     at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
> |     at
> org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
>
> |     at
> org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
>
> |     at
> org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>
> |     at java.security.AccessController.doPrivileged(Native
> Method)[:1.8.0_60]
> |     at
> org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
>
> |     at
> org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]
>
>
> What am I missing?
>
> Thanks!
> -Max
>

-- 
Jean-Baptiste Onofr�
jbonofre@apache.org
http://blog.nanthrax.net
Talend - http://www.talend.com

Re: how to get Karaf's terminal width?

Posted by Max Spring <m2...@springdot.org>.
Yes! 'mvn dependency:tree' showed I get an old jline bundle (org.apache.servicemix.bundles.jline:jar:0.9.94_1) via my Neo4j client dependency.
Adding an exclusion to the dependency and my example does work.

   package org.example;

   import jline.TerminalFactory;
   import org.apache.karaf.shell.commands.Command;
   import org.apache.karaf.shell.console.OsgiCommandSupport;

   @Command(scope = "example", name = "term-wdith", description = "get the terminal width")
   public class TermWidthCmd extends OsgiCommandSupport{

       protected Object doExecute() throws Exception {
           int w = TerminalFactory.get().getWidth();
           System.out.println("w="+w);

           return null;
       }
   }

Thanks a lot Guillaume!
-Max


On 12/07/2016 11:58 AM, Guillaume Nodet wrote:
> Can you run a "mvn dependency:tree" on your bundle  ? I do suspect you have a jline 1.x somewhere, as found by the maven bundle plugin when computing the package version.
>
> 2016-12-07 20:06 GMT+01:00 Max Spring <m2spring@springdot.org <ma...@springdot.org>>:
>
>     Yes, I probably have here some build issue going on.
>
>     I've got the jline bundle v2.13.0 in my container:
>
>     | karaf@root()> list -s -t 0 | grep jline
>     |  22 | Active   |  30 | 2.13.0           | jline
>     |
>     | karaf@root()> bundle:headers 22
>     |
>     | JLine (22)
>     | ----------
>     | Archiver-Version = Plexus Archiver
>     | Originally-Created-By = Apache Maven Bundle Plugin
>     | Created-By = Apache Maven Bundle Plugin
>     | Manifest-Version = 1.0
>     | Bnd-LastModified = 1439224319120
>     | Build-Jdk = 1.8.0_45
>     | Built-By = gnodet
>     | Tool = Bnd-2.4.1.201501161923
>     |
>     | Bundle-License = http://www.opensource.org/licenses/bsd-license.php <http://www.opensource.org/licenses/bsd-license.php>
>     | Bundle-ManifestVersion = 2
>     | Bundle-SymbolicName = jline
>     | Bundle-Version = 2.13.0
>     | Bundle-Name = JLine
>     | Bundle-Description = Sonatype helps open source projects to set up Maven repositories on https://oss.sonatype.org/
>     |
>     | Require-Capability =
>     |       osgi.ee <http://osgi.ee>;filter:=(&(osgi.ee <http://osgi.ee>=JavaSE)(version=1.5))
>     |
>     | Export-Package =
>     |       jline;uses:=jline.internal;version=2.13.0,
>     |       jline.console;uses:="jline,jline.console.completer,jline.co <http://jline.co>nsole.history";version=2.13.0,
>     |       jline.console.completer;uses:=jline.console;version=2.13.0,
>     |       jline.console.history;version=2.13.0,
>     |       jline.console.internal;version=2.13.0,
>     |       jline.internal;version=2.13.0,
>     |       org.fusesource.jansi;version=1.11
>
>     The Maven artifact with version 2.13 is identical to the cached bundle (not sure why the Maven artifact doesn't have the micro version, though):
>
>     | $ diff karaf/data/cache/bundle22/version0.0/bundle.jar ~/.m2/repository/jline/jline/2.13/jline-2.13.jar; echo $?
>     | 0
>
>     If I do this in my POM
>
>     |   <dependencies>
>     |     ...
>     |     <dependency>
>     |       <groupId>jline</groupId>
>     |       <artifactId>jline</artifactId>
>     |       <version>2.13</version>
>     |     </dependency>
>     |     ...
>     |   </dependencies>
>     |
>     |   <build>
>     |     <plugins>
>     |       <plugin>
>     |         <groupId>org.apache.felix</groupId>
>     |         <artifactId>maven-bundle-plugin</artifactId>
>     |         <inherited>true</inherited>
>     |         <extensions>true</extensions>
>     |         <configuration>
>     |           <instructions>
>     |             <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
>     |           </instructions>
>     |         </configuration>
>     |       </plugin>
>     |     </plugins>
>     |   </build>
>
>     then when I try to install my feature which references my bundle with the example command, I get:
>
>     | karaf@root()> feature:install my-feature
>     | no such process "maven/boot" to wait for
>     | Error executing command: Can't install feature my-feature/0.0.0:
>     | Could not start bundle mvn:org.example/example-bundle/1.0.0-SNAPSHOT in feature(s) example-bundle-1.0.0-SNAPSHOT: Unresolved constraint in bundle example-bundle [195]: Unable to resolve 195.0: missing requirement [195.0] osgi.wiring.package; (&(osgi.wiring.package=jline)(version>=0.9.0)(!(version>=1.0.0)))
>
>     But when I explicitly specify the version of the jline package, my bundle does install:
>
>     |   <dependencies>
>     |     ...
>     |     <dependency>
>     |       <groupId>jline</groupId>
>     |       <artifactId>jline</artifactId>
>     |       <version>2.13</version>
>     |     </dependency>
>     |     ...
>     |   </dependencies>
>     |
>     |   <build>
>     |     <plugins>
>     |       <plugin>
>     |         <groupId>org.apache.felix</groupId>
>     |         <artifactId>maven-bundle-plugin</artifactId>
>     |         <inherited>true</inherited>
>     |         <extensions>true</extensions>
>     |         <configuration>
>     |           <instructions>
>     |             <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
>     |              <Import-Package>
>     |                jline*;version="2.13.0",
>     |                *
>     |              </Import-Package>
>     |           </instructions>
>     |         </configuration>
>     |       </plugin>
>     |     </plugins>
>     |   </build>
>
>     I guess this leads to my bundle not finding the correct Terminal classes.
>
>     -Max
>
>
>     On 12/07/2016 10:42 AM, Guillaume Nodet wrote:
>
>         The second approach should definitely work, see
>           https://github.com/apache/karaf/blob/karaf-3.0.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java#L40 <https://github.com/apache/karaf/blob/karaf-3.0.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java#L40>
>
>         The exception is a bit unexpected.  Maybe you're compiling against a very old version of jline ? In JLine 1.x, the Terminal was an abstract class, but it has been changed to an interface in jline 2.x.
>
>         2016-12-07 19:16 GMT+01:00 Max Spring <m2spring@springdot.org <ma...@springdot.org> <mailto:m2spring@springdot.org <ma...@springdot.org>>>:
>
>
>             Is there a way to get the actual jline terminal object in a Karaf command?
>             I want to format the command output depending on the terminal width.
>             I'm on Ubuntu 16.04, Java 1.8.0_60-x64, and Karaf 3.0.5.
>
>             This one
>
>               package org.example;
>
>               import jline.TerminalFactory;
>               import org.apache.karaf.shell.commands.Command;
>               import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>               @Command(scope = "example", name = "term-wdith", description = "get the terminal width")
>               public class TermWidthCmd extends OsgiCommandSupport{
>
>                   protected Object doExecute() throws Exception {
>                       int w = TerminalFactory.get().getTerminalWidth();
>
>                       return null;
>                   }
>               }
>
>             gives:
>
>             | 2016-12-07 10:10:17,443 | ERROR | l for user karaf | ShellUtil                        | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception caught while executing command
>             | java.lang.IncompatibleClassChangeError: Found interface jline.Terminal, but class was expected
>             |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:11)
>             |       at org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
>             |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
>             |       at org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
>             |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
>             |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
>             |       at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
>             |       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
>             |       at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
>             |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
>             |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
>             |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
>             |       at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
>             |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
>             |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>             |       at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_60]
>             |       at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
>             |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]
>
>             The 2nd approach
>
>               package org.example;
>
>               import jline.NoInterruptUnixTerminal;
>               import jline.Terminal;
>               import org.apache.karaf.shell.commands.Command;
>               import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>               @Command(scope = "example", name = "term-wdith", description = "get the terminal width")
>               public class TermWidthCmd extends OsgiCommandSupport{
>
>                   protected Object doExecute() throws Exception {
>                       Terminal term = session != null ? (Terminal) session.get(".jline.terminal") : null;
>                       NoInterruptUnixTerminal uterm = (NoInterruptUnixTerminal)term;
>                       int w = term.getTerminalWidth();
>
>                       return null;
>                   }
>               }
>
>             basically gives the same exception:
>
>             | 2016-12-07 10:09:11,964 | ERROR | l for user karaf | ShellUtil                        | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception caught while executing command
>             | java.lang.IncompatibleClassChangeError: Found interface jline.Terminal, but class was expected
>             |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:14)
>             |       at org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
>             |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
>             |       at org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
>             |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
>             |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
>             |       at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
>             |       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
>             |       at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
>             |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
>             |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
>             |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
>             |       at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
>             |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
>             |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>             |       at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_60]
>             |       at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
>             |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]
>
>             What am I missing?
>
>             Thanks!
>             -Max
>
>
>
>
>         --
>         ------------------------
>         Guillaume Nodet
>         ------------------------
>         Red Hat, Open Source Integration
>
>         Email: gnodet@redhat.com <ma...@redhat.com> <mailto:gnodet@redhat.com <ma...@redhat.com>>
>         Web: http://fusesource.com <http://fusesource.com/>
>         Blog: http://gnodet.blogspot.com/
>
>
>
>
>
> --
> ------------------------
> Guillaume Nodet
> ------------------------
> Red Hat, Open Source Integration
>
> Email: gnodet@redhat.com <ma...@redhat.com>
> Web: http://fusesource.com <http://fusesource.com/>
> Blog: http://gnodet.blogspot.com/
>


Re: how to get Karaf's terminal width?

Posted by Guillaume Nodet <gn...@apache.org>.
Can you run a "mvn dependency:tree" on your bundle  ? I do suspect you have
a jline 1.x somewhere, as found by the maven bundle plugin when computing
the package version.

2016-12-07 20:06 GMT+01:00 Max Spring <m2...@springdot.org>:

> Yes, I probably have here some build issue going on.
>
> I've got the jline bundle v2.13.0 in my container:
>
> | karaf@root()> list -s -t 0 | grep jline
> |  22 | Active   |  30 | 2.13.0           | jline
> |
> | karaf@root()> bundle:headers 22
> |
> | JLine (22)
> | ----------
> | Archiver-Version = Plexus Archiver
> | Originally-Created-By = Apache Maven Bundle Plugin
> | Created-By = Apache Maven Bundle Plugin
> | Manifest-Version = 1.0
> | Bnd-LastModified = 1439224319120
> | Build-Jdk = 1.8.0_45
> | Built-By = gnodet
> | Tool = Bnd-2.4.1.201501161923
> |
> | Bundle-License = http://www.opensource.org/licenses/bsd-license.php
> | Bundle-ManifestVersion = 2
> | Bundle-SymbolicName = jline
> | Bundle-Version = 2.13.0
> | Bundle-Name = JLine
> | Bundle-Description = Sonatype helps open source projects to set up Maven
> repositories on https://oss.sonatype.org/
> |
> | Require-Capability =
> |       osgi.ee;filter:=(&(osgi.ee=JavaSE)(version=1.5))
> |
> | Export-Package =
> |       jline;uses:=jline.internal;version=2.13.0,
> |       jline.console;uses:="jline,jline.console.completer,jline.co
> nsole.history";version=2.13.0,
> |       jline.console.completer;uses:=jline.console;version=2.13.0,
> |       jline.console.history;version=2.13.0,
> |       jline.console.internal;version=2.13.0,
> |       jline.internal;version=2.13.0,
> |       org.fusesource.jansi;version=1.11
>
> The Maven artifact with version 2.13 is identical to the cached bundle
> (not sure why the Maven artifact doesn't have the micro version, though):
>
> | $ diff karaf/data/cache/bundle22/version0.0/bundle.jar
> ~/.m2/repository/jline/jline/2.13/jline-2.13.jar; echo $?
> | 0
>
> If I do this in my POM
>
> |   <dependencies>
> |     ...
> |     <dependency>
> |       <groupId>jline</groupId>
> |       <artifactId>jline</artifactId>
> |       <version>2.13</version>
> |     </dependency>
> |     ...
> |   </dependencies>
> |
> |   <build>
> |     <plugins>
> |       <plugin>
> |         <groupId>org.apache.felix</groupId>
> |         <artifactId>maven-bundle-plugin</artifactId>
> |         <inherited>true</inherited>
> |         <extensions>true</extensions>
> |         <configuration>
> |           <instructions>
> |             <Bundle-SymbolicName>${project.artifactId}</Bundle-Symbolic
> Name>
> |           </instructions>
> |         </configuration>
> |       </plugin>
> |     </plugins>
> |   </build>
>
> then when I try to install my feature which references my bundle with the
> example command, I get:
>
> | karaf@root()> feature:install my-feature
> | no such process "maven/boot" to wait for
> | Error executing command: Can't install feature my-feature/0.0.0:
> | Could not start bundle mvn:org.example/example-bundle/1.0.0-SNAPSHOT in
> feature(s) example-bundle-1.0.0-SNAPSHOT: Unresolved constraint in bundle
> example-bundle [195]: Unable to resolve 195.0: missing requirement [195.0]
> osgi.wiring.package; (&(osgi.wiring.package=jline)(
> version>=0.9.0)(!(version>=1.0.0)))
>
> But when I explicitly specify the version of the jline package, my bundle
> does install:
>
> |   <dependencies>
> |     ...
> |     <dependency>
> |       <groupId>jline</groupId>
> |       <artifactId>jline</artifactId>
> |       <version>2.13</version>
> |     </dependency>
> |     ...
> |   </dependencies>
> |
> |   <build>
> |     <plugins>
> |       <plugin>
> |         <groupId>org.apache.felix</groupId>
> |         <artifactId>maven-bundle-plugin</artifactId>
> |         <inherited>true</inherited>
> |         <extensions>true</extensions>
> |         <configuration>
> |           <instructions>
> |             <Bundle-SymbolicName>${project.artifactId}</Bundle-Symbolic
> Name>
> |              <Import-Package>
> |                jline*;version="2.13.0",
> |                *
> |              </Import-Package>
> |           </instructions>
> |         </configuration>
> |       </plugin>
> |     </plugins>
> |   </build>
>
> I guess this leads to my bundle not finding the correct Terminal classes.
>
> -Max
>
>
> On 12/07/2016 10:42 AM, Guillaume Nodet wrote:
>
>> The second approach should definitely work, see
>>   https://github.com/apache/karaf/blob/karaf-3.0.x/shell/comma
>> nds/src/main/java/org/apache/karaf/shell/commands/impl/
>> MoreAction.java#L40
>>
>> The exception is a bit unexpected.  Maybe you're compiling against a very
>> old version of jline ? In JLine 1.x, the Terminal was an abstract class,
>> but it has been changed to an interface in jline 2.x.
>>
>> 2016-12-07 19:16 GMT+01:00 Max Spring <m2spring@springdot.org <mailto:
>> m2spring@springdot.org>>:
>>
>>
>>     Is there a way to get the actual jline terminal object in a Karaf
>> command?
>>     I want to format the command output depending on the terminal width.
>>     I'm on Ubuntu 16.04, Java 1.8.0_60-x64, and Karaf 3.0.5.
>>
>>     This one
>>
>>       package org.example;
>>
>>       import jline.TerminalFactory;
>>       import org.apache.karaf.shell.commands.Command;
>>       import org.apache.karaf.shell.console.OsgiCommandSupport;
>>
>>       @Command(scope = "example", name = "term-wdith", description = "get
>> the terminal width")
>>       public class TermWidthCmd extends OsgiCommandSupport{
>>
>>           protected Object doExecute() throws Exception {
>>               int w = TerminalFactory.get().getTerminalWidth();
>>
>>               return null;
>>           }
>>       }
>>
>>     gives:
>>
>>     | 2016-12-07 10:10:17,443 | ERROR | l for user karaf | ShellUtil
>>                   | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception
>> caught while executing command
>>     | java.lang.IncompatibleClassChangeError: Found interface
>> jline.Terminal, but class was expected
>>     |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:11)
>>     |       at org.apache.karaf.shell.console.AbstractAction.execute(
>> AbstractAction.java:33)
>>     |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(
>> OsgiCommandSupport.java:39)
>>     |       at org.apache.karaf.shell.commands.basic.AbstractCommand.
>> execute(AbstractCommand.java:33)
>>     |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown
>> Source)
>>     |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown
>> Source)
>>     |       at org.apache.felix.gogo.runtime.
>> CommandProxy.execute(CommandProxy.java:78)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.executeCmd(Closure.java:480)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.executeStatement(Closure.java:406)
>>     |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.execute(Closure.java:182)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.execute(Closure.java:119)
>>     |       at org.apache.felix.gogo.runtime.
>> CommandSessionImpl.execute(CommandSessionImpl.java:94)
>>     |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(
>> ConsoleImpl.java:210)
>>     |       at org.apache.karaf.shell.console
>> .impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>>     |       at java.security.AccessController.doPrivileged(Native
>> Method)[:1.8.0_60]
>>     |       at org.apache.karaf.jaas.modules.
>> JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas
>> .modules:3.0.5]
>>     |       at org.apache.karaf.shell.console
>> .impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.
>> java:102)[27:org.apache.karaf.shell.console:3.0.5]
>>
>>     The 2nd approach
>>
>>       package org.example;
>>
>>       import jline.NoInterruptUnixTerminal;
>>       import jline.Terminal;
>>       import org.apache.karaf.shell.commands.Command;
>>       import org.apache.karaf.shell.console.OsgiCommandSupport;
>>
>>       @Command(scope = "example", name = "term-wdith", description = "get
>> the terminal width")
>>       public class TermWidthCmd extends OsgiCommandSupport{
>>
>>           protected Object doExecute() throws Exception {
>>               Terminal term = session != null ? (Terminal)
>> session.get(".jline.terminal") : null;
>>               NoInterruptUnixTerminal uterm =
>> (NoInterruptUnixTerminal)term;
>>               int w = term.getTerminalWidth();
>>
>>               return null;
>>           }
>>       }
>>
>>     basically gives the same exception:
>>
>>     | 2016-12-07 10:09:11,964 | ERROR | l for user karaf | ShellUtil
>>                   | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception
>> caught while executing command
>>     | java.lang.IncompatibleClassChangeError: Found interface
>> jline.Terminal, but class was expected
>>     |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:14)
>>     |       at org.apache.karaf.shell.console.AbstractAction.execute(
>> AbstractAction.java:33)
>>     |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(
>> OsgiCommandSupport.java:39)
>>     |       at org.apache.karaf.shell.commands.basic.AbstractCommand.
>> execute(AbstractCommand.java:33)
>>     |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown
>> Source)
>>     |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown
>> Source)
>>     |       at org.apache.felix.gogo.runtime.
>> CommandProxy.execute(CommandProxy.java:78)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.executeCmd(Closure.java:480)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.executeStatement(Closure.java:406)
>>     |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.execute(Closure.java:182)
>>     |       at org.apache.felix.gogo.runtime.
>> Closure.execute(Closure.java:119)
>>     |       at org.apache.felix.gogo.runtime.
>> CommandSessionImpl.execute(CommandSessionImpl.java:94)
>>     |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(
>> ConsoleImpl.java:210)
>>     |       at org.apache.karaf.shell.console
>> .impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>>     |       at java.security.AccessController.doPrivileged(Native
>> Method)[:1.8.0_60]
>>     |       at org.apache.karaf.jaas.modules.
>> JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas
>> .modules:3.0.5]
>>     |       at org.apache.karaf.shell.console
>> .impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.
>> java:102)[27:org.apache.karaf.shell.console:3.0.5]
>>
>>     What am I missing?
>>
>>     Thanks!
>>     -Max
>>
>>
>>
>>
>> --
>> ------------------------
>> Guillaume Nodet
>> ------------------------
>> Red Hat, Open Source Integration
>>
>> Email: gnodet@redhat.com <ma...@redhat.com>
>> Web: http://fusesource.com <http://fusesource.com/>
>> Blog: http://gnodet.blogspot.com/
>>
>
>


-- 
------------------------
Guillaume Nodet
------------------------
Red Hat, Open Source Integration

Email: gnodet@redhat.com
Web: http://fusesource.com
Blog: http://gnodet.blogspot.com/

Re: how to get Karaf's terminal width?

Posted by Max Spring <m2...@springdot.org>.
Yes, I probably have here some build issue going on.

I've got the jline bundle v2.13.0 in my container:

| karaf@root()> list -s -t 0 | grep jline
|  22 | Active   |  30 | 2.13.0           | jline
|
| karaf@root()> bundle:headers 22
|
| JLine (22)
| ----------
| Archiver-Version = Plexus Archiver
| Originally-Created-By = Apache Maven Bundle Plugin
| Created-By = Apache Maven Bundle Plugin
| Manifest-Version = 1.0
| Bnd-LastModified = 1439224319120
| Build-Jdk = 1.8.0_45
| Built-By = gnodet
| Tool = Bnd-2.4.1.201501161923
|
| Bundle-License = http://www.opensource.org/licenses/bsd-license.php
| Bundle-ManifestVersion = 2
| Bundle-SymbolicName = jline
| Bundle-Version = 2.13.0
| Bundle-Name = JLine
| Bundle-Description = Sonatype helps open source projects to set up Maven repositories on https://oss.sonatype.org/
|
| Require-Capability =
| 	osgi.ee;filter:=(&(osgi.ee=JavaSE)(version=1.5))
|
| Export-Package =
| 	jline;uses:=jline.internal;version=2.13.0,
| 	jline.console;uses:="jline,jline.console.completer,jline.console.history";version=2.13.0,
| 	jline.console.completer;uses:=jline.console;version=2.13.0,
| 	jline.console.history;version=2.13.0,
| 	jline.console.internal;version=2.13.0,
| 	jline.internal;version=2.13.0,
| 	org.fusesource.jansi;version=1.11

The Maven artifact with version 2.13 is identical to the cached bundle (not sure why the Maven artifact doesn't have the micro version, though):

| $ diff karaf/data/cache/bundle22/version0.0/bundle.jar ~/.m2/repository/jline/jline/2.13/jline-2.13.jar; echo $?
| 0

If I do this in my POM

|   <dependencies>
|     ...
|     <dependency>
|       <groupId>jline</groupId>
|       <artifactId>jline</artifactId>
|       <version>2.13</version>
|     </dependency>
|     ...
|   </dependencies>
|
|   <build>
|     <plugins>
|       <plugin>
|         <groupId>org.apache.felix</groupId>
|         <artifactId>maven-bundle-plugin</artifactId>
|         <inherited>true</inherited>
|         <extensions>true</extensions>
|         <configuration>
|           <instructions>
|             <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
|           </instructions>
|         </configuration>
|       </plugin>
|     </plugins>
|   </build>

then when I try to install my feature which references my bundle with the example command, I get:

| karaf@root()> feature:install my-feature
| no such process "maven/boot" to wait for
| Error executing command: Can't install feature my-feature/0.0.0: 	
| Could not start bundle mvn:org.example/example-bundle/1.0.0-SNAPSHOT in feature(s) example-bundle-1.0.0-SNAPSHOT: Unresolved constraint in bundle example-bundle [195]: Unable to resolve 195.0: missing requirement [195.0] osgi.wiring.package; (&(osgi.wiring.package=jline)(version>=0.9.0)(!(version>=1.0.0)))

But when I explicitly specify the version of the jline package, my bundle does install:

|   <dependencies>
|     ...
|     <dependency>
|       <groupId>jline</groupId>
|       <artifactId>jline</artifactId>
|       <version>2.13</version>
|     </dependency>
|     ...
|   </dependencies>
|
|   <build>
|     <plugins>
|       <plugin>
|         <groupId>org.apache.felix</groupId>
|         <artifactId>maven-bundle-plugin</artifactId>
|         <inherited>true</inherited>
|         <extensions>true</extensions>
|         <configuration>
|           <instructions>
|             <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
|              <Import-Package>
|                jline*;version="2.13.0",
|                *
|              </Import-Package>
|           </instructions>
|         </configuration>
|       </plugin>
|     </plugins>
|   </build>

I guess this leads to my bundle not finding the correct Terminal classes.

-Max


On 12/07/2016 10:42 AM, Guillaume Nodet wrote:
> The second approach should definitely work, see
>   https://github.com/apache/karaf/blob/karaf-3.0.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java#L40
>
> The exception is a bit unexpected.  Maybe you're compiling against a very old version of jline ? In JLine 1.x, the Terminal was an abstract class, but it has been changed to an interface in jline 2.x.
>
> 2016-12-07 19:16 GMT+01:00 Max Spring <m2spring@springdot.org <ma...@springdot.org>>:
>
>     Is there a way to get the actual jline terminal object in a Karaf command?
>     I want to format the command output depending on the terminal width.
>     I'm on Ubuntu 16.04, Java 1.8.0_60-x64, and Karaf 3.0.5.
>
>     This one
>
>       package org.example;
>
>       import jline.TerminalFactory;
>       import org.apache.karaf.shell.commands.Command;
>       import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>       @Command(scope = "example", name = "term-wdith", description = "get the terminal width")
>       public class TermWidthCmd extends OsgiCommandSupport{
>
>           protected Object doExecute() throws Exception {
>               int w = TerminalFactory.get().getTerminalWidth();
>
>               return null;
>           }
>       }
>
>     gives:
>
>     | 2016-12-07 10:10:17,443 | ERROR | l for user karaf | ShellUtil                        | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception caught while executing command
>     | java.lang.IncompatibleClassChangeError: Found interface jline.Terminal, but class was expected
>     |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:11)
>     |       at org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
>     |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
>     |       at org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
>     |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
>     |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown Source)
>     |       at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
>     |       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
>     |       at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
>     |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
>     |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
>     |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
>     |       at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
>     |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
>     |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>     |       at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_60]
>     |       at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
>     |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]
>
>     The 2nd approach
>
>       package org.example;
>
>       import jline.NoInterruptUnixTerminal;
>       import jline.Terminal;
>       import org.apache.karaf.shell.commands.Command;
>       import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>       @Command(scope = "example", name = "term-wdith", description = "get the terminal width")
>       public class TermWidthCmd extends OsgiCommandSupport{
>
>           protected Object doExecute() throws Exception {
>               Terminal term = session != null ? (Terminal) session.get(".jline.terminal") : null;
>               NoInterruptUnixTerminal uterm = (NoInterruptUnixTerminal)term;
>               int w = term.getTerminalWidth();
>
>               return null;
>           }
>       }
>
>     basically gives the same exception:
>
>     | 2016-12-07 10:09:11,964 | ERROR | l for user karaf | ShellUtil                        | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception caught while executing command
>     | java.lang.IncompatibleClassChangeError: Found interface jline.Terminal, but class was expected
>     |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:14)
>     |       at org.apache.karaf.shell.console.AbstractAction.execute(AbstractAction.java:33)
>     |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(OsgiCommandSupport.java:39)
>     |       at org.apache.karaf.shell.commands.basic.AbstractCommand.execute(AbstractCommand.java:33)
>     |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
>     |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown Source)
>     |       at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandProxy.java:78)
>     |       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.java:480)
>     |       at org.apache.felix.gogo.runtime.Closure.executeStatement(Closure.java:406)
>     |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
>     |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
>     |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
>     |       at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(CommandSessionImpl.java:94)
>     |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(ConsoleImpl.java:210)
>     |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1$1.run(LocalConsoleManager.java:109)
>     |       at java.security.AccessController.doPrivileged(Native Method)[:1.8.0_60]
>     |       at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.java:57)[28:org.apache.karaf.jaas.modules:3.0.5]
>     |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManager$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.shell.console:3.0.5]
>
>     What am I missing?
>
>     Thanks!
>     -Max
>
>
>
>
> --
> ------------------------
> Guillaume Nodet
> ------------------------
> Red Hat, Open Source Integration
>
> Email: gnodet@redhat.com <ma...@redhat.com>
> Web: http://fusesource.com <http://fusesource.com/>
> Blog: http://gnodet.blogspot.com/


Re: how to get Karaf's terminal width?

Posted by Guillaume Nodet <gn...@apache.org>.
The second approach should definitely work, see

https://github.com/apache/karaf/blob/karaf-3.0.x/shell/commands/src/main/java/org/apache/karaf/shell/commands/impl/MoreAction.java#L40

The exception is a bit unexpected.  Maybe you're compiling against a very
old version of jline ? In JLine 1.x, the Terminal was an abstract class,
but it has been changed to an interface in jline 2.x.

2016-12-07 19:16 GMT+01:00 Max Spring <m2...@springdot.org>:

> Is there a way to get the actual jline terminal object in a Karaf command?
> I want to format the command output depending on the terminal width.
> I'm on Ubuntu 16.04, Java 1.8.0_60-x64, and Karaf 3.0.5.
>
> This one
>
>   package org.example;
>
>   import jline.TerminalFactory;
>   import org.apache.karaf.shell.commands.Command;
>   import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>   @Command(scope = "example", name = "term-wdith", description = "get the
> terminal width")
>   public class TermWidthCmd extends OsgiCommandSupport{
>
>       protected Object doExecute() throws Exception {
>           int w = TerminalFactory.get().getTerminalWidth();
>
>           return null;
>       }
>   }
>
> gives:
>
> | 2016-12-07 10:10:17,443 | ERROR | l for user karaf | ShellUtil
>               | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception
> caught while executing command
> | java.lang.IncompatibleClassChangeError: Found interface jline.Terminal,
> but class was expected
> |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:11)
> |       at org.apache.karaf.shell.console.AbstractAction.execute(
> AbstractAction.java:33)
> |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(
> OsgiCommandSupport.java:39)
> |       at org.apache.karaf.shell.commands.basic.AbstractCommand.
> execute(AbstractCommand.java:33)
> |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown
> Source)
> |       at Proxy68e7a8f7_5f52_4001_8cfa_f4b37a3fc958.execute(Unknown
> Source)
> |       at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandPr
> oxy.java:78)
> |       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.jav
> a:480)
> |       at org.apache.felix.gogo.runtime.Closure.executeStatement(Closu
> re.java:406)
> |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
> |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
> |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
> |       at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(Com
> mandSessionImpl.java:94)
> |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(
> ConsoleImpl.java:210)
> |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManage
> r$2$1$1.run(LocalConsoleManager.java:109)
> |       at java.security.AccessController.doPrivileged(Native
> Method)[:1.8.0_60]
> |       at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.jav
> a:57)[28:org.apache.karaf.jaas.modules:3.0.5]
> |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManage
> r$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.
> shell.console:3.0.5]
>
> The 2nd approach
>
>   package org.example;
>
>   import jline.NoInterruptUnixTerminal;
>   import jline.Terminal;
>   import org.apache.karaf.shell.commands.Command;
>   import org.apache.karaf.shell.console.OsgiCommandSupport;
>
>   @Command(scope = "example", name = "term-wdith", description = "get the
> terminal width")
>   public class TermWidthCmd extends OsgiCommandSupport{
>
>       protected Object doExecute() throws Exception {
>           Terminal term = session != null ? (Terminal)
> session.get(".jline.terminal") : null;
>           NoInterruptUnixTerminal uterm = (NoInterruptUnixTerminal)term;
>           int w = term.getTerminalWidth();
>
>           return null;
>       }
>   }
>
> basically gives the same exception:
>
> | 2016-12-07 10:09:11,964 | ERROR | l for user karaf | ShellUtil
>               | 27 - org.apache.karaf.shell.console - 3.0.5 | Exception
> caught while executing command
> | java.lang.IncompatibleClassChangeError: Found interface jline.Terminal,
> but class was expected
> |       at org.example.TermWidthCmd.doExecute(TermWidthCmd.java:14)
> |       at org.apache.karaf.shell.console.AbstractAction.execute(
> AbstractAction.java:33)
> |       at org.apache.karaf.shell.console.OsgiCommandSupport.execute(
> OsgiCommandSupport.java:39)
> |       at org.apache.karaf.shell.commands.basic.AbstractCommand.
> execute(AbstractCommand.java:33)
> |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown
> Source)
> |       at Proxy1c55bc35_2cb4_47b2_b9f4_f593e49a68ce.execute(Unknown
> Source)
> |       at org.apache.felix.gogo.runtime.CommandProxy.execute(CommandPr
> oxy.java:78)
> |       at org.apache.felix.gogo.runtime.Closure.executeCmd(Closure.jav
> a:480)
> |       at org.apache.felix.gogo.runtime.Closure.executeStatement(Closu
> re.java:406)
> |       at org.apache.felix.gogo.runtime.Pipe.run(Pipe.java:108)
> |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:182)
> |       at org.apache.felix.gogo.runtime.Closure.execute(Closure.java:119)
> |       at org.apache.felix.gogo.runtime.CommandSessionImpl.execute(Com
> mandSessionImpl.java:94)
> |       at org.apache.karaf.shell.console.impl.jline.ConsoleImpl.run(
> ConsoleImpl.java:210)
> |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManage
> r$2$1$1.run(LocalConsoleManager.java:109)
> |       at java.security.AccessController.doPrivileged(Native
> Method)[:1.8.0_60]
> |       at org.apache.karaf.jaas.modules.JaasHelper.doAs(JaasHelper.jav
> a:57)[28:org.apache.karaf.jaas.modules:3.0.5]
> |       at org.apache.karaf.shell.console.impl.jline.LocalConsoleManage
> r$2$1.run(LocalConsoleManager.java:102)[27:org.apache.karaf.
> shell.console:3.0.5]
>
> What am I missing?
>
> Thanks!
> -Max
>
>


-- 
------------------------
Guillaume Nodet
------------------------
Red Hat, Open Source Integration

Email: gnodet@redhat.com
Web: http://fusesource.com
Blog: http://gnodet.blogspot.com/