I've checked in the prototype into gogo for further discussion.
See https://svn.apache.org/repos/asf/felix/trunk/gogo/gogo.commands/

I've also fixed the gogo parser a bit as to be slightly more leniant
when parsing the first argument (so that '/' or '-' could be part of
the first argument).

Feedback welcome !

On Thu, Jul 2, 2009 at 08:24, Guillaume Nodet<[email protected]> wrote:
> For Karaf, I've been working on a prototype to be able to support more
> powerful commands in gogo.
> The problem with the current way (i.e. one function == one method) is
> that it's quite difficult to
>  * display help for a command
>  * have optional arguments
> So what I've done, and this would also benefit Karaf, is based on what
> gshell is doing for commands.
> It's based on the following interfaces:
>
> public interface Action
> {
>    Object execute(CommandSession session) throws Exception;
> }
>
> @Retention(RetentionPolicy.RUNTIME)
> @Target({ElementType.TYPE})
> public @interface Command
> {
>    String scope();
>
>    String name();
>
>    String description() default "";
> }
>
> @Retention(RetentionPolicy.RUNTIME)
> @Target({ElementType.FIELD, ElementType.METHOD})
> public @interface Argument
> {
>    String name() default "VAL";
>
>    String description() default "";
>
>    boolean required() default false;
>
>    int index() default 0;
>
>    boolean multiValued() default false;
> }
>
> @Retention(RetentionPolicy.RUNTIME)
> @Target({ElementType.FIELD, ElementType.METHOD})
> public @interface Option
> {
>    String name();
>
>    String[] aliases() default {};
>
>    String description() default "";
>
>    boolean required() default false;
>
>    boolean multiValued() default false;
>
> }
>
>
> So a given command would look like:
>
> @Command(scope = "my", name = "action")
> public class MyAction implements Action {
>
>   �...@option(name = "-s", aliases = { "--start" })
>    boolean start;
>
>   @Argument(name = "ids", required = true, multivalued = true)
>   List<Integer> ids;
>
>   public Object execute(CommandSession session) {
>       ...
>   }
> }
>
>
> This action has to be wrapped inside a command (implementing the
> Function interface) and which will be able to create a new instance of
> the action, parse the arguments, populate it, and call it.
> In addition the wrapper will detect the use of "-h" or "--help"
> arguments and compute / display the help on the console if requested.
>
> Curerntly, what I've done is leveraging blueprint, so I have a custom
> namespace (same as we had in karaf/gshell)
>
>    <command-bundle xmlns="http://felix.apache.org/karaf/xmlns/gshell/v1.0.0";>
>        <command name="osgi/list">
>            <action class="org.apache.felix.karaf.gshell.osgi.ListBundles">
>                <property name="blueprintListener" ref="blueprintListener"/>
>            </action>
>        </command>
>    </command-bundle>
>
> This will create a command and register it in the OSGi registry so
> that it will be available in the shell.
>
> I haven't implemented completers yet, but that's next on my todo list.
>
> So the question is: should this be part of gogo or do we keep that for karaf ?
> I have the same question for the console: I've started working on an
> advanced console (leveraging jline as we did in karaf / gshell).
>
> --
> Cheers,
> Guillaume Nodet
> ------------------------
> Blog: http://gnodet.blogspot.com/
> ------------------------
> Open Source SOA
> http://fusesource.com
>



-- 
Cheers,
Guillaume Nodet
------------------------
Blog: http://gnodet.blogspot.com/
------------------------
Open Source SOA
http://fusesource.com

Reply via email to