Hi Pierre, Thanks for the reply! I always assumed that the supplied output streams of the session would be used. But this does do the trick!
Op wo 20 okt. 2021 om 00:33 schreef Pierre De Rop <pierre.de...@gmail.com>: > Hi Alexander, > > I don't know how it worked with previous gogo version, but when using a > command processor, if I'm correct then I think you should test if the > execute command has returned a result object and display it. > > I adapted your example which seems to work for me: > > *import* java.io.FileDescriptor; > > *import* java.io.FileInputStream; > > *import* java.io.FileOutputStream; > > > *import* org.apache.felix.dm.annotation.api.Component; > > *import* org.apache.felix.dm.annotation.api.Property; > > *import* org.apache.felix.dm.annotation.api.ServiceDependency; > > *import* org.apache.felix.service.command.CommandProcessor; > > *import* org.apache.felix.service.command.CommandSession; > > *import* org.apache.felix.service.command.Converter; > > *import* org.apache.felix.service.command.Descriptor; > > > @Component(provides = Object.*class*) > > @Property(name = CommandProcessor.*COMMAND_SCOPE*, value = "test") > > @Property(name = CommandProcessor.*COMMAND_FUNCTION*, value = { "execute" > }) > > *public* *class* Example { > > > @ServiceDependency > > CommandProcessor _cmdProc; > > > *public* *void* execute(String cmd) { > > CommandSession session = _cmdProc.createSession(*new* > FileInputStream(FileDescriptor.*in*), > > *new* FileOutputStream(FileDescriptor.*out*), *new* > FileOutputStream(FileDescriptor.*err*)); > > *try* { > > Object result = session.execute(cmd); > > *if* (result != *null*) { > > System.*out*.println("displaying result returned by command:"); > > System.*out*.println(session.format(result, Converter.*INSPECT*)); > > } > > } *catch* (Exception e) { > > e.printStackTrace(System.*out*); > > } > > } > > > } > > > so, if you type under gogo shell "test:exec lb", then the session.execute() > method will return an object; in this case, you can (optionally) use the > session.format method in order to convert it and then display the result. > > If now you type for example "test:exec dm", then since the dm gogo command > does not return a result (and display the result internally, using > System.out), then the session.execute method will return null, then in this > case nothing special to do ... > > hope this helps > > > regards > /Pierre > > On Tue, Oct 19, 2021 at 10:44 AM Alexander Broekhuis < > a.broekh...@gmail.com> > wrote: > > > Hi all, > > > > I am trying to use the GoGo shell's CommandProcessor to execute commands > > via a rest-like interface. Using older versions of the shell, this used > to > > work. But after updating to the latest version (runtime 1.1.4) this > doesn't > > work anymore. > > > > Strangely enough, the DependencyManager commands do work, but the GoGo > > Commands don't. Looking in the source, the difference I can see is that > the > > DM commands use System.out.println, while the GoGo Commands return the > > output in each command method. > > > > Is there something that I am missing? > > > > Creating a trivial example already shows this: > > > > ------------ > > @Component(provides = TestShell.class) > > @Property(name = CommandProcessor.COMMAND_SCOPE, value = "test") > > @Property(name = CommandProcessor.COMMAND_FUNCTION, value = {"execute"}) > > public class TestShell { > > > > @ServiceDependency > > private volatile CommandProcessor commandProcessor; > > > > public void execute(String command) throws Exception { > > CommandSession session = commandProcessor.createSession(new > > FileInputStream(FileDescriptor.in), new > > FileOutputStream(FileDescriptor.out), new > > FileOutputStream(FileDescriptor.err)); > > session.execute(command); > > session.close(); > > } > > } > > ------------ > > > > Thanks in advance! > > > > -- > > Met vriendelijke groet, > > > > Alexander Broekhuis > > > -- Met vriendelijke groet, Alexander Broekhuis