当然很多情况下,只依靠 NSF 组件构建 Notes 8 复合应用是不够的。在做报表展现,图形处理,以及一些其他业务应用的时候,传统 Notes 开发会遇到一些瓶颈。在 Notes 8 中,我们可以通过 Eclipse 组件来弥补 NSF 组件功能上的不足。Notes 8 中新加入的文档编辑工具 Lotus Symphony 源自 Open Office 1.1 ,是基于 Lotus Expeditor 平台的一个 Eclipse 的插件应用。换句话说,本质上 Lotus Symphony 就是一个大的 Eclipse 插件包。因为 Lotus Symphony 是基于 Eclipse 插件结构 ,所以我们可以把它做成一个 Eclipse 组件来丰富复合应用的功能。开发复合应用的 Eclipse 组件需要具有 Eclipse 的插件(plug-in)开发技能。关于 Eclipse 插件开发细则以及 Eclipse 组件开发环境的配置,请参考 http://www.eclipse.org 上的相关文档,此处不再赘述。
与 NSF 组件一样,Eclipse 组件的开发同样遵循着 定义属性和操作,属性的发布,操作的实现 三个步骤。在最新版本的 Notes 8 中 Lotus Symphony 已经为复合应用提供了一个默认的 Symphony 组件 Symphony View 如 图 12 所示。
图 12. 默认的 Symphony 组件 Symphony View
如果你所得到的 Notes 8 不是最新版,你所看到的组件选用板会和上图不一样,不过那也没有关系,默认的 Symphony View 还是存在的,大家可以参照下面的复合应用组装章节,来添加默认的 Symphony 组件到我们的复合应用中去。
Eclipse 组件中同样使用 WSDL 来描述组件的属性和操作,并且其格式与 NSF 组件的完全一致。默认的 Symphony 组件属性和操作的定义文件位于 <notes install directory>\framework\shared\eclipse\plugins\ com.ibm.productivity.tools.ui.views_1.0.0.20071130-2008\views.wsdl 这里我们定义了四个属性,其中两个属性为对外发布,另外两个属性为接收其他组件传来的消息。
当我们保存当前编辑文档时对外发送一个属性:文档保存的路径(FileSaved_Message),该属性的类型为统一资源定位符(URL),对应操作 FileSaved_Operation;当我们对文档里的文本对象做选择时对外发送一个属性:当前选择的文本(SelectionChanged_Message),该属性类型为字符串(String)对应操作 SelectionChanged_Operation;当我们要打开其它组件指定的文档时要接收一个属性:指定文档的路径(LoadFile_Message),该属性的类型为统一资源定位符(URL),对应操作 LoadFile_Operation;当我们要往当前文档光标位置插入指定字符串时要接收一个属性:指定的字符串(Insert_Message),该属性类型为字符串(String)对应操作Insert_Operation。
作为一个 Notes 视图,它本身提供了将所有客户按公司名列举的功能,我们希望它能够在单击视图中的每个客户文档时,对外发送一个属性:该客户的公司名称,该属性的类型为字符串(String)。同时我们希望它能够在单击视图中一个按钮时, 对外发送一个属性:非常好的客户列表的模板的路径,该属性的类型为统一资源定位符(URL)。Symphony 组件定义的属性如 清单 3 所示。Symphony 组件定义的操作如 清单 4 所示。
清单 3. Symphony 组件定义的属性
<message name="FileSaved_Message"> <part name="FileSaved_Part" type="idt:url"/> </message> <message name="Insert_Message"> <part name="Insert_Part" type="xsd:string"/> </message> <message name="LoadFile_Message"> <part name="LoadFile_Part" type="idt:url"/> </message> <message name="SelectionChanged_Message"> <part name="SelectionChanged_Part" type="xsd:string"/> </message> |
清单 4. Symphony 组件定义的操作
<operation name="FileSaved_Operation"> <portlet:action name="FileSaved" caption="FileSaved.caption" description="FileSaved.description"/> <output> <portlet:param name="FileSaved" partname="FileSaved_Part" caption="FileSaved.caption" description="FileSaved.description"/> </output> </operation> <operation name="SelectionChanged_Operation"> <portlet:action name="SelectionChanged" caption="SelectionChanged.caption" description="SelectionChanged.description"/> <output> <portlet:param name="SelectionChanged" partname="SelectionChanged_Part" caption="SelectionChanged.caption" description="SelectionChanged.description"/> </output> </operation> <operation name="Insert_Operation"> <portlet:action name="Insert" caption="Insert.caption" description="Insert.description"/> <input> <portlet:param name="Text" partname="Insert_Part" caption="InsertText.caption" description="InsertText.description"/> </input> </operation> <operation name="LoadFile_Operation"> <portlet:action name="LoadFile" caption="LoadFile.caption" description="LoadFile.description"/> <input> <portlet:param name="FileLocation" partname="LoadFile_Part" caption="FileURLType.caption" description="FileURLType.description"/> </input> </operation> |
相应的操作实现代码都已经封装在了 Lotus Symphony 插件包里。Lotus Symphony 通过这些属性和操作为复合应用提供了简单接口,给复合应用提供了简单的文档编辑能力:打开,保存文档,插入字符串,获取当前选择文本。当我们要更加紧密地实现 NSF 组件和 Lotus Symphony 组件之间的集成时我们就需要通过 Lotus Symphony API 来编写 Eclipse 组件定制 Lotus Symphony,从而提供更多的接口与功能给其他复合应用的组件。我们会在另一篇文章里介绍如何使用 Lotus Symphony API 来开发定制 Lotus Symphony。