ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 利用 Eclipse 动态扩展技术将 Sametime MiniApp 集成到 Notes 8 侧栏中

利用 Eclipse 动态扩展技术将 Sametime MiniApp 集成到 Notes 8 侧栏中

原创 Linux操作系统 作者:genusBIT 时间:2009-01-13 09:19:48 0 删除 编辑
本文主要介绍如何利用 Eclipse 动态扩展技术来实现将 Sametime 的 MiniApp 集成到 Notes V8 的侧栏中。

IBM Lotus Expeditor 是一种新的平台,使用它可以方便、轻松地将应用程序交付到用户桌面。 Lotus Expeditor 扩展了 Eclipse,同时又为 Eclipse 技术增添了很多特性。 Sametime V7.5 和 Notes V8 都是构建于 IBM Lotus Expeditor 框架之上,因而 Sametime V7.5 和 Notes V8 都有很好的可扩展性,第三方工具提供商可以很容易构建无缝集成到 Lotus Sametime V7.5 和 Notes V8 中的插件、应用程序或扩展。

在 Sametime7.5 中,它提供了一种叫做 MiniApp 的扩展方式,用户可以通过实现自己的 MiniApp 将自己的应用集成到 Sametime 窗口中。与之类似的有 Notes8 的侧栏,用户也可以开发自己的侧栏应用。由于 Sametime MiniApp 与 Notes8 侧栏应用使用的不同的 Eclipse 扩展方式,所以 Sametime V7.5 的 MiniApp 不能直接集成到 Notes V8 的侧栏中去。但是很多用户创建了许多基于 Sametime V7.5 的 MiniApp 的扩展,他们希望能直接将 MiniApp 集成到 Notes8 中。如何将这些 MiniApp 的扩展直接添加到 Notes8 的侧栏中去呢?通过研究,作者想出了一个方法通过 Eclipse 的动态扩展技术,在不需要知道 MiniApp 具体实现也不需要更改任何 MiniApp 代码的情况下将 MiniApp 集成到 Notes8 的侧栏中。

下面我们先简单介绍 Sametime MiniApp 以及 Notes8 侧栏应用,然后讨论如何利用 Eclipse 的动态扩展技术将 MiniApp 集成到 Notes8 的侧栏中。

Sametime V7.5 MiniApp

Sametime7.5 SDK 中提供了扩展点 MiniApp 。通过扩展 MiniApp,可以添加新的应用到 Sametime 的窗口中,下面通过一个简单的例子来展示什么是 MiniApp 以及如何扩展 MiniApp:

  1. MiniApp 是区域是位于联系人列表底部的一块区域,可以通过插件扩展来添加新的 MiniApp 到 Sametime 的窗口。
  2. Sametime 提供给用户用来添新的 MiniApp 的扩展点是 com.ibm.collaboration.realtime.imhub.miniApps,这个扩展点在插件 com.ibm.collaboration.imhub 中定义,所以首先要添加对这个插件的依赖项,如图 1 所示:

    图 1. 添加依赖项
    图1. 添加依赖项

  3. 然后添加对 MiniApp 的扩展,扩展点定义如下面的代码所示:
     
    class="com.ibm.collaboration.realtime.sample.hellominiapp.HelloMiniApp"
    displayName="Hello MiniApp"
    id="com.ibm.collaboration.realtime.sample.hellominiapp.miniApp"/>

    其中 class 属性的值指向的是类 HelloMiniApp,根据 MiniApp 扩展点的定义,这个 class 必须继承抽象类 AbstractMiniApp 。它的实现代码如下面的清单所示:

    public class HelloMiniApp extends AbstractMiniApp { 
    public Control createControl(Composite parent) {
    Composite topControl = new Composite(parent, SWT.NONE);
    topControl.setLayout(new FillLayout());
    Label label = new Label(topControl, SWT.NONE);
    label.setText("Hello MiniApp!!!");
    return topControl;
    }
    public void init() throws Exception {
    //Do nothing here
    }
    }

这个例子中仅仅是在 MiniApp 的区域中显示一个字符串。用户可以根据自己的需要添加更加复杂的 UI 界面。这个插件实现之后就可以通过 Sametime 安装这个插件。安装之后启动 Sametime,效果如图 2 所示:


图 2. Sametime MiniApp
图2. Sametime MiniApp




回页首


Notes V8 侧栏应用程序

IBM Lotus Notes V8 相比以前的版本,有了一个全新的面目,在很多方面都有所更新。其中,侧栏就是 Notes V8 提供的一个新概念。 Notes V8 中默认包含了四个侧栏应用程序,分别是 Sametime 联系人列表、Activities、Side Calendar(Day At-A-Glance)、Feeds 。图 3 展示了 Notes V8 的侧栏。


图 3. Notes V8 侧栏应用程序
图3. Notes V8侧栏应用程序

用户可以通过 Notes V8 提供的扩展点 com.ibm.rcp.ui.shelfViews 来添加自己的侧栏应用程序,com.ibm.rcp.ui.shelfViews 扩展点的结构如下面的清单所示:

     point="com.ibm.rcp.ui.shelfViews"> 
view="ViewId_of_YourApp"
id="shelfViewId"/>

其中 view 指定显示在侧栏中的 View 的 ID 。这个 ID 必须是已经定义好的 Eclipse 的视图的 ID 。







Sametime MiniApp 分析

首先来分析 Sametime MiniApp 的结构,前面讲到 MiniApp 的扩展点中,必须指定一个类,这个类必须扩展 Sametime SDK 提供的抽象类 AbstractMiniApp,AbstractMiniApp 的结构如图 4 所示:


图 4. AbstractMiniApp 的类图
图4. AbstractMiniApp的类图

其中 createControl(Composite) 函数用来创建这个 MiniApp 显示的 Control ; getSite() 返回这个 MiniApp 的 View 的 IWorkbenchPartSite ; init() 用来初始化 MiniApp ; isInitiallyVisible() 用来返回这个 MiniApp 初始的情况下是否可见; setSite(IWorkbenchPartSite) 用来设置这个 MiniApp 的 view 的 IWorkbenchPartSite 。从 AbstractMiniApp 的结构可以看出,AbstractMiniApp 的结构和 ViewPart 的结构很类似。

然后再来分析一下 Sametime 的 MiniApp 的扩展点的结构,它的命名空间是 com.ibm.collaboration.realtime.imhub, 扩展点的 ID 是 miniApps,MiniApp 扩展点的结构如下面的清单所示:

         point="com.ibm.collaboration.realtime.imhub.miniApps"> 
category="category"
class="MiniAppClass"
displayName="Display Name"
icon="images"
id="idp"
maxHeight="400"/>

其中 category 是这个 MiniApp 所属的类别 ;class 指定 MiniApp 的具体实现类 ;displayName 是这个 MiniApp 显示的名字; icon 指定的是 MiniApp 的图标路径; id 是这个 MiniApp 扩展的标识; maxHeight 是这个 MiniApp 显示的最大高度。

介绍完 Sametime 的 MiniApp 的结构之后,接下来要介绍将 MiniApp 动态的转为化 Notes8 的侧栏应用程序。实现这个功能的基本步骤:

  1. 获取所有 MiniApp 的扩展;
  2. 根据 MiniApp 的扩展,动态添加侧栏应用程序扩展;




回页首


获取所有 MiniApp 的扩展

要获取所有的 MiniApp 的扩展,首先要获得 Eclipse 平台的注册表,然后根据所要查找的扩展点的 ID 以及命名空间从注册表中找到相应的扩展。获取 MiniApp 的所有扩展如下面的清单所示:

public class SideView4MiniAppUtil { 
public static List getMiniAppContributionItems() {
miniAppContributionItemList = new ArrayList();
IExtensionRegistry registry = Platform.getExtensionRegistry();
IConfigurationElement configurationElements[]
= registry.getConfigurationElementsFor(
"com.ibm.collaboration.realtime.imhub", "miniApps");
if(configurationElements != null && configurationElements.length > 0) {
IConfigurationElement configurationElement = null;
……
for(int index = 0; index < length; index++) {
configurationElement = configurationElements[index];
id = configurationElement.getAttribute("id");
displayName = configurationElement.getAttribute("name");
category = configurationElement.getAttribute("category");
className = configurationElement.getAttribute("class");
maxHeightStr = configurationElement.getAttribute("maxHeight");
iconPath = configurationElement.getAttribute("icon");
contributor = configurationElement.getContributor();
instance = null;
try {
instance = configurationElement.createExecutableExtension("class")
} catch(CoreException e) {
} catch(Throwable ex) {
}
try {
maxHeight = Integer.parseInt(maxHeightStr);
} catch(Exception ex) {
}
item = new MiniAppContributionItem(contributor, id, displayName,
category, className, maxHeight, iconPath, instance);
miniAppContributionItemList.add(item);
}
}
return miniAppContributionItemList;
}
}

通过 Eclipse 注册表获得所有 MiniApp 扩展的以及这些扩展的值之后,将创建一个新的变量 item,item 将 MiniApp 扩展的值都封装在 item 中,item 是类 MiniAppContributionItem 的实例,MiniAppContributionItem 包含的属性如下面的清单所示:

public class MiniAppContributionItem { 
private IContributor contributor = null;
private String id = null;
private String displayName = null;
private String category = null;
private String className = null;
private int maxHeight = 0;
private String iconPath = null;
private AbstractMiniApp miniAppInstance = null;
}

MiniAppContributionItem 的属性包含了 MiniApp 扩展点的所有属性,另外有添加了两个新的属性,其中 contributor 是这个 MiniApp 的扩展者,miniAppInstance 是 MiniApp 扩展点中 class 属性所指定的类的一个实例,通过 configurationElement.createExecutableExtension("class") 来生成这个实例。








动态添加 Notes V8 侧栏应用程序扩展

得到所有的 MiniApp 的扩展之后就利用 Eclipse 的动态扩展技术添加对 Notes8 侧栏应用程序的扩展。从 Eclipse3.2 开始,利用 Eclipse 的动态扩展技术可以在运行时注册新扩展,可以利用 IExtensionRegistry 的 addContribution 方法。先看看这个方法:

addContribution(InputStream is, 
IContributor contributor,
boolean persist, String name,
ResourceBundle translationBundle,
Object token)

这个方法是用来添加一个新的用 XML 文件来描述的扩展或者扩展点到 Eclipse 的注册表中。第一个参数 is 是打开一个 XML 文件的 stream,这个 XML 文件可以包含一个扩展后者扩展点,文件的格式和 plugin.xml 一样;第二个参数 contributor,是创建这个扩展的 Contributor ;第三个参数 persist,指定是否持久化这个扩展,如果是 false 的话,将不持久化这个扩展或者扩展点,那么当程序重新启动的时候这个扩展将丢失;第四个参数 name,是这个 Contribution 的名称,主要是用于产生错误报告,可以设置为空;第五个参数 translationBundle,这个参数主要用来翻译,如果你的扩展中没有需要翻译的字符,则可以传入一个 null ;最后一个参数 token,前面的例子中可以看出 ShelfView 扩展点的结构是这样的:

     point="com.ibm.rcp.ui.shelfViews"> 
view="ViewId_of_YourApp"
id="shelfViewId"/>

其中属性 view 指向的就是 Eclipse org.eclipse.ui.views 的扩展,org.eclipse.ui.views 扩展的结构如下面的清单所示:

    point="org.eclipse.ui.views">     
name="Name"
category="Category"
class="Class"
disableDragging="true"
allowMultiple="true"
icon="icon"
id="id">


由于 shelfViews 扩展中 view 指向的就是 Eclipse 的视图的 id,所以要动态扩展 Notes V8 的侧栏,首先要动态添加对 org.eclipse.ui.views 的扩展。然而根据前面讲的动态添加 Eclipse 扩展的方法,要添加对 eclipse 视图的扩展先要创建标识实际 XML 数据的 InputStream,清单中的代码显示了如何创建这个 InputStream:

private static InputStream createEclipseViewExtensionInputStream(
MiniAppContributionItem item) {
ByteArrayInputStream is = null;
String result = "";
result += "";
result += " result += "name=\"" + item.getDisplayName() + "\" ";
result += "class=\"com.ibm.rcp.ui.sideviews4miniapp.viewpart.SideViewPart\" ";
result += "id=\"" + item.getID() + "\" ";
result += "/>
";
try {
is = new ByteArrayInputStream(result.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return is;
}

把 MiniApp 的显示的名称作为这个 View 的显示的名称:

result += "name=\"" + item.getDisplayName() + "\" ";

把 MiniApp 的 ID 作为这个 View 的 ID:

result += "id=\"" + item.getID() + "\" ";

构造出一个字符串,再以 UTF-8 的编码获得这个字符串的 byte 数组,然后再创建 ByteArrayInputStream 。

由于 Notes V8 的侧栏中显示的实际上就是 Eclipse 的一个个 ViewPart,在上面的扩展的定义中可以看出 class 属性指向的是类 com.ibm.rcp.ui.sideviews4miniapp.viewpart.SideViewPart 。这个类就是用来将 MiniApp 转化为 Eclipse 的 ViewPart 显示在 Notes V8 的侧栏中。那么如何使用一个通用的 ViewPart 来显示所有的 MiniApp 呢,如下面的清单所示:

public class SideViewPart extends ViewPart { 

public void init(IViewSite site) throws PartInitException {
super.init(site);
String id = site.getId();
Object bj = map.get(id);
if(obj instanceof MiniAppContributionItem) {
item = (MiniAppContributionItem) obj;
miniApp = item.getMiniAppInstance();
try {
miniApp.setSite(site);
miniApp.init();
} catch (Exception e) {
e.printStackTrace();
}
}
}

public void createPartControl(Composite parent) {
if(miniApp != null) {
miniApp.createControl(parent);
}
}

}

Object bj = map.get(id) 中的 map 对象是通过 SideViewPart.addMiniAppContributionItem(MiniAppContributionItem) 方法来设置,这个方法是在获取所有 MiniApp 的扩展的时候调用,将创建出来的 MiniAppContributionItem 对象添加到 Hashmap 中。方法的定义如下面的清单所示:

public static void addMiniAppContributionItem(MiniAppContributionItem item) { 
if(item != null && item.getID() != null) {
map.put(item.getID(), item);
}
}

输入参数是 MiniAppContributionItem,以这个 item 的 ID 作为 key,将这个 item 添加到 HashMap 中。

在 SideViewPart 的 createPartControl() 方法中调用 AbstractMiniApp 的 createControl() 方法,从而将 ViewPart 的 parent control 作为 AbstractMiniApp 的 parent Control 。

重载 ViewPart 的 init(IViewSite site) 方法,在这个方法中调用 AbstractMiniApp 的 setSite(IViewSite site) 。将 ViewPart 的 ViewSite 作为这个 MiniApp 的 ViewSite,然后调用 AbstractMiniApp.init() 方法初始化这个 MiniApp 。

接下来,我们就要将这个扩展添加到 Eclipse 注册表中, 清单中的代码展示了通过 addContribution() 添加扩展的方法:

public static void addDynamicExtension4ShelfView(List miniAppContributionItemList) { 
if(miniAppContributionItemList != null) {
IExtensionRegistry registry = Platform.getExtensionRegistry();
Object key = ((ExtensionRegistry)registry).getTemporaryUserToken();
InputStream is = null;
Iterator iterator = miniAppContributionItemList.iterator();
MiniAppContributionItem item = null;
IContributor contributor = ContributorFactoryOSGi.createContributor(
SideView4MiniAppPlugins.getDefault().getBundle());
while(iterator.hasNext()) {
item = (MiniAppContributionItem) iterator.next();
SideViewPart.addMiniAppContributionItem(item);
try {
is = createEclipseViewExtensionInputStream(item);
if(is != null) {
registry.addContribution(is, contributor, false, null, null, key);
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

添加了 org.eclipse.ui.views 的扩展之后就要添加 com.ibm.rcp.ui.shelfViews 的扩展,同样的首先要创建标识实际 XML 数据的 InputStream:

private static InputStream createShelfViewExtensionString(MiniAppContributionItem item) { 
ByteArrayInputStream is = null;
String result = "";
result += "";
result += " result += "view=\"" + item.getID() + "\" ";
result += "showTitle=\"true\" ";
result += "id=\"" + item.getID() + ".shelfView\" ";
result += "/>
";
try {
is = new ByteArrayInputStream(result.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return is;
}

然后添加这个扩展,添加 shelfViews 扩展的方法与添加 Eclipse view 扩展的方法是一样的。如下面的清单所示:

item = (MiniAppContributionItem) iterator.next(); 
SideViewPart.addMiniAppContributionItem(item);
try {
is = createShelfViewExtensionString(item);
if(is != null) {
registry.addContribution(is, contributor, false, null, null, key);
is.close();
}
} catch (IOException e) {
e.printStackTrace();
}

前面已经讲了如何获取所有对 Sametime MiniApp 的扩展以及如何动态的构建和添加 Notes V8 侧栏的扩展,那么什么时候去获取以及添加这些扩展呢,本文通过扩展 Eclipse 的 org.eclipse.ui.startup,在平台启动之后去获取和添加这些扩展。 Startup 扩展的结构如下面的清单所示:

    point="org.eclipse.ui.startup"> 


当 Notes V8 启动之后就会调用 EarlyStartup 的 earlyStartup() 方法,在这个方法中调用 SideView4MiniAppUtil.addDynamicExtension4ShelfView () 方法取添加新的扩展,EarlyStartup 的代码如下面的清单所示:

public class EarlyStartup implements IStartup { 
public void earlyStartup() {
SideView4MiniAppUtil.addDynamicExtension4ShelfView(
SideView4MiniAppUtil.getMiniAppContributionItems());
}
}

这样就完成了动态的获取 Sametime V7.5 的 MiniApp 的扩展,然后动态添加 Notes V8 侧栏的扩展。








结束语

通过这个例子可以让您进一步的了解 Sametime MiniApp 以及 Notes V8 侧栏应用程序的结构,同时也可以学会如何使用 Eclipse 的动态扩展技术。而且本文提供了一个插件,如果您是 Notes V8 的用户,您可以通过安装本插件将 Sametime MiniApp 轻松的集成到 Notes V8 的侧栏中去。









下载

描述 名字 大小 下载方法
示例代码 src.zip 15 KB HTTP
关于下载方法的信息


参考资料

学习

讨论


作者简介


李辉,IBM 中国软件开发中心软件工程师,曾参与 Notes 8 邮件和地址薄的开发,现在从事 Lotus Symphony 软件的开发工作。



梁骞, IBM 中国软件开发中心,现在从事 Workplace Managed Client 软件的开发工作,通过 liangq@cn.ibm.com 可以与他联系。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14751907/viewspace-536566/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-07-04

  • 博文量
    233
  • 访问量
    440255