能,包括获取插件名称、获取插件描述、以及将键值对 插入到插件的上下文、执行插件公开的功能等方法。
插件管理器接口:
定义管理所有插件的管理器,包括安装插件、卸载插件、激活插件、按名称获取插件 等方法。
好了,这个简单的框架基本满足我们的需求。在实现中,我们可以比较简单地将 JDK 6 提供的脚本引擎做一个包装。
由于插件管理器(PluginManager)的作用范围是全局的,所以我们将其实现为一个单 例的对象:
代码 1. sTodo 插件管理器
public class TodoPluginManager implements PluginManager {
private List<Plugin> plist;
private static TodoPluginManager instance;
public static TodoPluginManager getInstance() {
if (instance == null) {
instance = new TodoPluginManager();
}
return instance;
}
private TodoPluginManager() {
plist = new ArrayList<Plugin>(1);
}
public void activate(Plugin plugin) {
}
public void deactivate(Plugin plugin) {
}
public Plugin getPlugin(String name) {
for (Plugin p : plist) {
if (p.getName().equals(name)) {
return p;
}
}
return null;
}
public void install(Plugin plugin) {
plist.add(plugin);
}
public List<Plugin> listPlugins() {
return plist;
}
public void removePlugin(String name) {
for (int i = 0; i < plist.size(); i++) {
plist.get(i).getName().equals(name);
plist.remove(i);
break;
}
}
public void uninstall(Plugin plugin) {
plist.remove(plugin);
}
public int getPluginNumber() {
return plist.size();
}
}
使用JavaScript脚本化Java应用(4)
时间:2011-04-03 IBM 邱俊涛
插件本身比较容易实现,包含一个名为 context 的 Map,以及一些 getter/setter:
代码 2. sTodo 插件实现
public class TodoPlugin implements Plugin {
private String name;
private String desc;
private Map<String, Object> context;
private ScriptEngine sengine;
private Invocable engine;
public TodoPlugin(String file, String name, String desc) {
this.name = name;
this.desc = desc;
context = new HashMap<String, Object>();
sengine = RuntimeEnv.getScriptEngine();
engine = RuntimeEnv.getInvocableEngine();
try {
sengine.eval(new java.io.FileReader(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (ScriptException e) {
e.printStackTrace();
}
}
public TodoPlugin(URL url) {
}
public Object execute(String function, Object... objects) {
Object result = null;
try {
result = engine.invokeFunction(function, objects);
} catch (ScriptException e) {
e.printSta
|