gembin

OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

HBase, Hadoop, ZooKeeper, Cassandra

Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

About Me

 

Ideas on Apache karaf shell

i would like to share some ideas on Apache karaf shell.
karaf shell is based on apache felix gogo.
If you want to create a new command, you have to extends org.apache.karaf.shell.console.AbstractAction or XxxCommandSupport.
public class CatAction extends AbstractAction {
protected Object doExecute() throws Exception {
//todo something here
}
}

and then add to blueprint config, would be something like this:
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
    
<command-bundle xmlns="http://karaf.apache.org/xmlns/shell/v1.0.0">
        
<command name="shell/cat">
            
<action class="org.apache.karaf.shell.commands.CatAction"/>
        
</command>
        
    
</command-bundle>
</blueprint>
it's somewhat a little bit verbose in my opinion.

i would perfer something like this:
@CommandProvider(scope = "shell", name = "ShellCommandProvider", description = "Unix Shell alike commands.")
public class ShellCommandProvider {

@Option(name 
= "-n", aliases = {"--show-line-number"}, description = "The number the output lines, starting at 1.")
private boolean displayLineNumbers;

@Argument(name 
= "paths or urls", description = "A list of file paths or urls to display separated by whitespaces (use - for STDIN)", required = true, multiValued = true)
private List paths;

@Command(scope
="my_scope", options = { "displayLineNumbers" },arguments={"paths"}, description = "Displays the content of a file or URL.")
public void cat(CommandSession session) throws Exception {
//todo something here
}


@Argument(name 
= "paths or urls")
private String arg1;
@Command(options 
= { "displayLineNumbers" },arguments={"arg1"})
public void cat1() throws Exception {
 //todo something here
}

}

1. The CommandProvider no need to extends some class or implements some interface, and  it groups a set of command.
2. Each method can be a command by annotated with @Command, and opt or arg can be shared by different commands.
3. The scope specified at @CommandProvider which is shared by all the commands within this provider. and also each command can override the scope.

i.e. options = { "displayLineNumbers" }, it ref the opt by the field name. and also the same for arguments. the order indicate the index of the opt or arg.
arguments = { "arg1","arg2" }: means the command will accept the args in order: arg1 arg2

finally, add to blueprint config:
<blueprint>
    
<shell:command-provider class="org.apache.karaf.shell.commands.ShellCommandProvider">
       
<shell:property name="bundleContext" ref="blueprintBundleContext"/>
         any standard blueprint elements here
    
</shell:command-provider>
</blueprint>

thats it.
any ideas are welcome.

posted on 2011-05-11 11:37 gembin 阅读(878) 评论(0)  编辑  收藏 所属分类: OSGi


只有注册用户登录后才能发表评论。


网站导航:
 

导航

统计

常用链接

留言簿(6)

随笔分类(440)

随笔档案(378)

文章档案(6)

新闻档案(1)

相册

收藏夹(9)

Adobe

Android

AS3

Blog-Links

Build

Design Pattern

Eclipse

Favorite Links

Flickr

Game Dev

HBase

Identity Management

IT resources

JEE

Language

OpenID

OSGi

SOA

Version Control

最新随笔

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜

free counters