Posted on 2010-01-22 17:34
高老莊 閱讀(605)
評論(0) 編輯 收藏 所屬分類:
osgi
在使用osgi實現時,可以使用諸如install,start,stop這樣的命令來管理bundle或者調用服務.有時我們可能想添加一些自定義命令.可以通過如下的步驟來實現
1.編寫一個服務,實現如下的接口
1
public interface CommandProvider
{
2
/** *//**
3
Answer a string (may be as many lines as you like) with help
4
texts that explain the command.
5
*/
6
public String getHelp();
7
8
}
如果想定義hello方法,可以如下實現該接口:
import java.util.Dictionary;
import java.util.Properties;

import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.Constants;

public class Activator implements BundleActivator,CommandProvider
{
BundleContext bundleContext=null;

public void start(BundleContext context) throws Exception
{
System.out.println("start
" +context.getBundle().getLocation());
bundleContext=context;
context.registerService(CommandProvider.class.getName(), new AntherCommandProvider(), null);
Dictionary dictionary=new Properties();
dictionary.put(Constants.SERVICE_RANKING, 10);
context.registerService(CommandProvider.class.getName(), this,dictionary);
}


public void stop(BundleContext context) throws Exception
{
System.out.println("end
" +context.getBundle().getLocation());
}


public String getHelp()
{
return "you are using the help command";
}
public void _helloa(CommandInterpreter intp)

{
intp.println("helloa "+ this.getClass().getName());
}

public void _hello(CommandInterpreter intp) throws Exception
{
intp.println("hello " + this.getClass().getName());
}
}
import org.eclipse.osgi.framework.console.CommandInterpreter;
import org.eclipse.osgi.framework.console.CommandProvider;


public class AntherCommandProvider implements CommandProvider
{

public void _hello(CommandInterpreter intp)

{
intp.println("hello "+ this.getClass().getName());
}

public String getHelp()
{
return null;
}
}

其中,通過CommandInterpreter類型的nextArgument()方法可以迭代出所有的命令參數.
2.注冊服務
如果不將該接口注冊為服務,這個hello命令將不產生任何作用.注冊的服務名稱必須是org.eclipse.osgi.framework.console.CommandProvider.
當系統中存在多個此接口的實現時,可以通過SERVICE_RANKING屬性來決定了命令執行的順序,既有最高值的服務將被優先執行.這種方式可以重載系統中已經存在的同名服務.
3.執行命令
請仔細體會輸出結果
